diff --git a/docs/api/py/.buildinfo b/docs/api/py/.buildinfo index 490661538864e..483ab8dc99953 100644 --- a/docs/api/py/.buildinfo +++ b/docs/api/py/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 120732218d8ddcaba9c0e5b546cdc391 +config: 3b06c21a5661ae51128600fedc67ff06 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/api/py/_modules/index.html b/docs/api/py/_modules/index.html index 4193739c2a3db..c3e1a50218c80 100644 --- a/docs/api/py/_modules/index.html +++ b/docs/api/py/_modules/index.html @@ -1,40 +1,196 @@ - + - Overview: module code — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Overview: module code — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
+
- - + - - + + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/chrome/remote_connection.html b/docs/api/py/_modules/selenium/webdriver/chrome/remote_connection.html index eccc83b676231..bfce51cd16738 100644 --- a/docs/api/py/_modules/selenium/webdriver/chrome/remote_connection.html +++ b/docs/api/py/_modules/selenium/webdriver/chrome/remote_connection.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.chrome.remote_connection — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.chrome.remote_connection — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.chrome.remote_connection

+  

Source code for selenium.webdriver.chrome.remote_connection

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -60,8 +216,10 @@ 

Source code for selenium.webdriver.chrome.remote_connection

from selenium.webdriver.remote.client_config import ClientConfig -
[docs]class ChromeRemoteConnection(ChromiumRemoteConnection): - browser_name = DesiredCapabilities.CHROME["browserName"] +
+[docs] +class ChromeRemoteConnection(ChromiumRemoteConnection): + browser_name = DesiredCapabilities.CHROME["browserName"] def __init__( self, @@ -72,50 +230,41 @@

Source code for selenium.webdriver.chrome.remote_connection

) -> None: super().__init__( remote_server_addr=remote_server_addr, - vendor_prefix="goog", + vendor_prefix="goog", browser_name=ChromeRemoteConnection.browser_name, keep_alive=keep_alive, ignore_proxy=ignore_proxy, client_config=client_config, )
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/chrome/service.html b/docs/api/py/_modules/selenium/webdriver/chrome/service.html index ce6a917f8bea4..6ecceb7c7a850 100644 --- a/docs/api/py/_modules/selenium/webdriver/chrome/service.html +++ b/docs/api/py/_modules/selenium/webdriver/chrome/service.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.chrome.service — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.chrome.service — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.chrome.service

+  

Source code for selenium.webdriver.chrome.service

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -62,8 +218,10 @@ 

Source code for selenium.webdriver.chrome.service

from selenium.webdriver.chromium import service -
[docs]class Service(service.ChromiumService): - """A Service class that is responsible for the starting and stopping of +
+[docs] +class Service(service.ChromiumService): + """A Service class that is responsible for the starting and stopping of `chromedriver`. :param executable_path: install path of the chromedriver executable, defaults to `chromedriver`. @@ -71,7 +229,7 @@

Source code for selenium.webdriver.chrome.service

:param service_args: (Optional) List of args to be passed to the subprocess when launching the executable. :param log_output: (Optional) int representation of STDOUT/DEVNULL, any IO instance or String path to file. :param env: (Optional) Mapping of environment variables for the new process, defaults to `os.environ`. - """ + """ def __init__( self, @@ -90,44 +248,35 @@

Source code for selenium.webdriver.chrome.service

env=env, **kwargs, )
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/chrome/webdriver.html b/docs/api/py/_modules/selenium/webdriver/chrome/webdriver.html index cb9d8ff7e254a..bd5d80da485fa 100644 --- a/docs/api/py/_modules/selenium/webdriver/chrome/webdriver.html +++ b/docs/api/py/_modules/selenium/webdriver/chrome/webdriver.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.chrome.webdriver — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.chrome.webdriver — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.chrome.webdriver

+  

Source code for selenium.webdriver.chrome.webdriver

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -60,8 +216,10 @@ 

Source code for selenium.webdriver.chrome.webdriver

from .service import Service -
[docs]class WebDriver(ChromiumDriver): - """Controls the ChromeDriver and allows you to drive the browser.""" +
+[docs] +class WebDriver(ChromiumDriver): + """Controls the ChromeDriver and allows you to drive the browser.""" def __init__( self, @@ -69,62 +227,53 @@

Source code for selenium.webdriver.chrome.webdriver

service: Service = None, keep_alive: bool = True, ) -> None: - """Creates a new instance of the chrome driver. Starts the service and + """Creates a new instance of the chrome driver. Starts the service and then creates new instance of chrome driver. :Args: - options - this takes an instance of ChromeOptions - service - Service object for handling the browser driver if you need to pass extra details - keep_alive - Whether to configure ChromeRemoteConnection to use HTTP keep-alive. - """ + """ service = service if service else Service() options = options if options else Options() super().__init__( - browser_name=DesiredCapabilities.CHROME["browserName"], - vendor_prefix="goog", + browser_name=DesiredCapabilities.CHROME["browserName"], + vendor_prefix="goog", options=options, service=service, keep_alive=keep_alive, )
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/chromium/options.html b/docs/api/py/_modules/selenium/webdriver/chromium/options.html index 3074bcc3f469d..dc753bbf8a127 100644 --- a/docs/api/py/_modules/selenium/webdriver/chromium/options.html +++ b/docs/api/py/_modules/selenium/webdriver/chromium/options.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.chromium.options — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.chromium.options — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.chromium.options

+  

Source code for selenium.webdriver.chromium.options

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -65,12 +221,14 @@ 

Source code for selenium.webdriver.chromium.options

from selenium.webdriver.common.options import ArgOptions -
[docs]class ChromiumOptions(ArgOptions): - KEY = "goog:chromeOptions" +
+[docs] +class ChromiumOptions(ArgOptions): + KEY = "goog:chromeOptions" def __init__(self) -> None: super().__init__() - self._binary_location: str = "" + self._binary_location: str = "" self._extension_files: List[str] = [] self._extensions: List[str] = [] self._experimental_options: Dict[str, Union[str, int, dict, List[str]]] = {} @@ -78,155 +236,158 @@

Source code for selenium.webdriver.chromium.options

@property def binary_location(self) -> str: - """:Returns: The location of the binary, otherwise an empty string.""" + """:Returns: The location of the binary, otherwise an empty string.""" return self._binary_location @binary_location.setter def binary_location(self, value: str) -> None: - """Allows you to set where the chromium binary lives. + """Allows you to set where the chromium binary lives. :Args: - value: path to the Chromium binary - """ + """ if not isinstance(value, str): raise TypeError(self.BINARY_LOCATION_ERROR) self._binary_location = value @property def debugger_address(self) -> Optional[str]: - """:Returns: The address of the remote devtools instance.""" + """:Returns: The address of the remote devtools instance.""" return self._debugger_address @debugger_address.setter def debugger_address(self, value: str) -> None: - """Allows you to set the address of the remote devtools instance that + """Allows you to set the address of the remote devtools instance that the ChromeDriver instance will try to connect to during an active wait. :Args: - value: address of remote devtools instance if any (hostname[:port]) - """ + """ if not isinstance(value, str): - raise TypeError("Debugger Address must be a string") + raise TypeError("Debugger Address must be a string") self._debugger_address = value @property def extensions(self) -> List[str]: - """:Returns: A list of encoded extensions that will be loaded.""" + """:Returns: A list of encoded extensions that will be loaded.""" def _decode(file_data: BinaryIO) -> str: # Should not use base64.encodestring() which inserts newlines every # 76 characters (per RFC 1521). Chromedriver has to remove those # unnecessary newlines before decoding, causing performance hit. - return base64.b64encode(file_data.read()).decode("utf-8") + return base64.b64encode(file_data.read()).decode("utf-8") encoded_extensions = [] for extension in self._extension_files: - with open(extension, "rb") as f: + with open(extension, "rb") as f: encoded_extensions.append(_decode(f)) return encoded_extensions + self._extensions -
[docs] def add_extension(self, extension: str) -> None: - """Adds the path to the extension to a list that will be used to +
+[docs] + def add_extension(self, extension: str) -> None: + """Adds the path to the extension to a list that will be used to extract it to the ChromeDriver. :Args: - extension: path to the \\*.crx file - """ + """ if extension: extension_to_add = os.path.abspath(os.path.expanduser(extension)) if os.path.exists(extension_to_add): self._extension_files.append(extension_to_add) else: - raise OSError("Path to the extension doesn't exist") + raise OSError("Path to the extension doesn't exist") else: - raise ValueError("argument can not be null")
+ raise ValueError("argument can not be null")
-
[docs] def add_encoded_extension(self, extension: str) -> None: - """Adds Base64 encoded string with extension data to a list that will + +
+[docs] + def add_encoded_extension(self, extension: str) -> None: + """Adds Base64 encoded string with extension data to a list that will be used to extract it to the ChromeDriver. :Args: - extension: Base64 encoded string with extension data - """ + """ if extension: self._extensions.append(extension) else: - raise ValueError("argument can not be null")
+ raise ValueError("argument can not be null")
+ @property def experimental_options(self) -> dict: - """:Returns: A dictionary of experimental options for chromium.""" + """:Returns: A dictionary of experimental options for chromium.""" return self._experimental_options -
[docs] def add_experimental_option(self, name: str, value: Union[str, int, dict, List[str]]) -> None: - """Adds an experimental option which is passed to chromium. +
+[docs] + def add_experimental_option(self, name: str, value: Union[str, int, dict, List[str]]) -> None: + """Adds an experimental option which is passed to chromium. :Args: name: The experimental option name. value: The option value. - """ + """ self._experimental_options[name] = value
-
[docs] def to_capabilities(self) -> dict: - """Creates a capabilities with all the options that have been set - :Returns: A dictionary with everything.""" + +
+[docs] + def to_capabilities(self) -> dict: + """Creates a capabilities with all the options that have been set + :Returns: A dictionary with everything.""" caps = self._caps chrome_options = self.experimental_options.copy() if self.mobile_options: chrome_options.update(self.mobile_options) - chrome_options["extensions"] = self.extensions + chrome_options["extensions"] = self.extensions if self.binary_location: - chrome_options["binary"] = self.binary_location - chrome_options["args"] = self._arguments + chrome_options["binary"] = self.binary_location + chrome_options["args"] = self._arguments if self.debugger_address: - chrome_options["debuggerAddress"] = self.debugger_address + chrome_options["debuggerAddress"] = self.debugger_address caps[self.KEY] = chrome_options return caps
+ @property def default_capabilities(self) -> dict: return DesiredCapabilities.CHROME.copy()
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/chromium/remote_connection.html b/docs/api/py/_modules/selenium/webdriver/chromium/remote_connection.html index 27daae9ea303a..a37d519e23018 100644 --- a/docs/api/py/_modules/selenium/webdriver/chromium/remote_connection.html +++ b/docs/api/py/_modules/selenium/webdriver/chromium/remote_connection.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.chromium.remote_connection — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.chromium.remote_connection — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.chromium.remote_connection

+  

Source code for selenium.webdriver.chromium.remote_connection

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -58,7 +214,9 @@ 

Source code for selenium.webdriver.chromium.remote_connection

from selenium.webdriver.remote.remote_connection import RemoteConnection -
[docs]class ChromiumRemoteConnection(RemoteConnection): +
+[docs] +class ChromiumRemoteConnection(RemoteConnection): def __init__( self, remote_server_addr: str, @@ -82,58 +240,49 @@

Source code for selenium.webdriver.chromium.remote_connection

def _remote_commands(self, vendor_prefix): remote_commands = { - "launchApp": ("POST", "/session/$sessionId/chromium/launch_app"), - "setPermissions": ("POST", "/session/$sessionId/permissions"), - "setNetworkConditions": ("POST", "/session/$sessionId/chromium/network_conditions"), - "getNetworkConditions": ("GET", "/session/$sessionId/chromium/network_conditions"), - "deleteNetworkConditions": ("DELETE", "/session/$sessionId/chromium/network_conditions"), - "executeCdpCommand": ("POST", f"/session/$sessionId/{vendor_prefix}/cdp/execute"), - "getSinks": ("GET", f"/session/$sessionId/{vendor_prefix}/cast/get_sinks"), - "getIssueMessage": ("GET", f"/session/$sessionId/{vendor_prefix}/cast/get_issue_message"), - "setSinkToUse": ("POST", f"/session/$sessionId/{vendor_prefix}/cast/set_sink_to_use"), - "startDesktopMirroring": ("POST", f"/session/$sessionId/{vendor_prefix}/cast/start_desktop_mirroring"), - "startTabMirroring": ("POST", f"/session/$sessionId/{vendor_prefix}/cast/start_tab_mirroring"), - "stopCasting": ("POST", f"/session/$sessionId/{vendor_prefix}/cast/stop_casting"), + "launchApp": ("POST", "/session/$sessionId/chromium/launch_app"), + "setPermissions": ("POST", "/session/$sessionId/permissions"), + "setNetworkConditions": ("POST", "/session/$sessionId/chromium/network_conditions"), + "getNetworkConditions": ("GET", "/session/$sessionId/chromium/network_conditions"), + "deleteNetworkConditions": ("DELETE", "/session/$sessionId/chromium/network_conditions"), + "executeCdpCommand": ("POST", f"/session/$sessionId/{vendor_prefix}/cdp/execute"), + "getSinks": ("GET", f"/session/$sessionId/{vendor_prefix}/cast/get_sinks"), + "getIssueMessage": ("GET", f"/session/$sessionId/{vendor_prefix}/cast/get_issue_message"), + "setSinkToUse": ("POST", f"/session/$sessionId/{vendor_prefix}/cast/set_sink_to_use"), + "startDesktopMirroring": ("POST", f"/session/$sessionId/{vendor_prefix}/cast/start_desktop_mirroring"), + "startTabMirroring": ("POST", f"/session/$sessionId/{vendor_prefix}/cast/start_tab_mirroring"), + "stopCasting": ("POST", f"/session/$sessionId/{vendor_prefix}/cast/stop_casting"), } return remote_commands
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/chromium/service.html b/docs/api/py/_modules/selenium/webdriver/chromium/service.html index 30f3b06649f19..1b72c2941e94f 100644 --- a/docs/api/py/_modules/selenium/webdriver/chromium/service.html +++ b/docs/api/py/_modules/selenium/webdriver/chromium/service.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.chromium.service — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.chromium.service — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.chromium.service

+  

Source code for selenium.webdriver.chromium.service

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -61,8 +217,10 @@ 

Source code for selenium.webdriver.chromium.service

from selenium.webdriver.common import service -
[docs]class ChromiumService(service.Service): - """A Service class that is responsible for the starting and stopping the +
+[docs] +class ChromiumService(service.Service): + """A Service class that is responsible for the starting and stopping the WebDriver instance of the ChromiumDriver. :param executable_path: install path of the executable. @@ -71,7 +229,7 @@

Source code for selenium.webdriver.chromium.service

:param log_output: (Optional) int representation of STDOUT/DEVNULL, any IO instance or String path to file. :param env: (Optional) Mapping of environment variables for the new process, defaults to `os.environ`. :param driver_path_env_key: (Optional) Environment variable to use to get the path to the driver executable. - """ + """ def __init__( self, @@ -84,10 +242,10 @@

Source code for selenium.webdriver.chromium.service

**kwargs, ) -> None: self.service_args = service_args or [] - driver_path_env_key = driver_path_env_key or "SE_CHROMEDRIVER" + driver_path_env_key = driver_path_env_key or "SE_CHROMEDRIVER" if isinstance(log_output, str): - self.service_args.append(f"--log-path={log_output}") + self.service_args.append(f"--log-path={log_output}") self.log_output: Optional[IOBase] = None elif isinstance(log_output, IOBase): self.log_output = log_output @@ -103,46 +261,40 @@

Source code for selenium.webdriver.chromium.service

**kwargs, ) -
[docs] def command_line_args(self) -> List[str]: - return [f"--port={self.port}"] + self.service_args
+
+[docs] + def command_line_args(self) -> List[str]: + return [f"--port={self.port}"] + self.service_args
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/chromium/webdriver.html b/docs/api/py/_modules/selenium/webdriver/chromium/webdriver.html index 06b70546d6334..67a26933ddde8 100644 --- a/docs/api/py/_modules/selenium/webdriver/chromium/webdriver.html +++ b/docs/api/py/_modules/selenium/webdriver/chromium/webdriver.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.chromium.webdriver — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.chromium.webdriver — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.chromium.webdriver

+  

Source code for selenium.webdriver.chromium.webdriver

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -60,9 +216,11 @@ 

Source code for selenium.webdriver.chromium.webdriver

from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver -
[docs]class ChromiumDriver(RemoteWebDriver): - """Controls the WebDriver instance of ChromiumDriver and allows you to - drive the browser.""" +
+[docs] +class ChromiumDriver(RemoteWebDriver): + """Controls the WebDriver instance of ChromiumDriver and allows you to + drive the browser.""" def __init__( self, @@ -72,7 +230,7 @@

Source code for selenium.webdriver.chromium.webdriver

service: Service = None, keep_alive: bool = True, ) -> None: - """Creates a new WebDriver instance of the ChromiumDriver. Starts the + """Creates a new WebDriver instance of the ChromiumDriver. Starts the service and then creates new WebDriver instance of ChromiumDriver. :Args: @@ -81,7 +239,7 @@

Source code for selenium.webdriver.chromium.webdriver

- options - this takes an instance of ChromiumOptions - service - Service object for handling the browser driver if you need to pass extra details - keep_alive - Whether to configure ChromiumRemoteConnection to use HTTP keep-alive. - """ + """ self.service = service finder = DriverFinder(self.service, options) @@ -108,21 +266,29 @@

Source code for selenium.webdriver.chromium.webdriver

self._is_remote = False -
[docs] def launch_app(self, id): - """Launches Chromium app specified by id.""" - return self.execute("launchApp", {"id": id})
+
+[docs] + def launch_app(self, id): + """Launches Chromium app specified by id.""" + return self.execute("launchApp", {"id": id})
+ -
[docs] def get_network_conditions(self): - """Gets Chromium network emulation settings. +
+[docs] + def get_network_conditions(self): + """Gets Chromium network emulation settings. :Returns: A dict. - For example: {'latency': 4, 'download_throughput': 2, 'upload_throughput': 2, 'offline': False} - """ - return self.execute("getNetworkConditions")["value"]
+ For example: {'latency': 4, 'download_throughput': 2, 'upload_throughput': 2, 'offline': False} + """ + return self.execute("getNetworkConditions")["value"]
+ -
[docs] def set_network_conditions(self, **network_conditions) -> None: - """Sets Chromium network emulation settings. +
+[docs] + def set_network_conditions(self, **network_conditions) -> None: + """Sets Chromium network emulation settings. :Args: - network_conditions: A dict with conditions specification. @@ -136,16 +302,22 @@

Source code for selenium.webdriver.chromium.webdriver

download_throughput=500 * 1024, # maximal throughput upload_throughput=500 * 1024) # maximal throughput - Note: 'throughput' can be used to set both (for download and upload). - """ - self.execute("setNetworkConditions", {"network_conditions": network_conditions})
+ Note: 'throughput' can be used to set both (for download and upload). + """ + self.execute("setNetworkConditions", {"network_conditions": network_conditions})
-
[docs] def delete_network_conditions(self) -> None: - """Resets Chromium network emulation settings.""" - self.execute("deleteNetworkConditions")
-
[docs] def set_permissions(self, name: str, value: str) -> None: - """Sets Applicable Permission. +
+[docs] + def delete_network_conditions(self) -> None: + """Resets Chromium network emulation settings.""" + self.execute("deleteNetworkConditions")
+ + +
+[docs] + def set_permissions(self, name: str, value: str) -> None: + """Sets Applicable Permission. :Args: - name: The item to set the permission on. @@ -154,12 +326,15 @@

Source code for selenium.webdriver.chromium.webdriver

:Usage: :: - driver.set_permissions('clipboard-read', 'denied') - """ - self.execute("setPermissions", {"descriptor": {"name": name}, "state": value})
+ driver.set_permissions('clipboard-read', 'denied') + """ + self.execute("setPermissions", {"descriptor": {"name": name}, "state": value})
+ -
[docs] def execute_cdp_cmd(self, cmd: str, cmd_args: dict): - """Execute Chrome Devtools Protocol command and get returned result The +
+[docs] + def execute_cdp_cmd(self, cmd: str, cmd_args: dict): + """Execute Chrome Devtools Protocol command and get returned result The command and command args should follow chrome devtools protocol domains/commands, refer to link https://chromedevtools.github.io/devtools-protocol/ @@ -170,103 +345,116 @@

Source code for selenium.webdriver.chromium.webdriver

:Usage: :: - driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': requestId}) + driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': requestId}) :Returns: A dict, empty dict {} if there is no result to return. For example to getResponseBody: - {'base64Encoded': False, 'body': 'response body string'} - """ + {'base64Encoded': False, 'body': 'response body string'} + """ return super().execute_cdp_cmd(cmd, cmd_args)
-
[docs] def get_sinks(self) -> list: - """:Returns: A list of sinks available for Cast.""" - return self.execute("getSinks")["value"]
-
[docs] def get_issue_message(self): - """:Returns: An error message when there is any issue in a Cast - session.""" - return self.execute("getIssueMessage")["value"]
+
+[docs] + def get_sinks(self) -> list: + """:Returns: A list of sinks available for Cast.""" + return self.execute("getSinks")["value"]
-
[docs] def set_sink_to_use(self, sink_name: str) -> dict: - """Sets a specific sink, using its name, as a Cast session receiver + +
+[docs] + def get_issue_message(self): + """:Returns: An error message when there is any issue in a Cast + session.""" + return self.execute("getIssueMessage")["value"]
+ + +
+[docs] + def set_sink_to_use(self, sink_name: str) -> dict: + """Sets a specific sink, using its name, as a Cast session receiver target. :Args: - sink_name: Name of the sink to use as the target. - """ - return self.execute("setSinkToUse", {"sinkName": sink_name})
+ """ + return self.execute("setSinkToUse", {"sinkName": sink_name})
-
[docs] def start_desktop_mirroring(self, sink_name: str) -> dict: - """Starts a desktop mirroring session on a specific receiver target. + +
+[docs] + def start_desktop_mirroring(self, sink_name: str) -> dict: + """Starts a desktop mirroring session on a specific receiver target. :Args: - sink_name: Name of the sink to use as the target. - """ - return self.execute("startDesktopMirroring", {"sinkName": sink_name})
+ """ + return self.execute("startDesktopMirroring", {"sinkName": sink_name})
+ -
[docs] def start_tab_mirroring(self, sink_name: str) -> dict: - """Starts a tab mirroring session on a specific receiver target. +
+[docs] + def start_tab_mirroring(self, sink_name: str) -> dict: + """Starts a tab mirroring session on a specific receiver target. :Args: - sink_name: Name of the sink to use as the target. - """ - return self.execute("startTabMirroring", {"sinkName": sink_name})
+ """ + return self.execute("startTabMirroring", {"sinkName": sink_name})
-
[docs] def stop_casting(self, sink_name: str) -> dict: - """Stops the existing Cast session on a specific receiver target. + +
+[docs] + def stop_casting(self, sink_name: str) -> dict: + """Stops the existing Cast session on a specific receiver target. :Args: - sink_name: Name of the sink to stop the Cast session. - """ - return self.execute("stopCasting", {"sinkName": sink_name})
+ """ + return self.execute("stopCasting", {"sinkName": sink_name})
+ -
[docs] def quit(self) -> None: - """Closes the browser and shuts down the ChromiumDriver executable.""" +
+[docs] + def quit(self) -> None: + """Closes the browser and shuts down the ChromiumDriver executable.""" try: super().quit() except Exception: - # We don't care about the message because something probably has gone wrong + # We don't care about the message because something probably has gone wrong pass finally: - self.service.stop()
+ self.service.stop()
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/action_chains.html b/docs/api/py/_modules/selenium/webdriver/common/action_chains.html index ef7b9e4ad34ff..9453dc90bfef0 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/action_chains.html +++ b/docs/api/py/_modules/selenium/webdriver/common/action_chains.html @@ -1,58 +1,214 @@ - + - selenium.webdriver.common.action_chains — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.action_chains — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.action_chains

+  

Source code for selenium.webdriver.common.action_chains

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-"""The ActionChains implementation."""
+"""The ActionChains implementation."""
 from __future__ import annotations
 
 from typing import TYPE_CHECKING
@@ -73,8 +229,10 @@ 

Source code for selenium.webdriver.common.action_chains

AnyDevice = Union[PointerInput, KeyInput, WheelInput] -
[docs]class ActionChains: - """ActionChains are a way to automate low level interactions such as mouse +
+[docs] +class ActionChains: + """ActionChains are a way to automate low level interactions such as mouse movements, mouse button actions, key press, and context menu interactions. This is useful for doing more complex actions like hover over and drag and drop. @@ -87,15 +245,15 @@

Source code for selenium.webdriver.common.action_chains

ActionChains can be used in a chain pattern:: - menu = driver.find_element(By.CSS_SELECTOR, ".nav") - hidden_submenu = driver.find_element(By.CSS_SELECTOR, ".nav #submenu1") + menu = driver.find_element(By.CSS_SELECTOR, ".nav") + hidden_submenu = driver.find_element(By.CSS_SELECTOR, ".nav #submenu1") ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform() Or actions can be queued up one by one, then performed.:: - menu = driver.find_element(By.CSS_SELECTOR, ".nav") - hidden_submenu = driver.find_element(By.CSS_SELECTOR, ".nav #submenu1") + menu = driver.find_element(By.CSS_SELECTOR, ".nav") + hidden_submenu = driver.find_element(By.CSS_SELECTOR, ".nav #submenu1") actions = ActionChains(driver) actions.move_to_element(menu) @@ -104,15 +262,15 @@

Source code for selenium.webdriver.common.action_chains

Either way, the actions are performed in the order they are called, one after another. - """ + """ def __init__(self, driver: WebDriver, duration: int = 250, devices: list[AnyDevice] | None = None) -> None: - """Creates a new ActionChains. + """Creates a new ActionChains. :Args: - driver: The WebDriver instance which performs user actions. - duration: override the default 250 msecs of DEFAULT_MOVE_DURATION in PointerInput - """ + """ self._driver = driver mouse = None keyboard = None @@ -127,24 +285,32 @@

Source code for selenium.webdriver.common.action_chains

wheel = device self.w3c_actions = ActionBuilder(driver, mouse=mouse, keyboard=keyboard, wheel=wheel, duration=duration) -
[docs] def perform(self) -> None: - """Performs all stored actions.""" +
+[docs] + def perform(self) -> None: + """Performs all stored actions.""" self.w3c_actions.perform()
-
[docs] def reset_actions(self) -> None: - """Clears actions that are already stored locally and on the remote - end.""" + +
+[docs] + def reset_actions(self) -> None: + """Clears actions that are already stored locally and on the remote + end.""" self.w3c_actions.clear_actions() for device in self.w3c_actions.devices: device.clear_actions()
-
[docs] def click(self, on_element: WebElement | None = None) -> ActionChains: - """Clicks an element. + +
+[docs] + def click(self, on_element: WebElement | None = None) -> ActionChains: + """Clicks an element. :Args: - on_element: The element to click. If None, clicks on current mouse position. - """ + """ if on_element: self.move_to_element(on_element) @@ -154,13 +320,16 @@

Source code for selenium.webdriver.common.action_chains

return self
-
[docs] def click_and_hold(self, on_element: WebElement | None = None) -> ActionChains: - """Holds down the left mouse button on an element. + +
+[docs] + def click_and_hold(self, on_element: WebElement | None = None) -> ActionChains: + """Holds down the left mouse button on an element. :Args: - on_element: The element to mouse down. If None, clicks on current mouse position. - """ + """ if on_element: self.move_to_element(on_element) @@ -169,13 +338,16 @@

Source code for selenium.webdriver.common.action_chains

return self
-
[docs] def context_click(self, on_element: WebElement | None = None) -> ActionChains: - """Performs a context-click (right click) on an element. + +
+[docs] + def context_click(self, on_element: WebElement | None = None) -> ActionChains: + """Performs a context-click (right click) on an element. :Args: - on_element: The element to context-click. If None, clicks on current mouse position. - """ + """ if on_element: self.move_to_element(on_element) @@ -185,13 +357,16 @@

Source code for selenium.webdriver.common.action_chains

return self
-
[docs] def double_click(self, on_element: WebElement | None = None) -> ActionChains: - """Double-clicks an element. + +
+[docs] + def double_click(self, on_element: WebElement | None = None) -> ActionChains: + """Double-clicks an element. :Args: - on_element: The element to double-click. If None, clicks on current mouse position. - """ + """ if on_element: self.move_to_element(on_element) @@ -201,34 +376,43 @@

Source code for selenium.webdriver.common.action_chains

return self
-
[docs] def drag_and_drop(self, source: WebElement, target: WebElement) -> ActionChains: - """Holds down the left mouse button on the source element, then moves + +
+[docs] + def drag_and_drop(self, source: WebElement, target: WebElement) -> ActionChains: + """Holds down the left mouse button on the source element, then moves to the target element and releases the mouse button. :Args: - source: The element to mouse down. - target: The element to mouse up. - """ + """ self.click_and_hold(source) self.release(target) return self
-
[docs] def drag_and_drop_by_offset(self, source: WebElement, xoffset: int, yoffset: int) -> ActionChains: - """Holds down the left mouse button on the source element, then moves + +
+[docs] + def drag_and_drop_by_offset(self, source: WebElement, xoffset: int, yoffset: int) -> ActionChains: + """Holds down the left mouse button on the source element, then moves to the target offset and releases the mouse button. :Args: - source: The element to mouse down. - xoffset: X offset to move to. - yoffset: Y offset to move to. - """ + """ self.click_and_hold(source) self.move_by_offset(xoffset, yoffset) self.release() return self
-
[docs] def key_down(self, value: str, element: WebElement | None = None) -> ActionChains: - """Sends a key press only, without releasing it. Should only be used + +
+[docs] + def key_down(self, value: str, element: WebElement | None = None) -> ActionChains: + """Sends a key press only, without releasing it. Should only be used with modifier keys (Control, Alt and Shift). :Args: @@ -238,8 +422,8 @@

Source code for selenium.webdriver.common.action_chains

Example, pressing ctrl+c:: - ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform() - """ + ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform() + """ if element: self.click(element) @@ -248,8 +432,11 @@

Source code for selenium.webdriver.common.action_chains

return self
-
[docs] def key_up(self, value: str, element: WebElement | None = None) -> ActionChains: - """Releases a modifier key. + +
+[docs] + def key_up(self, value: str, element: WebElement | None = None) -> ActionChains: + """Releases a modifier key. :Args: - value: The modifier key to send. Values are defined in Keys class. @@ -258,8 +445,8 @@

Source code for selenium.webdriver.common.action_chains

Example, pressing ctrl+c:: - ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform() - """ + ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform() + """ if element: self.click(element) @@ -268,61 +455,76 @@

Source code for selenium.webdriver.common.action_chains

return self
-
[docs] def move_by_offset(self, xoffset: int, yoffset: int) -> ActionChains: - """Moving the mouse to an offset from current mouse position. + +
+[docs] + def move_by_offset(self, xoffset: int, yoffset: int) -> ActionChains: + """Moving the mouse to an offset from current mouse position. :Args: - xoffset: X offset to move to, as a positive or negative integer. - yoffset: Y offset to move to, as a positive or negative integer. - """ + """ self.w3c_actions.pointer_action.move_by(xoffset, yoffset) self.w3c_actions.key_action.pause() return self
-
[docs] def move_to_element(self, to_element: WebElement) -> ActionChains: - """Moving the mouse to the middle of an element. + +
+[docs] + def move_to_element(self, to_element: WebElement) -> ActionChains: + """Moving the mouse to the middle of an element. :Args: - to_element: The WebElement to move to. - """ + """ self.w3c_actions.pointer_action.move_to(to_element) self.w3c_actions.key_action.pause() return self
-
[docs] def move_to_element_with_offset(self, to_element: WebElement, xoffset: int, yoffset: int) -> ActionChains: - """Move the mouse by an offset of the specified element. Offsets are + +
+[docs] + def move_to_element_with_offset(self, to_element: WebElement, xoffset: int, yoffset: int) -> ActionChains: + """Move the mouse by an offset of the specified element. Offsets are relative to the in-view center point of the element. :Args: - to_element: The WebElement to move to. - xoffset: X offset to move to, as a positive or negative integer. - yoffset: Y offset to move to, as a positive or negative integer. - """ + """ self.w3c_actions.pointer_action.move_to(to_element, int(xoffset), int(yoffset)) self.w3c_actions.key_action.pause() return self
-
[docs] def pause(self, seconds: float | int) -> ActionChains: - """Pause all inputs for the specified duration in seconds.""" + +
+[docs] + def pause(self, seconds: float | int) -> ActionChains: + """Pause all inputs for the specified duration in seconds.""" self.w3c_actions.pointer_action.pause(seconds) self.w3c_actions.key_action.pause(seconds) return self
-
[docs] def release(self, on_element: WebElement | None = None) -> ActionChains: - """Releasing a held mouse button on an element. + +
+[docs] + def release(self, on_element: WebElement | None = None) -> ActionChains: + """Releasing a held mouse button on an element. :Args: - on_element: The element to mouse up. If None, releases on current mouse position. - """ + """ if on_element: self.move_to_element(on_element) @@ -331,13 +533,16 @@

Source code for selenium.webdriver.common.action_chains

return self
-
[docs] def send_keys(self, *keys_to_send: str) -> ActionChains: - """Sends keys to current focused element. + +
+[docs] + def send_keys(self, *keys_to_send: str) -> ActionChains: + """Sends keys to current focused element. :Args: - keys_to_send: The keys to send. Modifier keys constants can be found in the - 'Keys' class. - """ + 'Keys' class. + """ typing = keys_to_typing(keys_to_send) for key in typing: @@ -346,43 +551,55 @@

Source code for selenium.webdriver.common.action_chains

return self
-
[docs] def send_keys_to_element(self, element: WebElement, *keys_to_send: str) -> ActionChains: - """Sends keys to an element. + +
+[docs] + def send_keys_to_element(self, element: WebElement, *keys_to_send: str) -> ActionChains: + """Sends keys to an element. :Args: - element: The element to send keys. - keys_to_send: The keys to send. Modifier keys constants can be found in the - 'Keys' class. - """ + 'Keys' class. + """ self.click(element) self.send_keys(*keys_to_send) return self
-
[docs] def scroll_to_element(self, element: WebElement) -> ActionChains: - """If the element is outside the viewport, scrolls the bottom of the + +
+[docs] + def scroll_to_element(self, element: WebElement) -> ActionChains: + """If the element is outside the viewport, scrolls the bottom of the element to the bottom of the viewport. :Args: - element: Which element to scroll into the viewport. - """ + """ self.w3c_actions.wheel_action.scroll(origin=element) return self
-
[docs] def scroll_by_amount(self, delta_x: int, delta_y: int) -> ActionChains: - """Scrolls by provided amounts with the origin in the top left corner + +
+[docs] + def scroll_by_amount(self, delta_x: int, delta_y: int) -> ActionChains: + """Scrolls by provided amounts with the origin in the top left corner of the viewport. :Args: - delta_x: Distance along X axis to scroll using the wheel. A negative value scrolls left. - delta_y: Distance along Y axis to scroll using the wheel. A negative value scrolls up. - """ + """ self.w3c_actions.wheel_action.scroll(delta_x=delta_x, delta_y=delta_y) return self
-
[docs] def scroll_from_origin(self, scroll_origin: ScrollOrigin, delta_x: int, delta_y: int) -> ActionChains: - """Scrolls by provided amount based on a provided origin. The scroll + +
+[docs] + def scroll_from_origin(self, scroll_origin: ScrollOrigin, delta_x: int, delta_y: int) -> ActionChains: + """Scrolls by provided amount based on a provided origin. The scroll origin is either the center of an element or the upper left of the viewport plus any offsets. If the origin is an element, and the element is not in the viewport, the bottom of the element will first be @@ -395,10 +612,10 @@

Source code for selenium.webdriver.common.action_chains

:Raises: If the origin with offset is outside the viewport. - MoveTargetOutOfBoundsException - If the origin with offset is outside the viewport. - """ + """ if not isinstance(scroll_origin, ScrollOrigin): - raise TypeError(f"Expected object of type ScrollOrigin, got: {type(scroll_origin)}") + raise TypeError(f"Expected object of type ScrollOrigin, got: {type(scroll_origin)}") self.w3c_actions.wheel_action.scroll( origin=scroll_origin.origin, @@ -409,51 +626,43 @@

Source code for selenium.webdriver.common.action_chains

) return self
- # Context manager so ActionChains can be used in a 'with .. as' statements. + + # Context manager so ActionChains can be used in a 'with .. as' statements. def __enter__(self) -> ActionChains: return self # Return created instance of self. def __exit__(self, _type, _value, _traceback) -> None: pass # Do nothing, does not require additional cleanup.
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/actions/action_builder.html b/docs/api/py/_modules/selenium/webdriver/common/actions/action_builder.html index b0227fb16d154..33104c6418e0d 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/actions/action_builder.html +++ b/docs/api/py/_modules/selenium/webdriver/common/actions/action_builder.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.common.actions.action_builder — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.actions.action_builder — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.actions.action_builder

+  

Source code for selenium.webdriver.common.actions.action_builder

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -68,7 +224,9 @@ 

Source code for selenium.webdriver.common.actions.action_builder

from .wheel_input import WheelInput -
[docs]class ActionBuilder: +
+[docs] +class ActionBuilder: def __init__( self, driver, @@ -77,7 +235,7 @@

Source code for selenium.webdriver.common.actions.action_builder

keyboard: Optional[KeyInput] = None, duration: int = 250, ) -> None: - mouse = mouse or PointerInput(interaction.POINTER_MOUSE, "mouse") + mouse = mouse or PointerInput(interaction.POINTER_MOUSE, "mouse") keyboard = keyboard or KeyInput(interaction.KEY) wheel = wheel or WheelInput(interaction.WHEEL) self.devices = [mouse, keyboard, wheel] @@ -86,20 +244,23 @@

Source code for selenium.webdriver.common.actions.action_builder

self._wheel_action = WheelActions(wheel) self.driver = driver -
[docs] def get_device_with(self, name: str) -> Optional[Union["WheelInput", "PointerInput", "KeyInput"]]: - """Get the device with the given name. +
+[docs] + def get_device_with(self, name: str) -> Optional[Union["WheelInput", "PointerInput", "KeyInput"]]: + """Get the device with the given name. Parameters: - ---------- + ----------- name : str The name of the device to get. Returns: -------- Optional[Union[WheelInput, PointerInput, KeyInput]] : The device with the given name. - """ + """ return next(filter(lambda x: x == name, self.devices), None)
+ @property def pointer_inputs(self) -> List[PointerInput]: return [device for device in self.devices if device.type == interaction.POINTER] @@ -120,11 +281,13 @@

Source code for selenium.webdriver.common.actions.action_builder

def wheel_action(self) -> WheelActions: return self._wheel_action -
[docs] def add_key_input(self, name: str) -> KeyInput: - """Add a new key input device to the action builder. +
+[docs] + def add_key_input(self, name: str) -> KeyInput: + """Add a new key input device to the action builder. Parameters: - ---------- + ----------- name : str The name of the key input device. @@ -135,22 +298,25 @@

Source code for selenium.webdriver.common.actions.action_builder

Example: -------- >>> action_builder = ActionBuilder(driver) - >>> action_builder.add_key_input(name="keyboard2") - """ + >>> action_builder.add_key_input(name="keyboard2") + """ new_input = KeyInput(name) self._add_input(new_input) return new_input
-
[docs] def add_pointer_input(self, kind: str, name: str) -> PointerInput: - """Add a new pointer input device to the action builder. + +
+[docs] + def add_pointer_input(self, kind: str, name: str) -> PointerInput: + """Add a new pointer input device to the action builder. Parameters: - ---------- + ----------- kind : str The kind of pointer input device. - - "mouse" - - "touch" - - "pen" + - "mouse" + - "touch" + - "pen" name : str The name of the pointer input device. @@ -162,17 +328,20 @@

Source code for selenium.webdriver.common.actions.action_builder

Example: -------- >>> action_builder = ActionBuilder(driver) - >>> action_builder.add_pointer_input(kind="mouse", name="mouse") - """ + >>> action_builder.add_pointer_input(kind="mouse", name="mouse") + """ new_input = PointerInput(kind, name) self._add_input(new_input) return new_input
-
[docs] def add_wheel_input(self, name: str) -> WheelInput: - """Add a new wheel input device to the action builder. + +
+[docs] + def add_wheel_input(self, name: str) -> WheelInput: + """Add a new wheel input device to the action builder. Parameters: - ---------- + ----------- name : str The name of the wheel input device. @@ -183,90 +352,88 @@

Source code for selenium.webdriver.common.actions.action_builder

Example: -------- >>> action_builder = ActionBuilder(driver) - >>> action_builder.add_wheel_input(name="wheel2") - """ + >>> action_builder.add_wheel_input(name="wheel2") + """ new_input = WheelInput(name) self._add_input(new_input) return new_input
-
[docs] def perform(self) -> None: - """Performs all stored actions. + +
+[docs] + def perform(self) -> None: + """Performs all stored actions. Example: -------- >>> action_builder = ActionBuilder(driver) >>> keyboard = action_builder.key_input - >>> el = driver.find_element(id: "some_id") - >>> action_builder.click(el).pause(keyboard).pause(keyboard).pause(keyboard).send_keys('keys').perform() - """ - enc = {"actions": []} + >>> el = driver.find_element(id: "some_id") + >>> action_builder.click(el).pause(keyboard).pause(keyboard).pause(keyboard).send_keys('keys').perform() + """ + enc = {"actions": []} for device in self.devices: encoded = device.encode() - if encoded["actions"]: - enc["actions"].append(encoded) + if encoded["actions"]: + enc["actions"].append(encoded) device.actions = [] self.driver.execute(Command.W3C_ACTIONS, enc)
-
[docs] def clear_actions(self) -> None: - """Clears actions that are already stored on the remote end. + +
+[docs] + def clear_actions(self) -> None: + """Clears actions that are already stored on the remote end. Example: -------- >>> action_builder = ActionBuilder(driver) >>> keyboard = action_builder.key_input - >>> el = driver.find_element(By.ID, "some_id") - >>> action_builder.click(el).pause(keyboard).pause(keyboard).pause(keyboard).send_keys('keys') + >>> el = driver.find_element(By.ID, "some_id") + >>> action_builder.click(el).pause(keyboard).pause(keyboard).pause(keyboard).send_keys('keys') >>> action_builder.clear_actions() - """ + """ self.driver.execute(Command.W3C_CLEAR_ACTIONS)
+ def _add_input(self, new_input: Union[KeyInput, PointerInput, WheelInput]) -> None: - """Add a new input device to the action builder. + """Add a new input device to the action builder. Parameters: - ---------- + ----------- new_input : Union[KeyInput, PointerInput, WheelInput] The new input device to add. - """ + """ self.devices.append(new_input)
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/actions/input_device.html b/docs/api/py/_modules/selenium/webdriver/common/actions/input_device.html index ca037b93c7f40..a6caad722a1f1 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/actions/input_device.html +++ b/docs/api/py/_modules/selenium/webdriver/common/actions/input_device.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.common.actions.input_device — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.actions.input_device — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.actions.input_device

+  

Source code for selenium.webdriver.common.actions.input_device

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -59,60 +215,62 @@ 

Source code for selenium.webdriver.common.actions.input_device

from typing import Optional -
[docs]class InputDevice: - """Describes the input device being used for the action.""" +
+[docs] +class InputDevice: + """Describes the input device being used for the action.""" def __init__(self, name: Optional[str] = None): self.name = name or uuid.uuid4() self.actions: List[Any] = [] -
[docs] def add_action(self, action: Any) -> None: - """""" +
+[docs] + def add_action(self, action: Any) -> None: + """""" self.actions.append(action)
-
[docs] def clear_actions(self) -> None: + +
+[docs] + def clear_actions(self) -> None: self.actions = []
-
[docs] def create_pause(self, duration: float = 0) -> None: - pass
+ +
+[docs] + def create_pause(self, duration: float = 0) -> None: + pass
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/actions/interaction.html b/docs/api/py/_modules/selenium/webdriver/common/actions/interaction.html index a8f18220b4432..b72ded4b8caf3 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/actions/interaction.html +++ b/docs/api/py/_modules/selenium/webdriver/common/actions/interaction.html @@ -1,125 +1,280 @@ - + - selenium.webdriver.common.actions.interaction — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.actions.interaction — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.actions.interaction

+  

Source code for selenium.webdriver.common.actions.interaction

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
 from typing import Dict
 from typing import Union
 
-KEY = "key"
-POINTER = "pointer"
-NONE = "none"
-WHEEL = "wheel"
+KEY = "key"
+POINTER = "pointer"
+NONE = "none"
+WHEEL = "wheel"
 SOURCE_TYPES = {KEY, POINTER, NONE}
 
-POINTER_MOUSE = "mouse"
-POINTER_TOUCH = "touch"
-POINTER_PEN = "pen"
+POINTER_MOUSE = "mouse"
+POINTER_TOUCH = "touch"
+POINTER_PEN = "pen"
 
 POINTER_KINDS = {POINTER_MOUSE, POINTER_TOUCH, POINTER_PEN}
 
 
-
[docs]class Interaction: - PAUSE = "pause" +
+[docs] +class Interaction: + PAUSE = "pause" def __init__(self, source: str) -> None: self.source = source
-
[docs]class Pause(Interaction): + +
+[docs] +class Pause(Interaction): def __init__(self, source, duration: float = 0) -> None: super().__init__(source) self.duration = duration -
[docs] def encode(self) -> Dict[str, Union[str, int]]: - return {"type": self.PAUSE, "duration": int(self.duration * 1000)}
+
+[docs] + def encode(self) -> Dict[str, Union[str, int]]: + return {"type": self.PAUSE, "duration": int(self.duration * 1000)}
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/actions/key_actions.html b/docs/api/py/_modules/selenium/webdriver/common/actions/key_actions.html index 0c44b64bcbc19..1692b72491f08 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/actions/key_actions.html +++ b/docs/api/py/_modules/selenium/webdriver/common/actions/key_actions.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.common.actions.key_actions — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.actions.key_actions — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.actions.key_actions

+  

Source code for selenium.webdriver.common.actions.key_actions

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -62,23 +218,36 @@ 

Source code for selenium.webdriver.common.actions.key_actions

from .wheel_input import WheelInput -
[docs]class KeyActions(Interaction): +
+[docs] +class KeyActions(Interaction): def __init__(self, source: KeyInput | PointerInput | WheelInput | None = None) -> None: if not source: source = KeyInput(KEY) self.source = source super().__init__(source) -
[docs] def key_down(self, letter: str) -> KeyActions: - return self._key_action("create_key_down", letter)
+
+[docs] + def key_down(self, letter: str) -> KeyActions: + return self._key_action("create_key_down", letter)
+ + +
+[docs] + def key_up(self, letter: str) -> KeyActions: + return self._key_action("create_key_up", letter)
-
[docs] def key_up(self, letter: str) -> KeyActions: - return self._key_action("create_key_up", letter)
-
[docs] def pause(self, duration: int = 0) -> KeyActions: - return self._key_action("create_pause", duration)
+
+[docs] + def pause(self, duration: int = 0) -> KeyActions: + return self._key_action("create_pause", duration)
-
[docs] def send_keys(self, text: str | list) -> KeyActions: + +
+[docs] + def send_keys(self, text: str | list) -> KeyActions: if not isinstance(text, list): text = keys_to_typing(text) for letter in text: @@ -86,48 +255,40 @@

Source code for selenium.webdriver.common.actions.key_actions

self.key_up(letter) return self
+ def _key_action(self, action: str, letter) -> KeyActions: meth = getattr(self.source, action) meth(letter) return self
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/actions/key_input.html b/docs/api/py/_modules/selenium/webdriver/common/actions/key_input.html index fb934ad299caa..3fd9392a4227f 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/actions/key_input.html +++ b/docs/api/py/_modules/selenium/webdriver/common/actions/key_input.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.common.actions.key_input — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.actions.key_input — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.actions.key_input

+  

Source code for selenium.webdriver.common.actions.key_input

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -58,71 +214,82 @@ 

Source code for selenium.webdriver.common.actions.key_input

from .interaction import Pause -
[docs]class KeyInput(InputDevice): +
+[docs] +class KeyInput(InputDevice): def __init__(self, name: str) -> None: super().__init__() self.name = name self.type = interaction.KEY -
[docs] def encode(self) -> dict: - return {"type": self.type, "id": self.name, "actions": [acts.encode() for acts in self.actions]}
+
+[docs] + def encode(self) -> dict: + return {"type": self.type, "id": self.name, "actions": [acts.encode() for acts in self.actions]}
+ + +
+[docs] + def create_key_down(self, key) -> None: + self.add_action(TypingInteraction(self, "keyDown", key))
-
[docs] def create_key_down(self, key) -> None: - self.add_action(TypingInteraction(self, "keyDown", key))
-
[docs] def create_key_up(self, key) -> None: - self.add_action(TypingInteraction(self, "keyUp", key))
+
+[docs] + def create_key_up(self, key) -> None: + self.add_action(TypingInteraction(self, "keyUp", key))
-
[docs] def create_pause(self, pause_duration: float = 0) -> None: - self.add_action(Pause(self, pause_duration))
+ +
+[docs] + def create_pause(self, pause_duration: float = 0) -> None: + self.add_action(Pause(self, pause_duration))
+
-
[docs]class TypingInteraction(Interaction): + +
+[docs] +class TypingInteraction(Interaction): def __init__(self, source, type_, key) -> None: super().__init__(source) self.type = type_ self.key = key -
[docs] def encode(self) -> dict: - return {"type": self.type, "value": self.key}
+
+[docs] + def encode(self) -> dict: + return {"type": self.type, "value": self.key}
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/actions/mouse_button.html b/docs/api/py/_modules/selenium/webdriver/common/actions/mouse_button.html index 8b12756ad8a3d..56c6f51980340 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/actions/mouse_button.html +++ b/docs/api/py/_modules/selenium/webdriver/common/actions/mouse_button.html @@ -1,103 +1,252 @@ - + - selenium.webdriver.common.actions.mouse_button — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.actions.mouse_button — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.actions.mouse_button

+  

Source code for selenium.webdriver.common.actions.mouse_button

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
 
 
-
[docs]class MouseButton: +
+[docs] +class MouseButton: LEFT = 0 MIDDLE = 1 RIGHT = 2 BACK = 3 FORWARD = 4
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/actions/pointer_actions.html b/docs/api/py/_modules/selenium/webdriver/common/actions/pointer_actions.html index 738700b22b873..2760e9ddac950 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/actions/pointer_actions.html +++ b/docs/api/py/_modules/selenium/webdriver/common/actions/pointer_actions.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.common.actions.pointer_actions — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.actions.pointer_actions — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.actions.pointer_actions

+  

Source code for selenium.webdriver.common.actions.pointer_actions

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -62,20 +218,24 @@ 

Source code for selenium.webdriver.common.actions.pointer_actions

from .pointer_input import PointerInput -
[docs]class PointerActions(Interaction): +
+[docs] +class PointerActions(Interaction): def __init__(self, source: Optional[PointerInput] = None, duration: int = 250): - """ + """ Args: - source: PointerInput instance - duration: override the default 250 msecs of DEFAULT_MOVE_DURATION in source - """ + """ if not source: - source = PointerInput(interaction.POINTER_MOUSE, "mouse") + source = PointerInput(interaction.POINTER_MOUSE, "mouse") self.source = source self._duration = duration super().__init__(source) -
[docs] def pointer_down( +
+[docs] + def pointer_down( self, button=MouseButton.LEFT, width=None, @@ -89,7 +249,7 @@

Source code for selenium.webdriver.common.actions.pointer_actions

azimuth_angle=None, ): self._button_action( - "create_pointer_down", + "create_pointer_down", button=button, width=width, height=height, @@ -103,11 +263,17 @@

Source code for selenium.webdriver.common.actions.pointer_actions

) return self
-
[docs] def pointer_up(self, button=MouseButton.LEFT): - self._button_action("create_pointer_up", button=button) + +
+[docs] + def pointer_up(self, button=MouseButton.LEFT): + self._button_action("create_pointer_up", button=button) return self
-
[docs] def move_to( + +
+[docs] + def move_to( self, element, x=0, @@ -123,7 +289,7 @@

Source code for selenium.webdriver.common.actions.pointer_actions

azimuth_angle=None, ): if not isinstance(element, WebElement): - raise AttributeError("move_to requires a WebElement") + raise AttributeError("move_to requires a WebElement") self.source.create_pointer_move( origin=element, @@ -142,7 +308,10 @@

Source code for selenium.webdriver.common.actions.pointer_actions

) return self
-
[docs] def move_by( + +
+[docs] + def move_by( self, x, y, @@ -173,7 +342,10 @@

Source code for selenium.webdriver.common.actions.pointer_actions

) return self
-
[docs] def move_to_location( + +
+[docs] + def move_to_location( self, x, y, @@ -188,7 +360,7 @@

Source code for selenium.webdriver.common.actions.pointer_actions

azimuth_angle=None, ): self.source.create_pointer_move( - origin="viewport", + origin="viewport", duration=self._duration, x=int(x), y=int(y), @@ -204,27 +376,42 @@

Source code for selenium.webdriver.common.actions.pointer_actions

) return self
-
[docs] def click(self, element: Optional[WebElement] = None, button=MouseButton.LEFT): + +
+[docs] + def click(self, element: Optional[WebElement] = None, button=MouseButton.LEFT): if element: self.move_to(element) self.pointer_down(button) self.pointer_up(button) return self
-
[docs] def context_click(self, element: Optional[WebElement] = None): + +
+[docs] + def context_click(self, element: Optional[WebElement] = None): return self.click(element=element, button=MouseButton.RIGHT)
-
[docs] def click_and_hold(self, element: Optional[WebElement] = None, button=MouseButton.LEFT): + +
+[docs] + def click_and_hold(self, element: Optional[WebElement] = None, button=MouseButton.LEFT): if element: self.move_to(element) self.pointer_down(button=button) return self
-
[docs] def release(self, button=MouseButton.LEFT): + +
+[docs] + def release(self, button=MouseButton.LEFT): self.pointer_up(button=button) return self
-
[docs] def double_click(self, element: Optional[WebElement] = None): + +
+[docs] + def double_click(self, element: Optional[WebElement] = None): if element: self.move_to(element) self.pointer_down(MouseButton.LEFT) @@ -233,52 +420,47 @@

Source code for selenium.webdriver.common.actions.pointer_actions

self.pointer_up(MouseButton.LEFT) return self
-
[docs] def pause(self, duration: float = 0): + +
+[docs] + def pause(self, duration: float = 0): self.source.create_pause(duration) return self
+ def _button_action(self, action, **kwargs): meth = getattr(self.source, action) meth(**kwargs) return self
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/actions/pointer_input.html b/docs/api/py/_modules/selenium/webdriver/common/actions/pointer_input.html index 5d1f1088acee1..edf718e7625d5 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/actions/pointer_input.html +++ b/docs/api/py/_modules/selenium/webdriver/common/actions/pointer_input.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.common.actions.pointer_input — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.actions.pointer_input — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.actions.pointer_input

+  

Source code for selenium.webdriver.common.actions.pointer_input

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -66,18 +222,22 @@ 

Source code for selenium.webdriver.common.actions.pointer_input

from .interaction import POINTER_KINDS -
[docs]class PointerInput(InputDevice): +
+[docs] +class PointerInput(InputDevice): DEFAULT_MOVE_DURATION = 250 def __init__(self, kind, name): super().__init__() if kind not in POINTER_KINDS: - raise InvalidArgumentException(f"Invalid PointerInput kind '{kind}'") + raise InvalidArgumentException(f"Invalid PointerInput kind '{kind}'") self.type = POINTER self.kind = kind self.name = name -
[docs] def create_pointer_move( +
+[docs] + def create_pointer_move( self, duration=DEFAULT_MOVE_DURATION, x: float = 0, @@ -85,79 +245,86 @@

Source code for selenium.webdriver.common.actions.pointer_input

origin: Optional[WebElement] = None, **kwargs, ): - action = {"type": "pointerMove", "duration": duration, "x": x, "y": y, **kwargs} + action = {"type": "pointerMove", "duration": duration, "x": x, "y": y, **kwargs} if isinstance(origin, WebElement): - action["origin"] = {"element-6066-11e4-a52e-4f735466cecf": origin.id} + action["origin"] = {"element-6066-11e4-a52e-4f735466cecf": origin.id} elif origin is not None: - action["origin"] = origin + action["origin"] = origin self.add_action(self._convert_keys(action))
-
[docs] def create_pointer_down(self, **kwargs): - data = {"type": "pointerDown", "duration": 0, **kwargs} + +
+[docs] + def create_pointer_down(self, **kwargs): + data = {"type": "pointerDown", "duration": 0, **kwargs} self.add_action(self._convert_keys(data))
-
[docs] def create_pointer_up(self, button): - self.add_action({"type": "pointerUp", "duration": 0, "button": button})
-
[docs] def create_pointer_cancel(self): - self.add_action({"type": "pointerCancel"})
+
+[docs] + def create_pointer_up(self, button): + self.add_action({"type": "pointerUp", "duration": 0, "button": button})
+ + +
+[docs] + def create_pointer_cancel(self): + self.add_action({"type": "pointerCancel"})
+ -
[docs] def create_pause(self, pause_duration: Union[int, float] = 0) -> None: - self.add_action({"type": "pause", "duration": int(pause_duration * 1000)})
+
+[docs] + def create_pause(self, pause_duration: Union[int, float] = 0) -> None: + self.add_action({"type": "pause", "duration": int(pause_duration * 1000)})
+ + +
+[docs] + def encode(self): + return {"type": self.type, "parameters": {"pointerType": self.kind}, "id": self.name, "actions": self.actions}
-
[docs] def encode(self): - return {"type": self.type, "parameters": {"pointerType": self.kind}, "id": self.name, "actions": self.actions}
def _convert_keys(self, actions: Dict[str, Any]): out = {} for k, v in actions.items(): if v is None: continue - if k in ("x", "y"): + if k in ("x", "y"): out[k] = int(v) continue - splits = k.split("_") - new_key = splits[0] + "".join(v.title() for v in splits[1:]) + splits = k.split("_") + new_key = splits[0] + "".join(v.title() for v in splits[1:]) out[new_key] = v return out
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/actions/wheel_actions.html b/docs/api/py/_modules/selenium/webdriver/common/actions/wheel_actions.html index 065ccc70f280b..98142075466fb 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/actions/wheel_actions.html +++ b/docs/api/py/_modules/selenium/webdriver/common/actions/wheel_actions.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.common.actions.wheel_actions — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.actions.wheel_actions — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.actions.wheel_actions

+  

Source code for selenium.webdriver.common.actions.wheel_actions

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -56,57 +212,56 @@ 

Source code for selenium.webdriver.common.actions.wheel_actions

from .wheel_input import WheelInput -
[docs]class WheelActions(Interaction): +
+[docs] +class WheelActions(Interaction): def __init__(self, source: WheelInput = None): if not source: - source = WheelInput("wheel") + source = WheelInput("wheel") super().__init__(source) -
[docs] def pause(self, duration: float = 0): +
+[docs] + def pause(self, duration: float = 0): self.source.create_pause(duration) return self
-
[docs] def scroll(self, x=0, y=0, delta_x=0, delta_y=0, duration=0, origin="viewport"): + +
+[docs] + def scroll(self, x=0, y=0, delta_x=0, delta_y=0, duration=0, origin="viewport"): self.source.create_scroll(x, y, delta_x, delta_y, duration, origin) - return self
+ return self
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/actions/wheel_input.html b/docs/api/py/_modules/selenium/webdriver/common/actions/wheel_input.html index b14b5f5a7a43f..5d9d1d0ae6aff 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/actions/wheel_input.html +++ b/docs/api/py/_modules/selenium/webdriver/common/actions/wheel_input.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.common.actions.wheel_input — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.actions.wheel_input — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.actions.wheel_input

+  

Source code for selenium.webdriver.common.actions.wheel_input

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -60,19 +216,27 @@ 

Source code for selenium.webdriver.common.actions.wheel_input

from .input_device import InputDevice -
[docs]class ScrollOrigin: +
+[docs] +class ScrollOrigin: def __init__(self, origin: Union[str, WebElement], x_offset: int, y_offset: int) -> None: self._origin = origin self._x_offset = x_offset self._y_offset = y_offset -
[docs] @classmethod +
+[docs] + @classmethod def from_element(cls, element: WebElement, x_offset: int = 0, y_offset: int = 0): return cls(element, x_offset, y_offset)
-
[docs] @classmethod + +
+[docs] + @classmethod def from_viewport(cls, x_offset: int = 0, y_offset: int = 0): - return cls("viewport", x_offset, y_offset)
+ return cls("viewport", x_offset, y_offset)
+ @property def origin(self) -> Union[str, WebElement]: @@ -87,70 +251,73 @@

Source code for selenium.webdriver.common.actions.wheel_input

return self._y_offset
-
[docs]class WheelInput(InputDevice): + +
+[docs] +class WheelInput(InputDevice): def __init__(self, name) -> None: super().__init__(name=name) self.name = name self.type = interaction.WHEEL -
[docs] def encode(self) -> dict: - return {"type": self.type, "id": self.name, "actions": self.actions}
+
+[docs] + def encode(self) -> dict: + return {"type": self.type, "id": self.name, "actions": self.actions}
+ -
[docs] def create_scroll(self, x: int, y: int, delta_x: int, delta_y: int, duration: int, origin) -> None: +
+[docs] + def create_scroll(self, x: int, y: int, delta_x: int, delta_y: int, duration: int, origin) -> None: if isinstance(origin, WebElement): - origin = {"element-6066-11e4-a52e-4f735466cecf": origin.id} + origin = {"element-6066-11e4-a52e-4f735466cecf": origin.id} self.add_action( { - "type": "scroll", - "x": x, - "y": y, - "deltaX": delta_x, - "deltaY": delta_y, - "duration": duration, - "origin": origin, + "type": "scroll", + "x": x, + "y": y, + "deltaX": delta_x, + "deltaY": delta_y, + "duration": duration, + "origin": origin, } )
-
[docs] def create_pause(self, pause_duration: Union[int, float] = 0) -> None: - self.add_action({"type": "pause", "duration": int(pause_duration * 1000)})
+ +
+[docs] + def create_pause(self, pause_duration: Union[int, float] = 0) -> None: + self.add_action({"type": "pause", "duration": int(pause_duration * 1000)})
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/alert.html b/docs/api/py/_modules/selenium/webdriver/common/alert.html index 743ea108d1c5e..a3a2e12d9f735 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/alert.html +++ b/docs/api/py/_modules/selenium/webdriver/common/alert.html @@ -1,65 +1,223 @@ - + - selenium.webdriver.common.alert — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.alert — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.alert

+  

Source code for selenium.webdriver.common.alert

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-"""The Alert implementation."""
+"""The Alert implementation."""
 
 from selenium.webdriver.common.utils import keys_to_typing
 from selenium.webdriver.remote.command import Command
 
 
-
[docs]class Alert: - """Allows to work with alerts. +
+[docs] +class Alert: + """Allows to work with alerts. Use this class to interact with alert prompts. It contains methods for dismissing, accepting, inputting, and getting text from alert prompts. @@ -72,88 +230,88 @@

Source code for selenium.webdriver.common.alert

< Inputting a value into an alert prompt:: name_prompt = Alert(driver) - name_prompt.send_keys("Willian Shakesphere") + name_prompt.send_keys("Willian Shakesphere") name_prompt.accept() Reading a the text of a prompt for verification:: alert_text = Alert(driver).text - self.assertEqual("Do you wish to quit?", alert_text) - """ + self.assertEqual("Do you wish to quit?", alert_text) + """ def __init__(self, driver) -> None: - """Creates a new Alert. + """Creates a new Alert. :Args: - driver: The WebDriver instance which performs user actions. - """ + """ self.driver = driver @property def text(self) -> str: - """Gets the text of the Alert.""" - return self.driver.execute(Command.W3C_GET_ALERT_TEXT)["value"] + """Gets the text of the Alert.""" + return self.driver.execute(Command.W3C_GET_ALERT_TEXT)["value"] -
[docs] def dismiss(self) -> None: - """Dismisses the alert available.""" +
+[docs] + def dismiss(self) -> None: + """Dismisses the alert available.""" self.driver.execute(Command.W3C_DISMISS_ALERT)
-
[docs] def accept(self) -> None: - """Accepts the alert available. + +
+[docs] + def accept(self) -> None: + """Accepts the alert available. :Usage: :: Alert(driver).accept() # Confirm a alert dialog. - """ + """ self.driver.execute(Command.W3C_ACCEPT_ALERT)
-
[docs] def send_keys(self, keysToSend: str) -> None: - """Send Keys to the Alert. + +
+[docs] + def send_keys(self, keysToSend: str) -> None: + """Send Keys to the Alert. :Args: - keysToSend: The text to be sent to Alert. - """ - self.driver.execute(Command.W3C_SET_ALERT_VALUE, {"value": keys_to_typing(keysToSend), "text": keysToSend})
+ """ + self.driver.execute(Command.W3C_SET_ALERT_VALUE, {"value": keys_to_typing(keysToSend), "text": keysToSend})
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/bidi/cdp.html b/docs/api/py/_modules/selenium/webdriver/common/bidi/cdp.html index dfaf716a720e7..1b29cb4004d8b 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/bidi/cdp.html +++ b/docs/api/py/_modules/selenium/webdriver/common/bidi/cdp.html @@ -1,47 +1,203 @@ - + - selenium.webdriver.common.bidi.cdp — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.bidi.cdp — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.bidi.cdp

+  

Source code for selenium.webdriver.common.bidi.cdp

 # The MIT License(MIT)
 #
 # Copyright(c) 2018 Hyperion Gray
 #
 # Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files(the "Software"), to deal
+# of this software and associated documentation files(the "Software"), to deal
 # in the Software without restriction, including without limitation the rights
 # to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
 # copies of the Software, and to permit persons to whom the Software is
@@ -50,7 +206,7 @@ 

Source code for selenium.webdriver.common.bidi.cdp

# The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER @@ -83,68 +239,79 @@

Source code for selenium.webdriver.common.bidi.cdp

from trio_websocket import ConnectionClosed as WsConnectionClosed from trio_websocket import connect_websocket_url -logger = logging.getLogger("trio_cdp") -T = TypeVar("T") +logger = logging.getLogger("trio_cdp") +T = TypeVar("T") MAX_WS_MESSAGE_SIZE = 2**24 devtools = None version = None -
[docs]def import_devtools(ver): - """Attempt to load the current latest available devtools into the module - cache for use later.""" +
+[docs] +def import_devtools(ver): + """Attempt to load the current latest available devtools into the module + cache for use later.""" global devtools global version version = ver - base = "selenium.webdriver.common.devtools.v" + base = "selenium.webdriver.common.devtools.v" try: - devtools = importlib.import_module(f"{base}{ver}") + devtools = importlib.import_module(f"{base}{ver}") return devtools except ModuleNotFoundError: - # Attempt to parse and load the 'most recent' devtools module. This is likely + # Attempt to parse and load the 'most recent' devtools module. This is likely # because cdp has been updated but selenium python has not been released yet. - devtools_path = pathlib.Path(__file__).parents[1].joinpath("devtools") + devtools_path = pathlib.Path(__file__).parents[1].joinpath("devtools") versions = tuple(f.name for f in devtools_path.iterdir() if f.is_dir()) latest = max(int(x[1:]) for x in versions) selenium_logger = logging.getLogger(__name__) - selenium_logger.debug("Falling back to loading `devtools`: v%s", latest) - devtools = importlib.import_module(f"{base}{latest}") + selenium_logger.debug("Falling back to loading `devtools`: v%s", latest) + devtools = importlib.import_module(f"{base}{latest}") return devtools
-_connection_context: contextvars.ContextVar = contextvars.ContextVar("connection_context") -_session_context: contextvars.ContextVar = contextvars.ContextVar("session_context") + +_connection_context: contextvars.ContextVar = contextvars.ContextVar("connection_context") +_session_context: contextvars.ContextVar = contextvars.ContextVar("session_context") -
[docs]def get_connection_context(fn_name): - """Look up the current connection. +
+[docs] +def get_connection_context(fn_name): + """Look up the current connection. If there is no current connection, raise a ``RuntimeError`` with a helpful message. - """ + """ try: return _connection_context.get() except LookupError: - raise RuntimeError(f"{fn_name}() must be called in a connection context.")
+ raise RuntimeError(f"{fn_name}() must be called in a connection context.")
-
[docs]def get_session_context(fn_name): - """Look up the current session. + +
+[docs] +def get_session_context(fn_name): + """Look up the current session. If there is no current session, raise a ``RuntimeError`` with a helpful message. - """ + """ try: return _session_context.get() except LookupError: - raise RuntimeError(f"{fn_name}() must be called in a session context.")
+ raise RuntimeError(f"{fn_name}() must be called in a session context.")
+ -
[docs]@contextmanager +
+[docs] +@contextmanager def connection_context(connection): - """This context manager installs ``connection`` as the session context for - the current Trio task.""" + """This context manager installs ``connection`` as the session context for + the current Trio task.""" token = _connection_context.set(connection) try: yield @@ -152,10 +319,13 @@

Source code for selenium.webdriver.common.bidi.cdp

_connection_context.reset(token)
-
[docs]@contextmanager + +
+[docs] +@contextmanager def session_context(session): - """This context manager installs ``session`` as the session context for the - current Trio task.""" + """This context manager installs ``session`` as the session context for the + current Trio task.""" token = _session_context.set(session) try: yield @@ -163,74 +333,95 @@

Source code for selenium.webdriver.common.bidi.cdp

_session_context.reset(token)
-
[docs]def set_global_connection(connection): - """Install ``connection`` in the root context so that it will become the + +
+[docs] +def set_global_connection(connection): + """Install ``connection`` in the root context so that it will become the default connection for all tasks. This is generally not recommended, except it may be necessary in certain use cases such as running inside Jupyter notebook. - """ + """ global _connection_context - _connection_context = contextvars.ContextVar("_connection_context", default=connection)
+ _connection_context = contextvars.ContextVar("_connection_context", default=connection)
+ -
[docs]def set_global_session(session): - """Install ``session`` in the root context so that it will become the +
+[docs] +def set_global_session(session): + """Install ``session`` in the root context so that it will become the default session for all tasks. This is generally not recommended, except it may be necessary in certain use cases such as running inside Jupyter notebook. - """ + """ global _session_context - _session_context = contextvars.ContextVar("_session_context", default=session)
+ _session_context = contextvars.ContextVar("_session_context", default=session)
-
[docs]class BrowserError(Exception): - """This exception is raised when the browser's response to a command - indicates that an error occurred.""" + +
+[docs] +class BrowserError(Exception): + """This exception is raised when the browser's response to a command + indicates that an error occurred.""" def __init__(self, obj): - self.code = obj.get("code") - self.message = obj.get("message") - self.detail = obj.get("data") + self.code = obj.get("code") + self.message = obj.get("message") + self.detail = obj.get("data") def __str__(self): - return f"BrowserError<code={self.code} message={self.message}> {self.detail}"
+ return f"BrowserError<code={self.code} message={self.message}> {self.detail}"
+ -
[docs]class CdpConnectionClosed(WsConnectionClosed): - """Raised when a public method is called on a closed CDP connection.""" +
+[docs] +class CdpConnectionClosed(WsConnectionClosed): + """Raised when a public method is called on a closed CDP connection.""" def __init__(self, reason): - """Constructor. + """Constructor. :param reason: :type reason: wsproto.frame_protocol.CloseReason - """ + """ self.reason = reason def __repr__(self): - """Return representation.""" - return f"{self.__class__.__name__}<{self.reason}>"
+ """Return representation.""" + return f"{self.__class__.__name__}<{self.reason}>"
-
[docs]class InternalError(Exception): - """This exception is only raised when there is faulty logic in TrioCDP or - the integration with PyCDP."""
+
+[docs] +class InternalError(Exception): + """This exception is only raised when there is faulty logic in TrioCDP or + the integration with PyCDP."""
-
[docs]@dataclass + + +
+[docs] +@dataclass class CmEventProxy: - """A proxy object returned by :meth:`CdpBase.wait_for()``. + """A proxy object returned by :meth:`CdpBase.wait_for()``. After the context manager executes, this proxy object will have a value set that contains the returned event. - """ + """ value: Any = None
-
[docs]class CdpBase: + +
+[docs] +class CdpBase: def __init__(self, ws, session_id, target_id): self.ws = ws self.session_id = session_id @@ -240,22 +431,24 @@

Source code for selenium.webdriver.common.bidi.cdp

self.inflight_cmd = {} self.inflight_result = {} -
[docs] async def execute(self, cmd: Generator[dict, T, Any]) -> T: - """Execute a command on the server and wait for the result. +
+[docs] + async def execute(self, cmd: Generator[dict, T, Any]) -> T: + """Execute a command on the server and wait for the result. :param cmd: any CDP command :returns: a CDP result - """ + """ cmd_id = next(self.id_iter) cmd_event = trio.Event() self.inflight_cmd[cmd_id] = cmd, cmd_event request = next(cmd) - request["id"] = cmd_id + request["id"] = cmd_id if self.session_id: - request["sessionId"] = self.session_id + request["sessionId"] = self.session_id request_str = json.dumps(request) if logger.isEnabledFor(logging.DEBUG): - logger.debug(f"Sending CDP message: {cmd_id} {cmd_event}: {request_str}") + logger.debug(f"Sending CDP message: {cmd_id} {cmd_event}: {request_str}") try: await self.ws.send_message(request_str) except WsConnectionClosed as wcc: @@ -263,29 +456,35 @@

Source code for selenium.webdriver.common.bidi.cdp

await cmd_event.wait() response = self.inflight_result.pop(cmd_id) if logger.isEnabledFor(logging.DEBUG): - logger.debug(f"Received CDP message: {response}") + logger.debug(f"Received CDP message: {response}") if isinstance(response, Exception): if logger.isEnabledFor(logging.DEBUG): - logger.debug(f"Exception raised by {cmd_event} message: {type(response).__name__}") + logger.debug(f"Exception raised by {cmd_event} message: {type(response).__name__}") raise response return response
-
[docs] def listen(self, *event_types, buffer_size=10): - """Return an async iterator that iterates over events matching the - indicated types.""" + +
+[docs] + def listen(self, *event_types, buffer_size=10): + """Return an async iterator that iterates over events matching the + indicated types.""" sender, receiver = trio.open_memory_channel(buffer_size) for event_type in event_types: self.channels[event_type].add(sender) return receiver
-
[docs] @asynccontextmanager + +
+[docs] + @asynccontextmanager async def wait_for(self, event_type: Type[T], buffer_size=10) -> AsyncGenerator[CmEventProxy, None]: - """Wait for an event of the given type and return it. + """Wait for an event of the given type and return it. This is an async context manager, so you should open it inside an async with block. The block will not exit until the indicated event is received. - """ + """ sender: trio.MemorySendChannel receiver: trio.MemoryReceiveChannel sender, receiver = trio.open_memory_channel(buffer_size) @@ -296,77 +495,81 @@

Source code for selenium.webdriver.common.bidi.cdp

event = await receiver.receive() proxy.value = event
+ def _handle_data(self, data): - """Handle incoming WebSocket data. + """Handle incoming WebSocket data. :param dict data: a JSON dictionary - """ - if "id" in data: + """ + if "id" in data: self._handle_cmd_response(data) else: self._handle_event(data) def _handle_cmd_response(self, data): - """Handle a response to a command. This will set an event flag that + """Handle a response to a command. This will set an event flag that will return control to the task that called the command. :param dict data: response as a JSON dictionary - """ - cmd_id = data["id"] + """ + cmd_id = data["id"] try: cmd, event = self.inflight_cmd.pop(cmd_id) except KeyError: - logger.warning("Got a message with a command ID that does not exist: %s", data) + logger.warning("Got a message with a command ID that does not exist: %s", data) return - if "error" in data: + if "error" in data: # If the server reported an error, convert it to an exception and do # not process the response any further. - self.inflight_result[cmd_id] = BrowserError(data["error"]) + self.inflight_result[cmd_id] = BrowserError(data["error"]) else: # Otherwise, continue the generator to parse the JSON result # into a CDP object. try: - _ = cmd.send(data["result"]) - raise InternalError("The command's generator function did not exit when expected!") + _ = cmd.send(data["result"]) + raise InternalError("The command's generator function did not exit when expected!") except StopIteration as exit: return_ = exit.value self.inflight_result[cmd_id] = return_ event.set() def _handle_event(self, data): - """Handle an event. + """Handle an event. :param dict data: event as a JSON dictionary - """ + """ global devtools event = devtools.util.parse_json_event(data) - logger.debug("Received event: %s", event) + logger.debug("Received event: %s", event) to_remove = set() for sender in self.channels[type(event)]: try: sender.send_nowait(event) except trio.WouldBlock: - logger.error('Unable to send event "%r" due to full channel %s', event, sender) + logger.error('Unable to send event "%r" due to full channel %s', event, sender) except trio.BrokenResourceError: to_remove.add(sender) if to_remove: self.channels[type(event)] -= to_remove
-
[docs]class CdpSession(CdpBase): - """Contains the state for a CDP session. + +
+[docs] +class CdpSession(CdpBase): + """Contains the state for a CDP session. Generally you should not instantiate this object yourself; you should call :meth:`CdpConnection.open_session`. - """ + """ def __init__(self, ws, session_id, target_id): - """Constructor. + """Constructor. :param trio_websocket.WebSocketConnection ws: :param devtools.target.SessionID session_id: :param devtools.target.TargetID target_id: - """ + """ super().__init__(ws, session_id, target_id) self._dom_enable_count = 0 @@ -374,14 +577,16 @@

Source code for selenium.webdriver.common.bidi.cdp

self._page_enable_count = 0 self._page_enable_lock = trio.Lock() -
[docs] @asynccontextmanager +
+[docs] + @asynccontextmanager async def dom_enable(self): - """A context manager that executes ``dom.enable()`` when it enters and + """A context manager that executes ``dom.enable()`` when it enters and then calls ``dom.disable()``. This keeps track of concurrent callers and only disables DOM events when all callers have exited. - """ + """ global devtools async with self._dom_enable_lock: self._dom_enable_count += 1 @@ -395,14 +600,17 @@

Source code for selenium.webdriver.common.bidi.cdp

if self._dom_enable_count == 0: await self.execute(devtools.dom.disable())
-
[docs] @asynccontextmanager + +
+[docs] + @asynccontextmanager async def page_enable(self): - """A context manager that executes ``page.enable()`` when it enters and + """A context manager that executes ``page.enable()`` when it enters and then calls ``page.disable()`` when it exits. This keeps track of concurrent callers and only disables page events when all callers have exited. - """ + """ global devtools async with self._page_enable_lock: self._page_enable_count += 1 @@ -414,71 +622,84 @@

Source code for selenium.webdriver.common.bidi.cdp

async with self._page_enable_lock: self._page_enable_count -= 1 if self._page_enable_count == 0: - await self.execute(devtools.page.disable())
+ await self.execute(devtools.page.disable())
+
+ -
[docs]class CdpConnection(CdpBase, trio.abc.AsyncResource): - """Contains the connection state for a Chrome DevTools Protocol server. +
+[docs] +class CdpConnection(CdpBase, trio.abc.AsyncResource): + """Contains the connection state for a Chrome DevTools Protocol server. - CDP can multiplex multiple "sessions" over a single connection. This - class corresponds to the "root" session, i.e. the implicitly created + CDP can multiplex multiple "sessions" over a single connection. This + class corresponds to the "root" session, i.e. the implicitly created session that has no session ID. This class is responsible for reading incoming WebSocket messages and forwarding them to the corresponding session, as well as handling messages targeted at the root session itself. You should generally call the :func:`open_cdp()` instead of instantiating this class directly. - """ + """ def __init__(self, ws): - """Constructor. + """Constructor. :param trio_websocket.WebSocketConnection ws: - """ + """ super().__init__(ws, session_id=None, target_id=None) self.sessions = {} -
[docs] async def aclose(self): - """Close the underlying WebSocket connection. +
+[docs] + async def aclose(self): + """Close the underlying WebSocket connection. This will cause the reader task to gracefully exit when it tries to read the next message from the WebSocket. All of the public APIs (``execute()``, ``listen()``, etc.) will raise ``CdpConnectionClosed`` after the CDP connection is closed. It is safe to call this multiple times. - """ + """ await self.ws.aclose()
-
[docs] @asynccontextmanager + +
+[docs] + @asynccontextmanager async def open_session(self, target_id) -> AsyncIterator[CdpSession]: - """This context manager opens a session and enables the "simple" style + """This context manager opens a session and enables the "simple" style of calling CDP APIs. For example, inside a session context, you can call ``await dom.get_document()`` and it will execute on the current session automatically. - """ + """ session = await self.connect_session(target_id) with session_context(session): yield session
-
[docs] async def connect_session(self, target_id) -> "CdpSession": - """Returns a new :class:`CdpSession` connected to the specified - target.""" + +
+[docs] + async def connect_session(self, target_id) -> "CdpSession": + """Returns a new :class:`CdpSession` connected to the specified + target.""" global devtools session_id = await self.execute(devtools.target.attach_to_target(target_id, True)) session = CdpSession(self.ws, session_id, target_id) self.sessions[session_id] = session return session
+ async def _reader_task(self): - """Runs in the background and handles incoming messages: dispatching - responses to commands and events to listeners.""" + """Runs in the background and handles incoming messages: dispatching + responses to commands and events to listeners.""" global devtools while True: try: message = await self.ws.get_message() except WsConnectionClosed: - # If the WebSocket is closed, we don't want to throw an + # If the WebSocket is closed, we don't want to throw an # exception from the reader task. Instead we will throw # exceptions from the public API methods, and we can quietly # exit the reader task here. @@ -486,18 +707,18 @@

Source code for selenium.webdriver.common.bidi.cdp

try: data = json.loads(message) except json.JSONDecodeError: - raise BrowserError({"code": -32700, "message": "Client received invalid JSON", "data": message}) - logger.debug("Received message %r", data) - if "sessionId" in data: - session_id = devtools.target.SessionID(data["sessionId"]) + raise BrowserError({"code": -32700, "message": "Client received invalid JSON", "data": message}) + logger.debug("Received message %r", data) + if "sessionId" in data: + session_id = devtools.target.SessionID(data["sessionId"]) try: session = self.sessions[session_id] except KeyError: raise BrowserError( { - "code": -32700, - "message": "Browser sent a message for an invalid session", - "data": f"{session_id!r}", + "code": -32700, + "message": "Browser sent a message for an invalid session", + "data": f"{session_id!r}", } ) session._handle_data(data) @@ -510,9 +731,12 @@

Source code for selenium.webdriver.common.bidi.cdp

sender.close()
-
[docs]@asynccontextmanager + +
+[docs] +@asynccontextmanager async def open_cdp(url) -> AsyncIterator[CdpConnection]: - """This async context manager opens a connection to the browser specified + """This async context manager opens a connection to the browser specified by ``url`` before entering the block, then closes the connection when the block exits. @@ -521,7 +745,7 @@

Source code for selenium.webdriver.common.bidi.cdp

target.get_targets()`` will run on this connection automatically. If you want to use multiple connections concurrently, it is recommended to open each on in a separate task. - """ + """ async with trio.open_nursery() as nursery: conn = await connect_cdp(nursery, url) @@ -532,8 +756,11 @@

Source code for selenium.webdriver.common.bidi.cdp

await conn.aclose()
-
[docs]async def connect_cdp(nursery, url) -> CdpConnection: - """Connect to the browser specified by ``url`` and spawn a background task + +
+[docs] +async def connect_cdp(nursery, url) -> CdpConnection: + """Connect to the browser specified by ``url`` and spawn a background task in the specified nursery. The ``open_cdp()`` context manager is preferred in most situations. @@ -545,49 +772,40 @@

Source code for selenium.webdriver.common.bidi.cdp

connection will be installed as the default connection for the current task. This argument is for unusual use cases, such as running inside of a notebook. - """ + """ ws = await connect_websocket_url(nursery, url, max_message_size=MAX_WS_MESSAGE_SIZE) cdp_conn = CdpConnection(ws) nursery.start_soon(cdp_conn._reader_task) return cdp_conn
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/bidi/console.html b/docs/api/py/_modules/selenium/webdriver/common/bidi/console.html index b280bf0495e15..72f07abfa6e47 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/bidi/console.html +++ b/docs/api/py/_modules/selenium/webdriver/common/bidi/console.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.common.bidi.console — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.bidi.console — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.bidi.console

+  

Source code for selenium.webdriver.common.bidi.console

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -56,48 +212,41 @@ 

Source code for selenium.webdriver.common.bidi.console

from enum import Enum -
[docs]class Console(Enum): - ALL = "all" - LOG = "log" - ERROR = "error"
+
+[docs] +class Console(Enum): + ALL = "all" + LOG = "log" + ERROR = "error"
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/bidi/script.html b/docs/api/py/_modules/selenium/webdriver/common/bidi/script.html index 9a27708bad368..d72d5481377db 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/bidi/script.html +++ b/docs/api/py/_modules/selenium/webdriver/common/bidi/script.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.common.bidi.script — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.bidi.script — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.bidi.script

+  

Source code for selenium.webdriver.common.bidi.script

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -60,23 +216,34 @@ 

Source code for selenium.webdriver.common.bidi.script

from .session import session_unsubscribe -
[docs]class Script: +
+[docs] +class Script: def __init__(self, conn): self.conn = conn self.log_entry_subscribed = False -
[docs] def add_console_message_handler(self, handler): +
+[docs] + def add_console_message_handler(self, handler): self._subscribe_to_log_entries() - return self.conn.add_callback(LogEntryAdded, self._handle_log_entry("console", handler))
+ return self.conn.add_callback(LogEntryAdded, self._handle_log_entry("console", handler))
-
[docs] def add_javascript_error_handler(self, handler): + +
+[docs] + def add_javascript_error_handler(self, handler): self._subscribe_to_log_entries() - return self.conn.add_callback(LogEntryAdded, self._handle_log_entry("javascript", handler))
+ return self.conn.add_callback(LogEntryAdded, self._handle_log_entry("javascript", handler))
+ -
[docs] def remove_console_message_handler(self, id): +
+[docs] + def remove_console_message_handler(self, id): self.conn.remove_callback(LogEntryAdded, id) self._unsubscribe_from_log_entries()
+ remove_javascript_error_handler = remove_console_message_handler def _subscribe_to_log_entries(self): @@ -97,18 +264,27 @@

Source code for selenium.webdriver.common.bidi.script

return _handle_log_entry
-
[docs]class LogEntryAdded: - event_class = "log.entryAdded" -
[docs] @classmethod +
+[docs] +class LogEntryAdded: + event_class = "log.entryAdded" + +
+[docs] + @classmethod def from_json(cls, json): - if json["type"] == "console": + if json["type"] == "console": return ConsoleLogEntry.from_json(json) - elif json["type"] == "javascript": - return JavaScriptLogEntry.from_json(json)
+ elif json["type"] == "javascript": + return JavaScriptLogEntry.from_json(json)
+
+ -
[docs]@dataclass +
+[docs] +@dataclass class ConsoleLogEntry: level: str text: str @@ -117,19 +293,25 @@

Source code for selenium.webdriver.common.bidi.script

args: List[dict] type_: str -
[docs] @classmethod +
+[docs] + @classmethod def from_json(cls, json): return cls( - level=json["level"], - text=json["text"], - timestamp=json["timestamp"], - method=json["method"], - args=json["args"], - type_=json["type"], - )
+ level=json["level"], + text=json["text"], + timestamp=json["timestamp"], + method=json["method"], + args=json["args"], + type_=json["type"], + )
+
+ -
[docs]@dataclass +
+[docs] +@dataclass class JavaScriptLogEntry: level: str text: str @@ -137,53 +319,47 @@

Source code for selenium.webdriver.common.bidi.script

stacktrace: dict type_: str -
[docs] @classmethod +
+[docs] + @classmethod def from_json(cls, json): return cls( - level=json["level"], - text=json["text"], - timestamp=json["timestamp"], - stacktrace=json["stackTrace"], - type_=json["type"], - )
+ level=json["level"], + text=json["text"], + timestamp=json["timestamp"], + stacktrace=json["stackTrace"], + type_=json["type"], + )
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/bidi/session.html b/docs/api/py/_modules/selenium/webdriver/common/bidi/session.html index cd7f5d7fe1cbd..a11506ca2ea6c 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/bidi/session.html +++ b/docs/api/py/_modules/selenium/webdriver/common/bidi/session.html @@ -1,125 +1,277 @@ - + - selenium.webdriver.common.bidi.session — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.bidi.session — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.bidi.session

+  

Source code for selenium.webdriver.common.bidi.session

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
 
 
-
[docs]def session_subscribe(*events, browsing_contexts=None): +
+[docs] +def session_subscribe(*events, browsing_contexts=None): cmd_dict = { - "method": "session.subscribe", - "params": { - "events": events, + "method": "session.subscribe", + "params": { + "events": events, }, } if browsing_contexts is None: browsing_contexts = [] if browsing_contexts: - cmd_dict["params"]["browsingContexts"] = browsing_contexts + cmd_dict["params"]["browsingContexts"] = browsing_contexts _ = yield cmd_dict return None
-
[docs]def session_unsubscribe(*events, browsing_contexts=None): + +
+[docs] +def session_unsubscribe(*events, browsing_contexts=None): cmd_dict = { - "method": "session.unsubscribe", - "params": { - "events": events, + "method": "session.unsubscribe", + "params": { + "events": events, }, } if browsing_contexts is None: browsing_contexts = [] if browsing_contexts: - cmd_dict["params"]["browsingContexts"] = browsing_contexts + cmd_dict["params"]["browsingContexts"] = browsing_contexts _ = yield cmd_dict return None
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/by.html b/docs/api/py/_modules/selenium/webdriver/common/by.html index eef0a763ae1c8..738f87e84938d 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/by.html +++ b/docs/api/py/_modules/selenium/webdriver/common/by.html @@ -1,72 +1,230 @@ - + - selenium.webdriver.common.by — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.by — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.by

+  

Source code for selenium.webdriver.common.by

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-"""The By implementation."""
+"""The By implementation."""
 
 from typing import Dict
 from typing import Literal
 from typing import Optional
 
 
-
[docs]class By: - """Set of supported locator strategies. +
+[docs] +class By: + """Set of supported locator strategies. ID: -- Select the element by its ID. - >>> element = driver.find_element(By.ID, 'myElement') + >>> element = driver.find_element(By.ID, 'myElement') XPATH: ------ @@ -74,108 +232,108 @@

Source code for selenium.webdriver.common.by

        - absolute path
         - relative path
 
-    >>> element = driver.find_element(By.XPATH, '//html/body/div')
+    >>> element = driver.find_element(By.XPATH, '//html/body/div')
 
     LINK_TEXT:
     ----------
     Select the link element having the exact text.
 
-    >>> element = driver.find_element(By.LINK_TEXT, 'myLink')
+    >>> element = driver.find_element(By.LINK_TEXT, 'myLink')
 
     PARTIAL_LINK_TEXT:
     ------------------
     Select the link element having the partial text.
 
-    >>> element = driver.find_element(By.PARTIAL_LINK_TEXT, 'my')
+    >>> element = driver.find_element(By.PARTIAL_LINK_TEXT, 'my')
 
     NAME:
     ----
     Select the element by its name attribute.
 
-    >>> element = driver.find_element(By.NAME, 'myElement')
+    >>> element = driver.find_element(By.NAME, 'myElement')
 
     TAG_NAME:
     --------
     Select the element by its tag name.
 
-    >>> element = driver.find_element(By.TAG_NAME, 'div')
+    >>> element = driver.find_element(By.TAG_NAME, 'div')
 
     CLASS_NAME:
-    ----------
+    -----------
     Select the element by its class name.
 
-    >>> element = driver.find_element(By.CLASS_NAME, 'myElement')
+    >>> element = driver.find_element(By.CLASS_NAME, 'myElement')
 
     CSS_SELECTOR:
     -------------
     Select the element by its CSS selector.
 
-    >>> element = driver.find_element(By.CSS_SELECTOR, 'div.myElement')
-    """
+    >>> element = driver.find_element(By.CSS_SELECTOR, 'div.myElement')
+    """
 
-    ID = "id"
-    XPATH = "xpath"
-    LINK_TEXT = "link text"
-    PARTIAL_LINK_TEXT = "partial link text"
-    NAME = "name"
-    TAG_NAME = "tag name"
-    CLASS_NAME = "class name"
-    CSS_SELECTOR = "css selector"
+    ID = "id"
+    XPATH = "xpath"
+    LINK_TEXT = "link text"
+    PARTIAL_LINK_TEXT = "partial link text"
+    NAME = "name"
+    TAG_NAME = "tag name"
+    CLASS_NAME = "class name"
+    CSS_SELECTOR = "css selector"
 
     _custom_finders: Dict[str, str] = {}
 
-
[docs] @classmethod +
+[docs] + @classmethod def register_custom_finder(cls, name: str, strategy: str) -> None: cls._custom_finders[name] = strategy
-
[docs] @classmethod + +
+[docs] + @classmethod def get_finder(cls, name: str) -> Optional[str]: return cls._custom_finders.get(name) or getattr(cls, name.upper(), None)
-
[docs] @classmethod + +
+[docs] + @classmethod def clear_custom_finders(cls) -> None: - cls._custom_finders.clear()
+ cls._custom_finders.clear()
+
+ -ByType = Literal["id", "xpath", "link text", "partial link text", "name", "tag name", "class name", "css selector"] +ByType = Literal["id", "xpath", "link text", "partial link text", "name", "tag name", "class name", "css selector"]
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/desired_capabilities.html b/docs/api/py/_modules/selenium/webdriver/common/desired_capabilities.html index 0c03788615113..60d20cdae6992 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/desired_capabilities.html +++ b/docs/api/py/_modules/selenium/webdriver/common/desired_capabilities.html @@ -1,62 +1,220 @@ - + - selenium.webdriver.common.desired_capabilities — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.desired_capabilities — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.desired_capabilities

+  

Source code for selenium.webdriver.common.desired_capabilities

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-"""The Desired Capabilities implementation."""
+"""The Desired Capabilities implementation."""
 
 
-
[docs]class DesiredCapabilities: - """Set of default supported desired capabilities. +
+[docs] +class DesiredCapabilities: + """Set of default supported desired capabilities. Use this as a starting point for creating a desired capabilities object for requesting remote webdrivers for connecting to selenium server or selenium grid. @@ -65,115 +223,106 @@

Source code for selenium.webdriver.common.desired_capabilities

from selenium import webdriver - selenium_grid_url = "http://198.0.0.1:4444/wd/hub" + selenium_grid_url = "http://198.0.0.1:4444/wd/hub" # Create a desired capabilities object as a starting point. capabilities = DesiredCapabilities.FIREFOX.copy() - capabilities['platform'] = "WINDOWS" - capabilities['version'] = "10" + capabilities['platform'] = "WINDOWS" + capabilities['version'] = "10" # Instantiate an instance of Remote WebDriver with the desired capabilities. driver = webdriver.Remote(desired_capabilities=capabilities, command_executor=selenium_grid_url) - Note: Always use '.copy()' on the DesiredCapabilities object to avoid the side + Note: Always use '.copy()' on the DesiredCapabilities object to avoid the side effects of altering the Global class instance. - """ + """ FIREFOX = { - "browserName": "firefox", - "acceptInsecureCerts": True, - "moz:debuggerAddress": True, + "browserName": "firefox", + "acceptInsecureCerts": True, + "moz:debuggerAddress": True, } INTERNETEXPLORER = { - "browserName": "internet explorer", - "platformName": "windows", + "browserName": "internet explorer", + "platformName": "windows", } EDGE = { - "browserName": "MicrosoftEdge", + "browserName": "MicrosoftEdge", } CHROME = { - "browserName": "chrome", + "browserName": "chrome", } SAFARI = { - "browserName": "safari", - "platformName": "mac", + "browserName": "safari", + "platformName": "mac", } HTMLUNIT = { - "browserName": "htmlunit", - "version": "", - "platform": "ANY", + "browserName": "htmlunit", + "version": "", + "platform": "ANY", } HTMLUNITWITHJS = { - "browserName": "htmlunit", - "version": "firefox", - "platform": "ANY", - "javascriptEnabled": True, + "browserName": "htmlunit", + "version": "firefox", + "platform": "ANY", + "javascriptEnabled": True, } IPHONE = { - "browserName": "iPhone", - "version": "", - "platform": "mac", + "browserName": "iPhone", + "version": "", + "platform": "mac", } IPAD = { - "browserName": "iPad", - "version": "", - "platform": "mac", + "browserName": "iPad", + "version": "", + "platform": "mac", } WEBKITGTK = { - "browserName": "MiniBrowser", + "browserName": "MiniBrowser", } WPEWEBKIT = { - "browserName": "MiniBrowser", + "browserName": "MiniBrowser", }
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/driver_finder.html b/docs/api/py/_modules/selenium/webdriver/common/driver_finder.html index 4f58d1e432c93..339d5004d09e8 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/driver_finder.html +++ b/docs/api/py/_modules/selenium/webdriver/common/driver_finder.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.common.driver_finder — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.driver_finder — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.driver_finder

+  

Source code for selenium.webdriver.common.driver_finder

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -63,116 +219,115 @@ 

Source code for selenium.webdriver.common.driver_finder

logger = logging.getLogger(__name__) -
[docs]class DriverFinder: - """A Driver finding class responsible for obtaining the correct driver and +
+[docs] +class DriverFinder: + """A Driver finding class responsible for obtaining the correct driver and associated browser. :param service: instance of the driver service class. :param options: instance of the browser options class. - """ + """ def __init__(self, service: Service, options: BaseOptions) -> None: self._service = service self._options = options - self._paths = {"driver_path": "", "browser_path": ""} + self._paths = {"driver_path": "", "browser_path": ""} - """Utility to find if a given file is present and executable. + """Utility to find if a given file is present and executable. This implementation is still in beta, and may change. - """ + """ + +
+[docs] + def get_browser_path(self) -> str: + return self._binary_paths()["browser_path"]
-
[docs] def get_browser_path(self) -> str: - return self._binary_paths()["browser_path"]
-
[docs] def get_driver_path(self) -> str: - return self._binary_paths()["driver_path"]
+
+[docs] + def get_driver_path(self) -> str: + return self._binary_paths()["driver_path"]
+ def _binary_paths(self) -> dict: - if self._paths["driver_path"]: + if self._paths["driver_path"]: return self._paths - browser = self._options.capabilities["browserName"] + browser = self._options.capabilities["browserName"] try: path = self._service.path if path: logger.debug( - "Skipping Selenium Manager; path to %s driver specified in Service class: %s", browser, path + "Skipping Selenium Manager; path to %s driver specified in Service class: %s", browser, path ) if not Path(path).is_file(): - raise ValueError(f"The path is not a valid file: {path}") - self._paths["driver_path"] = path + raise ValueError(f"The path is not a valid file: {path}") + self._paths["driver_path"] = path else: output = SeleniumManager().binary_paths(self._to_args()) - if Path(output["driver_path"]).is_file(): - self._paths["driver_path"] = output["driver_path"] + if Path(output["driver_path"]).is_file(): + self._paths["driver_path"] = output["driver_path"] else: - raise ValueError(f'The driver path is not a valid file: {output["driver_path"]}') - if Path(output["browser_path"]).is_file(): - self._paths["browser_path"] = output["browser_path"] + raise ValueError(f'The driver path is not a valid file: {output["driver_path"]}') + if Path(output["browser_path"]).is_file(): + self._paths["browser_path"] = output["browser_path"] else: - raise ValueError(f'The browser path is not a valid file: {output["browser_path"]}') + raise ValueError(f'The browser path is not a valid file: {output["browser_path"]}') except Exception as err: - msg = f"Unable to obtain driver for {browser}" + msg = f"Unable to obtain driver for {browser}" raise NoSuchDriverException(msg) from err return self._paths def _to_args(self) -> list: - args = ["--browser", self._options.capabilities["browserName"]] + args = ["--browser", self._options.capabilities["browserName"]] if self._options.browser_version: - args.append("--browser-version") + args.append("--browser-version") args.append(str(self._options.browser_version)) - binary_location = getattr(self._options, "binary_location", None) + binary_location = getattr(self._options, "binary_location", None) if binary_location: - args.append("--browser-path") + args.append("--browser-path") args.append(str(binary_location)) proxy = self._options.proxy if proxy and (proxy.http_proxy or proxy.ssl_proxy): - args.append("--proxy") + args.append("--proxy") value = proxy.ssl_proxy if proxy.ssl_proxy else proxy.http_proxy args.append(value) return args
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/keys.html b/docs/api/py/_modules/selenium/webdriver/common/keys.html index 6101539954e7a..0834a0d8d8a88 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/keys.html +++ b/docs/api/py/_modules/selenium/webdriver/common/keys.html @@ -1,169 +1,318 @@ - + - selenium.webdriver.common.keys — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.keys — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.keys

+  

Source code for selenium.webdriver.common.keys

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-"""The Keys implementation."""
+"""The Keys implementation."""
 
 
-
[docs]class Keys: - """Set of special keys codes.""" +
+[docs] +class Keys: + """Set of special keys codes.""" - NULL = "\ue000" - CANCEL = "\ue001" # ^break - HELP = "\ue002" - BACKSPACE = "\ue003" + NULL = "\ue000" + CANCEL = "\ue001" # ^break + HELP = "\ue002" + BACKSPACE = "\ue003" BACK_SPACE = BACKSPACE - TAB = "\ue004" - CLEAR = "\ue005" - RETURN = "\ue006" - ENTER = "\ue007" - SHIFT = "\ue008" + TAB = "\ue004" + CLEAR = "\ue005" + RETURN = "\ue006" + ENTER = "\ue007" + SHIFT = "\ue008" LEFT_SHIFT = SHIFT - CONTROL = "\ue009" + CONTROL = "\ue009" LEFT_CONTROL = CONTROL - ALT = "\ue00a" + ALT = "\ue00a" LEFT_ALT = ALT - PAUSE = "\ue00b" - ESCAPE = "\ue00c" - SPACE = "\ue00d" - PAGE_UP = "\ue00e" - PAGE_DOWN = "\ue00f" - END = "\ue010" - HOME = "\ue011" - LEFT = "\ue012" + PAUSE = "\ue00b" + ESCAPE = "\ue00c" + SPACE = "\ue00d" + PAGE_UP = "\ue00e" + PAGE_DOWN = "\ue00f" + END = "\ue010" + HOME = "\ue011" + LEFT = "\ue012" ARROW_LEFT = LEFT - UP = "\ue013" + UP = "\ue013" ARROW_UP = UP - RIGHT = "\ue014" + RIGHT = "\ue014" ARROW_RIGHT = RIGHT - DOWN = "\ue015" + DOWN = "\ue015" ARROW_DOWN = DOWN - INSERT = "\ue016" - DELETE = "\ue017" - SEMICOLON = "\ue018" - EQUALS = "\ue019" - - NUMPAD0 = "\ue01a" # number pad keys - NUMPAD1 = "\ue01b" - NUMPAD2 = "\ue01c" - NUMPAD3 = "\ue01d" - NUMPAD4 = "\ue01e" - NUMPAD5 = "\ue01f" - NUMPAD6 = "\ue020" - NUMPAD7 = "\ue021" - NUMPAD8 = "\ue022" - NUMPAD9 = "\ue023" - MULTIPLY = "\ue024" - ADD = "\ue025" - SEPARATOR = "\ue026" - SUBTRACT = "\ue027" - DECIMAL = "\ue028" - DIVIDE = "\ue029" - - F1 = "\ue031" # function keys - F2 = "\ue032" - F3 = "\ue033" - F4 = "\ue034" - F5 = "\ue035" - F6 = "\ue036" - F7 = "\ue037" - F8 = "\ue038" - F9 = "\ue039" - F10 = "\ue03a" - F11 = "\ue03b" - F12 = "\ue03c" - - META = "\ue03d" - COMMAND = "\ue03d" - ZENKAKU_HANKAKU = "\ue040"
+ INSERT = "\ue016" + DELETE = "\ue017" + SEMICOLON = "\ue018" + EQUALS = "\ue019" + + NUMPAD0 = "\ue01a" # number pad keys + NUMPAD1 = "\ue01b" + NUMPAD2 = "\ue01c" + NUMPAD3 = "\ue01d" + NUMPAD4 = "\ue01e" + NUMPAD5 = "\ue01f" + NUMPAD6 = "\ue020" + NUMPAD7 = "\ue021" + NUMPAD8 = "\ue022" + NUMPAD9 = "\ue023" + MULTIPLY = "\ue024" + ADD = "\ue025" + SEPARATOR = "\ue026" + SUBTRACT = "\ue027" + DECIMAL = "\ue028" + DIVIDE = "\ue029" + + F1 = "\ue031" # function keys + F2 = "\ue032" + F3 = "\ue033" + F4 = "\ue034" + F5 = "\ue035" + F6 = "\ue036" + F7 = "\ue037" + F8 = "\ue038" + F9 = "\ue039" + F10 = "\ue03a" + F11 = "\ue03b" + F12 = "\ue03c" + + META = "\ue03d" + COMMAND = "\ue03d" + ZENKAKU_HANKAKU = "\ue040"
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/log.html b/docs/api/py/_modules/selenium/webdriver/common/log.html index 3f8b1635d5618..952e9ce8cfc1c 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/log.html +++ b/docs/api/py/_modules/selenium/webdriver/common/log.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.common.log — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.log — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.log

+  

Source code for selenium.webdriver.common.log

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -67,92 +223,102 @@ 

Source code for selenium.webdriver.common.log

cdp = None -
[docs]def import_cdp(): +
+[docs] +def import_cdp(): global cdp if not cdp: - cdp = import_module("selenium.webdriver.common.bidi.cdp")
+ cdp = import_module("selenium.webdriver.common.bidi.cdp")
-
[docs]class Log: - """This class allows access to logging APIs that use the new WebDriver Bidi + +
+[docs] +class Log: + """This class allows access to logging APIs that use the new WebDriver Bidi protocol. This class is not to be used directly and should be used from the webdriver base classes. - """ + """ def __init__(self, driver, bidi_session) -> None: self.driver = driver self.session = bidi_session.session self.cdp = bidi_session.cdp self.devtools = bidi_session.devtools - _pkg = ".".join(__name__.split(".")[:-1]) + _pkg = ".".join(__name__.split(".")[:-1]) # Ensure _mutation_listener_js is not None before decoding - _mutation_listener_js_bytes: Optional[bytes] = pkgutil.get_data(_pkg, "mutation-listener.js") + _mutation_listener_js_bytes: Optional[bytes] = pkgutil.get_data(_pkg, "mutation-listener.js") if _mutation_listener_js_bytes is None: - raise ValueError("Failed to load mutation-listener.js") - self._mutation_listener_js = _mutation_listener_js_bytes.decode("utf8").strip() + raise ValueError("Failed to load mutation-listener.js") + self._mutation_listener_js = _mutation_listener_js_bytes.decode("utf8").strip() -
[docs] @asynccontextmanager +
+[docs] + @asynccontextmanager async def mutation_events(self) -> AsyncGenerator[Dict[str, Any], None]: - """Listen for mutation events and emit them as they are found. + """Listen for mutation events and emit them as they are found. :Usage: :: async with driver.log.mutation_events() as event: - pages.load("dynamic.html") - driver.find_element(By.ID, "reveal").click() + pages.load("dynamic.html") + driver.find_element(By.ID, "reveal").click() WebDriverWait(driver, 5)\ - .until(EC.visibility_of(driver.find_element(By.ID, "revealed"))) + .until(EC.visibility_of(driver.find_element(By.ID, "revealed"))) - assert event["attribute_name"] == "style" - assert event["current_value"] == "" - assert event["old_value"] == "display:none;" - """ + assert event["attribute_name"] == "style" + assert event["current_value"] == "" + assert event["old_value"] == "display:none;" + """ - page = self.cdp.get_session_context("page.enable") + page = self.cdp.get_session_context("page.enable") await page.execute(self.devtools.page.enable()) - runtime = self.cdp.get_session_context("runtime.enable") + runtime = self.cdp.get_session_context("runtime.enable") await runtime.execute(self.devtools.runtime.enable()) - await runtime.execute(self.devtools.runtime.add_binding("__webdriver_attribute")) + await runtime.execute(self.devtools.runtime.add_binding("__webdriver_attribute")) self.driver.pin_script(self._mutation_listener_js) script_key = await page.execute( self.devtools.page.add_script_to_evaluate_on_new_document(self._mutation_listener_js) ) self.driver.pin_script(self._mutation_listener_js, script_key) - self.driver.execute_script(f"return {self._mutation_listener_js}") + self.driver.execute_script(f"return {self._mutation_listener_js}") event: Dict[str, Any] = {} async with runtime.wait_for(self.devtools.runtime.BindingCalled) as evnt: yield event payload = json.loads(evnt.value.payload) - elements: list = self.driver.find_elements(By.CSS_SELECTOR, f"*[data-__webdriver_id={payload['target']}]") + elements: list = self.driver.find_elements(By.CSS_SELECTOR, f"*[data-__webdriver_id=\"{payload['target']}\"]") if not elements: elements.append(None) - event["element"] = elements[0] - event["attribute_name"] = payload["name"] - event["current_value"] = payload["value"] - event["old_value"] = payload["oldValue"]
+ event["element"] = elements[0] + event["attribute_name"] = payload["name"] + event["current_value"] = payload["value"] + event["old_value"] = payload["oldValue"]
+ -
[docs] @asynccontextmanager +
+[docs] + @asynccontextmanager async def add_js_error_listener(self) -> AsyncGenerator[Dict[str, Any], None]: - """Listen for JS errors and when the contextmanager exits check if + """Listen for JS errors and when the contextmanager exits check if there were JS Errors. :Usage: :: async with driver.log.add_js_error_listener() as error: - driver.find_element(By.ID, "throwing-mouseover").click() + driver.find_element(By.ID, "throwing-mouseover").click() assert bool(error) - assert error.exception_details.stack_trace.call_frames[0].function_name == "onmouseover" - """ + assert error.exception_details.stack_trace.call_frames[0].function_name == "onmouseover" + """ - session = self.cdp.get_session_context("page.enable") + session = self.cdp.get_session_context("page.enable") await session.execute(self.devtools.page.enable()) - session = self.cdp.get_session_context("runtime.enable") + session = self.cdp.get_session_context("runtime.enable") await session.execute(self.devtools.runtime.enable()) js_exception = self.devtools.runtime.ExceptionThrown(None, None) async with session.wait_for(self.devtools.runtime.ExceptionThrown) as exception: @@ -160,9 +326,12 @@

Source code for selenium.webdriver.common.log

js_exception.timestamp = exception.value.timestamp js_exception.exception_details = exception.value.exception_details
-
[docs] @asynccontextmanager + +
+[docs] + @asynccontextmanager async def add_listener(self, event_type) -> AsyncGenerator[Dict[str, Any], None]: - """Listen for certain events that are passed in. + """Listen for certain events that are passed in. :Args: - event_type: The type of event that we want to look at. @@ -171,61 +340,53 @@

Source code for selenium.webdriver.common.log

:: async with driver.log.add_listener(Console.log) as messages: - driver.execute_script("console.log('I like cheese')") - assert messages["message"] == "I love cheese" - """ + driver.execute_script("console.log('I like cheese')") + assert messages["message"] == "I love cheese" + """ from selenium.webdriver.common.bidi.console import Console - session = self.cdp.get_session_context("page.enable") + session = self.cdp.get_session_context("page.enable") await session.execute(self.devtools.page.enable()) - session = self.cdp.get_session_context("runtime.enable") + session = self.cdp.get_session_context("runtime.enable") await session.execute(self.devtools.runtime.enable()) - console: Dict[str, Any] = {"message": None, "level": None} + console: Dict[str, Any] = {"message": None, "level": None} async with session.wait_for(self.devtools.runtime.ConsoleAPICalled) as messages: yield console if event_type == Console.ALL or event_type.value == messages.value.type_: - console["message"] = messages.value.args[0].value - console["level"] = messages.value.args[0].type_
+ console["message"] = messages.value.args[0].value + console["level"] = messages.value.args[0].type_
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/options.html b/docs/api/py/_modules/selenium/webdriver/common/options.html index 854d4340cb5d5..403554fbf43b5 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/options.html +++ b/docs/api/py/_modules/selenium/webdriver/common/options.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.common.options — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.options — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.options

+  

Source code for selenium.webdriver.common.options

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -63,8 +219,10 @@ 

Source code for selenium.webdriver.common.options

from selenium.webdriver.common.proxy import Proxy -
[docs]class PageLoadStrategy(str, Enum): - """Enum of possible page load strategies. +
+[docs] +class PageLoadStrategy(str, Enum): + """Enum of possible page load strategies. Selenium support following strategies: * normal (default) - waits for all resources to download @@ -72,11 +230,12 @@

Source code for selenium.webdriver.common.options

* none - does not block `WebDriver` at all Docs: https://www.selenium.dev/documentation/webdriver/drivers/options/#pageloadstrategy. - """ + """ + + normal = "normal" + eager = "eager" + none = "none"
- normal = "normal" - eager = "eager" - none = "none"
class _BaseOptionsDescriptor: @@ -84,31 +243,31 @@

Source code for selenium.webdriver.common.options

self.name = name def __get__(self, obj, cls): - if self.name == "enableBidi": + if self.name == "enableBidi": # whether BiDi is or will be enabled - value = obj._caps.get("webSocketUrl") + value = obj._caps.get("webSocketUrl") return value is True or isinstance(value, str) - if self.name == "webSocketUrl": + if self.name == "webSocketUrl": # Return socket url or None if not created yet value = obj._caps.get(self.name) return None if not isinstance(value, str) else value - if self.name in ("acceptInsecureCerts", "strictFileInteractability", "setWindowRect", "se:downloadsEnabled"): + if self.name in ("acceptInsecureCerts", "strictFileInteractability", "setWindowRect", "se:downloadsEnabled"): return obj._caps.get(self.name, False) return obj._caps.get(self.name) def __set__(self, obj, value): - if self.name == "enableBidi": - obj.set_capability("webSocketUrl", value) + if self.name == "enableBidi": + obj.set_capability("webSocketUrl", value) else: obj.set_capability(self.name, value) class _PageLoadStrategyDescriptor: - """Determines the point at which a navigation command is returned: + """Determines the point at which a navigation command is returned: https://w3c.github.io/webdriver/#dfn-table-of-page-load-strategies. :param strategy: the strategy corresponding to a document readiness state - """ + """ def __init__(self, name): self.name = name @@ -117,21 +276,21 @@

Source code for selenium.webdriver.common.options

return obj._caps.get(self.name) def __set__(self, obj, value): - if value in ("normal", "eager", "none"): + if value in ("normal", "eager", "none"): obj.set_capability(self.name, value) else: - raise ValueError("Strategy can only be one of the following: normal, eager, none") + raise ValueError("Strategy can only be one of the following: normal, eager, none") class _UnHandledPromptBehaviorDescriptor: - """How the driver should respond when an alert is present and the: + """How the driver should respond when an alert is present and the: command sent is not handling the alert: https://w3c.github.io/webdriver/#dfn-table-of-page-load-strategies: :param behavior: behavior to use when an alert is encountered :returns: Values for implicit timeout, pageLoad timeout and script timeout if set (in milliseconds) - """ + """ def __init__(self, name): self.name = name @@ -140,23 +299,23 @@

Source code for selenium.webdriver.common.options

return obj._caps.get(self.name) def __set__(self, obj, value): - if value in ("dismiss", "accept", "dismiss and notify", "accept and notify", "ignore"): + if value in ("dismiss", "accept", "dismiss and notify", "accept and notify", "ignore"): obj.set_capability(self.name, value) else: raise ValueError( - "Behavior can only be one of the following: dismiss, accept, dismiss and notify, " - "accept and notify, ignore" + "Behavior can only be one of the following: dismiss, accept, dismiss and notify, " + "accept and notify, ignore" ) class _TimeoutsDescriptor: - """How long the driver should wait for actions to complete before: + """How long the driver should wait for actions to complete before: returning an error https://w3c.github.io/webdriver/#timeouts: :param timeouts: values in milliseconds for implicit wait, page load and script timeout :returns: Values for implicit timeout, pageLoad timeout and script timeout if set (in milliseconds) - """ + """ def __init__(self, name): self.name = name @@ -165,14 +324,14 @@

Source code for selenium.webdriver.common.options

return obj._caps.get(self.name) def __set__(self, obj, value): - if all(x in ("implicit", "pageLoad", "script") for x in value.keys()): + if all(x in ("implicit", "pageLoad", "script") for x in value.keys()): obj.set_capability(self.name, value) else: - raise ValueError("Timeout keys can only be one of the following: implicit, pageLoad, script") + raise ValueError("Timeout keys can only be one of the following: implicit, pageLoad, script") class _ProxyDescriptor: - """:Returns: Proxy if set, otherwise None.""" + """:Returns: Proxy if set, otherwise None.""" def __init__(self, name): self.name = name @@ -182,307 +341,287 @@

Source code for selenium.webdriver.common.options

def __set__(self, obj, value): if not isinstance(value, Proxy): - raise InvalidArgumentException("Only Proxy objects can be passed in.") + raise InvalidArgumentException("Only Proxy objects can be passed in.") obj._proxy = value obj._caps[self.name] = value.to_capabilities() -
[docs]class BaseOptions(metaclass=ABCMeta): - """Base class for individual browser options.""" +
+[docs] +class BaseOptions(metaclass=ABCMeta): + """Base class for individual browser options.""" - browser_version = _BaseOptionsDescriptor("browserVersion") - """Gets and Sets the version of the browser. + browser_version = _BaseOptionsDescriptor("browserVersion") + """Gets and Sets the version of the browser. - Usage - ----- + Usage: + ------ - Get - `self.browser_version` - Set - `self.browser_version` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `str` - Returns - ------- + Returns: + -------- - Get - `str` - Set - `None` - """ + """ - platform_name = _BaseOptionsDescriptor("platformName") - """Gets and Sets name of the platform. + platform_name = _BaseOptionsDescriptor("platformName") + """Gets and Sets name of the platform. - Usage - ----- + Usage: + ------ - Get - `self.platform_name` - Set - `self.platform_name` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `str` - Returns - ------- + Returns: + -------- - Get - `str` - Set - `None` - """ + """ - accept_insecure_certs = _BaseOptionsDescriptor("acceptInsecureCerts") - """Gets and Set whether the session accepts insecure certificates. + accept_insecure_certs = _BaseOptionsDescriptor("acceptInsecureCerts") + """Gets and Set whether the session accepts insecure certificates. - Usage - ----- + Usage: + ------ - Get - `self.accept_insecure_certs` - Set - `self.accept_insecure_certs` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - Returns - ------- + Returns: + -------- - Get - `bool` - Set - `None` - """ + """ - strict_file_interactability = _BaseOptionsDescriptor("strictFileInteractability") - """Gets and Sets whether session is about file interactability. + strict_file_interactability = _BaseOptionsDescriptor("strictFileInteractability") + """Gets and Sets whether session is about file interactability. - Usage - ----- + Usage: + ------ - Get - `self.strict_file_interactability` - Set - `self.strict_file_interactability` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - Returns - ------- + Returns: + -------- - Get - `bool` - Set - `None` - """ + """ - set_window_rect = _BaseOptionsDescriptor("setWindowRect") - """Gets and Sets window size and position. + set_window_rect = _BaseOptionsDescriptor("setWindowRect") + """Gets and Sets window size and position. - Usage - ----- + Usage: + ------ - Get - `self.set_window_rect` - Set - `self.set_window_rect` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - Returns - ------- + Returns: + -------- - Get - `bool` - Set - `None` - """ + """ - enable_bidi = _BaseOptionsDescriptor("enableBidi") - """Gets and Set whether the session has WebDriverBiDi enabled. + enable_bidi = _BaseOptionsDescriptor("enableBidi") + """Gets and Set whether the session has WebDriverBiDi enabled. - Usage - ----- + Usage: + ------ - Get - `self.enable_bidi` - Set - `self.enable_bidi` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - Returns - ------- + Returns: + -------- - Get - `bool` - Set - `None` - """ + """ - web_socket_url = _BaseOptionsDescriptor("webSocketUrl") - """Gets and Set whether the session accepts insecure certificates. + page_load_strategy = _PageLoadStrategyDescriptor("pageLoadStrategy") + """:Gets and Sets page load strategy, the default is "normal". - Usage - ----- - - Get - - `self.web_socket_url` - - Set - - `self.web_socket_url` = `value` - - Parameters - ---------- - `value`: `str` - - Returns - ------- - - Get - - `str` or `None` - - Set - - `None` - """ - - page_load_strategy = _PageLoadStrategyDescriptor("pageLoadStrategy") - """:Gets and Sets page load strategy, the default is "normal". - - Usage - ----- + Usage: + ------ - Get - `self.page_load_strategy` - Set - `self.page_load_strategy` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `str` - Returns - ------- + Returns: + -------- - Get - `str` - Set - `None` - """ + """ - unhandled_prompt_behavior = _UnHandledPromptBehaviorDescriptor("unhandledPromptBehavior") - """:Gets and Sets unhandled prompt behavior, the default is "dismiss and - notify". + unhandled_prompt_behavior = _UnHandledPromptBehaviorDescriptor("unhandledPromptBehavior") + """:Gets and Sets unhandled prompt behavior, the default is "dismiss and + notify". - Usage - ----- + Usage: + ------ - Get - `self.unhandled_prompt_behavior` - Set - `self.unhandled_prompt_behavior` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `str` - Returns - ------- + Returns: + -------- - Get - `str` - Set - `None` - """ + """ - timeouts = _TimeoutsDescriptor("timeouts") - """:Gets and Sets implicit timeout, pageLoad timeout and script timeout if + timeouts = _TimeoutsDescriptor("timeouts") + """:Gets and Sets implicit timeout, pageLoad timeout and script timeout if set (in milliseconds) - Usage - ----- + Usage: + ------ - Get - `self.timeouts` - Set - `self.timeouts` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `dict` - Returns - ------- + Returns: + -------- - Get - `dict` - Set - `None` - """ + """ - proxy = _ProxyDescriptor("proxy") - """Sets and Gets Proxy. + proxy = _ProxyDescriptor("proxy") + """Sets and Gets Proxy. - Usage - ----- + Usage: + ------ - Get - `self.proxy` - Set - `self.proxy` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `Proxy` - Returns - ------- + Returns: + -------- - Get - `Proxy` - Set - `None` - """ + """ - enable_downloads = _BaseOptionsDescriptor("se:downloadsEnabled") - """Gets and Sets whether session can download files. + enable_downloads = _BaseOptionsDescriptor("se:downloadsEnabled") + """Gets and Sets whether session can download files. - Usage - ----- + Usage: + ------ - Get - `self.enable_downloads` - Set - `self.enable_downloads` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - Returns - ------- + Returns: + -------- - Get - `bool` - Set - `None` - """ + """ - web_socket_url = _BaseOptionsDescriptor("webSocketUrl") - """Gets and Sets WebSocket URL. + web_socket_url = _BaseOptionsDescriptor("webSocketUrl") + """Gets and Sets WebSocket URL. - Usage - ----- + Usage: + ------ - Get - `self.web_socket_url` - Set - `self.web_socket_url` = `value` - Parameters - ---------- - `value`: `bool` + Parameters: + ----------- + `value`: `str` - Returns - ------- + Returns: + -------- - Get - `bool` - Set - `None` - """ + """ def __init__(self) -> None: super().__init__() self._caps = self.default_capabilities self._proxy = None - self.set_capability("pageLoadStrategy", PageLoadStrategy.normal) + self.set_capability("pageLoadStrategy", PageLoadStrategy.normal) self.mobile_options = None self._ignore_local_proxy = False @@ -490,48 +629,63 @@

Source code for selenium.webdriver.common.options

def capabilities(self): return self._caps -
[docs] def set_capability(self, name, value) -> None: - """Sets a capability.""" +
+[docs] + def set_capability(self, name, value) -> None: + """Sets a capability.""" self._caps[name] = value
-
[docs] def enable_mobile( + +
+[docs] + def enable_mobile( self, android_package: Optional[str] = None, android_activity: Optional[str] = None, device_serial: Optional[str] = None, ) -> None: - """Enables mobile browser use for browsers that support it. + """Enables mobile browser use for browsers that support it. :Args: android_activity: The name of the android package to start - """ + """ if not android_package: - raise AttributeError("android_package must be passed in") - self.mobile_options = {"androidPackage": android_package} + raise AttributeError("android_package must be passed in") + self.mobile_options = {"androidPackage": android_package} if android_activity: - self.mobile_options["androidActivity"] = android_activity + self.mobile_options["androidActivity"] = android_activity if device_serial: - self.mobile_options["androidDeviceSerial"] = device_serial
+ self.mobile_options["androidDeviceSerial"] = device_serial
-
[docs] @abstractmethod + +
+[docs] + @abstractmethod def to_capabilities(self): - """Convert options into capabilities dictionary."""
+ """Convert options into capabilities dictionary."""
+ @property @abstractmethod def default_capabilities(self): - """Return minimal capabilities necessary as a dictionary.""" + """Return minimal capabilities necessary as a dictionary.""" + +
+[docs] + def ignore_local_proxy_environment_variables(self) -> None: + """By calling this you will ignore HTTP_PROXY and HTTPS_PROXY from + being picked up and used.""" + self._ignore_local_proxy = True
+
-
[docs] def ignore_local_proxy_environment_variables(self) -> None: - """By calling this you will ignore HTTP_PROXY and HTTPS_PROXY from - being picked up and used.""" - self._ignore_local_proxy = True
-
[docs]class ArgOptions(BaseOptions): - BINARY_LOCATION_ERROR = "Binary Location Must be a String" +
+[docs] +class ArgOptions(BaseOptions): + BINARY_LOCATION_ERROR = "Binary Location Must be a String" # FedCM capability key - FEDCM_CAPABILITY = "fedcm:accounts" + FEDCM_CAPABILITY = "fedcm:accounts" def __init__(self) -> None: super().__init__() @@ -539,78 +693,78 @@

Source code for selenium.webdriver.common.options

@property def arguments(self): - """:Returns: A list of arguments needed for the browser.""" + """:Returns: A list of arguments needed for the browser.""" return self._arguments -
[docs] def add_argument(self, argument) -> None: - """Adds an argument to the list. +
+[docs] + def add_argument(self, argument) -> None: + """Adds an argument to the list. :Args: - Sets the arguments - """ + """ if argument: self._arguments.append(argument) else: - raise ValueError("argument can not be null")
+ raise ValueError("argument can not be null")
+ -
[docs] def ignore_local_proxy_environment_variables(self) -> None: - """By calling this you will ignore HTTP_PROXY and HTTPS_PROXY from - being picked up and used.""" +
+[docs] + def ignore_local_proxy_environment_variables(self) -> None: + """By calling this you will ignore HTTP_PROXY and HTTPS_PROXY from + being picked up and used.""" warnings.warn( - "using ignore_local_proxy_environment_variables in Options has been deprecated, " - "instead, create a Proxy instance with ProxyType.DIRECT to ignore proxy settings, " - "pass the proxy instance into a ClientConfig constructor, " - "pass the client config instance into the Webdriver constructor", + "using ignore_local_proxy_environment_variables in Options has been deprecated, " + "instead, create a Proxy instance with ProxyType.DIRECT to ignore proxy settings, " + "pass the proxy instance into a ClientConfig constructor, " + "pass the client config instance into the Webdriver constructor", DeprecationWarning, stacklevel=2, ) super().ignore_local_proxy_environment_variables()
-
[docs] def to_capabilities(self): + +
+[docs] + def to_capabilities(self): return self._caps
+ @property def default_capabilities(self): return {}
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/print_page_options.html b/docs/api/py/_modules/selenium/webdriver/common/print_page_options.html index 272f5f4e3fa0d..6f7f2bf9fb54b 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/print_page_options.html +++ b/docs/api/py/_modules/selenium/webdriver/common/print_page_options.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.common.print_page_options — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.print_page_options — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.print_page_options

+  

Source code for selenium.webdriver.common.print_page_options

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -63,7 +219,7 @@ 

Source code for selenium.webdriver.common.print_page_options

from typing import Literal from typing import TypedDict - Orientation = Literal["portrait", "landscape"] + Orientation = Literal["portrait", "landscape"] class _MarginOpts(TypedDict, total=False): left: float @@ -93,7 +249,7 @@

Source code for selenium.webdriver.common.print_page_options

class _PageSettingsDescriptor: - """Descriptor which validates `height` and 'width' of page.""" + """Descriptor which validates `height` and 'width' of page.""" def __init__(self, name): self.name = name @@ -102,19 +258,19 @@

Source code for selenium.webdriver.common.print_page_options

return obj._page.get(self.name, None) def __set__(self, obj, value) -> None: - getattr(obj, "_validate_num_property")(self.name, value) + getattr(obj, "_validate_num_property")(self.name, value) obj._page[self.name] = value - obj._print_options["page"] = obj._page + obj._print_options["page"] = obj._page class _MarginSettingsDescriptor: - """Descriptor which validates below attributes. + """Descriptor which validates below attributes. - top - bottom - left - right - """ + """ def __init__(self, name): self.name = name @@ -123,13 +279,13 @@

Source code for selenium.webdriver.common.print_page_options

return obj._margin.get(self.name, None) def __set__(self, obj, value) -> None: - getattr(obj, "_validate_num_property")(f"Margin {self.name}", value) + getattr(obj, "_validate_num_property")(f"Margin {self.name}", value) obj._margin[self.name] = value - obj._print_options["margin"] = obj._margin + obj._print_options["margin"] = obj._margin class _ScaleDescriptor: - """Scale descriptor which validates scale.""" + """Scale descriptor which validates scale.""" def __init__(self, name): self.name = name @@ -138,16 +294,16 @@

Source code for selenium.webdriver.common.print_page_options

return obj._print_options.get(self.name) def __set__(self, obj, value) -> None: - getattr(obj, "_validate_num_property")(self.name, value) + getattr(obj, "_validate_num_property")(self.name, value) if value < 0.1 or value > 2: - raise ValueError("Value of scale should be between 0.1 and 2") + raise ValueError("Value of scale should be between 0.1 and 2") obj._print_options[self.name] = value class _PageOrientationDescriptor: - """PageOrientation descriptor which validates orientation of page.""" + """PageOrientation descriptor which validates orientation of page.""" - ORIENTATION_VALUES = ["portrait", "landscape"] + ORIENTATION_VALUES = ["portrait", "landscape"] def __init__(self, name): self.name = name @@ -157,12 +313,12 @@

Source code for selenium.webdriver.common.print_page_options

def __set__(self, obj, value) -> None: if value not in self.ORIENTATION_VALUES: - raise ValueError(f"Orientation value must be one of {self.ORIENTATION_VALUES}") + raise ValueError(f"Orientation value must be one of {self.ORIENTATION_VALUES}") obj._print_options[self.name] = value class _ValidateTypeDescriptor: - """Base Class Descriptor which validates type of any subclass attribute.""" + """Base Class Descriptor which validates type of any subclass attribute.""" def __init__(self, name, expected_type: Type): self.name = name @@ -173,34 +329,36 @@

Source code for selenium.webdriver.common.print_page_options

def __set__(self, obj, value) -> None: if not isinstance(value, self.expected_type): - raise ValueError(f"{self.name} should be of type {self.expected_type.__name__}") + raise ValueError(f"{self.name} should be of type {self.expected_type.__name__}") obj._print_options[self.name] = value class _ValidateBackGround(_ValidateTypeDescriptor): - """Expected type of background attribute.""" + """Expected type of background attribute.""" def __init__(self, name): super().__init__(name, bool) class _ValidateShrinkToFit(_ValidateTypeDescriptor): - """Expected type of shrink to fit attribute.""" + """Expected type of shrink to fit attribute.""" def __init__(self, name): super().__init__(name, bool) class _ValidatePageRanges(_ValidateTypeDescriptor): - """Expected type of page ranges attribute.""" + """Expected type of page ranges attribute.""" def __init__(self, name): super().__init__(name, list) -
[docs]class PrintOptions: - page_height = _PageSettingsDescriptor("height") - """Gets and Sets page_height: +
+[docs] +class PrintOptions: + page_height = _PageSettingsDescriptor("height") + """Gets and Sets page_height: Usage ----- @@ -209,292 +367,316 @@

Source code for selenium.webdriver.common.print_page_options

- Set - `self.page_height` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `float` - Returns - ------- + Returns: + -------- - Get - `Optional[float]` - Set - `None` - """ + """ - page_width = _PageSettingsDescriptor("width") - """Gets and Sets page_width: + page_width = _PageSettingsDescriptor("width") + """Gets and Sets page_width: - Usage - ----- + Usage: + ------ - Get - `self.page_width` - Set - `self.page_width` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `float` - Returns - ------- + Returns: + -------- - Get - `Optional[float]` - Set - `None` - """ + """ - margin_top = _MarginSettingsDescriptor("top") - """Gets and Sets margin_top: + margin_top = _MarginSettingsDescriptor("top") + """Gets and Sets margin_top: - Usage - ----- + Usage: + ------ - Get - `self.margin_top` - Set - `self.margin_top` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `float` - Returns - ------- + Returns: + -------- - Get - `Optional[float]` - Set - `None` - """ + """ - margin_bottom = _MarginSettingsDescriptor("bottom") - """Gets and Sets margin_bottom: + margin_bottom = _MarginSettingsDescriptor("bottom") + """Gets and Sets margin_bottom: - Usage - ----- + Usage: + ------ - Get - `self.margin_bottom` - Set - `self.margin_bottom` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `float` - Returns - ------- + Returns: + -------- - Get - `Optional[float]` - Set - `None` - """ + """ - margin_left = _MarginSettingsDescriptor("left") - """Gets and Sets margin_left: + margin_left = _MarginSettingsDescriptor("left") + """Gets and Sets margin_left: - Usage - ----- + Usage: + ------ - Get - `self.margin_left` - Set - `self.margin_left` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `float` - Returns - ------- + Returns: + -------- - Get - `Optional[float]` - Set - `None` - """ + """ - margin_right = _MarginSettingsDescriptor("right") - """Gets and Sets margin_right: + margin_right = _MarginSettingsDescriptor("right") + """Gets and Sets margin_right: - Usage - ----- + Usage: + ------ - Get - `self.margin_right` - Set - `self.margin_right` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `float` - Returns - ------- + Returns: + -------- - Get - `Optional[float]` - Set - `None` - """ + """ - scale = _ScaleDescriptor("scale") - """Gets and Sets scale: + scale = _ScaleDescriptor("scale") + """Gets and Sets scale: - Usage - ----- + Usage: + ------ - Get - `self.scale` - Set - `self.scale` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `float` - Returns - ------- + Returns: + -------- - Get - `Optional[float]` - Set - `None` - """ + """ - orientation = _PageOrientationDescriptor("orientation") - """Gets and Sets orientation: + orientation = _PageOrientationDescriptor("orientation") + """Gets and Sets orientation: - Usage - ----- + Usage: + ------ - Get - `self.orientation` - Set - `self.orientation` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `Orientation` - Returns - ------- + Returns: + -------- - Get - `Optional[Orientation]` - Set - `None` - """ + """ - background = _ValidateBackGround("background") - """Gets and Sets background: + background = _ValidateBackGround("background") + """Gets and Sets background: - Usage - ----- + Usage: + ------ - Get - `self.background` - Set - `self.background` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - Returns - ------- + Returns: + -------- - Get - `Optional[bool]` - Set - `None` - """ + """ - shrink_to_fit = _ValidateShrinkToFit("shrinkToFit") - """Gets and Sets shrink_to_fit: + shrink_to_fit = _ValidateShrinkToFit("shrinkToFit") + """Gets and Sets shrink_to_fit: - Usage - ----- + Usage: + ------ - Get - `self.shrink_to_fit` - Set - `self.shrink_to_fit` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - Returns - ------- + Returns: + -------- - Get - `Optional[bool]` - Set - `None` - """ + """ - page_ranges = _ValidatePageRanges("pageRanges") - """Gets and Sets page_ranges: + page_ranges = _ValidatePageRanges("pageRanges") + """Gets and Sets page_ranges: - Usage - ----- + Usage: + ------ - Get - `self.page_ranges` - Set - `self.page_ranges` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: ` List[str]` - Returns - ------- + Returns: + -------- - Get - `Optional[List[str]]` - Set - `None` - """ + """ + # Reference for predefined page size constants: https://www.agooddaytoprint.com/page/paper-size-chart-faq + A4 = {"height": 29.7, "width": 21.0} # size in cm + LEGAL = {"height": 35.56, "width": 21.59} # size in cm + LETTER = {"height": 27.94, "width": 21.59} # size in cm + TABLOID = {"height": 43.18, "width": 27.94} # size in cm def __init__(self) -> None: self._print_options: _PrintOpts = {} - self._page: _PageOpts = {} + self._page: _PageOpts = { + "height": PrintOptions.A4["height"], + "width": PrintOptions.A4["width"], + } # Default page size set to A4 self._margin: _MarginOpts = {} -
[docs] def to_dict(self) -> _PrintOpts: - """:Returns: A hash of print options configured.""" +
+[docs] + def to_dict(self) -> _PrintOpts: + """:Returns: A hash of print options configured.""" return self._print_options
+ +
+[docs] + def set_page_size(self, page_size: dict) -> None: + """Sets the page size to predefined or custom dimensions. + + Parameters: + ----------- + page_size: dict + A dictionary containing `height` and `width` as keys with respective values. + + Example: + -------- + self.set_page_size(PageSize.A4) # A4 predefined size + self.set_page_size({"height": 15.0, "width": 20.0}) # Custom size in cm + """ + self._validate_num_property("height", page_size["height"]) + self._validate_num_property("width", page_size["width"]) + self._page["height"] = page_size["height"] + self._page["width"] = page_size["width"] + self._print_options["page"] = self._page
+ + def _validate_num_property(self, property_name: str, value: float) -> None: - """Helper function to validate some of the properties.""" + """Helper function to validate some of the properties.""" if not isinstance(value, (int, float)): - raise ValueError(f"{property_name} should be an integer or a float") + raise ValueError(f"{property_name} should be an integer or a float") if value < 0: - raise ValueError(f"{property_name} cannot be less than 0")
+ raise ValueError(f"{property_name} cannot be less than 0")
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/proxy.html b/docs/api/py/_modules/selenium/webdriver/common/proxy.html index cda9cf38e230b..2734b5943a9cd 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/proxy.html +++ b/docs/api/py/_modules/selenium/webdriver/common/proxy.html @@ -1,93 +1,261 @@ - + - selenium.webdriver.common.proxy — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.proxy — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.proxy

+  

Source code for selenium.webdriver.common.proxy

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-"""The Proxy implementation."""
+"""The Proxy implementation."""
 
 
-
[docs]class ProxyTypeFactory: - """Factory for proxy types.""" +
+[docs] +class ProxyTypeFactory: + """Factory for proxy types.""" -
[docs] @staticmethod +
+[docs] + @staticmethod def make(ff_value, string): - return {"ff_value": ff_value, "string": string}
+ return {"ff_value": ff_value, "string": string}
+
+ -
[docs]class ProxyType: - """Set of possible types of proxy. +
+[docs] +class ProxyType: + """Set of possible types of proxy. - Each proxy type has 2 properties: 'ff_value' is value of Firefox - profile preference, 'string' is id of proxy type. - """ + Each proxy type has 2 properties: 'ff_value' is value of Firefox + profile preference, 'string' is id of proxy type. + """ - DIRECT = ProxyTypeFactory.make(0, "DIRECT") # Direct connection, no proxy (default on Windows). - MANUAL = ProxyTypeFactory.make(1, "MANUAL") # Manual proxy settings (e.g., for httpProxy). - PAC = ProxyTypeFactory.make(2, "PAC") # Proxy autoconfiguration from URL. - RESERVED_1 = ProxyTypeFactory.make(3, "RESERVED1") # Never used. - AUTODETECT = ProxyTypeFactory.make(4, "AUTODETECT") # Proxy autodetection (presumably with WPAD). - SYSTEM = ProxyTypeFactory.make(5, "SYSTEM") # Use system settings (default on Linux). - UNSPECIFIED = ProxyTypeFactory.make(6, "UNSPECIFIED") # Not initialized (for internal use). + DIRECT = ProxyTypeFactory.make(0, "DIRECT") # Direct connection, no proxy (default on Windows). + MANUAL = ProxyTypeFactory.make(1, "MANUAL") # Manual proxy settings (e.g., for httpProxy). + PAC = ProxyTypeFactory.make(2, "PAC") # Proxy autoconfiguration from URL. + RESERVED_1 = ProxyTypeFactory.make(3, "RESERVED1") # Never used. + AUTODETECT = ProxyTypeFactory.make(4, "AUTODETECT") # Proxy autodetection (presumably with WPAD). + SYSTEM = ProxyTypeFactory.make(5, "SYSTEM") # Use system settings (default on Linux). + UNSPECIFIED = ProxyTypeFactory.make(6, "UNSPECIFIED") # Not initialized (for internal use). -
[docs] @classmethod +
+[docs] + @classmethod def load(cls, value): - if isinstance(value, dict) and "string" in value: - value = value["string"] + if isinstance(value, dict) and "string" in value: + value = value["string"] value = str(value).upper() for attr in dir(cls): attr_value = getattr(cls, attr) - if isinstance(attr_value, dict) and "string" in attr_value and attr_value["string"] == value: + if isinstance(attr_value, dict) and "string" in attr_value and attr_value["string"] == value: return attr_value - raise Exception(f"No proxy type is found for {value}")
+ raise Exception(f"No proxy type is found for {value}")
+
+ class _ProxyTypeDescriptor: @@ -99,288 +267,284 @@

Source code for selenium.webdriver.common.proxy

< return getattr(obj, self.name) def __set__(self, obj, value): - if self.name == "autodetect" and not isinstance(value, bool): - raise ValueError("Autodetect proxy value needs to be a boolean") - getattr(obj, "_verify_proxy_type_compatibility")(self.p_type) - setattr(obj, "proxyType", self.p_type) + if self.name == "autodetect" and not isinstance(value, bool): + raise ValueError("Autodetect proxy value needs to be a boolean") + getattr(obj, "_verify_proxy_type_compatibility")(self.p_type) + setattr(obj, "proxyType", self.p_type) setattr(obj, self.name, value) -
[docs]class Proxy: - """Proxy contains information about proxy type and necessary proxy - settings.""" +
+[docs] +class Proxy: + """Proxy contains information about proxy type and necessary proxy + settings.""" proxyType = ProxyType.UNSPECIFIED autodetect = False - ftpProxy = "" - httpProxy = "" - noProxy = "" - proxyAutoconfigUrl = "" - sslProxy = "" - socksProxy = "" - socksUsername = "" - socksPassword = "" + ftpProxy = "" + httpProxy = "" + noProxy = "" + proxyAutoconfigUrl = "" + sslProxy = "" + socksProxy = "" + socksUsername = "" + socksPassword = "" socksVersion = None # create descriptor type objects - auto_detect = _ProxyTypeDescriptor("autodetect", ProxyType.AUTODETECT) - """Gets and Sets `auto_detect` + auto_detect = _ProxyTypeDescriptor("autodetect", ProxyType.AUTODETECT) + """Gets and Sets `auto_detect` - Usage - ----- + Usage: + ------ - Get - `self.auto_detect` - Set - `self.auto_detect` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `str` - """ + """ - ftp_proxy = _ProxyTypeDescriptor("ftpProxy", ProxyType.MANUAL) - """Gets and Sets `ftp_proxy` + ftp_proxy = _ProxyTypeDescriptor("ftpProxy", ProxyType.MANUAL) + """Gets and Sets `ftp_proxy` - Usage - ----- + Usage: + ------ - Get - `self.ftp_proxy` - Set - `self.ftp_proxy` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `str` - """ + """ - http_proxy = _ProxyTypeDescriptor("httpProxy", ProxyType.MANUAL) - """Gets and Sets `http_proxy` + http_proxy = _ProxyTypeDescriptor("httpProxy", ProxyType.MANUAL) + """Gets and Sets `http_proxy` - Usage - ----- + Usage: + ------ - Get - `self.http_proxy` - Set - `self.http_proxy` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `str` - """ + """ - no_proxy = _ProxyTypeDescriptor("noProxy", ProxyType.MANUAL) - """Gets and Sets `no_proxy` + no_proxy = _ProxyTypeDescriptor("noProxy", ProxyType.MANUAL) + """Gets and Sets `no_proxy` - Usage - ----- + Usage: + ------ - Get - `self.no_proxy` - Set - `self.no_proxy` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `str` - """ + """ - proxy_autoconfig_url = _ProxyTypeDescriptor("proxyAutoconfigUrl", ProxyType.PAC) - """Gets and Sets `proxy_autoconfig_url` + proxy_autoconfig_url = _ProxyTypeDescriptor("proxyAutoconfigUrl", ProxyType.PAC) + """Gets and Sets `proxy_autoconfig_url` - Usage - ----- + Usage: + ------ - Get - `self.proxy_autoconfig_url` - Set - `self.proxy_autoconfig_url` = `value` - Parameter - --------- + Parameters: + ----------- `value`: `str` - """ + """ - ssl_proxy = _ProxyTypeDescriptor("sslProxy", ProxyType.MANUAL) - """Gets and Sets `ssl_proxy` + ssl_proxy = _ProxyTypeDescriptor("sslProxy", ProxyType.MANUAL) + """Gets and Sets `ssl_proxy` - Usage - ----- + Usage: + ------ - Get - `self.ssl_proxy` - Set - `self.ssl_proxy` = `value` - Parameter - --------- + Parameters: + ----------- `value`: `str` - """ + """ - socks_proxy = _ProxyTypeDescriptor("socksProxy", ProxyType.MANUAL) - """Gets and Sets `socks_proxy` + socks_proxy = _ProxyTypeDescriptor("socksProxy", ProxyType.MANUAL) + """Gets and Sets `socks_proxy` - Usage - ----- + Usage: + ------ - Get - `self.sock_proxy` - Set - `self.socks_proxy` = `value` - Parameter - --------- + Parameters: + ----------- `value`: `str` - """ + """ - socks_username = _ProxyTypeDescriptor("socksUsername", ProxyType.MANUAL) - """Gets and Sets `socks_password` + socks_username = _ProxyTypeDescriptor("socksUsername", ProxyType.MANUAL) + """Gets and Sets `socks_password` - Usage - ----- + Usage: + ------ - Get - `self.socks_password` - Set - `self.socks_password` = `value` - Parameter - --------- + Parameters: + ----------- `value`: `str` - """ + """ - socks_password = _ProxyTypeDescriptor("socksPassword", ProxyType.MANUAL) - """Gets and Sets `socks_password` + socks_password = _ProxyTypeDescriptor("socksPassword", ProxyType.MANUAL) + """Gets and Sets `socks_password` - Usage - ----- + Usage: + ------ - Get - `self.socks_password` - Set - `self.socks_password` = `value` - Parameter - --------- + Parameters: + ----------- `value`: `str` - """ + """ - socks_version = _ProxyTypeDescriptor("socksVersion", ProxyType.MANUAL) - """Gets and Sets `socks_version` + socks_version = _ProxyTypeDescriptor("socksVersion", ProxyType.MANUAL) + """Gets and Sets `socks_version` - Usage - ----- + Usage: + ------ - Get - `self.socks_version` - Set - `self.socks_version` = `value` - Parameter - --------- + Parameters: + ----------- `value`: `str` - """ + """ def __init__(self, raw=None): - """Creates a new Proxy. + """Creates a new Proxy. :Args: - raw: raw proxy data. If None, default class values are used. - """ + """ if raw: - if "proxyType" in raw and raw["proxyType"]: - self.proxy_type = ProxyType.load(raw["proxyType"]) - if "ftpProxy" in raw and raw["ftpProxy"]: - self.ftp_proxy = raw["ftpProxy"] - if "httpProxy" in raw and raw["httpProxy"]: - self.http_proxy = raw["httpProxy"] - if "noProxy" in raw and raw["noProxy"]: - self.no_proxy = raw["noProxy"] - if "proxyAutoconfigUrl" in raw and raw["proxyAutoconfigUrl"]: - self.proxy_autoconfig_url = raw["proxyAutoconfigUrl"] - if "sslProxy" in raw and raw["sslProxy"]: - self.sslProxy = raw["sslProxy"] - if "autodetect" in raw and raw["autodetect"]: - self.auto_detect = raw["autodetect"] - if "socksProxy" in raw and raw["socksProxy"]: - self.socks_proxy = raw["socksProxy"] - if "socksUsername" in raw and raw["socksUsername"]: - self.socks_username = raw["socksUsername"] - if "socksPassword" in raw and raw["socksPassword"]: - self.socks_password = raw["socksPassword"] - if "socksVersion" in raw and raw["socksVersion"]: - self.socks_version = raw["socksVersion"] + if "proxyType" in raw and raw["proxyType"]: + self.proxy_type = ProxyType.load(raw["proxyType"]) + if "ftpProxy" in raw and raw["ftpProxy"]: + self.ftp_proxy = raw["ftpProxy"] + if "httpProxy" in raw and raw["httpProxy"]: + self.http_proxy = raw["httpProxy"] + if "noProxy" in raw and raw["noProxy"]: + self.no_proxy = raw["noProxy"] + if "proxyAutoconfigUrl" in raw and raw["proxyAutoconfigUrl"]: + self.proxy_autoconfig_url = raw["proxyAutoconfigUrl"] + if "sslProxy" in raw and raw["sslProxy"]: + self.sslProxy = raw["sslProxy"] + if "autodetect" in raw and raw["autodetect"]: + self.auto_detect = raw["autodetect"] + if "socksProxy" in raw and raw["socksProxy"]: + self.socks_proxy = raw["socksProxy"] + if "socksUsername" in raw and raw["socksUsername"]: + self.socks_username = raw["socksUsername"] + if "socksPassword" in raw and raw["socksPassword"]: + self.socks_password = raw["socksPassword"] + if "socksVersion" in raw and raw["socksVersion"]: + self.socks_version = raw["socksVersion"] @property def proxy_type(self): - """Returns proxy type as `ProxyType`.""" + """Returns proxy type as `ProxyType`.""" return self.proxyType @proxy_type.setter def proxy_type(self, value) -> None: - """Sets proxy type. + """Sets proxy type. :Args: - value: The proxy type. - """ + """ self._verify_proxy_type_compatibility(value) self.proxyType = value def _verify_proxy_type_compatibility(self, compatible_proxy): if self.proxyType not in (ProxyType.UNSPECIFIED, compatible_proxy): raise ValueError( - f"Specified proxy type ({compatible_proxy}) not compatible with current setting ({self.proxyType})" + f"Specified proxy type ({compatible_proxy}) not compatible with current setting ({self.proxyType})" ) -
[docs] def to_capabilities(self): - proxy_caps = {"proxyType": self.proxyType["string"].lower()} +
+[docs] + def to_capabilities(self): + proxy_caps = {"proxyType": self.proxyType["string"].lower()} proxies = [ - "autodetect", - "ftpProxy", - "httpProxy", - "proxyAutoconfigUrl", - "sslProxy", - "noProxy", - "socksProxy", - "socksUsername", - "socksPassword", - "socksVersion", + "autodetect", + "ftpProxy", + "httpProxy", + "proxyAutoconfigUrl", + "sslProxy", + "noProxy", + "socksProxy", + "socksUsername", + "socksPassword", + "socksVersion", ] for proxy in proxies: attr_value = getattr(self, proxy) if attr_value: proxy_caps[proxy] = attr_value - return proxy_caps
+ return proxy_caps
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/selenium_manager.html b/docs/api/py/_modules/selenium/webdriver/common/selenium_manager.html index ffa57916d4670..baa26d8123928 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/selenium_manager.html +++ b/docs/api/py/_modules/selenium/webdriver/common/selenium_manager.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.common.selenium_manager — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.selenium_manager — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.selenium_manager

+  

Source code for selenium.webdriver.common.selenium_manager

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -68,152 +224,148 @@ 

Source code for selenium.webdriver.common.selenium_manager

logger = logging.getLogger(__name__) -
[docs]class SeleniumManager: - """Wrapper for getting information from the Selenium Manager binaries. +
+[docs] +class SeleniumManager: + """Wrapper for getting information from the Selenium Manager binaries. This implementation is still in beta, and may change. - """ + """ -
[docs] def binary_paths(self, args: List) -> dict: - """Determines the locations of the requested assets. +
+[docs] + def binary_paths(self, args: List) -> dict: + """Determines the locations of the requested assets. :Args: - args: the commands to send to the selenium manager binary. :Returns: dictionary of assets and their path - """ + """ args = [str(self._get_binary())] + args if logger.getEffectiveLevel() == logging.DEBUG: - args.append("--debug") - args.append("--language-binding") - args.append("python") - args.append("--output") - args.append("json") + args.append("--debug") + args.append("--language-binding") + args.append("python") + args.append("--output") + args.append("json") return self._run(args)
+ @staticmethod def _get_binary() -> Path: - """Determines the path of the correct Selenium Manager binary. + """Determines the path of the correct Selenium Manager binary. :Returns: The Selenium Manager executable location :Raises: WebDriverException if the platform is unsupported - """ + """ - compiled_path = Path(__file__).parent.joinpath("selenium-manager") - exe = sysconfig.get_config_var("EXE") + compiled_path = Path(__file__).parent.joinpath("selenium-manager") + exe = sysconfig.get_config_var("EXE") if exe is not None: compiled_path = compiled_path.with_suffix(exe) path: Optional[Path] = None - if (env_path := os.getenv("SE_MANAGER_PATH")) is not None: - logger.debug("Selenium Manager set by env SE_MANAGER_PATH to: %s", env_path) + if (env_path := os.getenv("SE_MANAGER_PATH")) is not None: + logger.debug("Selenium Manager set by env SE_MANAGER_PATH to: %s", env_path) path = Path(env_path) elif compiled_path.exists(): path = compiled_path else: allowed = { - ("darwin", "any"): "macos/selenium-manager", - ("win32", "any"): "windows/selenium-manager.exe", - ("cygwin", "any"): "windows/selenium-manager.exe", - ("linux", "x86_64"): "linux/selenium-manager", - ("freebsd", "x86_64"): "linux/selenium-manager", - ("openbsd", "x86_64"): "linux/selenium-manager", + ("darwin", "any"): "macos/selenium-manager", + ("win32", "any"): "windows/selenium-manager.exe", + ("cygwin", "any"): "windows/selenium-manager.exe", + ("linux", "x86_64"): "linux/selenium-manager", + ("freebsd", "x86_64"): "linux/selenium-manager", + ("openbsd", "x86_64"): "linux/selenium-manager", } - arch = platform.machine() if sys.platform in ("linux", "freebsd", "openbsd") else "any" - if sys.platform in ["freebsd", "openbsd"]: - logger.warning("Selenium Manager binary may not be compatible with %s; verify settings", sys.platform) + arch = platform.machine() if sys.platform in ("linux", "freebsd", "openbsd") else "any" + if sys.platform in ["freebsd", "openbsd"]: + logger.warning("Selenium Manager binary may not be compatible with %s; verify settings", sys.platform) location = allowed.get((sys.platform, arch)) if location is None: - raise WebDriverException(f"Unsupported platform/architecture combination: {sys.platform}/{arch}") + raise WebDriverException(f"Unsupported platform/architecture combination: {sys.platform}/{arch}") path = Path(__file__).parent.joinpath(location) if path is None or not path.is_file(): - raise WebDriverException(f"Unable to obtain working Selenium Manager binary; {path}") + raise WebDriverException(f"Unable to obtain working Selenium Manager binary; {path}") - logger.debug("Selenium Manager binary found at: %s", path) + logger.debug("Selenium Manager binary found at: %s", path) return path @staticmethod def _run(args: List[str]) -> dict: - """Executes the Selenium Manager Binary. + """Executes the Selenium Manager Binary. :Args: - args: the components of the command being executed. :Returns: The log string containing the driver location. - """ - command = " ".join(args) - logger.debug("Executing process: %s", command) + """ + command = " ".join(args) + logger.debug("Executing process: %s", command) try: - if sys.platform == "win32": + if sys.platform == "win32": completed_proc = subprocess.run(args, capture_output=True, creationflags=subprocess.CREATE_NO_WINDOW) else: completed_proc = subprocess.run(args, capture_output=True) - stdout = completed_proc.stdout.decode("utf-8").rstrip("\n") - stderr = completed_proc.stderr.decode("utf-8").rstrip("\n") - output = json.loads(stdout) if stdout != "" else {"logs": [], "result": {}} + stdout = completed_proc.stdout.decode("utf-8").rstrip("\n") + stderr = completed_proc.stderr.decode("utf-8").rstrip("\n") + output = json.loads(stdout) if stdout != "" else {"logs": [], "result": {}} except Exception as err: - raise WebDriverException(f"Unsuccessful command executed: {command}") from err + raise WebDriverException(f"Unsuccessful command executed: {command}") from err - SeleniumManager._process_logs(output["logs"]) - result = output["result"] + SeleniumManager._process_logs(output["logs"]) + result = output["result"] if completed_proc.returncode: raise WebDriverException( - f"Unsuccessful command executed: {command}; code: {completed_proc.returncode}\n{result}\n{stderr}" + f"Unsuccessful command executed: {command}; code: {completed_proc.returncode}\n{result}\n{stderr}" ) return result @staticmethod def _process_logs(log_items: List[dict]): for item in log_items: - if item["level"] == "WARN": - logger.warning(item["message"]) - elif item["level"] in ["DEBUG", "INFO"]: - logger.debug(item["message"])
+ if item["level"] == "WARN": + logger.warning(item["message"]) + elif item["level"] in ["DEBUG", "INFO"]: + logger.debug(item["message"])
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/service.html b/docs/api/py/_modules/selenium/webdriver/common/service.html index 6a9495efd9b36..e579b31ba0b70 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/service.html +++ b/docs/api/py/_modules/selenium/webdriver/common/service.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.common.service — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.service — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.service

+  

Source code for selenium.webdriver.common.service

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -79,8 +235,10 @@ 

Source code for selenium.webdriver.common.service

logger = logging.getLogger(__name__) -
[docs]class Service(ABC): - """The abstract base class for all service objects. Services typically +
+[docs] +class Service(ABC): + """The abstract base class for all service objects. Services typically launch a child program in a new process as an interim process to communicate with a browser. @@ -89,7 +247,7 @@

Source code for selenium.webdriver.common.service

:param log_output: (Optional) int representation of STDOUT/DEVNULL, any IO instance or String path to file. :param env: (Optional) Mapping of environment variables for the new process, defaults to `os.environ`. :param driver_path_env_key: (Optional) Environment variable to use to get the path to the driver executable. - """ + """ def __init__( self, @@ -101,7 +259,7 @@

Source code for selenium.webdriver.common.service

**kwargs, ) -> None: if isinstance(log_output, str): - self.log_output = cast(IOBase, open(log_output, "a+", encoding="utf-8")) + self.log_output = cast(IOBase, open(log_output, "a+", encoding="utf-8")) elif log_output == subprocess.STDOUT: self.log_output = cast(Optional[Union[int, IOBase]], None) elif log_output is None or log_output == subprocess.DEVNULL: @@ -111,39 +269,44 @@

Source code for selenium.webdriver.common.service

self.port = port or utils.free_port() # Default value for every python subprocess: subprocess.Popen(..., creationflags=0) - self.popen_kw = kwargs.pop("popen_kw", {}) - self.creation_flags = self.popen_kw.pop("creation_flags", 0) + self.popen_kw = kwargs.pop("popen_kw", {}) + self.creation_flags = self.popen_kw.pop("creation_flags", 0) self.env = env or os.environ self.DRIVER_PATH_ENV_KEY = driver_path_env_key self._path = self.env_path() or executable_path @property def service_url(self) -> str: - """Gets the url of the Service.""" - return f"http://{utils.join_host_port('localhost', self.port)}" + """Gets the url of the Service.""" + return f"http://{utils.join_host_port('localhost', self.port)}" -
[docs] @abstractmethod +
+[docs] + @abstractmethod def command_line_args(self) -> List[str]: - """A List of program arguments (excluding the executable).""" - raise NotImplementedError("This method needs to be implemented in a sub class")
+ """A List of program arguments (excluding the executable).""" + raise NotImplementedError("This method needs to be implemented in a sub class")
+ @property def path(self) -> str: - return self._path or "" + return self._path or "" @path.setter def path(self, value: str) -> None: self._path = str(value) -
[docs] def start(self) -> None: - """Starts the Service. +
+[docs] + def start(self) -> None: + """Starts the Service. :Exceptions: - - WebDriverException : Raised either when it can't start the service - or when it can't connect to the service - """ + - WebDriverException : Raised either when it can't start the service + or when it can't connect to the service + """ if self._path is None: - raise WebDriverException("Service path cannot be None.") + raise WebDriverException("Service path cannot be None.") self._start_process(self._path) count = 0 @@ -155,24 +318,33 @@

Source code for selenium.webdriver.common.service

sleep(min(0.01 + 0.05 * count, 0.5)) count += 1 if count == 70: - raise WebDriverException(f"Can not connect to the Service {self._path}")
+ raise WebDriverException(f"Can not connect to the Service {self._path}")
+ -
[docs] def assert_process_still_running(self) -> None: - """Check if the underlying process is still running.""" +
+[docs] + def assert_process_still_running(self) -> None: + """Check if the underlying process is still running.""" return_code = self.process.poll() if return_code: - raise WebDriverException(f"Service {self._path} unexpectedly exited. Status code was: {return_code}")
+ raise WebDriverException(f"Service {self._path} unexpectedly exited. Status code was: {return_code}")
-
[docs] def is_connectable(self) -> bool: - """Establishes a socket connection to determine if the service running - on the port is accessible.""" + +
+[docs] + def is_connectable(self) -> bool: + """Establishes a socket connection to determine if the service running + on the port is accessible.""" return utils.is_connectable(self.port)
-
[docs] def send_remote_shutdown_command(self) -> None: - """Dispatch an HTTP request to the shutdown endpoint for the service in - an attempt to stop it.""" + +
+[docs] + def send_remote_shutdown_command(self) -> None: + """Dispatch an HTTP request to the shutdown endpoint for the service in + an attempt to stop it.""" try: - request.urlopen(f"{self.service_url}/shutdown") + request.urlopen(f"{self.service_url}/shutdown") except URLError: return @@ -181,8 +353,11 @@

Source code for selenium.webdriver.common.service

break sleep(1)
-
[docs] def stop(self) -> None: - """Stops the service.""" + +
+[docs] + def stop(self) -> None: + """Stops the service.""" if self.log_output not in {PIPE, subprocess.DEVNULL}: if isinstance(self.log_output, IOBase): @@ -197,14 +372,15 @@

Source code for selenium.webdriver.common.service

pass self._terminate_process()
+ def _terminate_process(self) -> None: - """Terminate the child process. + """Terminate the child process. On POSIX this attempts a graceful SIGTERM followed by a SIGKILL, on a Windows OS kill is an alias to terminate. Terminating does not raise itself if something has gone wrong but (currently) silently ignores errors here. - """ + """ try: stdin, stdout, stderr = ( self.process.stdin, @@ -221,15 +397,15 @@

Source code for selenium.webdriver.common.service

self.process.wait(60) except subprocess.TimeoutExpired: logger.error( - "Service process refused to terminate gracefully with SIGTERM, escalating to SIGKILL.", + "Service process refused to terminate gracefully with SIGTERM, escalating to SIGKILL.", exc_info=True, ) self.process.kill() except OSError: - logger.error("Error terminating service process.", exc_info=True) + logger.error("Error terminating service process.", exc_info=True) def __del__(self) -> None: - # `subprocess.Popen` doesn't send signal on `__del__`; + # `subprocess.Popen` doesn't send signal on `__del__`; # so we attempt to close the launched process when `__del__` # is triggered. # do not use globals here; interpreter shutdown may have already cleaned them up @@ -240,16 +416,16 @@

Source code for selenium.webdriver.common.service

pass def _start_process(self, path: str) -> None: - """Creates a subprocess by executing the command provided. + """Creates a subprocess by executing the command provided. :param cmd: full command to execute - """ + """ cmd = [path] cmd.extend(self.command_line_args()) - close_file_descriptors = self.popen_kw.pop("close_fds", system() != "Windows") + close_file_descriptors = self.popen_kw.pop("close_fds", system() != "Windows") try: start_info = None - if system() == "Windows": + if system() == "Windows": start_info = subprocess.STARTUPINFO() # type: ignore[attr-defined] start_info.dwFlags = subprocess.CREATE_NEW_CONSOLE | subprocess.STARTF_USESHOWWINDOW # type: ignore[attr-defined] start_info.wShowWindow = subprocess.SW_HIDE # type: ignore[attr-defined] @@ -266,7 +442,7 @@

Source code for selenium.webdriver.common.service

**self.popen_kw, ) logger.debug( - "Started executable: `%s` in a child process with pid: %s using %s to output %s", + "Started executable: `%s` in a child process with pid: %s using %s to output %s", self._path, self.process.pid, self.creation_flags, @@ -277,54 +453,48 @@

Source code for selenium.webdriver.common.service

except OSError as err: if err.errno == errno.EACCES: if self._path is None: - raise WebDriverException("Service path cannot be None.") + raise WebDriverException("Service path cannot be None.") raise WebDriverException( - f"'{os.path.basename(self._path)}' executable may have wrong permissions." + f"'{os.path.basename(self._path)}' executable may have wrong permissions." ) from err raise -
[docs] def env_path(self) -> Optional[str]: +
+[docs] + def env_path(self) -> Optional[str]: if self.DRIVER_PATH_ENV_KEY: return os.getenv(self.DRIVER_PATH_ENV_KEY, None) - return None
+ return None
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/timeouts.html b/docs/api/py/_modules/selenium/webdriver/common/timeouts.html index d6f49493b930b..0c32f2db1bfe1 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/timeouts.html +++ b/docs/api/py/_modules/selenium/webdriver/common/timeouts.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.common.timeouts — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.timeouts — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.timeouts

+  

Source code for selenium.webdriver.common.timeouts

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -70,12 +226,12 @@ 

Source code for selenium.webdriver.common.timeouts

class _TimeoutsDescriptor: - """Get or set the value of the attributes listed below. + """Get or set the value of the attributes listed below. _implicit_wait _page_load _script This does not set the value on the remote end. - """ + """ def __init__(self, name): self.name = name @@ -84,13 +240,15 @@

Source code for selenium.webdriver.common.timeouts

return getattr(obj, self.name) / 1000 def __set__(self, obj, value) -> None: - converted_value = getattr(obj, "_convert")(value) + converted_value = getattr(obj, "_convert")(value) setattr(obj, self.name, converted_value) -
[docs]class Timeouts: +
+[docs] +class Timeouts: def __init__(self, implicit_wait: float = 0, page_load: float = 0, script: float = 0) -> None: - """Create a new Timeouts object. + """Create a new Timeouts object. This implements https://w3c.github.io/webdriver/#timeouts. @@ -104,118 +262,109 @@

Source code for selenium.webdriver.common.timeouts

- script - Either an int or a float. Set how many seconds to wait for an asynchronous script to finish execution before throwing an error. - """ + """ self._implicit_wait = self._convert(implicit_wait) self._page_load = self._convert(page_load) self._script = self._convert(script) # Creating descriptor objects - implicit_wait = _TimeoutsDescriptor("_implicit_wait") - """Get or set how many seconds to wait when searching for elements. + implicit_wait = _TimeoutsDescriptor("_implicit_wait") + """Get or set how many seconds to wait when searching for elements. This does not set the value on the remote end. - Usage - ----- + Usage: + ------ - Get - `self.implicit_wait` - Set - `self.implicit_wait` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `float` - """ + """ - page_load = _TimeoutsDescriptor("_page_load") - """Get or set how many seconds to wait for the page to load. + page_load = _TimeoutsDescriptor("_page_load") + """Get or set how many seconds to wait for the page to load. This does not set the value on the remote end. - Usage - ----- + Usage: + ------ - Get - `self.page_load` - Set - `self.page_load` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `float` - """ + """ - script = _TimeoutsDescriptor("_script") - """Get or set how many seconds to wait for an asynchronous script to finish + script = _TimeoutsDescriptor("_script") + """Get or set how many seconds to wait for an asynchronous script to finish execution. This does not set the value on the remote end. - Usage + Usage: ------ - Get - `self.script` - Set - `self.script` = `value` - Parameters + Parameters: ----------- `value`: `float` - """ + """ def _convert(self, timeout: float) -> int: if isinstance(timeout, (int, float)): return int(float(timeout) * 1000) - raise TypeError("Timeouts can only be an int or a float") + raise TypeError("Timeouts can only be an int or a float") def _to_json(self) -> JSONTimeouts: timeouts: JSONTimeouts = {} if self._implicit_wait: - timeouts["implicit"] = self._implicit_wait + timeouts["implicit"] = self._implicit_wait if self._page_load: - timeouts["pageLoad"] = self._page_load + timeouts["pageLoad"] = self._page_load if self._script: - timeouts["script"] = self._script + timeouts["script"] = self._script return timeouts
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/utils.html b/docs/api/py/_modules/selenium/webdriver/common/utils.html index 727a45e4566e3..ff220f10e7b06 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/utils.html +++ b/docs/api/py/_modules/selenium/webdriver/common/utils.html @@ -1,58 +1,214 @@ - + - selenium.webdriver.common.utils — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.utils — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.utils

+  

Source code for selenium.webdriver.common.utils

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-"""The Utils methods."""
+"""The Utils methods."""
 
 import socket
 from typing import Iterable
@@ -66,20 +222,25 @@ 

Source code for selenium.webdriver.common.utils

< _is_connectable_exceptions = (socket.error, ConnectionResetError) -
[docs]def free_port() -> int: - """Determines a free port using sockets.""" +
+[docs] +def free_port() -> int: + """Determines a free port using sockets.""" free_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - free_socket.bind(("127.0.0.1", 0)) + free_socket.bind(("127.0.0.1", 0)) free_socket.listen(5) port: int = free_socket.getsockname()[1] free_socket.close() return port
-
[docs]def find_connectable_ip(host: Union[str, bytes, bytearray, None], port: Optional[int] = None) -> Optional[str]: - """Resolve a hostname to an IP, preferring IPv4 addresses. - We prefer IPv4 so that we don't change behavior from previous IPv4-only +
+[docs] +def find_connectable_ip(host: Union[str, bytes, bytearray, None], port: Optional[int] = None) -> Optional[str]: + """Resolve a hostname to an IP, preferring IPv4 addresses. + + We prefer IPv4 so that we don't change behavior from previous IPv4-only implementations, and because some drivers (e.g., FirefoxDriver) do not support IPv6 connections. @@ -94,7 +255,7 @@

Source code for selenium.webdriver.common.utils

< A single IP address, as a string. If any IPv4 address is found, one is returned. Otherwise, if any IPv6 address is found, one is returned. If neither, then None is returned. - """ + """ try: addrinfos = socket.getaddrinfo(host, None) except socket.gaierror: @@ -113,27 +274,33 @@

Source code for selenium.webdriver.common.utils

< return ip
-
[docs]def join_host_port(host: str, port: int) -> str: - """Joins a hostname and port together. + +
+[docs] +def join_host_port(host: str, port: int) -> str: + """Joins a hostname and port together. This is a minimal implementation intended to cope with IPv6 literals. For - example, _join_host_port('::1', 80) == '[::1]:80'. + example, _join_host_port('::1', 80) == '[::1]:80'. :Args: - host - A hostname. - port - An integer port. - """ - if ":" in host and not host.startswith("["): - return f"[{host}]:{port}" - return f"{host}:{port}"
+ """ + if ":" in host and not host.startswith("["): + return f"[{host}]:{port}" + return f"{host}:{port}"
+ -
[docs]def is_connectable(port: int, host: Optional[str] = "localhost") -> bool: - """Tries to connect to the server at port to see if it is running. +
+[docs] +def is_connectable(port: int, host: Optional[str] = "localhost") -> bool: + """Tries to connect to the server at port to see if it is running. :Args: - port - The port to connect. - """ + """ socket_ = None try: socket_ = socket.create_connection((host, port), 1) @@ -142,28 +309,38 @@

Source code for selenium.webdriver.common.utils

< result = False finally: if socket_: + try: + socket_.shutdown(socket.SHUT_RDWR) + except Exception: + pass socket_.close() return result
-
[docs]def is_url_connectable(port: Union[int, str]) -> bool: - """Tries to connect to the HTTP server at /status path and specified port + +
+[docs] +def is_url_connectable(port: Union[int, str]) -> bool: + """Tries to connect to the HTTP server at /status path and specified port to see if it responds successfully. :Args: - port - The port to connect. - """ + """ from urllib import request as url_request try: - res = url_request.urlopen(f"http://127.0.0.1:{port}/status") + res = url_request.urlopen(f"http://127.0.0.1:{port}/status") return res.getcode() == 200 except Exception: return False
-
[docs]def keys_to_typing(value: Iterable[AnyKey]) -> List[str]: - """Processes the values that will be typed in the element.""" + +
+[docs] +def keys_to_typing(value: Iterable[AnyKey]) -> List[str]: + """Processes the values that will be typed in the element.""" characters: List[str] = [] for val in value: if isinstance(val, Keys): @@ -174,44 +351,35 @@

Source code for selenium.webdriver.common.utils

< else: characters.extend(val) return characters
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/virtual_authenticator.html b/docs/api/py/_modules/selenium/webdriver/common/virtual_authenticator.html index 05ff96d9828b5..1933897fe982a 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/virtual_authenticator.html +++ b/docs/api/py/_modules/selenium/webdriver/common/virtual_authenticator.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.common.virtual_authenticator — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.virtual_authenticator — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.virtual_authenticator

+  

Source code for selenium.webdriver.common.virtual_authenticator

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -63,24 +219,32 @@ 

Source code for selenium.webdriver.common.virtual_authenticator

from typing import Union -
[docs]class Protocol(str, Enum): - """Protocol to communicate with the authenticator.""" +
+[docs] +class Protocol(str, Enum): + """Protocol to communicate with the authenticator.""" + + CTAP2: str = "ctap2" + U2F: str = "ctap1/u2f"
- CTAP2: str = "ctap2" - U2F: str = "ctap1/u2f"
-
[docs]class Transport(str, Enum): - """Transport method to communicate with the authenticator.""" +
+[docs] +class Transport(str, Enum): + """Transport method to communicate with the authenticator.""" - BLE: str = "ble" - USB: str = "usb" - NFC: str = "nfc" - INTERNAL: str = "internal"
+ BLE: str = "ble" + USB: str = "usb" + NFC: str = "nfc" + INTERNAL: str = "internal"
-
[docs]class VirtualAuthenticatorOptions: - # These are so unnecessary but are now public API so we can't remove them without deprecating first. + +
+[docs] +class VirtualAuthenticatorOptions: + # These are so unnecessary but are now public API so we can't remove them without deprecating first. # These should not be class level state in here. Protocol = Protocol Transport = Transport @@ -94,10 +258,10 @@

Source code for selenium.webdriver.common.virtual_authenticator

is_user_consenting: bool = True, is_user_verified: bool = False, ) -> None: - """Constructor. + """Constructor. Initialize VirtualAuthenticatorOptions object. - """ + """ self.protocol: str = protocol self.transport: str = transport @@ -106,18 +270,24 @@

Source code for selenium.webdriver.common.virtual_authenticator

self.is_user_consenting: bool = is_user_consenting self.is_user_verified: bool = is_user_verified -
[docs] def to_dict(self) -> Dict[str, Union[str, bool]]: +
+[docs] + def to_dict(self) -> Dict[str, Union[str, bool]]: return { - "protocol": self.protocol, - "transport": self.transport, - "hasResidentKey": self.has_resident_key, - "hasUserVerification": self.has_user_verification, - "isUserConsenting": self.is_user_consenting, - "isUserVerified": self.is_user_verified, - }
+ "protocol": self.protocol, + "transport": self.transport, + "hasResidentKey": self.has_resident_key, + "hasUserVerification": self.has_user_verification, + "isUserConsenting": self.is_user_consenting, + "isUserVerified": self.is_user_verified, + }
+
-
[docs]class Credential: + +
+[docs] +class Credential: def __init__( self, credential_id: bytes, @@ -127,7 +297,7 @@

Source code for selenium.webdriver.common.virtual_authenticator

private_key: bytes, sign_count: int, ): - """Constructor. A credential stored in a virtual authenticator. + """Constructor. A credential stored in a virtual authenticator. https://w3c.github.io/webauthn/#credential-parameters. :Args: @@ -137,7 +307,7 @@

Source code for selenium.webdriver.common.virtual_authenticator

- user_handle (bytes): userHandle associated to the credential. Must be Base64 encoded string. Can be None. - private_key (bytes): Base64 encoded PKCS#8 private key. - sign_count (int): intital value for a signature counter. - """ + """ self._id = credential_id self._is_resident_credential = is_resident_credential self._rp_id = rp_id @@ -171,9 +341,11 @@

Source code for selenium.webdriver.common.virtual_authenticator

def sign_count(self) -> int: return self._sign_count -
[docs] @classmethod - def create_non_resident_credential(cls, id: bytes, rp_id: str, private_key: bytes, sign_count: int) -> "Credential": - """Creates a non-resident (i.e. stateless) credential. +
+[docs] + @classmethod + def create_non_resident_credential(cls, id: bytes, rp_id: str, private_key: bytes, sign_count: int) -> "Credential": + """Creates a non-resident (i.e. stateless) credential. :Args: - id (bytes): Unique base64 encoded string. @@ -183,14 +355,17 @@

Source code for selenium.webdriver.common.virtual_authenticator

:Returns: - Credential: A non-resident credential. - """ + """ return cls(id, False, rp_id, None, private_key, sign_count)
-
[docs] @classmethod + +
+[docs] + @classmethod def create_resident_credential( cls, id: bytes, rp_id: str, user_handle: Optional[bytes], private_key: bytes, sign_count: int - ) -> "Credential": - """Creates a resident (i.e. stateful) credential. + ) -> "Credential": + """Creates a resident (i.e. stateful) credential. :Args: - id (bytes): Unique base64 encoded string. @@ -201,104 +376,108 @@

Source code for selenium.webdriver.common.virtual_authenticator

:returns: - Credential: A resident credential. - """ + """ return cls(id, True, rp_id, user_handle, private_key, sign_count)
-
[docs] def to_dict(self) -> Dict[str, Any]: + +
+[docs] + def to_dict(self) -> Dict[str, Any]: credential_data = { - "credentialId": self.id, - "isResidentCredential": self._is_resident_credential, - "rpId": self.rp_id, - "privateKey": self.private_key, - "signCount": self.sign_count, + "credentialId": self.id, + "isResidentCredential": self._is_resident_credential, + "rpId": self.rp_id, + "privateKey": self.private_key, + "signCount": self.sign_count, } if self.user_handle: - credential_data["userHandle"] = self.user_handle + credential_data["userHandle"] = self.user_handle return credential_data
-
[docs] @classmethod - def from_dict(cls, data: Dict[str, Any]) -> "Credential": - _id = urlsafe_b64decode(f"{data['credentialId']}==") - is_resident_credential = bool(data["isResidentCredential"]) - rp_id = data.get("rpId", None) - private_key = urlsafe_b64decode(f"{data['privateKey']}==") - sign_count = int(data["signCount"]) - user_handle = urlsafe_b64decode(f"{data['userHandle']}==") if data.get("userHandle", None) else None + +
+[docs] + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> "Credential": + _id = urlsafe_b64decode(f"{data['credentialId']}==") + is_resident_credential = bool(data["isResidentCredential"]) + rp_id = data.get("rpId", None) + private_key = urlsafe_b64decode(f"{data['privateKey']}==") + sign_count = int(data["signCount"]) + user_handle = urlsafe_b64decode(f"{data['userHandle']}==") if data.get("userHandle", None) else None return cls(_id, is_resident_credential, rp_id, user_handle, private_key, sign_count)
+ def __str__(self) -> str: - return f"Credential(id={self.id}, is_resident_credential={self.is_resident_credential}, rp_id={self.rp_id},\ - user_handle={self.user_handle}, private_key={self.private_key}, sign_count={self.sign_count})"
+ return f"Credential(id={self.id}, is_resident_credential={self.is_resident_credential}, rp_id={self.rp_id},\ + user_handle={self.user_handle}, private_key={self.private_key}, sign_count={self.sign_count})"
-
[docs]def required_chromium_based_browser(func): - """A decorator to ensure that the client used is a chromium based - browser.""" + +
+[docs] +def required_chromium_based_browser(func): + """A decorator to ensure that the client used is a chromium based + browser.""" @functools.wraps(func) def wrapper(self, *args, **kwargs): - assert self.caps["browserName"].lower() not in [ - "firefox", - "safari", - ], "This only currently works in Chromium based browsers" + assert self.caps["browserName"].lower() not in [ + "firefox", + "safari", + ], "This only currently works in Chromium based browsers" return func(self, *args, **kwargs) return wrapper
-
[docs]def required_virtual_authenticator(func): - """A decorator to ensure that the function is called with a virtual - authenticator.""" + +
+[docs] +def required_virtual_authenticator(func): + """A decorator to ensure that the function is called with a virtual + authenticator.""" @functools.wraps(func) @required_chromium_based_browser def wrapper(self, *args, **kwargs): if not self.virtual_authenticator_id: - raise ValueError("This function requires a virtual authenticator to be set.") + raise ValueError("This function requires a virtual authenticator to be set.") return func(self, *args, **kwargs) return wrapper
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/common/window.html b/docs/api/py/_modules/selenium/webdriver/common/window.html index 5f0df9333abbe..cb8b4bc2ffcb6 100644 --- a/docs/api/py/_modules/selenium/webdriver/common/window.html +++ b/docs/api/py/_modules/selenium/webdriver/common/window.html @@ -1,103 +1,252 @@ - + - selenium.webdriver.common.window — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.common.window — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.common.window

+  

Source code for selenium.webdriver.common.window

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-"""The WindowTypes implementation."""
+"""The WindowTypes implementation."""
+
 
+
+[docs] +class WindowTypes: + """Set of supported window types.""" -
[docs]class WindowTypes: - """Set of supported window types.""" + TAB = "tab" + WINDOW = "window"
- TAB = "tab" - WINDOW = "window"
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/edge/options.html b/docs/api/py/_modules/selenium/webdriver/edge/options.html index 7ea0103b707ca..a08ea681de440 100644 --- a/docs/api/py/_modules/selenium/webdriver/edge/options.html +++ b/docs/api/py/_modules/selenium/webdriver/edge/options.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.edge.options — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.edge.options — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.edge.options

+  

Source code for selenium.webdriver.edge.options

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -57,8 +213,10 @@ 

Source code for selenium.webdriver.edge.options

< from selenium.webdriver.common.desired_capabilities import DesiredCapabilities -
[docs]class Options(ChromiumOptions): - KEY = "ms:edgeOptions" +
+[docs] +class Options(ChromiumOptions): + KEY = "ms:edgeOptions" def __init__(self) -> None: super().__init__() @@ -72,56 +230,50 @@

Source code for selenium.webdriver.edge.options

< def use_webview(self, value: bool) -> None: self._use_webview = bool(value) -
[docs] def to_capabilities(self) -> dict: - """Creates a capabilities with all the options that have been set and - :Returns: A dictionary with everything.""" +
+[docs] + def to_capabilities(self) -> dict: + """Creates a capabilities with all the options that have been set and + :Returns: A dictionary with everything.""" caps = super().to_capabilities() if self._use_webview: - caps["browserName"] = "webview2" + caps["browserName"] = "webview2" return caps
+ @property def default_capabilities(self) -> dict: return DesiredCapabilities.EDGE.copy()
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/edge/remote_connection.html b/docs/api/py/_modules/selenium/webdriver/edge/remote_connection.html index fc70bd985012d..65532a769169d 100644 --- a/docs/api/py/_modules/selenium/webdriver/edge/remote_connection.html +++ b/docs/api/py/_modules/selenium/webdriver/edge/remote_connection.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.edge.remote_connection — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.edge.remote_connection — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.edge.remote_connection

+  

Source code for selenium.webdriver.edge.remote_connection

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -60,8 +216,10 @@ 

Source code for selenium.webdriver.edge.remote_connection

from selenium.webdriver.remote.client_config import ClientConfig -
[docs]class EdgeRemoteConnection(ChromiumRemoteConnection): - browser_name = DesiredCapabilities.EDGE["browserName"] +
+[docs] +class EdgeRemoteConnection(ChromiumRemoteConnection): + browser_name = DesiredCapabilities.EDGE["browserName"] def __init__( self, @@ -72,50 +230,41 @@

Source code for selenium.webdriver.edge.remote_connection

) -> None: super().__init__( remote_server_addr=remote_server_addr, - vendor_prefix="goog", + vendor_prefix="goog", browser_name=EdgeRemoteConnection.browser_name, keep_alive=keep_alive, ignore_proxy=ignore_proxy, client_config=client_config, )
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/edge/service.html b/docs/api/py/_modules/selenium/webdriver/edge/service.html index e288ebf2e6823..0a2881485d82b 100644 --- a/docs/api/py/_modules/selenium/webdriver/edge/service.html +++ b/docs/api/py/_modules/selenium/webdriver/edge/service.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.edge.service — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.edge.service — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.edge.service

+  

Source code for selenium.webdriver.edge.service

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -61,8 +217,10 @@ 

Source code for selenium.webdriver.edge.service

< from selenium.webdriver.chromium import service -
[docs]class Service(service.ChromiumService): - """A Service class that is responsible for the starting and stopping of +
+[docs] +class Service(service.ChromiumService): + """A Service class that is responsible for the starting and stopping of `msedgedriver`. :param executable_path: install path of the msedgedriver executable, defaults to `msedgedriver`. @@ -71,7 +229,7 @@

Source code for selenium.webdriver.edge.service

< :param service_args: (Optional) List of args to be passed to the subprocess when launching the executable. :param env: (Optional) Mapping of environment variables for the new process, defaults to `os.environ`. :param driver_path_env_key: (Optional) Environment variable to use to get the path to the driver executable. - """ + """ def __init__( self, @@ -84,7 +242,7 @@

Source code for selenium.webdriver.edge.service

< **kwargs, ) -> None: self.service_args = service_args or [] - driver_path_env_key = driver_path_env_key or "SE_EDGEDRIVER" + driver_path_env_key = driver_path_env_key or "SE_EDGEDRIVER" super().__init__( executable_path=executable_path, @@ -95,44 +253,35 @@

Source code for selenium.webdriver.edge.service

< driver_path_env_key=driver_path_env_key, **kwargs, )
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/edge/webdriver.html b/docs/api/py/_modules/selenium/webdriver/edge/webdriver.html index eb6b45c590343..259ce1f1165ba 100644 --- a/docs/api/py/_modules/selenium/webdriver/edge/webdriver.html +++ b/docs/api/py/_modules/selenium/webdriver/edge/webdriver.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.edge.webdriver — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.edge.webdriver — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.edge.webdriver

+  

Source code for selenium.webdriver.edge.webdriver

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -60,8 +216,10 @@ 

Source code for selenium.webdriver.edge.webdriver

from .service import Service -
[docs]class WebDriver(ChromiumDriver): - """Controls the MSEdgeDriver and allows you to drive the browser.""" +
+[docs] +class WebDriver(ChromiumDriver): + """Controls the MSEdgeDriver and allows you to drive the browser.""" def __init__( self, @@ -69,62 +227,53 @@

Source code for selenium.webdriver.edge.webdriver

service: Service = None, keep_alive: bool = True, ) -> None: - """Creates a new instance of the edge driver. Starts the service and + """Creates a new instance of the edge driver. Starts the service and then creates new instance of edge driver. :Args: - options - this takes an instance of EdgeOptions - service - Service object for handling the browser driver if you need to pass extra details - keep_alive - Whether to configure EdgeRemoteConnection to use HTTP keep-alive. - """ + """ service = service if service else Service() options = options if options else Options() super().__init__( - browser_name=DesiredCapabilities.EDGE["browserName"], - vendor_prefix="ms", + browser_name=DesiredCapabilities.EDGE["browserName"], + vendor_prefix="ms", options=options, service=service, keep_alive=keep_alive, )
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/firefox/firefox_binary.html b/docs/api/py/_modules/selenium/webdriver/firefox/firefox_binary.html index f9dec44b3d435..68900acd7e6b4 100644 --- a/docs/api/py/_modules/selenium/webdriver/firefox/firefox_binary.html +++ b/docs/api/py/_modules/selenium/webdriver/firefox/firefox_binary.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.firefox.firefox_binary — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.firefox.firefox_binary — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.firefox.firefox_binary

+  

Source code for selenium.webdriver.firefox.firefox_binary

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -67,19 +223,21 @@ 

Source code for selenium.webdriver.firefox.firefox_binary

from selenium.webdriver.common import utils -
[docs]@deprecated("Use binary_location property in Firefox Options to set location") +
+[docs] +@deprecated("Use binary_location property in Firefox Options to set location") class FirefoxBinary: - NO_FOCUS_LIBRARY_NAME = "x_ignore_nofocus.so" + NO_FOCUS_LIBRARY_NAME = "x_ignore_nofocus.so" def __init__(self, firefox_path=None, log_file=None): - """Creates a new instance of Firefox binary. + """Creates a new instance of Firefox binary. :Args: - firefox_path - Path to the Firefox executable. By default, it will be detected from the standard locations. - log_file - A file object to redirect the firefox process output to. It can be sys.stdout. - Please note that with parallel run the output won't be synchronous. + Please note that with parallel run the output won't be synchronous. By default, it will be redirected to /dev/null. - """ + """ self._start_cmd = firefox_path # We used to default to subprocess.PIPE instead of /dev/null, but after # a while the pipe would fill up and Firefox would freeze. @@ -90,71 +248,80 @@

Source code for selenium.webdriver.firefox.firefox_binary

self._start_cmd = self._get_firefox_start_cmd() if not self._start_cmd.strip(): raise WebDriverException( - "Failed to find firefox binary. You can set it by specifying " - "the path to 'firefox_binary':\n\nfrom " - "selenium.webdriver.firefox.firefox_binary import " - "FirefoxBinary\n\nbinary = " - "FirefoxBinary('/path/to/binary')\ndriver = " - "webdriver.Firefox(firefox_binary=binary)" + "Failed to find firefox binary. You can set it by specifying " + "the path to 'firefox_binary':\n\nfrom " + "selenium.webdriver.firefox.firefox_binary import " + "FirefoxBinary\n\nbinary = " + "FirefoxBinary('/path/to/binary')\ndriver = " + "webdriver.Firefox(firefox_binary=binary)" ) # Rather than modifying the environment of the calling Python process # copy it and modify as needed. self._firefox_env = os.environ.copy() - self._firefox_env["MOZ_CRASHREPORTER_DISABLE"] = "1" - self._firefox_env["MOZ_NO_REMOTE"] = "1" - self._firefox_env["NO_EM_RESTART"] = "1" + self._firefox_env["MOZ_CRASHREPORTER_DISABLE"] = "1" + self._firefox_env["MOZ_NO_REMOTE"] = "1" + self._firefox_env["NO_EM_RESTART"] = "1" -
[docs] def add_command_line_options(self, *args): +
+[docs] + def add_command_line_options(self, *args): self.command_line = args
-
[docs] def launch_browser(self, profile, timeout=30): - """Launches the browser for the given profile name. + +
+[docs] + def launch_browser(self, profile, timeout=30): + """Launches the browser for the given profile name. It is assumed the profile already exists. - """ + """ self.profile = profile self._start_from_profile_path(self.profile.path) self._wait_until_connectable(timeout=timeout)
-
[docs] def kill(self): - """Kill the browser. + +
+[docs] + def kill(self): + """Kill the browser. This is useful when the browser is stuck. - """ + """ if self.process: self.process.kill() self.process.wait()
+ def _start_from_profile_path(self, path): - self._firefox_env["XRE_PROFILE_PATH"] = path + self._firefox_env["XRE_PROFILE_PATH"] = path - if self.platform == "linux": + if self.platform == "linux": self._modify_link_library_path() - command = [self._start_cmd, "-foreground"] + command = [self._start_cmd, "-foreground"] if self.command_line: for cli in self.command_line: command.append(cli) self.process = Popen(command, stdout=self._log_file, stderr=STDOUT, env=self._firefox_env) def _wait_until_connectable(self, timeout=30): - """Blocks until the extension is connectable in the firefox.""" + """Blocks until the extension is connectable in the firefox.""" count = 0 while not utils.is_connectable(self.profile.port): if self.process.poll(): # Browser has exited raise WebDriverException( - "The browser appears to have exited " - "before we could connect. If you specified a log_file in " - "the FirefoxBinary constructor, check it for details." + "The browser appears to have exited " + "before we could connect. If you specified a log_file in " + "the FirefoxBinary constructor, check it for details." ) if count >= timeout: self.kill() raise WebDriverException( - "Can't load the profile. Possible firefox version mismatch. " - "You must use GeckoDriver instead for Firefox 48+. Profile " - f"Dir: {self.profile.path} If you specified a log_file in the " - "FirefoxBinary constructor, check it for details." + "Can't load the profile. Possible firefox version mismatch. " + "You must use GeckoDriver instead for Firefox 48+. Profile " + f"Dir: {self.profile.path} If you specified a log_file in the " + "FirefoxBinary constructor, check it for details." ) count += 1 time.sleep(1) @@ -171,83 +338,83 @@

Source code for selenium.webdriver.firefox.firefox_binary

import shlex keys = ( - r"SOFTWARE\Classes\FirefoxHTML\shell\open\command", - r"SOFTWARE\Classes\Applications\firefox.exe\shell\open\command", + r"SOFTWARE\Classes\FirefoxHTML\shell\open\command", + r"SOFTWARE\Classes\Applications\firefox.exe\shell\open\command", ) - command = "" + command = "" for path in keys: try: key = OpenKey(HKEY_LOCAL_MACHINE, path) - command = QueryValue(key, "") + command = QueryValue(key, "") break except OSError: try: key = OpenKey(HKEY_CURRENT_USER, path) - command = QueryValue(key, "") + command = QueryValue(key, "") break except OSError: pass else: - return "" + return "" if not command: - return "" + return "" return shlex.split(command)[0] def _get_firefox_start_cmd(self): - """Return the command to start firefox.""" - start_cmd = "" - if self.platform == "darwin": # small darwin due to lower() in self.platform - ffname = "firefox" + """Return the command to start firefox.""" + start_cmd = "" + if self.platform == "darwin": # small darwin due to lower() in self.platform + ffname = "firefox" start_cmd = self.which(ffname) # use hardcoded path if nothing else was found by which() if not start_cmd: - start_cmd = "/Applications/Firefox.app/Contents/MacOS/firefox" + start_cmd = "/Applications/Firefox.app/Contents/MacOS/firefox" # fallback to homebrew installation for mac users if not os.path.exists(start_cmd): - start_cmd = os.path.expanduser("~") + start_cmd - elif self.platform == "windows": # same + start_cmd = os.path.expanduser("~") + start_cmd + elif self.platform == "windows": # same start_cmd = self._find_exe_in_registry() or self._default_windows_location() - elif self.platform == "java" and os.name == "nt": + elif self.platform == "java" and os.name == "nt": start_cmd = self._default_windows_location() else: - for ffname in ["firefox", "iceweasel"]: + for ffname in ["firefox", "iceweasel"]: start_cmd = self.which(ffname) if start_cmd: break else: - # couldn't find firefox on the system path + # couldn't find firefox on the system path raise RuntimeError( - "Could not find firefox in your system PATH." - " Please specify the firefox binary location or install firefox" + "Could not find firefox in your system PATH." + " Please specify the firefox binary location or install firefox" ) return start_cmd def _default_windows_location(self): program_files = [ - os.getenv("PROGRAMFILES", r"C:\Program Files"), - os.getenv("PROGRAMFILES(X86)", r"C:\Program Files (x86)"), + os.getenv("PROGRAMFILES", r"C:\Program Files"), + os.getenv("PROGRAMFILES(X86)", r"C:\Program Files (x86)"), ] for path in program_files: - binary_path = os.path.join(path, r"Mozilla Firefox\firefox.exe") + binary_path = os.path.join(path, r"Mozilla Firefox\firefox.exe") if os.access(binary_path, os.X_OK): return binary_path - return "" + return "" def _modify_link_library_path(self): - existing_ld_lib_path = os.environ.get("LD_LIBRARY_PATH", "") + existing_ld_lib_path = os.environ.get("LD_LIBRARY_PATH", "") - new_ld_lib_path = self._extract_and_check(self.profile, "x86", "amd64") + new_ld_lib_path = self._extract_and_check(self.profile, "x86", "amd64") new_ld_lib_path += existing_ld_lib_path - self._firefox_env["LD_LIBRARY_PATH"] = new_ld_lib_path - self._firefox_env["LD_PRELOAD"] = self.NO_FOCUS_LIBRARY_NAME + self._firefox_env["LD_LIBRARY_PATH"] = new_ld_lib_path + self._firefox_env["LD_PRELOAD"] = self.NO_FOCUS_LIBRARY_NAME def _extract_and_check(self, profile, x86, amd64): paths = [x86, amd64] - built_path = "" + built_path = "" for path in paths: library_path = os.path.join(profile.path, path) if not os.path.exists(library_path): @@ -255,56 +422,50 @@

Source code for selenium.webdriver.firefox.firefox_binary

import shutil shutil.copy(os.path.join(os.path.dirname(__file__), path, self.NO_FOCUS_LIBRARY_NAME), library_path) - built_path += library_path + ":" + built_path += library_path + ":" return built_path -
[docs] def which(self, fname): - """Returns the fully qualified path by searching Path of the given - name.""" - for pe in os.environ["PATH"].split(os.pathsep): +
+[docs] + def which(self, fname): + """Returns the fully qualified path by searching Path of the given + name.""" + for pe in os.environ["PATH"].split(os.pathsep): checkname = os.path.join(pe, fname) if os.access(checkname, os.X_OK) and not os.path.isdir(checkname): return checkname - return None
+ return None
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/firefox/firefox_profile.html b/docs/api/py/_modules/selenium/webdriver/firefox/firefox_profile.html index da2ebbdc393d8..8645bf9925770 100644 --- a/docs/api/py/_modules/selenium/webdriver/firefox/firefox_profile.html +++ b/docs/api/py/_modules/selenium/webdriver/firefox/firefox_profile.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.firefox.firefox_profile — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.firefox.firefox_profile — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.firefox.firefox_profile

+  

Source code for selenium.webdriver.firefox.firefox_profile

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -70,19 +226,24 @@ 

Source code for selenium.webdriver.firefox.firefox_profile

from selenium.common.exceptions import WebDriverException -WEBDRIVER_PREFERENCES = "webdriver_prefs.json" +WEBDRIVER_PREFERENCES = "webdriver_prefs.json" -
[docs]@deprecated("Addons must be added after starting the session") +
+[docs] +@deprecated("Addons must be added after starting the session") class AddonFormatError(Exception): - """Exception for not well-formed add-on manifest files."""
+ """Exception for not well-formed add-on manifest files."""
-
[docs]class FirefoxProfile: + +
+[docs] +class FirefoxProfile: DEFAULT_PREFERENCES = None def __init__(self, profile_directory=None): - """Initialises a new instance of a Firefox Profile. + """Initialises a new instance of a Firefox Profile. :args: - profile_directory: Directory of profile that you want to use. If a @@ -90,12 +251,12 @@

Source code for selenium.webdriver.firefox.firefox_profile

will be used by the driver when instantiated. This defaults to None and will create a new directory when object is created. - """ + """ self._desired_preferences = {} if profile_directory: - newprof = os.path.join(tempfile.mkdtemp(), "webdriver-py-profilecopy") + newprof = os.path.join(tempfile.mkdtemp(), "webdriver-py-profilecopy") shutil.copytree( - profile_directory, newprof, ignore=shutil.ignore_patterns("parent.lock", "lock", ".parentlock") + profile_directory, newprof, ignore=shutil.ignore_patterns("parent.lock", "lock", ".parentlock") ) self._profile_dir = newprof os.chmod(self._profile_dir, 0o755) @@ -103,154 +264,163 @@

Source code for selenium.webdriver.firefox.firefox_profile

self._profile_dir = tempfile.mkdtemp() if not FirefoxProfile.DEFAULT_PREFERENCES: with open( - os.path.join(os.path.dirname(__file__), WEBDRIVER_PREFERENCES), encoding="utf-8" + os.path.join(os.path.dirname(__file__), WEBDRIVER_PREFERENCES), encoding="utf-8" ) as default_prefs: FirefoxProfile.DEFAULT_PREFERENCES = json.load(default_prefs) - self._desired_preferences = copy.deepcopy(FirefoxProfile.DEFAULT_PREFERENCES["mutable"]) - for key, value in FirefoxProfile.DEFAULT_PREFERENCES["frozen"].items(): + self._desired_preferences = copy.deepcopy(FirefoxProfile.DEFAULT_PREFERENCES["mutable"]) + for key, value in FirefoxProfile.DEFAULT_PREFERENCES["frozen"].items(): self._desired_preferences[key] = value # Public Methods -
[docs] def set_preference(self, key, value): - """Sets the preference that we want in the profile.""" +
+[docs] + def set_preference(self, key, value): + """Sets the preference that we want in the profile.""" self._desired_preferences[key] = value
-
[docs] @deprecated("Addons must be added after starting the session") + +
+[docs] + @deprecated("Addons must be added after starting the session") def add_extension(self, extension=None): self._install_extension(extension)
-
[docs] def update_preferences(self): - """Writes the desired user prefs to disk.""" - user_prefs = os.path.join(self._profile_dir, "user.js") + +
+[docs] + def update_preferences(self): + """Writes the desired user prefs to disk.""" + user_prefs = os.path.join(self._profile_dir, "user.js") if os.path.isfile(user_prefs): os.chmod(user_prefs, 0o644) self._read_existing_userjs(user_prefs) - with open(user_prefs, "w", encoding="utf-8") as f: + with open(user_prefs, "w", encoding="utf-8") as f: for key, value in self._desired_preferences.items(): - f.write(f'user_pref("{key}", {json.dumps(value)});\n')
+ f.write(f'user_pref("{key}", {json.dumps(value)});\n')
+ # Properties @property def path(self): - """Gets the profile directory that is currently being used.""" + """Gets the profile directory that is currently being used.""" return self._profile_dir @property - @deprecated("The port is stored in the Service class") + @deprecated("The port is stored in the Service class") def port(self): - """Gets the port that WebDriver is working on.""" + """Gets the port that WebDriver is working on.""" return self._port @port.setter - @deprecated("The port is stored in the Service class") + @deprecated("The port is stored in the Service class") def port(self, port) -> None: - """Sets the port that WebDriver will be running on.""" + """Sets the port that WebDriver will be running on.""" if not isinstance(port, int): - raise WebDriverException("Port needs to be an integer") + raise WebDriverException("Port needs to be an integer") try: port = int(port) if port < 1 or port > 65535: - raise WebDriverException("Port number must be in the range 1..65535") + raise WebDriverException("Port number must be in the range 1..65535") except (ValueError, TypeError): - raise WebDriverException("Port needs to be an integer") + raise WebDriverException("Port needs to be an integer") self._port = port - self.set_preference("webdriver_firefox_port", self._port) + self.set_preference("webdriver_firefox_port", self._port) @property - @deprecated("Allowing untrusted certs is toggled in the Options class") + @deprecated("Allowing untrusted certs is toggled in the Options class") def accept_untrusted_certs(self): - return self._desired_preferences["webdriver_accept_untrusted_certs"] + return self._desired_preferences["webdriver_accept_untrusted_certs"] @accept_untrusted_certs.setter - @deprecated("Allowing untrusted certs is toggled in the Options class") + @deprecated("Allowing untrusted certs is toggled in the Options class") def accept_untrusted_certs(self, value) -> None: if not isinstance(value, bool): - raise WebDriverException("Please pass in a Boolean to this call") - self.set_preference("webdriver_accept_untrusted_certs", value) + raise WebDriverException("Please pass in a Boolean to this call") + self.set_preference("webdriver_accept_untrusted_certs", value) @property - @deprecated("Allowing untrusted certs is toggled in the Options class") + @deprecated("Allowing untrusted certs is toggled in the Options class") def assume_untrusted_cert_issuer(self): - return self._desired_preferences["webdriver_assume_untrusted_issuer"] + return self._desired_preferences["webdriver_assume_untrusted_issuer"] @assume_untrusted_cert_issuer.setter - @deprecated("Allowing untrusted certs is toggled in the Options class") + @deprecated("Allowing untrusted certs is toggled in the Options class") def assume_untrusted_cert_issuer(self, value) -> None: if not isinstance(value, bool): - raise WebDriverException("Please pass in a Boolean to this call") + raise WebDriverException("Please pass in a Boolean to this call") - self.set_preference("webdriver_assume_untrusted_issuer", value) + self.set_preference("webdriver_assume_untrusted_issuer", value) @property def encoded(self) -> str: - """Updates preferences and creates a zipped, base64 encoded string of - profile directory.""" + """Updates preferences and creates a zipped, base64 encoded string of + profile directory.""" if self._desired_preferences: self.update_preferences() fp = BytesIO() - with zipfile.ZipFile(fp, "w", zipfile.ZIP_DEFLATED, strict_timestamps=False) as zipped: + with zipfile.ZipFile(fp, "w", zipfile.ZIP_DEFLATED, strict_timestamps=False) as zipped: path_root = len(self.path) + 1 # account for trailing slash for base, _, files in os.walk(self.path): for fyle in files: filename = os.path.join(base, fyle) zipped.write(filename, filename[path_root:]) - return base64.b64encode(fp.getvalue()).decode("UTF-8") + return base64.b64encode(fp.getvalue()).decode("UTF-8") def _read_existing_userjs(self, userjs): - """Reads existing preferences and adds them to desired preference - dictionary.""" - pref_pattern = re.compile(r'user_pref\("(.*)",\s(.*)\)') - with open(userjs, encoding="utf-8") as f: + """Reads existing preferences and adds them to desired preference + dictionary.""" + pref_pattern = re.compile(r'user_pref\("(.*)",\s(.*)\)') + with open(userjs, encoding="utf-8") as f: for usr in f: matches = pref_pattern.search(usr) try: self._desired_preferences[matches.group(1)] = json.loads(matches.group(2)) except Exception: warnings.warn( - f"(skipping) failed to json.loads existing preference: {matches.group(1) + matches.group(2)}" + f"(skipping) failed to json.loads existing preference: {matches.group(1) + matches.group(2)}" ) - @deprecated("Addons must be added after starting the session") + @deprecated("Addons must be added after starting the session") def _install_extension(self, addon, unpack=True): - """Installs addon from a filepath, url or directory of addons in the + """Installs addon from a filepath, url or directory of addons in the profile. - path: url, absolute path to .xpi, or directory of addons - unpack: whether to unpack unless specified otherwise in the install.rdf - """ + """ tmpdir = None xpifile = None - if addon.endswith(".xpi"): - tmpdir = tempfile.mkdtemp(suffix="." + os.path.split(addon)[-1]) - compressed_file = zipfile.ZipFile(addon, "r") + if addon.endswith(".xpi"): + tmpdir = tempfile.mkdtemp(suffix="." + os.path.split(addon)[-1]) + compressed_file = zipfile.ZipFile(addon, "r") for name in compressed_file.namelist(): - if name.endswith("/"): + if name.endswith("/"): if not os.path.isdir(os.path.join(tmpdir, name)): os.makedirs(os.path.join(tmpdir, name)) else: if not os.path.isdir(os.path.dirname(os.path.join(tmpdir, name))): os.makedirs(os.path.dirname(os.path.join(tmpdir, name))) data = compressed_file.read(name) - with open(os.path.join(tmpdir, name), "wb") as f: + with open(os.path.join(tmpdir, name), "wb") as f: f.write(data) xpifile = addon addon = tmpdir # determine the addon id addon_details = self._addon_details(addon) - addon_id = addon_details.get("id") - assert addon_id, f"The addon id could not be found: {addon}" + addon_id = addon_details.get("id") + assert addon_id, f"The addon id could not be found: {addon}" # copy the addon to the profile - extensions_dir = os.path.join(self._profile_dir, "extensions") + extensions_dir = os.path.join(self._profile_dir, "extensions") addon_path = os.path.join(extensions_dir, addon_id) - if not unpack and not addon_details["unpack"] and xpifile: + if not unpack and not addon_details["unpack"] and xpifile: if not os.path.exists(extensions_dir): os.makedirs(extensions_dir) os.chmod(extensions_dir, 0o755) - shutil.copy(xpifile, addon_path + ".xpi") + shutil.copy(xpifile, addon_path + ".xpi") else: if not os.path.exists(addon_path): shutil.copytree(addon, addon_path, symlinks=True) @@ -259,76 +429,76 @@

Source code for selenium.webdriver.firefox.firefox_profile

if tmpdir: shutil.rmtree(tmpdir) - @deprecated("Addons must be added after starting the session") + @deprecated("Addons must be added after starting the session") def _addon_details(self, addon_path): - """Returns a dictionary of details about the addon. + """Returns a dictionary of details about the addon. :param addon_path: path to the add-on directory or XPI Returns:: - {'id': u'rainbow@colors.org', # id of the addon - 'version': u'1.4', # version of the addon - 'name': u'Rainbow', # name of the addon - 'unpack': False } # whether to unpack the addon - """ + {'id': u'rainbow@colors.org', # id of the addon + 'version': u'1.4', # version of the addon + 'name': u'Rainbow', # name of the addon + 'unpack': False } # whether to unpack the addon + """ - details = {"id": None, "unpack": False, "name": None, "version": None} + details = {"id": None, "unpack": False, "name": None, "version": None} def get_namespace_id(doc, url): attributes = doc.documentElement.attributes - namespace = "" + namespace = "" for i in range(attributes.length): if attributes.item(i).value == url: - if ":" in attributes.item(i).name: - # If the namespace is not the default one remove 'xlmns:' - namespace = attributes.item(i).name.split(":")[1] + ":" + if ":" in attributes.item(i).name: + # If the namespace is not the default one remove 'xlmns:' + namespace = attributes.item(i).name.split(":")[1] + ":" break return namespace def get_text(element): - """Retrieve the text value of a given node.""" + """Retrieve the text value of a given node.""" rc = [] for node in element.childNodes: if node.nodeType == node.TEXT_NODE: rc.append(node.data) - return "".join(rc).strip() + return "".join(rc).strip() def parse_manifest_json(content): - """Extracts the details from the contents of a WebExtensions - `manifest.json` file.""" + """Extracts the details from the contents of a WebExtensions + `manifest.json` file.""" manifest = json.loads(content) try: - id = manifest["applications"]["gecko"]["id"] + id = manifest["applications"]["gecko"]["id"] except KeyError: - id = manifest["name"].replace(" ", "") + "@" + manifest["version"] + id = manifest["name"].replace(" ", "") + "@" + manifest["version"] return { - "id": id, - "version": manifest["version"], - "name": manifest["version"], - "unpack": False, + "id": id, + "version": manifest["version"], + "name": manifest["version"], + "unpack": False, } if not os.path.exists(addon_path): - raise OSError(f"Add-on path does not exist: {addon_path}") + raise OSError(f"Add-on path does not exist: {addon_path}") try: if zipfile.is_zipfile(addon_path): - with zipfile.ZipFile(addon_path, "r") as compressed_file: - if "manifest.json" in compressed_file.namelist(): - return parse_manifest_json(compressed_file.read("manifest.json")) + with zipfile.ZipFile(addon_path, "r") as compressed_file: + if "manifest.json" in compressed_file.namelist(): + return parse_manifest_json(compressed_file.read("manifest.json")) - manifest = compressed_file.read("install.rdf") + manifest = compressed_file.read("install.rdf") elif os.path.isdir(addon_path): - manifest_json_filename = os.path.join(addon_path, "manifest.json") + manifest_json_filename = os.path.join(addon_path, "manifest.json") if os.path.exists(manifest_json_filename): - with open(manifest_json_filename, encoding="utf-8") as f: + with open(manifest_json_filename, encoding="utf-8") as f: return parse_manifest_json(f.read()) - with open(os.path.join(addon_path, "install.rdf"), encoding="utf-8") as f: + with open(os.path.join(addon_path, "install.rdf"), encoding="utf-8") as f: manifest = f.read() else: - raise OSError(f"Add-on path is neither an XPI nor a directory: {addon_path}") + raise OSError(f"Add-on path is neither an XPI nor a directory: {addon_path}") except (OSError, KeyError) as e: raise AddonFormatError(str(e), sys.exc_info()[2]) @@ -336,72 +506,63 @@

Source code for selenium.webdriver.firefox.firefox_profile

doc = minidom.parseString(manifest) # Get the namespaces abbreviations - em = get_namespace_id(doc, "http://www.mozilla.org/2004/em-rdf#") - rdf = get_namespace_id(doc, "http://www.w3.org/1999/02/22-rdf-syntax-ns#") + em = get_namespace_id(doc, "http://www.mozilla.org/2004/em-rdf#") + rdf = get_namespace_id(doc, "http://www.w3.org/1999/02/22-rdf-syntax-ns#") - description = doc.getElementsByTagName(rdf + "Description").item(0) + description = doc.getElementsByTagName(rdf + "Description").item(0) if not description: - description = doc.getElementsByTagName("Description").item(0) + description = doc.getElementsByTagName("Description").item(0) for node in description.childNodes: # Remove the namespace prefix from the tag for comparison - entry = node.nodeName.replace(em, "") + entry = node.nodeName.replace(em, "") if entry in details: details.update({entry: get_text(node)}) - if not details.get("id"): + if not details.get("id"): for i in range(description.attributes.length): attribute = description.attributes.item(i) - if attribute.name == em + "id": - details.update({"id": attribute.value}) + if attribute.name == em + "id": + details.update({"id": attribute.value}) except Exception as e: raise AddonFormatError(str(e), sys.exc_info()[2]) # turn unpack into a true/false value - if isinstance(details["unpack"], str): - details["unpack"] = details["unpack"].lower() == "true" + if isinstance(details["unpack"], str): + details["unpack"] = details["unpack"].lower() == "true" # If no ID is set, the add-on is invalid - if not details.get("id"): - raise AddonFormatError("Add-on id could not be found.") + if not details.get("id"): + raise AddonFormatError("Add-on id could not be found.") return details
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/firefox/options.html b/docs/api/py/_modules/selenium/webdriver/firefox/options.html index bd59e48950200..ac2cde61e5cd2 100644 --- a/docs/api/py/_modules/selenium/webdriver/firefox/options.html +++ b/docs/api/py/_modules/selenium/webdriver/firefox/options.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.firefox.options — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.firefox.options — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.firefox.options

+  

Source code for selenium.webdriver.firefox.options

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -65,85 +221,101 @@ 

Source code for selenium.webdriver.firefox.options

from selenium.webdriver.firefox.firefox_profile import FirefoxProfile -
[docs]class Log: +
+[docs] +class Log: def __init__(self) -> None: self.level = None -
[docs] def to_capabilities(self) -> dict: +
+[docs] + def to_capabilities(self) -> dict: if self.level: - return {"log": {"level": self.level}} - return {}
+ return {"log": {"level": self.level}} + return {}
+
-
[docs]class Options(ArgOptions): - KEY = "moz:firefoxOptions" + +
+[docs] +class Options(ArgOptions): + KEY = "moz:firefoxOptions" def __init__(self) -> None: super().__init__() - self._binary_location = "" + self._binary_location = "" self._preferences: dict = {} # Firefox 129 onwards the CDP protocol will not be enabled by default. Setting this preference will enable it. # https://fxdx.dev/deprecating-cdp-support-in-firefox-embracing-the-future-with-webdriver-bidi/. - self._preferences["remote.active-protocols"] = 3 + self._preferences["remote.active-protocols"] = 3 self._profile: Optional[FirefoxProfile] = None self.log = Log() @property - @deprecated("use binary_location instead") + @deprecated("use binary_location instead") def binary(self) -> FirefoxBinary: - """Returns the FirefoxBinary instance.""" + """Returns the FirefoxBinary instance.""" return FirefoxBinary(self._binary_location) @binary.setter - @deprecated("use binary_location instead") + @deprecated("use binary_location instead") def binary(self, new_binary: Union[str, FirefoxBinary]) -> None: - """Sets location of the browser binary, either by string or - ``FirefoxBinary`` instance.""" + """Sets location of the browser binary, either by string or + ``FirefoxBinary`` instance.""" if isinstance(new_binary, FirefoxBinary): new_binary = new_binary._start_cmd self.binary_location = str(new_binary) @property def binary_location(self) -> str: - """:Returns: The location of the binary.""" + """:Returns: The location of the binary.""" return self._binary_location @binary_location.setter # noqa def binary_location(self, value: str) -> None: - """Sets the location of the browser binary by string.""" + """Sets the location of the browser binary by string.""" if not isinstance(value, str): raise TypeError(self.BINARY_LOCATION_ERROR) self._binary_location = value @property def preferences(self) -> dict: - """:Returns: A dict of preferences.""" + """:Returns: A dict of preferences.""" return self._preferences -
[docs] def set_preference(self, name: str, value: Union[str, int, bool]): - """Sets a preference.""" +
+[docs] + def set_preference(self, name: str, value: Union[str, int, bool]): + """Sets a preference.""" self._preferences[name] = value
+ @property def profile(self) -> Optional[FirefoxProfile]: - """:Returns: The Firefox profile to use.""" + """:Returns: The Firefox profile to use.""" return self._profile @profile.setter def profile(self, new_profile: Union[str, FirefoxProfile]) -> None: - """Sets location of the browser profile to use, either by string or - ``FirefoxProfile``.""" + """Sets location of the browser profile to use, either by string or + ``FirefoxProfile``.""" if not isinstance(new_profile, FirefoxProfile): new_profile = FirefoxProfile(new_profile) self._profile = new_profile -
[docs] def enable_mobile( - self, android_package: Optional[str] = "org.mozilla.firefox", android_activity=None, device_serial=None +
+[docs] + def enable_mobile( + self, android_package: Optional[str] = "org.mozilla.firefox", android_activity=None, device_serial=None ): super().enable_mobile(android_package, android_activity, device_serial)
-
[docs] def to_capabilities(self) -> dict: - """Marshals the Firefox options to a `moz:firefoxOptions` object.""" + +
+[docs] + def to_capabilities(self) -> dict: + """Marshals the Firefox options to a `moz:firefoxOptions` object.""" # This intentionally looks at the internal properties # so if a binary or profile has _not_ been set, # it will defer to geckodriver to find the system Firefox @@ -152,13 +324,13 @@

Source code for selenium.webdriver.firefox.options

opts: Dict[str, Any] = {} if self._binary_location: - opts["binary"] = self._binary_location + opts["binary"] = self._binary_location if self._preferences: - opts["prefs"] = self._preferences + opts["prefs"] = self._preferences if self._profile: - opts["profile"] = self._profile.encoded + opts["profile"] = self._profile.encoded if self._arguments: - opts["args"] = self._arguments + opts["args"] = self._arguments if self.mobile_options: opts.update(self.mobile_options) @@ -169,47 +341,39 @@

Source code for selenium.webdriver.firefox.options

return caps
+ @property def default_capabilities(self) -> dict: return DesiredCapabilities.FIREFOX.copy()
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/firefox/remote_connection.html b/docs/api/py/_modules/selenium/webdriver/firefox/remote_connection.html index 27bd73e72a26b..0e68ac41ed7f4 100644 --- a/docs/api/py/_modules/selenium/webdriver/firefox/remote_connection.html +++ b/docs/api/py/_modules/selenium/webdriver/firefox/remote_connection.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.firefox.remote_connection — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.firefox.remote_connection — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.firefox.remote_connection

+  

Source code for selenium.webdriver.firefox.remote_connection

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -60,8 +216,10 @@ 

Source code for selenium.webdriver.firefox.remote_connection

from selenium.webdriver.remote.remote_connection import RemoteConnection -
[docs]class FirefoxRemoteConnection(RemoteConnection): - browser_name = DesiredCapabilities.FIREFOX["browserName"] +
+[docs] +class FirefoxRemoteConnection(RemoteConnection): + browser_name = DesiredCapabilities.FIREFOX["browserName"] def __init__( self, @@ -78,49 +236,40 @@

Source code for selenium.webdriver.firefox.remote_connection

client_config=client_config, ) - self._commands["GET_CONTEXT"] = ("GET", "/session/$sessionId/moz/context") - self._commands["SET_CONTEXT"] = ("POST", "/session/$sessionId/moz/context") - self._commands["INSTALL_ADDON"] = ("POST", "/session/$sessionId/moz/addon/install") - self._commands["UNINSTALL_ADDON"] = ("POST", "/session/$sessionId/moz/addon/uninstall") - self._commands["FULL_PAGE_SCREENSHOT"] = ("GET", "/session/$sessionId/moz/screenshot/full")
+ self._commands["GET_CONTEXT"] = ("GET", "/session/$sessionId/moz/context") + self._commands["SET_CONTEXT"] = ("POST", "/session/$sessionId/moz/context") + self._commands["INSTALL_ADDON"] = ("POST", "/session/$sessionId/moz/addon/install") + self._commands["UNINSTALL_ADDON"] = ("POST", "/session/$sessionId/moz/addon/uninstall") + self._commands["FULL_PAGE_SCREENSHOT"] = ("GET", "/session/$sessionId/moz/screenshot/full")
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/firefox/service.html b/docs/api/py/_modules/selenium/webdriver/firefox/service.html index 29e27e1835bd3..7d239e4136693 100644 --- a/docs/api/py/_modules/selenium/webdriver/firefox/service.html +++ b/docs/api/py/_modules/selenium/webdriver/firefox/service.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.firefox.service — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.firefox.service — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.firefox.service

+  

Source code for selenium.webdriver.firefox.service

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -61,8 +217,10 @@ 

Source code for selenium.webdriver.firefox.service

from selenium.webdriver.common import utils -
[docs]class Service(service.Service): - """A Service class that is responsible for the starting and stopping of +
+[docs] +class Service(service.Service): + """A Service class that is responsible for the starting and stopping of `geckodriver`. :param executable_path: install path of the geckodriver executable, defaults to `geckodriver`. @@ -71,7 +229,7 @@

Source code for selenium.webdriver.firefox.service

:param log_output: (Optional) int representation of STDOUT/DEVNULL, any IO instance or String path to file. :param env: (Optional) Mapping of environment variables for the new process, defaults to `os.environ`. :param driver_path_env_key: (Optional) Environment variable to use to get the path to the driver executable. - """ + """ def __init__( self, @@ -84,7 +242,7 @@

Source code for selenium.webdriver.firefox.service

**kwargs, ) -> None: self.service_args = service_args or [] - driver_path_env_key = driver_path_env_key or "SE_GECKODRIVER" + driver_path_env_key = driver_path_env_key or "SE_GECKODRIVER" super().__init__( executable_path=executable_path, @@ -96,50 +254,44 @@

Source code for selenium.webdriver.firefox.service

) # Set a port for CDP - if "--connect-existing" not in self.service_args: - self.service_args.append("--websocket-port") - self.service_args.append(f"{utils.free_port()}") + if "--connect-existing" not in self.service_args: + self.service_args.append("--websocket-port") + self.service_args.append(f"{utils.free_port()}") + +
+[docs] + def command_line_args(self) -> List[str]: + return ["--port", f"{self.port}"] + self.service_args
+
-
[docs] def command_line_args(self) -> List[str]: - return ["--port", f"{self.port}"] + self.service_args
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/firefox/webdriver.html b/docs/api/py/_modules/selenium/webdriver/firefox/webdriver.html index 178a91f9330ac..b063892451910 100644 --- a/docs/api/py/_modules/selenium/webdriver/firefox/webdriver.html +++ b/docs/api/py/_modules/selenium/webdriver/firefox/webdriver.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.firefox.webdriver — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.firefox.webdriver — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.firefox.webdriver

+  

Source code for selenium.webdriver.firefox.webdriver

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -67,11 +223,13 @@ 

Source code for selenium.webdriver.firefox.webdriver

from .service import Service -
[docs]class WebDriver(RemoteWebDriver): - """Controls the GeckoDriver and allows you to drive the browser.""" +
+[docs] +class WebDriver(RemoteWebDriver): + """Controls the GeckoDriver and allows you to drive the browser.""" - CONTEXT_CHROME = "chrome" - CONTEXT_CONTENT = "content" + CONTEXT_CHROME = "chrome" + CONTEXT_CONTENT = "content" def __init__( self, @@ -79,14 +237,14 @@

Source code for selenium.webdriver.firefox.webdriver

service: Service = None, keep_alive: bool = True, ) -> None: - """Creates a new instance of the Firefox driver. Starts the service and + """Creates a new instance of the Firefox driver. Starts the service and then creates new instance of Firefox driver. :Args: - options - Instance of ``options.Options``. - service - (Optional) service instance for managing the starting and stopping of the driver. - keep_alive - Whether to configure remote_connection.RemoteConnection to use HTTP keep-alive. - """ + """ self.service = service if service else Service() options = options if options else Options() @@ -113,22 +271,30 @@

Source code for selenium.webdriver.firefox.webdriver

self._is_remote = False -
[docs] def quit(self) -> None: - """Closes the browser and shuts down the GeckoDriver executable.""" +
+[docs] + def quit(self) -> None: + """Closes the browser and shuts down the GeckoDriver executable.""" try: super().quit() except Exception: - # We don't care about the message because something probably has gone wrong + # We don't care about the message because something probably has gone wrong pass finally: self.service.stop()
-
[docs] def set_context(self, context) -> None: - self.execute("SET_CONTEXT", {"context": context})
-
[docs] @contextmanager +
+[docs] + def set_context(self, context) -> None: + self.execute("SET_CONTEXT", {"context": context})
+ + +
+[docs] + @contextmanager def context(self, context): - """Sets the context that Selenium commands are running in using a + """Sets the context that Selenium commands are running in using a `with` statement. The state of the context on the server is saved before entering the block, and restored upon exiting it. @@ -140,16 +306,19 @@

Source code for selenium.webdriver.firefox.webdriver

with selenium.context(selenium.CONTEXT_CHROME): # chrome scope ... do stuff ... - """ - initial_context = self.execute("GET_CONTEXT").pop("value") + """ + initial_context = self.execute("GET_CONTEXT").pop("value") self.set_context(context) try: yield finally: self.set_context(initial_context)
-
[docs] def install_addon(self, path, temporary=False) -> str: - """Installs Firefox addon. + +
+[docs] + def install_addon(self, path, temporary=False) -> str: + """Installs Firefox addon. Returns identifier of installed addon. This identifier can later be used to uninstall addon. @@ -160,8 +329,8 @@

Source code for selenium.webdriver.firefox.webdriver

:Usage: :: - driver.install_addon('/path/to/firebug.xpi') - """ + driver.install_addon('/path/to/firebug.xpi') + """ if os.path.isdir(path): fp = BytesIO() @@ -169,31 +338,37 @@

Source code for selenium.webdriver.firefox.webdriver

path = os.path.normpath(path) # account for trailing slash that will be added by os.walk() path_root = len(path) + 1 - with zipfile.ZipFile(fp, "w", zipfile.ZIP_DEFLATED) as zipped: + with zipfile.ZipFile(fp, "w", zipfile.ZIP_DEFLATED, strict_timestamps=False) as zipped: for base, _, files in os.walk(path): for fyle in files: filename = os.path.join(base, fyle) zipped.write(filename, filename[path_root:]) - addon = base64.b64encode(fp.getvalue()).decode("UTF-8") + addon = base64.b64encode(fp.getvalue()).decode("UTF-8") else: - with open(path, "rb") as file: - addon = base64.b64encode(file.read()).decode("UTF-8") + with open(path, "rb") as file: + addon = base64.b64encode(file.read()).decode("UTF-8") + + payload = {"addon": addon, "temporary": temporary} + return self.execute("INSTALL_ADDON", payload)["value"]
- payload = {"addon": addon, "temporary": temporary} - return self.execute("INSTALL_ADDON", payload)["value"]
-
[docs] def uninstall_addon(self, identifier) -> None: - """Uninstalls Firefox addon using its identifier. +
+[docs] + def uninstall_addon(self, identifier) -> None: + """Uninstalls Firefox addon using its identifier. :Usage: :: - driver.uninstall_addon('addon@foo.com') - """ - self.execute("UNINSTALL_ADDON", {"id": identifier})
+ driver.uninstall_addon('addon@foo.com') + """ + self.execute("UNINSTALL_ADDON", {"id": identifier})
+ -
[docs] def get_full_page_screenshot_as_file(self, filename) -> bool: - """Saves a full document screenshot of the current window to a PNG +
+[docs] + def get_full_page_screenshot_as_file(self, filename) -> bool: + """Saves a full document screenshot of the current window to a PNG image file. Returns False if there is any IOError, else returns True. Use full paths in your filename. @@ -204,16 +379,16 @@

Source code for selenium.webdriver.firefox.webdriver

:Usage: :: - driver.get_full_page_screenshot_as_file('/Screenshots/foo.png') - """ - if not filename.lower().endswith(".png"): + driver.get_full_page_screenshot_as_file('/Screenshots/foo.png') + """ + if not filename.lower().endswith(".png"): warnings.warn( - "name used for saved screenshot does not match file type. It should end with a `.png` extension", + "name used for saved screenshot does not match file type. It should end with a `.png` extension", UserWarning, ) png = self.get_full_page_screenshot_as_png() try: - with open(filename, "wb") as f: + with open(filename, "wb") as f: f.write(png) except OSError: return False @@ -221,8 +396,11 @@

Source code for selenium.webdriver.firefox.webdriver

del png return True
-
[docs] def save_full_page_screenshot(self, filename) -> bool: - """Saves a full document screenshot of the current window to a PNG + +
+[docs] + def save_full_page_screenshot(self, filename) -> bool: + """Saves a full document screenshot of the current window to a PNG image file. Returns False if there is any IOError, else returns True. Use full paths in your filename. @@ -233,69 +411,67 @@

Source code for selenium.webdriver.firefox.webdriver

:Usage: :: - driver.save_full_page_screenshot('/Screenshots/foo.png') - """ + driver.save_full_page_screenshot('/Screenshots/foo.png') + """ return self.get_full_page_screenshot_as_file(filename)
-
[docs] def get_full_page_screenshot_as_png(self) -> bytes: - """Gets the full document screenshot of the current window as a binary + +
+[docs] + def get_full_page_screenshot_as_png(self) -> bytes: + """Gets the full document screenshot of the current window as a binary data. :Usage: :: driver.get_full_page_screenshot_as_png() - """ - return base64.b64decode(self.get_full_page_screenshot_as_base64().encode("ascii"))
+ """ + return base64.b64decode(self.get_full_page_screenshot_as_base64().encode("ascii"))
-
[docs] def get_full_page_screenshot_as_base64(self) -> str: - """Gets the full document screenshot of the current window as a base64 + +
+[docs] + def get_full_page_screenshot_as_base64(self) -> str: + """Gets the full document screenshot of the current window as a base64 encoded string which is useful in embedded images in HTML. :Usage: :: driver.get_full_page_screenshot_as_base64() - """ - return self.execute("FULL_PAGE_SCREENSHOT")["value"]
+ """ + return self.execute("FULL_PAGE_SCREENSHOT")["value"]
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/ie/options.html b/docs/api/py/_modules/selenium/webdriver/ie/options.html index a1fcc9ed2c051..ca56abcf9b07e 100644 --- a/docs/api/py/_modules/selenium/webdriver/ie/options.html +++ b/docs/api/py/_modules/selenium/webdriver/ie/options.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.ie.options — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.ie.options — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.ie.options

+  

Source code for selenium.webdriver.ie.options

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -60,13 +216,16 @@ 

Source code for selenium.webdriver.ie.options

from selenium.webdriver.common.options import ArgOptions -
[docs]class ElementScrollBehavior(Enum): +
+[docs] +class ElementScrollBehavior(Enum): TOP = 0 BOTTOM = 1
+ class _IeOptionsDescriptor: - """_IeOptionsDescriptor is an implementation of Descriptor Protocol: + """_IeOptionsDescriptor is an implementation of Descriptor Protocol: : Any look-up or assignment to the below attributes in `Options` class will be intercepted by `__get__` and `__set__` method respectively. @@ -100,7 +259,7 @@

Source code for selenium.webdriver.ie.options

`self.browser_attach_timeout` = 30 `__set__` method sets/updates the value of the key `browserAttachTimeout` in `_options` dictionary in `Options` class. - """ + """ def __init__(self, name, expected_type): self.name = name @@ -111,294 +270,296 @@

Source code for selenium.webdriver.ie.options

def __set__(self, obj, value) -> None: if not isinstance(value, self.expected_type): - raise ValueError(f"{self.name} should be of type {self.expected_type.__name__}") + raise ValueError(f"{self.name} should be of type {self.expected_type.__name__}") - if self.name == "elementScrollBehavior" and value not in [ + if self.name == "elementScrollBehavior" and value not in [ ElementScrollBehavior.TOP, ElementScrollBehavior.BOTTOM, ]: - raise ValueError("Element Scroll Behavior out of range.") + raise ValueError("Element Scroll Behavior out of range.") obj._options[self.name] = value -
[docs]class Options(ArgOptions): - KEY = "se:ieOptions" - SWITCHES = "ie.browserCommandLineSwitches" - - BROWSER_ATTACH_TIMEOUT = "browserAttachTimeout" - ELEMENT_SCROLL_BEHAVIOR = "elementScrollBehavior" - ENSURE_CLEAN_SESSION = "ie.ensureCleanSession" - FILE_UPLOAD_DIALOG_TIMEOUT = "ie.fileUploadDialogTimeout" - FORCE_CREATE_PROCESS_API = "ie.forceCreateProcessApi" - FORCE_SHELL_WINDOWS_API = "ie.forceShellWindowsApi" - FULL_PAGE_SCREENSHOT = "ie.enableFullPageScreenshot" - IGNORE_PROTECTED_MODE_SETTINGS = "ignoreProtectedModeSettings" - IGNORE_ZOOM_LEVEL = "ignoreZoomSetting" - INITIAL_BROWSER_URL = "initialBrowserUrl" - NATIVE_EVENTS = "nativeEvents" - PERSISTENT_HOVER = "enablePersistentHover" - REQUIRE_WINDOW_FOCUS = "requireWindowFocus" - USE_PER_PROCESS_PROXY = "ie.usePerProcessProxy" - USE_LEGACY_FILE_UPLOAD_DIALOG_HANDLING = "ie.useLegacyFileUploadDialogHandling" - ATTACH_TO_EDGE_CHROME = "ie.edgechromium" - EDGE_EXECUTABLE_PATH = "ie.edgepath" - IGNORE_PROCESS_MATCH = "ie.ignoreprocessmatch" +
+[docs] +class Options(ArgOptions): + KEY = "se:ieOptions" + SWITCHES = "ie.browserCommandLineSwitches" + + BROWSER_ATTACH_TIMEOUT = "browserAttachTimeout" + ELEMENT_SCROLL_BEHAVIOR = "elementScrollBehavior" + ENSURE_CLEAN_SESSION = "ie.ensureCleanSession" + FILE_UPLOAD_DIALOG_TIMEOUT = "ie.fileUploadDialogTimeout" + FORCE_CREATE_PROCESS_API = "ie.forceCreateProcessApi" + FORCE_SHELL_WINDOWS_API = "ie.forceShellWindowsApi" + FULL_PAGE_SCREENSHOT = "ie.enableFullPageScreenshot" + IGNORE_PROTECTED_MODE_SETTINGS = "ignoreProtectedModeSettings" + IGNORE_ZOOM_LEVEL = "ignoreZoomSetting" + INITIAL_BROWSER_URL = "initialBrowserUrl" + NATIVE_EVENTS = "nativeEvents" + PERSISTENT_HOVER = "enablePersistentHover" + REQUIRE_WINDOW_FOCUS = "requireWindowFocus" + USE_PER_PROCESS_PROXY = "ie.usePerProcessProxy" + USE_LEGACY_FILE_UPLOAD_DIALOG_HANDLING = "ie.useLegacyFileUploadDialogHandling" + ATTACH_TO_EDGE_CHROME = "ie.edgechromium" + EDGE_EXECUTABLE_PATH = "ie.edgepath" + IGNORE_PROCESS_MATCH = "ie.ignoreprocessmatch" # Creating descriptor objects for each of the above IE options browser_attach_timeout = _IeOptionsDescriptor(BROWSER_ATTACH_TIMEOUT, int) - """Gets and Sets `browser_attach_timeout` + """Gets and Sets `browser_attach_timeout` - Usage - ----- + Usage: + ------ - Get - `self.browser_attach_timeout` - Set - `self.browser_attach_timeout` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `int` (Timeout) in milliseconds - """ + """ element_scroll_behavior = _IeOptionsDescriptor(ELEMENT_SCROLL_BEHAVIOR, Enum) - """Gets and Sets `element_scroll_behavior` + """Gets and Sets `element_scroll_behavior` - Usage - ----- + Usage: + ------ - Get - `self.element_scroll_behavior` - Set - `self.element_scroll_behavior` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `int` either 0 - Top, 1 - Bottom - """ + """ ensure_clean_session = _IeOptionsDescriptor(ENSURE_CLEAN_SESSION, bool) - """Gets and Sets `ensure_clean_session` + """Gets and Sets `ensure_clean_session` - Usage - ----- + Usage: + ------ - Get - `self.ensure_clean_session` - Set - `self.ensure_clean_session` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - """ + """ file_upload_dialog_timeout = _IeOptionsDescriptor(FILE_UPLOAD_DIALOG_TIMEOUT, int) - """Gets and Sets `file_upload_dialog_timeout` + """Gets and Sets `file_upload_dialog_timeout` - Usage - ----- + Usage: + ------ - Get - `self.file_upload_dialog_timeout` - Set - `self.file_upload_dialog_timeout` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `int` (Timeout) in milliseconds - """ + """ force_create_process_api = _IeOptionsDescriptor(FORCE_CREATE_PROCESS_API, bool) - """Gets and Sets `force_create_process_api` + """Gets and Sets `force_create_process_api` - Usage - ----- + Usage: + ------ - Get - `self.force_create_process_api` - Set - `self.force_create_process_api` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - """ + """ force_shell_windows_api = _IeOptionsDescriptor(FORCE_SHELL_WINDOWS_API, bool) - """Gets and Sets `force_shell_windows_api` + """Gets and Sets `force_shell_windows_api` - Usage - ----- + Usage: + ------ - Get - `self.force_shell_windows_api` - Set - `self.force_shell_windows_api` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - """ + """ full_page_screenshot = _IeOptionsDescriptor(FULL_PAGE_SCREENSHOT, bool) - """Gets and Sets `full_page_screenshot` + """Gets and Sets `full_page_screenshot` - Usage - ----- + Usage: + ------ - Get - `self.full_page_screenshot` - Set - `self.full_page_screenshot` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - """ + """ ignore_protected_mode_settings = _IeOptionsDescriptor(IGNORE_PROTECTED_MODE_SETTINGS, bool) - """Gets and Sets `ignore_protected_mode_settings` + """Gets and Sets `ignore_protected_mode_settings` - Usage - ----- + Usage: + ------ - Get - `self.ignore_protected_mode_settings` - Set - `self.ignore_protected_mode_settings` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - """ + """ ignore_zoom_level = _IeOptionsDescriptor(IGNORE_ZOOM_LEVEL, bool) - """Gets and Sets `ignore_zoom_level` + """Gets and Sets `ignore_zoom_level` - Usage - ----- + Usage: + ------ - Get - `self.ignore_zoom_level` - Set - `self.ignore_zoom_level` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - """ + """ initial_browser_url = _IeOptionsDescriptor(INITIAL_BROWSER_URL, str) - """Gets and Sets `initial_browser_url` + """Gets and Sets `initial_browser_url` - Usage - ----- + Usage: + ------ - Get - `self.initial_browser_url` - Set - `self.initial_browser_url` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `str` - """ + """ native_events = _IeOptionsDescriptor(NATIVE_EVENTS, bool) - """Gets and Sets `native_events` + """Gets and Sets `native_events` - Usage - ----- + Usage: + ------ - Get - `self.native_events` - Set - `self.native_events` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - """ + """ persistent_hover = _IeOptionsDescriptor(PERSISTENT_HOVER, bool) - """Gets and Sets `persistent_hover` + """Gets and Sets `persistent_hover` - Usage - ----- + Usage: + ------ - Get - `self.persistent_hover` - Set - `self.persistent_hover` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - """ + """ require_window_focus = _IeOptionsDescriptor(REQUIRE_WINDOW_FOCUS, bool) - """Gets and Sets `require_window_focus` + """Gets and Sets `require_window_focus` - Usage - ----- + Usage: + ------ - Get - `self.require_window_focus` - Set - `self.require_window_focus` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - """ + """ use_per_process_proxy = _IeOptionsDescriptor(USE_PER_PROCESS_PROXY, bool) - """Gets and Sets `use_per_process_proxy` + """Gets and Sets `use_per_process_proxy` - Usage - ----- + Usage: + ------ - Get - `self.use_per_process_proxy` - Set - `self.use_per_process_proxy` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - """ + """ use_legacy_file_upload_dialog_handling = _IeOptionsDescriptor(USE_LEGACY_FILE_UPLOAD_DIALOG_HANDLING, bool) - """Gets and Sets `use_legacy_file_upload_dialog_handling` + """Gets and Sets `use_legacy_file_upload_dialog_handling` - Usage - ----- + Usage: + ------ - Get - `self.use_legacy_file_upload_dialog_handling` - Set - `self.use_legacy_file_upload_dialog_handling` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - """ + """ attach_to_edge_chrome = _IeOptionsDescriptor(ATTACH_TO_EDGE_CHROME, bool) - """Gets and Sets `attach_to_edge_chrome` + """Gets and Sets `attach_to_edge_chrome` - Usage - ----- + Usage: + ------ - Get - `self.attach_to_edge_chrome` - Set - `self.attach_to_edge_chrome` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - """ + """ edge_executable_path = _IeOptionsDescriptor(EDGE_EXECUTABLE_PATH, str) - """Gets and Sets `edge_executable_path` + """Gets and Sets `edge_executable_path` - Usage - ----- + Usage: + ------ - Get - `self.edge_executable_path` - Set - `self.edge_executable_path` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `str` - """ + """ def __init__(self) -> None: super().__init__() @@ -407,30 +568,35 @@

Source code for selenium.webdriver.ie.options

@property def options(self) -> dict: - """:Returns: A dictionary of browser options.""" + """:Returns: A dictionary of browser options.""" return self._options @property def additional_options(self) -> dict: - """:Returns: The additional options.""" + """:Returns: The additional options.""" return self._additional -
[docs] def add_additional_option(self, name: str, value) -> None: - """Adds an additional option not yet added as a safe option for IE. +
+[docs] + def add_additional_option(self, name: str, value) -> None: + """Adds an additional option not yet added as a safe option for IE. :Args: - name: name of the option to add - value: value of the option to add - """ + """ self._additional[name] = value
-
[docs] def to_capabilities(self) -> dict: - """Marshals the IE options to the correct object.""" + +
+[docs] + def to_capabilities(self) -> dict: + """Marshals the IE options to the correct object.""" caps = self._caps opts = self._options.copy() if self._arguments: - opts[self.SWITCHES] = " ".join(self._arguments) + opts[self.SWITCHES] = " ".join(self._arguments) if self._additional: opts.update(self._additional) @@ -439,47 +605,39 @@

Source code for selenium.webdriver.ie.options

caps[Options.KEY] = opts return caps
+ @property def default_capabilities(self) -> dict: return DesiredCapabilities.INTERNETEXPLORER.copy()
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/ie/service.html b/docs/api/py/_modules/selenium/webdriver/ie/service.html index c9ba0adcf0ac9..33076b291c238 100644 --- a/docs/api/py/_modules/selenium/webdriver/ie/service.html +++ b/docs/api/py/_modules/selenium/webdriver/ie/service.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.ie.service — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.ie.service — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.ie.service

+  

Source code for selenium.webdriver.ie.service

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -59,8 +215,10 @@ 

Source code for selenium.webdriver.ie.service

from selenium.webdriver.common import service -
[docs]class Service(service.Service): - """Object that manages the starting and stopping of the IEDriver.""" +
+[docs] +class Service(service.Service): + """Object that manages the starting and stopping of the IEDriver.""" def __init__( self, @@ -73,24 +231,24 @@

Source code for selenium.webdriver.ie.service

driver_path_env_key: str = None, **kwargs, ) -> None: - """Creates a new instance of the Service. + """Creates a new instance of the Service. :Args: - executable_path : Path to the IEDriver - port : Port the service is running on - host : IP address the service port is bound - - log_level : Level of logging of service, may be "FATAL", "ERROR", "WARN", "INFO", "DEBUG", "TRACE". - Default is "FATAL". + - log_level : Level of logging of service, may be "FATAL", "ERROR", "WARN", "INFO", "DEBUG", "TRACE". + Default is "FATAL". - log_output: (Optional) int representation of STDOUT/DEVNULL, any IO instance or String path to file. - Default is "stdout". - """ + Default is "stdout". + """ self.service_args = service_args or [] - driver_path_env_key = driver_path_env_key or "SE_IEDRIVER" + driver_path_env_key = driver_path_env_key or "SE_IEDRIVER" if host: - self.service_args.append(f"--host={host}") + self.service_args.append(f"--host={host}") if log_level: - self.service_args.append(f"--log-level={log_level}") + self.service_args.append(f"--log-level={log_level}") super().__init__( executable_path=executable_path, @@ -100,46 +258,40 @@

Source code for selenium.webdriver.ie.service

**kwargs, ) -
[docs] def command_line_args(self) -> List[str]: - return [f"--port={self.port}"] + self.service_args
+
+[docs] + def command_line_args(self) -> List[str]: + return [f"--port={self.port}"] + self.service_args
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/ie/webdriver.html b/docs/api/py/_modules/selenium/webdriver/ie/webdriver.html index 81def80df3f34..b8e84e67b7999 100644 --- a/docs/api/py/_modules/selenium/webdriver/ie/webdriver.html +++ b/docs/api/py/_modules/selenium/webdriver/ie/webdriver.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.ie.webdriver — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.ie.webdriver — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.ie.webdriver

+  

Source code for selenium.webdriver.ie.webdriver

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -62,9 +218,11 @@ 

Source code for selenium.webdriver.ie.webdriver

< from .service import Service -
[docs]class WebDriver(RemoteWebDriver): - """Controls the IEServerDriver and allows you to drive Internet - Explorer.""" +
+[docs] +class WebDriver(RemoteWebDriver): + """Controls the IEServerDriver and allows you to drive Internet + Explorer.""" def __init__( self, @@ -72,7 +230,7 @@

Source code for selenium.webdriver.ie.webdriver

< service: Service = None, keep_alive: bool = True, ) -> None: - """Creates a new instance of the Ie driver. + """Creates a new instance of the Ie driver. Starts the service and then creates new instance of Ie driver. @@ -80,7 +238,7 @@

Source code for selenium.webdriver.ie.webdriver

< - options - IE Options instance, providing additional IE options - service - (Optional) service instance for managing the starting and stopping of the driver. - keep_alive - Whether to configure RemoteConnection to use HTTP keep-alive. - """ + """ self.service = service if service else Service() options = options if options else Options() @@ -102,53 +260,47 @@

Source code for selenium.webdriver.ie.webdriver

< self._is_remote = False -
[docs] def quit(self) -> None: - """Closes the browser and shuts down the IEServerDriver executable.""" +
+[docs] + def quit(self) -> None: + """Closes the browser and shuts down the IEServerDriver executable.""" try: super().quit() except Exception: - # We don't care about the message because something probably has gone wrong + # We don't care about the message because something probably has gone wrong pass finally: - self.service.stop()
+ self.service.stop()
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/remote/bidi_connection.html b/docs/api/py/_modules/selenium/webdriver/remote/bidi_connection.html index 2af5d41e092b0..87eddfb38bf13 100644 --- a/docs/api/py/_modules/selenium/webdriver/remote/bidi_connection.html +++ b/docs/api/py/_modules/selenium/webdriver/remote/bidi_connection.html @@ -1,102 +1,251 @@ - + - selenium.webdriver.remote.bidi_connection — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.remote.bidi_connection — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.remote.bidi_connection

+  

Source code for selenium.webdriver.remote.bidi_connection

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
 
 
-
[docs]class BidiConnection: +
+[docs] +class BidiConnection: def __init__(self, session, cdp, devtools_import) -> None: self.session = session self.cdp = cdp self.devtools = devtools_import
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/remote/command.html b/docs/api/py/_modules/selenium/webdriver/remote/command.html index 4cb55d5874ba8..7d2399a2c54b2 100644 --- a/docs/api/py/_modules/selenium/webdriver/remote/command.html +++ b/docs/api/py/_modules/selenium/webdriver/remote/command.html @@ -1,213 +1,362 @@ - + - selenium.webdriver.remote.command — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.remote.command — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.remote.command

+  

Source code for selenium.webdriver.remote.command

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
 
 
-
[docs]class Command: - """Defines constants for the standard WebDriver commands. +
+[docs] +class Command: + """Defines constants for the standard WebDriver commands. While these constants have no meaning in and of themselves, they are - used to marshal commands through a service that implements WebDriver's + used to marshal commands through a service that implements WebDriver's remote wire protocol: https://w3c.github.io/webdriver/ - """ - - NEW_SESSION: str = "newSession" - DELETE_SESSION: str = "deleteSession" - NEW_WINDOW: str = "newWindow" - CLOSE: str = "close" - QUIT: str = "quit" - GET: str = "get" - GO_BACK: str = "goBack" - GO_FORWARD: str = "goForward" - REFRESH: str = "refresh" - ADD_COOKIE: str = "addCookie" - GET_COOKIE: str = "getCookie" - GET_ALL_COOKIES: str = "getCookies" - DELETE_COOKIE: str = "deleteCookie" - DELETE_ALL_COOKIES: str = "deleteAllCookies" - FIND_ELEMENT: str = "findElement" - FIND_ELEMENTS: str = "findElements" - FIND_CHILD_ELEMENT: str = "findChildElement" - FIND_CHILD_ELEMENTS: str = "findChildElements" - CLEAR_ELEMENT: str = "clearElement" - CLICK_ELEMENT: str = "clickElement" - SEND_KEYS_TO_ELEMENT: str = "sendKeysToElement" - W3C_GET_CURRENT_WINDOW_HANDLE: str = "w3cGetCurrentWindowHandle" - W3C_GET_WINDOW_HANDLES: str = "w3cGetWindowHandles" - SET_WINDOW_RECT: str = "setWindowRect" - GET_WINDOW_RECT: str = "getWindowRect" - SWITCH_TO_WINDOW: str = "switchToWindow" - SWITCH_TO_FRAME: str = "switchToFrame" - SWITCH_TO_PARENT_FRAME: str = "switchToParentFrame" - W3C_GET_ACTIVE_ELEMENT: str = "w3cGetActiveElement" - GET_CURRENT_URL: str = "getCurrentUrl" - GET_PAGE_SOURCE: str = "getPageSource" - GET_TITLE: str = "getTitle" - W3C_EXECUTE_SCRIPT: str = "w3cExecuteScript" - W3C_EXECUTE_SCRIPT_ASYNC: str = "w3cExecuteScriptAsync" - GET_ELEMENT_TEXT: str = "getElementText" - GET_ELEMENT_TAG_NAME: str = "getElementTagName" - IS_ELEMENT_SELECTED: str = "isElementSelected" - IS_ELEMENT_ENABLED: str = "isElementEnabled" - GET_ELEMENT_RECT: str = "getElementRect" - GET_ELEMENT_ATTRIBUTE: str = "getElementAttribute" - GET_ELEMENT_PROPERTY: str = "getElementProperty" - GET_ELEMENT_VALUE_OF_CSS_PROPERTY: str = "getElementValueOfCssProperty" - GET_ELEMENT_ARIA_ROLE: str = "getElementAriaRole" - GET_ELEMENT_ARIA_LABEL: str = "getElementAriaLabel" - SCREENSHOT: str = "screenshot" - ELEMENT_SCREENSHOT: str = "elementScreenshot" - EXECUTE_ASYNC_SCRIPT: str = "executeAsyncScript" - SET_TIMEOUTS: str = "setTimeouts" - GET_TIMEOUTS: str = "getTimeouts" - W3C_MAXIMIZE_WINDOW: str = "w3cMaximizeWindow" - GET_LOG: str = "getLog" - GET_AVAILABLE_LOG_TYPES: str = "getAvailableLogTypes" - FULLSCREEN_WINDOW: str = "fullscreenWindow" - MINIMIZE_WINDOW: str = "minimizeWindow" - PRINT_PAGE: str = "printPage" + """ + + NEW_SESSION: str = "newSession" + DELETE_SESSION: str = "deleteSession" + NEW_WINDOW: str = "newWindow" + CLOSE: str = "close" + QUIT: str = "quit" + GET: str = "get" + GO_BACK: str = "goBack" + GO_FORWARD: str = "goForward" + REFRESH: str = "refresh" + ADD_COOKIE: str = "addCookie" + GET_COOKIE: str = "getCookie" + GET_ALL_COOKIES: str = "getCookies" + DELETE_COOKIE: str = "deleteCookie" + DELETE_ALL_COOKIES: str = "deleteAllCookies" + FIND_ELEMENT: str = "findElement" + FIND_ELEMENTS: str = "findElements" + FIND_CHILD_ELEMENT: str = "findChildElement" + FIND_CHILD_ELEMENTS: str = "findChildElements" + CLEAR_ELEMENT: str = "clearElement" + CLICK_ELEMENT: str = "clickElement" + SEND_KEYS_TO_ELEMENT: str = "sendKeysToElement" + W3C_GET_CURRENT_WINDOW_HANDLE: str = "w3cGetCurrentWindowHandle" + W3C_GET_WINDOW_HANDLES: str = "w3cGetWindowHandles" + SET_WINDOW_RECT: str = "setWindowRect" + GET_WINDOW_RECT: str = "getWindowRect" + SWITCH_TO_WINDOW: str = "switchToWindow" + SWITCH_TO_FRAME: str = "switchToFrame" + SWITCH_TO_PARENT_FRAME: str = "switchToParentFrame" + W3C_GET_ACTIVE_ELEMENT: str = "w3cGetActiveElement" + GET_CURRENT_URL: str = "getCurrentUrl" + GET_PAGE_SOURCE: str = "getPageSource" + GET_TITLE: str = "getTitle" + W3C_EXECUTE_SCRIPT: str = "w3cExecuteScript" + W3C_EXECUTE_SCRIPT_ASYNC: str = "w3cExecuteScriptAsync" + GET_ELEMENT_TEXT: str = "getElementText" + GET_ELEMENT_TAG_NAME: str = "getElementTagName" + IS_ELEMENT_SELECTED: str = "isElementSelected" + IS_ELEMENT_ENABLED: str = "isElementEnabled" + GET_ELEMENT_RECT: str = "getElementRect" + GET_ELEMENT_ATTRIBUTE: str = "getElementAttribute" + GET_ELEMENT_PROPERTY: str = "getElementProperty" + GET_ELEMENT_VALUE_OF_CSS_PROPERTY: str = "getElementValueOfCssProperty" + GET_ELEMENT_ARIA_ROLE: str = "getElementAriaRole" + GET_ELEMENT_ARIA_LABEL: str = "getElementAriaLabel" + SCREENSHOT: str = "screenshot" + ELEMENT_SCREENSHOT: str = "elementScreenshot" + EXECUTE_ASYNC_SCRIPT: str = "executeAsyncScript" + SET_TIMEOUTS: str = "setTimeouts" + GET_TIMEOUTS: str = "getTimeouts" + W3C_MAXIMIZE_WINDOW: str = "w3cMaximizeWindow" + GET_LOG: str = "getLog" + GET_AVAILABLE_LOG_TYPES: str = "getAvailableLogTypes" + FULLSCREEN_WINDOW: str = "fullscreenWindow" + MINIMIZE_WINDOW: str = "minimizeWindow" + PRINT_PAGE: str = "printPage" # Alerts - W3C_DISMISS_ALERT: str = "w3cDismissAlert" - W3C_ACCEPT_ALERT: str = "w3cAcceptAlert" - W3C_SET_ALERT_VALUE: str = "w3cSetAlertValue" - W3C_GET_ALERT_TEXT: str = "w3cGetAlertText" + W3C_DISMISS_ALERT: str = "w3cDismissAlert" + W3C_ACCEPT_ALERT: str = "w3cAcceptAlert" + W3C_SET_ALERT_VALUE: str = "w3cSetAlertValue" + W3C_GET_ALERT_TEXT: str = "w3cGetAlertText" # Advanced user interactions - W3C_ACTIONS: str = "actions" - W3C_CLEAR_ACTIONS: str = "clearActionState" + W3C_ACTIONS: str = "actions" + W3C_CLEAR_ACTIONS: str = "clearActionState" # Screen Orientation - SET_SCREEN_ORIENTATION: str = "setScreenOrientation" - GET_SCREEN_ORIENTATION: str = "getScreenOrientation" + SET_SCREEN_ORIENTATION: str = "setScreenOrientation" + GET_SCREEN_ORIENTATION: str = "getScreenOrientation" # Mobile - GET_NETWORK_CONNECTION: str = "getNetworkConnection" - SET_NETWORK_CONNECTION: str = "setNetworkConnection" - CURRENT_CONTEXT_HANDLE: str = "getCurrentContextHandle" - CONTEXT_HANDLES: str = "getContextHandles" - SWITCH_TO_CONTEXT: str = "switchToContext" + GET_NETWORK_CONNECTION: str = "getNetworkConnection" + SET_NETWORK_CONNECTION: str = "setNetworkConnection" + CURRENT_CONTEXT_HANDLE: str = "getCurrentContextHandle" + CONTEXT_HANDLES: str = "getContextHandles" + SWITCH_TO_CONTEXT: str = "switchToContext" # Web Components - GET_SHADOW_ROOT: str = "getShadowRoot" - FIND_ELEMENT_FROM_SHADOW_ROOT: str = "findElementFromShadowRoot" - FIND_ELEMENTS_FROM_SHADOW_ROOT: str = "findElementsFromShadowRoot" + GET_SHADOW_ROOT: str = "getShadowRoot" + FIND_ELEMENT_FROM_SHADOW_ROOT: str = "findElementFromShadowRoot" + FIND_ELEMENTS_FROM_SHADOW_ROOT: str = "findElementsFromShadowRoot" # Virtual Authenticator - ADD_VIRTUAL_AUTHENTICATOR: str = "addVirtualAuthenticator" - REMOVE_VIRTUAL_AUTHENTICATOR: str = "removeVirtualAuthenticator" - ADD_CREDENTIAL: str = "addCredential" - GET_CREDENTIALS: str = "getCredentials" - REMOVE_CREDENTIAL: str = "removeCredential" - REMOVE_ALL_CREDENTIALS: str = "removeAllCredentials" - SET_USER_VERIFIED: str = "setUserVerified" + ADD_VIRTUAL_AUTHENTICATOR: str = "addVirtualAuthenticator" + REMOVE_VIRTUAL_AUTHENTICATOR: str = "removeVirtualAuthenticator" + ADD_CREDENTIAL: str = "addCredential" + GET_CREDENTIALS: str = "getCredentials" + REMOVE_CREDENTIAL: str = "removeCredential" + REMOVE_ALL_CREDENTIALS: str = "removeAllCredentials" + SET_USER_VERIFIED: str = "setUserVerified" # Remote File Management - UPLOAD_FILE: str = "uploadFile" - GET_DOWNLOADABLE_FILES: str = "getDownloadableFiles" - DOWNLOAD_FILE: str = "downloadFile" - DELETE_DOWNLOADABLE_FILES: str = "deleteDownloadableFiles" + UPLOAD_FILE: str = "uploadFile" + GET_DOWNLOADABLE_FILES: str = "getDownloadableFiles" + DOWNLOAD_FILE: str = "downloadFile" + DELETE_DOWNLOADABLE_FILES: str = "deleteDownloadableFiles" # Federated Credential Management (FedCM) - GET_FEDCM_TITLE: str = "getFedcmTitle" - GET_FEDCM_DIALOG_TYPE: str = "getFedcmDialogType" - GET_FEDCM_ACCOUNT_LIST: str = "getFedcmAccountList" - SELECT_FEDCM_ACCOUNT: str = "selectFedcmAccount" - CLICK_FEDCM_DIALOG_BUTTON: str = "clickFedcmDialogButton" - CANCEL_FEDCM_DIALOG: str = "cancelFedcmDialog" - SET_FEDCM_DELAY: str = "setFedcmDelay" - RESET_FEDCM_COOLDOWN: str = "resetFedcmCooldown"
+ GET_FEDCM_TITLE: str = "getFedcmTitle" + GET_FEDCM_DIALOG_TYPE: str = "getFedcmDialogType" + GET_FEDCM_ACCOUNT_LIST: str = "getFedcmAccountList" + SELECT_FEDCM_ACCOUNT: str = "selectFedcmAccount" + CLICK_FEDCM_DIALOG_BUTTON: str = "clickFedcmDialogButton" + CANCEL_FEDCM_DIALOG: str = "cancelFedcmDialog" + SET_FEDCM_DELAY: str = "setFedcmDelay" + RESET_FEDCM_COOLDOWN: str = "resetFedcmCooldown"
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/remote/errorhandler.html b/docs/api/py/_modules/selenium/webdriver/remote/errorhandler.html index 258c15c4e712a..cc230a8270135 100644 --- a/docs/api/py/_modules/selenium/webdriver/remote/errorhandler.html +++ b/docs/api/py/_modules/selenium/webdriver/remote/errorhandler.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.remote.errorhandler — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.remote.errorhandler — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.remote.errorhandler

+  

Source code for selenium.webdriver.remote.errorhandler

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -89,11 +245,13 @@ 

Source code for selenium.webdriver.remote.errorhandler

from selenium.common.exceptions import WebDriverException -
[docs]class ExceptionMapping: - """ +
+[docs] +class ExceptionMapping: + """ :Maps each errorcode in ErrorCode object to corresponding exception Please refer to https://www.w3.org/TR/webdriver2/#errors for w3c specification - """ + """ NO_SUCH_ELEMENT = NoSuchElementException NO_SUCH_FRAME = NoSuchFrameException @@ -130,57 +288,65 @@

Source code for selenium.webdriver.remote.errorhandler

DETACHED_SHADOW_ROOT = DetachedShadowRootException
-
[docs]class ErrorCode: - """Error codes defined in the WebDriver wire protocol.""" + +
+[docs] +class ErrorCode: + """Error codes defined in the WebDriver wire protocol.""" # Keep in sync with org.openqa.selenium.remote.ErrorCodes and errorcodes.h SUCCESS = 0 - NO_SUCH_ELEMENT = [7, "no such element"] - NO_SUCH_FRAME = [8, "no such frame"] - NO_SUCH_SHADOW_ROOT = ["no such shadow root"] - UNKNOWN_COMMAND = [9, "unknown command"] - STALE_ELEMENT_REFERENCE = [10, "stale element reference"] - ELEMENT_NOT_VISIBLE = [11, "element not visible"] - INVALID_ELEMENT_STATE = [12, "invalid element state"] - UNKNOWN_ERROR = [13, "unknown error"] - ELEMENT_IS_NOT_SELECTABLE = [15, "element not selectable"] - JAVASCRIPT_ERROR = [17, "javascript error"] - XPATH_LOOKUP_ERROR = [19, "invalid selector"] - TIMEOUT = [21, "timeout"] - NO_SUCH_WINDOW = [23, "no such window"] - INVALID_COOKIE_DOMAIN = [24, "invalid cookie domain"] - UNABLE_TO_SET_COOKIE = [25, "unable to set cookie"] - UNEXPECTED_ALERT_OPEN = [26, "unexpected alert open"] - NO_ALERT_OPEN = [27, "no such alert"] - SCRIPT_TIMEOUT = [28, "script timeout"] - INVALID_ELEMENT_COORDINATES = [29, "invalid element coordinates"] - IME_NOT_AVAILABLE = [30, "ime not available"] - IME_ENGINE_ACTIVATION_FAILED = [31, "ime engine activation failed"] - INVALID_SELECTOR = [32, "invalid selector"] - SESSION_NOT_CREATED = [33, "session not created"] - MOVE_TARGET_OUT_OF_BOUNDS = [34, "move target out of bounds"] - INVALID_XPATH_SELECTOR = [51, "invalid selector"] - INVALID_XPATH_SELECTOR_RETURN_TYPER = [52, "invalid selector"] - - ELEMENT_NOT_INTERACTABLE = [60, "element not interactable"] - INSECURE_CERTIFICATE = ["insecure certificate"] - INVALID_ARGUMENT = [61, "invalid argument"] - INVALID_COORDINATES = ["invalid coordinates"] - INVALID_SESSION_ID = ["invalid session id"] - NO_SUCH_COOKIE = [62, "no such cookie"] - UNABLE_TO_CAPTURE_SCREEN = [63, "unable to capture screen"] - ELEMENT_CLICK_INTERCEPTED = [64, "element click intercepted"] - UNKNOWN_METHOD = ["unknown method exception"] - DETACHED_SHADOW_ROOT = [65, "detached shadow root"] - - METHOD_NOT_ALLOWED = [405, "unsupported operation"]
- - -
[docs]class ErrorHandler: - """Handles errors returned by the WebDriver server.""" - -
[docs] def check_response(self, response: Dict[str, Any]) -> None: - """Checks that a JSON response from the WebDriver does not have an + NO_SUCH_ELEMENT = [7, "no such element"] + NO_SUCH_FRAME = [8, "no such frame"] + NO_SUCH_SHADOW_ROOT = ["no such shadow root"] + UNKNOWN_COMMAND = [9, "unknown command"] + STALE_ELEMENT_REFERENCE = [10, "stale element reference"] + ELEMENT_NOT_VISIBLE = [11, "element not visible"] + INVALID_ELEMENT_STATE = [12, "invalid element state"] + UNKNOWN_ERROR = [13, "unknown error"] + ELEMENT_IS_NOT_SELECTABLE = [15, "element not selectable"] + JAVASCRIPT_ERROR = [17, "javascript error"] + XPATH_LOOKUP_ERROR = [19, "invalid selector"] + TIMEOUT = [21, "timeout"] + NO_SUCH_WINDOW = [23, "no such window"] + INVALID_COOKIE_DOMAIN = [24, "invalid cookie domain"] + UNABLE_TO_SET_COOKIE = [25, "unable to set cookie"] + UNEXPECTED_ALERT_OPEN = [26, "unexpected alert open"] + NO_ALERT_OPEN = [27, "no such alert"] + SCRIPT_TIMEOUT = [28, "script timeout"] + INVALID_ELEMENT_COORDINATES = [29, "invalid element coordinates"] + IME_NOT_AVAILABLE = [30, "ime not available"] + IME_ENGINE_ACTIVATION_FAILED = [31, "ime engine activation failed"] + INVALID_SELECTOR = [32, "invalid selector"] + SESSION_NOT_CREATED = [33, "session not created"] + MOVE_TARGET_OUT_OF_BOUNDS = [34, "move target out of bounds"] + INVALID_XPATH_SELECTOR = [51, "invalid selector"] + INVALID_XPATH_SELECTOR_RETURN_TYPER = [52, "invalid selector"] + + ELEMENT_NOT_INTERACTABLE = [60, "element not interactable"] + INSECURE_CERTIFICATE = ["insecure certificate"] + INVALID_ARGUMENT = [61, "invalid argument"] + INVALID_COORDINATES = ["invalid coordinates"] + INVALID_SESSION_ID = ["invalid session id"] + NO_SUCH_COOKIE = [62, "no such cookie"] + UNABLE_TO_CAPTURE_SCREEN = [63, "unable to capture screen"] + ELEMENT_CLICK_INTERCEPTED = [64, "element click intercepted"] + UNKNOWN_METHOD = ["unknown method exception"] + DETACHED_SHADOW_ROOT = [65, "detached shadow root"] + + METHOD_NOT_ALLOWED = [405, "unsupported operation"]
+ + + +
+[docs] +class ErrorHandler: + """Handles errors returned by the WebDriver server.""" + +
+[docs] + def check_response(self, response: Dict[str, Any]) -> None: + """Checks that a JSON response from the WebDriver does not have an error. :Args: @@ -188,38 +354,38 @@

Source code for selenium.webdriver.remote.errorhandler

object. :Raises: If the response contains an error message. - """ - status = response.get("status", None) + """ + status = response.get("status", None) if not status or status == ErrorCode.SUCCESS: return value = None - message = response.get("message", "") - screen: str = response.get("screen", "") + message = response.get("message", "") + screen: str = response.get("screen", "") stacktrace = None if isinstance(status, int): - value_json = response.get("value", None) + value_json = response.get("value", None) if value_json and isinstance(value_json, str): import json try: value = json.loads(value_json) if len(value) == 1: - value = value["value"] - status = value.get("error", None) + value = value["value"] + status = value.get("error", None) if not status: - status = value.get("status", ErrorCode.UNKNOWN_ERROR) - message = value.get("value") or value.get("message") + status = value.get("status", ErrorCode.UNKNOWN_ERROR) + message = value.get("value") or value.get("message") if not isinstance(message, str): value = message - message = message.get("message") + message = message.get("message") else: - message = value.get("message", None) + message = value.get("message", None) except ValueError: pass exception_class: Type[WebDriverException] e = ErrorCode() - error_codes = [item for item in dir(e) if not item.startswith("__")] + error_codes = [item for item in dir(e) if not item.startswith("__")] for error_code in error_codes: error_info = getattr(ErrorCode, error_code) if isinstance(error_info, list) and status in error_info: @@ -229,83 +395,75 @@

Source code for selenium.webdriver.remote.errorhandler

exception_class = WebDriverException if not value: - value = response["value"] + value = response["value"] if isinstance(value, str): raise exception_class(value) - if message == "" and "message" in value: - message = value["message"] + if message == "" and "message" in value: + message = value["message"] screen = None # type: ignore[assignment] - if "screen" in value: - screen = value["screen"] + if "screen" in value: + screen = value["screen"] stacktrace = None - st_value = value.get("stackTrace") or value.get("stacktrace") + st_value = value.get("stackTrace") or value.get("stacktrace") if st_value: if isinstance(st_value, str): - stacktrace = st_value.split("\n") + stacktrace = st_value.split("\n") else: stacktrace = [] try: for frame in st_value: - line = frame.get("lineNumber", "") - file = frame.get("fileName", "<anonymous>") + line = frame.get("lineNumber", "") + file = frame.get("fileName", "<anonymous>") if line: - file = f"{file}:{line}" - meth = frame.get("methodName", "<anonymous>") - if "className" in frame: - meth = f"{frame['className']}.{meth}" - msg = " at %s (%s)" + file = f"{file}:{line}" + meth = frame.get("methodName", "<anonymous>") + if "className" in frame: + meth = f"{frame['className']}.{meth}" + msg = " at %s (%s)" msg = msg % (meth, file) stacktrace.append(msg) except TypeError: pass if exception_class == UnexpectedAlertPresentException: alert_text = None - if "data" in value: - alert_text = value["data"].get("text") - elif "alert" in value: - alert_text = value["alert"].get("text") + if "data" in value: + alert_text = value["data"].get("text") + elif "alert" in value: + alert_text = value["alert"].get("text") raise exception_class(message, screen, stacktrace, alert_text) # type: ignore[call-arg] # mypy is not smart enough here - raise exception_class(message, screen, stacktrace)
+ raise exception_class(message, screen, stacktrace)
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/remote/file_detector.html b/docs/api/py/_modules/selenium/webdriver/remote/file_detector.html index 6e2ca5a16dbe9..12b2c14eb77c8 100644 --- a/docs/api/py/_modules/selenium/webdriver/remote/file_detector.html +++ b/docs/api/py/_modules/selenium/webdriver/remote/file_detector.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.remote.file_detector — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.remote.file_detector — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.remote.file_detector

+  

Source code for selenium.webdriver.remote.file_detector

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -63,70 +219,78 @@ 

Source code for selenium.webdriver.remote.file_detector

from selenium.webdriver.common.utils import keys_to_typing -
[docs]class FileDetector(metaclass=ABCMeta): - """Used for identifying whether a sequence of chars represents the path to - a file.""" +
+[docs] +class FileDetector(metaclass=ABCMeta): + """Used for identifying whether a sequence of chars represents the path to + a file.""" -
[docs] @abstractmethod +
+[docs] + @abstractmethod def is_local_file(self, *keys: AnyKey) -> Optional[str]: - raise NotImplementedError
+ raise NotImplementedError
+
+ -
[docs]class UselessFileDetector(FileDetector): - """A file detector that never finds anything.""" +
+[docs] +class UselessFileDetector(FileDetector): + """A file detector that never finds anything.""" + +
+[docs] + def is_local_file(self, *keys: AnyKey) -> Optional[str]: + return None
+
-
[docs] def is_local_file(self, *keys: AnyKey) -> Optional[str]: - return None
-
[docs]class LocalFileDetector(FileDetector): - """Detects files on the local disk.""" +
+[docs] +class LocalFileDetector(FileDetector): + """Detects files on the local disk.""" -
[docs] def is_local_file(self, *keys: AnyKey) -> Optional[str]: - file_path = "".join(keys_to_typing(keys)) +
+[docs] + def is_local_file(self, *keys: AnyKey) -> Optional[str]: + file_path = "".join(keys_to_typing(keys)) with suppress(OSError): if Path(file_path).is_file(): return file_path - return None
+ return None
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/remote/mobile.html b/docs/api/py/_modules/selenium/webdriver/remote/mobile.html index 683c7adb50ba8..02c40fcab6caf 100644 --- a/docs/api/py/_modules/selenium/webdriver/remote/mobile.html +++ b/docs/api/py/_modules/selenium/webdriver/remote/mobile.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.remote.mobile — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.remote.mobile — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.remote.mobile

+  

Source code for selenium.webdriver.remote.mobile

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -73,7 +229,9 @@ 

Source code for selenium.webdriver.remote.mobile

return (self.mask / 4) > 0 -
[docs]class Mobile: +
+[docs] +class Mobile: ConnectionType = _ConnectionType ALL_NETWORK = ConnectionType(6) WIFI_NETWORK = ConnectionType(2) @@ -87,74 +245,68 @@

Source code for selenium.webdriver.remote.mobile

@property def network_connection(self): - return self.ConnectionType(self._driver.execute(Command.GET_NETWORK_CONNECTION)["value"]) + return self.ConnectionType(self._driver.execute(Command.GET_NETWORK_CONNECTION)["value"]) -
[docs] def set_network_connection(self, network): - """Set the network connection for the remote device. +
+[docs] + def set_network_connection(self, network): + """Set the network connection for the remote device. Example of setting airplane mode:: driver.mobile.set_network_connection(driver.mobile.AIRPLANE_MODE) - """ + """ mode = network.mask if isinstance(network, self.ConnectionType) else network return self.ConnectionType( self._driver.execute( - Command.SET_NETWORK_CONNECTION, {"name": "network_connection", "parameters": {"type": mode}} - )["value"] + Command.SET_NETWORK_CONNECTION, {"name": "network_connection", "parameters": {"type": mode}} + )["value"] )
+ @property def context(self): - """Returns the current context (Native or WebView).""" + """Returns the current context (Native or WebView).""" return self._driver.execute(Command.CURRENT_CONTEXT_HANDLE) @context.setter def context(self, new_context) -> None: - """Sets the current context.""" - self._driver.execute(Command.SWITCH_TO_CONTEXT, {"name": new_context}) + """Sets the current context.""" + self._driver.execute(Command.SWITCH_TO_CONTEXT, {"name": new_context}) @property def contexts(self): - """Returns a list of available contexts.""" + """Returns a list of available contexts.""" return self._driver.execute(Command.CONTEXT_HANDLES)
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/remote/remote_connection.html b/docs/api/py/_modules/selenium/webdriver/remote/remote_connection.html index c3cebe387a572..d127e2f429e5b 100644 --- a/docs/api/py/_modules/selenium/webdriver/remote/remote_connection.html +++ b/docs/api/py/_modules/selenium/webdriver/remote/remote_connection.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.remote.remote_connection — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.remote.remote_connection — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.remote.remote_connection

+  

Source code for selenium.webdriver.remote.remote_connection

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -74,114 +230,116 @@ 

Source code for selenium.webdriver.remote.remote_connection

LOGGER = logging.getLogger(__name__) remote_commands = { - Command.NEW_SESSION: ("POST", "/session"), - Command.QUIT: ("DELETE", "/session/$sessionId"), - Command.W3C_GET_CURRENT_WINDOW_HANDLE: ("GET", "/session/$sessionId/window"), - Command.W3C_GET_WINDOW_HANDLES: ("GET", "/session/$sessionId/window/handles"), - Command.GET: ("POST", "/session/$sessionId/url"), - Command.GO_FORWARD: ("POST", "/session/$sessionId/forward"), - Command.GO_BACK: ("POST", "/session/$sessionId/back"), - Command.REFRESH: ("POST", "/session/$sessionId/refresh"), - Command.W3C_EXECUTE_SCRIPT: ("POST", "/session/$sessionId/execute/sync"), - Command.W3C_EXECUTE_SCRIPT_ASYNC: ("POST", "/session/$sessionId/execute/async"), - Command.GET_CURRENT_URL: ("GET", "/session/$sessionId/url"), - Command.GET_TITLE: ("GET", "/session/$sessionId/title"), - Command.GET_PAGE_SOURCE: ("GET", "/session/$sessionId/source"), - Command.SCREENSHOT: ("GET", "/session/$sessionId/screenshot"), - Command.ELEMENT_SCREENSHOT: ("GET", "/session/$sessionId/element/$id/screenshot"), - Command.FIND_ELEMENT: ("POST", "/session/$sessionId/element"), - Command.FIND_ELEMENTS: ("POST", "/session/$sessionId/elements"), - Command.W3C_GET_ACTIVE_ELEMENT: ("GET", "/session/$sessionId/element/active"), - Command.FIND_CHILD_ELEMENT: ("POST", "/session/$sessionId/element/$id/element"), - Command.FIND_CHILD_ELEMENTS: ("POST", "/session/$sessionId/element/$id/elements"), - Command.CLICK_ELEMENT: ("POST", "/session/$sessionId/element/$id/click"), - Command.CLEAR_ELEMENT: ("POST", "/session/$sessionId/element/$id/clear"), - Command.GET_ELEMENT_TEXT: ("GET", "/session/$sessionId/element/$id/text"), - Command.SEND_KEYS_TO_ELEMENT: ("POST", "/session/$sessionId/element/$id/value"), - Command.GET_ELEMENT_TAG_NAME: ("GET", "/session/$sessionId/element/$id/name"), - Command.IS_ELEMENT_SELECTED: ("GET", "/session/$sessionId/element/$id/selected"), - Command.IS_ELEMENT_ENABLED: ("GET", "/session/$sessionId/element/$id/enabled"), - Command.GET_ELEMENT_RECT: ("GET", "/session/$sessionId/element/$id/rect"), - Command.GET_ELEMENT_ATTRIBUTE: ("GET", "/session/$sessionId/element/$id/attribute/$name"), - Command.GET_ELEMENT_PROPERTY: ("GET", "/session/$sessionId/element/$id/property/$name"), - Command.GET_ELEMENT_ARIA_ROLE: ("GET", "/session/$sessionId/element/$id/computedrole"), - Command.GET_ELEMENT_ARIA_LABEL: ("GET", "/session/$sessionId/element/$id/computedlabel"), - Command.GET_SHADOW_ROOT: ("GET", "/session/$sessionId/element/$id/shadow"), - Command.FIND_ELEMENT_FROM_SHADOW_ROOT: ("POST", "/session/$sessionId/shadow/$shadowId/element"), - Command.FIND_ELEMENTS_FROM_SHADOW_ROOT: ("POST", "/session/$sessionId/shadow/$shadowId/elements"), - Command.GET_ALL_COOKIES: ("GET", "/session/$sessionId/cookie"), - Command.ADD_COOKIE: ("POST", "/session/$sessionId/cookie"), - Command.GET_COOKIE: ("GET", "/session/$sessionId/cookie/$name"), - Command.DELETE_ALL_COOKIES: ("DELETE", "/session/$sessionId/cookie"), - Command.DELETE_COOKIE: ("DELETE", "/session/$sessionId/cookie/$name"), - Command.SWITCH_TO_FRAME: ("POST", "/session/$sessionId/frame"), - Command.SWITCH_TO_PARENT_FRAME: ("POST", "/session/$sessionId/frame/parent"), - Command.SWITCH_TO_WINDOW: ("POST", "/session/$sessionId/window"), - Command.NEW_WINDOW: ("POST", "/session/$sessionId/window/new"), - Command.CLOSE: ("DELETE", "/session/$sessionId/window"), - Command.GET_ELEMENT_VALUE_OF_CSS_PROPERTY: ("GET", "/session/$sessionId/element/$id/css/$propertyName"), - Command.EXECUTE_ASYNC_SCRIPT: ("POST", "/session/$sessionId/execute_async"), - Command.SET_TIMEOUTS: ("POST", "/session/$sessionId/timeouts"), - Command.GET_TIMEOUTS: ("GET", "/session/$sessionId/timeouts"), - Command.W3C_DISMISS_ALERT: ("POST", "/session/$sessionId/alert/dismiss"), - Command.W3C_ACCEPT_ALERT: ("POST", "/session/$sessionId/alert/accept"), - Command.W3C_SET_ALERT_VALUE: ("POST", "/session/$sessionId/alert/text"), - Command.W3C_GET_ALERT_TEXT: ("GET", "/session/$sessionId/alert/text"), - Command.W3C_ACTIONS: ("POST", "/session/$sessionId/actions"), - Command.W3C_CLEAR_ACTIONS: ("DELETE", "/session/$sessionId/actions"), - Command.SET_WINDOW_RECT: ("POST", "/session/$sessionId/window/rect"), - Command.GET_WINDOW_RECT: ("GET", "/session/$sessionId/window/rect"), - Command.W3C_MAXIMIZE_WINDOW: ("POST", "/session/$sessionId/window/maximize"), - Command.SET_SCREEN_ORIENTATION: ("POST", "/session/$sessionId/orientation"), - Command.GET_SCREEN_ORIENTATION: ("GET", "/session/$sessionId/orientation"), - Command.GET_NETWORK_CONNECTION: ("GET", "/session/$sessionId/network_connection"), - Command.SET_NETWORK_CONNECTION: ("POST", "/session/$sessionId/network_connection"), - Command.GET_LOG: ("POST", "/session/$sessionId/se/log"), - Command.GET_AVAILABLE_LOG_TYPES: ("GET", "/session/$sessionId/se/log/types"), - Command.CURRENT_CONTEXT_HANDLE: ("GET", "/session/$sessionId/context"), - Command.CONTEXT_HANDLES: ("GET", "/session/$sessionId/contexts"), - Command.SWITCH_TO_CONTEXT: ("POST", "/session/$sessionId/context"), - Command.FULLSCREEN_WINDOW: ("POST", "/session/$sessionId/window/fullscreen"), - Command.MINIMIZE_WINDOW: ("POST", "/session/$sessionId/window/minimize"), - Command.PRINT_PAGE: ("POST", "/session/$sessionId/print"), - Command.ADD_VIRTUAL_AUTHENTICATOR: ("POST", "/session/$sessionId/webauthn/authenticator"), + Command.NEW_SESSION: ("POST", "/session"), + Command.QUIT: ("DELETE", "/session/$sessionId"), + Command.W3C_GET_CURRENT_WINDOW_HANDLE: ("GET", "/session/$sessionId/window"), + Command.W3C_GET_WINDOW_HANDLES: ("GET", "/session/$sessionId/window/handles"), + Command.GET: ("POST", "/session/$sessionId/url"), + Command.GO_FORWARD: ("POST", "/session/$sessionId/forward"), + Command.GO_BACK: ("POST", "/session/$sessionId/back"), + Command.REFRESH: ("POST", "/session/$sessionId/refresh"), + Command.W3C_EXECUTE_SCRIPT: ("POST", "/session/$sessionId/execute/sync"), + Command.W3C_EXECUTE_SCRIPT_ASYNC: ("POST", "/session/$sessionId/execute/async"), + Command.GET_CURRENT_URL: ("GET", "/session/$sessionId/url"), + Command.GET_TITLE: ("GET", "/session/$sessionId/title"), + Command.GET_PAGE_SOURCE: ("GET", "/session/$sessionId/source"), + Command.SCREENSHOT: ("GET", "/session/$sessionId/screenshot"), + Command.ELEMENT_SCREENSHOT: ("GET", "/session/$sessionId/element/$id/screenshot"), + Command.FIND_ELEMENT: ("POST", "/session/$sessionId/element"), + Command.FIND_ELEMENTS: ("POST", "/session/$sessionId/elements"), + Command.W3C_GET_ACTIVE_ELEMENT: ("GET", "/session/$sessionId/element/active"), + Command.FIND_CHILD_ELEMENT: ("POST", "/session/$sessionId/element/$id/element"), + Command.FIND_CHILD_ELEMENTS: ("POST", "/session/$sessionId/element/$id/elements"), + Command.CLICK_ELEMENT: ("POST", "/session/$sessionId/element/$id/click"), + Command.CLEAR_ELEMENT: ("POST", "/session/$sessionId/element/$id/clear"), + Command.GET_ELEMENT_TEXT: ("GET", "/session/$sessionId/element/$id/text"), + Command.SEND_KEYS_TO_ELEMENT: ("POST", "/session/$sessionId/element/$id/value"), + Command.GET_ELEMENT_TAG_NAME: ("GET", "/session/$sessionId/element/$id/name"), + Command.IS_ELEMENT_SELECTED: ("GET", "/session/$sessionId/element/$id/selected"), + Command.IS_ELEMENT_ENABLED: ("GET", "/session/$sessionId/element/$id/enabled"), + Command.GET_ELEMENT_RECT: ("GET", "/session/$sessionId/element/$id/rect"), + Command.GET_ELEMENT_ATTRIBUTE: ("GET", "/session/$sessionId/element/$id/attribute/$name"), + Command.GET_ELEMENT_PROPERTY: ("GET", "/session/$sessionId/element/$id/property/$name"), + Command.GET_ELEMENT_ARIA_ROLE: ("GET", "/session/$sessionId/element/$id/computedrole"), + Command.GET_ELEMENT_ARIA_LABEL: ("GET", "/session/$sessionId/element/$id/computedlabel"), + Command.GET_SHADOW_ROOT: ("GET", "/session/$sessionId/element/$id/shadow"), + Command.FIND_ELEMENT_FROM_SHADOW_ROOT: ("POST", "/session/$sessionId/shadow/$shadowId/element"), + Command.FIND_ELEMENTS_FROM_SHADOW_ROOT: ("POST", "/session/$sessionId/shadow/$shadowId/elements"), + Command.GET_ALL_COOKIES: ("GET", "/session/$sessionId/cookie"), + Command.ADD_COOKIE: ("POST", "/session/$sessionId/cookie"), + Command.GET_COOKIE: ("GET", "/session/$sessionId/cookie/$name"), + Command.DELETE_ALL_COOKIES: ("DELETE", "/session/$sessionId/cookie"), + Command.DELETE_COOKIE: ("DELETE", "/session/$sessionId/cookie/$name"), + Command.SWITCH_TO_FRAME: ("POST", "/session/$sessionId/frame"), + Command.SWITCH_TO_PARENT_FRAME: ("POST", "/session/$sessionId/frame/parent"), + Command.SWITCH_TO_WINDOW: ("POST", "/session/$sessionId/window"), + Command.NEW_WINDOW: ("POST", "/session/$sessionId/window/new"), + Command.CLOSE: ("DELETE", "/session/$sessionId/window"), + Command.GET_ELEMENT_VALUE_OF_CSS_PROPERTY: ("GET", "/session/$sessionId/element/$id/css/$propertyName"), + Command.EXECUTE_ASYNC_SCRIPT: ("POST", "/session/$sessionId/execute_async"), + Command.SET_TIMEOUTS: ("POST", "/session/$sessionId/timeouts"), + Command.GET_TIMEOUTS: ("GET", "/session/$sessionId/timeouts"), + Command.W3C_DISMISS_ALERT: ("POST", "/session/$sessionId/alert/dismiss"), + Command.W3C_ACCEPT_ALERT: ("POST", "/session/$sessionId/alert/accept"), + Command.W3C_SET_ALERT_VALUE: ("POST", "/session/$sessionId/alert/text"), + Command.W3C_GET_ALERT_TEXT: ("GET", "/session/$sessionId/alert/text"), + Command.W3C_ACTIONS: ("POST", "/session/$sessionId/actions"), + Command.W3C_CLEAR_ACTIONS: ("DELETE", "/session/$sessionId/actions"), + Command.SET_WINDOW_RECT: ("POST", "/session/$sessionId/window/rect"), + Command.GET_WINDOW_RECT: ("GET", "/session/$sessionId/window/rect"), + Command.W3C_MAXIMIZE_WINDOW: ("POST", "/session/$sessionId/window/maximize"), + Command.SET_SCREEN_ORIENTATION: ("POST", "/session/$sessionId/orientation"), + Command.GET_SCREEN_ORIENTATION: ("GET", "/session/$sessionId/orientation"), + Command.GET_NETWORK_CONNECTION: ("GET", "/session/$sessionId/network_connection"), + Command.SET_NETWORK_CONNECTION: ("POST", "/session/$sessionId/network_connection"), + Command.GET_LOG: ("POST", "/session/$sessionId/se/log"), + Command.GET_AVAILABLE_LOG_TYPES: ("GET", "/session/$sessionId/se/log/types"), + Command.CURRENT_CONTEXT_HANDLE: ("GET", "/session/$sessionId/context"), + Command.CONTEXT_HANDLES: ("GET", "/session/$sessionId/contexts"), + Command.SWITCH_TO_CONTEXT: ("POST", "/session/$sessionId/context"), + Command.FULLSCREEN_WINDOW: ("POST", "/session/$sessionId/window/fullscreen"), + Command.MINIMIZE_WINDOW: ("POST", "/session/$sessionId/window/minimize"), + Command.PRINT_PAGE: ("POST", "/session/$sessionId/print"), + Command.ADD_VIRTUAL_AUTHENTICATOR: ("POST", "/session/$sessionId/webauthn/authenticator"), Command.REMOVE_VIRTUAL_AUTHENTICATOR: ( - "DELETE", - "/session/$sessionId/webauthn/authenticator/$authenticatorId", + "DELETE", + "/session/$sessionId/webauthn/authenticator/$authenticatorId", ), - Command.ADD_CREDENTIAL: ("POST", "/session/$sessionId/webauthn/authenticator/$authenticatorId/credential"), - Command.GET_CREDENTIALS: ("GET", "/session/$sessionId/webauthn/authenticator/$authenticatorId/credentials"), + Command.ADD_CREDENTIAL: ("POST", "/session/$sessionId/webauthn/authenticator/$authenticatorId/credential"), + Command.GET_CREDENTIALS: ("GET", "/session/$sessionId/webauthn/authenticator/$authenticatorId/credentials"), Command.REMOVE_CREDENTIAL: ( - "DELETE", - "/session/$sessionId/webauthn/authenticator/$authenticatorId/credentials/$credentialId", + "DELETE", + "/session/$sessionId/webauthn/authenticator/$authenticatorId/credentials/$credentialId", ), Command.REMOVE_ALL_CREDENTIALS: ( - "DELETE", - "/session/$sessionId/webauthn/authenticator/$authenticatorId/credentials", + "DELETE", + "/session/$sessionId/webauthn/authenticator/$authenticatorId/credentials", ), - Command.SET_USER_VERIFIED: ("POST", "/session/$sessionId/webauthn/authenticator/$authenticatorId/uv"), - Command.UPLOAD_FILE: ("POST", "/session/$sessionId/se/file"), - Command.GET_DOWNLOADABLE_FILES: ("GET", "/session/$sessionId/se/files"), - Command.DOWNLOAD_FILE: ("POST", "/session/$sessionId/se/files"), - Command.DELETE_DOWNLOADABLE_FILES: ("DELETE", "/session/$sessionId/se/files"), + Command.SET_USER_VERIFIED: ("POST", "/session/$sessionId/webauthn/authenticator/$authenticatorId/uv"), + Command.UPLOAD_FILE: ("POST", "/session/$sessionId/se/file"), + Command.GET_DOWNLOADABLE_FILES: ("GET", "/session/$sessionId/se/files"), + Command.DOWNLOAD_FILE: ("POST", "/session/$sessionId/se/files"), + Command.DELETE_DOWNLOADABLE_FILES: ("DELETE", "/session/$sessionId/se/files"), # Federated Credential Management (FedCM) - Command.GET_FEDCM_TITLE: ("GET", "/session/$sessionId/fedcm/gettitle"), - Command.GET_FEDCM_DIALOG_TYPE: ("GET", "/session/$sessionId/fedcm/getdialogtype"), - Command.GET_FEDCM_ACCOUNT_LIST: ("GET", "/session/$sessionId/fedcm/accountlist"), - Command.CLICK_FEDCM_DIALOG_BUTTON: ("POST", "/session/$sessionId/fedcm/clickdialogbutton"), - Command.CANCEL_FEDCM_DIALOG: ("POST", "/session/$sessionId/fedcm/canceldialog"), - Command.SELECT_FEDCM_ACCOUNT: ("POST", "/session/$sessionId/fedcm/selectaccount"), - Command.SET_FEDCM_DELAY: ("POST", "/session/$sessionId/fedcm/setdelayenabled"), - Command.RESET_FEDCM_COOLDOWN: ("POST", "/session/$sessionId/fedcm/resetcooldown"), + Command.GET_FEDCM_TITLE: ("GET", "/session/$sessionId/fedcm/gettitle"), + Command.GET_FEDCM_DIALOG_TYPE: ("GET", "/session/$sessionId/fedcm/getdialogtype"), + Command.GET_FEDCM_ACCOUNT_LIST: ("GET", "/session/$sessionId/fedcm/accountlist"), + Command.CLICK_FEDCM_DIALOG_BUTTON: ("POST", "/session/$sessionId/fedcm/clickdialogbutton"), + Command.CANCEL_FEDCM_DIALOG: ("POST", "/session/$sessionId/fedcm/canceldialog"), + Command.SELECT_FEDCM_ACCOUNT: ("POST", "/session/$sessionId/fedcm/selectaccount"), + Command.SET_FEDCM_DELAY: ("POST", "/session/$sessionId/fedcm/setdelayenabled"), + Command.RESET_FEDCM_COOLDOWN: ("POST", "/session/$sessionId/fedcm/resetcooldown"), } -
[docs]class RemoteConnection: - """A connection with the Remote WebDriver server. +
+[docs] +class RemoteConnection: + """A connection with the Remote WebDriver server. Communicates with the server using the WebDriver wire protocol: https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol - """ + """ browser_name = None # Keep backward compatibility for AppiumConnection - https://github.com/SeleniumHQ/selenium/issues/14694 @@ -191,120 +349,138 @@

Source code for selenium.webdriver.remote.remote_connection

import certifi _timeout = ( - float(os.getenv("GLOBAL_DEFAULT_TIMEOUT", str(socket.getdefaulttimeout()))) - if os.getenv("GLOBAL_DEFAULT_TIMEOUT") is not None + float(os.getenv("GLOBAL_DEFAULT_TIMEOUT", str(socket.getdefaulttimeout()))) + if os.getenv("GLOBAL_DEFAULT_TIMEOUT") is not None else socket.getdefaulttimeout() ) - _ca_certs = os.getenv("REQUESTS_CA_BUNDLE") if "REQUESTS_CA_BUNDLE" in os.environ else certifi.where() + _ca_certs = os.getenv("REQUESTS_CA_BUNDLE") if "REQUESTS_CA_BUNDLE" in os.environ else certifi.where() _client_config: ClientConfig = None system = platform.system().lower() - if system == "darwin": - system = "mac" + if system == "darwin": + system = "mac" # Class variables for headers extra_headers = None - user_agent = f"selenium/{__version__} (python {system})" + user_agent = f"selenium/{__version__} (python {system})" -
[docs] @classmethod +
+[docs] + @classmethod def get_timeout(cls): - """:Returns: + """:Returns: Timeout value in seconds for all http requests made to the Remote Connection - """ + """ warnings.warn( - "get_timeout() in RemoteConnection is deprecated, get timeout from ClientConfig instance instead", + "get_timeout() in RemoteConnection is deprecated, get timeout from ClientConfig instance instead", DeprecationWarning, stacklevel=2, ) return cls._client_config.timeout
-
[docs] @classmethod + +
+[docs] + @classmethod def set_timeout(cls, timeout): - """Override the default timeout. + """Override the default timeout. :Args: - timeout - timeout value for http requests in seconds - """ + """ warnings.warn( - "set_timeout() in RemoteConnection is deprecated, set timeout to ClientConfig instance in constructor instead", + "set_timeout() in RemoteConnection is deprecated, set timeout to ClientConfig instance in constructor instead", DeprecationWarning, stacklevel=2, ) cls._client_config.timeout = timeout
-
[docs] @classmethod + +
+[docs] + @classmethod def reset_timeout(cls): - """Reset the http request timeout to socket._GLOBAL_DEFAULT_TIMEOUT.""" + """Reset the http request timeout to socket._GLOBAL_DEFAULT_TIMEOUT.""" warnings.warn( - "reset_timeout() in RemoteConnection is deprecated, use reset_timeout() in ClientConfig instance instead", + "reset_timeout() in RemoteConnection is deprecated, use reset_timeout() in ClientConfig instance instead", DeprecationWarning, stacklevel=2, ) cls._client_config.reset_timeout()
-
[docs] @classmethod + +
+[docs] + @classmethod def get_certificate_bundle_path(cls): - """:Returns: + """:Returns: Paths of the .pem encoded certificate to verify connection to command executor. Defaults to certifi.where() or REQUESTS_CA_BUNDLE env variable if set. - """ + """ warnings.warn( - "get_certificate_bundle_path() in RemoteConnection is deprecated, get ca_certs from ClientConfig instance instead", + "get_certificate_bundle_path() in RemoteConnection is deprecated, get ca_certs from ClientConfig instance instead", DeprecationWarning, stacklevel=2, ) return cls._client_config.ca_certs
-
[docs] @classmethod + +
+[docs] + @classmethod def set_certificate_bundle_path(cls, path): - """Set the path to the certificate bundle to verify connection to + """Set the path to the certificate bundle to verify connection to command executor. Can also be set to None to disable certificate validation. :Args: - path - path of a .pem encoded certificate chain. - """ + """ warnings.warn( - "set_certificate_bundle_path() in RemoteConnection is deprecated, set ca_certs to ClientConfig instance in constructor instead", + "set_certificate_bundle_path() in RemoteConnection is deprecated, set ca_certs to ClientConfig instance in constructor instead", DeprecationWarning, stacklevel=2, ) cls._client_config.ca_certs = path
-
[docs] @classmethod + +
+[docs] + @classmethod def get_remote_connection_headers(cls, parsed_url, keep_alive=False): - """Get headers for remote request. + """Get headers for remote request. :Args: - parsed_url - The parsed url - keep_alive (Boolean) - Is this a keep-alive connection (default: False) - """ + """ headers = { - "Accept": "application/json", - "Content-Type": "application/json;charset=UTF-8", - "User-Agent": cls.user_agent, + "Accept": "application/json", + "Content-Type": "application/json;charset=UTF-8", + "User-Agent": cls.user_agent, } if parsed_url.username: warnings.warn( - "Embedding username and password in URL could be insecure, use ClientConfig instead", stacklevel=2 + "Embedding username and password in URL could be insecure, use ClientConfig instead", stacklevel=2 ) - base64string = b64encode(f"{parsed_url.username}:{parsed_url.password}".encode()) - headers.update({"Authorization": f"Basic {base64string.decode()}"}) + base64string = b64encode(f"{parsed_url.username}:{parsed_url.password}".encode()) + headers.update({"Authorization": f"Basic {base64string.decode()}"}) if keep_alive: - headers.update({"Connection": "keep-alive"}) + headers.update({"Connection": "keep-alive"}) if cls.extra_headers: headers.update(cls.extra_headers) return headers
+ def _identify_http_proxy_auth(self): parsed_url = urlparse(self._proxy_url) if parsed_url.username and parsed_url.password: @@ -312,31 +488,31 @@

Source code for selenium.webdriver.remote.remote_connection

def _separate_http_proxy_auth(self): parsed_url = urlparse(self._proxy_url) - proxy_without_auth = f"{parsed_url.scheme}://{parsed_url.hostname}:{parsed_url.port}" - auth = f"{parsed_url.username}:{parsed_url.password}" + proxy_without_auth = f"{parsed_url.scheme}://{parsed_url.hostname}:{parsed_url.port}" + auth = f"{parsed_url.username}:{parsed_url.password}" return proxy_without_auth, auth def _get_connection_manager(self): - pool_manager_init_args = {"timeout": self._client_config.timeout} + pool_manager_init_args = {"timeout": self._client_config.timeout} pool_manager_init_args.update( - self._client_config.init_args_for_pool_manager.get("init_args_for_pool_manager", {}) + self._client_config.init_args_for_pool_manager.get("init_args_for_pool_manager", {}) ) if self._client_config.ignore_certificates: - pool_manager_init_args["cert_reqs"] = "CERT_NONE" + pool_manager_init_args["cert_reqs"] = "CERT_NONE" urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) elif self._client_config.ca_certs: - pool_manager_init_args["cert_reqs"] = "CERT_REQUIRED" - pool_manager_init_args["ca_certs"] = self._client_config.ca_certs + pool_manager_init_args["cert_reqs"] = "CERT_REQUIRED" + pool_manager_init_args["ca_certs"] = self._client_config.ca_certs if self._proxy_url: - if self._proxy_url.lower().startswith("sock"): + if self._proxy_url.lower().startswith("sock"): from urllib3.contrib.socks import SOCKSProxyManager return SOCKSProxyManager(self._proxy_url, **pool_manager_init_args) if self._identify_http_proxy_auth(): self._proxy_url, self._basic_proxy_auth = self._separate_http_proxy_auth() - pool_manager_init_args["proxy_headers"] = urllib3.make_headers(proxy_basic_auth=self._basic_proxy_auth) + pool_manager_init_args["proxy_headers"] = urllib3.make_headers(proxy_basic_auth=self._basic_proxy_auth) return urllib3.ProxyManager(self._proxy_url, **pool_manager_init_args) return urllib3.PoolManager(**pool_manager_init_args) @@ -366,35 +542,35 @@

Source code for selenium.webdriver.remote.remote_connection

if remote_server_addr: warnings.warn( - "setting remote_server_addr in RemoteConnection() is deprecated, set in ClientConfig instance instead", + "setting remote_server_addr in RemoteConnection() is deprecated, set in ClientConfig instance instead", DeprecationWarning, stacklevel=2, ) if not keep_alive: warnings.warn( - "setting keep_alive in RemoteConnection() is deprecated, set in ClientConfig instance instead", + "setting keep_alive in RemoteConnection() is deprecated, set in ClientConfig instance instead", DeprecationWarning, stacklevel=2, ) if ignore_certificates: warnings.warn( - "setting ignore_certificates in RemoteConnection() is deprecated, set in ClientConfig instance instead", + "setting ignore_certificates in RemoteConnection() is deprecated, set in ClientConfig instance instead", DeprecationWarning, stacklevel=2, ) if init_args_for_pool_manager: warnings.warn( - "setting init_args_for_pool_manager in RemoteConnection() is deprecated, set in ClientConfig instance instead", + "setting init_args_for_pool_manager in RemoteConnection() is deprecated, set in ClientConfig instance instead", DeprecationWarning, stacklevel=2, ) if ignore_proxy: warnings.warn( - "setting ignore_proxy in RemoteConnection() is deprecated, set in ClientConfig instance instead", + "setting ignore_proxy in RemoteConnection() is deprecated, set in ClientConfig instance instead", DeprecationWarning, stacklevel=2, ) @@ -408,16 +584,24 @@

Source code for selenium.webdriver.remote.remote_connection

extra_commands = {} -
[docs] def add_command(self, name, method, url): - """Register a new command.""" +
+[docs] + def add_command(self, name, method, url): + """Register a new command.""" self._commands[name] = (method, url)
-
[docs] def get_command(self, name: str): - """Retrieve a command if it exists.""" + +
+[docs] + def get_command(self, name: str): + """Retrieve a command if it exists.""" return self._commands.get(name)
-
[docs] def execute(self, command, params): - """Send a command to the remote server. + +
+[docs] + def execute(self, command, params): + """Send a command to the remote server. Any path substitutions required for the URL mapped to the command should be included in the command parameters. @@ -426,23 +610,24 @@

Source code for selenium.webdriver.remote.remote_connection

- command - A string specifying the command to execute. - params - A dictionary of named parameters to send with the command as its JSON payload. - """ + """ command_info = self._commands.get(command) or self.extra_commands.get(command) - assert command_info is not None, f"Unrecognised command {command}" + assert command_info is not None, f"Unrecognised command {command}" path_string = command_info[1] path = string.Template(path_string).substitute(params) - substitute_params = {word[1:] for word in path_string.split("/") if word.startswith("$")} # remove dollar sign + substitute_params = {word[1:] for word in path_string.split("/") if word.startswith("$")} # remove dollar sign if isinstance(params, dict) and substitute_params: for word in substitute_params: del params[word] data = utils.dump_json(params) - url = f"{self._client_config.remote_server_addr}{path}" + url = f"{self._client_config.remote_server_addr}{path}" trimmed = self._trim_large_entries(params) - LOGGER.debug("%s %s %s", command_info[0], url, str(trimmed)) + LOGGER.debug("%s %s %s", command_info[0], url, str(trimmed)) return self._request(command_info[0], url, body=data)
+ def _request(self, method, url, body=None): - """Send an HTTP request to the remote server. + """Send an HTTP request to the remote server. :Args: - method - A string for the HTTP method to send the request with. @@ -450,8 +635,8 @@

Source code for selenium.webdriver.remote.remote_connection

- body - A string for request body. Ignored unless method is POST or PUT. :Returns: - A dictionary with the server's parsed JSON response. - """ + A dictionary with the server's parsed JSON response. + """ parsed_url = parse.urlparse(url) headers = self.get_remote_connection_headers(parsed_url, self._client_config.keep_alive) auth_header = self._client_config.get_auth_header() @@ -459,7 +644,7 @@

Source code for selenium.webdriver.remote.remote_connection

if auth_header: headers.update(auth_header) - if body and method not in ("POST", "PUT"): + if body and method not in ("POST", "PUT"): body = None if self._client_config.keep_alive: @@ -470,19 +655,19 @@

Source code for selenium.webdriver.remote.remote_connection

with conn as http: response = http.request(method, url, body=body, headers=headers, timeout=self._client_config.timeout) statuscode = response.status - data = response.data.decode("UTF-8") - LOGGER.debug("Remote response: status=%s | data=%s | headers=%s", response.status, data, response.headers) + data = response.data.decode("UTF-8") + LOGGER.debug("Remote response: status=%s | data=%s | headers=%s", response.status, data, response.headers) try: if 300 <= statuscode < 304: - return self._request("GET", response.headers.get("location", None)) + return self._request("GET", response.headers.get("location", None)) if 399 < statuscode <= 500: if statuscode == 401: - return {"status": statuscode, "value": "Authorization Required"} - return {"status": statuscode, "value": str(statuscode) if not data else data.strip()} + return {"status": statuscode, "value": "Authorization Required"} + return {"status": statuscode, "value": str(statuscode) if not data else data.strip()} content_type = [] - if response.headers.get("Content-Type", None): - content_type = response.headers.get("Content-Type", None).split(";") - if not any([x.startswith("image/png") for x in content_type]): + if response.headers.get("Content-Type", None): + content_type = response.headers.get("Content-Type", None).split(";") + if not any([x.startswith("image/png") for x in content_type]): try: data = utils.load_json(data.strip()) except ValueError: @@ -490,79 +675,73 @@

Source code for selenium.webdriver.remote.remote_connection

status = ErrorCode.SUCCESS else: status = ErrorCode.UNKNOWN_ERROR - return {"status": status, "value": data.strip()} + return {"status": status, "value": data.strip()} # Some drivers incorrectly return a response - # with no 'value' field when they should return null. - if "value" not in data: - data["value"] = None + # with no 'value' field when they should return null. + if "value" not in data: + data["value"] = None return data - data = {"status": 0, "value": data} + data = {"status": 0, "value": data} return data finally: - LOGGER.debug("Finished Request") + LOGGER.debug("Finished Request") response.close() -
[docs] def close(self): - """Clean up resources when finished with the remote_connection.""" - if hasattr(self, "_conn"): +
+[docs] + def close(self): + """Clean up resources when finished with the remote_connection.""" + if hasattr(self, "_conn"): self._conn.clear()
+ def _trim_large_entries(self, input_dict, max_length=100): - """Truncate string values in a dictionary if they exceed max_length. + """Truncate string values in a dictionary if they exceed max_length. :param dict: Dictionary with potentially large values :param max_length: Maximum allowed length of string values :return: Dictionary with truncated string values - """ + """ output_dictionary = {} for key, value in input_dict.items(): if isinstance(value, dict): output_dictionary[key] = self._trim_large_entries(value, max_length) elif isinstance(value, str) and len(value) > max_length: - output_dictionary[key] = value[:max_length] + "..." + output_dictionary[key] = value[:max_length] + "..." else: output_dictionary[key] = value return output_dictionary
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/remote/script_key.html b/docs/api/py/_modules/selenium/webdriver/remote/script_key.html index da04972e6e148..4e703f7bc0bf1 100644 --- a/docs/api/py/_modules/selenium/webdriver/remote/script_key.html +++ b/docs/api/py/_modules/selenium/webdriver/remote/script_key.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.remote.script_key — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.remote.script_key — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.remote.script_key

+  

Source code for selenium.webdriver.remote.script_key

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -56,7 +212,9 @@ 

Source code for selenium.webdriver.remote.script_key

import uuid -
[docs]class ScriptKey: +
+[docs] +class ScriptKey: def __init__(self, id=None): self._id = id or uuid.uuid4() @@ -68,45 +226,36 @@

Source code for selenium.webdriver.remote.script_key

return self._id == other def __repr__(self) -> str: - return f"ScriptKey(id={self.id})"
+ return f"ScriptKey(id={self.id})"
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/remote/shadowroot.html b/docs/api/py/_modules/selenium/webdriver/remote/shadowroot.html index 04465424284b9..4a01ecefe6d30 100644 --- a/docs/api/py/_modules/selenium/webdriver/remote/shadowroot.html +++ b/docs/api/py/_modules/selenium/webdriver/remote/shadowroot.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.remote.shadowroot — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.remote.shadowroot — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.remote.shadowroot

+  

Source code for selenium.webdriver.remote.shadowroot

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -59,7 +215,9 @@ 

Source code for selenium.webdriver.remote.shadowroot

from .command import Command -
[docs]class ShadowRoot: +
+[docs] +class ShadowRoot: # TODO: We should look and see how we can create a search context like Java/.NET def __init__(self, session, id_) -> None: @@ -70,19 +228,21 @@

Source code for selenium.webdriver.remote.shadowroot

return self._id == other_shadowroot._id def __hash__(self) -> int: - return int(md5_hash(self._id.encode("utf-8")).hexdigest(), 16) + return int(md5_hash(self._id.encode("utf-8")).hexdigest(), 16) def __repr__(self) -> str: - return '<{0.__module__}.{0.__name__} (session="{1}", element="{2}")>'.format( + return '<{0.__module__}.{0.__name__} (session="{1}", element="{2}")>'.format( type(self), self.session.session_id, self._id ) -
[docs] def find_element(self, by: str = By.ID, value: str = None): - """Find an element inside a shadow root given a By strategy and +
+[docs] + def find_element(self, by: str = By.ID, value: str = None): + """Find an element inside a shadow root given a By strategy and locator. Parameters: - ---------- + ----------- by : selenium.webdriver.common.by.By The locating strategy to use. Default is `By.ID`. Supported values include: - By.ID: Locate by element ID. @@ -90,37 +250,40 @@

Source code for selenium.webdriver.remote.shadowroot

- By.XPATH: Locate by an XPath expression. - By.CSS_SELECTOR: Locate by a CSS selector. - By.CLASS_NAME: Locate by the `class` attribute. - - By.TAG_NAME: Locate by the tag name (e.g., "input", "button"). + - By.TAG_NAME: Locate by the tag name (e.g., "input", "button"). - By.LINK_TEXT: Locate a link element by its exact text. - By.PARTIAL_LINK_TEXT: Locate a link element by partial text match. - RelativeBy: Locate elements relative to a specified root element. Example: -------- - element = driver.find_element(By.ID, 'foo') + element = driver.find_element(By.ID, 'foo') Returns: ------- WebElement The first matching `WebElement` found on the page. - """ + """ if by == By.ID: by = By.CSS_SELECTOR - value = f'[id="{value}"]' + value = f'[id="{value}"]' elif by == By.CLASS_NAME: by = By.CSS_SELECTOR - value = f".{value}" + value = f".{value}" elif by == By.NAME: by = By.CSS_SELECTOR - value = f'[name="{value}"]' + value = f'[name="{value}"]' + + return self._execute(Command.FIND_ELEMENT_FROM_SHADOW_ROOT, {"using": by, "value": value})["value"]
- return self._execute(Command.FIND_ELEMENT_FROM_SHADOW_ROOT, {"using": by, "value": value})["value"]
-
[docs] def find_elements(self, by: str = By.ID, value: str = None): - """Find elements inside a shadow root given a By strategy and locator. +
+[docs] + def find_elements(self, by: str = By.ID, value: str = None): + """Find elements inside a shadow root given a By strategy and locator. Parameters: - ---------- + ----------- by : selenium.webdriver.common.by.By The locating strategy to use. Default is `By.ID`. Supported values include: - By.ID: Locate by element ID. @@ -128,85 +291,77 @@

Source code for selenium.webdriver.remote.shadowroot

- By.XPATH: Locate by an XPath expression. - By.CSS_SELECTOR: Locate by a CSS selector. - By.CLASS_NAME: Locate by the `class` attribute. - - By.TAG_NAME: Locate by the tag name (e.g., "input", "button"). + - By.TAG_NAME: Locate by the tag name (e.g., "input", "button"). - By.LINK_TEXT: Locate a link element by its exact text. - By.PARTIAL_LINK_TEXT: Locate a link element by partial text match. - RelativeBy: Locate elements relative to a specified root element. Example: -------- - element = driver.find_element(By.ID, 'foo') + element = driver.find_elements(By.ID, 'foo') Returns: ------- - WebElement + List[WebElement] list of `WebElements` matching locator strategy found on the page. - """ + """ if by == By.ID: by = By.CSS_SELECTOR - value = f'[id="{value}"]' + value = f'[id="{value}"]' elif by == By.CLASS_NAME: by = By.CSS_SELECTOR - value = f".{value}" + value = f".{value}" elif by == By.NAME: by = By.CSS_SELECTOR - value = f'[name="{value}"]' + value = f'[name="{value}"]' + + return self._execute(Command.FIND_ELEMENTS_FROM_SHADOW_ROOT, {"using": by, "value": value})["value"]
- return self._execute(Command.FIND_ELEMENTS_FROM_SHADOW_ROOT, {"using": by, "value": value})["value"]
# Private Methods def _execute(self, command, params=None): - """Executes a command against the underlying HTML element. + """Executes a command against the underlying HTML element. Args: command: The name of the command to _execute as a string. params: A dictionary of named parameters to send with the command. Returns: - The command's JSON response loaded into a dictionary object. - """ + The command's JSON response loaded into a dictionary object. + """ if not params: params = {} - params["shadowId"] = self._id + params["shadowId"] = self._id return self.session.execute(command, params)
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/remote/switch_to.html b/docs/api/py/_modules/selenium/webdriver/remote/switch_to.html index 5d1d378aa1cd3..3d39139dc55cc 100644 --- a/docs/api/py/_modules/selenium/webdriver/remote/switch_to.html +++ b/docs/api/py/_modules/selenium/webdriver/remote/switch_to.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.remote.switch_to — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.remote.switch_to — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.remote.switch_to

+  

Source code for selenium.webdriver.remote.switch_to

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -66,7 +222,9 @@ 

Source code for selenium.webdriver.remote.switch_to

from .command import Command -
[docs]class SwitchTo: +
+[docs] +class SwitchTo: def __init__(self, driver) -> None: import weakref @@ -74,40 +232,45 @@

Source code for selenium.webdriver.remote.switch_to

@property def active_element(self) -> WebElement: - """Returns the element with focus, or BODY if nothing has focus. + """Returns the element with focus, or BODY if nothing has focus. :Usage: :: element = driver.switch_to.active_element - """ - return self._driver.execute(Command.W3C_GET_ACTIVE_ELEMENT)["value"] + """ + return self._driver.execute(Command.W3C_GET_ACTIVE_ELEMENT)["value"] @property def alert(self) -> Alert: - """Switches focus to an alert on the page. + """Switches focus to an alert on the page. :Usage: :: alert = driver.switch_to.alert - """ + """ alert = Alert(self._driver) _ = alert.text return alert -
[docs] def default_content(self) -> None: - """Switch focus to the default frame. +
+[docs] + def default_content(self) -> None: + """Switch focus to the default frame. :Usage: :: driver.switch_to.default_content() - """ - self._driver.execute(Command.SWITCH_TO_FRAME, {"id": None})
+ """ + self._driver.execute(Command.SWITCH_TO_FRAME, {"id": None})
-
[docs] def frame(self, frame_reference: Union[str, int, WebElement]) -> None: - """Switches focus to the specified frame, by index, name, or + +
+[docs] + def frame(self, frame_reference: Union[str, int, WebElement]) -> None: + """Switches focus to the specified frame, by index, name, or webelement. :Args: @@ -117,10 +280,10 @@

Source code for selenium.webdriver.remote.switch_to

:Usage: :: - driver.switch_to.frame('frame_name') + driver.switch_to.frame('frame_name') driver.switch_to.frame(1) - driver.switch_to.frame(driver.find_elements(By.TAG_NAME, "iframe")[0]) - """ + driver.switch_to.frame(driver.find_elements(By.TAG_NAME, "iframe")[0]) + """ if isinstance(frame_reference, str): try: frame_reference = self._driver.find_element(By.ID, frame_reference) @@ -130,35 +293,44 @@

Source code for selenium.webdriver.remote.switch_to

except NoSuchElementException as exc: raise NoSuchFrameException(frame_reference) from exc - self._driver.execute(Command.SWITCH_TO_FRAME, {"id": frame_reference})
+ self._driver.execute(Command.SWITCH_TO_FRAME, {"id": frame_reference})
+ -
[docs] def new_window(self, type_hint: Optional[str] = None) -> None: - """Switches to a new top-level browsing context. +
+[docs] + def new_window(self, type_hint: Optional[str] = None) -> None: + """Switches to a new top-level browsing context. - The type hint can be one of "tab" or "window". If not specified the + The type hint can be one of "tab" or "window". If not specified the browser will automatically select it. :Usage: :: - driver.switch_to.new_window('tab') - """ - value = self._driver.execute(Command.NEW_WINDOW, {"type": type_hint})["value"] - self._w3c_window(value["handle"])
+ driver.switch_to.new_window('tab') + """ + value = self._driver.execute(Command.NEW_WINDOW, {"type": type_hint})["value"] + self._w3c_window(value["handle"])
-
[docs] def parent_frame(self) -> None: - """Switches focus to the parent context. If the current context is the + +
+[docs] + def parent_frame(self) -> None: + """Switches focus to the parent context. If the current context is the top level browsing context, the context remains unchanged. :Usage: :: driver.switch_to.parent_frame() - """ + """ self._driver.execute(Command.SWITCH_TO_PARENT_FRAME)
-
[docs] def window(self, window_name: str) -> None: - """Switches focus to the specified window. + +
+[docs] + def window(self, window_name: str) -> None: + """Switches focus to the specified window. :Args: - window_name: The name or window handle of the window to switch to. @@ -166,13 +338,14 @@

Source code for selenium.webdriver.remote.switch_to

:Usage: :: - driver.switch_to.window('main') - """ + driver.switch_to.window('main') + """ self._w3c_window(window_name)
+ def _w3c_window(self, window_name: str) -> None: def send_handle(h): - self._driver.execute(Command.SWITCH_TO_WINDOW, {"handle": h}) + self._driver.execute(Command.SWITCH_TO_WINDOW, {"handle": h}) try: # Try using it as a handle first. @@ -183,49 +356,40 @@

Source code for selenium.webdriver.remote.switch_to

handles = self._driver.window_handles for handle in handles: send_handle(handle) - current_name = self._driver.execute_script("return window.name") + current_name = self._driver.execute_script("return window.name") if window_name == current_name: return send_handle(original_handle) raise
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/remote/utils.html b/docs/api/py/_modules/selenium/webdriver/remote/utils.html index fa79d42912f30..36ce2ff767ce9 100644 --- a/docs/api/py/_modules/selenium/webdriver/remote/utils.html +++ b/docs/api/py/_modules/selenium/webdriver/remote/utils.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.remote.utils — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.remote.utils — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.remote.utils

+  

Source code for selenium.webdriver.remote.utils

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -58,50 +214,46 @@ 

Source code for selenium.webdriver.remote.utils

< from typing import Union -
[docs]def dump_json(json_struct: Any) -> str: +
+[docs] +def dump_json(json_struct: Any) -> str: return json.dumps(json_struct)
-
[docs]def load_json(s: Union[str, bytes]) -> Any: + +
+[docs] +def load_json(s: Union[str, bytes]) -> Any: return json.loads(s)
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/remote/webdriver.html b/docs/api/py/_modules/selenium/webdriver/remote/webdriver.html index f6d2532da250f..eda7abaa6997e 100644 --- a/docs/api/py/_modules/selenium/webdriver/remote/webdriver.html +++ b/docs/api/py/_modules/selenium/webdriver/remote/webdriver.html @@ -1,58 +1,214 @@ - + - selenium.webdriver.remote.webdriver — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.remote.webdriver — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.remote.webdriver

+  

Source code for selenium.webdriver.remote.webdriver

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-"""The WebDriver implementation."""
+"""The WebDriver implementation."""
 import base64
 import contextlib
 import copy
@@ -113,14 +269,17 @@ 

Source code for selenium.webdriver.remote.webdriver

devtools = None -
[docs]def import_cdp(): +
+[docs] +def import_cdp(): global cdp if not cdp: - cdp = import_module("selenium.webdriver.common.bidi.cdp")
+ cdp = import_module("selenium.webdriver.common.bidi.cdp")
+ def _create_caps(caps): - """Makes a W3C alwaysMatch capabilities object. + """Makes a W3C alwaysMatch capabilities object. Filters out capability names that are not in the W3C spec. Spec-compliant drivers will reject requests containing unknown capability names. @@ -129,18 +288,20 @@

Source code for selenium.webdriver.remote.webdriver

options object. Parameters: - ---------- + ----------- caps : dict - A dictionary of capabilities requested by the caller. - """ + """ caps = copy.deepcopy(caps) always_match = {} for k, v in caps.items(): always_match[k] = v - return {"capabilities": {"firstMatch": [{}], "alwaysMatch": always_match}} + return {"capabilities": {"firstMatch": [{}], "alwaysMatch": always_match}} -
[docs]def get_remote_connection( +
+[docs] +def get_remote_connection( capabilities: dict, command_executor: Union[str, RemoteConnection], keep_alive: bool, @@ -157,7 +318,7 @@

Source code for selenium.webdriver.remote.webdriver

from selenium.webdriver.safari.remote_connection import SafariRemoteConnection candidates = [ChromeRemoteConnection, EdgeRemoteConnection, SafariRemoteConnection, FirefoxRemoteConnection] - handler = next((c for c in candidates if c.browser_name == capabilities.get("browserName")), RemoteConnection) + handler = next((c for c in candidates if c.browser_name == capabilities.get("browserName")), RemoteConnection) return handler( remote_server_addr=command_executor, @@ -167,8 +328,11 @@

Source code for selenium.webdriver.remote.webdriver

)
-
[docs]def create_matches(options: List[BaseOptions]) -> Dict: - capabilities = {"capabilities": {}} + +
+[docs] +def create_matches(options: List[BaseOptions]) -> Dict: + capabilities = {"capabilities": {}} opts = [] for opt in options: opts.append(opt.to_capabilities()) @@ -195,40 +359,46 @@

Source code for selenium.webdriver.remote.webdriver

for k in always: del i[k] - capabilities["capabilities"]["alwaysMatch"] = always - capabilities["capabilities"]["firstMatch"] = opts + capabilities["capabilities"]["alwaysMatch"] = always + capabilities["capabilities"]["firstMatch"] = opts return capabilities
-
[docs]class BaseWebDriver(metaclass=ABCMeta): - """Abstract Base Class for all Webdriver subtypes. - ABC's allow custom implementations of Webdriver to be registered so +
+[docs] +class BaseWebDriver(metaclass=ABCMeta): + """Abstract Base Class for all Webdriver subtypes. + + ABC's allow custom implementations of Webdriver to be registered so that isinstance type checks will succeed. - """
+ """
-
[docs]class WebDriver(BaseWebDriver): - """Controls a browser by sending commands to a remote server. This server + +
+[docs] +class WebDriver(BaseWebDriver): + """Controls a browser by sending commands to a remote server. This server is expected to be running the WebDriver wire protocol as defined at https://www.selenium.dev/documentation/legacy/json_wire_protocol/. Attributes: - ---------- + ----------- session_id - String ID of the browser session started and controlled by this WebDriver. capabilities - Dictionary of effective capabilities of this browser session as returned by the remote server. See https://www.selenium.dev/documentation/legacy/desired_capabilities/ command_executor : str or remote_connection.RemoteConnection object used to execute commands. error_handler - errorhandler.ErrorHandler object used to handle errors. - """ + """ _web_element_cls = WebElement _shadowroot_cls = ShadowRoot def __init__( self, - command_executor: Union[str, RemoteConnection] = "http://127.0.0.1:4444", + command_executor: Union[str, RemoteConnection] = "http://127.0.0.1:4444", keep_alive: bool = True, file_detector: Optional[FileDetector] = None, options: Optional[Union[BaseOptions, List[BaseOptions]]] = None, @@ -236,14 +406,14 @@

Source code for selenium.webdriver.remote.webdriver

web_element_cls: Optional[type] = None, client_config: Optional[ClientConfig] = None, ) -> None: - """Create a new driver that will issue commands using the wire + """Create a new driver that will issue commands using the wire protocol. Parameters: - ---------- + ----------- command_executor : str or remote_connection.RemoteConnection - Either a string representing the URL of the remote server or a custom - remote_connection.RemoteConnection object. Defaults to 'http://127.0.0.1:4444/wd/hub'. + remote_connection.RemoteConnection object. Defaults to 'http://127.0.0.1:4444/wd/hub'. keep_alive : bool (Deprecated) - Whether to configure remote_connection.RemoteConnection to use HTTP keep-alive. Defaults to True. file_detector : object or None @@ -256,7 +426,7 @@

Source code for selenium.webdriver.remote.webdriver

- Custom class to use for web elements. Defaults to WebElement. client_config : object or None - Custom client configuration to use. Defaults to None. - """ + """ if isinstance(options, list): capabilities = create_matches(options) @@ -292,7 +462,7 @@

Source code for selenium.webdriver.remote.webdriver

self._script = None def __repr__(self): - return f'<{type(self).__module__}.{type(self).__name__} (session="{self.session_id}")>' + return f'<{type(self).__module__}.{type(self).__name__} (session="{self.session_id}")>' def __enter__(self): return self @@ -305,13 +475,15 @@

Source code for selenium.webdriver.remote.webdriver

): self.quit() -
[docs] @contextmanager +
+[docs] + @contextmanager def file_detector_context(self, file_detector_class, *args, **kwargs): - """Overrides the current file detector (if necessary) in limited + """Overrides the current file detector (if necessary) in limited context. Ensures the original file detector is set afterwards. Parameters: - ---------- + ----------- file_detector_class : object - Class of the desired file detector. If the class is different from the current file_detector, then the class is instantiated with args and kwargs @@ -324,8 +496,8 @@

Source code for selenium.webdriver.remote.webdriver

Example: -------- >>> with webdriver.file_detector_context(UselessFileDetector): - >>> someinput.send_keys('/etc/hosts') - """ + >>> someinput.send_keys('/etc/hosts') + """ last_detector = None if not isinstance(self.file_detector, file_detector_class): last_detector = self.file_detector @@ -336,50 +508,60 @@

Source code for selenium.webdriver.remote.webdriver

if last_detector: self.file_detector = last_detector
+ @property def mobile(self) -> Mobile: return self._mobile @property def name(self) -> str: - """Returns the name of the underlying browser for this instance. + """Returns the name of the underlying browser for this instance. Example: -------- >>> name = driver.name - """ - if "browserName" in self.caps: - return self.caps["browserName"] - raise KeyError("browserName not specified in session capabilities") + """ + if "browserName" in self.caps: + return self.caps["browserName"] + raise KeyError("browserName not specified in session capabilities") -
[docs] def start_client(self): - """Called before starting a new session. +
+[docs] + def start_client(self): + """Called before starting a new session. This method may be overridden to define custom startup behavior. - """ + """ pass
-
[docs] def stop_client(self): - """Called after executing a quit command. + +
+[docs] + def stop_client(self): + """Called after executing a quit command. This method may be overridden to define custom shutdown behavior. - """ + """ pass
-
[docs] def start_session(self, capabilities: dict) -> None: - """Creates a new session with the desired capabilities. + +
+[docs] + def start_session(self, capabilities: dict) -> None: + """Creates a new session with the desired capabilities. Parameters: - ---------- + ----------- capabilities : dict - A capabilities dict to start the session with. - """ + """ caps = _create_caps(capabilities) - response = self.execute(Command.NEW_SESSION, caps)["value"] - self.session_id = response.get("sessionId") - self.caps = response.get("capabilities")
+ response = self.execute(Command.NEW_SESSION, caps)["value"] + self.session_id = response.get("sessionId") + self.caps = response.get("capabilities")
+ def _wrap_value(self, value): if isinstance(value, dict): @@ -388,23 +570,26 @@

Source code for selenium.webdriver.remote.webdriver

converted[key] = self._wrap_value(val) return converted if isinstance(value, self._web_element_cls): - return {"element-6066-11e4-a52e-4f735466cecf": value.id} + return {"element-6066-11e4-a52e-4f735466cecf": value.id} if isinstance(value, self._shadowroot_cls): - return {"shadow-6066-11e4-a52e-4f735466cecf": value.id} + return {"shadow-6066-11e4-a52e-4f735466cecf": value.id} if isinstance(value, list): return list(self._wrap_value(item) for item in value) return value -
[docs] def create_web_element(self, element_id: str) -> WebElement: - """Creates a web element with the specified `element_id`.""" +
+[docs] + def create_web_element(self, element_id: str) -> WebElement: + """Creates a web element with the specified `element_id`.""" return self._web_element_cls(self, element_id)
+ def _unwrap_value(self, value): if isinstance(value, dict): - if "element-6066-11e4-a52e-4f735466cecf" in value: - return self.create_web_element(value["element-6066-11e4-a52e-4f735466cecf"]) - if "shadow-6066-11e4-a52e-4f735466cecf" in value: - return self._shadowroot_cls(self, value["shadow-6066-11e4-a52e-4f735466cecf"]) + if "element-6066-11e4-a52e-4f735466cecf" in value: + return self.create_web_element(value["element-6066-11e4-a52e-4f735466cecf"]) + if "shadow-6066-11e4-a52e-4f735466cecf" in value: + return self._shadowroot_cls(self, value["shadow-6066-11e4-a52e-4f735466cecf"]) for key, val in value.items(): value[key] = self._unwrap_value(val) return value @@ -412,14 +597,16 @@

Source code for selenium.webdriver.remote.webdriver

return list(self._unwrap_value(item) for item in value) return value -
[docs] def execute_cdp_cmd(self, cmd: str, cmd_args: dict): - """Execute Chrome Devtools Protocol command and get returned result The +
+[docs] + def execute_cdp_cmd(self, cmd: str, cmd_args: dict): + """Execute Chrome Devtools Protocol command and get returned result The command and command args should follow chrome devtools protocol domains/commands, refer to link https://chromedevtools.github.io/devtools-protocol/ Parameters: - ---------- + ----------- cmd : str, - Command name @@ -430,20 +617,23 @@

Source code for selenium.webdriver.remote.webdriver

Returns: -------- A dict, empty dict {} if there is no result to return. - - To getResponseBody: {'base64Encoded': False, 'body': 'response body string'} + - To getResponseBody: {'base64Encoded': False, 'body': 'response body string'} Example: -------- - >>> driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': requestId}) + >>> driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': requestId}) + + """ + return self.execute("executeCdpCommand", {"cmd": cmd, "params": cmd_args})["value"]
- """ - return self.execute("executeCdpCommand", {"cmd": cmd, "params": cmd_args})["value"]
-
[docs] def execute(self, driver_command: str, params: dict = None) -> dict: - """Sends a command to be executed by a command.CommandExecutor. +
+[docs] + def execute(self, driver_command: str, params: dict = None) -> dict: + """Sends a command to be executed by a command.CommandExecutor. Parameters: - ---------- + ----------- driver_command : str - The name of the command to execute as a string. @@ -452,34 +642,37 @@

Source code for selenium.webdriver.remote.webdriver

Returns: -------- - dict - The command's JSON response loaded into a dictionary object. - """ + dict - The command's JSON response loaded into a dictionary object. + """ params = self._wrap_value(params) if self.session_id: if not params: - params = {"sessionId": self.session_id} - elif "sessionId" not in params: - params["sessionId"] = self.session_id + params = {"sessionId": self.session_id} + elif "sessionId" not in params: + params["sessionId"] = self.session_id response = self.command_executor.execute(driver_command, params) if response: self.error_handler.check_response(response) - response["value"] = self._unwrap_value(response.get("value", None)) + response["value"] = self._unwrap_value(response.get("value", None)) return response - # If the server doesn't send a response, assume the command was + # If the server doesn't send a response, assume the command was # a success - return {"success": 0, "value": None, "sessionId": self.session_id}
+ return {"success": 0, "value": None, "sessionId": self.session_id}
-
[docs] def get(self, url: str) -> None: - """Navigate the browser to the specified URL in the current window or + +
+[docs] + def get(self, url: str) -> None: + """Navigate the browser to the specified URL in the current window or tab. The method does not return until the page is fully loaded (i.e. the onload event has fired). Parameters: - ---------- + ----------- url : str - The URL to be opened by the browser. - Must include the protocol (e.g., http://, https://). @@ -487,59 +680,71 @@

Source code for selenium.webdriver.remote.webdriver

Example: -------- >>> driver = webdriver.Chrome() - >>> driver.get("https://example.com") - """ - self.execute(Command.GET, {"url": url})
+ >>> driver.get("https://example.com") + """ + self.execute(Command.GET, {"url": url})
+ @property def title(self) -> str: - """Returns the title of the current page. + """Returns the title of the current page. Example: -------- - >>> element = driver.find_element(By.ID, 'foo') + >>> element = driver.find_element(By.ID, 'foo') >>> print(element.title()) - """ - return self.execute(Command.GET_TITLE).get("value", "") + """ + return self.execute(Command.GET_TITLE).get("value", "") -
[docs] def pin_script(self, script: str, script_key=None) -> ScriptKey: - """Store common javascript scripts to be executed later by a unique +
+[docs] + def pin_script(self, script: str, script_key=None) -> ScriptKey: + """Store common javascript scripts to be executed later by a unique hashable ID. Example: -------- - >>> script = "return document.getElementById('foo').value" - """ + >>> script = "return document.getElementById('foo').value" + """ script_key_instance = ScriptKey(script_key) self.pinned_scripts[script_key_instance.id] = script return script_key_instance
-
[docs] def unpin(self, script_key: ScriptKey) -> None: - """Remove a pinned script from storage. + +
+[docs] + def unpin(self, script_key: ScriptKey) -> None: + """Remove a pinned script from storage. Example: -------- >>> driver.unpin(script_key) - """ + """ try: self.pinned_scripts.pop(script_key.id) except KeyError: - raise KeyError(f"No script with key: {script_key} existed in {self.pinned_scripts}") from None
+ raise KeyError(f"No script with key: {script_key} existed in {self.pinned_scripts}") from None
-
[docs] def get_pinned_scripts(self) -> List[str]: - """Return a list of all pinned scripts. + +
+[docs] + def get_pinned_scripts(self) -> List[str]: + """Return a list of all pinned scripts. Example: -------- >>> pinned_scripts = driver.get_pinned_scripts() - """ + """ return list(self.pinned_scripts)
-
[docs] def execute_script(self, script, *args): - """Synchronously Executes JavaScript in the current window/frame. + +
+[docs] + def execute_script(self, script, *args): + """Synchronously Executes JavaScript in the current window/frame. Parameters: - ---------- + ----------- script : str - The javascript to execute. @@ -548,28 +753,31 @@

Source code for selenium.webdriver.remote.webdriver

Example: -------- - >>> input_id = "username" - >>> input_value = "test_user" + >>> input_id = "username" + >>> input_value = "test_user" >>> driver.execute_script( - ... "document.getElementById(arguments[0]).value = arguments[1];", input_id, input_value + ... "document.getElementById(arguments[0]).value = arguments[1];", input_id, input_value ... ) - """ + """ if isinstance(script, ScriptKey): try: script = self.pinned_scripts[script.id] except KeyError: - raise JavascriptException("Pinned script could not be found") + raise JavascriptException("Pinned script could not be found") converted_args = list(args) command = Command.W3C_EXECUTE_SCRIPT - return self.execute(command, {"script": script, "args": converted_args})["value"]
+ return self.execute(command, {"script": script, "args": converted_args})["value"]
+ -
[docs] def execute_async_script(self, script: str, *args): - """Asynchronously Executes JavaScript in the current window/frame. +
+[docs] + def execute_async_script(self, script: str, *args): + """Asynchronously Executes JavaScript in the current window/frame. Parameters: - ---------- + ----------- script : str - The javascript to execute. @@ -578,102 +786,120 @@

Source code for selenium.webdriver.remote.webdriver

Example: -------- - >>> script = "var callback = arguments[arguments.length - 1]; " - ... "window.setTimeout(function(){ callback('timeout') }, 3000);" + >>> script = "var callback = arguments[arguments.length - 1]; " + ... "window.setTimeout(function(){ callback('timeout') }, 3000);" >>> driver.execute_async_script(script) - """ + """ converted_args = list(args) command = Command.W3C_EXECUTE_SCRIPT_ASYNC - return self.execute(command, {"script": script, "args": converted_args})["value"]
+ return self.execute(command, {"script": script, "args": converted_args})["value"]
+ @property def current_url(self) -> str: - """Gets the URL of the current page. + """Gets the URL of the current page. Example: -------- >>> print(driver.current_url) - """ - return self.execute(Command.GET_CURRENT_URL)["value"] + """ + return self.execute(Command.GET_CURRENT_URL)["value"] @property def page_source(self) -> str: - """Gets the source of the current page. + """Gets the source of the current page. Example: -------- >>> print(driver.page_source) - """ - return self.execute(Command.GET_PAGE_SOURCE)["value"] + """ + return self.execute(Command.GET_PAGE_SOURCE)["value"] -
[docs] def close(self) -> None: - """Closes the current window. +
+[docs] + def close(self) -> None: + """Closes the current window. Example: -------- >>> driver.close() - """ + """ self.execute(Command.CLOSE)
-
[docs] def quit(self) -> None: - """Quits the driver and closes every associated window. + +
+[docs] + def quit(self) -> None: + """Quits the driver and closes every associated window. Example: -------- >>> driver.quit() - """ + """ try: self.execute(Command.QUIT) finally: self.stop_client() self.command_executor.close()
+ @property def current_window_handle(self) -> str: - """Returns the handle of the current window. + """Returns the handle of the current window. Example: -------- >>> print(driver.current_window_handle) - """ - return self.execute(Command.W3C_GET_CURRENT_WINDOW_HANDLE)["value"] + """ + return self.execute(Command.W3C_GET_CURRENT_WINDOW_HANDLE)["value"] @property def window_handles(self) -> List[str]: - """Returns the handles of all windows within the current session. + """Returns the handles of all windows within the current session. Example: -------- >>> print(driver.window_handles) - """ - return self.execute(Command.W3C_GET_WINDOW_HANDLES)["value"] + """ + return self.execute(Command.W3C_GET_WINDOW_HANDLES)["value"] -
[docs] def maximize_window(self) -> None: - """Maximizes the current window that webdriver is using. +
+[docs] + def maximize_window(self) -> None: + """Maximizes the current window that webdriver is using. Example: -------- >>> driver.maximize_window() - """ + """ command = Command.W3C_MAXIMIZE_WINDOW self.execute(command, None)
-
[docs] def fullscreen_window(self) -> None: - """Invokes the window manager-specific 'full screen' operation. + +
+[docs] + def fullscreen_window(self) -> None: + """Invokes the window manager-specific 'full screen' operation. Example: -------- >>> driver.fullscreen_window() - """ + """ self.execute(Command.FULLSCREEN_WINDOW)
-
[docs] def minimize_window(self) -> None: - """Invokes the window manager-specific 'minimize' operation.""" + +
+[docs] + def minimize_window(self) -> None: + """Invokes the window manager-specific 'minimize' operation.""" self.execute(Command.MINIMIZE_WINDOW)
-
[docs] def print_page(self, print_options: Optional[PrintOptions] = None) -> str: - """Takes PDF of the current page. + +
+[docs] + def print_page(self, print_options: Optional[PrintOptions] = None) -> str: + """Takes PDF of the current page. The driver makes a best effort to return a PDF based on the provided Parameters. @@ -681,16 +907,17 @@

Source code for selenium.webdriver.remote.webdriver

Example: -------- >>> driver.print_page() - """ + """ options = {} if print_options: options = print_options.to_dict() - return self.execute(Command.PRINT_PAGE, options)["value"]
+ return self.execute(Command.PRINT_PAGE, options)["value"]
+ @property def switch_to(self) -> SwitchTo: - """Return an object containing all options to switch focus into. + """Return an object containing all options to switch focus into. Returns: -------- @@ -701,45 +928,56 @@

Source code for selenium.webdriver.remote.webdriver

>>> element = driver.switch_to.active_element >>> alert = driver.switch_to.alert >>> driver.switch_to.default_content() - >>> driver.switch_to.frame('frame_name') + >>> driver.switch_to.frame('frame_name') >>> driver.switch_to.frame(1) - >>> driver.switch_to.frame(driver.find_elements(By.TAG_NAME, "iframe")[0]) + >>> driver.switch_to.frame(driver.find_elements(By.TAG_NAME, "iframe")[0]) >>> driver.switch_to.parent_frame() - >>> driver.switch_to.window('main') - """ + >>> driver.switch_to.window('main') + """ return self._switch_to # Navigation -
[docs] def back(self) -> None: - """Goes one step backward in the browser history. +
+[docs] + def back(self) -> None: + """Goes one step backward in the browser history. Example: -------- >>> driver.back() - """ + """ self.execute(Command.GO_BACK)
-
[docs] def forward(self) -> None: - """Goes one step forward in the browser history. + +
+[docs] + def forward(self) -> None: + """Goes one step forward in the browser history. Example: -------- >>> driver.forward() - """ + """ self.execute(Command.GO_FORWARD)
-
[docs] def refresh(self) -> None: - """Refreshes the current page. + +
+[docs] + def refresh(self) -> None: + """Refreshes the current page. Example: -------- >>> driver.refresh() - """ + """ self.execute(Command.REFRESH)
+ # Options -
[docs] def get_cookies(self) -> List[dict]: - """Returns a set of dictionaries, corresponding to cookies visible in +
+[docs] + def get_cookies(self) -> List[dict]: + """Returns a set of dictionaries, corresponding to cookies visible in the current session. Returns: @@ -749,115 +987,147 @@

Source code for selenium.webdriver.remote.webdriver

Example: -------- >>> cookies = driver.get_cookies() - """ - return self.execute(Command.GET_ALL_COOKIES)["value"]
+ """ + return self.execute(Command.GET_ALL_COOKIES)["value"]
-
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/remote/webelement.html b/docs/api/py/_modules/selenium/webdriver/remote/webelement.html index 4a11dcfeef6b6..cfcb0857ca6db 100644 --- a/docs/api/py/_modules/selenium/webdriver/remote/webelement.html +++ b/docs/api/py/_modules/selenium/webdriver/remote/webelement.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.remote.webelement — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.remote.webelement — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.remote.webelement

+  

Source code for selenium.webdriver.remote.webelement

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -82,23 +238,28 @@ 

Source code for selenium.webdriver.remote.webelement

def _load_js(): global getAttribute_js global isDisplayed_js - _pkg = ".".join(__name__.split(".")[:-1]) - getAttribute_js = pkgutil.get_data(_pkg, "getAttribute.js").decode("utf8") - isDisplayed_js = pkgutil.get_data(_pkg, "isDisplayed.js").decode("utf8") + _pkg = ".".join(__name__.split(".")[:-1]) + getAttribute_js = pkgutil.get_data(_pkg, "getAttribute.js").decode("utf8") + isDisplayed_js = pkgutil.get_data(_pkg, "isDisplayed.js").decode("utf8") -
[docs]class BaseWebElement(metaclass=ABCMeta): - """Abstract Base Class for WebElement. +
+[docs] +class BaseWebElement(metaclass=ABCMeta): + """Abstract Base Class for WebElement. - ABC's will allow custom types to be registered as a WebElement to + ABC's will allow custom types to be registered as a WebElement to pass type checks. - """ + """ pass
-
[docs]class WebElement(BaseWebElement): - """Represents a DOM element. + +
+[docs] +class WebElement(BaseWebElement): + """Represents a DOM element. Generally, all interesting operations that interact with a document will be performed through this interface. @@ -108,18 +269,18 @@

Source code for selenium.webdriver.remote.webelement

element is still attached to the DOM. If this test fails, then an ``StaleElementReferenceException`` is thrown, and all future calls to this instance will fail. - """ + """ def __init__(self, parent, id_) -> None: self._parent = parent self._id = id_ def __repr__(self): - return f'<{type(self).__module__}.{type(self).__name__} (session="{self._parent.session_id}", element="{self._id}")>' + return f'<{type(self).__module__}.{type(self).__name__} (session="{self._parent.session_id}", element="{self._id}")>' @property def tag_name(self) -> str: - """This element's ``tagName`` property. + """This element's ``tagName`` property. Returns: -------- @@ -127,13 +288,13 @@

Source code for selenium.webdriver.remote.webelement

Example: -------- - >>> element = driver.find_element(By.ID, 'foo') - """ - return self._execute(Command.GET_ELEMENT_TAG_NAME)["value"] + >>> element = driver.find_element(By.ID, 'foo') + """ + return self._execute(Command.GET_ELEMENT_TAG_NAME)["value"] @property def text(self) -> str: - """The text of the element. + """The text of the element. Returns: -------- @@ -141,61 +302,72 @@

Source code for selenium.webdriver.remote.webelement

Example: -------- - >>> element = driver.find_element(By.ID, 'foo') + >>> element = driver.find_element(By.ID, 'foo') >>> print(element.text) - """ - return self._execute(Command.GET_ELEMENT_TEXT)["value"] + """ + return self._execute(Command.GET_ELEMENT_TEXT)["value"] -
[docs] def click(self) -> None: - """Clicks the element. +
+[docs] + def click(self) -> None: + """Clicks the element. Example: -------- - >>> element = driver.find_element(By.ID, 'foo') + >>> element = driver.find_element(By.ID, 'foo') >>> element.click() - """ + """ self._execute(Command.CLICK_ELEMENT)
-
[docs] def submit(self) -> None: - """Submits a form. + +
+[docs] + def submit(self) -> None: + """Submits a form. Example: -------- - >>> form = driver.find_element(By.NAME, 'login') + >>> form = driver.find_element(By.NAME, 'login') >>> form.submit() - """ + """ script = ( - "/* submitForm */var form = arguments[0];\n" - 'while (form.nodeName != "FORM" && form.parentNode) {\n' - " form = form.parentNode;\n" - "}\n" - "if (!form) { throw Error('Unable to find containing form element'); }\n" - "if (!form.ownerDocument) { throw Error('Unable to find owning document'); }\n" - "var e = form.ownerDocument.createEvent('Event');\n" - "e.initEvent('submit', true, true);\n" - "if (form.dispatchEvent(e)) { HTMLFormElement.prototype.submit.call(form) }\n" + "/* submitForm */var form = arguments[0];\n" + 'while (form.nodeName != "FORM" && form.parentNode) {\n' + " form = form.parentNode;\n" + "}\n" + "if (!form) { throw Error('Unable to find containing form element'); }\n" + "if (!form.ownerDocument) { throw Error('Unable to find owning document'); }\n" + "var e = form.ownerDocument.createEvent('Event');\n" + "e.initEvent('submit', true, true);\n" + "if (form.dispatchEvent(e)) { HTMLFormElement.prototype.submit.call(form) }\n" ) try: self._parent.execute_script(script, self) except JavascriptException as exc: - raise WebDriverException("To submit an element, it must be nested inside a form element") from exc
+ raise WebDriverException("To submit an element, it must be nested inside a form element") from exc
+ -
[docs] def clear(self) -> None: - """Clears the text if it's a text entry element. +
+[docs] + def clear(self) -> None: + """Clears the text if it's a text entry element. Example: -------- - >>> text_field = driver.find_element(By.NAME, 'username') + >>> text_field = driver.find_element(By.NAME, 'username') >>> text_field.clear() - """ + """ self._execute(Command.CLEAR_ELEMENT)
-
[docs] def get_property(self, name) -> str | bool | WebElement | dict: - """Gets the given property of the element. + +
+[docs] + def get_property(self, name) -> str | bool | WebElement | dict: + """Gets the given property of the element. Parameters: - ---------- + ----------- name : str - Name of the property to retrieve. @@ -205,21 +377,24 @@

Source code for selenium.webdriver.remote.webelement

Example: ------- - >>> text_length = target_element.get_property("text_length") - """ + >>> text_length = target_element.get_property("text_length") + """ try: - return self._execute(Command.GET_ELEMENT_PROPERTY, {"name": name})["value"] + return self._execute(Command.GET_ELEMENT_PROPERTY, {"name": name})["value"] except WebDriverException: - # if we hit an end point that doesn't understand getElementProperty lets fake it - return self.parent.execute_script("return arguments[0][arguments[1]]", self, name)
+ # if we hit an end point that doesn't understand getElementProperty lets fake it + return self.parent.execute_script("return arguments[0][arguments[1]]", self, name)
-
[docs] def get_dom_attribute(self, name) -> str: - """Gets the given attribute of the element. Unlike + +
+[docs] + def get_dom_attribute(self, name) -> str: + """Gets the given attribute of the element. Unlike :func:`~selenium.webdriver.remote.BaseWebElement.get_attribute`, this - method only returns attributes declared in the element's HTML markup. + method only returns attributes declared in the element's HTML markup. Parameters: - ---------- + ----------- name : str - Name of the attribute to retrieve. @@ -229,19 +404,22 @@

Source code for selenium.webdriver.remote.webelement

Example: ------- - >>> text_length = target_element.get_dom_attribute("class") - """ - return self._execute(Command.GET_ELEMENT_ATTRIBUTE, {"name": name})["value"]
+ >>> text_length = target_element.get_dom_attribute("class") + """ + return self._execute(Command.GET_ELEMENT_ATTRIBUTE, {"name": name})["value"]
+ -
[docs] def get_attribute(self, name) -> str | None: - """Gets the given attribute or property of the element. +
+[docs] + def get_attribute(self, name) -> str | None: + """Gets the given attribute or property of the element. This method will first try to return the value of a property with the - given name. If a property with that name doesn't exist, it returns the - value of the attribute with the same name. If there's no attribute with + given name. If a property with that name doesn't exist, it returns the + value of the attribute with the same name. If there's no attribute with that name, ``None`` is returned. - Values which are considered truthy, that is equals "true" or "false", + Values which are considered truthy, that is equals "true" or "false", are returned as booleans. All other non-``None`` values are returned as strings. For attributes or properties which do not exist, ``None`` is returned. @@ -251,7 +429,7 @@

Source code for selenium.webdriver.remote.webelement

:func:`~selenium.webdriver.remote.BaseWebElement.get_property` methods respectively. Parameters: - ---------- + ----------- name : str - Name of the attribute/property to retrieve. @@ -261,18 +439,21 @@

Source code for selenium.webdriver.remote.webelement

Example: -------- - >>> # Check if the "active" CSS class is applied to an element. - >>> is_active = "active" in target_element.get_attribute("class") - """ + >>> # Check if the "active" CSS class is applied to an element. + >>> is_active = "active" in target_element.get_attribute("class") + """ if getAttribute_js is None: _load_js() attribute_value = self.parent.execute_script( - f"/* getAttribute */return ({getAttribute_js}).apply(null, arguments);", self, name + f"/* getAttribute */return ({getAttribute_js}).apply(null, arguments);", self, name ) return attribute_value
-
[docs] def is_selected(self) -> bool: - """Returns whether the element is selected. + +
+[docs] + def is_selected(self) -> bool: + """Returns whether the element is selected. Example: -------- @@ -282,23 +463,29 @@

Source code for selenium.webdriver.remote.webelement

------ - This method is generally used on checkboxes, options in a select and radio buttons. - """ - return self._execute(Command.IS_ELEMENT_SELECTED)["value"]
+ """ + return self._execute(Command.IS_ELEMENT_SELECTED)["value"]
-
[docs] def is_enabled(self) -> bool: - """Returns whether the element is enabled. + +
+[docs] + def is_enabled(self) -> bool: + """Returns whether the element is enabled. Example: -------- >>> is_enabled = element.is_enabled() - """ - return self._execute(Command.IS_ELEMENT_ENABLED)["value"]
+ """ + return self._execute(Command.IS_ELEMENT_ENABLED)["value"]
+ -
[docs] def send_keys(self, *value: str) -> None: - """Simulates typing into the element. +
+[docs] + def send_keys(self, *value: str) -> None: + """Simulates typing into the element. Parameters: - ---------- + ----------- value : str - A string for typing, or setting form fields. For setting file inputs, this could be a local file path. @@ -311,38 +498,41 @@

Source code for selenium.webdriver.remote.webelement

Examples: -------- To send a simple key event:: - >>> form_textfield = driver.find_element(By.NAME, 'username') - >>> form_textfield.send_keys("admin") + >>> form_textfield = driver.find_element(By.NAME, 'username') + >>> form_textfield.send_keys("admin") or to set a file input field:: - >>> file_input = driver.find_element(By.NAME, 'profilePic') - >>> file_input.send_keys("path/to/profilepic.gif") - >>> # Generally it's better to wrap the file path in one of the methods + >>> file_input = driver.find_element(By.NAME, 'profilePic') + >>> file_input.send_keys("path/to/profilepic.gif") + >>> # Generally it's better to wrap the file path in one of the methods >>> # in os.path to return the actual path to support cross OS testing. - >>> # file_input.send_keys(os.path.abspath("path/to/profilepic.gif")) - """ + >>> # file_input.send_keys(os.path.abspath("path/to/profilepic.gif")) + >>> # When using Cygwin, the path need to be provided in Windows format. + >>> # file_input.send_keys(f"C:/cygwin{os.path.abspath('path/to/profilepic.gif').replace('/', '\\')}") + """ # transfer file to another machine only if remote driver is used # the same behaviour as for java binding if self.parent._is_remote: local_files = list( map( lambda keys_to_send: self.parent.file_detector.is_local_file(str(keys_to_send)), - "".join(map(str, value)).split("\n"), + "".join(map(str, value)).split("\n"), ) ) if None not in local_files: remote_files = [] for file in local_files: remote_files.append(self._upload(file)) - value = tuple("\n".join(remote_files)) + value = tuple("\n".join(remote_files)) self._execute( - Command.SEND_KEYS_TO_ELEMENT, {"text": "".join(keys_to_typing(value)), "value": keys_to_typing(value)} + Command.SEND_KEYS_TO_ELEMENT, {"text": "".join(keys_to_typing(value)), "value": keys_to_typing(value)} )
+ @property def shadow_root(self) -> ShadowRoot: - """Returns a shadow root of the element if there is one or an error. + """Returns a shadow root of the element if there is one or an error. Only works from Chromium 96, Firefox 96, and Safari 16.4 onwards. Returns: @@ -358,26 +548,29 @@

Source code for selenium.webdriver.remote.webelement

>>> try: ... shadow_root = element.shadow_root >>> except NoSuchShadowRoot: - ... print("No shadow root attached to element") - """ - return self._execute(Command.GET_SHADOW_ROOT)["value"] + ... print("No shadow root attached to element") + """ + return self._execute(Command.GET_SHADOW_ROOT)["value"] # RenderedWebElement Items -
[docs] def is_displayed(self) -> bool: - """Whether the element is visible to a user. +
+[docs] + def is_displayed(self) -> bool: + """Whether the element is visible to a user. Example: -------- >>> is_displayed = element.is_displayed() - """ - # Only go into this conditional for browsers that don't use the atom themselves + """ + # Only go into this conditional for browsers that don't use the atom themselves if isDisplayed_js is None: _load_js() - return self.parent.execute_script(f"/* isDisplayed */return ({isDisplayed_js}).apply(null, arguments);", self)
+ return self.parent.execute_script(f"/* isDisplayed */return ({isDisplayed_js}).apply(null, arguments);", self)
+ @property def location_once_scrolled_into_view(self) -> dict: - """THIS PROPERTY MAY CHANGE WITHOUT WARNING. Use this to discover where + """THIS PROPERTY MAY CHANGE WITHOUT WARNING. Use this to discover where on the screen an element is so that we can click it. This method should cause the element to be scrolled into view. @@ -389,19 +582,19 @@

Source code for selenium.webdriver.remote.webelement

Example: -------- >>> loc = element.location_once_scrolled_into_view - """ + """ old_loc = self._execute( Command.W3C_EXECUTE_SCRIPT, { - "script": "arguments[0].scrollIntoView(true); return arguments[0].getBoundingClientRect()", - "args": [self], + "script": "arguments[0].scrollIntoView(true); return arguments[0].getBoundingClientRect()", + "args": [self], }, - )["value"] - return {"x": round(old_loc["x"]), "y": round(old_loc["y"])} + )["value"] + return {"x": round(old_loc["x"]), "y": round(old_loc["y"])} @property def size(self) -> dict: - """The size of the element. + """The size of the element. Returns: -------- @@ -410,16 +603,18 @@

Source code for selenium.webdriver.remote.webelement

Example: -------- >>> size = element.size - """ - size = self._execute(Command.GET_ELEMENT_RECT)["value"] - new_size = {"height": size["height"], "width": size["width"]} + """ + size = self._execute(Command.GET_ELEMENT_RECT)["value"] + new_size = {"height": size["height"], "width": size["width"]} return new_size -
[docs] def value_of_css_property(self, property_name) -> str: - """The value of a CSS property. +
+[docs] + def value_of_css_property(self, property_name) -> str: + """The value of a CSS property. Parameters: - ---------- + ----------- property_name : str - The name of the CSS property to get the value of. @@ -429,13 +624,14 @@

Source code for selenium.webdriver.remote.webelement

Example: -------- - >>> value = element.value_of_css_property('color') - """ - return self._execute(Command.GET_ELEMENT_VALUE_OF_CSS_PROPERTY, {"propertyName": property_name})["value"]
+ >>> value = element.value_of_css_property('color') + """ + return self._execute(Command.GET_ELEMENT_VALUE_OF_CSS_PROPERTY, {"propertyName": property_name})["value"]
+ @property def location(self) -> dict: - """The location of the element in the renderable canvas. + """The location of the element in the renderable canvas. Returns: -------- @@ -444,14 +640,14 @@

Source code for selenium.webdriver.remote.webelement

Example: -------- >>> loc = element.location - """ - old_loc = self._execute(Command.GET_ELEMENT_RECT)["value"] - new_loc = {"x": round(old_loc["x"]), "y": round(old_loc["y"])} + """ + old_loc = self._execute(Command.GET_ELEMENT_RECT)["value"] + new_loc = {"x": round(old_loc["x"]), "y": round(old_loc["y"])} return new_loc @property def rect(self) -> dict: - """A dictionary with the size and location of the element. + """A dictionary with the size and location of the element. Returns: -------- @@ -460,12 +656,12 @@

Source code for selenium.webdriver.remote.webelement

Example: -------- >>> rect = element.rect - """ - return self._execute(Command.GET_ELEMENT_RECT)["value"] + """ + return self._execute(Command.GET_ELEMENT_RECT)["value"] @property def aria_role(self) -> str: - """Returns the ARIA role of the current web element. + """Returns the ARIA role of the current web element. Returns: -------- @@ -474,12 +670,12 @@

Source code for selenium.webdriver.remote.webelement

Example: -------- >>> role = element.aria_role - """ - return self._execute(Command.GET_ELEMENT_ARIA_ROLE)["value"] + """ + return self._execute(Command.GET_ELEMENT_ARIA_ROLE)["value"] @property def accessible_name(self) -> str: - """Returns the ARIA Level of the current webelement. + """Returns the ARIA Level of the current webelement. Returns: -------- @@ -488,12 +684,12 @@

Source code for selenium.webdriver.remote.webelement

Example: -------- >>> name = element.accessible_name - """ - return self._execute(Command.GET_ELEMENT_ARIA_LABEL)["value"] + """ + return self._execute(Command.GET_ELEMENT_ARIA_LABEL)["value"] @property def screenshot_as_base64(self) -> str: - """Gets the screenshot of the current element as a base64 encoded + """Gets the screenshot of the current element as a base64 encoded string. Returns: @@ -503,12 +699,12 @@

Source code for selenium.webdriver.remote.webelement

Example: -------- >>> img_b64 = element.screenshot_as_base64 - """ - return self._execute(Command.ELEMENT_SCREENSHOT)["value"] + """ + return self._execute(Command.ELEMENT_SCREENSHOT)["value"] @property def screenshot_as_png(self) -> bytes: - """Gets the screenshot of the current element as a binary data. + """Gets the screenshot of the current element as a binary data. Returns: -------- @@ -517,11 +713,13 @@

Source code for selenium.webdriver.remote.webelement

Example: -------- >>> element_png = element.screenshot_as_png - """ - return b64decode(self.screenshot_as_base64.encode("ascii")) + """ + return b64decode(self.screenshot_as_base64.encode("ascii")) -
[docs] def screenshot(self, filename) -> bool: - """Saves a screenshot of the current element to a PNG image file. +
+[docs] + def screenshot(self, filename) -> bool: + """Saves a screenshot of the current element to a PNG image file. Returns False if there is any IOError, else returns True. Use full paths in your filename. @@ -530,23 +728,23 @@

Source code for selenium.webdriver.remote.webelement

bool : True if the screenshot was saved successfully, False otherwise. Parameters: - ---------- + ----------- filename : str The full path you wish to save your screenshot to. This should end with a `.png` extension. Element: -------- - >>> element.screenshot('/Screenshots/foo.png') - """ - if not filename.lower().endswith(".png"): + >>> element.screenshot('/Screenshots/foo.png') + """ + if not filename.lower().endswith(".png"): warnings.warn( - "name used for saved screenshot does not match file type. It should end with a `.png` extension", + "name used for saved screenshot does not match file type. It should end with a `.png` extension", UserWarning, ) png = self.screenshot_as_png try: - with open(filename, "wb") as f: + with open(filename, "wb") as f: f.write(png) except OSError: return False @@ -554,21 +752,22 @@

Source code for selenium.webdriver.remote.webelement

del png return True
+ @property def parent(self): - """Internal reference to the WebDriver instance this element was found + """Internal reference to the WebDriver instance this element was found from. Example: -------- - >>> element = driver.find_element(By.ID, 'foo') + >>> element = driver.find_element(By.ID, 'foo') >>> parent_element = element.parent - """ + """ return self._parent @property def id(self) -> str: - """Internal ID used by selenium. + """Internal ID used by selenium. This is mainly for internal use. Simple use cases such as checking if 2 webelements refer to the same element, can be done using ``==``:: @@ -576,22 +775,22 @@

Source code for selenium.webdriver.remote.webelement

Example: -------- >>> if element1 == element2: - ... print("These 2 are equal") - """ + ... print("These 2 are equal") + """ return self._id def __eq__(self, element): - return hasattr(element, "id") and self._id == element.id + return hasattr(element, "id") and self._id == element.id def __ne__(self, element): return not self.__eq__(element) # Private Methods def _execute(self, command, params=None): - """Executes a command against the underlying HTML element. + """Executes a command against the underlying HTML element. Parameters: - ---------- + ----------- command : any The name of the command to _execute as a string. @@ -600,18 +799,20 @@

Source code for selenium.webdriver.remote.webelement

Returns: ------- - The command's JSON response loaded into a dictionary object. - """ + The command's JSON response loaded into a dictionary object. + """ if not params: params = {} - params["id"] = self._id + params["id"] = self._id return self._parent.execute(command, params) -
[docs] def find_element(self, by=By.ID, value=None) -> WebElement: - """Find an element given a By strategy and locator. +
+[docs] + def find_element(self, by=By.ID, value=None) -> WebElement: + """Find an element given a By strategy and locator. Parameters: - ---------- + ----------- by : selenium.webdriver.common.by.By The locating strategy to use. Default is `By.ID`. Supported values include: - By.ID: Locate by element ID. @@ -619,28 +820,31 @@

Source code for selenium.webdriver.remote.webelement

- By.XPATH: Locate by an XPath expression. - By.CSS_SELECTOR: Locate by a CSS selector. - By.CLASS_NAME: Locate by the `class` attribute. - - By.TAG_NAME: Locate by the tag name (e.g., "input", "button"). + - By.TAG_NAME: Locate by the tag name (e.g., "input", "button"). - By.LINK_TEXT: Locate a link element by its exact text. - By.PARTIAL_LINK_TEXT: Locate a link element by partial text match. - RelativeBy: Locate elements relative to a specified root element. Example: -------- - element = driver.find_element(By.ID, 'foo') + element = driver.find_element(By.ID, 'foo') Returns: ------- WebElement The first matching `WebElement` found on the page. - """ + """ by, value = self._parent.locator_converter.convert(by, value) - return self._execute(Command.FIND_CHILD_ELEMENT, {"using": by, "value": value})["value"]
+ return self._execute(Command.FIND_CHILD_ELEMENT, {"using": by, "value": value})["value"]
-
[docs] def find_elements(self, by=By.ID, value=None) -> List[WebElement]: - """Find elements given a By strategy and locator. + +
+[docs] + def find_elements(self, by=By.ID, value=None) -> List[WebElement]: + """Find elements given a By strategy and locator. Parameters: - ---------- + ----------- by : selenium.webdriver.common.by.By The locating strategy to use. Default is `By.ID`. Supported values include: - By.ID: Locate by element ID. @@ -648,82 +852,74 @@

Source code for selenium.webdriver.remote.webelement

- By.XPATH: Locate by an XPath expression. - By.CSS_SELECTOR: Locate by a CSS selector. - By.CLASS_NAME: Locate by the `class` attribute. - - By.TAG_NAME: Locate by the tag name (e.g., "input", "button"). + - By.TAG_NAME: Locate by the tag name (e.g., "input", "button"). - By.LINK_TEXT: Locate a link element by its exact text. - By.PARTIAL_LINK_TEXT: Locate a link element by partial text match. - RelativeBy: Locate elements relative to a specified root element. Example: -------- - >>> element = driver.find_element(By.ID, 'foo') + >>> element = driver.find_elements(By.ID, 'foo') Returns: ------- - WebElement + List[WebElement] list of `WebElements` matching locator strategy found on the page. - """ + """ by, value = self._parent.locator_converter.convert(by, value) - return self._execute(Command.FIND_CHILD_ELEMENTS, {"using": by, "value": value})["value"]
+ return self._execute(Command.FIND_CHILD_ELEMENTS, {"using": by, "value": value})["value"]
+ def __hash__(self) -> int: - return int(md5_hash(self._id.encode("utf-8")).hexdigest(), 16) + return int(md5_hash(self._id.encode("utf-8")).hexdigest(), 16) def _upload(self, filename): fp = BytesIO() - zipped = zipfile.ZipFile(fp, "w", zipfile.ZIP_DEFLATED) + zipped = zipfile.ZipFile(fp, "w", zipfile.ZIP_DEFLATED) zipped.write(filename, os.path.split(filename)[1]) zipped.close() content = encodebytes(fp.getvalue()) if not isinstance(content, str): - content = content.decode("utf-8") + content = content.decode("utf-8") try: - return self._execute(Command.UPLOAD_FILE, {"file": content})["value"] + return self._execute(Command.UPLOAD_FILE, {"file": content})["value"] except WebDriverException as e: - if "Unrecognized command: POST" in str(e): + if "Unrecognized command: POST" in str(e): return filename - if "Command not found: POST " in str(e): + if "Command not found: POST " in str(e): return filename - if '{"status":405,"value":["GET","HEAD","DELETE"]}' in str(e): + if '{"status":405,"value":["GET","HEAD","DELETE"]}' in str(e): return filename raise
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/remote/websocket_connection.html b/docs/api/py/_modules/selenium/webdriver/remote/websocket_connection.html index ab98be767476a..41771557052a8 100644 --- a/docs/api/py/_modules/selenium/webdriver/remote/websocket_connection.html +++ b/docs/api/py/_modules/selenium/webdriver/remote/websocket_connection.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.remote.websocket_connection — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.remote.websocket_connection — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.remote.websocket_connection

+  

Source code for selenium.webdriver.remote.websocket_connection

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -63,7 +219,9 @@ 

Source code for selenium.webdriver.remote.websocket_connection

logger = logging.getLogger(__name__) -
[docs]class WebSocketConnection: +
+[docs] +class WebSocketConnection: _response_wait_timeout = 30 _response_wait_interval = 0.1 @@ -81,33 +239,41 @@

Source code for selenium.webdriver.remote.websocket_connection

self._start_ws() self._wait_until(lambda: self._started) -
[docs] def close(self): +
+[docs] + def close(self): self._ws_thread.join(timeout=self._response_wait_timeout) self._ws.close() self._started = False self._ws = None
-
[docs] def execute(self, command): + +
+[docs] + def execute(self, command): self._id += 1 payload = self._serialize_command(command) - payload["id"] = self._id + payload["id"] = self._id if self.session_id: - payload["sessionId"] = self.session_id + payload["sessionId"] = self.session_id data = json.dumps(payload) - logger.debug(f"-> {data}"[: self._max_log_message_size]) + logger.debug(f"-> {data}"[: self._max_log_message_size]) self._ws.send(data) self._wait_until(lambda: self._id in self._messages) response = self._messages.pop(self._id) - if "error" in response: - raise Exception(response["error"]) + if "error" in response: + raise Exception(response["error"]) else: - result = response["result"] + result = response["result"] return self._deserialize_result(result, command)
-
[docs] def add_callback(self, event, callback): + +
+[docs] + def add_callback(self, event, callback): event_name = event.event_class if event_name not in self.callbacks: self.callbacks[event_name] = [] @@ -118,9 +284,12 @@

Source code for selenium.webdriver.remote.websocket_connection

self.callbacks[event_name].append(_callback) return id(_callback)
+ on = add_callback -
[docs] def remove_callback(self, event, callback_id): +
+[docs] + def remove_callback(self, event, callback_id): event_name = event.event_class if event_name in self.callbacks: for callback in self.callbacks[event_name]: @@ -128,13 +297,14 @@

Source code for selenium.webdriver.remote.websocket_connection

self.callbacks[event_name].remove(callback) return
+ def _serialize_command(self, command): return next(command) def _deserialize_result(self, result, command): try: _ = command.send(result) - raise Exception("The command's generator function did not exit when expected!") + raise Exception("The command's generator function did not exit when expected!") except StopIteration as exit: return exit.value @@ -146,12 +316,12 @@

Source code for selenium.webdriver.remote.websocket_connection

self._process_message(message) def on_error(ws, error): - logger.debug(f"error: {error}") + logger.debug(f"error: {error}") ws.close() def run_socket(): - if self.url.startswith("wss://"): - self._ws.run_forever(sslopt={"cert_reqs": CERT_NONE}, suppress_origin=True) + if self.url.startswith("wss://"): + self._ws.run_forever(sslopt={"cert_reqs": CERT_NONE}, suppress_origin=True) else: self._ws.run_forever(suppress_origin=True) @@ -161,14 +331,14 @@

Source code for selenium.webdriver.remote.websocket_connection

def _process_message(self, message): message = json.loads(message) - logger.debug(f"<- {message}"[: self._max_log_message_size]) + logger.debug(f"<- {message}"[: self._max_log_message_size]) - if "id" in message: - self._messages[message["id"]] = message + if "id" in message: + self._messages[message["id"]] = message - if "method" in message: - params = message["params"] - for callback in self.callbacks.get(message["method"], []): + if "method" in message: + params = message["params"] + for callback in self.callbacks.get(message["method"], []): callback(params) def _wait_until(self, condition): @@ -182,44 +352,35 @@

Source code for selenium.webdriver.remote.websocket_connection

else: timeout -= interval sleep(interval)
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/safari/options.html b/docs/api/py/_modules/selenium/webdriver/safari/options.html index b21ec61637b46..054679d662918 100644 --- a/docs/api/py/_modules/selenium/webdriver/safari/options.html +++ b/docs/api/py/_modules/selenium/webdriver/safari/options.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.safari.options — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.safari.options — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.safari.options

+  

Source code for selenium.webdriver.safari.options

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -59,7 +215,7 @@ 

Source code for selenium.webdriver.safari.options

class _SafariOptionsDescriptor: - """_SafariOptionsDescriptor is an implementation of Descriptor protocol: + """_SafariOptionsDescriptor is an implementation of Descriptor protocol: : Any look-up or assignment to the below attributes in `Options` class will be intercepted by `__get__` and `__set__` method respectively. @@ -78,117 +234,110 @@

Source code for selenium.webdriver.safari.options

`self.automatic_inspection` = True `__set__` method sets/updates the value of the key `safari:automaticInspection` in `_caps` dictionary in `Options` class. - """ + """ def __init__(self, name, expected_type): self.name = name self.expected_type = expected_type def __get__(self, obj, cls): - if self.name == "Safari Technology Preview": - return obj._caps.get("browserName") == self.name + if self.name == "Safari Technology Preview": + return obj._caps.get("browserName") == self.name return obj._caps.get(self.name) def __set__(self, obj, value): if not isinstance(value, self.expected_type): - raise TypeError(f"{self.name} must be of type {self.expected_type}") - if self.name == "Safari Technology Preview": - obj._caps["browserName"] = self.name if value else "safari" + raise TypeError(f"{self.name} must be of type {self.expected_type}") + if self.name == "Safari Technology Preview": + obj._caps["browserName"] = self.name if value else "safari" else: obj._caps[self.name] = value -
[docs]class Options(ArgOptions): +
+[docs] +class Options(ArgOptions): # @see https://developer.apple.com/documentation/webkit/about_webdriver_for_safari - AUTOMATIC_INSPECTION = "safari:automaticInspection" - AUTOMATIC_PROFILING = "safari:automaticProfiling" - SAFARI_TECH_PREVIEW = "Safari Technology Preview" + AUTOMATIC_INSPECTION = "safari:automaticInspection" + AUTOMATIC_PROFILING = "safari:automaticProfiling" + SAFARI_TECH_PREVIEW = "Safari Technology Preview" # creating descriptor objects automatic_inspection = _SafariOptionsDescriptor(AUTOMATIC_INSPECTION, bool) - """Get or Set Automatic Inspection value: + """Get or Set Automatic Inspection value: - Usage - ----- + Usage: + ------ - Get - `self.automatic_inspection` - Set - `self.automatic_inspection` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - """ + """ automatic_profiling = _SafariOptionsDescriptor(AUTOMATIC_PROFILING, bool) - """Get or Set Automatic Profiling value: + """Get or Set Automatic Profiling value: - Usage - ----- + Usage: + ------ - Get - `self.automatic_profiling` - Set - `self.automatic_profiling` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - """ + """ use_technology_preview = _SafariOptionsDescriptor(SAFARI_TECH_PREVIEW, bool) - """Get and Set Technology Preview: + """Get and Set Technology Preview: - Usage - ----- + Usage: + ------ - Get - `self.use_technology_preview` - Set - `self.use_technology_preview` = `value` - Parameters - ---------- + Parameters: + ----------- `value`: `bool` - """ + """ @property def default_capabilities(self) -> Dict[str, str]: return DesiredCapabilities.SAFARI.copy()
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/safari/permissions.html b/docs/api/py/_modules/selenium/webdriver/safari/permissions.html index f0f25f9de884e..d4d34d8482b61 100644 --- a/docs/api/py/_modules/selenium/webdriver/safari/permissions.html +++ b/docs/api/py/_modules/selenium/webdriver/safari/permissions.html @@ -1,102 +1,251 @@ - + - selenium.webdriver.safari.permissions — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.safari.permissions — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.safari.permissions

+  

Source code for selenium.webdriver.safari.permissions

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-"""The Permission implementation."""
+"""The Permission implementation."""
+
 
+
+[docs] +class Permission: + """Set of supported permissions.""" -
[docs]class Permission: - """Set of supported permissions.""" + GET_USER_MEDIA = "getUserMedia"
- GET_USER_MEDIA = "getUserMedia"
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/safari/remote_connection.html b/docs/api/py/_modules/selenium/webdriver/safari/remote_connection.html index d213f46de7ea4..d4fefcc1e2d98 100644 --- a/docs/api/py/_modules/selenium/webdriver/safari/remote_connection.html +++ b/docs/api/py/_modules/selenium/webdriver/safari/remote_connection.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.safari.remote_connection — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.safari.remote_connection — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.safari.remote_connection

+  

Source code for selenium.webdriver.safari.remote_connection

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -60,8 +216,10 @@ 

Source code for selenium.webdriver.safari.remote_connection

from selenium.webdriver.remote.remote_connection import RemoteConnection -
[docs]class SafariRemoteConnection(RemoteConnection): - browser_name = DesiredCapabilities.SAFARI["browserName"] +
+[docs] +class SafariRemoteConnection(RemoteConnection): + browser_name = DesiredCapabilities.SAFARI["browserName"] def __init__( self, @@ -78,47 +236,38 @@

Source code for selenium.webdriver.safari.remote_connection

client_config=client_config, ) - self._commands["GET_PERMISSIONS"] = ("GET", "/session/$sessionId/apple/permissions") - self._commands["SET_PERMISSIONS"] = ("POST", "/session/$sessionId/apple/permissions") - self._commands["ATTACH_DEBUGGER"] = ("POST", "/session/$sessionId/apple/attach_debugger")
+ self._commands["GET_PERMISSIONS"] = ("GET", "/session/$sessionId/apple/permissions") + self._commands["SET_PERMISSIONS"] = ("POST", "/session/$sessionId/apple/permissions") + self._commands["ATTACH_DEBUGGER"] = ("POST", "/session/$sessionId/apple/attach_debugger")
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/safari/service.html b/docs/api/py/_modules/selenium/webdriver/safari/service.html index b8e22b738c485..43d1276ac1d4d 100644 --- a/docs/api/py/_modules/selenium/webdriver/safari/service.html +++ b/docs/api/py/_modules/selenium/webdriver/safari/service.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.safari.service — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.safari.service — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.safari.service

+  

Source code for selenium.webdriver.safari.service

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -61,8 +217,10 @@ 

Source code for selenium.webdriver.safari.service

from selenium.webdriver.common import service -
[docs]class Service(service.Service): - """A Service class that is responsible for the starting and stopping of +
+[docs] +class Service(service.Service): + """A Service class that is responsible for the starting and stopping of `safaridriver` This is only supported on MAC OSX. :param executable_path: install path of the safaridriver executable, defaults to `/usr/bin/safaridriver`. @@ -71,7 +229,7 @@

Source code for selenium.webdriver.safari.service

:param env: (Optional) Mapping of environment variables for the new process, defaults to `os.environ`. :param enable_logging: (Optional) Enable logging of the service. Logs can be located at `~/Library/Logs/com.apple.WebDriver/` :param driver_path_env_key: (Optional) Environment variable to use to get the path to the driver executable. - """ + """ def __init__( self, @@ -85,10 +243,10 @@

Source code for selenium.webdriver.safari.service

**kwargs, ) -> None: self.service_args = service_args or [] - driver_path_env_key = driver_path_env_key or "SE_SAFARIDRIVER" + driver_path_env_key = driver_path_env_key or "SE_SAFARIDRIVER" if enable_logging: - self.service_args.append("--diagnose") + self.service_args.append("--diagnose") self.reuse_service = reuse_service super().__init__( @@ -99,13 +257,16 @@

Source code for selenium.webdriver.safari.service

**kwargs, ) -
[docs] def command_line_args(self) -> List[str]: - return ["-p", f"{self.port}"] + self.service_args
+
+[docs] + def command_line_args(self) -> List[str]: + return ["-p", f"{self.port}"] + self.service_args
+ @property def service_url(self) -> str: - """Gets the url of the SafariDriver Service.""" - return f"http://localhost:{self.port}" + """Gets the url of the SafariDriver Service.""" + return f"http://localhost:{self.port}" @property def reuse_service(self) -> bool: @@ -114,46 +275,37 @@

Source code for selenium.webdriver.safari.service

@reuse_service.setter def reuse_service(self, reuse: bool) -> None: if not isinstance(reuse, bool): - raise TypeError("reuse must be a boolean") + raise TypeError("reuse must be a boolean") self._reuse_service = reuse
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/safari/webdriver.html b/docs/api/py/_modules/selenium/webdriver/safari/webdriver.html index 98065e7750c7a..5b2612fa9f0de 100644 --- a/docs/api/py/_modules/selenium/webdriver/safari/webdriver.html +++ b/docs/api/py/_modules/selenium/webdriver/safari/webdriver.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.safari.webdriver — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.safari.webdriver — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.safari.webdriver

+  

Source code for selenium.webdriver.safari.webdriver

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -62,8 +218,10 @@ 

Source code for selenium.webdriver.safari.webdriver

from .service import Service -
[docs]class WebDriver(RemoteWebDriver): - """Controls the SafariDriver and allows you to drive the browser.""" +
+[docs] +class WebDriver(RemoteWebDriver): + """Controls the SafariDriver and allows you to drive the browser.""" def __init__( self, @@ -71,7 +229,7 @@

Source code for selenium.webdriver.safari.webdriver

options: Options = None, service: Service = None, ) -> None: - """Creates a new Safari driver instance and launches or finds a running + """Creates a new Safari driver instance and launches or finds a running safaridriver service. :Args: @@ -79,7 +237,7 @@

Source code for selenium.webdriver.safari.webdriver

HTTP keep-alive. Defaults to True. - options - Instance of ``options.Options``. - service - Service object for handling the browser driver if you need to pass extra details - """ + """ self.service = service if service else Service() options = options if options else Options() @@ -102,32 +260,40 @@

Source code for selenium.webdriver.safari.webdriver

self._is_remote = False -
[docs] def quit(self): - """Closes the browser and shuts down the SafariDriver executable.""" +
+[docs] + def quit(self): + """Closes the browser and shuts down the SafariDriver executable.""" try: super().quit() except Exception: - # We don't care about the message because something probably has gone wrong + # We don't care about the message because something probably has gone wrong pass finally: if not self.service.reuse_service: self.service.stop()
+ # safaridriver extension commands. The canonical command support matrix is here: # https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/WebDriverEndpointDoc/Commands/Commands.html # First available in Safari 11.1 and Safari Technology Preview 41. -
[docs] def set_permission(self, permission, value): +
+[docs] + def set_permission(self, permission, value): if not isinstance(value, bool): - raise WebDriverException("Value of a session permission must be set to True or False.") + raise WebDriverException("Value of a session permission must be set to True or False.") payload = {permission: value} - self.execute("SET_PERMISSIONS", {"permissions": payload})
+ self.execute("SET_PERMISSIONS", {"permissions": payload})
+ # First available in Safari 11.1 and Safari Technology Preview 41. -
[docs] def get_permission(self, permission): - payload = self.execute("GET_PERMISSIONS")["value"] - permissions = payload["permissions"] +
+[docs] + def get_permission(self, permission): + payload = self.execute("GET_PERMISSIONS")["value"] + permissions = payload["permissions"] if not permissions: return None @@ -140,48 +306,43 @@

Source code for selenium.webdriver.safari.webdriver

return value
+ # First available in Safari 11.1 and Safari Technology Preview 42. -
[docs] def debug(self): - self.execute("ATTACH_DEBUGGER") - self.execute_script("debugger;")
+
+[docs] + def debug(self): + self.execute("ATTACH_DEBUGGER") + self.execute_script("debugger;")
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/support/abstract_event_listener.html b/docs/api/py/_modules/selenium/webdriver/support/abstract_event_listener.html index fd975e646008b..1d8e318719f4a 100644 --- a/docs/api/py/_modules/selenium/webdriver/support/abstract_event_listener.html +++ b/docs/api/py/_modules/selenium/webdriver/support/abstract_event_listener.html @@ -1,156 +1,362 @@ - + - selenium.webdriver.support.abstract_event_listener — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.support.abstract_event_listener — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.support.abstract_event_listener

+  

Source code for selenium.webdriver.support.abstract_event_listener

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
 
 
-
[docs]class AbstractEventListener: - """Event listener must subclass and implement this fully or partially.""" +
+[docs] +class AbstractEventListener: + """Event listener must subclass and implement this fully or partially.""" -
[docs] def before_navigate_to(self, url: str, driver) -> None: +
+[docs] + def before_navigate_to(self, url: str, driver) -> None: pass
-
[docs] def after_navigate_to(self, url: str, driver) -> None: + +
+[docs] + def after_navigate_to(self, url: str, driver) -> None: pass
-
[docs] def before_navigate_back(self, driver) -> None: + +
+[docs] + def before_navigate_back(self, driver) -> None: pass
-
[docs] def after_navigate_back(self, driver) -> None: + +
+[docs] + def after_navigate_back(self, driver) -> None: pass
-
[docs] def before_navigate_forward(self, driver) -> None: + +
+[docs] + def before_navigate_forward(self, driver) -> None: + pass
+ + +
+[docs] + def after_navigate_forward(self, driver) -> None: pass
-
[docs] def after_navigate_forward(self, driver) -> None: + +
+[docs] + def before_find(self, by, value, driver) -> None: pass
-
[docs] def before_find(self, by, value, driver) -> None: + +
+[docs] + def after_find(self, by, value, driver) -> None: pass
-
[docs] def after_find(self, by, value, driver) -> None: + +
+[docs] + def before_click(self, element, driver) -> None: pass
-
[docs] def before_click(self, element, driver) -> None: + +
+[docs] + def after_click(self, element, driver) -> None: pass
-
[docs] def after_click(self, element, driver) -> None: + +
+[docs] + def before_change_value_of(self, element, driver) -> None: pass
-
[docs] def before_change_value_of(self, element, driver) -> None: + +
+[docs] + def after_change_value_of(self, element, driver) -> None: pass
-
[docs] def after_change_value_of(self, element, driver) -> None: + +
+[docs] + def before_execute_script(self, script, driver) -> None: pass
-
[docs] def before_execute_script(self, script, driver) -> None: + +
+[docs] + def after_execute_script(self, script, driver) -> None: pass
-
[docs] def after_execute_script(self, script, driver) -> None: + +
+[docs] + def before_close(self, driver) -> None: pass
-
[docs] def before_close(self, driver) -> None: + +
+[docs] + def after_close(self, driver) -> None: pass
-
[docs] def after_close(self, driver) -> None: + +
+[docs] + def before_quit(self, driver) -> None: pass
-
[docs] def before_quit(self, driver) -> None: + +
+[docs] + def after_quit(self, driver) -> None: pass
-
[docs] def after_quit(self, driver) -> None: + +
+[docs] + def on_exception(self, exception, driver) -> None: pass
+
-
[docs] def on_exception(self, exception, driver) -> None: - pass
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/support/color.html b/docs/api/py/_modules/selenium/webdriver/support/color.html index 2c2a7cca69657..e0b3a776f3336 100644 --- a/docs/api/py/_modules/selenium/webdriver/support/color.html +++ b/docs/api/py/_modules/selenium/webdriver/support/color.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.support.color — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.support.color — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.support.color

+  

Source code for selenium.webdriver.support.color

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -76,20 +232,22 @@ 

Source code for selenium.webdriver.support.color

ParseableFloat = Any ParseableInt = Any -RGB_PATTERN = r"^\s*rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)\s*$" +RGB_PATTERN = r"^\s*rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)\s*$" RGB_PCT_PATTERN = ( - r"^\s*rgb\(\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)%\s*\)\s*$" + r"^\s*rgb\(\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)%\s*\)\s*$" ) -RGBA_PATTERN = r"^\s*rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(0|1|0\.\d+)\s*\)\s*$" -RGBA_PCT_PATTERN = r"^\s*rgba\(\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(0|1|0\.\d+)\s*\)\s*$" -HEX_PATTERN = r"#([A-Fa-f0-9]{2})([A-Fa-f0-9]{2})([A-Fa-f0-9]{2})" -HEX3_PATTERN = r"#([A-Fa-f0-9])([A-Fa-f0-9])([A-Fa-f0-9])" -HSL_PATTERN = r"^\s*hsl\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*\)\s*$" -HSLA_PATTERN = r"^\s*hsla\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*,\s*(0|1|0\.\d+)\s*\)\s*$" +RGBA_PATTERN = r"^\s*rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(0|1|0\.\d+)\s*\)\s*$" +RGBA_PCT_PATTERN = r"^\s*rgba\(\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(0|1|0\.\d+)\s*\)\s*$" +HEX_PATTERN = r"#([A-Fa-f0-9]{2})([A-Fa-f0-9]{2})([A-Fa-f0-9]{2})" +HEX3_PATTERN = r"#([A-Fa-f0-9])([A-Fa-f0-9])([A-Fa-f0-9])" +HSL_PATTERN = r"^\s*hsl\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*\)\s*$" +HSLA_PATTERN = r"^\s*hsla\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*,\s*(0|1|0\.\d+)\s*\)\s*$" -
[docs]class Color: - """Color conversion support class. +
+[docs] +class Color: + """Color conversion support class. Example: @@ -97,12 +255,14 @@

Source code for selenium.webdriver.support.color

from selenium.webdriver.support.color import Color - print(Color.from_string('#00ff33').rgba) - print(Color.from_string('rgb(1, 255, 3)').hex) - print(Color.from_string('blue').rgba) - """ + print(Color.from_string('#00ff33').rgba) + print(Color.from_string('rgb(1, 255, 3)').hex) + print(Color.from_string('blue').rgba) + """ -
[docs] @classmethod +
+[docs] + @classmethod def from_string(cls, str_: str) -> Color: import re @@ -142,7 +302,8 @@

Source code for selenium.webdriver.support.color

return cls._from_hsl(*m.groups) if str_.upper() in Colors: return Colors[str_.upper()] - raise ValueError("Could not convert %s into color" % str_)
+ raise ValueError("Could not convert %s into color" % str_)
+ @classmethod def _from_hsl(cls, h: ParseableFloat, s: ParseableFloat, light: ParseableFloat, a: ParseableFloat = 1) -> Color: @@ -182,19 +343,19 @@

Source code for selenium.webdriver.support.color

self.red = int(red) self.green = int(green) self.blue = int(blue) - self.alpha = "1" if float(alpha) == 1 else str(float(alpha) or 0) + self.alpha = "1" if float(alpha) == 1 else str(float(alpha) or 0) @property def rgb(self) -> str: - return f"rgb({self.red}, {self.green}, {self.blue})" + return f"rgb({self.red}, {self.green}, {self.blue})" @property def rgba(self) -> str: - return f"rgba({self.red}, {self.green}, {self.blue}, {self.alpha})" + return f"rgba({self.red}, {self.green}, {self.blue}, {self.alpha})" @property def hex(self) -> str: - return f"#{self.red:02x}{self.green:02x}{self.blue:02x}" + return f"#{self.red:02x}{self.green:02x}{self.blue:02x}" def __eq__(self, other: object) -> bool: if isinstance(other, Color): @@ -211,203 +372,194 @@

Source code for selenium.webdriver.support.color

return hash((self.red, self.green, self.blue, self.alpha)) def __repr__(self) -> str: - return f"Color(red={self.red}, green={self.green}, blue={self.blue}, alpha={self.alpha})" + return f"Color(red={self.red}, green={self.green}, blue={self.blue}, alpha={self.alpha})" def __str__(self) -> str: - return f"Color: {self.rgba}"
+ return f"Color: {self.rgba}"
+ # Basic, extended and transparent colour keywords as defined by the W3C HTML4 spec # See http://www.w3.org/TR/css3-color/#html4 Colors = { - "TRANSPARENT": Color(0, 0, 0, 0), - "ALICEBLUE": Color(240, 248, 255), - "ANTIQUEWHITE": Color(250, 235, 215), - "AQUA": Color(0, 255, 255), - "AQUAMARINE": Color(127, 255, 212), - "AZURE": Color(240, 255, 255), - "BEIGE": Color(245, 245, 220), - "BISQUE": Color(255, 228, 196), - "BLACK": Color(0, 0, 0), - "BLANCHEDALMOND": Color(255, 235, 205), - "BLUE": Color(0, 0, 255), - "BLUEVIOLET": Color(138, 43, 226), - "BROWN": Color(165, 42, 42), - "BURLYWOOD": Color(222, 184, 135), - "CADETBLUE": Color(95, 158, 160), - "CHARTREUSE": Color(127, 255, 0), - "CHOCOLATE": Color(210, 105, 30), - "CORAL": Color(255, 127, 80), - "CORNFLOWERBLUE": Color(100, 149, 237), - "CORNSILK": Color(255, 248, 220), - "CRIMSON": Color(220, 20, 60), - "CYAN": Color(0, 255, 255), - "DARKBLUE": Color(0, 0, 139), - "DARKCYAN": Color(0, 139, 139), - "DARKGOLDENROD": Color(184, 134, 11), - "DARKGRAY": Color(169, 169, 169), - "DARKGREEN": Color(0, 100, 0), - "DARKGREY": Color(169, 169, 169), - "DARKKHAKI": Color(189, 183, 107), - "DARKMAGENTA": Color(139, 0, 139), - "DARKOLIVEGREEN": Color(85, 107, 47), - "DARKORANGE": Color(255, 140, 0), - "DARKORCHID": Color(153, 50, 204), - "DARKRED": Color(139, 0, 0), - "DARKSALMON": Color(233, 150, 122), - "DARKSEAGREEN": Color(143, 188, 143), - "DARKSLATEBLUE": Color(72, 61, 139), - "DARKSLATEGRAY": Color(47, 79, 79), - "DARKSLATEGREY": Color(47, 79, 79), - "DARKTURQUOISE": Color(0, 206, 209), - "DARKVIOLET": Color(148, 0, 211), - "DEEPPINK": Color(255, 20, 147), - "DEEPSKYBLUE": Color(0, 191, 255), - "DIMGRAY": Color(105, 105, 105), - "DIMGREY": Color(105, 105, 105), - "DODGERBLUE": Color(30, 144, 255), - "FIREBRICK": Color(178, 34, 34), - "FLORALWHITE": Color(255, 250, 240), - "FORESTGREEN": Color(34, 139, 34), - "FUCHSIA": Color(255, 0, 255), - "GAINSBORO": Color(220, 220, 220), - "GHOSTWHITE": Color(248, 248, 255), - "GOLD": Color(255, 215, 0), - "GOLDENROD": Color(218, 165, 32), - "GRAY": Color(128, 128, 128), - "GREY": Color(128, 128, 128), - "GREEN": Color(0, 128, 0), - "GREENYELLOW": Color(173, 255, 47), - "HONEYDEW": Color(240, 255, 240), - "HOTPINK": Color(255, 105, 180), - "INDIANRED": Color(205, 92, 92), - "INDIGO": Color(75, 0, 130), - "IVORY": Color(255, 255, 240), - "KHAKI": Color(240, 230, 140), - "LAVENDER": Color(230, 230, 250), - "LAVENDERBLUSH": Color(255, 240, 245), - "LAWNGREEN": Color(124, 252, 0), - "LEMONCHIFFON": Color(255, 250, 205), - "LIGHTBLUE": Color(173, 216, 230), - "LIGHTCORAL": Color(240, 128, 128), - "LIGHTCYAN": Color(224, 255, 255), - "LIGHTGOLDENRODYELLOW": Color(250, 250, 210), - "LIGHTGRAY": Color(211, 211, 211), - "LIGHTGREEN": Color(144, 238, 144), - "LIGHTGREY": Color(211, 211, 211), - "LIGHTPINK": Color(255, 182, 193), - "LIGHTSALMON": Color(255, 160, 122), - "LIGHTSEAGREEN": Color(32, 178, 170), - "LIGHTSKYBLUE": Color(135, 206, 250), - "LIGHTSLATEGRAY": Color(119, 136, 153), - "LIGHTSLATEGREY": Color(119, 136, 153), - "LIGHTSTEELBLUE": Color(176, 196, 222), - "LIGHTYELLOW": Color(255, 255, 224), - "LIME": Color(0, 255, 0), - "LIMEGREEN": Color(50, 205, 50), - "LINEN": Color(250, 240, 230), - "MAGENTA": Color(255, 0, 255), - "MAROON": Color(128, 0, 0), - "MEDIUMAQUAMARINE": Color(102, 205, 170), - "MEDIUMBLUE": Color(0, 0, 205), - "MEDIUMORCHID": Color(186, 85, 211), - "MEDIUMPURPLE": Color(147, 112, 219), - "MEDIUMSEAGREEN": Color(60, 179, 113), - "MEDIUMSLATEBLUE": Color(123, 104, 238), - "MEDIUMSPRINGGREEN": Color(0, 250, 154), - "MEDIUMTURQUOISE": Color(72, 209, 204), - "MEDIUMVIOLETRED": Color(199, 21, 133), - "MIDNIGHTBLUE": Color(25, 25, 112), - "MINTCREAM": Color(245, 255, 250), - "MISTYROSE": Color(255, 228, 225), - "MOCCASIN": Color(255, 228, 181), - "NAVAJOWHITE": Color(255, 222, 173), - "NAVY": Color(0, 0, 128), - "OLDLACE": Color(253, 245, 230), - "OLIVE": Color(128, 128, 0), - "OLIVEDRAB": Color(107, 142, 35), - "ORANGE": Color(255, 165, 0), - "ORANGERED": Color(255, 69, 0), - "ORCHID": Color(218, 112, 214), - "PALEGOLDENROD": Color(238, 232, 170), - "PALEGREEN": Color(152, 251, 152), - "PALETURQUOISE": Color(175, 238, 238), - "PALEVIOLETRED": Color(219, 112, 147), - "PAPAYAWHIP": Color(255, 239, 213), - "PEACHPUFF": Color(255, 218, 185), - "PERU": Color(205, 133, 63), - "PINK": Color(255, 192, 203), - "PLUM": Color(221, 160, 221), - "POWDERBLUE": Color(176, 224, 230), - "PURPLE": Color(128, 0, 128), - "REBECCAPURPLE": Color(128, 51, 153), - "RED": Color(255, 0, 0), - "ROSYBROWN": Color(188, 143, 143), - "ROYALBLUE": Color(65, 105, 225), - "SADDLEBROWN": Color(139, 69, 19), - "SALMON": Color(250, 128, 114), - "SANDYBROWN": Color(244, 164, 96), - "SEAGREEN": Color(46, 139, 87), - "SEASHELL": Color(255, 245, 238), - "SIENNA": Color(160, 82, 45), - "SILVER": Color(192, 192, 192), - "SKYBLUE": Color(135, 206, 235), - "SLATEBLUE": Color(106, 90, 205), - "SLATEGRAY": Color(112, 128, 144), - "SLATEGREY": Color(112, 128, 144), - "SNOW": Color(255, 250, 250), - "SPRINGGREEN": Color(0, 255, 127), - "STEELBLUE": Color(70, 130, 180), - "TAN": Color(210, 180, 140), - "TEAL": Color(0, 128, 128), - "THISTLE": Color(216, 191, 216), - "TOMATO": Color(255, 99, 71), - "TURQUOISE": Color(64, 224, 208), - "VIOLET": Color(238, 130, 238), - "WHEAT": Color(245, 222, 179), - "WHITE": Color(255, 255, 255), - "WHITESMOKE": Color(245, 245, 245), - "YELLOW": Color(255, 255, 0), - "YELLOWGREEN": Color(154, 205, 50), + "TRANSPARENT": Color(0, 0, 0, 0), + "ALICEBLUE": Color(240, 248, 255), + "ANTIQUEWHITE": Color(250, 235, 215), + "AQUA": Color(0, 255, 255), + "AQUAMARINE": Color(127, 255, 212), + "AZURE": Color(240, 255, 255), + "BEIGE": Color(245, 245, 220), + "BISQUE": Color(255, 228, 196), + "BLACK": Color(0, 0, 0), + "BLANCHEDALMOND": Color(255, 235, 205), + "BLUE": Color(0, 0, 255), + "BLUEVIOLET": Color(138, 43, 226), + "BROWN": Color(165, 42, 42), + "BURLYWOOD": Color(222, 184, 135), + "CADETBLUE": Color(95, 158, 160), + "CHARTREUSE": Color(127, 255, 0), + "CHOCOLATE": Color(210, 105, 30), + "CORAL": Color(255, 127, 80), + "CORNFLOWERBLUE": Color(100, 149, 237), + "CORNSILK": Color(255, 248, 220), + "CRIMSON": Color(220, 20, 60), + "CYAN": Color(0, 255, 255), + "DARKBLUE": Color(0, 0, 139), + "DARKCYAN": Color(0, 139, 139), + "DARKGOLDENROD": Color(184, 134, 11), + "DARKGRAY": Color(169, 169, 169), + "DARKGREEN": Color(0, 100, 0), + "DARKGREY": Color(169, 169, 169), + "DARKKHAKI": Color(189, 183, 107), + "DARKMAGENTA": Color(139, 0, 139), + "DARKOLIVEGREEN": Color(85, 107, 47), + "DARKORANGE": Color(255, 140, 0), + "DARKORCHID": Color(153, 50, 204), + "DARKRED": Color(139, 0, 0), + "DARKSALMON": Color(233, 150, 122), + "DARKSEAGREEN": Color(143, 188, 143), + "DARKSLATEBLUE": Color(72, 61, 139), + "DARKSLATEGRAY": Color(47, 79, 79), + "DARKSLATEGREY": Color(47, 79, 79), + "DARKTURQUOISE": Color(0, 206, 209), + "DARKVIOLET": Color(148, 0, 211), + "DEEPPINK": Color(255, 20, 147), + "DEEPSKYBLUE": Color(0, 191, 255), + "DIMGRAY": Color(105, 105, 105), + "DIMGREY": Color(105, 105, 105), + "DODGERBLUE": Color(30, 144, 255), + "FIREBRICK": Color(178, 34, 34), + "FLORALWHITE": Color(255, 250, 240), + "FORESTGREEN": Color(34, 139, 34), + "FUCHSIA": Color(255, 0, 255), + "GAINSBORO": Color(220, 220, 220), + "GHOSTWHITE": Color(248, 248, 255), + "GOLD": Color(255, 215, 0), + "GOLDENROD": Color(218, 165, 32), + "GRAY": Color(128, 128, 128), + "GREY": Color(128, 128, 128), + "GREEN": Color(0, 128, 0), + "GREENYELLOW": Color(173, 255, 47), + "HONEYDEW": Color(240, 255, 240), + "HOTPINK": Color(255, 105, 180), + "INDIANRED": Color(205, 92, 92), + "INDIGO": Color(75, 0, 130), + "IVORY": Color(255, 255, 240), + "KHAKI": Color(240, 230, 140), + "LAVENDER": Color(230, 230, 250), + "LAVENDERBLUSH": Color(255, 240, 245), + "LAWNGREEN": Color(124, 252, 0), + "LEMONCHIFFON": Color(255, 250, 205), + "LIGHTBLUE": Color(173, 216, 230), + "LIGHTCORAL": Color(240, 128, 128), + "LIGHTCYAN": Color(224, 255, 255), + "LIGHTGOLDENRODYELLOW": Color(250, 250, 210), + "LIGHTGRAY": Color(211, 211, 211), + "LIGHTGREEN": Color(144, 238, 144), + "LIGHTGREY": Color(211, 211, 211), + "LIGHTPINK": Color(255, 182, 193), + "LIGHTSALMON": Color(255, 160, 122), + "LIGHTSEAGREEN": Color(32, 178, 170), + "LIGHTSKYBLUE": Color(135, 206, 250), + "LIGHTSLATEGRAY": Color(119, 136, 153), + "LIGHTSLATEGREY": Color(119, 136, 153), + "LIGHTSTEELBLUE": Color(176, 196, 222), + "LIGHTYELLOW": Color(255, 255, 224), + "LIME": Color(0, 255, 0), + "LIMEGREEN": Color(50, 205, 50), + "LINEN": Color(250, 240, 230), + "MAGENTA": Color(255, 0, 255), + "MAROON": Color(128, 0, 0), + "MEDIUMAQUAMARINE": Color(102, 205, 170), + "MEDIUMBLUE": Color(0, 0, 205), + "MEDIUMORCHID": Color(186, 85, 211), + "MEDIUMPURPLE": Color(147, 112, 219), + "MEDIUMSEAGREEN": Color(60, 179, 113), + "MEDIUMSLATEBLUE": Color(123, 104, 238), + "MEDIUMSPRINGGREEN": Color(0, 250, 154), + "MEDIUMTURQUOISE": Color(72, 209, 204), + "MEDIUMVIOLETRED": Color(199, 21, 133), + "MIDNIGHTBLUE": Color(25, 25, 112), + "MINTCREAM": Color(245, 255, 250), + "MISTYROSE": Color(255, 228, 225), + "MOCCASIN": Color(255, 228, 181), + "NAVAJOWHITE": Color(255, 222, 173), + "NAVY": Color(0, 0, 128), + "OLDLACE": Color(253, 245, 230), + "OLIVE": Color(128, 128, 0), + "OLIVEDRAB": Color(107, 142, 35), + "ORANGE": Color(255, 165, 0), + "ORANGERED": Color(255, 69, 0), + "ORCHID": Color(218, 112, 214), + "PALEGOLDENROD": Color(238, 232, 170), + "PALEGREEN": Color(152, 251, 152), + "PALETURQUOISE": Color(175, 238, 238), + "PALEVIOLETRED": Color(219, 112, 147), + "PAPAYAWHIP": Color(255, 239, 213), + "PEACHPUFF": Color(255, 218, 185), + "PERU": Color(205, 133, 63), + "PINK": Color(255, 192, 203), + "PLUM": Color(221, 160, 221), + "POWDERBLUE": Color(176, 224, 230), + "PURPLE": Color(128, 0, 128), + "REBECCAPURPLE": Color(128, 51, 153), + "RED": Color(255, 0, 0), + "ROSYBROWN": Color(188, 143, 143), + "ROYALBLUE": Color(65, 105, 225), + "SADDLEBROWN": Color(139, 69, 19), + "SALMON": Color(250, 128, 114), + "SANDYBROWN": Color(244, 164, 96), + "SEAGREEN": Color(46, 139, 87), + "SEASHELL": Color(255, 245, 238), + "SIENNA": Color(160, 82, 45), + "SILVER": Color(192, 192, 192), + "SKYBLUE": Color(135, 206, 235), + "SLATEBLUE": Color(106, 90, 205), + "SLATEGRAY": Color(112, 128, 144), + "SLATEGREY": Color(112, 128, 144), + "SNOW": Color(255, 250, 250), + "SPRINGGREEN": Color(0, 255, 127), + "STEELBLUE": Color(70, 130, 180), + "TAN": Color(210, 180, 140), + "TEAL": Color(0, 128, 128), + "THISTLE": Color(216, 191, 216), + "TOMATO": Color(255, 99, 71), + "TURQUOISE": Color(64, 224, 208), + "VIOLET": Color(238, 130, 238), + "WHEAT": Color(245, 222, 179), + "WHITE": Color(255, 255, 255), + "WHITESMOKE": Color(245, 245, 245), + "YELLOW": Color(255, 255, 0), + "YELLOWGREEN": Color(154, 205, 50), }
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/support/event_firing_webdriver.html b/docs/api/py/_modules/selenium/webdriver/support/event_firing_webdriver.html index 8f69fb2c61707..e7f66057edd8b 100644 --- a/docs/api/py/_modules/selenium/webdriver/support/event_firing_webdriver.html +++ b/docs/api/py/_modules/selenium/webdriver/support/event_firing_webdriver.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.support.event_firing_webdriver — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.support.event_firing_webdriver — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.support.event_firing_webdriver

+  

Source code for selenium.webdriver.support.event_firing_webdriver

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -76,12 +232,14 @@ 

Source code for selenium.webdriver.support.event_firing_webdriver

return result -
[docs]class EventFiringWebDriver: - """A wrapper around an arbitrary WebDriver instance which supports firing - events.""" +
+[docs] +class EventFiringWebDriver: + """A wrapper around an arbitrary WebDriver instance which supports firing + events.""" def __init__(self, driver: WebDriver, event_listener: AbstractEventListener) -> None: - """Creates a new instance of the EventFiringWebDriver. + """Creates a new instance of the EventFiringWebDriver. :Args: - driver : A WebDriver instance @@ -96,65 +254,92 @@

Source code for selenium.webdriver.support.event_firing_webdriver

class MyListener(AbstractEventListener): def before_navigate_to(self, url, driver): - print("Before navigate to %s" % url) + print("Before navigate to %s" % url) def after_navigate_to(self, url, driver): - print("After navigate to %s" % url) + print("After navigate to %s" % url) driver = Firefox() ef_driver = EventFiringWebDriver(driver, MyListener()) - ef_driver.get("http://www.google.co.in/") - """ + ef_driver.get("http://www.google.co.in/") + """ if not isinstance(driver, WebDriver): - raise WebDriverException("A WebDriver instance must be supplied") + raise WebDriverException("A WebDriver instance must be supplied") if not isinstance(event_listener, AbstractEventListener): - raise WebDriverException("Event listener must be a subclass of AbstractEventListener") + raise WebDriverException("Event listener must be a subclass of AbstractEventListener") self._driver = driver self._driver._wrap_value = self._wrap_value self._listener = event_listener @property def wrapped_driver(self) -> WebDriver: - """Returns the WebDriver instance wrapped by this - EventsFiringWebDriver.""" + """Returns the WebDriver instance wrapped by this + EventsFiringWebDriver.""" return self._driver -
[docs] def get(self, url: str) -> None: - self._dispatch("navigate_to", (url, self._driver), "get", (url,))
+
+[docs] + def get(self, url: str) -> None: + self._dispatch("navigate_to", (url, self._driver), "get", (url,))
-
[docs] def back(self) -> None: - self._dispatch("navigate_back", (self._driver,), "back", ())
-
[docs] def forward(self) -> None: - self._dispatch("navigate_forward", (self._driver,), "forward", ())
+
+[docs] + def back(self) -> None: + self._dispatch("navigate_back", (self._driver,), "back", ())
-
[docs] def execute_script(self, script, *args): + +
+[docs] + def forward(self) -> None: + self._dispatch("navigate_forward", (self._driver,), "forward", ())
+ + +
+[docs] + def execute_script(self, script, *args): unwrapped_args = (script,) + self._unwrap_element_args(args) - return self._dispatch("execute_script", (script, self._driver), "execute_script", unwrapped_args)
+ return self._dispatch("execute_script", (script, self._driver), "execute_script", unwrapped_args)
-
[docs] def execute_async_script(self, script, *args): + +
+[docs] + def execute_async_script(self, script, *args): unwrapped_args = (script,) + self._unwrap_element_args(args) - return self._dispatch("execute_script", (script, self._driver), "execute_async_script", unwrapped_args)
+ return self._dispatch("execute_script", (script, self._driver), "execute_async_script", unwrapped_args)
+ + +
+[docs] + def close(self) -> None: + self._dispatch("close", (self._driver,), "close", ())
-
[docs] def close(self) -> None: - self._dispatch("close", (self._driver,), "close", ())
-
[docs] def quit(self) -> None: - self._dispatch("quit", (self._driver,), "quit", ())
+
+[docs] + def quit(self) -> None: + self._dispatch("quit", (self._driver,), "quit", ())
-
[docs] def find_element(self, by=By.ID, value=None) -> WebElement: - return self._dispatch("find", (by, value, self._driver), "find_element", (by, value))
-
[docs] def find_elements(self, by=By.ID, value=None) -> List[WebElement]: - return self._dispatch("find", (by, value, self._driver), "find_elements", (by, value))
+
+[docs] + def find_element(self, by=By.ID, value=None) -> WebElement: + return self._dispatch("find", (by, value, self._driver), "find_element", (by, value))
+ + +
+[docs] + def find_elements(self, by=By.ID, value=None) -> List[WebElement]: + return self._dispatch("find", (by, value, self._driver), "find_elements", (by, value))
+ def _dispatch(self, l_call: str, l_args: Tuple[Any, ...], d_call: str, d_args: Tuple[Any, ...]): - getattr(self._listener, f"before_{l_call}")(*l_args) + getattr(self._listener, f"before_{l_call}")(*l_args) try: result = getattr(self._driver, d_call)(*d_args) except Exception as exc: self._listener.on_exception(exc, self._driver) raise - getattr(self._listener, f"after_{l_call}")(*l_args) + getattr(self._listener, f"after_{l_call}")(*l_args) return _wrap_elements(result, self) def _unwrap_element_args(self, args): @@ -172,7 +357,7 @@

Source code for selenium.webdriver.support.event_firing_webdriver

return WebDriver._wrap_value(self._driver, value) def __setattr__(self, item, value): - if item.startswith("_") or not hasattr(self._driver, item): + if item.startswith("_") or not hasattr(self._driver, item): object.__setattr__(self, item, value) else: try: @@ -198,11 +383,14 @@

Source code for selenium.webdriver.support.event_firing_webdriver

raise
-
[docs]class EventFiringWebElement: - """A wrapper around WebElement instance which supports firing events.""" + +
+[docs] +class EventFiringWebElement: + """A wrapper around WebElement instance which supports firing events.""" def __init__(self, webelement: WebElement, ef_driver: EventFiringWebDriver) -> None: - """Creates a new instance of the EventFiringWebElement.""" + """Creates a new instance of the EventFiringWebElement.""" self._webelement = webelement self._ef_driver = ef_driver self._driver = ef_driver.wrapped_driver @@ -210,37 +398,52 @@

Source code for selenium.webdriver.support.event_firing_webdriver

@property def wrapped_element(self) -> WebElement: - """Returns the WebElement wrapped by this EventFiringWebElement - instance.""" + """Returns the WebElement wrapped by this EventFiringWebElement + instance.""" return self._webelement -
[docs] def click(self) -> None: - self._dispatch("click", (self._webelement, self._driver), "click", ())
+
+[docs] + def click(self) -> None: + self._dispatch("click", (self._webelement, self._driver), "click", ())
+ + +
+[docs] + def clear(self) -> None: + self._dispatch("change_value_of", (self._webelement, self._driver), "clear", ())
-
[docs] def clear(self) -> None: - self._dispatch("change_value_of", (self._webelement, self._driver), "clear", ())
-
[docs] def send_keys(self, *value) -> None: - self._dispatch("change_value_of", (self._webelement, self._driver), "send_keys", value)
+
+[docs] + def send_keys(self, *value) -> None: + self._dispatch("change_value_of", (self._webelement, self._driver), "send_keys", value)
-
[docs] def find_element(self, by=By.ID, value=None) -> WebElement: - return self._dispatch("find", (by, value, self._driver), "find_element", (by, value))
-
[docs] def find_elements(self, by=By.ID, value=None) -> List[WebElement]: - return self._dispatch("find", (by, value, self._driver), "find_elements", (by, value))
+
+[docs] + def find_element(self, by=By.ID, value=None) -> WebElement: + return self._dispatch("find", (by, value, self._driver), "find_element", (by, value))
+ + +
+[docs] + def find_elements(self, by=By.ID, value=None) -> List[WebElement]: + return self._dispatch("find", (by, value, self._driver), "find_elements", (by, value))
+ def _dispatch(self, l_call, l_args, d_call, d_args): - getattr(self._listener, f"before_{l_call}")(*l_args) + getattr(self._listener, f"before_{l_call}")(*l_args) try: result = getattr(self._webelement, d_call)(*d_args) except Exception as exc: self._listener.on_exception(exc, self._driver) raise - getattr(self._listener, f"after_{l_call}")(*l_args) + getattr(self._listener, f"after_{l_call}")(*l_args) return _wrap_elements(result, self._ef_driver) def __setattr__(self, item, value): - if item.startswith("_") or not hasattr(self._webelement, item): + if item.startswith("_") or not hasattr(self._webelement, item): object.__setattr__(self, item, value) else: try: @@ -266,46 +469,37 @@

Source code for selenium.webdriver.support.event_firing_webdriver

raise
+ # Register a virtual subclass. WebElement.register(EventFiringWebElement)
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/support/expected_conditions.html b/docs/api/py/_modules/selenium/webdriver/support/expected_conditions.html index 6291052c228d0..48682e27d8dbc 100644 --- a/docs/api/py/_modules/selenium/webdriver/support/expected_conditions.html +++ b/docs/api/py/_modules/selenium/webdriver/support/expected_conditions.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.support.expected_conditions — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.support.expected_conditions — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.support.expected_conditions

+  

Source code for selenium.webdriver.support.expected_conditions

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -72,29 +228,31 @@ 

Source code for selenium.webdriver.support.expected_conditions

from selenium.webdriver.remote.webdriver import WebDriver from selenium.webdriver.remote.webdriver import WebElement -""" - * Canned "Expected Conditions" which are generally useful within webdriver +""" + * Canned "Expected Conditions" which are generally useful within webdriver * tests. -""" +""" -D = TypeVar("D") -T = TypeVar("T") +D = TypeVar("D") +T = TypeVar("T") WebDriverOrWebElement = Union[WebDriver, WebElement] -
[docs]def title_is(title: str) -> Callable[[WebDriver], bool]: - """An expectation for checking the title of a page. +
+[docs] +def title_is(title: str) -> Callable[[WebDriver], bool]: + """An expectation for checking the title of a page. Parameters: - ---------- + ----------- title : str The expected title, which must be an exact match. Returns: ------- boolean : True if the title matches, False otherwise. - """ + """ def _predicate(driver: WebDriver): return driver.title == title @@ -102,19 +260,22 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def title_contains(title: str) -> Callable[[WebDriver], bool]: - """An expectation for checking that the title contains a case-sensitive + +
+[docs] +def title_contains(title: str) -> Callable[[WebDriver], bool]: + """An expectation for checking that the title contains a case-sensitive substring. Parameters: - ---------- + ----------- title : str The fragment of title expected. Returns: ------- boolean : True when the title matches, False otherwise. - """ + """ def _predicate(driver: WebDriver): return title in driver.title @@ -122,12 +283,15 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def presence_of_element_located(locator: Tuple[str, str]) -> Callable[[WebDriverOrWebElement], WebElement]: - """An expectation for checking that an element is present on the DOM of a + +
+[docs] +def presence_of_element_located(locator: Tuple[str, str]) -> Callable[[WebDriverOrWebElement], WebElement]: + """An expectation for checking that an element is present on the DOM of a page. This does not necessarily mean that the element is visible. Parameters: - ---------- + ----------- locator : Tuple[str, str] Used to find the element. @@ -141,8 +305,8 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> element = WebDriverWait(driver, 10).until( - ... EC.presence_of_element_located((By.NAME, "q"))) - """ + ... EC.presence_of_element_located((By.NAME, "q"))) + """ def _predicate(driver: WebDriverOrWebElement): return driver.find_element(*locator) @@ -150,19 +314,22 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def url_contains(url: str) -> Callable[[WebDriver], bool]: - """An expectation for checking that the current url contains a case- + +
+[docs] +def url_contains(url: str) -> Callable[[WebDriver], bool]: + """An expectation for checking that the current url contains a case- sensitive substring. Parameters: - ---------- + ----------- url : str The fragment of url expected. Returns: ------- boolean : True when the url matches, False otherwise. - """ + """ def _predicate(driver: WebDriver): return url in driver.current_url @@ -170,11 +337,14 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def url_matches(pattern: str) -> Callable[[WebDriver], bool]: - """An expectation for checking the current url. + +
+[docs] +def url_matches(pattern: str) -> Callable[[WebDriver], bool]: + """An expectation for checking the current url. Parameters: - ---------- + ----------- pattern : str The pattern to match with the current url. @@ -185,7 +355,7 @@

Source code for selenium.webdriver.support.expected_conditions

Notes: ------ More powerful than url_contains, as it allows for regular expressions. - """ + """ def _predicate(driver: WebDriver): return re.search(pattern, driver.current_url) is not None @@ -193,18 +363,21 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def url_to_be(url: str) -> Callable[[WebDriver], bool]: - """An expectation for checking the current url. + +
+[docs] +def url_to_be(url: str) -> Callable[[WebDriver], bool]: + """An expectation for checking the current url. Parameters: - ---------- + ----------- url : str The expected url, which must be an exact match. Returns: ------- boolean : True when the url matches, False otherwise. - """ + """ def _predicate(driver: WebDriver): return url == driver.current_url @@ -212,19 +385,22 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def url_changes(url: str) -> Callable[[WebDriver], bool]: - """An expectation for checking the current url is different than a given + +
+[docs] +def url_changes(url: str) -> Callable[[WebDriver], bool]: + """An expectation for checking the current url is different than a given string. Parameters: - ---------- + ----------- url : str The expected url, which must not be an exact match. Returns: ------- boolean : True when the url does not match, False otherwise - """ + """ def _predicate(driver: WebDriver): return url != driver.current_url @@ -232,15 +408,18 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def visibility_of_element_located( + +
+[docs] +def visibility_of_element_located( locator: Tuple[str, str] ) -> Callable[[WebDriverOrWebElement], Union[Literal[False], WebElement]]: - """An expectation for checking that an element is present on the DOM of a + """An expectation for checking that an element is present on the DOM of a page and visible. Visibility means that the element is not only displayed but also has a height and width that is greater than 0. Parameters: - ---------- + ----------- locator : Tuple[str, str] Used to find the element. @@ -254,8 +433,8 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> element = WebDriverWait(driver, 10).until( - ... EC.visibility_of_element_located((By.NAME, "q"))) - """ + ... EC.visibility_of_element_located((By.NAME, "q"))) + """ def _predicate(driver: WebDriverOrWebElement): try: @@ -266,12 +445,15 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def visibility_of(element: WebElement) -> Callable[[Any], Union[Literal[False], WebElement]]: - """An expectation for checking that an element, known to be present on the + +
+[docs] +def visibility_of(element: WebElement) -> Callable[[Any], Union[Literal[False], WebElement]]: + """An expectation for checking that an element, known to be present on the DOM of a page, is visible. Parameters: - ---------- + ----------- element : WebElement The WebElement to check. @@ -285,14 +467,14 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> element = WebDriverWait(driver, 10).until( - ... EC.visibility_of(driver.find_element(By.NAME, "q"))) + ... EC.visibility_of(driver.find_element(By.NAME, "q"))) Notes: ------ Visibility means that the element is not only displayed but also has a height and width that is greater than 0. element is the WebElement returns the (same) WebElement once it is visible - """ + """ def _predicate(_): return _element_if_visible(element) @@ -300,12 +482,13 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
+ def _element_if_visible(element: WebElement, visibility: bool = True) -> Union[Literal[False], WebElement]: - """An expectation for checking that an element, known to be present on the + """An expectation for checking that an element, known to be present on the DOM of a page, is of the expected visibility. Parameters: - ---------- + ----------- element : WebElement The WebElement to check. visibility : bool @@ -314,16 +497,18 @@

Source code for selenium.webdriver.support.expected_conditions

Returns: ------- WebElement : The WebElement once it is visible or not visible. - """ + """ return element if element.is_displayed() == visibility else False -
[docs]def presence_of_all_elements_located(locator: Tuple[str, str]) -> Callable[[WebDriverOrWebElement], List[WebElement]]: - """An expectation for checking that there is at least one element present +
+[docs] +def presence_of_all_elements_located(locator: Tuple[str, str]) -> Callable[[WebDriverOrWebElement], List[WebElement]]: + """An expectation for checking that there is at least one element present on a web page. Parameters: - ---------- + ----------- locator : Tuple[str, str] Used to find the element. @@ -337,8 +522,8 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> elements = WebDriverWait(driver, 10).until( - ... EC.presence_of_all_elements_located((By.CLASS_NAME, "foo"))) - """ + ... EC.presence_of_all_elements_located((By.CLASS_NAME, "foo"))) + """ def _predicate(driver: WebDriverOrWebElement): return driver.find_elements(*locator) @@ -346,12 +531,15 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def visibility_of_any_elements_located(locator: Tuple[str, str]) -> Callable[[WebDriverOrWebElement], List[WebElement]]: - """An expectation for checking that there is at least one element visible + +
+[docs] +def visibility_of_any_elements_located(locator: Tuple[str, str]) -> Callable[[WebDriverOrWebElement], List[WebElement]]: + """An expectation for checking that there is at least one element visible on a web page. Parameters: - ---------- + ----------- locator : Tuple[str, str] Used to find the element. @@ -365,8 +553,8 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> elements = WebDriverWait(driver, 10).until( - ... EC.visibility_of_any_elements_located((By.CLASS_NAME, "foo"))) - """ + ... EC.visibility_of_any_elements_located((By.CLASS_NAME, "foo"))) + """ def _predicate(driver: WebDriverOrWebElement): return [element for element in driver.find_elements(*locator) if _element_if_visible(element)] @@ -374,15 +562,18 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def visibility_of_all_elements_located( + +
+[docs] +def visibility_of_all_elements_located( locator: Tuple[str, str] ) -> Callable[[WebDriverOrWebElement], Union[List[WebElement], Literal[False]]]: - """An expectation for checking that all elements are present on the DOM of + """An expectation for checking that all elements are present on the DOM of a page and visible. Visibility means that the elements are not only displayed but also has a height and width that is greater than 0. Parameters: - ---------- + ----------- locator : Tuple[str, str] Used to find the elements. @@ -396,8 +587,8 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> elements = WebDriverWait(driver, 10).until( - ... EC.visibility_of_all_elements_located((By.CLASS_NAME, "foo"))) - """ + ... EC.visibility_of_all_elements_located((By.CLASS_NAME, "foo"))) + """ def _predicate(driver: WebDriverOrWebElement): try: @@ -412,12 +603,15 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def text_to_be_present_in_element(locator: Tuple[str, str], text_: str) -> Callable[[WebDriverOrWebElement], bool]: - """An expectation for checking if the given text is present in the + +
+[docs] +def text_to_be_present_in_element(locator: Tuple[str, str], text_: str) -> Callable[[WebDriverOrWebElement], bool]: + """An expectation for checking if the given text is present in the specified element. Parameters: - ---------- + ----------- locator : Tuple[str, str] Used to find the element. text_ : str @@ -433,8 +627,8 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> is_text_in_element = WebDriverWait(driver, 10).until( - ... EC.text_to_be_present_in_element((By.CLASS_NAME, "foo"), "bar")) - """ + ... EC.text_to_be_present_in_element((By.CLASS_NAME, "foo"), "bar")) + """ def _predicate(driver: WebDriverOrWebElement): try: @@ -446,18 +640,21 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def text_to_be_present_in_element_value( + +
+[docs] +def text_to_be_present_in_element_value( locator: Tuple[str, str], text_: str ) -> Callable[[WebDriverOrWebElement], bool]: - """An expectation for checking if the given text is present in the - element's value. + """An expectation for checking if the given text is present in the + element's value. Parameters: - ---------- + ----------- locator : Tuple[str, str] Used to find the element. text_ : str - The text to be present in the element's value. + The text to be present in the element's value. Returns: ------- @@ -469,12 +666,12 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> is_text_in_element_value = WebDriverWait(driver, 10).until( - ... EC.text_to_be_present_in_element_value((By.CLASS_NAME, "foo"), "bar")) - """ + ... EC.text_to_be_present_in_element_value((By.CLASS_NAME, "foo"), "bar")) + """ def _predicate(driver: WebDriverOrWebElement): try: - element_text = driver.find_element(*locator).get_attribute("value") + element_text = driver.find_element(*locator).get_attribute("value") return text_ in element_text except StaleElementReferenceException: return False @@ -482,20 +679,23 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def text_to_be_present_in_element_attribute( + +
+[docs] +def text_to_be_present_in_element_attribute( locator: Tuple[str, str], attribute_: str, text_: str ) -> Callable[[WebDriverOrWebElement], bool]: - """An expectation for checking if the given text is present in the - element's attribute. + """An expectation for checking if the given text is present in the + element's attribute. Parameters: - ---------- + ----------- locator : Tuple[str, str] Used to find the element. attribute_ : str The attribute to check the text in. text_ : str - The text to be present in the element's attribute. + The text to be present in the element's attribute. Returns: ------- @@ -507,9 +707,9 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> is_text_in_element_attribute = WebDriverWait(driver, 10).until( - ... EC.text_to_be_present_in_element_attribute((By.CLASS_NAME, "foo"), - ... "bar", "baz")) - """ + ... EC.text_to_be_present_in_element_attribute((By.CLASS_NAME, "foo"), + ... "bar", "baz")) + """ def _predicate(driver: WebDriverOrWebElement): try: @@ -523,13 +723,18 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def frame_to_be_available_and_switch_to_it(locator: Union[Tuple[str, str], str]) -> Callable[[WebDriver], bool]: - """An expectation for checking whether the given frame is available to + +
+[docs] +def frame_to_be_available_and_switch_to_it( + locator: Union[Tuple[str, str], str, WebElement] +) -> Callable[[WebDriver], bool]: + """An expectation for checking whether the given frame is available to switch to. Parameters: - ---------- - locator : Union[Tuple[str, str], str] + ----------- + locator : Union[Tuple[str, str], str, WebElement] Used to find the frame. Returns: @@ -541,13 +746,13 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> WebDriverWait(driver, 10).until( - ... EC.frame_to_be_available_and_switch_to_it("frame_name")) + ... EC.frame_to_be_available_and_switch_to_it("frame_name")) Notes: ------ If the frame is available it switches the given driver to the specified frame. - """ + """ def _predicate(driver: WebDriver): try: @@ -562,14 +767,17 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def invisibility_of_element_located( + +
+[docs] +def invisibility_of_element_located( locator: Union[WebElement, Tuple[str, str]] ) -> Callable[[WebDriverOrWebElement], Union[WebElement, bool]]: - """An Expectation for checking that an element is either invisible or not + """An Expectation for checking that an element is either invisible or not present on the DOM. Parameters: - ---------- + ----------- locator : Union[WebElement, Tuple[str, str]] Used to find the element. @@ -583,7 +791,7 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> is_invisible = WebDriverWait(driver, 10).until( - ... EC.invisibility_of_element_located((By.CLASS_NAME, "foo"))) + ... EC.invisibility_of_element_located((By.CLASS_NAME, "foo"))) Notes: ------ @@ -592,7 +800,7 @@

Source code for selenium.webdriver.support.expected_conditions

invisible. - In the case of StaleElementReference, returns true because stale element reference implies that element is no longer visible. - """ + """ def _predicate(driver: WebDriverOrWebElement): try: @@ -611,14 +819,17 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def invisibility_of_element( + +
+[docs] +def invisibility_of_element( element: Union[WebElement, Tuple[str, str]] ) -> Callable[[WebDriverOrWebElement], Union[WebElement, bool]]: - """An Expectation for checking that an element is either invisible or not + """An Expectation for checking that an element is either invisible or not present on the DOM. Parameters: - ---------- + ----------- element : Union[WebElement, Tuple[str, str]] Used to find the element. @@ -632,19 +843,22 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> is_invisible_or_not_present = WebDriverWait(driver, 10).until( - ... EC.invisibility_of_element(driver.find_element(By.CLASS_NAME, "foo"))) - """ + ... EC.invisibility_of_element(driver.find_element(By.CLASS_NAME, "foo"))) + """ return invisibility_of_element_located(element)
-
[docs]def element_to_be_clickable( + +
+[docs] +def element_to_be_clickable( mark: Union[WebElement, Tuple[str, str]] ) -> Callable[[WebDriverOrWebElement], Union[Literal[False], WebElement]]: - """An Expectation for checking an element is visible and enabled such that + """An Expectation for checking an element is visible and enabled such that you can click it. Parameters: - ---------- + ----------- mark : Union[WebElement, Tuple[str, str]] Used to find the element. @@ -658,10 +872,10 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> element = WebDriverWait(driver, 10).until( - ... EC.element_to_be_clickable((By.CLASS_NAME, "foo"))) - """ + ... EC.element_to_be_clickable((By.CLASS_NAME, "foo"))) + """ - # renamed argument to 'mark', to indicate that both locator + # renamed argument to 'mark', to indicate that both locator # and WebElement args are valid def _predicate(driver: WebDriverOrWebElement): target = mark @@ -675,11 +889,14 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def staleness_of(element: WebElement) -> Callable[[Any], bool]: - """Wait until an element is no longer attached to the DOM. + +
+[docs] +def staleness_of(element: WebElement) -> Callable[[Any], bool]: + """Wait until an element is no longer attached to the DOM. Parameters: - ---------- + ----------- element : WebElement The element to wait for. @@ -693,8 +910,8 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> is_element_stale = WebDriverWait(driver, 10).until( - ... EC.staleness_of(driver.find_element(By.CLASS_NAME, "foo"))) - """ + ... EC.staleness_of(driver.find_element(By.CLASS_NAME, "foo"))) + """ def _predicate(_): try: @@ -707,11 +924,14 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def element_to_be_selected(element: WebElement) -> Callable[[Any], bool]: - """An expectation for checking the selection is selected. + +
+[docs] +def element_to_be_selected(element: WebElement) -> Callable[[Any], bool]: + """An expectation for checking the selection is selected. Parameters: - ---------- + ----------- element : WebElement The WebElement to check. @@ -725,8 +945,8 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> is_selected = WebDriverWait(driver, 10).until( - ... EC.element_to_be_selected(driver.find_element(By.CLASS_NAME, "foo"))) - """ + ... EC.element_to_be_selected(driver.find_element(By.CLASS_NAME, "foo"))) + """ def _predicate(_): return element.is_selected() @@ -734,11 +954,14 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def element_located_to_be_selected(locator: Tuple[str, str]) -> Callable[[WebDriverOrWebElement], bool]: - """An expectation for the element to be located is selected. + +
+[docs] +def element_located_to_be_selected(locator: Tuple[str, str]) -> Callable[[WebDriverOrWebElement], bool]: + """An expectation for the element to be located is selected. Parameters: - ---------- + ----------- locator : Tuple[str, str] Used to find the element. @@ -752,8 +975,8 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> is_selected = WebDriverWait(driver, 10).until( - ... EC.element_located_to_be_selected((By.CLASS_NAME, "foo"))) - """ + ... EC.element_located_to_be_selected((By.CLASS_NAME, "foo"))) + """ def _predicate(driver: WebDriverOrWebElement): return driver.find_element(*locator).is_selected() @@ -761,18 +984,21 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def element_selection_state_to_be(element: WebElement, is_selected: bool) -> Callable[[Any], bool]: - """An expectation for checking if the given element is selected. + +
+[docs] +def element_selection_state_to_be(element: WebElement, is_selected: bool) -> Callable[[Any], bool]: + """An expectation for checking if the given element is selected. Parameters: - ---------- + ----------- element : WebElement The WebElement to check. is_selected : bool Returns: ------- - boolean : True if the element's selection state is the same as is_selected + boolean : True if the element's selection state is the same as is_selected Example: -------- @@ -780,8 +1006,8 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> is_selected = WebDriverWait(driver, 10).until( - ... EC.element_selection_state_to_be(driver.find_element(By.CLASS_NAME, "foo"), True)) - """ + ... EC.element_selection_state_to_be(driver.find_element(By.CLASS_NAME, "foo"), True)) + """ def _predicate(_): return element.is_selected() == is_selected @@ -789,21 +1015,24 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def element_located_selection_state_to_be( + +
+[docs] +def element_located_selection_state_to_be( locator: Tuple[str, str], is_selected: bool ) -> Callable[[WebDriverOrWebElement], bool]: - """An expectation to locate an element and check if the selection state + """An expectation to locate an element and check if the selection state specified is in that state. Parameters: - ---------- + ----------- locator : Tuple[str, str] Used to find the element. is_selected : bool Returns: ------- - boolean : True if the element's selection state is the same as is_selected + boolean : True if the element's selection state is the same as is_selected Example: -------- @@ -811,8 +1040,8 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> is_selected = WebDriverWait(driver, 10).until( - ... EC.element_located_selection_state_to_be((By.CLASS_NAME, "foo"), True)) - """ + ... EC.element_located_selection_state_to_be((By.CLASS_NAME, "foo"), True)) + """ def _predicate(driver: WebDriverOrWebElement): try: @@ -824,11 +1053,14 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def number_of_windows_to_be(num_windows: int) -> Callable[[WebDriver], bool]: - """An expectation for the number of windows to be a certain value. + +
+[docs] +def number_of_windows_to_be(num_windows: int) -> Callable[[WebDriver], bool]: + """An expectation for the number of windows to be a certain value. Parameters: - ---------- + ----------- num_windows : int The expected number of windows. @@ -842,7 +1074,7 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support import expected_conditions as EC >>> is_number_of_windows = WebDriverWait(driver, 10).until( ... EC.number_of_windows_to_be(2)) - """ + """ def _predicate(driver: WebDriver): return len(driver.window_handles) == num_windows @@ -850,12 +1082,15 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def new_window_is_opened(current_handles: List[str]) -> Callable[[WebDriver], bool]: - """An expectation that a new window will be opened and have the number of + +
+[docs] +def new_window_is_opened(current_handles: List[str]) -> Callable[[WebDriver], bool]: + """An expectation that a new window will be opened and have the number of windows handles increase. Parameters: - ---------- + ----------- current_handles : List[str] The current window handles. @@ -870,7 +1105,7 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support import expected_conditions as EC >>> is_new_window_opened = WebDriverWait(driver, 10).until( ... EC.new_window_is_opened(driver.window_handles)) - """ + """ def _predicate(driver: WebDriver): return len(driver.window_handles) > len(current_handles) @@ -878,8 +1113,11 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def alert_is_present() -> Callable[[WebDriver], Union[Alert, Literal[False]]]: - """An expectation for checking if an alert is currently present and + +
+[docs] +def alert_is_present() -> Callable[[WebDriver], Union[Alert, Literal[False]]]: + """An expectation for checking if an alert is currently present and switching to it. Returns: @@ -895,7 +1133,7 @@

Source code for selenium.webdriver.support.expected_conditions

Notes: ------ If the alert is present it switches the given driver to it. - """ + """ def _predicate(driver: WebDriver): try: @@ -906,12 +1144,15 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def element_attribute_to_include(locator: Tuple[str, str], attribute_: str) -> Callable[[WebDriverOrWebElement], bool]: - """An expectation for checking if the given attribute is included in the + +
+[docs] +def element_attribute_to_include(locator: Tuple[str, str], attribute_: str) -> Callable[[WebDriverOrWebElement], bool]: + """An expectation for checking if the given attribute is included in the specified element. Parameters: - ---------- + ----------- locator : Tuple[str, str] Used to find the element. attribute_ : str @@ -927,8 +1168,8 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> is_attribute_in_element = WebDriverWait(driver, 10).until( - ... EC.element_attribute_to_include((By.CLASS_NAME, "foo"), "bar")) - """ + ... EC.element_attribute_to_include((By.CLASS_NAME, "foo"), "bar")) + """ def _predicate(driver: WebDriverOrWebElement): try: @@ -940,11 +1181,14 @@

Source code for selenium.webdriver.support.expected_conditions

return _predicate
-
[docs]def any_of(*expected_conditions: Callable[[D], T]) -> Callable[[D], Union[Literal[False], T]]: - """An expectation that any of multiple expected conditions is true. + +
+[docs] +def any_of(*expected_conditions: Callable[[D], T]) -> Callable[[D], Union[Literal[False], T]]: + """An expectation that any of multiple expected conditions is true. Parameters: - ---------- + ----------- expected_conditions : Callable[[D], T] The list of expected conditions to check. @@ -958,14 +1202,14 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> element = WebDriverWait(driver, 10).until( - ... EC.any_of(EC.presence_of_element_located((By.NAME, "q"), - ... EC.visibility_of_element_located((By.NAME, "q")))) + ... EC.any_of(EC.presence_of_element_located((By.NAME, "q"), + ... EC.visibility_of_element_located((By.NAME, "q")))) Notes: ------ - Equivalent to a logical 'OR'. Returns results of the first matching + Equivalent to a logical 'OR'. Returns results of the first matching condition, or False if none do. - """ + """ def any_of_condition(driver: D): for expected_condition in expected_conditions: @@ -980,13 +1224,16 @@

Source code for selenium.webdriver.support.expected_conditions

return any_of_condition
-
[docs]def all_of( + +
+[docs] +def all_of( *expected_conditions: Callable[[D], Union[T, Literal[False]]] ) -> Callable[[D], Union[List[T], Literal[False]]]: - """An expectation that all of multiple expected conditions is true. + """An expectation that all of multiple expected conditions is true. Parameters: - ---------- + ----------- expected_conditions : Callable[[D], Union[T, Literal[False]]] The list of expected conditions to check. @@ -1000,15 +1247,15 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> elements = WebDriverWait(driver, 10).until( - ... EC.all_of(EC.presence_of_element_located((By.NAME, "q"), - ... EC.visibility_of_element_located((By.NAME, "q")))) + ... EC.all_of(EC.presence_of_element_located((By.NAME, "q"), + ... EC.visibility_of_element_located((By.NAME, "q")))) Notes: ------ - Equivalent to a logical 'AND'. + Equivalent to a logical 'AND'. Returns: When any ExpectedCondition is not met: False. - When all ExpectedConditions are met: A List with each ExpectedCondition's return value. - """ + When all ExpectedConditions are met: A List with each ExpectedCondition's return value. + """ def all_of_condition(driver: D): results: List[T] = [] @@ -1025,11 +1272,14 @@

Source code for selenium.webdriver.support.expected_conditions

return all_of_condition
-
[docs]def none_of(*expected_conditions: Callable[[D], Any]) -> Callable[[D], bool]: - """An expectation that none of 1 or multiple expected conditions is true. + +
+[docs] +def none_of(*expected_conditions: Callable[[D], Any]) -> Callable[[D], bool]: + """An expectation that none of 1 or multiple expected conditions is true. Parameters: - ---------- + ----------- expected_conditions : Callable[[D], Any] The list of expected conditions to check. @@ -1043,13 +1293,13 @@

Source code for selenium.webdriver.support.expected_conditions

>>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> element = WebDriverWait(driver, 10).until( - ... EC.none_of(EC.presence_of_element_located((By.NAME, "q"), - ... EC.visibility_of_element_located((By.NAME, "q")))) + ... EC.none_of(EC.presence_of_element_located((By.NAME, "q"), + ... EC.visibility_of_element_located((By.NAME, "q")))) Notes: ------ - Equivalent to a logical 'NOT-OR'. Returns a Boolean - """ + Equivalent to a logical 'NOT-OR'. Returns a Boolean + """ def none_of_condition(driver: D): for expected_condition in expected_conditions: @@ -1062,44 +1312,35 @@

Source code for selenium.webdriver.support.expected_conditions

return True return none_of_condition
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/support/relative_locator.html b/docs/api/py/_modules/selenium/webdriver/support/relative_locator.html index 5c99a71354254..e81e13ea05c06 100644 --- a/docs/api/py/_modules/selenium/webdriver/support/relative_locator.html +++ b/docs/api/py/_modules/selenium/webdriver/support/relative_locator.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.support.relative_locator — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.support.relative_locator — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.support.relative_locator

+  

Source code for selenium.webdriver.support.relative_locator

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -66,11 +222,13 @@ 

Source code for selenium.webdriver.support.relative_locator

from selenium.webdriver.remote.webelement import WebElement -
[docs]def with_tag_name(tag_name: str) -> "RelativeBy": - """Start searching for relative objects using a tag name. +
+[docs] +def with_tag_name(tag_name: str) -> "RelativeBy": + """Start searching for relative objects using a tag name. Parameters: - ---------- + ----------- tag_name : str The DOM tag of element to start searching. @@ -88,20 +246,23 @@

Source code for selenium.webdriver.support.relative_locator

------ - This method is deprecated and may be removed in future versions. - Please use `locate_with` instead. - """ + """ warnings.warn( - "This method is deprecated and may be removed in future versions. " "Please use `locate_with` instead." + "This method is deprecated and may be removed in future versions. " "Please use `locate_with` instead." ) if not tag_name: - raise WebDriverException("tag_name can not be null") + raise WebDriverException("tag_name can not be null") return RelativeBy({By.CSS_SELECTOR: tag_name})
-
[docs]def locate_with(by: ByType, using: str) -> "RelativeBy": - """Start searching for relative objects your search criteria with By. + +
+[docs] +def locate_with(by: ByType, using: str) -> "RelativeBy": + """Start searching for relative objects your search criteria with By. Parameters: - ---------- + ----------- by : ByType The method to find the element. @@ -115,57 +276,62 @@

Source code for selenium.webdriver.support.relative_locator

Example: -------- - >>> lowest = driver.find_element(By.ID, "below") - >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").above(lowest)) - """ - assert by is not None, "Please pass in a by argument" - assert using is not None, "Please pass in a using argument" + >>> lowest = driver.find_element(By.ID, "below") + >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").above(lowest)) + """ + assert by is not None, "Please pass in a by argument" + assert using is not None, "Please pass in a using argument" return RelativeBy({by: using})
-
[docs]class RelativeBy: - """Gives the opportunity to find elements based on their relative location + +
+[docs] +class RelativeBy: + """Gives the opportunity to find elements based on their relative location on the page from a root element. It is recommended that you use the helper function to create it. Example: -------- - >>> lowest = driver.find_element(By.ID, "below") - >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").above(lowest)) - >>> ids = [el.get_attribute('id') for el in elements] - >>> assert "above" in ids - >>> assert "mid" in ids - """ + >>> lowest = driver.find_element(By.ID, "below") + >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").above(lowest)) + >>> ids = [el.get_attribute('id') for el in elements] + >>> assert "above" in ids + >>> assert "mid" in ids + """ LocatorType = Dict[ByType, str] def __init__(self, root: Optional[Dict[ByType, str]] = None, filters: Optional[List] = None): - """Creates a new RelativeBy object. It is preferred if you use the + """Creates a new RelativeBy object. It is preferred if you use the `locate_with` method as this signature could change. Attributes: - ---------- + ----------- root : Dict[By, str] - A dict with `By` enum as the key and the search query as the value filters : List - A list of the filters that will be searched. If none are passed in please use the fluent API on the object to create the filters - """ + """ self.root = root self.filters = filters or [] @overload - def above(self, element_or_locator: Union[WebElement, LocatorType]) -> "RelativeBy": ... + def above(self, element_or_locator: Union[WebElement, LocatorType]) -> "RelativeBy": ... @overload - def above(self, element_or_locator: None = None) -> "NoReturn": ... + def above(self, element_or_locator: None = None) -> "NoReturn": ... -
[docs] def above(self, element_or_locator: Union[WebElement, LocatorType, None] = None) -> "RelativeBy": - """Add a filter to look for elements above. +
+[docs] + def above(self, element_or_locator: Union[WebElement, LocatorType, None] = None) -> "RelativeBy": + """Add a filter to look for elements above. Parameters: - ---------- + ----------- element_or_locator : Union[WebElement, Dict, None] Element to look above @@ -180,26 +346,29 @@

Source code for selenium.webdriver.support.relative_locator

Example: -------- - >>> lowest = driver.find_element(By.ID, "below") - >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").above(lowest)) - """ + >>> lowest = driver.find_element(By.ID, "below") + >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").above(lowest)) + """ if not element_or_locator: - raise WebDriverException("Element or locator must be given when calling above method") + raise WebDriverException("Element or locator must be given when calling above method") - self.filters.append({"kind": "above", "args": [element_or_locator]}) + self.filters.append({"kind": "above", "args": [element_or_locator]}) return self
+ @overload - def below(self, element_or_locator: Union[WebElement, LocatorType]) -> "RelativeBy": ... + def below(self, element_or_locator: Union[WebElement, LocatorType]) -> "RelativeBy": ... @overload - def below(self, element_or_locator: None = None) -> "NoReturn": ... + def below(self, element_or_locator: None = None) -> "NoReturn": ... -
[docs] def below(self, element_or_locator: Union[WebElement, Dict, None] = None) -> "RelativeBy": - """Add a filter to look for elements below. +
+[docs] + def below(self, element_or_locator: Union[WebElement, Dict, None] = None) -> "RelativeBy": + """Add a filter to look for elements below. Parameters: - ---------- + ----------- element_or_locator : Union[WebElement, Dict, None] Element to look below @@ -214,26 +383,29 @@

Source code for selenium.webdriver.support.relative_locator

Example: -------- - >>> highest = driver.find_element(By.ID, "high") - >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").below(highest)) - """ + >>> highest = driver.find_element(By.ID, "high") + >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").below(highest)) + """ if not element_or_locator: - raise WebDriverException("Element or locator must be given when calling below method") + raise WebDriverException("Element or locator must be given when calling below method") - self.filters.append({"kind": "below", "args": [element_or_locator]}) + self.filters.append({"kind": "below", "args": [element_or_locator]}) return self
+ @overload - def to_left_of(self, element_or_locator: Union[WebElement, LocatorType]) -> "RelativeBy": ... + def to_left_of(self, element_or_locator: Union[WebElement, LocatorType]) -> "RelativeBy": ... @overload - def to_left_of(self, element_or_locator: None = None) -> "NoReturn": ... + def to_left_of(self, element_or_locator: None = None) -> "NoReturn": ... -
[docs] def to_left_of(self, element_or_locator: Union[WebElement, Dict, None] = None) -> "RelativeBy": - """Add a filter to look for elements to the left of. +
+[docs] + def to_left_of(self, element_or_locator: Union[WebElement, Dict, None] = None) -> "RelativeBy": + """Add a filter to look for elements to the left of. Parameters: - ---------- + ----------- element_or_locator : Union[WebElement, Dict, None] Element to look to the left of @@ -248,26 +420,29 @@

Source code for selenium.webdriver.support.relative_locator

Example: -------- - >>> right = driver.find_element(By.ID, "right") - >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").to_left_of(right)) - """ + >>> right = driver.find_element(By.ID, "right") + >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").to_left_of(right)) + """ if not element_or_locator: - raise WebDriverException("Element or locator must be given when calling to_left_of method") + raise WebDriverException("Element or locator must be given when calling to_left_of method") - self.filters.append({"kind": "left", "args": [element_or_locator]}) + self.filters.append({"kind": "left", "args": [element_or_locator]}) return self
+ @overload - def to_right_of(self, element_or_locator: Union[WebElement, LocatorType]) -> "RelativeBy": ... + def to_right_of(self, element_or_locator: Union[WebElement, LocatorType]) -> "RelativeBy": ... @overload - def to_right_of(self, element_or_locator: None = None) -> "NoReturn": ... + def to_right_of(self, element_or_locator: None = None) -> "NoReturn": ... -
[docs] def to_right_of(self, element_or_locator: Union[WebElement, Dict, None] = None) -> "RelativeBy": - """Add a filter to look for elements right of. +
+[docs] + def to_right_of(self, element_or_locator: Union[WebElement, Dict, None] = None) -> "RelativeBy": + """Add a filter to look for elements right of. Parameters: - ---------- + ----------- element_or_locator : Union[WebElement, Dict, None] Element to look right of @@ -282,98 +457,113 @@

Source code for selenium.webdriver.support.relative_locator

Example: -------- - >>> left = driver.find_element(By.ID, "left") - >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").to_right_of(left)) - """ + >>> left = driver.find_element(By.ID, "left") + >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").to_right_of(left)) + """ if not element_or_locator: - raise WebDriverException("Element or locator must be given when calling to_right_of method") + raise WebDriverException("Element or locator must be given when calling to_right_of method") - self.filters.append({"kind": "right", "args": [element_or_locator]}) + self.filters.append({"kind": "right", "args": [element_or_locator]}) return self
+ @overload - def straight_above(self, element_or_locator: Union[WebElement, LocatorType]) -> "RelativeBy": ... + def straight_above(self, element_or_locator: Union[WebElement, LocatorType]) -> "RelativeBy": ... @overload - def straight_above(self, element_or_locator: None = None) -> "NoReturn": ... + def straight_above(self, element_or_locator: None = None) -> "NoReturn": ... -
[docs] def straight_above(self, element_or_locator: Union[WebElement, LocatorType, None] = None) -> "RelativeBy": - """Add a filter to look for elements above. +
+[docs] + def straight_above(self, element_or_locator: Union[WebElement, LocatorType, None] = None) -> "RelativeBy": + """Add a filter to look for elements above. :Args: - element_or_locator: Element to look above - """ + """ if not element_or_locator: - raise WebDriverException("Element or locator must be given when calling above method") + raise WebDriverException("Element or locator must be given when calling above method") - self.filters.append({"kind": "straightAbove", "args": [element_or_locator]}) + self.filters.append({"kind": "straightAbove", "args": [element_or_locator]}) return self
+ @overload - def straight_below(self, element_or_locator: Union[WebElement, LocatorType]) -> "RelativeBy": ... + def straight_below(self, element_or_locator: Union[WebElement, LocatorType]) -> "RelativeBy": ... @overload - def straight_below(self, element_or_locator: None = None) -> "NoReturn": ... + def straight_below(self, element_or_locator: None = None) -> "NoReturn": ... -
[docs] def straight_below(self, element_or_locator: Union[WebElement, Dict, None] = None) -> "RelativeBy": - """Add a filter to look for elements below. +
+[docs] + def straight_below(self, element_or_locator: Union[WebElement, Dict, None] = None) -> "RelativeBy": + """Add a filter to look for elements below. :Args: - element_or_locator: Element to look below - """ + """ if not element_or_locator: - raise WebDriverException("Element or locator must be given when calling below method") + raise WebDriverException("Element or locator must be given when calling below method") - self.filters.append({"kind": "straightBelow", "args": [element_or_locator]}) + self.filters.append({"kind": "straightBelow", "args": [element_or_locator]}) return self
+ @overload - def straight_left_of(self, element_or_locator: Union[WebElement, LocatorType]) -> "RelativeBy": ... + def straight_left_of(self, element_or_locator: Union[WebElement, LocatorType]) -> "RelativeBy": ... @overload - def straight_left_of(self, element_or_locator: None = None) -> "NoReturn": ... + def straight_left_of(self, element_or_locator: None = None) -> "NoReturn": ... -
[docs] def straight_left_of(self, element_or_locator: Union[WebElement, Dict, None] = None) -> "RelativeBy": - """Add a filter to look for elements to the left of. +
+[docs] + def straight_left_of(self, element_or_locator: Union[WebElement, Dict, None] = None) -> "RelativeBy": + """Add a filter to look for elements to the left of. :Args: - element_or_locator: Element to look to the left of - """ + """ if not element_or_locator: - raise WebDriverException("Element or locator must be given when calling to_left_of method") + raise WebDriverException("Element or locator must be given when calling to_left_of method") - self.filters.append({"kind": "straightLeft", "args": [element_or_locator]}) + self.filters.append({"kind": "straightLeft", "args": [element_or_locator]}) return self
+ @overload - def straight_right_of(self, element_or_locator: Union[WebElement, LocatorType]) -> "RelativeBy": ... + def straight_right_of(self, element_or_locator: Union[WebElement, LocatorType]) -> "RelativeBy": ... @overload - def straight_right_of(self, element_or_locator: None = None) -> "NoReturn": ... + def straight_right_of(self, element_or_locator: None = None) -> "NoReturn": ... -
[docs] def straight_right_of(self, element_or_locator: Union[WebElement, Dict, None] = None) -> "RelativeBy": - """Add a filter to look for elements right of. +
+[docs] + def straight_right_of(self, element_or_locator: Union[WebElement, Dict, None] = None) -> "RelativeBy": + """Add a filter to look for elements right of. :Args: - element_or_locator: Element to look right of - """ + """ if not element_or_locator: - raise WebDriverException("Element or locator must be given when calling to_right_of method") + raise WebDriverException("Element or locator must be given when calling to_right_of method") - self.filters.append({"kind": "straightRight", "args": [element_or_locator]}) + self.filters.append({"kind": "straightRight", "args": [element_or_locator]}) return self
+ @overload - def near(self, element_or_locator: Union[WebElement, LocatorType], distance: int = 50) -> "RelativeBy": ... + def near(self, element_or_locator: Union[WebElement, LocatorType], distance: int = 50) -> "RelativeBy": ... @overload - def near(self, element_or_locator: None = None, distance: int = 50) -> "NoReturn": ... + def near(self, element_or_locator: None = None, distance: int = 50) -> "NoReturn": ... -
[docs] def near(self, element_or_locator: Union[WebElement, LocatorType, None] = None, distance: int = 50) -> "RelativeBy": - """Add a filter to look for elements near. +
+[docs] + def near(self, element_or_locator: Union[WebElement, LocatorType, None] = None, distance: int = 50) -> "RelativeBy": + """Add a filter to look for elements near. Parameters: - ---------- + ----------- element_or_locator : Union[WebElement, Dict, None] Element to look near by the element or within a distance @@ -392,64 +582,59 @@

Source code for selenium.webdriver.support.relative_locator

Example: -------- - >>> near = driver.find_element(By.ID, "near") - >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").near(near, 50)) - """ + >>> near = driver.find_element(By.ID, "near") + >>> elements = driver.find_elements(locate_with(By.CSS_SELECTOR, "p").near(near, 50)) + """ if not element_or_locator: - raise WebDriverException("Element or locator must be given when calling near method") + raise WebDriverException("Element or locator must be given when calling near method") if distance <= 0: - raise WebDriverException("Distance must be positive") + raise WebDriverException("Distance must be positive") - self.filters.append({"kind": "near", "args": [element_or_locator, distance]}) + self.filters.append({"kind": "near", "args": [element_or_locator, distance]}) return self
-
[docs] def to_dict(self) -> Dict: - """Create a dict that will be passed to the driver to start searching - for the element.""" + +
+[docs] + def to_dict(self) -> Dict: + """Create a dict that will be passed to the driver to start searching + for the element.""" return { - "relative": { - "root": self.root, - "filters": self.filters, + "relative": { + "root": self.root, + "filters": self.filters, } - }
+ }
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/support/select.html b/docs/api/py/_modules/selenium/webdriver/support/select.html index 3fe314354dadd..2de462d9a397a 100644 --- a/docs/api/py/_modules/selenium/webdriver/support/select.html +++ b/docs/api/py/_modules/selenium/webdriver/support/select.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.support.select — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.support.select — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.support.select

+  

Source code for selenium.webdriver.support.select

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -61,9 +217,11 @@ 

Source code for selenium.webdriver.support.select

from selenium.webdriver.remote.webelement import WebElement -
[docs]class Select: +
+[docs] +class Select: def __init__(self, webelement: WebElement) -> None: - """Constructor. A check is made that the given element is, indeed, a + """Constructor. A check is made that the given element is, indeed, a SELECT tag. If it is not, then an UnexpectedTagNameException is thrown. :Args: @@ -71,46 +229,48 @@

Source code for selenium.webdriver.support.select

Example: from selenium.webdriver.support.ui import Select \n - Select(driver.find_element(By.TAG_NAME, "select")).select_by_index(2) - """ - if webelement.tag_name.lower() != "select": - raise UnexpectedTagNameException(f"Select only works on <select> elements, not on {webelement.tag_name}") + Select(driver.find_element(By.TAG_NAME, "select")).select_by_index(2) + """ + if webelement.tag_name.lower() != "select": + raise UnexpectedTagNameException(f"Select only works on <select> elements, not on {webelement.tag_name}") self._el = webelement - multi = self._el.get_dom_attribute("multiple") - self.is_multiple = multi and multi != "false" + multi = self._el.get_dom_attribute("multiple") + self.is_multiple = multi and multi != "false" @property def options(self) -> List[WebElement]: - """Returns a list of all options belonging to this select tag.""" - return self._el.find_elements(By.TAG_NAME, "option") + """Returns a list of all options belonging to this select tag.""" + return self._el.find_elements(By.TAG_NAME, "option") @property def all_selected_options(self) -> List[WebElement]: - """Returns a list of all selected options belonging to this select - tag.""" + """Returns a list of all selected options belonging to this select + tag.""" return [opt for opt in self.options if opt.is_selected()] @property def first_selected_option(self) -> WebElement: - """The first selected option in this select tag (or the currently - selected option in a normal select)""" + """The first selected option in this select tag (or the currently + selected option in a normal select)""" for opt in self.options: if opt.is_selected(): return opt - raise NoSuchElementException("No options are selected") + raise NoSuchElementException("No options are selected") -
[docs] def select_by_value(self, value: str) -> None: - """Select all options that have a value matching the argument. That is, - when given "foo" this would select an option like: +
+[docs] + def select_by_value(self, value: str) -> None: + """Select all options that have a value matching the argument. That is, + when given "foo" this would select an option like: - <option value="foo">Bar</option> + <option value="foo">Bar</option> :Args: - value - The value to match against throws NoSuchElementException If there is no option with specified value in SELECT - """ - css = f"option[value ={self._escape_string(value)}]" + """ + css = f"option[value ={self._escape_string(value)}]" opts = self._el.find_elements(By.CSS_SELECTOR, css) matched = False for opt in opts: @@ -119,36 +279,42 @@

Source code for selenium.webdriver.support.select

return matched = True if not matched: - raise NoSuchElementException(f"Cannot locate option with value: {value}")
+ raise NoSuchElementException(f"Cannot locate option with value: {value}")
+ -
[docs] def select_by_index(self, index: int) -> None: - """Select the option at the given index. This is done by examining the - "index" attribute of an element, and not merely by counting. +
+[docs] + def select_by_index(self, index: int) -> None: + """Select the option at the given index. This is done by examining the + "index" attribute of an element, and not merely by counting. :Args: - index - The option at this index will be selected throws NoSuchElementException If there is no option with specified index in SELECT - """ + """ match = str(index) for opt in self.options: - if opt.get_attribute("index") == match: + if opt.get_attribute("index") == match: self._set_selected(opt) return - raise NoSuchElementException(f"Could not locate element with index {index}")
+ raise NoSuchElementException(f"Could not locate element with index {index}")
-
[docs] def select_by_visible_text(self, text: str) -> None: - """Select all options that display text matching the argument. That is, - when given "Bar" this would select an option like: - <option value="foo">Bar</option> +
+[docs] + def select_by_visible_text(self, text: str) -> None: + """Select all options that display text matching the argument. That is, + when given "Bar" this would select an option like: + + <option value="foo">Bar</option> :Args: - text - The visible text to match against throws NoSuchElementException If there is no option with specified text in SELECT - """ - xpath = f".//option[normalize-space(.) = {self._escape_string(text)}]" + """ + xpath = f".//option[normalize-space(.) = {self._escape_string(text)}]" opts = self._el.find_elements(By.XPATH, xpath) matched = False for opt in opts: @@ -157,12 +323,12 @@

Source code for selenium.webdriver.support.select

return matched = True - if len(opts) == 0 and " " in text: + if len(opts) == 0 and " " in text: sub_string_without_space = self._get_longest_token(text) - if sub_string_without_space == "": + if sub_string_without_space == "": candidates = self.options else: - xpath = f".//option[contains(.,{self._escape_string(sub_string_without_space)})]" + xpath = f".//option[contains(.,{self._escape_string(sub_string_without_space)})]" candidates = self._el.find_elements(By.XPATH, xpath) for candidate in candidates: if text == candidate.text: @@ -172,83 +338,96 @@

Source code for selenium.webdriver.support.select

matched = True if not matched: - raise NoSuchElementException(f"Could not locate element with visible text: {text}")
+ raise NoSuchElementException(f"Could not locate element with visible text: {text}")
+ -
[docs] def deselect_all(self) -> None: - """Clear all selected entries. +
+[docs] + def deselect_all(self) -> None: + """Clear all selected entries. This is only valid when the SELECT supports multiple selections. throws NotImplementedError If the SELECT does not support multiple selections - """ + """ if not self.is_multiple: - raise NotImplementedError("You may only deselect all options of a multi-select") + raise NotImplementedError("You may only deselect all options of a multi-select") for opt in self.options: self._unset_selected(opt)
-
[docs] def deselect_by_value(self, value: str) -> None: - """Deselect all options that have a value matching the argument. That - is, when given "foo" this would deselect an option like: - <option value="foo">Bar</option> +
+[docs] + def deselect_by_value(self, value: str) -> None: + """Deselect all options that have a value matching the argument. That + is, when given "foo" this would deselect an option like: + + <option value="foo">Bar</option> :Args: - value - The value to match against throws NoSuchElementException If there is no option with specified value in SELECT - """ + """ if not self.is_multiple: - raise NotImplementedError("You may only deselect options of a multi-select") + raise NotImplementedError("You may only deselect options of a multi-select") matched = False - css = f"option[value = {self._escape_string(value)}]" + css = f"option[value = {self._escape_string(value)}]" opts = self._el.find_elements(By.CSS_SELECTOR, css) for opt in opts: self._unset_selected(opt) matched = True if not matched: - raise NoSuchElementException(f"Could not locate element with value: {value}")
+ raise NoSuchElementException(f"Could not locate element with value: {value}")
-
[docs] def deselect_by_index(self, index: int) -> None: - """Deselect the option at the given index. This is done by examining - the "index" attribute of an element, and not merely by counting. + +
+[docs] + def deselect_by_index(self, index: int) -> None: + """Deselect the option at the given index. This is done by examining + the "index" attribute of an element, and not merely by counting. :Args: - index - The option at this index will be deselected throws NoSuchElementException If there is no option with specified index in SELECT - """ + """ if not self.is_multiple: - raise NotImplementedError("You may only deselect options of a multi-select") + raise NotImplementedError("You may only deselect options of a multi-select") for opt in self.options: - if opt.get_attribute("index") == str(index): + if opt.get_attribute("index") == str(index): self._unset_selected(opt) return - raise NoSuchElementException(f"Could not locate element with index {index}")
+ raise NoSuchElementException(f"Could not locate element with index {index}")
+ -
[docs] def deselect_by_visible_text(self, text: str) -> None: - """Deselect all options that display text matching the argument. That - is, when given "Bar" this would deselect an option like: +
+[docs] + def deselect_by_visible_text(self, text: str) -> None: + """Deselect all options that display text matching the argument. That + is, when given "Bar" this would deselect an option like: - <option value="foo">Bar</option> + <option value="foo">Bar</option> :Args: - text - The visible text to match against - """ + """ if not self.is_multiple: - raise NotImplementedError("You may only deselect options of a multi-select") + raise NotImplementedError("You may only deselect options of a multi-select") matched = False - xpath = f".//option[normalize-space(.) = {self._escape_string(text)}]" + xpath = f".//option[normalize-space(.) = {self._escape_string(text)}]" opts = self._el.find_elements(By.XPATH, xpath) for opt in opts: self._unset_selected(opt) matched = True if not matched: - raise NoSuchElementException(f"Could not locate element with visible text: {text}")
+ raise NoSuchElementException(f"Could not locate element with visible text: {text}")
+ def _set_selected(self, option) -> None: if not option.is_selected(): if not option.is_enabled(): - raise NotImplementedError("You may not select a disabled option") + raise NotImplementedError("You may not select a disabled option") option.click() def _unset_selected(self, option) -> None: @@ -256,67 +435,58 @@

Source code for selenium.webdriver.support.select

option.click() def _escape_string(self, value: str) -> str: - if '"' in value and "'" in value: - substrings = value.split('"') - result = ["concat("] + if '"' in value and "'" in value: + substrings = value.split('"') + result = ["concat("] for substring in substrings: - result.append(f'"{substring}"') - result.append(", '\"', ") + result.append(f'"{substring}"') + result.append(", '\"', ") result = result[0:-1] - if value.endswith('"'): - result.append(", '\"'") - return "".join(result) + ")" + if value.endswith('"'): + result.append(", '\"'") + return "".join(result) + ")" - if '"' in value: - return f"'{value}'" + if '"' in value: + return f"'{value}'" - return f'"{value}"' + return f'"{value}"' def _get_longest_token(self, value: str) -> str: - items = value.split(" ") - longest = "" + items = value.split(" ") + longest = "" for item in items: if len(item) > len(longest): longest = item return longest
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/support/wait.html b/docs/api/py/_modules/selenium/webdriver/support/wait.html index 27507522580f4..9ab6b4068d475 100644 --- a/docs/api/py/_modules/selenium/webdriver/support/wait.html +++ b/docs/api/py/_modules/selenium/webdriver/support/wait.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.support.wait — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.support.wait — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.support.wait

+  

Source code for selenium.webdriver.support.wait

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -72,11 +228,13 @@ 

Source code for selenium.webdriver.support.wait

< POLL_FREQUENCY: float = 0.5 # How long to sleep in between calls to the method IGNORED_EXCEPTIONS: Tuple[Type[Exception]] = (NoSuchElementException,) # default to be ignored. -D = TypeVar("D", bound=Union[WebDriver, WebElement]) -T = TypeVar("T") +D = TypeVar("D", bound=Union[WebDriver, WebElement]) +T = TypeVar("T") -
[docs]class WebDriverWait(Generic[D]): +
+[docs] +class WebDriverWait(Generic[D]): def __init__( self, driver: D, @@ -84,10 +242,10 @@

Source code for selenium.webdriver.support.wait

< poll_frequency: float = POLL_FREQUENCY, ignored_exceptions: Optional[WaitExcTypes] = None, ): - """Constructor, takes a WebDriver instance and timeout in seconds. + """Constructor, takes a WebDriver instance and timeout in seconds. Attributes: - ---------- + ----------- driver - Instance of WebDriver (Ie, Firefox, Chrome or Remote) or a WebElement @@ -111,8 +269,8 @@

Source code for selenium.webdriver.support.wait

< >>> >>> # Wait until the element is no longer visible >>> is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)) - ... .until_not(lambda x: x.find_element(By.ID, "someId").is_displayed()) - """ + ... .until_not(lambda x: x.find_element(By.ID, "someId").is_displayed()) + """ self._driver = driver self._timeout = float(timeout) self._poll = poll_frequency @@ -128,16 +286,18 @@

Source code for selenium.webdriver.support.wait

< self._ignored_exceptions = tuple(exceptions) def __repr__(self): - return f'<{type(self).__module__}.{type(self).__name__} (session="{self._driver.session_id}")>' + return f'<{type(self).__module__}.{type(self).__name__} (session="{self._driver.session_id}")>' -
[docs] def until(self, method: Callable[[D], Union[Literal[False], T]], message: str = "") -> T: - """Wait until the method returns a value that is not False. +
+[docs] + def until(self, method: Callable[[D], Union[Literal[False], T]], message: str = "") -> T: + """Wait until the method returns a value that is not False. Calls the method provided with the driver as an argument until the return value does not evaluate to ``False``. Parameters: - ---------- + ----------- method: callable(WebDriver) - A callable object that takes a WebDriver instance as an argument. @@ -152,8 +312,8 @@

Source code for selenium.webdriver.support.wait

< Raises: ------- TimeoutException - - If 'method' does not return a truthy value within the WebDriverWait - object's timeout + - If 'method' does not return a truthy value within the WebDriverWait + object's timeout Example: -------- @@ -163,9 +323,9 @@

Source code for selenium.webdriver.support.wait

< # Wait until an element is visible on the page >>> wait = WebDriverWait(driver, 10) - >>> element = wait.until(EC.visibility_of_element_located((By.ID, "exampleId"))) + >>> element = wait.until(EC.visibility_of_element_located((By.ID, "exampleId"))) >>> print(element.text) - """ + """ screen = None stacktrace = None @@ -176,21 +336,24 @@

Source code for selenium.webdriver.support.wait

< if value: return value except self._ignored_exceptions as exc: - screen = getattr(exc, "screen", None) - stacktrace = getattr(exc, "stacktrace", None) + screen = getattr(exc, "screen", None) + stacktrace = getattr(exc, "stacktrace", None) if time.monotonic() > end_time: break time.sleep(self._poll) raise TimeoutException(message, screen, stacktrace)
-
[docs] def until_not(self, method: Callable[[D], T], message: str = "") -> Union[T, Literal[True]]: - """Wait until the method returns a value that is not False. + +
+[docs] + def until_not(self, method: Callable[[D], T], message: str = "") -> Union[T, Literal[True]]: + """Wait until the method returns a value that is not False. Calls the method provided with the driver as an argument until the return value does not evaluate to ``False``. Parameters: - ---------- + ----------- method: callable(WebDriver) - A callable object that takes a WebDriver instance as an argument. @@ -205,8 +368,8 @@

Source code for selenium.webdriver.support.wait

< Raises: ------- TimeoutException - - If 'method' does not return False within the WebDriverWait - object's timeout + - If 'method' does not return False within the WebDriverWait + object's timeout Example: -------- @@ -217,8 +380,8 @@

Source code for selenium.webdriver.support.wait

< # Wait until an element is visible on the page >>> wait = WebDriverWait(driver, 10) >>> is_disappeared = wait.until_not(EC.visibility_of_element_located( - ... (By.ID, "exampleId"))) - """ + ... (By.ID, "exampleId"))) + """ end_time = time.monotonic() + self._timeout while True: try: @@ -230,45 +393,37 @@

Source code for selenium.webdriver.support.wait

< if time.monotonic() > end_time: break time.sleep(self._poll) - raise TimeoutException(message)
+ raise TimeoutException(message)
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/webkitgtk/options.html b/docs/api/py/_modules/selenium/webdriver/webkitgtk/options.html index ca18c68bd20ed..4b04123935ac7 100644 --- a/docs/api/py/_modules/selenium/webdriver/webkitgtk/options.html +++ b/docs/api/py/_modules/selenium/webdriver/webkitgtk/options.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.webkitgtk.options — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.webkitgtk.options — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.webkitgtk.options

+  

Source code for selenium.webdriver.webkitgtk.options

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -57,100 +213,96 @@ 

Source code for selenium.webdriver.webkitgtk.options

from selenium.webdriver.common.options import ArgOptions -
[docs]class Options(ArgOptions): - KEY = "webkitgtk:browserOptions" +
+[docs] +class Options(ArgOptions): + KEY = "webkitgtk:browserOptions" def __init__(self) -> None: super().__init__() - self._binary_location = "" + self._binary_location = "" self._overlay_scrollbars_enabled = True @property def binary_location(self) -> str: - """:Returns: The location of the browser binary otherwise an empty - string.""" + """:Returns: The location of the browser binary otherwise an empty + string.""" return self._binary_location @binary_location.setter def binary_location(self, value: str) -> None: - """Allows you to set the browser binary to launch. + """Allows you to set the browser binary to launch. :Args: - value : path to the browser binary - """ + """ self._binary_location = value @property def overlay_scrollbars_enabled(self): - """:Returns: Whether overlay scrollbars should be enabled.""" + """:Returns: Whether overlay scrollbars should be enabled.""" return self._overlay_scrollbars_enabled @overlay_scrollbars_enabled.setter def overlay_scrollbars_enabled(self, value) -> None: - """Allows you to enable or disable overlay scrollbars. + """Allows you to enable or disable overlay scrollbars. :Args: - value : True or False - """ + """ self._overlay_scrollbars_enabled = value -
[docs] def to_capabilities(self): - """Creates a capabilities with all the options that have been set and - returns a dictionary with everything.""" +
+[docs] + def to_capabilities(self): + """Creates a capabilities with all the options that have been set and + returns a dictionary with everything.""" caps = self._caps browser_options = {} if self.binary_location: - browser_options["binary"] = self.binary_location + browser_options["binary"] = self.binary_location if self.arguments: - browser_options["args"] = self.arguments - browser_options["useOverlayScrollbars"] = self.overlay_scrollbars_enabled + browser_options["args"] = self.arguments + browser_options["useOverlayScrollbars"] = self.overlay_scrollbars_enabled caps[Options.KEY] = browser_options return caps
+ @property def default_capabilities(self): return DesiredCapabilities.WEBKITGTK.copy()
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/webkitgtk/service.html b/docs/api/py/_modules/selenium/webdriver/webkitgtk/service.html index 7701de39372ea..697241b05a52e 100644 --- a/docs/api/py/_modules/selenium/webdriver/webkitgtk/service.html +++ b/docs/api/py/_modules/selenium/webdriver/webkitgtk/service.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.webkitgtk.service — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.webkitgtk.service — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.webkitgtk.service

+  

Source code for selenium.webdriver.webkitgtk.service

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -60,11 +216,13 @@ 

Source code for selenium.webdriver.webkitgtk.service

from selenium.webdriver.common import service -DEFAULT_EXECUTABLE_PATH: str = shutil.which("WebKitWebDriver") +DEFAULT_EXECUTABLE_PATH: str = shutil.which("WebKitWebDriver") -
[docs]class Service(service.Service): - """A Service class that is responsible for the starting and stopping of +
+[docs] +class Service(service.Service): + """A Service class that is responsible for the starting and stopping of `WebKitWebDriver`. :param executable_path: install path of the WebKitWebDriver executable, defaults to the first `WebKitWebDriver` in `$PATH`. @@ -72,7 +230,7 @@

Source code for selenium.webdriver.webkitgtk.service

:param service_args: (Optional) List of args to be passed to the subprocess when launching the executable. :param log_output: (Optional) File path for the file to be opened and passed as the subprocess stdout/stderr handler. :param env: (Optional) Mapping of environment variables for the new process, defaults to `os.environ`. - """ + """ def __init__( self, @@ -86,9 +244,9 @@

Source code for selenium.webdriver.webkitgtk.service

) -> None: self.service_args = service_args or [] if log_path is not None: - warnings.warn("log_path is deprecated, use log_output instead", DeprecationWarning, stacklevel=2) - log_path = open(log_path, "wb") - log_output = open(log_output, "wb") if log_output else None + warnings.warn("log_path is deprecated, use log_output instead", DeprecationWarning, stacklevel=2) + log_path = open(log_path, "wb") + log_output = open(log_output, "wb") if log_output else None super().__init__( executable_path=executable_path, port=port, @@ -97,46 +255,40 @@

Source code for selenium.webdriver.webkitgtk.service

**kwargs, ) -
[docs] def command_line_args(self) -> List[str]: - return ["-p", f"{self.port}"] + self.service_args
+
+[docs] + def command_line_args(self) -> List[str]: + return ["-p", f"{self.port}"] + self.service_args
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/webkitgtk/webdriver.html b/docs/api/py/_modules/selenium/webdriver/webkitgtk/webdriver.html index 2550a272f7bf6..6a4f680e2e725 100644 --- a/docs/api/py/_modules/selenium/webdriver/webkitgtk/webdriver.html +++ b/docs/api/py/_modules/selenium/webdriver/webkitgtk/webdriver.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.webkitgtk.webdriver — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.webkitgtk.webdriver — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.webkitgtk.webdriver

+  

Source code for selenium.webdriver.webkitgtk.webdriver

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -62,22 +218,24 @@ 

Source code for selenium.webdriver.webkitgtk.webdriver

from .service import Service -
[docs]class WebDriver(RemoteWebDriver): - """Controls the WebKitGTKDriver and allows you to drive the browser.""" +
+[docs] +class WebDriver(RemoteWebDriver): + """Controls the WebKitGTKDriver and allows you to drive the browser.""" def __init__( self, options=None, service: Service = None, ): - """Creates a new instance of the WebKitGTK driver. + """Creates a new instance of the WebKitGTK driver. Starts the service and then creates new instance of WebKitGTK Driver. :Args: - options : an instance of WebKitGTKOptions - service : Service object for handling the browser driver if you need to pass extra details - """ + """ options = options if options else Options() self.service = service if service else Service() @@ -87,53 +245,47 @@

Source code for selenium.webdriver.webkitgtk.webdriver

super().__init__(command_executor=self.service.service_url, options=options) self._is_remote = False -
[docs] def quit(self): - """Closes the browser and shuts down the WebKitGTKDriver executable - that is started when starting the WebKitGTKDriver.""" +
+[docs] + def quit(self): + """Closes the browser and shuts down the WebKitGTKDriver executable + that is started when starting the WebKitGTKDriver.""" try: super().quit() except http_client.BadStatusLine: pass finally: - self.service.stop()
+ self.service.stop()
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/wpewebkit/options.html b/docs/api/py/_modules/selenium/webdriver/wpewebkit/options.html index 956d63e0640a9..1678dad20b156 100644 --- a/docs/api/py/_modules/selenium/webdriver/wpewebkit/options.html +++ b/docs/api/py/_modules/selenium/webdriver/wpewebkit/options.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.wpewebkit.options — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.wpewebkit.options — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.wpewebkit.options

+  

Source code for selenium.webdriver.wpewebkit.options

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -59,86 +215,82 @@ 

Source code for selenium.webdriver.wpewebkit.options

from selenium.webdriver.common.options import ArgOptions -
[docs]class Options(ArgOptions): - KEY = "wpe:browserOptions" +
+[docs] +class Options(ArgOptions): + KEY = "wpe:browserOptions" def __init__(self) -> None: super().__init__() - self._binary_location = "" + self._binary_location = "" @property def binary_location(self) -> str: - """Returns the location of the browser binary otherwise an empty - string.""" + """Returns the location of the browser binary otherwise an empty + string.""" return self._binary_location @binary_location.setter def binary_location(self, value: str) -> None: - """Allows you to set the browser binary to launch. + """Allows you to set the browser binary to launch. :Args: - value : path to the browser binary - """ + """ if not isinstance(value, str): raise TypeError(self.BINARY_LOCATION_ERROR) self._binary_location = value -
[docs] def to_capabilities(self): - """Creates a capabilities with all the options that have been set and - returns a dictionary with everything.""" +
+[docs] + def to_capabilities(self): + """Creates a capabilities with all the options that have been set and + returns a dictionary with everything.""" caps = self._caps browser_options = {} if self.binary_location: - browser_options["binary"] = self.binary_location + browser_options["binary"] = self.binary_location if self.arguments: - browser_options["args"] = self.arguments + browser_options["args"] = self.arguments caps[Options.KEY] = browser_options return caps
+ @property def default_capabilities(self) -> Dict[str, str]: return DesiredCapabilities.WPEWEBKIT.copy()
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/wpewebkit/service.html b/docs/api/py/_modules/selenium/webdriver/wpewebkit/service.html index ea6b4794ea605..f930b50e0dd77 100644 --- a/docs/api/py/_modules/selenium/webdriver/wpewebkit/service.html +++ b/docs/api/py/_modules/selenium/webdriver/wpewebkit/service.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.wpewebkit.service — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.wpewebkit.service — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.wpewebkit.service

+  

Source code for selenium.webdriver.wpewebkit.service

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -59,11 +215,13 @@ 

Source code for selenium.webdriver.wpewebkit.service

from selenium.webdriver.common import service -DEFAULT_EXECUTABLE_PATH = shutil.which("WPEWebDriver") +DEFAULT_EXECUTABLE_PATH = shutil.which("WPEWebDriver") -
[docs]class Service(service.Service): - """A Service class that is responsible for the starting and stopping of +
+[docs] +class Service(service.Service): + """A Service class that is responsible for the starting and stopping of `WPEWebDriver`. :param executable_path: install path of the WPEWebDriver executable, defaults to the first `WPEWebDriver` in `$PATH`. @@ -71,7 +229,7 @@

Source code for selenium.webdriver.wpewebkit.service

:param service_args: (Optional) List of args to be passed to the subprocess when launching the executable. :param log_output: (Optional) File path for the file to be opened and passed as the subprocess stdout/stderr handler. :param env: (Optional) Mapping of environment variables for the new process, defaults to `os.environ`. - """ + """ def __init__( self, @@ -91,46 +249,40 @@

Source code for selenium.webdriver.wpewebkit.service

**kwargs, ) -
[docs] def command_line_args(self) -> List[str]: - return ["-p", f"{self.port}"] + self.service_args
+
+[docs] + def command_line_args(self) -> List[str]: + return ["-p", f"{self.port}"] + self.service_args
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_modules/selenium/webdriver/wpewebkit/webdriver.html b/docs/api/py/_modules/selenium/webdriver/wpewebkit/webdriver.html index 44109cdda9d04..d59ed05109881 100644 --- a/docs/api/py/_modules/selenium/webdriver/wpewebkit/webdriver.html +++ b/docs/api/py/_modules/selenium/webdriver/wpewebkit/webdriver.html @@ -1,54 +1,210 @@ - + - selenium.webdriver.wpewebkit.webdriver — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selenium.webdriver.wpewebkit.webdriver — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+
+
+
+ + +
+
+
+ +
+
-

Source code for selenium.webdriver.wpewebkit.webdriver

+  

Source code for selenium.webdriver.wpewebkit.webdriver

 # Licensed to the Software Freedom Conservancy (SFC) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
 # regarding copyright ownership.  The SFC licenses this file
 # to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
+# "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
 #
 #   http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
@@ -62,22 +218,24 @@ 

Source code for selenium.webdriver.wpewebkit.webdriver

from .service import Service -
[docs]class WebDriver(RemoteWebDriver): - """Controls the WPEWebKitDriver and allows you to drive the browser.""" +
+[docs] +class WebDriver(RemoteWebDriver): + """Controls the WPEWebKitDriver and allows you to drive the browser.""" def __init__( self, options=None, service: Service = None, ): - """Creates a new instance of the WPEWebKit driver. + """Creates a new instance of the WPEWebKit driver. Starts the service and then creates new instance of WPEWebKit Driver. :Args: - options : an instance of ``WPEWebKitOptions`` - service : Service object for handling the browser driver if you need to pass extra details - """ + """ options = options if options else Options() self.service = service if service else Service() @@ -87,53 +245,47 @@

Source code for selenium.webdriver.wpewebkit.webdriver

super().__init__(command_executor=self.service.service_url, options=options) self._is_remote = False -
[docs] def quit(self): - """Closes the browser and shuts down the WPEWebKitDriver executable - that is started when starting the WPEWebKitDriver.""" +
+[docs] + def quit(self): + """Closes the browser and shuts down the WPEWebKitDriver executable + that is started when starting the WPEWebKitDriver.""" try: super().quit() except http_client.BadStatusLine: pass finally: - self.service.stop()
+ self.service.stop()
+
+
-
-
+
-
+
+ + + \ No newline at end of file diff --git a/docs/api/py/_sources/common/selenium.common.exceptions.rst.txt b/docs/api/py/_sources/common/selenium.common.exceptions.rst.txt index e8456ff36f090..d5075406a938c 100644 --- a/docs/api/py/_sources/common/selenium.common.exceptions.rst.txt +++ b/docs/api/py/_sources/common/selenium.common.exceptions.rst.txt @@ -4,19 +4,6 @@ selenium.common.exceptions .. automodule:: selenium.common.exceptions - - - - - - - - - - - - - .. rubric:: Exceptions .. autosummary:: @@ -55,8 +42,4 @@ selenium.common.exceptions UnexpectedTagNameException UnknownMethodException WebDriverException - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/index.rst.txt b/docs/api/py/_sources/index.rst.txt index 2133a11e05949..e29e108349845 100644 --- a/docs/api/py/_sources/index.rst.txt +++ b/docs/api/py/_sources/index.rst.txt @@ -14,12 +14,14 @@ The `selenium` package is used to automate web browser interaction from Python. +-----------------+--------------------------------------------------------------------------------------+ | **GitHub**: | https://github.com/SeleniumHQ/Selenium | +-----------------+--------------------------------------------------------------------------------------+ -| **PyPI**: | https://pypi.org/project/selenium/ | +| **PyPI**: | https://pypi.org/project/selenium | ++-----------------+--------------------------------------------------------------------------------------+ +| **API Docs**: | https://selenium.dev/selenium/docs/api/py/api.html | +-----------------+--------------------------------------------------------------------------------------+ | **IRC/Slack**: | `Selenium chat room `_ | +-----------------+--------------------------------------------------------------------------------------+ -Several browsers/drivers are supported (Firefox, Chrome, Internet Explorer), as well as the Remote protocol. +Several browsers/drivers are supported (Firefox, Chrome, Edge, Safari), as well as the Remote protocol. Supported Python Versions ========================= @@ -33,21 +35,22 @@ If you have `pip `_ on your system, you can simply install pip install -U selenium -Alternately, you can download the source distribution from `PyPI `, unarchive it, and run:: - - python -m pip install . - -Note: You may want to consider using `virtualenv `_ to create isolated Python environments. +You may want to consider using a `virtual environment `_ +to create isolated Python environments. Drivers ======= -Selenium requires a driver to interface with the chosen browser. Firefox, -for example, requires `geckodriver `_, which needs to be installed before the below examples can be run. Make sure it's in your `PATH`, e. g., place it in `/usr/bin` or `/usr/local/bin`. +Selenium requires a driver to interface with the chosen browser (chromedriver, edgedriver, geckodriver, etc). -Failure to observe this step will give you an error `selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.` +In older versions of Selenium, it was necessary to install and manage these drivers yourself. You had to make sure the driver +executable was available on your system `PATH`, or specified explicitly in code. Modern versions of Selenium handle browser and +driver installation for you with `Selenium Manager `_. You generally +don't have to worry about driver installation or configuration now that it's done for you when you instantiate a WebDriver. +Selenium Manager works with most supported platforms and browsers. If it doesn't meet your needs, you can still install and +specify browsers and drivers yourself. -Other supported browsers will have their own drivers available. Links to some of the more popular browser drivers follow. +Links to some of the more popular browser drivers: +--------------+-----------------------------------------------------------------------+ | **Chrome**: | https://chromedriver.chromium.org/downloads | @@ -62,59 +65,65 @@ Other supported browsers will have their own drivers available. Links to some of Example 0: ========== -* open a new Firefox browser -* load the page at the given URL +* launch a new Chrome browser +* load a web page +* close the browser .. code-block:: python from selenium import webdriver - browser = webdriver.Firefox() - browser.get('http://selenium.dev/') + + driver = webdriver.Chrome() + driver.get('https://selenium.dev/') + driver.quit() Example 1: ========== -* open a new Firefox browser -* load the Yahoo homepage -* search for "seleniumhq" +* launch a new Chrome browser +* load the Selenium documentation page +* find the "Webdriver" link +* click the "WebDriver" link * close the browser .. code-block:: python from selenium import webdriver from selenium.webdriver.common.by import By - from selenium.webdriver.common.keys import Keys - browser = webdriver.Firefox() - browser.get('http://www.yahoo.com') - assert 'Yahoo' in browser.title + driver = webdriver.Chrome() + + driver.get('https://selenium.dev/documentation') + assert 'Selenium' in driver.title - elem = browser.find_element(By.NAME, 'p') # Find the search box - elem.send_keys('seleniumhq' + Keys.RETURN) + elem = driver.find_element(By.ID, 'm-documentationwebdriver') + elem.click() + assert 'WebDriver' in driver.title - browser.quit() + driver.quit() Example 2: ========== -Selenium WebDriver is often used as a basis for testing web applications. Here is a simple example using Python's standard `unittest `_ library: +Selenium WebDriver is often used as a basis for testing web applications. Here is a simple example using Python's standard `unittest `_ library: .. code-block:: python import unittest from selenium import webdriver + class GoogleTestCase(unittest.TestCase): def setUp(self): - self.browser = webdriver.Firefox() - self.addCleanup(self.browser.quit) + self.driver = webdriver.Firefox() + self.addCleanup(self.driver.quit) def test_page_title(self): - self.browser.get('http://www.google.com') - self.assertIn('Google', self.browser.title) + self.driver.get('https://www.google.com') + self.assertIn('Google', self.driver.title) if __name__ == '__main__': unittest.main(verbosity=2) @@ -143,9 +152,9 @@ Contributing - Create a branch for your work - Ensure `tox` is installed (using a `virtualenv` is recommended) - - `python3.8 -m venv .venv && . .venv/bin/activate && pip install tox` + - Run: `python -m venv venv && source venv/bin/activate && pip install tox` - After making changes, before committing execute `tox -e linting` - - If tox exits `0`, commit and push otherwise fix the newly introduced breakages. + - If tox exits `0`, commit and push. Otherwise fix the newly introduced style violations. - `flake8` requires manual fixes - - `black` will often rewrite the breakages automatically, however the files are unstaged and should staged again. - - `isort` will often rewrite the breakages automatically, however the files are unstaged and should staged again. + - `black` will rewrite the violations automatically, however the files are unstaged and should staged again. + - `isort` will rewrite the violations automatically, however the files are unstaged and should staged again. diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.action_chains.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.action_chains.rst.txt index 8535d1512c97b..cae140b36dbf3 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.action_chains.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.action_chains.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.common.action\_chains .. automodule:: selenium.webdriver.common.action_chains - - - - - - - - - .. rubric:: Classes .. autosummary:: ActionChains - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.action_builder.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.action_builder.rst.txt index 561bd4b491a85..97fc0f346e253 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.action_builder.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.action_builder.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.common.actions.action\_builder .. automodule:: selenium.webdriver.common.actions.action_builder - - - - - - - - - .. rubric:: Classes .. autosummary:: ActionBuilder - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.input_device.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.input_device.rst.txt index d412f70bbc58f..6abcca14760d3 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.input_device.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.input_device.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.common.actions.input\_device .. automodule:: selenium.webdriver.common.actions.input_device - - - - - - - - - .. rubric:: Classes .. autosummary:: InputDevice - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.interaction.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.interaction.rst.txt index 60b05c4c6a7f7..df48964610669 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.interaction.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.interaction.rst.txt @@ -4,27 +4,10 @@ selenium.webdriver.common.actions.interaction .. automodule:: selenium.webdriver.common.actions.interaction - - - - - - - - - .. rubric:: Classes .. autosummary:: Interaction Pause - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.key_actions.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.key_actions.rst.txt index f87ee6b933177..0f9b6efe14eb0 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.key_actions.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.key_actions.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.common.actions.key\_actions .. automodule:: selenium.webdriver.common.actions.key_actions - - - - - - - - - .. rubric:: Classes .. autosummary:: KeyActions - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.key_input.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.key_input.rst.txt index a951d76ab89b6..fe297b5bdfb4a 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.key_input.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.key_input.rst.txt @@ -4,27 +4,10 @@ selenium.webdriver.common.actions.key\_input .. automodule:: selenium.webdriver.common.actions.key_input - - - - - - - - - .. rubric:: Classes .. autosummary:: KeyInput TypingInteraction - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.mouse_button.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.mouse_button.rst.txt index ac97ade46a5b2..f1c413d9c256e 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.mouse_button.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.mouse_button.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.common.actions.mouse\_button .. automodule:: selenium.webdriver.common.actions.mouse_button - - - - - - - - - .. rubric:: Classes .. autosummary:: MouseButton - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.pointer_actions.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.pointer_actions.rst.txt index 955b4661feaa2..3db524c4c4bbc 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.pointer_actions.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.pointer_actions.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.common.actions.pointer\_actions .. automodule:: selenium.webdriver.common.actions.pointer_actions - - - - - - - - - .. rubric:: Classes .. autosummary:: PointerActions - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.pointer_input.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.pointer_input.rst.txt index 4ba365486099c..dd585ba9ff865 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.pointer_input.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.pointer_input.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.common.actions.pointer\_input .. automodule:: selenium.webdriver.common.actions.pointer_input - - - - - - - - - .. rubric:: Classes .. autosummary:: PointerInput - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.wheel_actions.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.wheel_actions.rst.txt index 0d760ed9cce53..6ccc483debb36 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.wheel_actions.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.wheel_actions.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.common.actions.wheel\_actions .. automodule:: selenium.webdriver.common.actions.wheel_actions - - - - - - - - - .. rubric:: Classes .. autosummary:: WheelActions - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.wheel_input.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.wheel_input.rst.txt index 0694cb992b6b9..7aed1206f3ee1 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.wheel_input.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.actions.wheel_input.rst.txt @@ -4,27 +4,10 @@ selenium.webdriver.common.actions.wheel\_input .. automodule:: selenium.webdriver.common.actions.wheel_input - - - - - - - - - .. rubric:: Classes .. autosummary:: ScrollOrigin WheelInput - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.alert.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.alert.rst.txt index afb8083b6b4c4..657baa76d3e5c 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.alert.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.alert.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.common.alert .. automodule:: selenium.webdriver.common.alert - - - - - - - - - .. rubric:: Classes .. autosummary:: Alert - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.bidi.cdp.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.bidi.cdp.rst.txt index c71aa6f95aa55..cd5dd3b88ac51 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.bidi.cdp.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.bidi.cdp.rst.txt @@ -4,11 +4,6 @@ selenium.webdriver.common.bidi.cdp .. automodule:: selenium.webdriver.common.bidi.cdp - - - - - .. rubric:: Functions .. autosummary:: @@ -23,10 +18,6 @@ selenium.webdriver.common.bidi.cdp set_global_connection set_global_session - - - - .. rubric:: Classes .. autosummary:: @@ -36,10 +27,6 @@ selenium.webdriver.common.bidi.cdp CdpSession CmEventProxy - - - - .. rubric:: Exceptions .. autosummary:: @@ -47,8 +34,4 @@ selenium.webdriver.common.bidi.cdp BrowserError CdpConnectionClosed InternalError - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.bidi.console.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.bidi.console.rst.txt index dd0ed5bca0af8..71217990be91d 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.bidi.console.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.bidi.console.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.common.bidi.console .. automodule:: selenium.webdriver.common.bidi.console - - - - - - - - - .. rubric:: Classes .. autosummary:: Console - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.bidi.script.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.bidi.script.rst.txt index 1bfd13e676dbf..3f64daa65a428 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.bidi.script.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.bidi.script.rst.txt @@ -4,15 +4,6 @@ selenium.webdriver.common.bidi.script .. automodule:: selenium.webdriver.common.bidi.script - - - - - - - - - .. rubric:: Classes .. autosummary:: @@ -21,12 +12,4 @@ selenium.webdriver.common.bidi.script JavaScriptLogEntry LogEntryAdded Script - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.bidi.session.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.bidi.session.rst.txt index 4b9be78d1a341..51117189705a9 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.bidi.session.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.bidi.session.rst.txt @@ -4,27 +4,10 @@ selenium.webdriver.common.bidi.session .. automodule:: selenium.webdriver.common.bidi.session - - - - - .. rubric:: Functions .. autosummary:: session_subscribe session_unsubscribe - - - - - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.by.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.by.rst.txt index aec48babce992..dd201d4fca49d 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.by.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.by.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.common.by .. automodule:: selenium.webdriver.common.by - - - - - - - - - .. rubric:: Classes .. autosummary:: By - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.desired_capabilities.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.desired_capabilities.rst.txt index 3a418c1515be2..12276e3eaab3e 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.desired_capabilities.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.desired_capabilities.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.common.desired\_capabilities .. automodule:: selenium.webdriver.common.desired_capabilities - - - - - - - - - .. rubric:: Classes .. autosummary:: DesiredCapabilities - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.driver_finder.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.driver_finder.rst.txt index 66b71bc4209e3..a4b6017313fc1 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.driver_finder.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.driver_finder.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.common.driver\_finder .. automodule:: selenium.webdriver.common.driver_finder - - - - - - - - - .. rubric:: Classes .. autosummary:: DriverFinder - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.keys.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.keys.rst.txt index d645b18372ca3..5d07df80607b0 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.keys.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.keys.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.common.keys .. automodule:: selenium.webdriver.common.keys - - - - - - - - - .. rubric:: Classes .. autosummary:: Keys - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.log.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.log.rst.txt index 63ce857cf0823..4debf604cc550 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.log.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.log.rst.txt @@ -4,32 +4,15 @@ selenium.webdriver.common.log .. automodule:: selenium.webdriver.common.log - - - - - .. rubric:: Functions .. autosummary:: import_cdp - - - - .. rubric:: Classes .. autosummary:: Log - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.options.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.options.rst.txt index b672fce952841..fd432045f55d8 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.options.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.options.rst.txt @@ -4,15 +4,6 @@ selenium.webdriver.common.options .. automodule:: selenium.webdriver.common.options - - - - - - - - - .. rubric:: Classes .. autosummary:: @@ -20,12 +11,4 @@ selenium.webdriver.common.options ArgOptions BaseOptions PageLoadStrategy - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.print_page_options.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.print_page_options.rst.txt index d3ccb00db56d7..b78ad2246a2ac 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.print_page_options.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.print_page_options.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.common.print\_page\_options .. automodule:: selenium.webdriver.common.print_page_options - - - - - - - - - .. rubric:: Classes .. autosummary:: PrintOptions - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.proxy.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.proxy.rst.txt index f1e5fc298a955..556cb39993c84 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.proxy.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.proxy.rst.txt @@ -4,15 +4,6 @@ selenium.webdriver.common.proxy .. automodule:: selenium.webdriver.common.proxy - - - - - - - - - .. rubric:: Classes .. autosummary:: @@ -20,12 +11,4 @@ selenium.webdriver.common.proxy Proxy ProxyType ProxyTypeFactory - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.selenium_manager.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.selenium_manager.rst.txt index 73f2cfa41f282..3a948f731325b 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.selenium_manager.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.selenium_manager.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.common.selenium\_manager .. automodule:: selenium.webdriver.common.selenium_manager - - - - - - - - - .. rubric:: Classes .. autosummary:: SeleniumManager - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.service.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.service.rst.txt index e4682c3ead6d4..08920b1cc27cc 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.service.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.service.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.common.service .. automodule:: selenium.webdriver.common.service - - - - - - - - - .. rubric:: Classes .. autosummary:: Service - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.timeouts.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.timeouts.rst.txt index 271ea93884ea5..36a746b5efebb 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.timeouts.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.timeouts.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.common.timeouts .. automodule:: selenium.webdriver.common.timeouts - - - - - - - - - .. rubric:: Classes .. autosummary:: Timeouts - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.utils.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.utils.rst.txt index bea8bba685a14..0142d6da55cca 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.utils.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.utils.rst.txt @@ -4,11 +4,6 @@ selenium.webdriver.common.utils .. automodule:: selenium.webdriver.common.utils - - - - - .. rubric:: Functions .. autosummary:: @@ -19,16 +14,4 @@ selenium.webdriver.common.utils is_url_connectable join_host_port keys_to_typing - - - - - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.virtual_authenticator.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.virtual_authenticator.rst.txt index a54bec0fd3405..1af862bc49219 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.virtual_authenticator.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.virtual_authenticator.rst.txt @@ -4,11 +4,6 @@ selenium.webdriver.common.virtual\_authenticator .. automodule:: selenium.webdriver.common.virtual_authenticator - - - - - .. rubric:: Functions .. autosummary:: @@ -16,10 +11,6 @@ selenium.webdriver.common.virtual\_authenticator required_chromium_based_browser required_virtual_authenticator - - - - .. rubric:: Classes .. autosummary:: @@ -28,12 +19,4 @@ selenium.webdriver.common.virtual\_authenticator Protocol Transport VirtualAuthenticatorOptions - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver/selenium.webdriver.common.window.rst.txt b/docs/api/py/_sources/webdriver/selenium.webdriver.common.window.rst.txt index 8a8ffcf6f5c1b..fbc829c247e75 100644 --- a/docs/api/py/_sources/webdriver/selenium.webdriver.common.window.rst.txt +++ b/docs/api/py/_sources/webdriver/selenium.webdriver.common.window.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.common.window .. automodule:: selenium.webdriver.common.window - - - - - - - - - .. rubric:: Classes .. autosummary:: WindowTypes - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_chrome/selenium.webdriver.chrome.options.rst.txt b/docs/api/py/_sources/webdriver_chrome/selenium.webdriver.chrome.options.rst.txt index cdaad4a8e912a..52906338c215a 100644 --- a/docs/api/py/_sources/webdriver_chrome/selenium.webdriver.chrome.options.rst.txt +++ b/docs/api/py/_sources/webdriver_chrome/selenium.webdriver.chrome.options.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.chrome.options .. automodule:: selenium.webdriver.chrome.options - - - - - - - - - .. rubric:: Classes .. autosummary:: Options - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_chrome/selenium.webdriver.chrome.remote_connection.rst.txt b/docs/api/py/_sources/webdriver_chrome/selenium.webdriver.chrome.remote_connection.rst.txt index 4f9770adc3116..943a7cfcec80f 100644 --- a/docs/api/py/_sources/webdriver_chrome/selenium.webdriver.chrome.remote_connection.rst.txt +++ b/docs/api/py/_sources/webdriver_chrome/selenium.webdriver.chrome.remote_connection.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.chrome.remote\_connection .. automodule:: selenium.webdriver.chrome.remote_connection - - - - - - - - - .. rubric:: Classes .. autosummary:: ChromeRemoteConnection - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_chrome/selenium.webdriver.chrome.service.rst.txt b/docs/api/py/_sources/webdriver_chrome/selenium.webdriver.chrome.service.rst.txt index b5cb2b64873ec..244b8258a82a9 100644 --- a/docs/api/py/_sources/webdriver_chrome/selenium.webdriver.chrome.service.rst.txt +++ b/docs/api/py/_sources/webdriver_chrome/selenium.webdriver.chrome.service.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.chrome.service .. automodule:: selenium.webdriver.chrome.service - - - - - - - - - .. rubric:: Classes .. autosummary:: Service - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_chrome/selenium.webdriver.chrome.webdriver.rst.txt b/docs/api/py/_sources/webdriver_chrome/selenium.webdriver.chrome.webdriver.rst.txt index c938e55b2f818..848f794fae3c4 100644 --- a/docs/api/py/_sources/webdriver_chrome/selenium.webdriver.chrome.webdriver.rst.txt +++ b/docs/api/py/_sources/webdriver_chrome/selenium.webdriver.chrome.webdriver.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.chrome.webdriver .. automodule:: selenium.webdriver.chrome.webdriver - - - - - - - - - .. rubric:: Classes .. autosummary:: WebDriver - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_chromium/selenium.webdriver.chromium.options.rst.txt b/docs/api/py/_sources/webdriver_chromium/selenium.webdriver.chromium.options.rst.txt index 058d37695dca5..4a991d85394f6 100644 --- a/docs/api/py/_sources/webdriver_chromium/selenium.webdriver.chromium.options.rst.txt +++ b/docs/api/py/_sources/webdriver_chromium/selenium.webdriver.chromium.options.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.chromium.options .. automodule:: selenium.webdriver.chromium.options - - - - - - - - - .. rubric:: Classes .. autosummary:: ChromiumOptions - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_chromium/selenium.webdriver.chromium.remote_connection.rst.txt b/docs/api/py/_sources/webdriver_chromium/selenium.webdriver.chromium.remote_connection.rst.txt index 3e902cc867f91..d3ee83ecffbee 100644 --- a/docs/api/py/_sources/webdriver_chromium/selenium.webdriver.chromium.remote_connection.rst.txt +++ b/docs/api/py/_sources/webdriver_chromium/selenium.webdriver.chromium.remote_connection.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.chromium.remote\_connection .. automodule:: selenium.webdriver.chromium.remote_connection - - - - - - - - - .. rubric:: Classes .. autosummary:: ChromiumRemoteConnection - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_chromium/selenium.webdriver.chromium.service.rst.txt b/docs/api/py/_sources/webdriver_chromium/selenium.webdriver.chromium.service.rst.txt index 106300eaf0899..6edb716130664 100644 --- a/docs/api/py/_sources/webdriver_chromium/selenium.webdriver.chromium.service.rst.txt +++ b/docs/api/py/_sources/webdriver_chromium/selenium.webdriver.chromium.service.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.chromium.service .. automodule:: selenium.webdriver.chromium.service - - - - - - - - - .. rubric:: Classes .. autosummary:: ChromiumService - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_chromium/selenium.webdriver.chromium.webdriver.rst.txt b/docs/api/py/_sources/webdriver_chromium/selenium.webdriver.chromium.webdriver.rst.txt index b2097a3985e99..755796555385c 100644 --- a/docs/api/py/_sources/webdriver_chromium/selenium.webdriver.chromium.webdriver.rst.txt +++ b/docs/api/py/_sources/webdriver_chromium/selenium.webdriver.chromium.webdriver.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.chromium.webdriver .. automodule:: selenium.webdriver.chromium.webdriver - - - - - - - - - .. rubric:: Classes .. autosummary:: ChromiumDriver - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_edge/selenium.webdriver.edge.options.rst.txt b/docs/api/py/_sources/webdriver_edge/selenium.webdriver.edge.options.rst.txt index 5d73fb7d6040f..8bf58ef412ca7 100644 --- a/docs/api/py/_sources/webdriver_edge/selenium.webdriver.edge.options.rst.txt +++ b/docs/api/py/_sources/webdriver_edge/selenium.webdriver.edge.options.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.edge.options .. automodule:: selenium.webdriver.edge.options - - - - - - - - - .. rubric:: Classes .. autosummary:: Options - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_edge/selenium.webdriver.edge.remote_connection.rst.txt b/docs/api/py/_sources/webdriver_edge/selenium.webdriver.edge.remote_connection.rst.txt index 4b1e6f2a78466..09fd931b926bb 100644 --- a/docs/api/py/_sources/webdriver_edge/selenium.webdriver.edge.remote_connection.rst.txt +++ b/docs/api/py/_sources/webdriver_edge/selenium.webdriver.edge.remote_connection.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.edge.remote\_connection .. automodule:: selenium.webdriver.edge.remote_connection - - - - - - - - - .. rubric:: Classes .. autosummary:: EdgeRemoteConnection - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_edge/selenium.webdriver.edge.service.rst.txt b/docs/api/py/_sources/webdriver_edge/selenium.webdriver.edge.service.rst.txt index d1a0c8b02fd19..1453f44606ce4 100644 --- a/docs/api/py/_sources/webdriver_edge/selenium.webdriver.edge.service.rst.txt +++ b/docs/api/py/_sources/webdriver_edge/selenium.webdriver.edge.service.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.edge.service .. automodule:: selenium.webdriver.edge.service - - - - - - - - - .. rubric:: Classes .. autosummary:: Service - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_edge/selenium.webdriver.edge.webdriver.rst.txt b/docs/api/py/_sources/webdriver_edge/selenium.webdriver.edge.webdriver.rst.txt index ea465c3cab11d..436847d255832 100644 --- a/docs/api/py/_sources/webdriver_edge/selenium.webdriver.edge.webdriver.rst.txt +++ b/docs/api/py/_sources/webdriver_edge/selenium.webdriver.edge.webdriver.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.edge.webdriver .. automodule:: selenium.webdriver.edge.webdriver - - - - - - - - - .. rubric:: Classes .. autosummary:: WebDriver - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.firefox_binary.rst.txt b/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.firefox_binary.rst.txt index 7d8ddb926279c..6532641fabb07 100644 --- a/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.firefox_binary.rst.txt +++ b/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.firefox_binary.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.firefox.firefox\_binary .. automodule:: selenium.webdriver.firefox.firefox_binary - - - - - - - - - .. rubric:: Classes .. autosummary:: FirefoxBinary - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.firefox_profile.rst.txt b/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.firefox_profile.rst.txt index 9bc44bb4ecb30..35eb657c9db2d 100644 --- a/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.firefox_profile.rst.txt +++ b/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.firefox_profile.rst.txt @@ -4,32 +4,15 @@ selenium.webdriver.firefox.firefox\_profile .. automodule:: selenium.webdriver.firefox.firefox_profile - - - - - - - - - .. rubric:: Classes .. autosummary:: FirefoxProfile - - - - .. rubric:: Exceptions .. autosummary:: AddonFormatError - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.options.rst.txt b/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.options.rst.txt index 5fb78ddc68a3b..abc44d31eac3a 100644 --- a/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.options.rst.txt +++ b/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.options.rst.txt @@ -4,27 +4,10 @@ selenium.webdriver.firefox.options .. automodule:: selenium.webdriver.firefox.options - - - - - - - - - .. rubric:: Classes .. autosummary:: Log Options - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.remote_connection.rst.txt b/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.remote_connection.rst.txt index 96653a24760e6..86f7693a5e42b 100644 --- a/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.remote_connection.rst.txt +++ b/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.remote_connection.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.firefox.remote\_connection .. automodule:: selenium.webdriver.firefox.remote_connection - - - - - - - - - .. rubric:: Classes .. autosummary:: FirefoxRemoteConnection - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.service.rst.txt b/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.service.rst.txt index 15d8ab06c7fd8..3b672bd95f63e 100644 --- a/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.service.rst.txt +++ b/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.service.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.firefox.service .. automodule:: selenium.webdriver.firefox.service - - - - - - - - - .. rubric:: Classes .. autosummary:: Service - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.webdriver.rst.txt b/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.webdriver.rst.txt index 418f187bd11c1..2d1de2473b6fe 100644 --- a/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.webdriver.rst.txt +++ b/docs/api/py/_sources/webdriver_firefox/selenium.webdriver.firefox.webdriver.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.firefox.webdriver .. automodule:: selenium.webdriver.firefox.webdriver - - - - - - - - - .. rubric:: Classes .. autosummary:: WebDriver - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_ie/selenium.webdriver.ie.options.rst.txt b/docs/api/py/_sources/webdriver_ie/selenium.webdriver.ie.options.rst.txt index b3fae9c7086a6..4d96a49f2b2eb 100644 --- a/docs/api/py/_sources/webdriver_ie/selenium.webdriver.ie.options.rst.txt +++ b/docs/api/py/_sources/webdriver_ie/selenium.webdriver.ie.options.rst.txt @@ -4,27 +4,10 @@ selenium.webdriver.ie.options .. automodule:: selenium.webdriver.ie.options - - - - - - - - - .. rubric:: Classes .. autosummary:: ElementScrollBehavior Options - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_ie/selenium.webdriver.ie.service.rst.txt b/docs/api/py/_sources/webdriver_ie/selenium.webdriver.ie.service.rst.txt index 0c371eee22f17..364d13c4c1bb8 100644 --- a/docs/api/py/_sources/webdriver_ie/selenium.webdriver.ie.service.rst.txt +++ b/docs/api/py/_sources/webdriver_ie/selenium.webdriver.ie.service.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.ie.service .. automodule:: selenium.webdriver.ie.service - - - - - - - - - .. rubric:: Classes .. autosummary:: Service - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_ie/selenium.webdriver.ie.webdriver.rst.txt b/docs/api/py/_sources/webdriver_ie/selenium.webdriver.ie.webdriver.rst.txt index 55d53616c1aab..717e1b52d796a 100644 --- a/docs/api/py/_sources/webdriver_ie/selenium.webdriver.ie.webdriver.rst.txt +++ b/docs/api/py/_sources/webdriver_ie/selenium.webdriver.ie.webdriver.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.ie.webdriver .. automodule:: selenium.webdriver.ie.webdriver - - - - - - - - - .. rubric:: Classes .. autosummary:: WebDriver - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.bidi_connection.rst.txt b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.bidi_connection.rst.txt index 38c8b1f96c681..407f844f2679b 100644 --- a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.bidi_connection.rst.txt +++ b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.bidi_connection.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.remote.bidi\_connection .. automodule:: selenium.webdriver.remote.bidi_connection - - - - - - - - - .. rubric:: Classes .. autosummary:: BidiConnection - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.command.rst.txt b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.command.rst.txt index 1c63917e2d57f..645cbde2bfdf9 100644 --- a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.command.rst.txt +++ b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.command.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.remote.command .. automodule:: selenium.webdriver.remote.command - - - - - - - - - .. rubric:: Classes .. autosummary:: Command - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.errorhandler.rst.txt b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.errorhandler.rst.txt index 4399711516f69..ccdf55057bfaa 100644 --- a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.errorhandler.rst.txt +++ b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.errorhandler.rst.txt @@ -4,15 +4,6 @@ selenium.webdriver.remote.errorhandler .. automodule:: selenium.webdriver.remote.errorhandler - - - - - - - - - .. rubric:: Classes .. autosummary:: @@ -20,12 +11,4 @@ selenium.webdriver.remote.errorhandler ErrorCode ErrorHandler ExceptionMapping - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.file_detector.rst.txt b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.file_detector.rst.txt index 104ea5e332b8b..68cbc07b57f72 100644 --- a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.file_detector.rst.txt +++ b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.file_detector.rst.txt @@ -4,15 +4,6 @@ selenium.webdriver.remote.file\_detector .. automodule:: selenium.webdriver.remote.file_detector - - - - - - - - - .. rubric:: Classes .. autosummary:: @@ -20,12 +11,4 @@ selenium.webdriver.remote.file\_detector FileDetector LocalFileDetector UselessFileDetector - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.mobile.rst.txt b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.mobile.rst.txt index b7c6a4fb94853..6fe489918556e 100644 --- a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.mobile.rst.txt +++ b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.mobile.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.remote.mobile .. automodule:: selenium.webdriver.remote.mobile - - - - - - - - - .. rubric:: Classes .. autosummary:: Mobile - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.remote_connection.rst.txt b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.remote_connection.rst.txt index 489f72f67ef66..e577e184a6715 100644 --- a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.remote_connection.rst.txt +++ b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.remote_connection.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.remote.remote\_connection .. automodule:: selenium.webdriver.remote.remote_connection - - - - - - - - - .. rubric:: Classes .. autosummary:: RemoteConnection - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.script_key.rst.txt b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.script_key.rst.txt index 71875d9d4b1b5..5cf60946915ac 100644 --- a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.script_key.rst.txt +++ b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.script_key.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.remote.script\_key .. automodule:: selenium.webdriver.remote.script_key - - - - - - - - - .. rubric:: Classes .. autosummary:: ScriptKey - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.shadowroot.rst.txt b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.shadowroot.rst.txt index e14e0d101137a..5a1cec74b5a2d 100644 --- a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.shadowroot.rst.txt +++ b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.shadowroot.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.remote.shadowroot .. automodule:: selenium.webdriver.remote.shadowroot - - - - - - - - - .. rubric:: Classes .. autosummary:: ShadowRoot - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.switch_to.rst.txt b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.switch_to.rst.txt index ada6edf64a0e0..0eeb82d18b7c4 100644 --- a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.switch_to.rst.txt +++ b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.switch_to.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.remote.switch\_to .. automodule:: selenium.webdriver.remote.switch_to - - - - - - - - - .. rubric:: Classes .. autosummary:: SwitchTo - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.utils.rst.txt b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.utils.rst.txt index b5cb8704fbde4..e72fbcba60122 100644 --- a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.utils.rst.txt +++ b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.utils.rst.txt @@ -4,27 +4,10 @@ selenium.webdriver.remote.utils .. automodule:: selenium.webdriver.remote.utils - - - - - .. rubric:: Functions .. autosummary:: dump_json load_json - - - - - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.webdriver.rst.txt b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.webdriver.rst.txt index c3d0f79478ccc..b41707054e7fa 100644 --- a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.webdriver.rst.txt +++ b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.webdriver.rst.txt @@ -4,11 +4,6 @@ selenium.webdriver.remote.webdriver .. automodule:: selenium.webdriver.remote.webdriver - - - - - .. rubric:: Functions .. autosummary:: @@ -17,22 +12,10 @@ selenium.webdriver.remote.webdriver get_remote_connection import_cdp - - - - .. rubric:: Classes .. autosummary:: BaseWebDriver WebDriver - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.webelement.rst.txt b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.webelement.rst.txt index 00edfcf3f66d2..030d86510533a 100644 --- a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.webelement.rst.txt +++ b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.webelement.rst.txt @@ -4,27 +4,10 @@ selenium.webdriver.remote.webelement .. automodule:: selenium.webdriver.remote.webelement - - - - - - - - - .. rubric:: Classes .. autosummary:: BaseWebElement WebElement - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.websocket_connection.rst.txt b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.websocket_connection.rst.txt index 58332dd69f6b3..de73682a1cfb6 100644 --- a/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.websocket_connection.rst.txt +++ b/docs/api/py/_sources/webdriver_remote/selenium.webdriver.remote.websocket_connection.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.remote.websocket\_connection .. automodule:: selenium.webdriver.remote.websocket_connection - - - - - - - - - .. rubric:: Classes .. autosummary:: WebSocketConnection - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.options.rst.txt b/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.options.rst.txt index a529e645a30df..b346e9a080e83 100644 --- a/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.options.rst.txt +++ b/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.options.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.safari.options .. automodule:: selenium.webdriver.safari.options - - - - - - - - - .. rubric:: Classes .. autosummary:: Options - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.permissions.rst.txt b/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.permissions.rst.txt index ca3f4a8d69a6d..025e1afb86a7d 100644 --- a/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.permissions.rst.txt +++ b/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.permissions.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.safari.permissions .. automodule:: selenium.webdriver.safari.permissions - - - - - - - - - .. rubric:: Classes .. autosummary:: Permission - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.remote_connection.rst.txt b/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.remote_connection.rst.txt index a3250b4c671c5..e164129c6fdeb 100644 --- a/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.remote_connection.rst.txt +++ b/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.remote_connection.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.safari.remote\_connection .. automodule:: selenium.webdriver.safari.remote_connection - - - - - - - - - .. rubric:: Classes .. autosummary:: SafariRemoteConnection - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.service.rst.txt b/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.service.rst.txt index 4030a3b8c5835..06ddf9362daf1 100644 --- a/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.service.rst.txt +++ b/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.service.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.safari.service .. automodule:: selenium.webdriver.safari.service - - - - - - - - - .. rubric:: Classes .. autosummary:: Service - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.webdriver.rst.txt b/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.webdriver.rst.txt index 6002684f5e038..f71c9c2ad6578 100644 --- a/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.webdriver.rst.txt +++ b/docs/api/py/_sources/webdriver_safari/selenium.webdriver.safari.webdriver.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.safari.webdriver .. automodule:: selenium.webdriver.safari.webdriver - - - - - - - - - .. rubric:: Classes .. autosummary:: WebDriver - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.abstract_event_listener.rst.txt b/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.abstract_event_listener.rst.txt index bdb46e7a1e70c..43dd3263beb2e 100644 --- a/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.abstract_event_listener.rst.txt +++ b/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.abstract_event_listener.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.support.abstract\_event\_listener .. automodule:: selenium.webdriver.support.abstract_event_listener - - - - - - - - - .. rubric:: Classes .. autosummary:: AbstractEventListener - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.color.rst.txt b/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.color.rst.txt index 14239ffd60880..0d635b81f15b5 100644 --- a/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.color.rst.txt +++ b/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.color.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.support.color .. automodule:: selenium.webdriver.support.color - - - - - - - - - .. rubric:: Classes .. autosummary:: Color - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.event_firing_webdriver.rst.txt b/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.event_firing_webdriver.rst.txt index 88c6f5a8f9f86..e3a9ce02181e5 100644 --- a/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.event_firing_webdriver.rst.txt +++ b/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.event_firing_webdriver.rst.txt @@ -4,27 +4,10 @@ selenium.webdriver.support.event\_firing\_webdriver .. automodule:: selenium.webdriver.support.event_firing_webdriver - - - - - - - - - .. rubric:: Classes .. autosummary:: EventFiringWebDriver EventFiringWebElement - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.events.rst.txt b/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.events.rst.txt index 1a4e893bd55f9..28fccc823e16e 100644 --- a/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.events.rst.txt +++ b/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.events.rst.txt @@ -3,21 +3,4 @@ selenium.webdriver.support.events .. automodule:: selenium.webdriver.support.events - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.expected_conditions.rst.txt b/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.expected_conditions.rst.txt index b9e3585093386..74a46dc8de5fd 100644 --- a/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.expected_conditions.rst.txt +++ b/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.expected_conditions.rst.txt @@ -4,11 +4,6 @@ selenium.webdriver.support.expected\_conditions .. automodule:: selenium.webdriver.support.expected_conditions - - - - - .. rubric:: Functions .. autosummary:: @@ -44,16 +39,4 @@ selenium.webdriver.support.expected\_conditions visibility_of_all_elements_located visibility_of_any_elements_located visibility_of_element_located - - - - - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.relative_locator.rst.txt b/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.relative_locator.rst.txt index 6b5af25799a44..4c52de9d6a6b2 100644 --- a/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.relative_locator.rst.txt +++ b/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.relative_locator.rst.txt @@ -4,11 +4,6 @@ selenium.webdriver.support.relative\_locator .. automodule:: selenium.webdriver.support.relative_locator - - - - - .. rubric:: Functions .. autosummary:: @@ -16,21 +11,9 @@ selenium.webdriver.support.relative\_locator locate_with with_tag_name - - - - .. rubric:: Classes .. autosummary:: RelativeBy - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.select.rst.txt b/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.select.rst.txt index 2b65140b1745d..8f28b59083030 100644 --- a/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.select.rst.txt +++ b/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.select.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.support.select .. automodule:: selenium.webdriver.support.select - - - - - - - - - .. rubric:: Classes .. autosummary:: Select - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.ui.rst.txt b/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.ui.rst.txt index a38cf77595d73..3903042d54d0e 100644 --- a/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.ui.rst.txt +++ b/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.ui.rst.txt @@ -3,21 +3,4 @@ selenium.webdriver.support.ui .. automodule:: selenium.webdriver.support.ui - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.wait.rst.txt b/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.wait.rst.txt index 6ebf2db1e03da..605a72fc3fa33 100644 --- a/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.wait.rst.txt +++ b/docs/api/py/_sources/webdriver_support/selenium.webdriver.support.wait.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.support.wait .. automodule:: selenium.webdriver.support.wait - - - - - - - - - .. rubric:: Classes .. autosummary:: WebDriverWait - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_webkitgtk/selenium.webdriver.webkitgtk.options.rst.txt b/docs/api/py/_sources/webdriver_webkitgtk/selenium.webdriver.webkitgtk.options.rst.txt index 710a467a05a93..f835229312fc2 100644 --- a/docs/api/py/_sources/webdriver_webkitgtk/selenium.webdriver.webkitgtk.options.rst.txt +++ b/docs/api/py/_sources/webdriver_webkitgtk/selenium.webdriver.webkitgtk.options.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.webkitgtk.options .. automodule:: selenium.webdriver.webkitgtk.options - - - - - - - - - .. rubric:: Classes .. autosummary:: Options - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_webkitgtk/selenium.webdriver.webkitgtk.service.rst.txt b/docs/api/py/_sources/webdriver_webkitgtk/selenium.webdriver.webkitgtk.service.rst.txt index 02d666aa3bae3..41fba2724889c 100644 --- a/docs/api/py/_sources/webdriver_webkitgtk/selenium.webdriver.webkitgtk.service.rst.txt +++ b/docs/api/py/_sources/webdriver_webkitgtk/selenium.webdriver.webkitgtk.service.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.webkitgtk.service .. automodule:: selenium.webdriver.webkitgtk.service - - - - - - - - - .. rubric:: Classes .. autosummary:: Service - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_webkitgtk/selenium.webdriver.webkitgtk.webdriver.rst.txt b/docs/api/py/_sources/webdriver_webkitgtk/selenium.webdriver.webkitgtk.webdriver.rst.txt index 096cd62454dd1..94a02140d4ea0 100644 --- a/docs/api/py/_sources/webdriver_webkitgtk/selenium.webdriver.webkitgtk.webdriver.rst.txt +++ b/docs/api/py/_sources/webdriver_webkitgtk/selenium.webdriver.webkitgtk.webdriver.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.webkitgtk.webdriver .. automodule:: selenium.webdriver.webkitgtk.webdriver - - - - - - - - - .. rubric:: Classes .. autosummary:: WebDriver - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_wpewebkit/selenium.webdriver.wpewebkit.options.rst.txt b/docs/api/py/_sources/webdriver_wpewebkit/selenium.webdriver.wpewebkit.options.rst.txt index ed55667a19d64..8df5c1e0fd727 100644 --- a/docs/api/py/_sources/webdriver_wpewebkit/selenium.webdriver.wpewebkit.options.rst.txt +++ b/docs/api/py/_sources/webdriver_wpewebkit/selenium.webdriver.wpewebkit.options.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.wpewebkit.options .. automodule:: selenium.webdriver.wpewebkit.options - - - - - - - - - .. rubric:: Classes .. autosummary:: Options - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_wpewebkit/selenium.webdriver.wpewebkit.service.rst.txt b/docs/api/py/_sources/webdriver_wpewebkit/selenium.webdriver.wpewebkit.service.rst.txt index a394f33982bcf..cae48ae21de79 100644 --- a/docs/api/py/_sources/webdriver_wpewebkit/selenium.webdriver.wpewebkit.service.rst.txt +++ b/docs/api/py/_sources/webdriver_wpewebkit/selenium.webdriver.wpewebkit.service.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.wpewebkit.service .. automodule:: selenium.webdriver.wpewebkit.service - - - - - - - - - .. rubric:: Classes .. autosummary:: Service - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_sources/webdriver_wpewebkit/selenium.webdriver.wpewebkit.webdriver.rst.txt b/docs/api/py/_sources/webdriver_wpewebkit/selenium.webdriver.wpewebkit.webdriver.rst.txt index a5d9e286350ee..36d08474ebbc5 100644 --- a/docs/api/py/_sources/webdriver_wpewebkit/selenium.webdriver.wpewebkit.webdriver.rst.txt +++ b/docs/api/py/_sources/webdriver_wpewebkit/selenium.webdriver.wpewebkit.webdriver.rst.txt @@ -4,26 +4,9 @@ selenium.webdriver.wpewebkit.webdriver .. automodule:: selenium.webdriver.wpewebkit.webdriver - - - - - - - - - .. rubric:: Classes .. autosummary:: WebDriver - - - - - - - - - + \ No newline at end of file diff --git a/docs/api/py/_static/basic.css b/docs/api/py/_static/basic.css index cfc60b86c7c66..f316efcb47bde 100644 --- a/docs/api/py/_static/basic.css +++ b/docs/api/py/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -237,6 +237,10 @@ a.headerlink { visibility: hidden; } +a:visited { + color: #551A8B; +} + h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, diff --git a/docs/api/py/_static/classic.css b/docs/api/py/_static/classic.css deleted file mode 100644 index d0ed3264dfbd3..0000000000000 --- a/docs/api/py/_static/classic.css +++ /dev/null @@ -1,269 +0,0 @@ -/* - * classic.css_t - * ~~~~~~~~~~~~~ - * - * Sphinx stylesheet -- classic theme. - * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -html { - /* CSS hack for macOS's scrollbar (see #1125) */ - background-color: #FFFFFF; -} - -body { - font-family: sans-serif; - font-size: 100%; - background-color: #11303d; - color: #000; - margin: 0; - padding: 0; -} - -div.document { - display: flex; - background-color: #1c4e63; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 230px; -} - -div.body { - background-color: #ffffff; - color: #000000; - padding: 0 20px 30px 20px; -} - -div.footer { - color: #ffffff; - width: 100%; - padding: 9px 0 9px 0; - text-align: center; - font-size: 75%; -} - -div.footer a { - color: #ffffff; - text-decoration: underline; -} - -div.related { - background-color: #133f52; - line-height: 30px; - color: #ffffff; -} - -div.related a { - color: #ffffff; -} - -div.sphinxsidebar { -} - -div.sphinxsidebar h3 { - font-family: 'Trebuchet MS', sans-serif; - color: #ffffff; - font-size: 1.4em; - font-weight: normal; - margin: 0; - padding: 0; -} - -div.sphinxsidebar h3 a { - color: #ffffff; -} - -div.sphinxsidebar h4 { - font-family: 'Trebuchet MS', sans-serif; - color: #ffffff; - font-size: 1.3em; - font-weight: normal; - margin: 5px 0 0 0; - padding: 0; -} - -div.sphinxsidebar p { - color: #ffffff; -} - -div.sphinxsidebar p.topless { - margin: 5px 10px 10px 10px; -} - -div.sphinxsidebar ul { - margin: 10px; - padding: 0; - color: #ffffff; -} - -div.sphinxsidebar a { - color: #98dbcc; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - - - -/* -- hyperlink styles ------------------------------------------------------ */ - -a { - color: #355f7c; - text-decoration: none; -} - -a:visited { - color: #355f7c; - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - - - -/* -- body styles ----------------------------------------------------------- */ - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: 'Trebuchet MS', sans-serif; - background-color: #f2f2f2; - font-weight: normal; - color: #20435c; - border-bottom: 1px solid #ccc; - margin: 20px -20px 10px -20px; - padding: 3px 0 3px 10px; -} - -div.body h1 { margin-top: 0; font-size: 200%; } -div.body h2 { font-size: 160%; } -div.body h3 { font-size: 140%; } -div.body h4 { font-size: 120%; } -div.body h5 { font-size: 110%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #c60f0f; - font-size: 0.8em; - padding: 0 4px 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - background-color: #c60f0f; - color: white; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - text-align: justify; - line-height: 130%; -} - -div.admonition p.admonition-title + p { - display: inline; -} - -div.admonition p { - margin-bottom: 5px; -} - -div.admonition pre { - margin-bottom: 5px; -} - -div.admonition ul, div.admonition ol { - margin-bottom: 5px; -} - -div.note { - background-color: #eee; - border: 1px solid #ccc; -} - -div.seealso { - background-color: #ffc; - border: 1px solid #ff6; -} - -nav.contents, -aside.topic, -div.topic { - background-color: #eee; -} - -div.warning { - background-color: #ffe4e4; - border: 1px solid #f66; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre { - padding: 5px; - background-color: unset; - color: unset; - line-height: 120%; - border: 1px solid #ac9; - border-left: none; - border-right: none; -} - -code { - background-color: #ecf0f3; - padding: 0 1px 0 1px; - font-size: 0.95em; -} - -th, dl.field-list > dt { - background-color: #ede; -} - -.warning code { - background: #efc2c2; -} - -.note code { - background: #d6d6d6; -} - -.viewcode-back { - font-family: sans-serif; -} - -div.viewcode-block:target { - background-color: #f4debf; - border-top: 1px solid #ac9; - border-bottom: 1px solid #ac9; -} - -div.code-block-caption { - color: #efefef; - background-color: #1c4e63; -} \ No newline at end of file diff --git a/docs/api/py/_static/default.css b/docs/api/py/_static/default.css deleted file mode 100644 index 81b9363634e0f..0000000000000 --- a/docs/api/py/_static/default.css +++ /dev/null @@ -1 +0,0 @@ -@import url("classic.css"); diff --git a/docs/api/py/_static/doctools.js b/docs/api/py/_static/doctools.js index d06a71d751804..4d67807d17d27 100644 --- a/docs/api/py/_static/doctools.js +++ b/docs/api/py/_static/doctools.js @@ -4,7 +4,7 @@ * * Base JavaScript utilities for all Sphinx HTML documentation. * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/docs/api/py/_static/documentation_options.js b/docs/api/py/_static/documentation_options.js index 88f8ef7ee8f62..409bbdb1e9289 100644 --- a/docs/api/py/_static/documentation_options.js +++ b/docs/api/py/_static/documentation_options.js @@ -1,6 +1,5 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '4.29.0.202501201850', +const DOCUMENTATION_OPTIONS = { + VERSION: '4.30.0', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/docs/api/py/_static/fonts/font-awesome.css b/docs/api/py/_static/fonts/font-awesome.css new file mode 100644 index 0000000000000..b476b53e33b57 --- /dev/null +++ b/docs/api/py/_static/fonts/font-awesome.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url("specimen/FontAwesome.woff2") format("woff2"),url("specimen/FontAwesome.woff") format("woff"),url("specimen/FontAwesome.ttf") format("truetype")}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} \ No newline at end of file diff --git a/docs/api/py/_static/fonts/material-icons.css b/docs/api/py/_static/fonts/material-icons.css new file mode 100644 index 0000000000000..63130b01203f3 --- /dev/null +++ b/docs/api/py/_static/fonts/material-icons.css @@ -0,0 +1,13 @@ +/*! + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE + * DISTRIBUTED UNDER THE LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + * SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING PERMISSIONS AND + * LIMITATIONS UNDER THE LICENSE. + */@font-face{font-display:swap;font-family:"Material Icons";font-style:normal;font-weight:400;src:local("Material Icons"),local("MaterialIcons-Regular"),url("specimen/MaterialIcons-Regular.woff2") format("woff2"),url("specimen/MaterialIcons-Regular.woff") format("woff"),url("specimen/MaterialIcons-Regular.ttf") format("truetype")} \ No newline at end of file diff --git a/docs/api/py/_static/fonts/specimen/FontAwesome.ttf b/docs/api/py/_static/fonts/specimen/FontAwesome.ttf new file mode 100644 index 0000000000000..35acda2fa1196 Binary files /dev/null and b/docs/api/py/_static/fonts/specimen/FontAwesome.ttf differ diff --git a/docs/api/py/_static/fonts/specimen/FontAwesome.woff b/docs/api/py/_static/fonts/specimen/FontAwesome.woff new file mode 100644 index 0000000000000..400014a4b06ee Binary files /dev/null and b/docs/api/py/_static/fonts/specimen/FontAwesome.woff differ diff --git a/docs/api/py/_static/fonts/specimen/FontAwesome.woff2 b/docs/api/py/_static/fonts/specimen/FontAwesome.woff2 new file mode 100644 index 0000000000000..4d13fc60404b9 Binary files /dev/null and b/docs/api/py/_static/fonts/specimen/FontAwesome.woff2 differ diff --git a/docs/api/py/_static/fonts/specimen/MaterialIcons-Regular.ttf b/docs/api/py/_static/fonts/specimen/MaterialIcons-Regular.ttf new file mode 100644 index 0000000000000..7015564ad166a Binary files /dev/null and b/docs/api/py/_static/fonts/specimen/MaterialIcons-Regular.ttf differ diff --git a/docs/api/py/_static/fonts/specimen/MaterialIcons-Regular.woff b/docs/api/py/_static/fonts/specimen/MaterialIcons-Regular.woff new file mode 100644 index 0000000000000..b648a3eea2d16 Binary files /dev/null and b/docs/api/py/_static/fonts/specimen/MaterialIcons-Regular.woff differ diff --git a/docs/api/py/_static/fonts/specimen/MaterialIcons-Regular.woff2 b/docs/api/py/_static/fonts/specimen/MaterialIcons-Regular.woff2 new file mode 100644 index 0000000000000..9fa2112520800 Binary files /dev/null and b/docs/api/py/_static/fonts/specimen/MaterialIcons-Regular.woff2 differ diff --git a/docs/api/py/_static/images/favicon.png b/docs/api/py/_static/images/favicon.png new file mode 100644 index 0000000000000..76d17f57ad903 Binary files /dev/null and b/docs/api/py/_static/images/favicon.png differ diff --git a/docs/api/py/_static/images/icons/bitbucket.1b09e088.svg b/docs/api/py/_static/images/icons/bitbucket.1b09e088.svg new file mode 100644 index 0000000000000..cf58c14fbc67b --- /dev/null +++ b/docs/api/py/_static/images/icons/bitbucket.1b09e088.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/api/py/_static/images/icons/bitbucket.svg b/docs/api/py/_static/images/icons/bitbucket.svg new file mode 100644 index 0000000000000..cf58c14fbc67b --- /dev/null +++ b/docs/api/py/_static/images/icons/bitbucket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/api/py/_static/images/icons/github.f0b8504a.svg b/docs/api/py/_static/images/icons/github.f0b8504a.svg new file mode 100644 index 0000000000000..3d13b1975139a --- /dev/null +++ b/docs/api/py/_static/images/icons/github.f0b8504a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/api/py/_static/images/icons/github.svg b/docs/api/py/_static/images/icons/github.svg new file mode 100644 index 0000000000000..3d13b1975139a --- /dev/null +++ b/docs/api/py/_static/images/icons/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/api/py/_static/images/icons/gitlab.6dd19c00.svg b/docs/api/py/_static/images/icons/gitlab.6dd19c00.svg new file mode 100644 index 0000000000000..1d9fffa74fbf5 --- /dev/null +++ b/docs/api/py/_static/images/icons/gitlab.6dd19c00.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/api/py/_static/images/icons/gitlab.svg b/docs/api/py/_static/images/icons/gitlab.svg new file mode 100644 index 0000000000000..1d9fffa74fbf5 --- /dev/null +++ b/docs/api/py/_static/images/icons/gitlab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/api/py/_static/javascripts/application.js b/docs/api/py/_static/javascripts/application.js new file mode 100644 index 0000000000000..7c724d2e4f2d3 --- /dev/null +++ b/docs/api/py/_static/javascripts/application.js @@ -0,0 +1,2540 @@ +! function(e, t) { + for (var n in t) e[n] = t[n] +}(window, function(n) { + var r = {}; + + function i(e) { + if (r[e]) return r[e].exports; + var t = r[e] = { + i: e, + l: !1, + exports: {} + }; + return n[e].call(t.exports, t, t.exports, i), t.l = !0, t.exports + } + return i.m = n, i.c = r, i.d = function(e, t, n) { + i.o(e, t) || Object.defineProperty(e, t, { + enumerable: !0, + get: n + }) + }, i.r = function(e) { + "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { + value: "Module" + }), Object.defineProperty(e, "__esModule", { + value: !0 + }) + }, i.t = function(t, e) { + if (1 & e && (t = i(t)), 8 & e) return t; + if (4 & e && "object" == typeof t && t && t.__esModule) return t; + var n = Object.create(null); + if (i.r(n), Object.defineProperty(n, "default", { + enumerable: !0, + value: t + }), 2 & e && "string" != typeof t) + for (var r in t) i.d(n, r, function(e) { + return t[e] + }.bind(null, r)); + return n + }, i.n = function(e) { + var t = e && e.__esModule ? function() { + return e.default + } : function() { + return e + }; + return i.d(t, "a", t), t + }, i.o = function(e, t) { + return Object.prototype.hasOwnProperty.call(e, t) + }, i.p = "", i(i.s = 13) +}([function(e, t, n) { + "use strict"; + var r = { + Listener: function() { + function e(e, t, n) { + var r = this; + this.els_ = Array.prototype.slice.call("string" == typeof e ? document.querySelectorAll(e) : [].concat(e)), this.handler_ = "function" == typeof n ? { + update: n + } : n, this.events_ = [].concat(t), this.update_ = function(e) { + return r.handler_.update(e) + } + } + var t = e.prototype; + return t.listen = function() { + var n = this; + this.els_.forEach(function(t) { + n.events_.forEach(function(e) { + t.addEventListener(e, n.update_, !1) + }) + }), "function" == typeof this.handler_.setup && this.handler_.setup() + }, t.unlisten = function() { + var n = this; + this.els_.forEach(function(t) { + n.events_.forEach(function(e) { + t.removeEventListener(e, n.update_) + }) + }), "function" == typeof this.handler_.reset && this.handler_.reset() + }, e + }(), + MatchMedia: function(e, t) { + this.handler_ = function(e) { + e.matches ? t.listen() : t.unlisten() + }; + var n = window.matchMedia(e); + n.addListener(this.handler_), this.handler_(n) + } + }, + i = { + Shadow: function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement && n.parentNode instanceof HTMLElement)) throw new ReferenceError; + if (this.el_ = n.parentNode, !((n = "string" == typeof t ? document.querySelector(t) : t) instanceof HTMLElement)) throw new ReferenceError; + this.header_ = n, this.height_ = 0, this.active_ = !1 + } + var t = e.prototype; + return t.setup = function() { + for (var e = this.el_; e = e.previousElementSibling;) { + if (!(e instanceof HTMLElement)) throw new ReferenceError; + this.height_ += e.offsetHeight + } + this.update() + }, t.update = function(e) { + if (!e || "resize" !== e.type && "orientationchange" !== e.type) { + var t = window.pageYOffset >= this.height_; + t !== this.active_ && (this.header_.dataset.mdState = (this.active_ = t) ? "shadow" : "") + } else this.height_ = 0, this.setup() + }, t.reset = function() { + this.header_.dataset.mdState = "", this.height_ = 0, this.active_ = !1 + }, e + }(), + Title: function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + if (this.el_ = n, !((n = "string" == typeof t ? document.querySelector(t) : t) instanceof HTMLHeadingElement)) throw new ReferenceError; + this.header_ = n, this.active_ = !1 + } + var t = e.prototype; + return t.setup = function() { + var t = this; + Array.prototype.forEach.call(this.el_.children, function(e) { + e.style.width = t.el_.offsetWidth - 20 + "px" + }) + }, t.update = function(e) { + var t = this, + n = window.pageYOffset >= this.header_.offsetTop; + n !== this.active_ && (this.el_.dataset.mdState = (this.active_ = n) ? "active" : ""), "resize" !== e.type && "orientationchange" !== e.type || Array.prototype.forEach.call(this.el_.children, function(e) { + e.style.width = t.el_.offsetWidth - 20 + "px" + }) + }, t.reset = function() { + this.el_.dataset.mdState = "", this.el_.style.width = "", this.active_ = !1 + }, e + }() + }, + o = { + Blur: function() { + function e(e) { + this.els_ = "string" == typeof e ? document.querySelectorAll(e) : e, this.index_ = 0, this.offset_ = window.pageYOffset, this.dir_ = !1, this.anchors_ = [].reduce.call(this.els_, function(e, t) { + var n = decodeURIComponent(t.hash); + return e.concat(document.getElementById(n.substring(1)) || []) + }, []) + } + var t = e.prototype; + return t.setup = function() { + this.update() + }, t.update = function() { + var e = window.pageYOffset, + t = this.offset_ - e < 0; + if (this.dir_ !== t && (this.index_ = this.index_ = t ? 0 : this.els_.length - 1), 0 !== this.anchors_.length) { + if (this.offset_ <= e) + for (var n = this.index_ + 1; n < this.els_.length && this.anchors_[n].offsetTop - 80 <= e; n++) 0 < n && (this.els_[n - 1].dataset.mdState = "blur"), this.index_ = n; + else + for (var r = this.index_; 0 <= r; r--) { + if (!(this.anchors_[r].offsetTop - 80 > e)) { + this.index_ = r; + break + } + 0 < r && (this.els_[r - 1].dataset.mdState = "") + } + this.offset_ = e, this.dir_ = t + } + }, t.reset = function() { + Array.prototype.forEach.call(this.els_, function(e) { + e.dataset.mdState = "" + }), this.index_ = 0, this.offset_ = window.pageYOffset + }, e + }(), + Collapse: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + this.el_ = t + } + var t = e.prototype; + return t.setup = function() { + var e = this.el_.getBoundingClientRect().height; + this.el_.style.display = e ? "block" : "none", this.el_.style.overflow = e ? "visible" : "hidden" + }, t.update = function() { + var e = this, + t = this.el_.getBoundingClientRect().height; + this.el_.style.display = "block", this.el_.style.overflow = ""; + var r = this.el_.previousElementSibling.previousElementSibling.checked; + if (r) this.el_.style.maxHeight = t + "px", requestAnimationFrame(function() { + e.el_.setAttribute("data-md-state", "animate"), e.el_.style.maxHeight = "0px" + }); + else { + this.el_.setAttribute("data-md-state", "expand"), this.el_.style.maxHeight = ""; + var n = this.el_.getBoundingClientRect().height; + this.el_.removeAttribute("data-md-state"), this.el_.style.maxHeight = "0px", requestAnimationFrame(function() { + e.el_.setAttribute("data-md-state", "animate"), e.el_.style.maxHeight = n + "px" + }) + } + this.el_.addEventListener("transitionend", function e(t) { + var n = t.target; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + n.removeAttribute("data-md-state"), n.style.maxHeight = "", n.style.display = r ? "none" : "block", n.style.overflow = r ? "hidden" : "visible", n.removeEventListener("transitionend", e) + }, !1) + }, t.reset = function() { + this.el_.dataset.mdState = "", this.el_.style.maxHeight = "", this.el_.style.display = "", this.el_.style.overflow = "" + }, e + }(), + Scrolling: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + this.el_ = t + } + var t = e.prototype; + return t.setup = function() { + this.el_.children[this.el_.children.length - 1].style.webkitOverflowScrolling = "touch"; + var e = this.el_.querySelectorAll("[data-md-toggle]"); + Array.prototype.forEach.call(e, function(e) { + if (!(e instanceof HTMLInputElement)) throw new ReferenceError; + if (e.checked) { + var t = e.nextElementSibling; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + for (; + "NAV" !== t.tagName && t.nextElementSibling;) t = t.nextElementSibling; + if (!(e.parentNode instanceof HTMLElement && e.parentNode.parentNode instanceof HTMLElement)) throw new ReferenceError; + var n = e.parentNode.parentNode, + r = t.children[t.children.length - 1]; + n.style.webkitOverflowScrolling = "", r.style.webkitOverflowScrolling = "touch" + } + }) + }, t.update = function(e) { + var t = e.target; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + var n = t.nextElementSibling; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + for (; + "NAV" !== n.tagName && n.nextElementSibling;) n = n.nextElementSibling; + if (!(t.parentNode instanceof HTMLElement && t.parentNode.parentNode instanceof HTMLElement)) throw new ReferenceError; + var r = t.parentNode.parentNode, + i = n.children[n.children.length - 1]; + if (r.style.webkitOverflowScrolling = "", i.style.webkitOverflowScrolling = "", !t.checked) { + n.addEventListener("transitionend", function e() { + n instanceof HTMLElement && (r.style.webkitOverflowScrolling = "touch", n.removeEventListener("transitionend", e)) + }, !1) + } + if (t.checked) { + n.addEventListener("transitionend", function e() { + n instanceof HTMLElement && (i.style.webkitOverflowScrolling = "touch", n.removeEventListener("transitionend", e)) + }, !1) + } + }, t.reset = function() { + this.el_.children[1].style.webkitOverflowScrolling = ""; + var e = this.el_.querySelectorAll("[data-md-toggle]"); + Array.prototype.forEach.call(e, function(e) { + if (!(e instanceof HTMLInputElement)) throw new ReferenceError; + if (e.checked) { + var t = e.nextElementSibling; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + for (; + "NAV" !== t.tagName && t.nextElementSibling;) t = t.nextElementSibling; + if (!(e.parentNode instanceof HTMLElement && e.parentNode.parentNode instanceof HTMLElement)) throw new ReferenceError; + var n = e.parentNode.parentNode, + r = t.children[t.children.length - 1]; + n.style.webkitOverflowScrolling = "", r.style.webkitOverflowScrolling = "" + } + }) + }, e + }() + }, + a = { + Lock: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLInputElement)) throw new ReferenceError; + if (this.el_ = t, !document.body) throw new ReferenceError; + this.lock_ = document.body + } + var t = e.prototype; + return t.setup = function() { + this.update() + }, t.update = function() { + var e = this; + this.el_.checked ? (this.offset_ = window.pageYOffset, setTimeout(function() { + window.scrollTo(0, 0), e.el_.checked && (e.lock_.dataset.mdState = "lock") + }, 400)) : (this.lock_.dataset.mdState = "", setTimeout(function() { + void 0 !== e.offset_ && window.scrollTo(0, e.offset_) + }, 100)) + }, t.reset = function() { + "lock" === this.lock_.dataset.mdState && window.scrollTo(0, this.offset_), this.lock_.dataset.mdState = "" + }, e + }(), + Result: n(9).a + }, + s = { + Position: function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement && n.parentNode instanceof HTMLElement)) throw new ReferenceError; + if (this.el_ = n, this.parent_ = n.parentNode, !((n = "string" == typeof t ? document.querySelector(t) : t) instanceof HTMLElement)) throw new ReferenceError; + this.header_ = n, this.height_ = 0, this.pad_ = "fixed" === window.getComputedStyle(this.header_).position + } + var t = e.prototype; + return t.setup = function() { + var e = Array.prototype.reduce.call(this.parent_.children, function(e, t) { + return Math.max(e, t.offsetTop) + }, 0); + this.offset_ = e - (this.pad_ ? this.header_.offsetHeight : 0), this.update() + }, t.update = function(e) { + var t = window.pageYOffset, + n = window.innerHeight; + e && "resize" === e.type && this.setup(); + var r = this.pad_ ? this.header_.offsetHeight : 0, + i = this.parent_.offsetTop + this.parent_.offsetHeight, + o = n - r - Math.max(0, this.offset_ - t) - Math.max(0, t + n - i); + o !== this.height_ && (this.el_.style.height = (this.height_ = o) + "px"), t >= this.offset_ ? "lock" !== this.el_.dataset.mdState && (this.el_.dataset.mdState = "lock") : "lock" === this.el_.dataset.mdState && (this.el_.dataset.mdState = "") + }, t.reset = function() { + this.el_.dataset.mdState = "", this.el_.style.height = "", this.height_ = 0 + }, e + }() + }, + c = n(6), + l = n.n(c); + var u = { + Adapter: { + GitHub: function(o) { + var e, t; + + function n(e) { + var t; + t = o.call(this, e) || this; + var n = /^.+github\.com\/([^/]+)\/?([^/]+)?.*$/.exec(t.base_); + if (n && 3 === n.length) { + var r = n[1], + i = n[2]; + t.base_ = "https://api.github.com/users/" + r + "/repos", t.name_ = i + } + return t + } + return t = o, (e = n).prototype = Object.create(t.prototype), (e.prototype.constructor = e).__proto__ = t, n.prototype.fetch_ = function() { + var i = this; + return function n(r) { + return void 0 === r && (r = 0), fetch(i.base_ + "?per_page=30&page=" + r).then(function(e) { + return e.json() + }).then(function(e) { + if (!(e instanceof Array)) throw new TypeError; + if (i.name_) { + var t = e.find(function(e) { + return e.name === i.name_ + }); + return t || 30 !== e.length ? t ? [i.format_(t.stargazers_count) + " Stars", i.format_(t.forks_count) + " Forks"] : [] : n(r + 1) + } + return [e.length + " Repositories"] + }) + }() + }, n + }(function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLAnchorElement)) throw new ReferenceError; + this.el_ = t, this.base_ = this.el_.href, this.salt_ = this.hash_(this.base_) + } + var t = e.prototype; + return t.fetch = function() { + var n = this; + return new Promise(function(t) { + var e = l.a.getJSON(n.salt_ + ".cache-source"); + void 0 !== e ? t(e) : n.fetch_().then(function(e) { + l.a.set(n.salt_ + ".cache-source", e, { + expires: 1 / 96 + }), t(e) + }) + }) + }, t.fetch_ = function() { + throw new Error("fetch_(): Not implemented") + }, t.format_ = function(e) { + return 1e4 < e ? (e / 1e3).toFixed(0) + "k" : 1e3 < e ? (e / 1e3).toFixed(1) + "k" : "" + e + }, t.hash_ = function(e) { + var t = 0; + if (0 === e.length) return t; + for (var n = 0, r = e.length; n < r; n++) t = (t << 5) - t + e.charCodeAt(n), t |= 0; + return t + }, e + }()) + }, + Repository: n(10).a + }, + f = { + Toggle: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof Node)) throw new ReferenceError; + this.el_ = t; + var n = document.querySelector("[data-md-component=header]"); + this.height_ = n.offsetHeight, this.active_ = !1 + } + var t = e.prototype; + return t.update = function() { + var e = window.pageYOffset >= this.el_.children[0].offsetTop + (5 - this.height_); + e !== this.active_ && (this.el_.dataset.mdState = (this.active_ = e) ? "hidden" : "") + }, t.reset = function() { + this.el_.dataset.mdState = "", this.active_ = !1 + }, e + }() + }; + t.a = { + Event: r, + Header: i, + Nav: o, + Search: a, + Sidebar: s, + Source: u, + Tabs: f + } +}, function(t, e, n) { + (function(e) { + t.exports = e.lunr = n(24) + }).call(this, n(4)) +}, function(e, f, d) { + "use strict"; + (function(t) { + var e = d(8), + n = setTimeout; + + function r() {} + + function o(e) { + if (!(this instanceof o)) throw new TypeError("Promises must be constructed via new"); + if ("function" != typeof e) throw new TypeError("not a function"); + this._state = 0, this._handled = !1, this._value = void 0, this._deferreds = [], u(e, this) + } + + function i(n, r) { + for (; 3 === n._state;) n = n._value; + 0 !== n._state ? (n._handled = !0, o._immediateFn(function() { + var e = 1 === n._state ? r.onFulfilled : r.onRejected; + if (null !== e) { + var t; + try { + t = e(n._value) + } catch (e) { + return void s(r.promise, e) + } + a(r.promise, t) + } else(1 === n._state ? a : s)(r.promise, n._value) + })) : n._deferreds.push(r) + } + + function a(t, e) { + try { + if (e === t) throw new TypeError("A promise cannot be resolved with itself."); + if (e && ("object" == typeof e || "function" == typeof e)) { + var n = e.then; + if (e instanceof o) return t._state = 3, t._value = e, void c(t); + if ("function" == typeof n) return void u((r = n, i = e, function() { + r.apply(i, arguments) + }), t) + } + t._state = 1, t._value = e, c(t) + } catch (e) { + s(t, e) + } + var r, i + } + + function s(e, t) { + e._state = 2, e._value = t, c(e) + } + + function c(e) { + 2 === e._state && 0 === e._deferreds.length && o._immediateFn(function() { + e._handled || o._unhandledRejectionFn(e._value) + }); + for (var t = 0, n = e._deferreds.length; t < n; t++) i(e, e._deferreds[t]); + e._deferreds = null + } + + function l(e, t, n) { + this.onFulfilled = "function" == typeof e ? e : null, this.onRejected = "function" == typeof t ? t : null, this.promise = n + } + + function u(e, t) { + var n = !1; + try { + e(function(e) { + n || (n = !0, a(t, e)) + }, function(e) { + n || (n = !0, s(t, e)) + }) + } catch (e) { + if (n) return; + n = !0, s(t, e) + } + } + o.prototype.catch = function(e) { + return this.then(null, e) + }, o.prototype.then = function(e, t) { + var n = new this.constructor(r); + return i(this, new l(e, t, n)), n + }, o.prototype.finally = e.a, o.all = function(t) { + return new o(function(r, i) { + if (!t || void 0 === t.length) throw new TypeError("Promise.all accepts an array"); + var o = Array.prototype.slice.call(t); + if (0 === o.length) return r([]); + var a = o.length; + + function s(t, e) { + try { + if (e && ("object" == typeof e || "function" == typeof e)) { + var n = e.then; + if ("function" == typeof n) return void n.call(e, function(e) { + s(t, e) + }, i) + } + o[t] = e, 0 == --a && r(o) + } catch (e) { + i(e) + } + } + for (var e = 0; e < o.length; e++) s(e, o[e]) + }) + }, o.resolve = function(t) { + return t && "object" == typeof t && t.constructor === o ? t : new o(function(e) { + e(t) + }) + }, o.reject = function(n) { + return new o(function(e, t) { + t(n) + }) + }, o.race = function(i) { + return new o(function(e, t) { + for (var n = 0, r = i.length; n < r; n++) i[n].then(e, t) + }) + }, o._immediateFn = "function" == typeof t && function(e) { + t(e) + } || function(e) { + n(e, 0) + }, o._unhandledRejectionFn = function(e) { + "undefined" != typeof console && console && console.warn("Possible Unhandled Promise Rejection:", e) + }, f.a = o + }).call(this, d(21).setImmediate) +}, function(e, t, n) { + "use strict"; + + function r(e, t) { + var n = document.createElement(e); + t && Array.prototype.forEach.call(Object.keys(t), function(e) { + n.setAttribute(e, t[e]) + }); + for (var r = arguments.length, i = new Array(2 < r ? r - 2 : 0), o = 2; o < r; o++) i[o - 2] = arguments[o]; + return function t(e) { + Array.prototype.forEach.call(e, function(e) { + "string" == typeof e || "number" == typeof e ? n.textContent += e : Array.isArray(e) ? t(e) : void 0 !== e.__html ? n.innerHTML += e.__html : e instanceof Node && n.appendChild(e) + }) + }(i), n + } + n.r(t), n.d(t, "createElement", function() { + return r + }) +}, function(e, t) { + var n; + n = function() { + return this + }(); + try { + n = n || new Function("return this")() + } catch (e) { + "object" == typeof window && (n = window) + } + e.exports = n +}, function(e, t, n) { + var r; + r = function() { + return function(n) { + var r = {}; + + function i(e) { + if (r[e]) return r[e].exports; + var t = r[e] = { + i: e, + l: !1, + exports: {} + }; + return n[e].call(t.exports, t, t.exports, i), t.l = !0, t.exports + } + return i.m = n, i.c = r, i.d = function(e, t, n) { + i.o(e, t) || Object.defineProperty(e, t, { + enumerable: !0, + get: n + }) + }, i.r = function(e) { + "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { + value: "Module" + }), Object.defineProperty(e, "__esModule", { + value: !0 + }) + }, i.t = function(t, e) { + if (1 & e && (t = i(t)), 8 & e) return t; + if (4 & e && "object" == typeof t && t && t.__esModule) return t; + var n = Object.create(null); + if (i.r(n), Object.defineProperty(n, "default", { + enumerable: !0, + value: t + }), 2 & e && "string" != typeof t) + for (var r in t) i.d(n, r, function(e) { + return t[e] + }.bind(null, r)); + return n + }, i.n = function(e) { + var t = e && e.__esModule ? function() { + return e.default + } : function() { + return e + }; + return i.d(t, "a", t), t + }, i.o = function(e, t) { + return Object.prototype.hasOwnProperty.call(e, t) + }, i.p = "", i(i.s = 0) + }([function(e, t, n) { + "use strict"; + var i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e + }, + o = function() { + function r(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r) + } + } + return function(e, t, n) { + return t && r(e.prototype, t), n && r(e, n), e + } + }(), + a = r(n(1)), + s = r(n(3)), + c = r(n(4)); + + function r(e) { + return e && e.__esModule ? e : { + default: e + } + } + var l = function(e) { + function r(e, t) { + ! function(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") + }(this, r); + var n = function(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || "object" != typeof t && "function" != typeof t ? e : t + }(this, (r.__proto__ || Object.getPrototypeOf(r)).call(this)); + return n.resolveOptions(t), n.listenClick(e), n + } + return function(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t) + }(r, s.default), o(r, [{ + key: "resolveOptions", + value: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}; + this.action = "function" == typeof e.action ? e.action : this.defaultAction, this.target = "function" == typeof e.target ? e.target : this.defaultTarget, this.text = "function" == typeof e.text ? e.text : this.defaultText, this.container = "object" === i(e.container) ? e.container : document.body + } + }, { + key: "listenClick", + value: function(e) { + var t = this; + this.listener = (0, c.default)(e, "click", function(e) { + return t.onClick(e) + }) + } + }, { + key: "onClick", + value: function(e) { + var t = e.delegateTarget || e.currentTarget; + this.clipboardAction && (this.clipboardAction = null), this.clipboardAction = new a.default({ + action: this.action(t), + target: this.target(t), + text: this.text(t), + container: this.container, + trigger: t, + emitter: this + }) + } + }, { + key: "defaultAction", + value: function(e) { + return u("action", e) + } + }, { + key: "defaultTarget", + value: function(e) { + var t = u("target", e); + if (t) return document.querySelector(t) + } + }, { + key: "defaultText", + value: function(e) { + return u("text", e) + } + }, { + key: "destroy", + value: function() { + this.listener.destroy(), this.clipboardAction && (this.clipboardAction.destroy(), this.clipboardAction = null) + } + }], [{ + key: "isSupported", + value: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : ["copy", "cut"], + t = "string" == typeof e ? [e] : e, + n = !!document.queryCommandSupported; + return t.forEach(function(e) { + n = n && !!document.queryCommandSupported(e) + }), n + } + }]), r + }(); + + function u(e, t) { + var n = "data-clipboard-" + e; + if (t.hasAttribute(n)) return t.getAttribute(n) + } + e.exports = l + }, function(e, t, n) { + "use strict"; + var r, i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e + }, + o = function() { + function r(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r) + } + } + return function(e, t, n) { + return t && r(e.prototype, t), n && r(e, n), e + } + }(), + a = n(2), + s = (r = a) && r.__esModule ? r : { + default: r + }; + var c = function() { + function t(e) { + ! function(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") + }(this, t), this.resolveOptions(e), this.initSelection() + } + return o(t, [{ + key: "resolveOptions", + value: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}; + this.action = e.action, this.container = e.container, this.emitter = e.emitter, this.target = e.target, this.text = e.text, this.trigger = e.trigger, this.selectedText = "" + } + }, { + key: "initSelection", + value: function() { + this.text ? this.selectFake() : this.target && this.selectTarget() + } + }, { + key: "selectFake", + value: function() { + var e = this, + t = "rtl" == document.documentElement.getAttribute("dir"); + this.removeFake(), this.fakeHandlerCallback = function() { + return e.removeFake() + }, this.fakeHandler = this.container.addEventListener("click", this.fakeHandlerCallback) || !0, this.fakeElem = document.createElement("textarea"), this.fakeElem.style.fontSize = "12pt", this.fakeElem.style.border = "0", this.fakeElem.style.padding = "0", this.fakeElem.style.margin = "0", this.fakeElem.style.position = "absolute", this.fakeElem.style[t ? "right" : "left"] = "-9999px"; + var n = window.pageYOffset || document.documentElement.scrollTop; + this.fakeElem.style.top = n + "px", this.fakeElem.setAttribute("readonly", ""), this.fakeElem.value = this.text, this.container.appendChild(this.fakeElem), this.selectedText = (0, s.default)(this.fakeElem), this.copyText() + } + }, { + key: "removeFake", + value: function() { + this.fakeHandler && (this.container.removeEventListener("click", this.fakeHandlerCallback), this.fakeHandler = null, this.fakeHandlerCallback = null), this.fakeElem && (this.container.removeChild(this.fakeElem), this.fakeElem = null) + } + }, { + key: "selectTarget", + value: function() { + this.selectedText = (0, s.default)(this.target), this.copyText() + } + }, { + key: "copyText", + value: function() { + var t = void 0; + try { + t = document.execCommand(this.action) + } catch (e) { + t = !1 + } + this.handleResult(t) + } + }, { + key: "handleResult", + value: function(e) { + this.emitter.emit(e ? "success" : "error", { + action: this.action, + text: this.selectedText, + trigger: this.trigger, + clearSelection: this.clearSelection.bind(this) + }) + } + }, { + key: "clearSelection", + value: function() { + this.trigger && this.trigger.focus(), window.getSelection().removeAllRanges() + } + }, { + key: "destroy", + value: function() { + this.removeFake() + } + }, { + key: "action", + set: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : "copy"; + if (this._action = e, "copy" !== this._action && "cut" !== this._action) throw new Error('Invalid "action" value, use either "copy" or "cut"') + }, + get: function() { + return this._action + } + }, { + key: "target", + set: function(e) { + if (void 0 !== e) { + if (!e || "object" !== (void 0 === e ? "undefined" : i(e)) || 1 !== e.nodeType) throw new Error('Invalid "target" value, use a valid Element'); + if ("copy" === this.action && e.hasAttribute("disabled")) throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'); + if ("cut" === this.action && (e.hasAttribute("readonly") || e.hasAttribute("disabled"))) throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes'); + this._target = e + } + }, + get: function() { + return this._target + } + }]), t + }(); + e.exports = c + }, function(e, t) { + e.exports = function(e) { + var t; + if ("SELECT" === e.nodeName) e.focus(), t = e.value; + else if ("INPUT" === e.nodeName || "TEXTAREA" === e.nodeName) { + var n = e.hasAttribute("readonly"); + n || e.setAttribute("readonly", ""), e.select(), e.setSelectionRange(0, e.value.length), n || e.removeAttribute("readonly"), t = e.value + } else { + e.hasAttribute("contenteditable") && e.focus(); + var r = window.getSelection(), + i = document.createRange(); + i.selectNodeContents(e), r.removeAllRanges(), r.addRange(i), t = r.toString() + } + return t + } + }, function(e, t) { + function n() {} + n.prototype = { + on: function(e, t, n) { + var r = this.e || (this.e = {}); + return (r[e] || (r[e] = [])).push({ + fn: t, + ctx: n + }), this + }, + once: function(e, t, n) { + var r = this; + + function i() { + r.off(e, i), t.apply(n, arguments) + } + return i._ = t, this.on(e, i, n) + }, + emit: function(e) { + for (var t = [].slice.call(arguments, 1), n = ((this.e || (this.e = {}))[e] || []).slice(), r = 0, i = n.length; r < i; r++) n[r].fn.apply(n[r].ctx, t); + return this + }, + off: function(e, t) { + var n = this.e || (this.e = {}), + r = n[e], + i = []; + if (r && t) + for (var o = 0, a = r.length; o < a; o++) r[o].fn !== t && r[o].fn._ !== t && i.push(r[o]); + return i.length ? n[e] = i : delete n[e], this + } + }, e.exports = n + }, function(e, t, n) { + var d = n(5), + h = n(6); + e.exports = function(e, t, n) { + if (!e && !t && !n) throw new Error("Missing required arguments"); + if (!d.string(t)) throw new TypeError("Second argument must be a String"); + if (!d.fn(n)) throw new TypeError("Third argument must be a Function"); + if (d.node(e)) return u = t, f = n, (l = e).addEventListener(u, f), { + destroy: function() { + l.removeEventListener(u, f) + } + }; + if (d.nodeList(e)) return a = e, s = t, c = n, Array.prototype.forEach.call(a, function(e) { + e.addEventListener(s, c) + }), { + destroy: function() { + Array.prototype.forEach.call(a, function(e) { + e.removeEventListener(s, c) + }) + } + }; + if (d.string(e)) return r = e, i = t, o = n, h(document.body, r, i, o); + throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList"); + var r, i, o, a, s, c, l, u, f + } + }, function(e, n) { + n.node = function(e) { + return void 0 !== e && e instanceof HTMLElement && 1 === e.nodeType + }, n.nodeList = function(e) { + var t = Object.prototype.toString.call(e); + return void 0 !== e && ("[object NodeList]" === t || "[object HTMLCollection]" === t) && "length" in e && (0 === e.length || n.node(e[0])) + }, n.string = function(e) { + return "string" == typeof e || e instanceof String + }, n.fn = function(e) { + return "[object Function]" === Object.prototype.toString.call(e) + } + }, function(e, t, n) { + var a = n(7); + + function o(e, t, n, r, i) { + var o = function(t, n, e, r) { + return function(e) { + e.delegateTarget = a(e.target, n), e.delegateTarget && r.call(t, e) + } + }.apply(this, arguments); + return e.addEventListener(n, o, i), { + destroy: function() { + e.removeEventListener(n, o, i) + } + } + } + e.exports = function(e, t, n, r, i) { + return "function" == typeof e.addEventListener ? o.apply(null, arguments) : "function" == typeof n ? o.bind(null, document).apply(null, arguments) : ("string" == typeof e && (e = document.querySelectorAll(e)), Array.prototype.map.call(e, function(e) { + return o(e, t, n, r, i) + })) + } + }, function(e, t) { + if ("undefined" != typeof Element && !Element.prototype.matches) { + var n = Element.prototype; + n.matches = n.matchesSelector || n.mozMatchesSelector || n.msMatchesSelector || n.oMatchesSelector || n.webkitMatchesSelector + } + e.exports = function(e, t) { + for (; e && 9 !== e.nodeType;) { + if ("function" == typeof e.matches && e.matches(t)) return e; + e = e.parentNode + } + } + }]) + }, e.exports = r() +}, function(r, i, o) { + var a, s; + ! function(e) { + if (void 0 === (s = "function" == typeof(a = e) ? a.call(i, o, i, r) : a) || (r.exports = s), !0, r.exports = e(), !!0) { + var t = window.Cookies, + n = window.Cookies = e(); + n.noConflict = function() { + return window.Cookies = t, n + } + } + }(function() { + function m() { + for (var e = 0, t = {}; e < arguments.length; e++) { + var n = arguments[e]; + for (var r in n) t[r] = n[r] + } + return t + } + return function e(h) { + function p(e, t, n) { + var r; + if ("undefined" != typeof document) { + if (1 < arguments.length) { + if ("number" == typeof(n = m({ + path: "/" + }, p.defaults, n)).expires) { + var i = new Date; + i.setMilliseconds(i.getMilliseconds() + 864e5 * n.expires), n.expires = i + } + n.expires = n.expires ? n.expires.toUTCString() : ""; + try { + r = JSON.stringify(t), /^[\{\[]/.test(r) && (t = r) + } catch (e) {} + t = h.write ? h.write(t, e) : encodeURIComponent(String(t)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent), e = (e = (e = encodeURIComponent(String(e))).replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)).replace(/[\(\)]/g, escape); + var o = ""; + for (var a in n) n[a] && (o += "; " + a, !0 !== n[a] && (o += "=" + n[a])); + return document.cookie = e + "=" + t + o + } + e || (r = {}); + for (var s = document.cookie ? document.cookie.split("; ") : [], c = /(%[0-9A-Z]{2})+/g, l = 0; l < s.length; l++) { + var u = s[l].split("="), + f = u.slice(1).join("="); + this.json || '"' !== f.charAt(0) || (f = f.slice(1, -1)); + try { + var d = u[0].replace(c, decodeURIComponent); + if (f = h.read ? h.read(f, d) : h(f, d) || f.replace(c, decodeURIComponent), this.json) try { + f = JSON.parse(f) + } catch (e) {} + if (e === d) { + r = f; + break + } + e || (r[d] = f) + } catch (e) {} + } + return r + } + } + return (p.set = p).get = function(e) { + return p.call(p, e) + }, p.getJSON = function() { + return p.apply({ + json: !0 + }, [].slice.call(arguments)) + }, p.defaults = {}, p.remove = function(e, t) { + p(e, "", m(t, { + expires: -1 + })) + }, p.withConverter = e, p + }(function() {}) + }) +}, function(e, t, n) { + "use strict"; + n.r(t); + var r = "function" == typeof fetch ? fetch.bind() : function(i, o) { + return o = o || {}, new Promise(function(e, t) { + var n = new XMLHttpRequest; + for (var r in n.open(o.method || "get", i, !0), o.headers) n.setRequestHeader(r, o.headers[r]); + + function s() { + var r, i = [], + o = [], + a = {}; + return n.getAllResponseHeaders().replace(/^(.*?):[^\S\n]*([\s\S]*?)$/gm, function(e, t, n) { + i.push(t = t.toLowerCase()), o.push([t, n]), r = a[t], a[t] = r ? r + "," + n : n + }), { + ok: 2 == (n.status / 100 | 0), + status: n.status, + statusText: n.statusText, + url: n.responseURL, + clone: s, + text: function() { + return Promise.resolve(n.responseText) + }, + json: function() { + return Promise.resolve(n.responseText).then(JSON.parse) + }, + blob: function() { + return Promise.resolve(new Blob([n.response])) + }, + headers: { + keys: function() { + return i + }, + entries: function() { + return o + }, + get: function(e) { + return a[e.toLowerCase()] + }, + has: function(e) { + return e.toLowerCase() in a + } + } + } + } + n.withCredentials = "include" == o.credentials, n.onload = function() { + e(s()) + }, n.onerror = t, n.send(o.body || null) + }) + }; + t.default = r +}, function(e, t, n) { + "use strict"; + t.a = function(t) { + var n = this.constructor; + return this.then(function(e) { + return n.resolve(t()).then(function() { + return e + }) + }, function(e) { + return n.resolve(t()).then(function() { + return n.reject(e) + }) + }) + } +}, function(e, n, r) { + "use strict"; + (function(f) { + r.d(n, "a", function() { + return t + }); + var e = r(1), + d = r.n(e), + h = function(e) { + var t = document.getElementsByName("lang:" + e)[0]; + if (!(t instanceof HTMLMetaElement)) throw new ReferenceError; + return t.content + }, + t = function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + this.el_ = n; + var r = Array.prototype.slice.call(this.el_.children), + i = r[0], + o = r[1]; + this.data_ = t, this.meta_ = i, this.list_ = o, this.message_ = { + placeholder: this.meta_.textContent, + none: h("search.result.none"), + one: h("search.result.one"), + other: h("search.result.other") + }; + var a = h("search.tokenizer"); + a.length && (d.a.tokenizer.separator = a), this.lang_ = h("search.language").split(",").filter(Boolean).map(function(e) { + return e.trim() + }) + } + return e.prototype.update = function(e) { + var t, a = this; + if ("focus" !== e.type || this.index_) { + if ("focus" === e.type || "keyup" === e.type) { + var n = e.target; + if (!(n instanceof HTMLInputElement)) throw new ReferenceError; + if (!this.index_ || n.value === this.value_) return; + for (; this.list_.firstChild;) this.list_.removeChild(this.list_.firstChild); + if (this.value_ = n.value, 0 === this.value_.length) return void(this.meta_.textContent = this.message_.placeholder); + var r = this.index_.query(function(t) { + a.value_.toLowerCase().split(" ").filter(Boolean).forEach(function(e) { + t.term(e, { + wildcard: d.a.Query.wildcard.TRAILING + }) + }) + }).reduce(function(e, t) { + var n = a.docs_.get(t.ref); + if (n.parent) { + var r = n.parent.location; + e.set(r, (e.get(r) || []).concat(t)) + } else { + var i = n.location; + e.set(i, e.get(i) || []) + } + return e + }, new Map), + i = (t = this.value_.trim(), t.replace(/[|\\{}()[\]^$+*?.-]/g, "\\$&")).replace(new RegExp(d.a.tokenizer.separator, "img"), "|"), + s = new RegExp("(^|" + d.a.tokenizer.separator + ")(" + i + ")", "img"), + c = function(e, t, n) { + return t + "" + n + "" + }; + this.stack_ = [], r.forEach(function(e, t) { + var n, r = a.docs_.get(t), + i = f.createElement("li", { + class: "md-search-result__item" + }, f.createElement("a", { + href: r.location, + title: r.title, + class: "md-search-result__link", + tabindex: "-1" + }, f.createElement("article", { + class: "md-search-result__article md-search-result__article--document" + }, f.createElement("h1", { + class: "md-search-result__title" + }, { + __html: r.title.replace(s, c) + }), r.text.length ? f.createElement("p", { + class: "md-search-result__teaser" + }, { + __html: r.text.replace(s, c) + }) : {}))), + o = e.map(function(t) { + return function() { + var e = a.docs_.get(t.ref); + i.appendChild(f.createElement("a", { + href: e.location, + title: e.title, + class: "md-search-result__link", + "data-md-rel": "anchor", + tabindex: "-1" + }, f.createElement("article", { + class: "md-search-result__article" + }, f.createElement("h1", { + class: "md-search-result__title" + }, { + __html: e.title.replace(s, c) + }), e.text.length ? f.createElement("p", { + class: "md-search-result__teaser" + }, { + __html: function(e, t) { + var n = t; + if (e.length > n) { + for (; + " " !== e[n] && 0 < --n;); + return e.substring(0, n) + "..." + } + return e + }(e.text.replace(s, c), 400) + }) : {}))) + } + }); + (n = a.stack_).push.apply(n, [function() { + return a.list_.appendChild(i) + }].concat(o)) + }); + var o = this.el_.parentNode; + if (!(o instanceof HTMLElement)) throw new ReferenceError; + for (; this.stack_.length && o.offsetHeight >= o.scrollHeight - 16;) this.stack_.shift()(); + var l = this.list_.querySelectorAll("[data-md-rel=anchor]"); + switch (Array.prototype.forEach.call(l, function(r) { + ["click", "keydown"].forEach(function(n) { + r.addEventListener(n, function(e) { + if ("keydown" !== n || 13 === e.keyCode) { + var t = document.querySelector("[data-md-toggle=search]"); + if (!(t instanceof HTMLInputElement)) throw new ReferenceError; + t.checked && (t.checked = !1, t.dispatchEvent(new CustomEvent("change"))), e.preventDefault(), setTimeout(function() { + document.location.href = r.href + }, 100) + } + }) + }) + }), r.size) { + case 0: + this.meta_.textContent = this.message_.none; + break; + case 1: + this.meta_.textContent = this.message_.one; + break; + default: + this.meta_.textContent = this.message_.other.replace("#", r.size) + } + } + } else { + var u = function(e) { + a.docs_ = e.reduce(function(e, t) { + var n, r, i, o = t.location.split("#"), + a = o[0], + s = o[1]; + return t.text = (n = t.text, r = document.createTextNode(n), (i = document.createElement("p")).appendChild(r), i.innerHTML), s && (t.parent = e.get(a), t.parent && !t.parent.done && (t.parent.title = t.title, t.parent.text = t.text, t.parent.done = !0)), t.text = t.text.replace(/\n/g, " ").replace(/\s+/g, " ").replace(/\s+([,.:;!?])/g, function(e, t) { + return t + }), t.parent && t.parent.title === t.title || e.set(t.location, t), e + }, new Map); + var i = a.docs_, + o = a.lang_; + a.stack_ = [], a.index_ = d()(function() { + var e, t = this, + n = { + "search.pipeline.trimmer": d.a.trimmer, + "search.pipeline.stopwords": d.a.stopWordFilter + }, + r = Object.keys(n).reduce(function(e, t) { + return h(t).match(/^false$/i) || e.push(n[t]), e + }, []); + this.pipeline.reset(), r && (e = this.pipeline).add.apply(e, r), 1 === o.length && "en" !== o[0] && d.a[o[0]] ? this.use(d.a[o[0]]) : 1 < o.length && this.use(d.a.multiLanguage.apply(d.a, o)), this.field("title", { + boost: 10 + }), this.field("text"), this.ref("location"), i.forEach(function(e) { + return t.add(e) + }) + }); + var t = a.el_.parentNode; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + t.addEventListener("scroll", function() { + for (; a.stack_.length && t.scrollTop + t.offsetHeight >= t.scrollHeight - 16;) a.stack_.splice(0, 10).forEach(function(e) { + return e() + }) + }) + }; + setTimeout(function() { + return "function" == typeof a.data_ ? a.data_().then(u) : u(a.data_) + }, 250) + } + }, e + }() + }).call(this, r(3)) +}, function(e, n, r) { + "use strict"; + (function(t) { + r.d(n, "a", function() { + return e + }); + var e = function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + this.el_ = t + } + return e.prototype.initialize = function(e) { + e.length && this.el_.children.length && this.el_.children[this.el_.children.length - 1].appendChild(t.createElement("ul", { + class: "md-source__facts" + }, e.map(function(e) { + return t.createElement("li", { + class: "md-source__fact" + }, e) + }))), this.el_.dataset.mdState = "done" + }, e + }() + }).call(this, r(3)) +}, , , function(e, n, c) { + "use strict"; + c.r(n), + function(o) { + c.d(n, "app", function() { + return t + }); + c(14), c(15), c(16), c(17), c(18), c(19), c(20); + var r = c(2), + e = c(5), + a = c.n(e), + i = c(0); + window.Promise = window.Promise || r.a; + var s = function(e) { + var t = document.getElementsByName("lang:" + e)[0]; + if (!(t instanceof HTMLMetaElement)) throw new ReferenceError; + return t.content + }; + var t = { + initialize: function(t) { + new i.a.Event.Listener(document, "DOMContentLoaded", function() { + if (!(document.body instanceof HTMLElement)) throw new ReferenceError; + Modernizr.addTest("ios", function() { + return !!navigator.userAgent.match(/(iPad|iPhone|iPod)/g) + }); + var e = document.querySelectorAll("table:not([class])"); + if (Array.prototype.forEach.call(e, function(e) { + var t = o.createElement("div", { + class: "md-typeset__scrollwrap" + }, o.createElement("div", { + class: "md-typeset__table" + })); + e.nextSibling ? e.parentNode.insertBefore(t, e.nextSibling) : e.parentNode.appendChild(t), t.children[0].appendChild(e) + }), a.a.isSupported()) { + var t = document.querySelectorAll(".codehilite > pre, pre > code"); + Array.prototype.forEach.call(t, function(e, t) { + var n = "__code_" + t, + r = o.createElement("button", { + class: "md-clipboard", + title: s("clipboard.copy"), + "data-clipboard-target": "#" + n + " pre, #" + n + " code" + }, o.createElement("span", { + class: "md-clipboard__message" + })), + i = e.parentNode; + i.id = n, i.insertBefore(r, e) + }), new a.a(".md-clipboard").on("success", function(e) { + var t = e.trigger.querySelector(".md-clipboard__message"); + if (!(t instanceof HTMLElement)) throw new ReferenceError; + e.clearSelection(), t.dataset.mdTimer && clearTimeout(parseInt(t.dataset.mdTimer, 10)), t.classList.add("md-clipboard__message--active"), t.innerHTML = s("clipboard.copied"), t.dataset.mdTimer = setTimeout(function() { + t.classList.remove("md-clipboard__message--active"), t.dataset.mdTimer = "" + }, 2e3).toString() + }) + } + if (!Modernizr.details) { + var n = document.querySelectorAll("details > summary"); + Array.prototype.forEach.call(n, function(e) { + e.addEventListener("click", function(e) { + var t = e.target.parentNode; + t.hasAttribute("open") ? t.removeAttribute("open") : t.setAttribute("open", "") + }) + }) + } + var r = function() { + if (document.location.hash) { + var e = document.getElementById(document.location.hash.substring(1)); + if (!e) return; + for (var t = e.parentNode; t && !(t instanceof HTMLDetailsElement);) t = t.parentNode; + if (t && !t.open) { + t.open = !0; + var n = location.hash; + location.hash = " ", location.hash = n + } + } + }; + if (window.addEventListener("hashchange", r), r(), Modernizr.ios) { + var i = document.querySelectorAll("[data-md-scrollfix]"); + Array.prototype.forEach.call(i, function(t) { + t.addEventListener("touchstart", function() { + var e = t.scrollTop; + 0 === e ? t.scrollTop = 1 : e + t.offsetHeight === t.scrollHeight && (t.scrollTop = e - 1) + }) + }) + } + }).listen(), new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Header.Shadow("[data-md-component=container]", "[data-md-component=header]")).listen(), new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Header.Title("[data-md-component=title]", ".md-typeset h1")).listen(), document.querySelector("[data-md-component=hero]") && new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Tabs.Toggle("[data-md-component=hero]")).listen(), document.querySelector("[data-md-component=tabs]") && new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Tabs.Toggle("[data-md-component=tabs]")).listen(), new i.a.Event.MatchMedia("(min-width: 1220px)", new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Sidebar.Position("[data-md-component=navigation]", "[data-md-component=header]"))), document.querySelector("[data-md-component=toc]") && new i.a.Event.MatchMedia("(min-width: 960px)", new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Sidebar.Position("[data-md-component=toc]", "[data-md-component=header]"))), new i.a.Event.MatchMedia("(min-width: 960px)", new i.a.Event.Listener(window, "scroll", new i.a.Nav.Blur("[data-md-component=toc] .md-nav__link"))); + var e = document.querySelectorAll("[data-md-component=collapsible]"); + Array.prototype.forEach.call(e, function(e) { + new i.a.Event.MatchMedia("(min-width: 1220px)", new i.a.Event.Listener(e.previousElementSibling, "click", new i.a.Nav.Collapse(e))) + }), new i.a.Event.MatchMedia("(max-width: 1219px)", new i.a.Event.Listener("[data-md-component=navigation] [data-md-toggle]", "change", new i.a.Nav.Scrolling("[data-md-component=navigation] nav"))), document.querySelector("[data-md-component=search]") && (new i.a.Event.MatchMedia("(max-width: 959px)", new i.a.Event.Listener("[data-md-toggle=search]", "change", new i.a.Search.Lock("[data-md-toggle=search]")))), + new i.a.Event.Listener(document.body, "keydown", function(e) { + if (9 === e.keyCode) { + var t = document.querySelectorAll("[data-md-component=navigation] .md-nav__link[for]:not([tabindex])"); + Array.prototype.forEach.call(t, function(e) { + e.offsetHeight && (e.tabIndex = 0) + }) + } + }).listen(), new i.a.Event.Listener(document.body, "mousedown", function() { + var e = document.querySelectorAll("[data-md-component=navigation] .md-nav__link[tabindex]"); + Array.prototype.forEach.call(e, function(e) { + e.removeAttribute("tabIndex") + }) + }).listen(), document.body.addEventListener("click", function() { + "tabbing" === document.body.dataset.mdState && (document.body.dataset.mdState = "") + }), new i.a.Event.MatchMedia("(max-width: 959px)", new i.a.Event.Listener("[data-md-component=navigation] [href^='#']", "click", function() { + var e = document.querySelector("[data-md-toggle=drawer]"); + if (!(e instanceof HTMLInputElement)) throw new ReferenceError; + e.checked && (e.checked = !1, e.dispatchEvent(new CustomEvent("change"))) + })), + function() { + var e = document.querySelector("[data-md-source]"); + if (!e) return r.a.resolve([]); + if (!(e instanceof HTMLAnchorElement)) throw new ReferenceError; + switch (e.dataset.mdSource) { + case "github": + return new i.a.Source.Adapter.GitHub(e).fetch(); + default: + return r.a.resolve([]) + } + }().then(function(t) { + var e = document.querySelectorAll("[data-md-source]"); + Array.prototype.forEach.call(e, function(e) { + new i.a.Source.Repository(e).initialize(t) + }) + }); + var n = function() { + var e = document.querySelectorAll("details"); + Array.prototype.forEach.call(e, function(e) { + e.setAttribute("open", "") + }) + }; + new i.a.Event.MatchMedia("print", { + listen: n, + unlisten: function() {} + }), window.onbeforeprint = n + } + } + }.call(this, c(3)) +}, function(e, t, n) { + e.exports = n.p + "assets/images/icons/bitbucket.1b09e088.svg" +}, function(e, t, n) { + e.exports = n.p + "assets/images/icons/github.f0b8504a.svg" +}, function(e, t, n) { + e.exports = n.p + "assets/images/icons/gitlab.6dd19c00.svg" +}, function(e, t) { + e.exports = "/Users/squidfunk/Desktop/General/Sources/mkdocs-material/material/application.4031d38b.css" +}, function(e, t) { + e.exports = "/Users/squidfunk/Desktop/General/Sources/mkdocs-material/material/application-palette.224b79ff.css" +}, function(e, t) { + ! function() { + if ("undefined" != typeof window) try { + var e = new window.CustomEvent("test", { + cancelable: !0 + }); + if (e.preventDefault(), !0 !== e.defaultPrevented) throw new Error("Could not prevent default") + } catch (e) { + var t = function(e, t) { + var n, r; + return (t = t || {}).bubbles = !!t.bubbles, t.cancelable = !!t.cancelable, (n = document.createEvent("CustomEvent")).initCustomEvent(e, t.bubbles, t.cancelable, t.detail), r = n.preventDefault, n.preventDefault = function() { + r.call(this); + try { + Object.defineProperty(this, "defaultPrevented", { + get: function() { + return !0 + } + }) + } catch (e) { + this.defaultPrevented = !0 + } + }, n + }; + t.prototype = window.Event.prototype, window.CustomEvent = t + } + }() +}, function(e, t, n) { + window.fetch || (window.fetch = n(7).default || n(7)) +}, function(e, i, o) { + (function(e) { + var t = void 0 !== e && e || "undefined" != typeof self && self || window, + n = Function.prototype.apply; + + function r(e, t) { + this._id = e, this._clearFn = t + } + i.setTimeout = function() { + return new r(n.call(setTimeout, t, arguments), clearTimeout) + }, i.setInterval = function() { + return new r(n.call(setInterval, t, arguments), clearInterval) + }, i.clearTimeout = i.clearInterval = function(e) { + e && e.close() + }, r.prototype.unref = r.prototype.ref = function() {}, r.prototype.close = function() { + this._clearFn.call(t, this._id) + }, i.enroll = function(e, t) { + clearTimeout(e._idleTimeoutId), e._idleTimeout = t + }, i.unenroll = function(e) { + clearTimeout(e._idleTimeoutId), e._idleTimeout = -1 + }, i._unrefActive = i.active = function(e) { + clearTimeout(e._idleTimeoutId); + var t = e._idleTimeout; + 0 <= t && (e._idleTimeoutId = setTimeout(function() { + e._onTimeout && e._onTimeout() + }, t)) + }, o(22), i.setImmediate = "undefined" != typeof self && self.setImmediate || void 0 !== e && e.setImmediate || this && this.setImmediate, i.clearImmediate = "undefined" != typeof self && self.clearImmediate || void 0 !== e && e.clearImmediate || this && this.clearImmediate + }).call(this, o(4)) +}, function(e, t, n) { + (function(e, p) { + ! function(n, r) { + "use strict"; + if (!n.setImmediate) { + var i, o, t, a, e, s = 1, + c = {}, + l = !1, + u = n.document, + f = Object.getPrototypeOf && Object.getPrototypeOf(n); + f = f && f.setTimeout ? f : n, i = "[object process]" === {}.toString.call(n.process) ? function(e) { + p.nextTick(function() { + h(e) + }) + } : function() { + if (n.postMessage && !n.importScripts) { + var e = !0, + t = n.onmessage; + return n.onmessage = function() { + e = !1 + }, n.postMessage("", "*"), n.onmessage = t, e + } + }() ? (a = "setImmediate$" + Math.random() + "$", e = function(e) { + e.source === n && "string" == typeof e.data && 0 === e.data.indexOf(a) && h(+e.data.slice(a.length)) + }, n.addEventListener ? n.addEventListener("message", e, !1) : n.attachEvent("onmessage", e), function(e) { + n.postMessage(a + e, "*") + }) : n.MessageChannel ? ((t = new MessageChannel).port1.onmessage = function(e) { + h(e.data) + }, function(e) { + t.port2.postMessage(e) + }) : u && "onreadystatechange" in u.createElement("script") ? (o = u.documentElement, function(e) { + var t = u.createElement("script"); + t.onreadystatechange = function() { + h(e), t.onreadystatechange = null, o.removeChild(t), t = null + }, o.appendChild(t) + }) : function(e) { + setTimeout(h, 0, e) + }, f.setImmediate = function(e) { + "function" != typeof e && (e = new Function("" + e)); + for (var t = new Array(arguments.length - 1), n = 0; n < t.length; n++) t[n] = arguments[n + 1]; + var r = { + callback: e, + args: t + }; + return c[s] = r, i(s), s++ + }, f.clearImmediate = d + } + + function d(e) { + delete c[e] + } + + function h(e) { + if (l) setTimeout(h, 0, e); + else { + var t = c[e]; + if (t) { + l = !0; + try { + ! function(e) { + var t = e.callback, + n = e.args; + switch (n.length) { + case 0: + t(); + break; + case 1: + t(n[0]); + break; + case 2: + t(n[0], n[1]); + break; + case 3: + t(n[0], n[1], n[2]); + break; + default: + t.apply(r, n) + } + }(t) + } finally { + d(e), l = !1 + } + } + } + } + }("undefined" == typeof self ? void 0 === e ? this : e : self) + }).call(this, n(4), n(23)) +}, function(e, t) { + var n, r, i = e.exports = {}; + + function o() { + throw new Error("setTimeout has not been defined") + } + + function a() { + throw new Error("clearTimeout has not been defined") + } + + function s(t) { + if (n === setTimeout) return setTimeout(t, 0); + if ((n === o || !n) && setTimeout) return n = setTimeout, setTimeout(t, 0); + try { + return n(t, 0) + } catch (e) { + try { + return n.call(null, t, 0) + } catch (e) { + return n.call(this, t, 0) + } + } + }! function() { + try { + n = "function" == typeof setTimeout ? setTimeout : o + } catch (e) { + n = o + } + try { + r = "function" == typeof clearTimeout ? clearTimeout : a + } catch (e) { + r = a + } + }(); + var c, l = [], + u = !1, + f = -1; + + function d() { + u && c && (u = !1, c.length ? l = c.concat(l) : f = -1, l.length && h()) + } + + function h() { + if (!u) { + var e = s(d); + u = !0; + for (var t = l.length; t;) { + for (c = l, l = []; ++f < t;) c && c[f].run(); + f = -1, t = l.length + } + c = null, u = !1, + function(t) { + if (r === clearTimeout) return clearTimeout(t); + if ((r === a || !r) && clearTimeout) return r = clearTimeout, clearTimeout(t); + try { + r(t) + } catch (e) { + try { + return r.call(null, t) + } catch (e) { + return r.call(this, t) + } + } + }(e) + } + } + + function p(e, t) { + this.fun = e, this.array = t + } + + function m() {} + i.nextTick = function(e) { + var t = new Array(arguments.length - 1); + if (1 < arguments.length) + for (var n = 1; n < arguments.length; n++) t[n - 1] = arguments[n]; + l.push(new p(e, t)), 1 !== l.length || u || s(h) + }, p.prototype.run = function() { + this.fun.apply(null, this.array) + }, i.title = "browser", i.browser = !0, i.env = {}, i.argv = [], i.version = "", i.versions = {}, i.on = m, i.addListener = m, i.once = m, i.off = m, i.removeListener = m, i.removeAllListeners = m, i.emit = m, i.prependListener = m, i.prependOnceListener = m, i.listeners = function(e) { + return [] + }, i.binding = function(e) { + throw new Error("process.binding is not supported") + }, i.cwd = function() { + return "/" + }, i.chdir = function(e) { + throw new Error("process.chdir is not supported") + }, i.umask = function() { + return 0 + } +}, function(i, o, a) { + var s, c; + /** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.6 + * Copyright (C) 2019 Oliver Nightingale + * @license MIT + */ + ! function() { + var t, l, u, e, n, f, d, h, p, m, y, v, g, w, _, E, x, b, k, S, T, L, R, O, C, r, D = function(e) { + var t = new D.Builder; + return t.pipeline.add(D.trimmer, D.stopWordFilter, D.stemmer), t.searchPipeline.add(D.stemmer), e.call(t, t), t.build() + }; + D.version = "2.3.6", D.utils = {}, D.utils.warn = (t = this, function(e) { + t.console && console.warn && console.warn(e) + }), D.utils.asString = function(e) { + return null == e ? "" : e.toString() + }, D.utils.clone = function(e) { + if (null == e) return e; + for (var t = Object.create(null), n = Object.keys(e), r = 0; r < n.length; r++) { + var i = n[r], + o = e[i]; + if (Array.isArray(o)) t[i] = o.slice(); + else { + if ("string" != typeof o && "number" != typeof o && "boolean" != typeof o) throw new TypeError("clone is not deep and does not support nested objects"); + t[i] = o + } + } + return t + }, D.FieldRef = function(e, t, n) { + this.docRef = e, this.fieldName = t, this._stringValue = n + }, D.FieldRef.joiner = "/", D.FieldRef.fromString = function(e) { + var t = e.indexOf(D.FieldRef.joiner); + if (-1 === t) throw "malformed field ref string"; + var n = e.slice(0, t), + r = e.slice(t + 1); + return new D.FieldRef(r, n, e) + }, D.FieldRef.prototype.toString = function() { + return null == this._stringValue && (this._stringValue = this.fieldName + D.FieldRef.joiner + this.docRef), this._stringValue + }, D.Set = function(e) { + if (this.elements = Object.create(null), e) { + this.length = e.length; + for (var t = 0; t < this.length; t++) this.elements[e[t]] = !0 + } else this.length = 0 + }, D.Set.complete = { + intersect: function(e) { + return e + }, + union: function(e) { + return e + }, + contains: function() { + return !0 + } + }, D.Set.empty = { + intersect: function() { + return this + }, + union: function(e) { + return e + }, + contains: function() { + return !1 + } + }, D.Set.prototype.contains = function(e) { + return !!this.elements[e] + }, D.Set.prototype.intersect = function(e) { + var t, n, r, i = []; + if (e === D.Set.complete) return this; + if (e === D.Set.empty) return e; + n = this.length < e.length ? (t = this, e) : (t = e, this), r = Object.keys(t.elements); + for (var o = 0; o < r.length; o++) { + var a = r[o]; + a in n.elements && i.push(a) + } + return new D.Set(i) + }, D.Set.prototype.union = function(e) { + return e === D.Set.complete ? D.Set.complete : e === D.Set.empty ? this : new D.Set(Object.keys(this.elements).concat(Object.keys(e.elements))) + }, D.idf = function(e, t) { + var n = 0; + for (var r in e) "_index" != r && (n += Object.keys(e[r]).length); + var i = (t - n + .5) / (n + .5); + return Math.log(1 + Math.abs(i)) + }, D.Token = function(e, t) { + this.str = e || "", this.metadata = t || {} + }, D.Token.prototype.toString = function() { + return this.str + }, D.Token.prototype.update = function(e) { + return this.str = e(this.str, this.metadata), this + }, D.Token.prototype.clone = function(e) { + return e = e || function(e) { + return e + }, new D.Token(e(this.str, this.metadata), this.metadata) + }, D.tokenizer = function(e, t) { + if (null == e || null == e) return []; + if (Array.isArray(e)) return e.map(function(e) { + return new D.Token(D.utils.asString(e).toLowerCase(), D.utils.clone(t)) + }); + for (var n = e.toString().trim().toLowerCase(), r = n.length, i = [], o = 0, a = 0; o <= r; o++) { + var s = o - a; + if (n.charAt(o).match(D.tokenizer.separator) || o == r) { + if (0 < s) { + var c = D.utils.clone(t) || {}; + c.position = [a, s], c.index = i.length, i.push(new D.Token(n.slice(a, o), c)) + } + a = o + 1 + } + } + return i + }, D.tokenizer.separator = /[\s\-]+/, D.Pipeline = function() { + this._stack = [] + }, D.Pipeline.registeredFunctions = Object.create(null), D.Pipeline.registerFunction = function(e, t) { + t in this.registeredFunctions && D.utils.warn("Overwriting existing registered function: " + t), e.label = t, D.Pipeline.registeredFunctions[e.label] = e + }, D.Pipeline.warnIfFunctionNotRegistered = function(e) { + e.label && e.label in this.registeredFunctions || D.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n", e) + }, D.Pipeline.load = function(e) { + var n = new D.Pipeline; + return e.forEach(function(e) { + var t = D.Pipeline.registeredFunctions[e]; + if (!t) throw new Error("Cannot load unregistered function: " + e); + n.add(t) + }), n + }, D.Pipeline.prototype.add = function() { + Array.prototype.slice.call(arguments).forEach(function(e) { + D.Pipeline.warnIfFunctionNotRegistered(e), this._stack.push(e) + }, this) + }, D.Pipeline.prototype.after = function(e, t) { + D.Pipeline.warnIfFunctionNotRegistered(t); + var n = this._stack.indexOf(e); + if (-1 == n) throw new Error("Cannot find existingFn"); + n += 1, this._stack.splice(n, 0, t) + }, D.Pipeline.prototype.before = function(e, t) { + D.Pipeline.warnIfFunctionNotRegistered(t); + var n = this._stack.indexOf(e); + if (-1 == n) throw new Error("Cannot find existingFn"); + this._stack.splice(n, 0, t) + }, D.Pipeline.prototype.remove = function(e) { + var t = this._stack.indexOf(e); - 1 != t && this._stack.splice(t, 1) + }, D.Pipeline.prototype.run = function(e) { + for (var t = this._stack.length, n = 0; n < t; n++) { + for (var r = this._stack[n], i = [], o = 0; o < e.length; o++) { + var a = r(e[o], o, e); + if (void 0 !== a && "" !== a) + if (Array.isArray(a)) + for (var s = 0; s < a.length; s++) i.push(a[s]); + else i.push(a) + } + e = i + } + return e + }, D.Pipeline.prototype.runString = function(e, t) { + var n = new D.Token(e, t); + return this.run([n]).map(function(e) { + return e.toString() + }) + }, D.Pipeline.prototype.reset = function() { + this._stack = [] + }, D.Pipeline.prototype.toJSON = function() { + return this._stack.map(function(e) { + return D.Pipeline.warnIfFunctionNotRegistered(e), e.label + }) + }, D.Vector = function(e) { + this._magnitude = 0, this.elements = e || [] + }, D.Vector.prototype.positionForIndex = function(e) { + if (0 == this.elements.length) return 0; + for (var t = 0, n = this.elements.length / 2, r = n - t, i = Math.floor(r / 2), o = this.elements[2 * i]; 1 < r && (o < e && (t = i), e < o && (n = i), o != e);) r = n - t, i = t + Math.floor(r / 2), o = this.elements[2 * i]; + return o == e ? 2 * i : e < o ? 2 * i : o < e ? 2 * (i + 1) : void 0 + }, D.Vector.prototype.insert = function(e, t) { + this.upsert(e, t, function() { + throw "duplicate index" + }) + }, D.Vector.prototype.upsert = function(e, t, n) { + this._magnitude = 0; + var r = this.positionForIndex(e); + this.elements[r] == e ? this.elements[r + 1] = n(this.elements[r + 1], t) : this.elements.splice(r, 0, e, t) + }, D.Vector.prototype.magnitude = function() { + if (this._magnitude) return this._magnitude; + for (var e = 0, t = this.elements.length, n = 1; n < t; n += 2) { + var r = this.elements[n]; + e += r * r + } + return this._magnitude = Math.sqrt(e) + }, D.Vector.prototype.dot = function(e) { + for (var t = 0, n = this.elements, r = e.elements, i = n.length, o = r.length, a = 0, s = 0, c = 0, l = 0; c < i && l < o;)(a = n[c]) < (s = r[l]) ? c += 2 : s < a ? l += 2 : a == s && (t += n[c + 1] * r[l + 1], c += 2, l += 2); + return t + }, D.Vector.prototype.similarity = function(e) { + return this.dot(e) / this.magnitude() || 0 + }, D.Vector.prototype.toArray = function() { + for (var e = new Array(this.elements.length / 2), t = 1, n = 0; t < this.elements.length; t += 2, n++) e[n] = this.elements[t]; + return e + }, D.Vector.prototype.toJSON = function() { + return this.elements + }, D.stemmer = (l = { + ational: "ate", + tional: "tion", + enci: "ence", + anci: "ance", + izer: "ize", + bli: "ble", + alli: "al", + entli: "ent", + eli: "e", + ousli: "ous", + ization: "ize", + ation: "ate", + ator: "ate", + alism: "al", + iveness: "ive", + fulness: "ful", + ousness: "ous", + aliti: "al", + iviti: "ive", + biliti: "ble", + logi: "log" + }, u = { + icate: "ic", + ative: "", + alize: "al", + iciti: "ic", + ical: "ic", + ful: "", + ness: "" + }, e = "[aeiouy]", n = "[^aeiou][^aeiouy]*", f = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*"), d = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*[aeiouy][aeiou]*[^aeiou][^aeiouy]*"), h = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*([aeiouy][aeiou]*)?$"), p = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy]"), m = /^(.+?)(ss|i)es$/, y = /^(.+?)([^s])s$/, v = /^(.+?)eed$/, g = /^(.+?)(ed|ing)$/, w = /.$/, _ = /(at|bl|iz)$/, E = new RegExp("([^aeiouylsz])\\1$"), x = new RegExp("^" + n + e + "[^aeiouwxy]$"), b = /^(.+?[^aeiou])y$/, k = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/, S = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/, T = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/, L = /^(.+?)(s|t)(ion)$/, R = /^(.+?)e$/, O = /ll$/, C = new RegExp("^" + n + e + "[^aeiouwxy]$"), r = function(e) { + var t, n, r, i, o, a, s; + if (e.length < 3) return e; + if ("y" == (r = e.substr(0, 1)) && (e = r.toUpperCase() + e.substr(1)), o = y, (i = m).test(e) ? e = e.replace(i, "$1$2") : o.test(e) && (e = e.replace(o, "$1$2")), o = g, (i = v).test(e)) { + var c = i.exec(e); + (i = f).test(c[1]) && (i = w, e = e.replace(i, "")) + } else if (o.test(e)) { + t = (c = o.exec(e))[1], (o = p).test(t) && (a = E, s = x, (o = _).test(e = t) ? e += "e" : a.test(e) ? (i = w, e = e.replace(i, "")) : s.test(e) && (e += "e")) + }(i = b).test(e) && (e = (t = (c = i.exec(e))[1]) + "i"); + (i = k).test(e) && (t = (c = i.exec(e))[1], n = c[2], (i = f).test(t) && (e = t + l[n])); + (i = S).test(e) && (t = (c = i.exec(e))[1], n = c[2], (i = f).test(t) && (e = t + u[n])); + if (o = L, (i = T).test(e)) t = (c = i.exec(e))[1], (i = d).test(t) && (e = t); + else if (o.test(e)) { + t = (c = o.exec(e))[1] + c[2], (o = d).test(t) && (e = t) + }(i = R).test(e) && (t = (c = i.exec(e))[1], o = h, a = C, ((i = d).test(t) || o.test(t) && !a.test(t)) && (e = t)); + return o = d, (i = O).test(e) && o.test(e) && (i = w, e = e.replace(i, "")), "y" == r && (e = r.toLowerCase() + e.substr(1)), e + }, function(e) { + return e.update(r) + }), D.Pipeline.registerFunction(D.stemmer, "stemmer"), D.generateStopWordFilter = function(e) { + var t = e.reduce(function(e, t) { + return e[t] = t, e + }, {}); + return function(e) { + if (e && t[e.toString()] !== e.toString()) return e + } + }, D.stopWordFilter = D.generateStopWordFilter(["a", "able", "about", "across", "after", "all", "almost", "also", "am", "among", "an", "and", "any", "are", "as", "at", "be", "because", "been", "but", "by", "can", "cannot", "could", "dear", "did", "do", "does", "either", "else", "ever", "every", "for", "from", "get", "got", "had", "has", "have", "he", "her", "hers", "him", "his", "how", "however", "i", "if", "in", "into", "is", "it", "its", "just", "least", "let", "like", "likely", "may", "me", "might", "most", "must", "my", "neither", "no", "nor", "not", "of", "off", "often", "on", "only", "or", "other", "our", "own", "rather", "said", "say", "says", "she", "should", "since", "so", "some", "than", "that", "the", "their", "them", "then", "there", "these", "they", "this", "tis", "to", "too", "twas", "us", "wants", "was", "we", "were", "what", "when", "where", "which", "while", "who", "whom", "why", "will", "with", "would", "yet", "you", "your"]), D.Pipeline.registerFunction(D.stopWordFilter, "stopWordFilter"), D.trimmer = function(e) { + return e.update(function(e) { + return e.replace(/^\W+/, "").replace(/\W+$/, "") + }) + }, D.Pipeline.registerFunction(D.trimmer, "trimmer"), D.TokenSet = function() { + this.final = !1, this.edges = {}, this.id = D.TokenSet._nextId, D.TokenSet._nextId += 1 + }, D.TokenSet._nextId = 1, D.TokenSet.fromArray = function(e) { + for (var t = new D.TokenSet.Builder, n = 0, r = e.length; n < r; n++) t.insert(e[n]); + return t.finish(), t.root + }, D.TokenSet.fromClause = function(e) { + return "editDistance" in e ? D.TokenSet.fromFuzzyString(e.term, e.editDistance) : D.TokenSet.fromString(e.term) + }, D.TokenSet.fromFuzzyString = function(e, t) { + for (var n = new D.TokenSet, r = [{ + node: n, + editsRemaining: t, + str: e + }]; r.length;) { + var i = r.pop(); + if (0 < i.str.length) { + var o, a = i.str.charAt(0); + a in i.node.edges ? o = i.node.edges[a] : (o = new D.TokenSet, i.node.edges[a] = o), 1 == i.str.length && (o.final = !0), r.push({ + node: o, + editsRemaining: i.editsRemaining, + str: i.str.slice(1) + }) + } + if (0 != i.editsRemaining) { + if ("*" in i.node.edges) var s = i.node.edges["*"]; + else { + s = new D.TokenSet; + i.node.edges["*"] = s + } + if (0 == i.str.length && (s.final = !0), r.push({ + node: s, + editsRemaining: i.editsRemaining - 1, + str: i.str + }), 1 < i.str.length && r.push({ + node: i.node, + editsRemaining: i.editsRemaining - 1, + str: i.str.slice(1) + }), 1 == i.str.length && (i.node.final = !0), 1 <= i.str.length) { + if ("*" in i.node.edges) var c = i.node.edges["*"]; + else { + c = new D.TokenSet; + i.node.edges["*"] = c + } + 1 == i.str.length && (c.final = !0), r.push({ + node: c, + editsRemaining: i.editsRemaining - 1, + str: i.str.slice(1) + }) + } + if (1 < i.str.length) { + var l, u = i.str.charAt(0), + f = i.str.charAt(1); + f in i.node.edges ? l = i.node.edges[f] : (l = new D.TokenSet, i.node.edges[f] = l), 1 == i.str.length && (l.final = !0), r.push({ + node: l, + editsRemaining: i.editsRemaining - 1, + str: u + i.str.slice(2) + }) + } + } + } + return n + }, D.TokenSet.fromString = function(e) { + for (var t = new D.TokenSet, n = t, r = 0, i = e.length; r < i; r++) { + var o = e[r], + a = r == i - 1; + if ("*" == o)(t.edges[o] = t).final = a; + else { + var s = new D.TokenSet; + s.final = a, t.edges[o] = s, t = s + } + } + return n + }, D.TokenSet.prototype.toArray = function() { + for (var e = [], t = [{ + prefix: "", + node: this + }]; t.length;) { + var n = t.pop(), + r = Object.keys(n.node.edges), + i = r.length; + n.node.final && (n.prefix.charAt(0), e.push(n.prefix)); + for (var o = 0; o < i; o++) { + var a = r[o]; + t.push({ + prefix: n.prefix.concat(a), + node: n.node.edges[a] + }) + } + } + return e + }, D.TokenSet.prototype.toString = function() { + if (this._str) return this._str; + for (var e = this.final ? "1" : "0", t = Object.keys(this.edges).sort(), n = t.length, r = 0; r < n; r++) { + var i = t[r]; + e = e + i + this.edges[i].id + } + return e + }, D.TokenSet.prototype.intersect = function(e) { + for (var t = new D.TokenSet, n = void 0, r = [{ + qNode: e, + output: t, + node: this + }]; r.length;) { + n = r.pop(); + for (var i = Object.keys(n.qNode.edges), o = i.length, a = Object.keys(n.node.edges), s = a.length, c = 0; c < o; c++) + for (var l = i[c], u = 0; u < s; u++) { + var f = a[u]; + if (f == l || "*" == l) { + var d = n.node.edges[f], + h = n.qNode.edges[l], + p = d.final && h.final, + m = void 0; + f in n.output.edges ? (m = n.output.edges[f]).final = m.final || p : ((m = new D.TokenSet).final = p, n.output.edges[f] = m), r.push({ + qNode: h, + output: m, + node: d + }) + } + } + } + return t + }, D.TokenSet.Builder = function() { + this.previousWord = "", this.root = new D.TokenSet, this.uncheckedNodes = [], this.minimizedNodes = {} + }, D.TokenSet.Builder.prototype.insert = function(e) { + var t, n = 0; + if (e < this.previousWord) throw new Error("Out of order word insertion"); + for (var r = 0; r < e.length && r < this.previousWord.length && e[r] == this.previousWord[r]; r++) n++; + this.minimize(n), t = 0 == this.uncheckedNodes.length ? this.root : this.uncheckedNodes[this.uncheckedNodes.length - 1].child; + for (r = n; r < e.length; r++) { + var i = new D.TokenSet, + o = e[r]; + t.edges[o] = i, this.uncheckedNodes.push({ + parent: t, + char: o, + child: i + }), t = i + } + t.final = !0, this.previousWord = e + }, D.TokenSet.Builder.prototype.finish = function() { + this.minimize(0) + }, D.TokenSet.Builder.prototype.minimize = function(e) { + for (var t = this.uncheckedNodes.length - 1; e <= t; t--) { + var n = this.uncheckedNodes[t], + r = n.child.toString(); + r in this.minimizedNodes ? n.parent.edges[n.char] = this.minimizedNodes[r] : (n.child._str = r, this.minimizedNodes[r] = n.child), this.uncheckedNodes.pop() + } + }, D.Index = function(e) { + this.invertedIndex = e.invertedIndex, this.fieldVectors = e.fieldVectors, this.tokenSet = e.tokenSet, this.fields = e.fields, this.pipeline = e.pipeline + }, D.Index.prototype.search = function(t) { + return this.query(function(e) { + new D.QueryParser(t, e).parse() + }) + }, D.Index.prototype.query = function(e) { + for (var t = new D.Query(this.fields), n = Object.create(null), r = Object.create(null), i = Object.create(null), o = Object.create(null), a = Object.create(null), s = 0; s < this.fields.length; s++) r[this.fields[s]] = new D.Vector; + e.call(t, t); + for (s = 0; s < t.clauses.length; s++) { + var c = t.clauses[s], + l = null, + u = D.Set.complete; + l = c.usePipeline ? this.pipeline.runString(c.term, { + fields: c.fields + }) : [c.term]; + for (var f = 0; f < l.length; f++) { + var d = l[f]; + c.term = d; + var h = D.TokenSet.fromClause(c), + p = this.tokenSet.intersect(h).toArray(); + if (0 === p.length && c.presence === D.Query.presence.REQUIRED) { + for (var m = 0; m < c.fields.length; m++) { + o[Q = c.fields[m]] = D.Set.empty + } + break + } + for (var y = 0; y < p.length; y++) { + var v = p[y], + g = this.invertedIndex[v], + w = g._index; + for (m = 0; m < c.fields.length; m++) { + var _ = g[Q = c.fields[m]], + E = Object.keys(_), + x = v + "/" + Q, + b = new D.Set(E); + if (c.presence == D.Query.presence.REQUIRED && (u = u.union(b), void 0 === o[Q] && (o[Q] = D.Set.complete)), c.presence != D.Query.presence.PROHIBITED) { + if (r[Q].upsert(w, c.boost, function(e, t) { + return e + t + }), !i[x]) { + for (var k = 0; k < E.length; k++) { + var S, T = E[k], + L = new D.FieldRef(T, Q), + R = _[T]; + void 0 === (S = n[L]) ? n[L] = new D.MatchData(v, Q, R) : S.add(v, Q, R) + } + i[x] = !0 + } + } else void 0 === a[Q] && (a[Q] = D.Set.empty), a[Q] = a[Q].union(b) + } + } + } + if (c.presence === D.Query.presence.REQUIRED) + for (m = 0; m < c.fields.length; m++) { + o[Q = c.fields[m]] = o[Q].intersect(u) + } + } + var O = D.Set.complete, + C = D.Set.empty; + for (s = 0; s < this.fields.length; s++) { + var Q; + o[Q = this.fields[s]] && (O = O.intersect(o[Q])), a[Q] && (C = C.union(a[Q])) + } + var P = Object.keys(n), + A = [], + I = Object.create(null); + if (t.isNegated()) { + P = Object.keys(this.fieldVectors); + for (s = 0; s < P.length; s++) { + L = P[s]; + var M = D.FieldRef.fromString(L); + n[L] = new D.MatchData + } + } + for (s = 0; s < P.length; s++) { + var N = (M = D.FieldRef.fromString(P[s])).docRef; + if (O.contains(N) && !C.contains(N)) { + var j, F = this.fieldVectors[M], + H = r[M.fieldName].similarity(F); + if (void 0 !== (j = I[N])) j.score += H, j.matchData.combine(n[M]); + else { + var q = { + ref: N, + score: H, + matchData: n[M] + }; + I[N] = q, A.push(q) + } + } + } + return A.sort(function(e, t) { + return t.score - e.score + }) + }, D.Index.prototype.toJSON = function() { + var e = Object.keys(this.invertedIndex).sort().map(function(e) { + return [e, this.invertedIndex[e]] + }, this), + t = Object.keys(this.fieldVectors).map(function(e) { + return [e, this.fieldVectors[e].toJSON()] + }, this); + return { + version: D.version, + fields: this.fields, + fieldVectors: t, + invertedIndex: e, + pipeline: this.pipeline.toJSON() + } + }, D.Index.load = function(e) { + var t = {}, + n = {}, + r = e.fieldVectors, + i = Object.create(null), + o = e.invertedIndex, + a = new D.TokenSet.Builder, + s = D.Pipeline.load(e.pipeline); + e.version != D.version && D.utils.warn("Version mismatch when loading serialised index. Current version of lunr '" + D.version + "' does not match serialized index '" + e.version + "'"); + for (var c = 0; c < r.length; c++) { + var l = (f = r[c])[0], + u = f[1]; + n[l] = new D.Vector(u) + } + for (c = 0; c < o.length; c++) { + var f, d = (f = o[c])[0], + h = f[1]; + a.insert(d), i[d] = h + } + return a.finish(), t.fields = e.fields, t.fieldVectors = n, t.invertedIndex = i, t.tokenSet = a.root, t.pipeline = s, new D.Index(t) + }, D.Builder = function() { + this._ref = "id", this._fields = Object.create(null), this._documents = Object.create(null), this.invertedIndex = Object.create(null), this.fieldTermFrequencies = {}, this.fieldLengths = {}, this.tokenizer = D.tokenizer, this.pipeline = new D.Pipeline, this.searchPipeline = new D.Pipeline, this.documentCount = 0, this._b = .75, this._k1 = 1.2, this.termIndex = 0, this.metadataWhitelist = [] + }, D.Builder.prototype.ref = function(e) { + this._ref = e + }, D.Builder.prototype.field = function(e, t) { + if (/\//.test(e)) throw new RangeError("Field '" + e + "' contains illegal character '/'"); + this._fields[e] = t || {} + }, D.Builder.prototype.b = function(e) { + this._b = e < 0 ? 0 : 1 < e ? 1 : e + }, D.Builder.prototype.k1 = function(e) { + this._k1 = e + }, D.Builder.prototype.add = function(e, t) { + var n = e[this._ref], + r = Object.keys(this._fields); + this._documents[n] = t || {}, this.documentCount += 1; + for (var i = 0; i < r.length; i++) { + var o = r[i], + a = this._fields[o].extractor, + s = a ? a(e) : e[o], + c = this.tokenizer(s, { + fields: [o] + }), + l = this.pipeline.run(c), + u = new D.FieldRef(n, o), + f = Object.create(null); + this.fieldTermFrequencies[u] = f, this.fieldLengths[u] = 0, this.fieldLengths[u] += l.length; + for (var d = 0; d < l.length; d++) { + var h = l[d]; + if (null == f[h] && (f[h] = 0), f[h] += 1, null == this.invertedIndex[h]) { + var p = Object.create(null); + p._index = this.termIndex, this.termIndex += 1; + for (var m = 0; m < r.length; m++) p[r[m]] = Object.create(null); + this.invertedIndex[h] = p + } + null == this.invertedIndex[h][o][n] && (this.invertedIndex[h][o][n] = Object.create(null)); + for (var y = 0; y < this.metadataWhitelist.length; y++) { + var v = this.metadataWhitelist[y], + g = h.metadata[v]; + null == this.invertedIndex[h][o][n][v] && (this.invertedIndex[h][o][n][v] = []), this.invertedIndex[h][o][n][v].push(g) + } + } + } + }, D.Builder.prototype.calculateAverageFieldLengths = function() { + for (var e = Object.keys(this.fieldLengths), t = e.length, n = {}, r = {}, i = 0; i < t; i++) { + var o = D.FieldRef.fromString(e[i]), + a = o.fieldName; + r[a] || (r[a] = 0), r[a] += 1, n[a] || (n[a] = 0), n[a] += this.fieldLengths[o] + } + var s = Object.keys(this._fields); + for (i = 0; i < s.length; i++) { + var c = s[i]; + n[c] = n[c] / r[c] + } + this.averageFieldLength = n + }, D.Builder.prototype.createFieldVectors = function() { + for (var e = {}, t = Object.keys(this.fieldTermFrequencies), n = t.length, r = Object.create(null), i = 0; i < n; i++) { + for (var o = D.FieldRef.fromString(t[i]), a = o.fieldName, s = this.fieldLengths[o], c = new D.Vector, l = this.fieldTermFrequencies[o], u = Object.keys(l), f = u.length, d = this._fields[a].boost || 1, h = this._documents[o.docRef].boost || 1, p = 0; p < f; p++) { + var m, y, v, g = u[p], + w = l[g], + _ = this.invertedIndex[g]._index; + void 0 === r[g] ? (m = D.idf(this.invertedIndex[g], this.documentCount), r[g] = m) : m = r[g], y = m * ((this._k1 + 1) * w) / (this._k1 * (1 - this._b + this._b * (s / this.averageFieldLength[a])) + w), y *= d, y *= h, v = Math.round(1e3 * y) / 1e3, c.insert(_, v) + } + e[o] = c + } + this.fieldVectors = e + }, D.Builder.prototype.createTokenSet = function() { + this.tokenSet = D.TokenSet.fromArray(Object.keys(this.invertedIndex).sort()) + }, D.Builder.prototype.build = function() { + return this.calculateAverageFieldLengths(), this.createFieldVectors(), this.createTokenSet(), new D.Index({ + invertedIndex: this.invertedIndex, + fieldVectors: this.fieldVectors, + tokenSet: this.tokenSet, + fields: Object.keys(this._fields), + pipeline: this.searchPipeline + }) + }, D.Builder.prototype.use = function(e) { + var t = Array.prototype.slice.call(arguments, 1); + t.unshift(this), e.apply(this, t) + }, D.MatchData = function(e, t, n) { + for (var r = Object.create(null), i = Object.keys(n || {}), o = 0; o < i.length; o++) { + var a = i[o]; + r[a] = n[a].slice() + } + this.metadata = Object.create(null), void 0 !== e && (this.metadata[e] = Object.create(null), this.metadata[e][t] = r) + }, D.MatchData.prototype.combine = function(e) { + for (var t = Object.keys(e.metadata), n = 0; n < t.length; n++) { + var r = t[n], + i = Object.keys(e.metadata[r]); + null == this.metadata[r] && (this.metadata[r] = Object.create(null)); + for (var o = 0; o < i.length; o++) { + var a = i[o], + s = Object.keys(e.metadata[r][a]); + null == this.metadata[r][a] && (this.metadata[r][a] = Object.create(null)); + for (var c = 0; c < s.length; c++) { + var l = s[c]; + null == this.metadata[r][a][l] ? this.metadata[r][a][l] = e.metadata[r][a][l] : this.metadata[r][a][l] = this.metadata[r][a][l].concat(e.metadata[r][a][l]) + } + } + } + }, D.MatchData.prototype.add = function(e, t, n) { + if (!(e in this.metadata)) return this.metadata[e] = Object.create(null), void(this.metadata[e][t] = n); + if (t in this.metadata[e]) + for (var r = Object.keys(n), i = 0; i < r.length; i++) { + var o = r[i]; + o in this.metadata[e][t] ? this.metadata[e][t][o] = this.metadata[e][t][o].concat(n[o]) : this.metadata[e][t][o] = n[o] + } else this.metadata[e][t] = n + }, D.Query = function(e) { + this.clauses = [], this.allFields = e + }, D.Query.wildcard = new String("*"), D.Query.wildcard.NONE = 0, D.Query.wildcard.LEADING = 1, D.Query.wildcard.TRAILING = 2, D.Query.presence = { + OPTIONAL: 1, + REQUIRED: 2, + PROHIBITED: 3 + }, D.Query.prototype.clause = function(e) { + return "fields" in e || (e.fields = this.allFields), "boost" in e || (e.boost = 1), "usePipeline" in e || (e.usePipeline = !0), "wildcard" in e || (e.wildcard = D.Query.wildcard.NONE), e.wildcard & D.Query.wildcard.LEADING && e.term.charAt(0) != D.Query.wildcard && (e.term = "*" + e.term), e.wildcard & D.Query.wildcard.TRAILING && e.term.slice(-1) != D.Query.wildcard && (e.term = e.term + "*"), "presence" in e || (e.presence = D.Query.presence.OPTIONAL), this.clauses.push(e), this + }, D.Query.prototype.isNegated = function() { + for (var e = 0; e < this.clauses.length; e++) + if (this.clauses[e].presence != D.Query.presence.PROHIBITED) return !1; + return !0 + }, D.Query.prototype.term = function(e, t) { + if (Array.isArray(e)) return e.forEach(function(e) { + this.term(e, D.utils.clone(t)) + }, this), this; + var n = t || {}; + return n.term = e.toString(), this.clause(n), this + }, D.QueryParseError = function(e, t, n) { + this.name = "QueryParseError", this.message = e, this.start = t, this.end = n + }, D.QueryParseError.prototype = new Error, D.QueryLexer = function(e) { + this.lexemes = [], this.str = e, this.length = e.length, this.pos = 0, this.start = 0, this.escapeCharPositions = [] + }, D.QueryLexer.prototype.run = function() { + for (var e = D.QueryLexer.lexText; e;) e = e(this) + }, D.QueryLexer.prototype.sliceString = function() { + for (var e = [], t = this.start, n = this.pos, r = 0; r < this.escapeCharPositions.length; r++) n = this.escapeCharPositions[r], e.push(this.str.slice(t, n)), t = n + 1; + return e.push(this.str.slice(t, this.pos)), this.escapeCharPositions.length = 0, e.join("") + }, D.QueryLexer.prototype.emit = function(e) { + this.lexemes.push({ + type: e, + str: this.sliceString(), + start: this.start, + end: this.pos + }), this.start = this.pos + }, D.QueryLexer.prototype.escapeCharacter = function() { + this.escapeCharPositions.push(this.pos - 1), this.pos += 1 + }, D.QueryLexer.prototype.next = function() { + if (this.pos >= this.length) return D.QueryLexer.EOS; + var e = this.str.charAt(this.pos); + return this.pos += 1, e + }, D.QueryLexer.prototype.width = function() { + return this.pos - this.start + }, D.QueryLexer.prototype.ignore = function() { + this.start == this.pos && (this.pos += 1), this.start = this.pos + }, D.QueryLexer.prototype.backup = function() { + this.pos -= 1 + }, D.QueryLexer.prototype.acceptDigitRun = function() { + for (var e, t; 47 < (t = (e = this.next()).charCodeAt(0)) && t < 58;); + e != D.QueryLexer.EOS && this.backup() + }, D.QueryLexer.prototype.more = function() { + return this.pos < this.length + }, D.QueryLexer.EOS = "EOS", D.QueryLexer.FIELD = "FIELD", D.QueryLexer.TERM = "TERM", D.QueryLexer.EDIT_DISTANCE = "EDIT_DISTANCE", D.QueryLexer.BOOST = "BOOST", D.QueryLexer.PRESENCE = "PRESENCE", D.QueryLexer.lexField = function(e) { + return e.backup(), e.emit(D.QueryLexer.FIELD), e.ignore(), D.QueryLexer.lexText + }, D.QueryLexer.lexTerm = function(e) { + if (1 < e.width() && (e.backup(), e.emit(D.QueryLexer.TERM)), e.ignore(), e.more()) return D.QueryLexer.lexText + }, D.QueryLexer.lexEditDistance = function(e) { + return e.ignore(), e.acceptDigitRun(), e.emit(D.QueryLexer.EDIT_DISTANCE), D.QueryLexer.lexText + }, D.QueryLexer.lexBoost = function(e) { + return e.ignore(), e.acceptDigitRun(), e.emit(D.QueryLexer.BOOST), D.QueryLexer.lexText + }, D.QueryLexer.lexEOS = function(e) { + 0 < e.width() && e.emit(D.QueryLexer.TERM) + }, D.QueryLexer.termSeparator = D.tokenizer.separator, D.QueryLexer.lexText = function(e) { + for (;;) { + var t = e.next(); + if (t == D.QueryLexer.EOS) return D.QueryLexer.lexEOS; + if (92 != t.charCodeAt(0)) { + if (":" == t) return D.QueryLexer.lexField; + if ("~" == t) return e.backup(), 0 < e.width() && e.emit(D.QueryLexer.TERM), D.QueryLexer.lexEditDistance; + if ("^" == t) return e.backup(), 0 < e.width() && e.emit(D.QueryLexer.TERM), D.QueryLexer.lexBoost; + if ("+" == t && 1 === e.width()) return e.emit(D.QueryLexer.PRESENCE), D.QueryLexer.lexText; + if ("-" == t && 1 === e.width()) return e.emit(D.QueryLexer.PRESENCE), D.QueryLexer.lexText; + if (t.match(D.QueryLexer.termSeparator)) return D.QueryLexer.lexTerm + } else e.escapeCharacter() + } + }, D.QueryParser = function(e, t) { + this.lexer = new D.QueryLexer(e), this.query = t, this.currentClause = {}, this.lexemeIdx = 0 + }, D.QueryParser.prototype.parse = function() { + this.lexer.run(), this.lexemes = this.lexer.lexemes; + for (var e = D.QueryParser.parseClause; e;) e = e(this); + return this.query + }, D.QueryParser.prototype.peekLexeme = function() { + return this.lexemes[this.lexemeIdx] + }, D.QueryParser.prototype.consumeLexeme = function() { + var e = this.peekLexeme(); + return this.lexemeIdx += 1, e + }, D.QueryParser.prototype.nextClause = function() { + var e = this.currentClause; + this.query.clause(e), this.currentClause = {} + }, D.QueryParser.parseClause = function(e) { + var t = e.peekLexeme(); + if (null != t) switch (t.type) { + case D.QueryLexer.PRESENCE: + return D.QueryParser.parsePresence; + case D.QueryLexer.FIELD: + return D.QueryParser.parseField; + case D.QueryLexer.TERM: + return D.QueryParser.parseTerm; + default: + var n = "expected either a field or a term, found " + t.type; + throw 1 <= t.str.length && (n += " with value '" + t.str + "'"), new D.QueryParseError(n, t.start, t.end) + } + }, D.QueryParser.parsePresence = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + switch (t.str) { + case "-": + e.currentClause.presence = D.Query.presence.PROHIBITED; + break; + case "+": + e.currentClause.presence = D.Query.presence.REQUIRED; + break; + default: + var n = "unrecognised presence operator'" + t.str + "'"; + throw new D.QueryParseError(n, t.start, t.end) + } + var r = e.peekLexeme(); + if (null == r) { + n = "expecting term or field, found nothing"; + throw new D.QueryParseError(n, t.start, t.end) + } + switch (r.type) { + case D.QueryLexer.FIELD: + return D.QueryParser.parseField; + case D.QueryLexer.TERM: + return D.QueryParser.parseTerm; + default: + n = "expecting term or field, found '" + r.type + "'"; + throw new D.QueryParseError(n, r.start, r.end) + } + } + }, D.QueryParser.parseField = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + if (-1 == e.query.allFields.indexOf(t.str)) { + var n = e.query.allFields.map(function(e) { + return "'" + e + "'" + }).join(", "), + r = "unrecognised field '" + t.str + "', possible fields: " + n; + throw new D.QueryParseError(r, t.start, t.end) + } + e.currentClause.fields = [t.str]; + var i = e.peekLexeme(); + if (null == i) { + r = "expecting term, found nothing"; + throw new D.QueryParseError(r, t.start, t.end) + } + switch (i.type) { + case D.QueryLexer.TERM: + return D.QueryParser.parseTerm; + default: + r = "expecting term, found '" + i.type + "'"; + throw new D.QueryParseError(r, i.start, i.end) + } + } + }, D.QueryParser.parseTerm = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + e.currentClause.term = t.str.toLowerCase(), -1 != t.str.indexOf("*") && (e.currentClause.usePipeline = !1); + var n = e.peekLexeme(); + if (null != n) switch (n.type) { + case D.QueryLexer.TERM: + return e.nextClause(), D.QueryParser.parseTerm; + case D.QueryLexer.FIELD: + return e.nextClause(), D.QueryParser.parseField; + case D.QueryLexer.EDIT_DISTANCE: + return D.QueryParser.parseEditDistance; + case D.QueryLexer.BOOST: + return D.QueryParser.parseBoost; + case D.QueryLexer.PRESENCE: + return e.nextClause(), D.QueryParser.parsePresence; + default: + var r = "Unexpected lexeme type '" + n.type + "'"; + throw new D.QueryParseError(r, n.start, n.end) + } else e.nextClause() + } + }, D.QueryParser.parseEditDistance = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + var n = parseInt(t.str, 10); + if (isNaN(n)) { + var r = "edit distance must be numeric"; + throw new D.QueryParseError(r, t.start, t.end) + } + e.currentClause.editDistance = n; + var i = e.peekLexeme(); + if (null != i) switch (i.type) { + case D.QueryLexer.TERM: + return e.nextClause(), D.QueryParser.parseTerm; + case D.QueryLexer.FIELD: + return e.nextClause(), D.QueryParser.parseField; + case D.QueryLexer.EDIT_DISTANCE: + return D.QueryParser.parseEditDistance; + case D.QueryLexer.BOOST: + return D.QueryParser.parseBoost; + case D.QueryLexer.PRESENCE: + return e.nextClause(), D.QueryParser.parsePresence; + default: + r = "Unexpected lexeme type '" + i.type + "'"; + throw new D.QueryParseError(r, i.start, i.end) + } else e.nextClause() + } + }, D.QueryParser.parseBoost = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + var n = parseInt(t.str, 10); + if (isNaN(n)) { + var r = "boost must be numeric"; + throw new D.QueryParseError(r, t.start, t.end) + } + e.currentClause.boost = n; + var i = e.peekLexeme(); + if (null != i) switch (i.type) { + case D.QueryLexer.TERM: + return e.nextClause(), D.QueryParser.parseTerm; + case D.QueryLexer.FIELD: + return e.nextClause(), D.QueryParser.parseField; + case D.QueryLexer.EDIT_DISTANCE: + return D.QueryParser.parseEditDistance; + case D.QueryLexer.BOOST: + return D.QueryParser.parseBoost; + case D.QueryLexer.PRESENCE: + return e.nextClause(), D.QueryParser.parsePresence; + default: + r = "Unexpected lexeme type '" + i.type + "'"; + throw new D.QueryParseError(r, i.start, i.end) + } else e.nextClause() + } + }, void 0 === (c = "function" == typeof(s = function() { + return D + }) ? s.call(o, a, o, i) : s) || (i.exports = c) + }() +}])); \ No newline at end of file diff --git a/docs/api/py/_static/javascripts/lunr/lunr.da.js b/docs/api/py/_static/javascripts/lunr/lunr.da.js new file mode 100644 index 0000000000000..34910dfe5faba --- /dev/null +++ b/docs/api/py/_static/javascripts/lunr/lunr.da.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,m,i;e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWordFilter,e.da.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.da.stemmer))},e.da.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.da.trimmer=e.trimmerSupport.generateTrimmer(e.da.wordCharacters),e.Pipeline.registerFunction(e.da.trimmer,"trimmer-da"),e.da.stemmer=(r=e.stemmerSupport.Among,m=e.stemmerSupport.SnowballProgram,i=new function(){var i,t,n,s=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],o=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],a=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],u=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],c=new m;function l(){var e,r=c.limit-c.cursor;c.cursor>=t&&(e=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,c.find_among_b(o,4)?(c.bra=c.cursor,c.limit_backward=e,c.cursor=c.limit-r,c.cursor>c.limit_backward&&(c.cursor--,c.bra=c.cursor,c.slice_del())):c.limit_backward=e)}this.setCurrent=function(e){c.setCurrent(e)},this.getCurrent=function(){return c.getCurrent()},this.stem=function(){var e,r=c.cursor;return function(){var e,r=c.cursor+3;if(t=c.limit,0<=r&&r<=c.limit){for(i=r;;){if(e=c.cursor,c.in_grouping(d,97,248)){c.cursor=e;break}if((c.cursor=e)>=c.limit)return;c.cursor++}for(;!c.out_grouping(d,97,248);){if(c.cursor>=c.limit)return;c.cursor++}(t=c.cursor)=t&&(r=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,e=c.find_among_b(s,32),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del();break;case 2:c.in_grouping_b(u,97,229)&&c.slice_del()}}(),c.cursor=c.limit,l(),c.cursor=c.limit,function(){var e,r,i,n=c.limit-c.cursor;if(c.ket=c.cursor,c.eq_s_b(2,"st")&&(c.bra=c.cursor,c.eq_s_b(2,"ig")&&c.slice_del()),c.cursor=c.limit-n,c.cursor>=t&&(r=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,e=c.find_among_b(a,5),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del(),i=c.limit-c.cursor,l(),c.cursor=c.limit-i;break;case 2:c.slice_from("løs")}}(),c.cursor=c.limit,c.cursor>=t&&(e=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,c.out_grouping_b(d,97,248)?(c.bra=c.cursor,n=c.slice_to(n),c.limit_backward=e,c.eq_v_b(n)&&c.slice_del()):c.limit_backward=e),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}}); \ No newline at end of file diff --git a/docs/api/py/_static/javascripts/lunr/lunr.de.js b/docs/api/py/_static/javascripts/lunr/lunr.de.js new file mode 100644 index 0000000000000..1529892c823df --- /dev/null +++ b/docs/api/py/_static/javascripts/lunr/lunr.de.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var _,p,r;e.de=function(){this.pipeline.reset(),this.pipeline.add(e.de.trimmer,e.de.stopWordFilter,e.de.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.de.stemmer))},e.de.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.de.trimmer=e.trimmerSupport.generateTrimmer(e.de.wordCharacters),e.Pipeline.registerFunction(e.de.trimmer,"trimmer-de"),e.de.stemmer=(_=e.stemmerSupport.Among,p=e.stemmerSupport.SnowballProgram,r=new function(){var r,n,i,s=[new _("",-1,6),new _("U",0,2),new _("Y",0,1),new _("ä",0,3),new _("ö",0,4),new _("ü",0,5)],o=[new _("e",-1,2),new _("em",-1,1),new _("en",-1,2),new _("ern",-1,1),new _("er",-1,1),new _("s",-1,3),new _("es",5,2)],c=[new _("en",-1,1),new _("er",-1,1),new _("st",-1,2),new _("est",2,1)],u=[new _("ig",-1,1),new _("lich",-1,1)],a=[new _("end",-1,1),new _("ig",-1,2),new _("ung",-1,1),new _("lich",-1,3),new _("isch",-1,2),new _("ik",-1,2),new _("heit",-1,3),new _("keit",-1,4)],t=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32,8],d=[117,30,5],l=[117,30,4],m=new p;function h(e,r,n){return!(!m.eq_s(1,e)||(m.ket=m.cursor,!m.in_grouping(t,97,252)))&&(m.slice_from(r),m.cursor=n,!0)}function w(){for(;!m.in_grouping(t,97,252);){if(m.cursor>=m.limit)return!0;m.cursor++}for(;!m.out_grouping(t,97,252);){if(m.cursor>=m.limit)return!0;m.cursor++}return!1}function f(){return i<=m.cursor}function b(){return n<=m.cursor}this.setCurrent=function(e){m.setCurrent(e)},this.getCurrent=function(){return m.getCurrent()},this.stem=function(){var e=m.cursor;return function(){for(var e,r,n,i,s=m.cursor;;)if(e=m.cursor,m.bra=e,m.eq_s(1,"ß"))m.ket=m.cursor,m.slice_from("ss");else{if(e>=m.limit)break;m.cursor=e+1}for(m.cursor=s;;)for(r=m.cursor;;){if(n=m.cursor,m.in_grouping(t,97,252)){if(i=m.cursor,m.bra=i,h("u","U",n))break;if(m.cursor=i,h("y","Y",n))break}if(n>=m.limit)return m.cursor=r;m.cursor=n+1}}(),m.cursor=e,function(){i=m.limit,n=i;var e=m.cursor+3;0<=e&&e<=m.limit&&(r=e,w()||((i=m.cursor)=m.limit)return;m.cursor++}}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.de.stemmer,"stemmer-de"),e.de.stopWordFilter=e.generateStopWordFilter("aber alle allem allen aller alles als also am an ander andere anderem anderen anderer anderes anderm andern anderr anders auch auf aus bei bin bis bist da damit dann das dasselbe dazu daß dein deine deinem deinen deiner deines dem demselben den denn denselben der derer derselbe derselben des desselben dessen dich die dies diese dieselbe dieselben diesem diesen dieser dieses dir doch dort du durch ein eine einem einen einer eines einig einige einigem einigen einiger einiges einmal er es etwas euch euer eure eurem euren eurer eures für gegen gewesen hab habe haben hat hatte hatten hier hin hinter ich ihm ihn ihnen ihr ihre ihrem ihren ihrer ihres im in indem ins ist jede jedem jeden jeder jedes jene jenem jenen jener jenes jetzt kann kein keine keinem keinen keiner keines können könnte machen man manche manchem manchen mancher manches mein meine meinem meinen meiner meines mich mir mit muss musste nach nicht nichts noch nun nur ob oder ohne sehr sein seine seinem seinen seiner seines selbst sich sie sind so solche solchem solchen solcher solches soll sollte sondern sonst um und uns unse unsem unsen unser unses unter viel vom von vor war waren warst was weg weil weiter welche welchem welchen welcher welches wenn werde werden wie wieder will wir wird wirst wo wollen wollte während würde würden zu zum zur zwar zwischen über".split(" ")),e.Pipeline.registerFunction(e.de.stopWordFilter,"stopWordFilter-de")}}); \ No newline at end of file diff --git a/docs/api/py/_static/javascripts/lunr/lunr.du.js b/docs/api/py/_static/javascripts/lunr/lunr.du.js new file mode 100644 index 0000000000000..52632004a2414 --- /dev/null +++ b/docs/api/py/_static/javascripts/lunr/lunr.du.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var v,q,r;console.warn('[Lunr Languages] Please use the "nl" instead of the "du". The "nl" code is the standard code for Dutch language, and "du" will be removed in the next major versions.'),e.du=function(){this.pipeline.reset(),this.pipeline.add(e.du.trimmer,e.du.stopWordFilter,e.du.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.du.stemmer))},e.du.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.du.trimmer=e.trimmerSupport.generateTrimmer(e.du.wordCharacters),e.Pipeline.registerFunction(e.du.trimmer,"trimmer-du"),e.du.stemmer=(v=e.stemmerSupport.Among,q=e.stemmerSupport.SnowballProgram,r=new function(){var r,i,u,o=[new v("",-1,6),new v("á",0,1),new v("ä",0,1),new v("é",0,2),new v("ë",0,2),new v("í",0,3),new v("ï",0,3),new v("ó",0,4),new v("ö",0,4),new v("ú",0,5),new v("ü",0,5)],n=[new v("",-1,3),new v("I",0,2),new v("Y",0,1)],t=[new v("dd",-1,-1),new v("kk",-1,-1),new v("tt",-1,-1)],c=[new v("ene",-1,2),new v("se",-1,3),new v("en",-1,2),new v("heden",2,1),new v("s",-1,3)],a=[new v("end",-1,1),new v("ig",-1,2),new v("ing",-1,1),new v("lijk",-1,3),new v("baar",-1,4),new v("bar",-1,5)],l=[new v("aa",-1,-1),new v("ee",-1,-1),new v("oo",-1,-1),new v("uu",-1,-1)],m=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],d=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],f=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],_=new q;function s(e){return(_.cursor=e)>=_.limit||(_.cursor++,!1)}function w(){for(;!_.in_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}for(;!_.out_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}return!1}function b(){return i<=_.cursor}function p(){return r<=_.cursor}function g(){var e=_.limit-_.cursor;_.find_among_b(t,3)&&(_.cursor=_.limit-e,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del()))}function h(){var e;u=!1,_.ket=_.cursor,_.eq_s_b(1,"e")&&(_.bra=_.cursor,b()&&(e=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-e,_.slice_del(),u=!0,g())))}function k(){var e;b()&&(e=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-e,_.eq_s_b(3,"gem")||(_.cursor=_.limit-e,_.slice_del(),g())))}this.setCurrent=function(e){_.setCurrent(e)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var e=_.cursor;return function(){for(var e,r,i,n=_.cursor;;){if(_.bra=_.cursor,e=_.find_among(o,11))switch(_.ket=_.cursor,e){case 1:_.slice_from("a");continue;case 2:_.slice_from("e");continue;case 3:_.slice_from("i");continue;case 4:_.slice_from("o");continue;case 5:_.slice_from("u");continue;case 6:if(_.cursor>=_.limit)break;_.cursor++;continue}break}for(_.cursor=n,_.bra=n,_.eq_s(1,"y")?(_.ket=_.cursor,_.slice_from("Y")):_.cursor=n;;)if(r=_.cursor,_.in_grouping(m,97,232)){if(i=_.cursor,_.bra=i,_.eq_s(1,"i"))_.ket=_.cursor,_.in_grouping(m,97,232)&&(_.slice_from("I"),_.cursor=r);else if(_.cursor=i,_.eq_s(1,"y"))_.ket=_.cursor,_.slice_from("Y"),_.cursor=r;else if(s(r))break}else if(s(r))break}(),_.cursor=e,i=_.limit,r=i,w()||((i=_.cursor)<3&&(i=3),w()||(r=_.cursor)),_.limit_backward=e,_.cursor=_.limit,function(){var e,r,i,n,o,t,s=_.limit-_.cursor;if(_.ket=_.cursor,e=_.find_among_b(c,5))switch(_.bra=_.cursor,e){case 1:b()&&_.slice_from("heid");break;case 2:k();break;case 3:b()&&_.out_grouping_b(f,97,232)&&_.slice_del()}if(_.cursor=_.limit-s,h(),_.cursor=_.limit-s,_.ket=_.cursor,_.eq_s_b(4,"heid")&&(_.bra=_.cursor,p()&&(r=_.limit-_.cursor,_.eq_s_b(1,"c")||(_.cursor=_.limit-r,_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"en")&&(_.bra=_.cursor,k())))),_.cursor=_.limit-s,_.ket=_.cursor,e=_.find_among_b(a,6))switch(_.bra=_.cursor,e){case 1:if(p()){if(_.slice_del(),i=_.limit-_.cursor,_.ket=_.cursor,_.eq_s_b(2,"ig")&&(_.bra=_.cursor,p()&&(n=_.limit-_.cursor,!_.eq_s_b(1,"e")))){_.cursor=_.limit-n,_.slice_del();break}_.cursor=_.limit-i,g()}break;case 2:p()&&(o=_.limit-_.cursor,_.eq_s_b(1,"e")||(_.cursor=_.limit-o,_.slice_del()));break;case 3:p()&&(_.slice_del(),h());break;case 4:p()&&_.slice_del();break;case 5:p()&&u&&_.slice_del()}_.cursor=_.limit-s,_.out_grouping_b(d,73,232)&&(t=_.limit-_.cursor,_.find_among_b(l,4)&&_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-t,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del())))}(),_.cursor=_.limit_backward,function(){for(var e;;)if(_.bra=_.cursor,e=_.find_among(n,3))switch(_.ket=_.cursor,e){case 1:_.slice_from("y");break;case 2:_.slice_from("i");break;case 3:if(_.cursor>=_.limit)return;_.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.du.stemmer,"stemmer-du"),e.du.stopWordFilter=e.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),e.Pipeline.registerFunction(e.du.stopWordFilter,"stopWordFilter-du")}}); \ No newline at end of file diff --git a/docs/api/py/_static/javascripts/lunr/lunr.es.js b/docs/api/py/_static/javascripts/lunr/lunr.es.js new file mode 100644 index 0000000000000..9de6c09cb4238 --- /dev/null +++ b/docs/api/py/_static/javascripts/lunr/lunr.es.js @@ -0,0 +1 @@ +!function(e,s){"function"==typeof define&&define.amd?define(s):"object"==typeof exports?module.exports=s():s()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var C,P,s;e.es=function(){this.pipeline.reset(),this.pipeline.add(e.es.trimmer,e.es.stopWordFilter,e.es.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.es.stemmer))},e.es.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.es.trimmer=e.trimmerSupport.generateTrimmer(e.es.wordCharacters),e.Pipeline.registerFunction(e.es.trimmer,"trimmer-es"),e.es.stemmer=(C=e.stemmerSupport.Among,P=e.stemmerSupport.SnowballProgram,s=new function(){var r,n,i,a=[new C("",-1,6),new C("á",0,1),new C("é",0,2),new C("í",0,3),new C("ó",0,4),new C("ú",0,5)],t=[new C("la",-1,-1),new C("sela",0,-1),new C("le",-1,-1),new C("me",-1,-1),new C("se",-1,-1),new C("lo",-1,-1),new C("selo",5,-1),new C("las",-1,-1),new C("selas",7,-1),new C("les",-1,-1),new C("los",-1,-1),new C("selos",10,-1),new C("nos",-1,-1)],o=[new C("ando",-1,6),new C("iendo",-1,6),new C("yendo",-1,7),new C("ándo",-1,2),new C("iéndo",-1,1),new C("ar",-1,6),new C("er",-1,6),new C("ir",-1,6),new C("ár",-1,3),new C("ér",-1,4),new C("ír",-1,5)],s=[new C("ic",-1,-1),new C("ad",-1,-1),new C("os",-1,-1),new C("iv",-1,1)],u=[new C("able",-1,1),new C("ible",-1,1),new C("ante",-1,1)],w=[new C("ic",-1,1),new C("abil",-1,1),new C("iv",-1,1)],c=[new C("ica",-1,1),new C("ancia",-1,2),new C("encia",-1,5),new C("adora",-1,2),new C("osa",-1,1),new C("ista",-1,1),new C("iva",-1,9),new C("anza",-1,1),new C("logía",-1,3),new C("idad",-1,8),new C("able",-1,1),new C("ible",-1,1),new C("ante",-1,2),new C("mente",-1,7),new C("amente",13,6),new C("ación",-1,2),new C("ución",-1,4),new C("ico",-1,1),new C("ismo",-1,1),new C("oso",-1,1),new C("amiento",-1,1),new C("imiento",-1,1),new C("ivo",-1,9),new C("ador",-1,2),new C("icas",-1,1),new C("ancias",-1,2),new C("encias",-1,5),new C("adoras",-1,2),new C("osas",-1,1),new C("istas",-1,1),new C("ivas",-1,9),new C("anzas",-1,1),new C("logías",-1,3),new C("idades",-1,8),new C("ables",-1,1),new C("ibles",-1,1),new C("aciones",-1,2),new C("uciones",-1,4),new C("adores",-1,2),new C("antes",-1,2),new C("icos",-1,1),new C("ismos",-1,1),new C("osos",-1,1),new C("amientos",-1,1),new C("imientos",-1,1),new C("ivos",-1,9)],m=[new C("ya",-1,1),new C("ye",-1,1),new C("yan",-1,1),new C("yen",-1,1),new C("yeron",-1,1),new C("yendo",-1,1),new C("yo",-1,1),new C("yas",-1,1),new C("yes",-1,1),new C("yais",-1,1),new C("yamos",-1,1),new C("yó",-1,1)],l=[new C("aba",-1,2),new C("ada",-1,2),new C("ida",-1,2),new C("ara",-1,2),new C("iera",-1,2),new C("ía",-1,2),new C("aría",5,2),new C("ería",5,2),new C("iría",5,2),new C("ad",-1,2),new C("ed",-1,2),new C("id",-1,2),new C("ase",-1,2),new C("iese",-1,2),new C("aste",-1,2),new C("iste",-1,2),new C("an",-1,2),new C("aban",16,2),new C("aran",16,2),new C("ieran",16,2),new C("ían",16,2),new C("arían",20,2),new C("erían",20,2),new C("irían",20,2),new C("en",-1,1),new C("asen",24,2),new C("iesen",24,2),new C("aron",-1,2),new C("ieron",-1,2),new C("arán",-1,2),new C("erán",-1,2),new C("irán",-1,2),new C("ado",-1,2),new C("ido",-1,2),new C("ando",-1,2),new C("iendo",-1,2),new C("ar",-1,2),new C("er",-1,2),new C("ir",-1,2),new C("as",-1,2),new C("abas",39,2),new C("adas",39,2),new C("idas",39,2),new C("aras",39,2),new C("ieras",39,2),new C("ías",39,2),new C("arías",45,2),new C("erías",45,2),new C("irías",45,2),new C("es",-1,1),new C("ases",49,2),new C("ieses",49,2),new C("abais",-1,2),new C("arais",-1,2),new C("ierais",-1,2),new C("íais",-1,2),new C("aríais",55,2),new C("eríais",55,2),new C("iríais",55,2),new C("aseis",-1,2),new C("ieseis",-1,2),new C("asteis",-1,2),new C("isteis",-1,2),new C("áis",-1,2),new C("éis",-1,1),new C("aréis",64,2),new C("eréis",64,2),new C("iréis",64,2),new C("ados",-1,2),new C("idos",-1,2),new C("amos",-1,2),new C("ábamos",70,2),new C("áramos",70,2),new C("iéramos",70,2),new C("íamos",70,2),new C("aríamos",74,2),new C("eríamos",74,2),new C("iríamos",74,2),new C("emos",-1,1),new C("aremos",78,2),new C("eremos",78,2),new C("iremos",78,2),new C("ásemos",78,2),new C("iésemos",78,2),new C("imos",-1,2),new C("arás",-1,2),new C("erás",-1,2),new C("irás",-1,2),new C("ís",-1,2),new C("ará",-1,2),new C("erá",-1,2),new C("irá",-1,2),new C("aré",-1,2),new C("eré",-1,2),new C("iré",-1,2),new C("ió",-1,2)],d=[new C("a",-1,1),new C("e",-1,2),new C("o",-1,1),new C("os",-1,1),new C("á",-1,1),new C("é",-1,2),new C("í",-1,1),new C("ó",-1,1)],b=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,4,10],f=new P;function _(){if(f.out_grouping(b,97,252)){for(;!f.in_grouping(b,97,252);){if(f.cursor>=f.limit)return!0;f.cursor++}return!1}return!0}function h(){var e,s=f.cursor;if(function(){if(f.in_grouping(b,97,252)){var e=f.cursor;if(_()){if(f.cursor=e,!f.in_grouping(b,97,252))return!0;for(;!f.out_grouping(b,97,252);){if(f.cursor>=f.limit)return!0;f.cursor++}}return!1}return!0}()){if(f.cursor=s,!f.out_grouping(b,97,252))return;if(e=f.cursor,_()){if(f.cursor=e,!f.in_grouping(b,97,252)||f.cursor>=f.limit)return;f.cursor++}}i=f.cursor}function v(){for(;!f.in_grouping(b,97,252);){if(f.cursor>=f.limit)return!1;f.cursor++}for(;!f.out_grouping(b,97,252);){if(f.cursor>=f.limit)return!1;f.cursor++}return!0}function p(){return i<=f.cursor}function g(){return r<=f.cursor}function k(e,s){if(!g())return!0;f.slice_del(),f.ket=f.cursor;var r=f.find_among_b(e,s);return r&&(f.bra=f.cursor,1==r&&g()&&f.slice_del()),!1}function y(e){return!g()||(f.slice_del(),f.ket=f.cursor,f.eq_s_b(2,e)&&(f.bra=f.cursor,g()&&f.slice_del()),!1)}function q(){var e;if(f.ket=f.cursor,e=f.find_among_b(c,46)){switch(f.bra=f.cursor,e){case 1:if(!g())return!1;f.slice_del();break;case 2:if(y("ic"))return!1;break;case 3:if(!g())return!1;f.slice_from("log");break;case 4:if(!g())return!1;f.slice_from("u");break;case 5:if(!g())return!1;f.slice_from("ente");break;case 6:if(!(n<=f.cursor))return!1;f.slice_del(),f.ket=f.cursor,(e=f.find_among_b(s,4))&&(f.bra=f.cursor,g()&&(f.slice_del(),1==e&&(f.ket=f.cursor,f.eq_s_b(2,"at")&&(f.bra=f.cursor,g()&&f.slice_del()))));break;case 7:if(k(u,3))return!1;break;case 8:if(k(w,3))return!1;break;case 9:if(y("at"))return!1}return!0}return!1}this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var e,s=f.cursor;return e=f.cursor,i=f.limit,r=n=i,h(),f.cursor=e,v()&&(n=f.cursor,v()&&(r=f.cursor)),f.limit_backward=s,f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,f.find_among_b(t,13)&&(f.bra=f.cursor,(e=f.find_among_b(o,11))&&p()))switch(e){case 1:f.bra=f.cursor,f.slice_from("iendo");break;case 2:f.bra=f.cursor,f.slice_from("ando");break;case 3:f.bra=f.cursor,f.slice_from("ar");break;case 4:f.bra=f.cursor,f.slice_from("er");break;case 5:f.bra=f.cursor,f.slice_from("ir");break;case 6:f.slice_del();break;case 7:f.eq_s_b(1,"u")&&f.slice_del()}}(),f.cursor=f.limit,q()||(f.cursor=f.limit,function(){var e,s;if(f.cursor>=i&&(s=f.limit_backward,f.limit_backward=i,f.ket=f.cursor,e=f.find_among_b(m,12),f.limit_backward=s,e)){if(f.bra=f.cursor,1==e){if(!f.eq_s_b(1,"u"))return!1;f.slice_del()}return!0}return!1}()||(f.cursor=f.limit,function(){var e,s,r,n;if(f.cursor>=i&&(s=f.limit_backward,f.limit_backward=i,f.ket=f.cursor,e=f.find_among_b(l,96),f.limit_backward=s,e))switch(f.bra=f.cursor,e){case 1:r=f.limit-f.cursor,f.eq_s_b(1,"u")?(n=f.limit-f.cursor,f.eq_s_b(1,"g")?f.cursor=f.limit-n:f.cursor=f.limit-r):f.cursor=f.limit-r,f.bra=f.cursor;case 2:f.slice_del()}}())),f.cursor=f.limit,function(){var e,s;if(f.ket=f.cursor,e=f.find_among_b(d,8))switch(f.bra=f.cursor,e){case 1:p()&&f.slice_del();break;case 2:p()&&(f.slice_del(),f.ket=f.cursor,f.eq_s_b(1,"u")&&(f.bra=f.cursor,s=f.limit-f.cursor,f.eq_s_b(1,"g")&&(f.cursor=f.limit-s,p()&&f.slice_del())))}}(),f.cursor=f.limit_backward,function(){for(var e;;){if(f.bra=f.cursor,e=f.find_among(a,6))switch(f.ket=f.cursor,e){case 1:f.slice_from("a");continue;case 2:f.slice_from("e");continue;case 3:f.slice_from("i");continue;case 4:f.slice_from("o");continue;case 5:f.slice_from("u");continue;case 6:if(f.cursor>=f.limit)break;f.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return s.setCurrent(e),s.stem(),s.getCurrent()}):(s.setCurrent(e),s.stem(),s.getCurrent())}),e.Pipeline.registerFunction(e.es.stemmer,"stemmer-es"),e.es.stopWordFilter=e.generateStopWordFilter("a al algo algunas algunos ante antes como con contra cual cuando de del desde donde durante e el ella ellas ellos en entre era erais eran eras eres es esa esas ese eso esos esta estaba estabais estaban estabas estad estada estadas estado estados estamos estando estar estaremos estará estarán estarás estaré estaréis estaría estaríais estaríamos estarían estarías estas este estemos esto estos estoy estuve estuviera estuvierais estuvieran estuvieras estuvieron estuviese estuvieseis estuviesen estuvieses estuvimos estuviste estuvisteis estuviéramos estuviésemos estuvo está estábamos estáis están estás esté estéis estén estés fue fuera fuerais fueran fueras fueron fuese fueseis fuesen fueses fui fuimos fuiste fuisteis fuéramos fuésemos ha habida habidas habido habidos habiendo habremos habrá habrán habrás habré habréis habría habríais habríamos habrían habrías habéis había habíais habíamos habían habías han has hasta hay haya hayamos hayan hayas hayáis he hemos hube hubiera hubierais hubieran hubieras hubieron hubiese hubieseis hubiesen hubieses hubimos hubiste hubisteis hubiéramos hubiésemos hubo la las le les lo los me mi mis mucho muchos muy más mí mía mías mío míos nada ni no nos nosotras nosotros nuestra nuestras nuestro nuestros o os otra otras otro otros para pero poco por porque que quien quienes qué se sea seamos sean seas seremos será serán serás seré seréis sería seríais seríamos serían serías seáis sido siendo sin sobre sois somos son soy su sus suya suyas suyo suyos sí también tanto te tendremos tendrá tendrán tendrás tendré tendréis tendría tendríais tendríamos tendrían tendrías tened tenemos tenga tengamos tengan tengas tengo tengáis tenida tenidas tenido tenidos teniendo tenéis tenía teníais teníamos tenían tenías ti tiene tienen tienes todo todos tu tus tuve tuviera tuvierais tuvieran tuvieras tuvieron tuviese tuvieseis tuviesen tuvieses tuvimos tuviste tuvisteis tuviéramos tuviésemos tuvo tuya tuyas tuyo tuyos tú un una uno unos vosotras vosotros vuestra vuestras vuestro vuestros y ya yo él éramos".split(" ")),e.Pipeline.registerFunction(e.es.stopWordFilter,"stopWordFilter-es")}}); \ No newline at end of file diff --git a/docs/api/py/_static/javascripts/lunr/lunr.fi.js b/docs/api/py/_static/javascripts/lunr/lunr.fi.js new file mode 100644 index 0000000000000..2f9bf5aebdb39 --- /dev/null +++ b/docs/api/py/_static/javascripts/lunr/lunr.fi.js @@ -0,0 +1 @@ +!function(i,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(i.lunr)}(this,function(){return function(i){if(void 0===i)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===i.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var v,C,e;i.fi=function(){this.pipeline.reset(),this.pipeline.add(i.fi.trimmer,i.fi.stopWordFilter,i.fi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(i.fi.stemmer))},i.fi.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",i.fi.trimmer=i.trimmerSupport.generateTrimmer(i.fi.wordCharacters),i.Pipeline.registerFunction(i.fi.trimmer,"trimmer-fi"),i.fi.stemmer=(v=i.stemmerSupport.Among,C=i.stemmerSupport.SnowballProgram,e=new function(){var n,t,l,o,r=[new v("pa",-1,1),new v("sti",-1,2),new v("kaan",-1,1),new v("han",-1,1),new v("kin",-1,1),new v("hän",-1,1),new v("kään",-1,1),new v("ko",-1,1),new v("pä",-1,1),new v("kö",-1,1)],s=[new v("lla",-1,-1),new v("na",-1,-1),new v("ssa",-1,-1),new v("ta",-1,-1),new v("lta",3,-1),new v("sta",3,-1)],a=[new v("llä",-1,-1),new v("nä",-1,-1),new v("ssä",-1,-1),new v("tä",-1,-1),new v("ltä",3,-1),new v("stä",3,-1)],u=[new v("lle",-1,-1),new v("ine",-1,-1)],c=[new v("nsa",-1,3),new v("mme",-1,3),new v("nne",-1,3),new v("ni",-1,2),new v("si",-1,1),new v("an",-1,4),new v("en",-1,6),new v("än",-1,5),new v("nsä",-1,3)],i=[new v("aa",-1,-1),new v("ee",-1,-1),new v("ii",-1,-1),new v("oo",-1,-1),new v("uu",-1,-1),new v("ää",-1,-1),new v("öö",-1,-1)],m=[new v("a",-1,8),new v("lla",0,-1),new v("na",0,-1),new v("ssa",0,-1),new v("ta",0,-1),new v("lta",4,-1),new v("sta",4,-1),new v("tta",4,9),new v("lle",-1,-1),new v("ine",-1,-1),new v("ksi",-1,-1),new v("n",-1,7),new v("han",11,1),new v("den",11,-1,q),new v("seen",11,-1,j),new v("hen",11,2),new v("tten",11,-1,q),new v("hin",11,3),new v("siin",11,-1,q),new v("hon",11,4),new v("hän",11,5),new v("hön",11,6),new v("ä",-1,8),new v("llä",22,-1),new v("nä",22,-1),new v("ssä",22,-1),new v("tä",22,-1),new v("ltä",26,-1),new v("stä",26,-1),new v("ttä",26,9)],w=[new v("eja",-1,-1),new v("mma",-1,1),new v("imma",1,-1),new v("mpa",-1,1),new v("impa",3,-1),new v("mmi",-1,1),new v("immi",5,-1),new v("mpi",-1,1),new v("impi",7,-1),new v("ejä",-1,-1),new v("mmä",-1,1),new v("immä",10,-1),new v("mpä",-1,1),new v("impä",12,-1)],_=[new v("i",-1,-1),new v("j",-1,-1)],k=[new v("mma",-1,1),new v("imma",0,-1)],b=[17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],e=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],f=[17,97,24,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],h=new C;function p(){for(var i;i=h.cursor,!h.in_grouping(d,97,246);){if((h.cursor=i)>=h.limit)return!0;h.cursor++}for(h.cursor=i;!h.out_grouping(d,97,246);){if(h.cursor>=h.limit)return!0;h.cursor++}return!1}function g(){var i,e;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(r,10)){switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:if(!h.in_grouping_b(f,97,246))return;break;case 2:if(!(l<=h.cursor))return}h.slice_del()}else h.limit_backward=e}function j(){return h.find_among_b(i,7)}function q(){return h.eq_s_b(1,"i")&&h.in_grouping_b(e,97,246)}this.setCurrent=function(i){h.setCurrent(i)},this.getCurrent=function(){return h.getCurrent()},this.stem=function(){var i,e=h.cursor;return o=h.limit,l=o,p()||(o=h.cursor,p()||(l=h.cursor)),n=!1,h.limit_backward=e,h.cursor=h.limit,g(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(c,9))switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:r=h.limit-h.cursor,h.eq_s_b(1,"k")||(h.cursor=h.limit-r,h.slice_del());break;case 2:h.slice_del(),h.ket=h.cursor,h.eq_s_b(3,"kse")&&(h.bra=h.cursor,h.slice_from("ksi"));break;case 3:h.slice_del();break;case 4:h.find_among_b(s,6)&&h.slice_del();break;case 5:h.find_among_b(a,6)&&h.slice_del();break;case 6:h.find_among_b(u,2)&&h.slice_del()}else h.limit_backward=e}(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(m,30)){switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:if(!h.eq_s_b(1,"a"))return;break;case 2:case 9:if(!h.eq_s_b(1,"e"))return;break;case 3:if(!h.eq_s_b(1,"i"))return;break;case 4:if(!h.eq_s_b(1,"o"))return;break;case 5:if(!h.eq_s_b(1,"ä"))return;break;case 6:if(!h.eq_s_b(1,"ö"))return;break;case 7:if(r=h.limit-h.cursor,!j()&&(h.cursor=h.limit-r,!h.eq_s_b(2,"ie"))){h.cursor=h.limit-r;break}if(h.cursor=h.limit-r,h.cursor<=h.limit_backward){h.cursor=h.limit-r;break}h.cursor--,h.bra=h.cursor;break;case 8:if(!h.in_grouping_b(d,97,246)||!h.out_grouping_b(d,97,246))return}h.slice_del(),n=!0}else h.limit_backward=e}(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=l)if(e=h.limit_backward,h.limit_backward=l,h.ket=h.cursor,i=h.find_among_b(w,14)){if(h.bra=h.cursor,h.limit_backward=e,1==i){if(r=h.limit-h.cursor,h.eq_s_b(2,"po"))return;h.cursor=h.limit-r}h.slice_del()}else h.limit_backward=e}(),h.cursor=h.limit,h.cursor=(n?h.cursor>=o&&(i=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,h.find_among_b(_,2)?(h.bra=h.cursor,h.limit_backward=i,h.slice_del()):h.limit_backward=i):(h.cursor=h.limit,function(){var i,e,r,n,t,s;if(h.cursor>=o){if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,h.eq_s_b(1,"t")&&(h.bra=h.cursor,r=h.limit-h.cursor,h.in_grouping_b(d,97,246)&&(h.cursor=h.limit-r,h.slice_del(),h.limit_backward=e,n=h.limit-h.cursor,h.cursor>=l&&(h.cursor=l,t=h.limit_backward,h.limit_backward=h.cursor,h.cursor=h.limit-n,h.ket=h.cursor,i=h.find_among_b(k,2))))){if(h.bra=h.cursor,h.limit_backward=t,1==i){if(s=h.limit-h.cursor,h.eq_s_b(2,"po"))return;h.cursor=h.limit-s}return h.slice_del()}h.limit_backward=e}}()),h.limit),function(){var i,e,r,n;if(h.cursor>=o){for(i=h.limit_backward,h.limit_backward=o,e=h.limit-h.cursor,j()&&(h.cursor=h.limit-e,h.ket=h.cursor,h.cursor>h.limit_backward&&(h.cursor--,h.bra=h.cursor,h.slice_del())),h.cursor=h.limit-e,h.ket=h.cursor,h.in_grouping_b(b,97,228)&&(h.bra=h.cursor,h.out_grouping_b(d,97,246)&&h.slice_del()),h.cursor=h.limit-e,h.ket=h.cursor,h.eq_s_b(1,"j")&&(h.bra=h.cursor,r=h.limit-h.cursor,h.eq_s_b(1,"o")?h.slice_del():(h.cursor=h.limit-r,h.eq_s_b(1,"u")&&h.slice_del())),h.cursor=h.limit-e,h.ket=h.cursor,h.eq_s_b(1,"o")&&(h.bra=h.cursor,h.eq_s_b(1,"j")&&h.slice_del()),h.cursor=h.limit-e,h.limit_backward=i;;){if(n=h.limit-h.cursor,h.out_grouping_b(d,97,246)){h.cursor=h.limit-n;break}if(h.cursor=h.limit-n,h.cursor<=h.limit_backward)return;h.cursor--}h.ket=h.cursor,h.cursor>h.limit_backward&&(h.cursor--,h.bra=h.cursor,t=h.slice_to(),h.eq_v_b(t)&&h.slice_del())}}(),!0}},function(i){return"function"==typeof i.update?i.update(function(i){return e.setCurrent(i),e.stem(),e.getCurrent()}):(e.setCurrent(i),e.stem(),e.getCurrent())}),i.Pipeline.registerFunction(i.fi.stemmer,"stemmer-fi"),i.fi.stopWordFilter=i.generateStopWordFilter("ei eivät emme en et ette että he heidän heidät heihin heille heillä heiltä heissä heistä heitä hän häneen hänelle hänellä häneltä hänen hänessä hänestä hänet häntä itse ja johon joiden joihin joiksi joilla joille joilta joina joissa joista joita joka joksi jolla jolle jolta jona jonka jos jossa josta jota jotka kanssa keiden keihin keiksi keille keillä keiltä keinä keissä keistä keitä keneen keneksi kenelle kenellä keneltä kenen kenenä kenessä kenestä kenet ketkä ketkä ketä koska kuin kuka kun me meidän meidät meihin meille meillä meiltä meissä meistä meitä mihin miksi mikä mille millä miltä minkä minkä minua minulla minulle minulta minun minussa minusta minut minuun minä minä missä mistä mitkä mitä mukaan mutta ne niiden niihin niiksi niille niillä niiltä niin niin niinä niissä niistä niitä noiden noihin noiksi noilla noille noilta noin noina noissa noista noita nuo nyt näiden näihin näiksi näille näillä näiltä näinä näissä näistä näitä nämä ole olemme olen olet olette oli olimme olin olisi olisimme olisin olisit olisitte olisivat olit olitte olivat olla olleet ollut on ovat poikki se sekä sen siihen siinä siitä siksi sille sillä sillä siltä sinua sinulla sinulle sinulta sinun sinussa sinusta sinut sinuun sinä sinä sitä tai te teidän teidät teihin teille teillä teiltä teissä teistä teitä tuo tuohon tuoksi tuolla tuolle tuolta tuon tuona tuossa tuosta tuota tähän täksi tälle tällä tältä tämä tämän tänä tässä tästä tätä vaan vai vaikka yli".split(" ")),i.Pipeline.registerFunction(i.fi.stopWordFilter,"stopWordFilter-fi")}}); \ No newline at end of file diff --git a/docs/api/py/_static/javascripts/lunr/lunr.fr.js b/docs/api/py/_static/javascripts/lunr/lunr.fr.js new file mode 100644 index 0000000000000..078d0cab706ba --- /dev/null +++ b/docs/api/py/_static/javascripts/lunr/lunr.fr.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,y,s;e.fr=function(){this.pipeline.reset(),this.pipeline.add(e.fr.trimmer,e.fr.stopWordFilter,e.fr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.fr.stemmer))},e.fr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.fr.trimmer=e.trimmerSupport.generateTrimmer(e.fr.wordCharacters),e.Pipeline.registerFunction(e.fr.trimmer,"trimmer-fr"),e.fr.stemmer=(r=e.stemmerSupport.Among,y=e.stemmerSupport.SnowballProgram,s=new function(){var s,i,t,n=[new r("col",-1,-1),new r("par",-1,-1),new r("tap",-1,-1)],u=[new r("",-1,4),new r("I",0,1),new r("U",0,2),new r("Y",0,3)],o=[new r("iqU",-1,3),new r("abl",-1,3),new r("Ièr",-1,4),new r("ièr",-1,4),new r("eus",-1,2),new r("iv",-1,1)],c=[new r("ic",-1,2),new r("abil",-1,1),new r("iv",-1,3)],a=[new r("iqUe",-1,1),new r("atrice",-1,2),new r("ance",-1,1),new r("ence",-1,5),new r("logie",-1,3),new r("able",-1,1),new r("isme",-1,1),new r("euse",-1,11),new r("iste",-1,1),new r("ive",-1,8),new r("if",-1,8),new r("usion",-1,4),new r("ation",-1,2),new r("ution",-1,4),new r("ateur",-1,2),new r("iqUes",-1,1),new r("atrices",-1,2),new r("ances",-1,1),new r("ences",-1,5),new r("logies",-1,3),new r("ables",-1,1),new r("ismes",-1,1),new r("euses",-1,11),new r("istes",-1,1),new r("ives",-1,8),new r("ifs",-1,8),new r("usions",-1,4),new r("ations",-1,2),new r("utions",-1,4),new r("ateurs",-1,2),new r("ments",-1,15),new r("ements",30,6),new r("issements",31,12),new r("ités",-1,7),new r("ment",-1,15),new r("ement",34,6),new r("issement",35,12),new r("amment",34,13),new r("emment",34,14),new r("aux",-1,10),new r("eaux",39,9),new r("eux",-1,1),new r("ité",-1,7)],l=[new r("ira",-1,1),new r("ie",-1,1),new r("isse",-1,1),new r("issante",-1,1),new r("i",-1,1),new r("irai",4,1),new r("ir",-1,1),new r("iras",-1,1),new r("ies",-1,1),new r("îmes",-1,1),new r("isses",-1,1),new r("issantes",-1,1),new r("îtes",-1,1),new r("is",-1,1),new r("irais",13,1),new r("issais",13,1),new r("irions",-1,1),new r("issions",-1,1),new r("irons",-1,1),new r("issons",-1,1),new r("issants",-1,1),new r("it",-1,1),new r("irait",21,1),new r("issait",21,1),new r("issant",-1,1),new r("iraIent",-1,1),new r("issaIent",-1,1),new r("irent",-1,1),new r("issent",-1,1),new r("iront",-1,1),new r("ît",-1,1),new r("iriez",-1,1),new r("issiez",-1,1),new r("irez",-1,1),new r("issez",-1,1)],w=[new r("a",-1,3),new r("era",0,2),new r("asse",-1,3),new r("ante",-1,3),new r("ée",-1,2),new r("ai",-1,3),new r("erai",5,2),new r("er",-1,2),new r("as",-1,3),new r("eras",8,2),new r("âmes",-1,3),new r("asses",-1,3),new r("antes",-1,3),new r("âtes",-1,3),new r("ées",-1,2),new r("ais",-1,3),new r("erais",15,2),new r("ions",-1,1),new r("erions",17,2),new r("assions",17,3),new r("erons",-1,2),new r("ants",-1,3),new r("és",-1,2),new r("ait",-1,3),new r("erait",23,2),new r("ant",-1,3),new r("aIent",-1,3),new r("eraIent",26,2),new r("èrent",-1,2),new r("assent",-1,3),new r("eront",-1,2),new r("ât",-1,3),new r("ez",-1,2),new r("iez",32,2),new r("eriez",33,2),new r("assiez",33,3),new r("erez",32,2),new r("é",-1,2)],f=[new r("e",-1,3),new r("Ière",0,2),new r("ière",0,2),new r("ion",-1,1),new r("Ier",-1,2),new r("ier",-1,2),new r("ë",-1,4)],m=[new r("ell",-1,-1),new r("eill",-1,-1),new r("enn",-1,-1),new r("onn",-1,-1),new r("ett",-1,-1)],_=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5],b=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128],d=new y;function k(e,r,s){return!(!d.eq_s(1,e)||(d.ket=d.cursor,!d.in_grouping(_,97,251)))&&(d.slice_from(r),d.cursor=s,!0)}function p(e,r,s){return!!d.eq_s(1,e)&&(d.ket=d.cursor,d.slice_from(r),d.cursor=s,!0)}function g(){for(;!d.in_grouping(_,97,251);){if(d.cursor>=d.limit)return!0;d.cursor++}for(;!d.out_grouping(_,97,251);){if(d.cursor>=d.limit)return!0;d.cursor++}return!1}function q(){return t<=d.cursor}function v(){return i<=d.cursor}function h(){return s<=d.cursor}function z(){if(!function(){var e,r;if(d.ket=d.cursor,e=d.find_among_b(a,43)){switch(d.bra=d.cursor,e){case 1:if(!h())return!1;d.slice_del();break;case 2:if(!h())return!1;d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"ic")&&(d.bra=d.cursor,h()?d.slice_del():d.slice_from("iqU"));break;case 3:if(!h())return!1;d.slice_from("log");break;case 4:if(!h())return!1;d.slice_from("u");break;case 5:if(!h())return!1;d.slice_from("ent");break;case 6:if(!q())return!1;if(d.slice_del(),d.ket=d.cursor,e=d.find_among_b(o,6))switch(d.bra=d.cursor,e){case 1:h()&&(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,h()&&d.slice_del()));break;case 2:h()?d.slice_del():v()&&d.slice_from("eux");break;case 3:h()&&d.slice_del();break;case 4:q()&&d.slice_from("i")}break;case 7:if(!h())return!1;if(d.slice_del(),d.ket=d.cursor,e=d.find_among_b(c,3))switch(d.bra=d.cursor,e){case 1:h()?d.slice_del():d.slice_from("abl");break;case 2:h()?d.slice_del():d.slice_from("iqU");break;case 3:h()&&d.slice_del()}break;case 8:if(!h())return!1;if(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,h()&&(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"ic")))){d.bra=d.cursor,h()?d.slice_del():d.slice_from("iqU");break}break;case 9:d.slice_from("eau");break;case 10:if(!v())return!1;d.slice_from("al");break;case 11:if(h())d.slice_del();else{if(!v())return!1;d.slice_from("eux")}break;case 12:if(!v()||!d.out_grouping_b(_,97,251))return!1;d.slice_del();break;case 13:return q()&&d.slice_from("ant"),!1;case 14:return q()&&d.slice_from("ent"),!1;case 15:return r=d.limit-d.cursor,d.in_grouping_b(_,97,251)&&q()&&(d.cursor=d.limit-r,d.slice_del()),!1}return!0}return!1}()&&(d.cursor=d.limit,!function(){var e,r;if(d.cursor=t){if(s=d.limit_backward,d.limit_backward=t,d.ket=d.cursor,e=d.find_among_b(f,7))switch(d.bra=d.cursor,e){case 1:if(h()){if(i=d.limit-d.cursor,!d.eq_s_b(1,"s")&&(d.cursor=d.limit-i,!d.eq_s_b(1,"t")))break;d.slice_del()}break;case 2:d.slice_from("i");break;case 3:d.slice_del();break;case 4:d.eq_s_b(2,"gu")&&d.slice_del()}d.limit_backward=s}}();d.cursor=d.limit,d.ket=d.cursor,d.eq_s_b(1,"Y")?(d.bra=d.cursor,d.slice_from("i")):(d.cursor=d.limit,d.eq_s_b(1,"ç")&&(d.bra=d.cursor,d.slice_from("c")))}this.setCurrent=function(e){d.setCurrent(e)},this.getCurrent=function(){return d.getCurrent()},this.stem=function(){var e,r=d.cursor;return function(){for(var e,r;;){if(e=d.cursor,d.in_grouping(_,97,251)){if(d.bra=d.cursor,r=d.cursor,k("u","U",e))continue;if(d.cursor=r,k("i","I",e))continue;if(d.cursor=r,p("y","Y",e))continue}if(d.cursor=e,!k("y","Y",d.bra=e)){if(d.cursor=e,d.eq_s(1,"q")&&(d.bra=d.cursor,p("u","U",e)))continue;if((d.cursor=e)>=d.limit)return;d.cursor++}}}(),d.cursor=r,function(){var e=d.cursor;if(t=d.limit,s=i=t,d.in_grouping(_,97,251)&&d.in_grouping(_,97,251)&&d.cursor=d.limit){d.cursor=t;break}d.cursor++}while(!d.in_grouping(_,97,251))}t=d.cursor,d.cursor=e,g()||(i=d.cursor,g()||(s=d.cursor))}(),d.limit_backward=r,d.cursor=d.limit,z(),d.cursor=d.limit,e=d.limit-d.cursor,d.find_among_b(m,5)&&(d.cursor=d.limit-e,d.ket=d.cursor,d.cursor>d.limit_backward&&(d.cursor--,d.bra=d.cursor,d.slice_del())),d.cursor=d.limit,function(){for(var e,r=1;d.out_grouping_b(_,97,251);)r--;if(r<=0){if(d.ket=d.cursor,e=d.limit-d.cursor,!d.eq_s_b(1,"é")&&(d.cursor=d.limit-e,!d.eq_s_b(1,"è")))return;d.bra=d.cursor,d.slice_from("e")}}(),d.cursor=d.limit_backward,function(){for(var e,r;r=d.cursor,d.bra=r,e=d.find_among(u,4);)switch(d.ket=d.cursor,e){case 1:d.slice_from("i");break;case 2:d.slice_from("u");break;case 3:d.slice_from("y");break;case 4:if(d.cursor>=d.limit)return;d.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return s.setCurrent(e),s.stem(),s.getCurrent()}):(s.setCurrent(e),s.stem(),s.getCurrent())}),e.Pipeline.registerFunction(e.fr.stemmer,"stemmer-fr"),e.fr.stopWordFilter=e.generateStopWordFilter("ai aie aient aies ait as au aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront aux avaient avais avait avec avez aviez avions avons ayant ayez ayons c ce ceci celà ces cet cette d dans de des du elle en es est et eu eue eues eurent eus eusse eussent eusses eussiez eussions eut eux eûmes eût eûtes furent fus fusse fussent fusses fussiez fussions fut fûmes fût fûtes ici il ils j je l la le les leur leurs lui m ma mais me mes moi mon même n ne nos notre nous on ont ou par pas pour qu que quel quelle quelles quels qui s sa sans se sera serai seraient serais serait seras serez seriez serions serons seront ses soi soient sois soit sommes son sont soyez soyons suis sur t ta te tes toi ton tu un une vos votre vous y à étaient étais était étant étiez étions été étée étées étés êtes".split(" ")),e.Pipeline.registerFunction(e.fr.stopWordFilter,"stopWordFilter-fr")}}); \ No newline at end of file diff --git a/docs/api/py/_static/javascripts/lunr/lunr.hu.js b/docs/api/py/_static/javascripts/lunr/lunr.hu.js new file mode 100644 index 0000000000000..56a4b0dc19f7c --- /dev/null +++ b/docs/api/py/_static/javascripts/lunr/lunr.hu.js @@ -0,0 +1 @@ +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var p,_,n;e.hu=function(){this.pipeline.reset(),this.pipeline.add(e.hu.trimmer,e.hu.stopWordFilter,e.hu.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hu.stemmer))},e.hu.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.hu.trimmer=e.trimmerSupport.generateTrimmer(e.hu.wordCharacters),e.Pipeline.registerFunction(e.hu.trimmer,"trimmer-hu"),e.hu.stemmer=(p=e.stemmerSupport.Among,_=e.stemmerSupport.SnowballProgram,n=new function(){var r,i=[new p("cs",-1,-1),new p("dzs",-1,-1),new p("gy",-1,-1),new p("ly",-1,-1),new p("ny",-1,-1),new p("sz",-1,-1),new p("ty",-1,-1),new p("zs",-1,-1)],n=[new p("á",-1,1),new p("é",-1,2)],a=[new p("bb",-1,-1),new p("cc",-1,-1),new p("dd",-1,-1),new p("ff",-1,-1),new p("gg",-1,-1),new p("jj",-1,-1),new p("kk",-1,-1),new p("ll",-1,-1),new p("mm",-1,-1),new p("nn",-1,-1),new p("pp",-1,-1),new p("rr",-1,-1),new p("ccs",-1,-1),new p("ss",-1,-1),new p("zzs",-1,-1),new p("tt",-1,-1),new p("vv",-1,-1),new p("ggy",-1,-1),new p("lly",-1,-1),new p("nny",-1,-1),new p("tty",-1,-1),new p("ssz",-1,-1),new p("zz",-1,-1)],t=[new p("al",-1,1),new p("el",-1,2)],e=[new p("ba",-1,-1),new p("ra",-1,-1),new p("be",-1,-1),new p("re",-1,-1),new p("ig",-1,-1),new p("nak",-1,-1),new p("nek",-1,-1),new p("val",-1,-1),new p("vel",-1,-1),new p("ul",-1,-1),new p("nál",-1,-1),new p("nél",-1,-1),new p("ból",-1,-1),new p("ról",-1,-1),new p("tól",-1,-1),new p("bõl",-1,-1),new p("rõl",-1,-1),new p("tõl",-1,-1),new p("ül",-1,-1),new p("n",-1,-1),new p("an",19,-1),new p("ban",20,-1),new p("en",19,-1),new p("ben",22,-1),new p("képpen",22,-1),new p("on",19,-1),new p("ön",19,-1),new p("képp",-1,-1),new p("kor",-1,-1),new p("t",-1,-1),new p("at",29,-1),new p("et",29,-1),new p("ként",29,-1),new p("anként",32,-1),new p("enként",32,-1),new p("onként",32,-1),new p("ot",29,-1),new p("ért",29,-1),new p("öt",29,-1),new p("hez",-1,-1),new p("hoz",-1,-1),new p("höz",-1,-1),new p("vá",-1,-1),new p("vé",-1,-1)],s=[new p("án",-1,2),new p("én",-1,1),new p("ánként",-1,3)],c=[new p("stul",-1,2),new p("astul",0,1),new p("ástul",0,3),new p("stül",-1,2),new p("estül",3,1),new p("éstül",3,4)],w=[new p("á",-1,1),new p("é",-1,2)],o=[new p("k",-1,7),new p("ak",0,4),new p("ek",0,6),new p("ok",0,5),new p("ák",0,1),new p("ék",0,2),new p("ök",0,3)],l=[new p("éi",-1,7),new p("áéi",0,6),new p("ééi",0,5),new p("é",-1,9),new p("ké",3,4),new p("aké",4,1),new p("eké",4,1),new p("oké",4,1),new p("áké",4,3),new p("éké",4,2),new p("öké",4,1),new p("éé",3,8)],u=[new p("a",-1,18),new p("ja",0,17),new p("d",-1,16),new p("ad",2,13),new p("ed",2,13),new p("od",2,13),new p("ád",2,14),new p("éd",2,15),new p("öd",2,13),new p("e",-1,18),new p("je",9,17),new p("nk",-1,4),new p("unk",11,1),new p("ánk",11,2),new p("énk",11,3),new p("ünk",11,1),new p("uk",-1,8),new p("juk",16,7),new p("ájuk",17,5),new p("ük",-1,8),new p("jük",19,7),new p("éjük",20,6),new p("m",-1,12),new p("am",22,9),new p("em",22,9),new p("om",22,9),new p("ám",22,10),new p("ém",22,11),new p("o",-1,18),new p("á",-1,19),new p("é",-1,20)],m=[new p("id",-1,10),new p("aid",0,9),new p("jaid",1,6),new p("eid",0,9),new p("jeid",3,6),new p("áid",0,7),new p("éid",0,8),new p("i",-1,15),new p("ai",7,14),new p("jai",8,11),new p("ei",7,14),new p("jei",10,11),new p("ái",7,12),new p("éi",7,13),new p("itek",-1,24),new p("eitek",14,21),new p("jeitek",15,20),new p("éitek",14,23),new p("ik",-1,29),new p("aik",18,26),new p("jaik",19,25),new p("eik",18,26),new p("jeik",21,25),new p("áik",18,27),new p("éik",18,28),new p("ink",-1,20),new p("aink",25,17),new p("jaink",26,16),new p("eink",25,17),new p("jeink",28,16),new p("áink",25,18),new p("éink",25,19),new p("aitok",-1,21),new p("jaitok",32,20),new p("áitok",-1,22),new p("im",-1,5),new p("aim",35,4),new p("jaim",36,1),new p("eim",35,4),new p("jeim",38,1),new p("áim",35,2),new p("éim",35,3)],k=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,52,14],f=new _;function b(){return r<=f.cursor}function d(){var e=f.limit-f.cursor;return!!f.find_among_b(a,23)&&(f.cursor=f.limit-e,!0)}function g(){if(f.cursor>f.limit_backward){f.cursor--,f.ket=f.cursor;var e=f.cursor-1;f.limit_backward<=e&&e<=f.limit&&(f.cursor=e,f.bra=e,f.slice_del())}}function h(){f.ket=f.cursor,f.find_among_b(e,44)&&(f.bra=f.cursor,b()&&(f.slice_del(),function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(n,2))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("a");break;case 2:f.slice_from("e")}}()))}this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var e=f.cursor;return function(){var e,n=f.cursor;if(r=f.limit,f.in_grouping(k,97,252))for(;;){if(e=f.cursor,f.out_grouping(k,97,252))return f.cursor=e,f.find_among(i,8)||(f.cursor=e)=f.limit)return r=e;f.cursor++}if(f.cursor=n,f.out_grouping(k,97,252)){for(;!f.in_grouping(k,97,252);){if(f.cursor>=f.limit)return;f.cursor++}r=f.cursor}}(),f.limit_backward=e,f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(t,2))&&(f.bra=f.cursor,b())){if((1==e||2==e)&&!d())return;f.slice_del(),g()}}(),f.cursor=f.limit,h(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(s,3))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("e");break;case 2:case 3:f.slice_from("a")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(c,6))&&(f.bra=f.cursor,b()))switch(e){case 1:case 2:f.slice_del();break;case 3:f.slice_from("a");break;case 4:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(w,2))&&(f.bra=f.cursor,b())){if((1==e||2==e)&&!d())return;f.slice_del(),g()}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(l,12))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 7:case 9:f.slice_del();break;case 2:case 5:case 8:f.slice_from("e");break;case 3:case 6:f.slice_from("a")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(u,31))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 7:case 8:case 9:case 12:case 13:case 16:case 17:case 18:f.slice_del();break;case 2:case 5:case 10:case 14:case 19:f.slice_from("a");break;case 3:case 6:case 11:case 15:case 20:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(m,42))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 5:case 6:case 9:case 10:case 11:case 14:case 15:case 16:case 17:case 20:case 21:case 24:case 25:case 26:case 29:f.slice_del();break;case 2:case 7:case 12:case 18:case 22:case 27:f.slice_from("a");break;case 3:case 8:case 13:case 19:case 23:case 28:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(o,7))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("a");break;case 2:f.slice_from("e");break;case 3:case 4:case 5:case 6:case 7:f.slice_del()}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.hu.stemmer,"stemmer-hu"),e.hu.stopWordFilter=e.generateStopWordFilter("a abban ahhoz ahogy ahol aki akik akkor alatt amely amelyek amelyekben amelyeket amelyet amelynek ami amikor amit amolyan amíg annak arra arról az azok azon azonban azt aztán azután azzal azért be belül benne bár cikk cikkek cikkeket csak de e ebben eddig egy egyes egyetlen egyik egyre egyéb egész ehhez ekkor el ellen elsõ elég elõ elõször elõtt emilyen ennek erre ez ezek ezen ezt ezzel ezért fel felé hanem hiszen hogy hogyan igen ill ill. illetve ilyen ilyenkor ismét ison itt jobban jó jól kell kellett keressünk keresztül ki kívül között közül legalább legyen lehet lehetett lenne lenni lesz lett maga magát majd majd meg mellett mely melyek mert mi mikor milyen minden mindenki mindent mindig mint mintha mit mivel miért most már más másik még míg nagy nagyobb nagyon ne nekem neki nem nincs néha néhány nélkül olyan ott pedig persze rá s saját sem semmi sok sokat sokkal szemben szerint szinte számára talán tehát teljes tovább továbbá több ugyanis utolsó után utána vagy vagyis vagyok valaki valami valamint való van vannak vele vissza viszont volna volt voltak voltam voltunk által általában át én éppen és így õ õk õket össze úgy új újabb újra".split(" ")),e.Pipeline.registerFunction(e.hu.stopWordFilter,"stopWordFilter-hu")}}); \ No newline at end of file diff --git a/docs/api/py/_static/javascripts/lunr/lunr.it.js b/docs/api/py/_static/javascripts/lunr/lunr.it.js new file mode 100644 index 0000000000000..50dddaa04b87a --- /dev/null +++ b/docs/api/py/_static/javascripts/lunr/lunr.it.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var z,P,r;e.it=function(){this.pipeline.reset(),this.pipeline.add(e.it.trimmer,e.it.stopWordFilter,e.it.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.it.stemmer))},e.it.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.it.trimmer=e.trimmerSupport.generateTrimmer(e.it.wordCharacters),e.Pipeline.registerFunction(e.it.trimmer,"trimmer-it"),e.it.stemmer=(z=e.stemmerSupport.Among,P=e.stemmerSupport.SnowballProgram,r=new function(){var o,t,s,a=[new z("",-1,7),new z("qu",0,6),new z("á",0,1),new z("é",0,2),new z("í",0,3),new z("ó",0,4),new z("ú",0,5)],u=[new z("",-1,3),new z("I",0,1),new z("U",0,2)],c=[new z("la",-1,-1),new z("cela",0,-1),new z("gliela",0,-1),new z("mela",0,-1),new z("tela",0,-1),new z("vela",0,-1),new z("le",-1,-1),new z("cele",6,-1),new z("gliele",6,-1),new z("mele",6,-1),new z("tele",6,-1),new z("vele",6,-1),new z("ne",-1,-1),new z("cene",12,-1),new z("gliene",12,-1),new z("mene",12,-1),new z("sene",12,-1),new z("tene",12,-1),new z("vene",12,-1),new z("ci",-1,-1),new z("li",-1,-1),new z("celi",20,-1),new z("glieli",20,-1),new z("meli",20,-1),new z("teli",20,-1),new z("veli",20,-1),new z("gli",20,-1),new z("mi",-1,-1),new z("si",-1,-1),new z("ti",-1,-1),new z("vi",-1,-1),new z("lo",-1,-1),new z("celo",31,-1),new z("glielo",31,-1),new z("melo",31,-1),new z("telo",31,-1),new z("velo",31,-1)],w=[new z("ando",-1,1),new z("endo",-1,1),new z("ar",-1,2),new z("er",-1,2),new z("ir",-1,2)],r=[new z("ic",-1,-1),new z("abil",-1,-1),new z("os",-1,-1),new z("iv",-1,1)],n=[new z("ic",-1,1),new z("abil",-1,1),new z("iv",-1,1)],i=[new z("ica",-1,1),new z("logia",-1,3),new z("osa",-1,1),new z("ista",-1,1),new z("iva",-1,9),new z("anza",-1,1),new z("enza",-1,5),new z("ice",-1,1),new z("atrice",7,1),new z("iche",-1,1),new z("logie",-1,3),new z("abile",-1,1),new z("ibile",-1,1),new z("usione",-1,4),new z("azione",-1,2),new z("uzione",-1,4),new z("atore",-1,2),new z("ose",-1,1),new z("ante",-1,1),new z("mente",-1,1),new z("amente",19,7),new z("iste",-1,1),new z("ive",-1,9),new z("anze",-1,1),new z("enze",-1,5),new z("ici",-1,1),new z("atrici",25,1),new z("ichi",-1,1),new z("abili",-1,1),new z("ibili",-1,1),new z("ismi",-1,1),new z("usioni",-1,4),new z("azioni",-1,2),new z("uzioni",-1,4),new z("atori",-1,2),new z("osi",-1,1),new z("anti",-1,1),new z("amenti",-1,6),new z("imenti",-1,6),new z("isti",-1,1),new z("ivi",-1,9),new z("ico",-1,1),new z("ismo",-1,1),new z("oso",-1,1),new z("amento",-1,6),new z("imento",-1,6),new z("ivo",-1,9),new z("ità",-1,8),new z("istà",-1,1),new z("istè",-1,1),new z("istì",-1,1)],l=[new z("isca",-1,1),new z("enda",-1,1),new z("ata",-1,1),new z("ita",-1,1),new z("uta",-1,1),new z("ava",-1,1),new z("eva",-1,1),new z("iva",-1,1),new z("erebbe",-1,1),new z("irebbe",-1,1),new z("isce",-1,1),new z("ende",-1,1),new z("are",-1,1),new z("ere",-1,1),new z("ire",-1,1),new z("asse",-1,1),new z("ate",-1,1),new z("avate",16,1),new z("evate",16,1),new z("ivate",16,1),new z("ete",-1,1),new z("erete",20,1),new z("irete",20,1),new z("ite",-1,1),new z("ereste",-1,1),new z("ireste",-1,1),new z("ute",-1,1),new z("erai",-1,1),new z("irai",-1,1),new z("isci",-1,1),new z("endi",-1,1),new z("erei",-1,1),new z("irei",-1,1),new z("assi",-1,1),new z("ati",-1,1),new z("iti",-1,1),new z("eresti",-1,1),new z("iresti",-1,1),new z("uti",-1,1),new z("avi",-1,1),new z("evi",-1,1),new z("ivi",-1,1),new z("isco",-1,1),new z("ando",-1,1),new z("endo",-1,1),new z("Yamo",-1,1),new z("iamo",-1,1),new z("avamo",-1,1),new z("evamo",-1,1),new z("ivamo",-1,1),new z("eremo",-1,1),new z("iremo",-1,1),new z("assimo",-1,1),new z("ammo",-1,1),new z("emmo",-1,1),new z("eremmo",54,1),new z("iremmo",54,1),new z("immo",-1,1),new z("ano",-1,1),new z("iscano",58,1),new z("avano",58,1),new z("evano",58,1),new z("ivano",58,1),new z("eranno",-1,1),new z("iranno",-1,1),new z("ono",-1,1),new z("iscono",65,1),new z("arono",65,1),new z("erono",65,1),new z("irono",65,1),new z("erebbero",-1,1),new z("irebbero",-1,1),new z("assero",-1,1),new z("essero",-1,1),new z("issero",-1,1),new z("ato",-1,1),new z("ito",-1,1),new z("uto",-1,1),new z("avo",-1,1),new z("evo",-1,1),new z("ivo",-1,1),new z("ar",-1,1),new z("ir",-1,1),new z("erà",-1,1),new z("irà",-1,1),new z("erò",-1,1),new z("irò",-1,1)],m=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2,1],f=[17,65,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2],v=[17],b=new P;function d(e,r,n){return!(!b.eq_s(1,e)||(b.ket=b.cursor,!b.in_grouping(m,97,249)))&&(b.slice_from(r),b.cursor=n,!0)}function _(e){if(b.cursor=e,!b.in_grouping(m,97,249))return!1;for(;!b.out_grouping(m,97,249);){if(b.cursor>=b.limit)return!1;b.cursor++}return!0}function g(){var e,r=b.cursor;if(!function(){if(b.in_grouping(m,97,249)){var e=b.cursor;if(b.out_grouping(m,97,249)){for(;!b.in_grouping(m,97,249);){if(b.cursor>=b.limit)return _(e);b.cursor++}return!0}return _(e)}return!1}()){if(b.cursor=r,!b.out_grouping(m,97,249))return;if(e=b.cursor,b.out_grouping(m,97,249)){for(;!b.in_grouping(m,97,249);){if(b.cursor>=b.limit)return b.cursor=e,void(b.in_grouping(m,97,249)&&b.cursor=b.limit)return;b.cursor++}s=b.cursor}function p(){for(;!b.in_grouping(m,97,249);){if(b.cursor>=b.limit)return!1;b.cursor++}for(;!b.out_grouping(m,97,249);){if(b.cursor>=b.limit)return!1;b.cursor++}return!0}function k(){return s<=b.cursor}function h(){return o<=b.cursor}function q(){var e;if(b.ket=b.cursor,!(e=b.find_among_b(i,51)))return!1;switch(b.bra=b.cursor,e){case 1:if(!h())return!1;b.slice_del();break;case 2:if(!h())return!1;b.slice_del(),b.ket=b.cursor,b.eq_s_b(2,"ic")&&(b.bra=b.cursor,h()&&b.slice_del());break;case 3:if(!h())return!1;b.slice_from("log");break;case 4:if(!h())return!1;b.slice_from("u");break;case 5:if(!h())return!1;b.slice_from("ente");break;case 6:if(!k())return!1;b.slice_del();break;case 7:if(!(t<=b.cursor))return!1;b.slice_del(),b.ket=b.cursor,(e=b.find_among_b(r,4))&&(b.bra=b.cursor,h()&&(b.slice_del(),1==e&&(b.ket=b.cursor,b.eq_s_b(2,"at")&&(b.bra=b.cursor,h()&&b.slice_del()))));break;case 8:if(!h())return!1;b.slice_del(),b.ket=b.cursor,(e=b.find_among_b(n,3))&&(b.bra=b.cursor,1==e&&h()&&b.slice_del());break;case 9:if(!h())return!1;b.slice_del(),b.ket=b.cursor,b.eq_s_b(2,"at")&&(b.bra=b.cursor,h()&&(b.slice_del(),b.ket=b.cursor,b.eq_s_b(2,"ic")&&(b.bra=b.cursor,h()&&b.slice_del())))}return!0}function C(){var e;e=b.limit-b.cursor,b.ket=b.cursor,b.in_grouping_b(f,97,242)&&(b.bra=b.cursor,k()&&(b.slice_del(),b.ket=b.cursor,b.eq_s_b(1,"i")&&(b.bra=b.cursor,k())))?b.slice_del():b.cursor=b.limit-e,b.ket=b.cursor,b.eq_s_b(1,"h")&&(b.bra=b.cursor,b.in_grouping_b(v,99,103)&&k()&&b.slice_del())}this.setCurrent=function(e){b.setCurrent(e)},this.getCurrent=function(){return b.getCurrent()},this.stem=function(){var e,r,n,i=b.cursor;return function(){for(var e,r,n,i,o=b.cursor;;){if(b.bra=b.cursor,e=b.find_among(a,7))switch(b.ket=b.cursor,e){case 1:b.slice_from("à");continue;case 2:b.slice_from("è");continue;case 3:b.slice_from("ì");continue;case 4:b.slice_from("ò");continue;case 5:b.slice_from("ù");continue;case 6:b.slice_from("qU");continue;case 7:if(b.cursor>=b.limit)break;b.cursor++;continue}break}for(b.cursor=o;;)for(r=b.cursor;;){if(n=b.cursor,b.in_grouping(m,97,249)){if(b.bra=b.cursor,i=b.cursor,d("u","U",n))break;if(b.cursor=i,d("i","I",n))break}if(b.cursor=n,b.cursor>=b.limit)return b.cursor=r;b.cursor++}}(),b.cursor=i,e=b.cursor,s=b.limit,o=t=s,g(),b.cursor=e,p()&&(t=b.cursor,p()&&(o=b.cursor)),b.limit_backward=i,b.cursor=b.limit,function(){var e;if(b.ket=b.cursor,b.find_among_b(c,37)&&(b.bra=b.cursor,(e=b.find_among_b(w,5))&&k()))switch(e){case 1:b.slice_del();break;case 2:b.slice_from("e")}}(),b.cursor=b.limit,q()||(b.cursor=b.limit,b.cursor>=s&&(n=b.limit_backward,b.limit_backward=s,b.ket=b.cursor,(r=b.find_among_b(l,87))&&(b.bra=b.cursor,1==r&&b.slice_del()),b.limit_backward=n)),b.cursor=b.limit,C(),b.cursor=b.limit_backward,function(){for(var e;b.bra=b.cursor,e=b.find_among(u,3);)switch(b.ket=b.cursor,e){case 1:b.slice_from("i");break;case 2:b.slice_from("u");break;case 3:if(b.cursor>=b.limit)return;b.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.it.stemmer,"stemmer-it"),e.it.stopWordFilter=e.generateStopWordFilter("a abbia abbiamo abbiano abbiate ad agl agli ai al all alla alle allo anche avemmo avendo avesse avessero avessi avessimo aveste avesti avete aveva avevamo avevano avevate avevi avevo avrai avranno avrebbe avrebbero avrei avremmo avremo avreste avresti avrete avrà avrò avuta avute avuti avuto c che chi ci coi col come con contro cui da dagl dagli dai dal dall dalla dalle dallo degl degli dei del dell della delle dello di dov dove e ebbe ebbero ebbi ed era erano eravamo eravate eri ero essendo faccia facciamo facciano facciate faccio facemmo facendo facesse facessero facessi facessimo faceste facesti faceva facevamo facevano facevate facevi facevo fai fanno farai faranno farebbe farebbero farei faremmo faremo fareste faresti farete farà farò fece fecero feci fosse fossero fossi fossimo foste fosti fu fui fummo furono gli ha hai hanno ho i il in io l la le lei li lo loro lui ma mi mia mie miei mio ne negl negli nei nel nell nella nelle nello noi non nostra nostre nostri nostro o per perché più quale quanta quante quanti quanto quella quelle quelli quello questa queste questi questo sarai saranno sarebbe sarebbero sarei saremmo saremo sareste saresti sarete sarà sarò se sei si sia siamo siano siate siete sono sta stai stando stanno starai staranno starebbe starebbero starei staremmo staremo stareste staresti starete starà starò stava stavamo stavano stavate stavi stavo stemmo stesse stessero stessi stessimo steste stesti stette stettero stetti stia stiamo stiano stiate sto su sua sue sugl sugli sui sul sull sulla sulle sullo suo suoi ti tra tu tua tue tuo tuoi tutti tutto un una uno vi voi vostra vostre vostri vostro è".split(" ")),e.Pipeline.registerFunction(e.it.stopWordFilter,"stopWordFilter-it")}}); \ No newline at end of file diff --git a/docs/api/py/_static/javascripts/lunr/lunr.ja.js b/docs/api/py/_static/javascripts/lunr/lunr.ja.js new file mode 100644 index 0000000000000..69f620250d95b --- /dev/null +++ b/docs/api/py/_static/javascripts/lunr/lunr.ja.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(m){if(void 0===m)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===m.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var l="2"==m.version[0];m.ja=function(){this.pipeline.reset(),this.pipeline.add(m.ja.trimmer,m.ja.stopWordFilter,m.ja.stemmer),l?this.tokenizer=m.ja.tokenizer:(m.tokenizer&&(m.tokenizer=m.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=m.ja.tokenizer))};var j=new m.TinySegmenter;m.ja.tokenizer=function(e){var r,t,i,n,o,s,p,a,u;if(!arguments.length||null==e||null==e)return[];if(Array.isArray(e))return e.map(function(e){return l?new m.Token(e.toLowerCase()):e.toLowerCase()});for(r=(t=e.toString().toLowerCase().replace(/^\s+/,"")).length-1;0<=r;r--)if(/\S/.test(t.charAt(r))){t=t.substring(0,r+1);break}for(o=[],i=t.length,p=a=0;a<=i;a++)if(s=a-p,t.charAt(a).match(/\s/)||a==i){if(0=_.limit||(_.cursor++,!1)}function w(){for(;!_.in_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}for(;!_.out_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}return!1}function b(){return i<=_.cursor}function p(){return e<=_.cursor}function g(){var r=_.limit-_.cursor;_.find_among_b(t,3)&&(_.cursor=_.limit-r,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del()))}function h(){var r;u=!1,_.ket=_.cursor,_.eq_s_b(1,"e")&&(_.bra=_.cursor,b()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.slice_del(),u=!0,g())))}function k(){var r;b()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.eq_s_b(3,"gem")||(_.cursor=_.limit-r,_.slice_del(),g())))}this.setCurrent=function(r){_.setCurrent(r)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var r=_.cursor;return function(){for(var r,e,i,n=_.cursor;;){if(_.bra=_.cursor,r=_.find_among(o,11))switch(_.ket=_.cursor,r){case 1:_.slice_from("a");continue;case 2:_.slice_from("e");continue;case 3:_.slice_from("i");continue;case 4:_.slice_from("o");continue;case 5:_.slice_from("u");continue;case 6:if(_.cursor>=_.limit)break;_.cursor++;continue}break}for(_.cursor=n,_.bra=n,_.eq_s(1,"y")?(_.ket=_.cursor,_.slice_from("Y")):_.cursor=n;;)if(e=_.cursor,_.in_grouping(m,97,232)){if(i=_.cursor,_.bra=i,_.eq_s(1,"i"))_.ket=_.cursor,_.in_grouping(m,97,232)&&(_.slice_from("I"),_.cursor=e);else if(_.cursor=i,_.eq_s(1,"y"))_.ket=_.cursor,_.slice_from("Y"),_.cursor=e;else if(s(e))break}else if(s(e))break}(),_.cursor=r,i=_.limit,e=i,w()||((i=_.cursor)<3&&(i=3),w()||(e=_.cursor)),_.limit_backward=r,_.cursor=_.limit,function(){var r,e,i,n,o,t,s=_.limit-_.cursor;if(_.ket=_.cursor,r=_.find_among_b(c,5))switch(_.bra=_.cursor,r){case 1:b()&&_.slice_from("heid");break;case 2:k();break;case 3:b()&&_.out_grouping_b(f,97,232)&&_.slice_del()}if(_.cursor=_.limit-s,h(),_.cursor=_.limit-s,_.ket=_.cursor,_.eq_s_b(4,"heid")&&(_.bra=_.cursor,p()&&(e=_.limit-_.cursor,_.eq_s_b(1,"c")||(_.cursor=_.limit-e,_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"en")&&(_.bra=_.cursor,k())))),_.cursor=_.limit-s,_.ket=_.cursor,r=_.find_among_b(a,6))switch(_.bra=_.cursor,r){case 1:if(p()){if(_.slice_del(),i=_.limit-_.cursor,_.ket=_.cursor,_.eq_s_b(2,"ig")&&(_.bra=_.cursor,p()&&(n=_.limit-_.cursor,!_.eq_s_b(1,"e")))){_.cursor=_.limit-n,_.slice_del();break}_.cursor=_.limit-i,g()}break;case 2:p()&&(o=_.limit-_.cursor,_.eq_s_b(1,"e")||(_.cursor=_.limit-o,_.slice_del()));break;case 3:p()&&(_.slice_del(),h());break;case 4:p()&&_.slice_del();break;case 5:p()&&u&&_.slice_del()}_.cursor=_.limit-s,_.out_grouping_b(d,73,232)&&(t=_.limit-_.cursor,_.find_among_b(l,4)&&_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-t,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del())))}(),_.cursor=_.limit_backward,function(){for(var r;;)if(_.bra=_.cursor,r=_.find_among(n,3))switch(_.ket=_.cursor,r){case 1:_.slice_from("y");break;case 2:_.slice_from("i");break;case 3:if(_.cursor>=_.limit)return;_.cursor++}}(),!0}},function(r){return"function"==typeof r.update?r.update(function(r){return e.setCurrent(r),e.stem(),e.getCurrent()}):(e.setCurrent(r),e.stem(),e.getCurrent())}),r.Pipeline.registerFunction(r.nl.stemmer,"stemmer-nl"),r.nl.stopWordFilter=r.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),r.Pipeline.registerFunction(r.nl.stopWordFilter,"stopWordFilter-nl")}}); \ No newline at end of file diff --git a/docs/api/py/_static/javascripts/lunr/lunr.no.js b/docs/api/py/_static/javascripts/lunr/lunr.no.js new file mode 100644 index 0000000000000..3d156b9c191cd --- /dev/null +++ b/docs/api/py/_static/javascripts/lunr/lunr.no.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,n,i;e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWordFilter,e.no.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.no.stemmer))},e.no.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.no.trimmer=e.trimmerSupport.generateTrimmer(e.no.wordCharacters),e.Pipeline.registerFunction(e.no.trimmer,"trimmer-no"),e.no.stemmer=(r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){var o,s,a=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],m=[new r("dt",-1,-1),new r("vt",-1,-1)],l=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],u=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],d=[119,125,149,1],c=new n;this.setCurrent=function(e){c.setCurrent(e)},this.getCurrent=function(){return c.getCurrent()},this.stem=function(){var e,r,n,i,t=c.cursor;return function(){var e,r=c.cursor+3;if(s=c.limit,0<=r||r<=c.limit){for(o=r;;){if(e=c.cursor,c.in_grouping(u,97,248)){c.cursor=e;break}if(e>=c.limit)return;c.cursor=e+1}for(;!c.out_grouping(u,97,248);){if(c.cursor>=c.limit)return;c.cursor++}(s=c.cursor)=s&&(r=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,e=c.find_among_b(a,29),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del();break;case 2:n=c.limit-c.cursor,c.in_grouping_b(d,98,122)?c.slice_del():(c.cursor=c.limit-n,c.eq_s_b(1,"k")&&c.out_grouping_b(u,97,248)&&c.slice_del());break;case 3:c.slice_from("er")}}(),c.cursor=c.limit,r=c.limit-c.cursor,c.cursor>=s&&(e=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,c.find_among_b(m,2)?(c.bra=c.cursor,c.limit_backward=e,c.cursor=c.limit-r,c.cursor>c.limit_backward&&(c.cursor--,c.bra=c.cursor,c.slice_del())):c.limit_backward=e),c.cursor=c.limit,c.cursor>=s&&(i=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,(n=c.find_among_b(l,11))?(c.bra=c.cursor,c.limit_backward=i,1==n&&c.slice_del()):c.limit_backward=i),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}}); \ No newline at end of file diff --git a/docs/api/py/_static/javascripts/lunr/lunr.pt.js b/docs/api/py/_static/javascripts/lunr/lunr.pt.js new file mode 100644 index 0000000000000..f50fc9fa6d5a0 --- /dev/null +++ b/docs/api/py/_static/javascripts/lunr/lunr.pt.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var j,C,r;e.pt=function(){this.pipeline.reset(),this.pipeline.add(e.pt.trimmer,e.pt.stopWordFilter,e.pt.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.pt.stemmer))},e.pt.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.pt.trimmer=e.trimmerSupport.generateTrimmer(e.pt.wordCharacters),e.Pipeline.registerFunction(e.pt.trimmer,"trimmer-pt"),e.pt.stemmer=(j=e.stemmerSupport.Among,C=e.stemmerSupport.SnowballProgram,r=new function(){var s,n,i,o=[new j("",-1,3),new j("ã",0,1),new j("õ",0,2)],a=[new j("",-1,3),new j("a~",0,1),new j("o~",0,2)],r=[new j("ic",-1,-1),new j("ad",-1,-1),new j("os",-1,-1),new j("iv",-1,1)],t=[new j("ante",-1,1),new j("avel",-1,1),new j("ível",-1,1)],u=[new j("ic",-1,1),new j("abil",-1,1),new j("iv",-1,1)],w=[new j("ica",-1,1),new j("ância",-1,1),new j("ência",-1,4),new j("ira",-1,9),new j("adora",-1,1),new j("osa",-1,1),new j("ista",-1,1),new j("iva",-1,8),new j("eza",-1,1),new j("logía",-1,2),new j("idade",-1,7),new j("ante",-1,1),new j("mente",-1,6),new j("amente",12,5),new j("ável",-1,1),new j("ível",-1,1),new j("ución",-1,3),new j("ico",-1,1),new j("ismo",-1,1),new j("oso",-1,1),new j("amento",-1,1),new j("imento",-1,1),new j("ivo",-1,8),new j("aça~o",-1,1),new j("ador",-1,1),new j("icas",-1,1),new j("ências",-1,4),new j("iras",-1,9),new j("adoras",-1,1),new j("osas",-1,1),new j("istas",-1,1),new j("ivas",-1,8),new j("ezas",-1,1),new j("logías",-1,2),new j("idades",-1,7),new j("uciones",-1,3),new j("adores",-1,1),new j("antes",-1,1),new j("aço~es",-1,1),new j("icos",-1,1),new j("ismos",-1,1),new j("osos",-1,1),new j("amentos",-1,1),new j("imentos",-1,1),new j("ivos",-1,8)],m=[new j("ada",-1,1),new j("ida",-1,1),new j("ia",-1,1),new j("aria",2,1),new j("eria",2,1),new j("iria",2,1),new j("ara",-1,1),new j("era",-1,1),new j("ira",-1,1),new j("ava",-1,1),new j("asse",-1,1),new j("esse",-1,1),new j("isse",-1,1),new j("aste",-1,1),new j("este",-1,1),new j("iste",-1,1),new j("ei",-1,1),new j("arei",16,1),new j("erei",16,1),new j("irei",16,1),new j("am",-1,1),new j("iam",20,1),new j("ariam",21,1),new j("eriam",21,1),new j("iriam",21,1),new j("aram",20,1),new j("eram",20,1),new j("iram",20,1),new j("avam",20,1),new j("em",-1,1),new j("arem",29,1),new j("erem",29,1),new j("irem",29,1),new j("assem",29,1),new j("essem",29,1),new j("issem",29,1),new j("ado",-1,1),new j("ido",-1,1),new j("ando",-1,1),new j("endo",-1,1),new j("indo",-1,1),new j("ara~o",-1,1),new j("era~o",-1,1),new j("ira~o",-1,1),new j("ar",-1,1),new j("er",-1,1),new j("ir",-1,1),new j("as",-1,1),new j("adas",47,1),new j("idas",47,1),new j("ias",47,1),new j("arias",50,1),new j("erias",50,1),new j("irias",50,1),new j("aras",47,1),new j("eras",47,1),new j("iras",47,1),new j("avas",47,1),new j("es",-1,1),new j("ardes",58,1),new j("erdes",58,1),new j("irdes",58,1),new j("ares",58,1),new j("eres",58,1),new j("ires",58,1),new j("asses",58,1),new j("esses",58,1),new j("isses",58,1),new j("astes",58,1),new j("estes",58,1),new j("istes",58,1),new j("is",-1,1),new j("ais",71,1),new j("eis",71,1),new j("areis",73,1),new j("ereis",73,1),new j("ireis",73,1),new j("áreis",73,1),new j("éreis",73,1),new j("íreis",73,1),new j("ásseis",73,1),new j("ésseis",73,1),new j("ísseis",73,1),new j("áveis",73,1),new j("íeis",73,1),new j("aríeis",84,1),new j("eríeis",84,1),new j("iríeis",84,1),new j("ados",-1,1),new j("idos",-1,1),new j("amos",-1,1),new j("áramos",90,1),new j("éramos",90,1),new j("íramos",90,1),new j("ávamos",90,1),new j("íamos",90,1),new j("aríamos",95,1),new j("eríamos",95,1),new j("iríamos",95,1),new j("emos",-1,1),new j("aremos",99,1),new j("eremos",99,1),new j("iremos",99,1),new j("ássemos",99,1),new j("êssemos",99,1),new j("íssemos",99,1),new j("imos",-1,1),new j("armos",-1,1),new j("ermos",-1,1),new j("irmos",-1,1),new j("ámos",-1,1),new j("arás",-1,1),new j("erás",-1,1),new j("irás",-1,1),new j("eu",-1,1),new j("iu",-1,1),new j("ou",-1,1),new j("ará",-1,1),new j("erá",-1,1),new j("irá",-1,1)],c=[new j("a",-1,1),new j("i",-1,1),new j("o",-1,1),new j("os",-1,1),new j("á",-1,1),new j("í",-1,1),new j("ó",-1,1)],l=[new j("e",-1,1),new j("ç",-1,2),new j("é",-1,1),new j("ê",-1,1)],f=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,3,19,12,2],d=new C;function v(){if(d.out_grouping(f,97,250)){for(;!d.in_grouping(f,97,250);){if(d.cursor>=d.limit)return!0;d.cursor++}return!1}return!0}function p(){var e,r,s=d.cursor;if(d.in_grouping(f,97,250))if(e=d.cursor,v()){if(d.cursor=e,function(){if(d.in_grouping(f,97,250))for(;!d.out_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}return i=d.cursor,!0}())return}else i=d.cursor;if(d.cursor=s,d.out_grouping(f,97,250)){if(r=d.cursor,v()){if(d.cursor=r,!d.in_grouping(f,97,250)||d.cursor>=d.limit)return;d.cursor++}i=d.cursor}}function _(){for(;!d.in_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}for(;!d.out_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}return!0}function h(){return i<=d.cursor}function b(){return s<=d.cursor}function g(){var e;if(d.ket=d.cursor,!(e=d.find_among_b(w,45)))return!1;switch(d.bra=d.cursor,e){case 1:if(!b())return!1;d.slice_del();break;case 2:if(!b())return!1;d.slice_from("log");break;case 3:if(!b())return!1;d.slice_from("u");break;case 4:if(!b())return!1;d.slice_from("ente");break;case 5:if(!(n<=d.cursor))return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(r,4))&&(d.bra=d.cursor,b()&&(d.slice_del(),1==e&&(d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,b()&&d.slice_del()))));break;case 6:if(!b())return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(t,3))&&(d.bra=d.cursor,1==e&&b()&&d.slice_del());break;case 7:if(!b())return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(u,3))&&(d.bra=d.cursor,1==e&&b()&&d.slice_del());break;case 8:if(!b())return!1;d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,b()&&d.slice_del());break;case 9:if(!h()||!d.eq_s_b(1,"e"))return!1;d.slice_from("ir")}return!0}function k(e,r){if(d.eq_s_b(1,e)){d.bra=d.cursor;var s=d.limit-d.cursor;if(d.eq_s_b(1,r))return d.cursor=d.limit-s,h()&&d.slice_del(),!1}return!0}function q(){if(!g()&&(d.cursor=d.limit,!function(){var e,r;if(d.cursor>=i){if(r=d.limit_backward,d.limit_backward=i,d.ket=d.cursor,e=d.find_among_b(m,120))return d.bra=d.cursor,1==e&&d.slice_del(),d.limit_backward=r,!0;d.limit_backward=r}return!1}()))return d.cursor=d.limit,d.ket=d.cursor,void((e=d.find_among_b(c,7))&&(d.bra=d.cursor,1==e&&h()&&d.slice_del()));var e;d.cursor=d.limit,d.ket=d.cursor,d.eq_s_b(1,"i")&&(d.bra=d.cursor,d.eq_s_b(1,"c")&&(d.cursor=d.limit,h()&&d.slice_del()))}this.setCurrent=function(e){d.setCurrent(e)},this.getCurrent=function(){return d.getCurrent()},this.stem=function(){var e,r=d.cursor;return function(){for(var e;;){if(d.bra=d.cursor,e=d.find_among(o,3))switch(d.ket=d.cursor,e){case 1:d.slice_from("a~");continue;case 2:d.slice_from("o~");continue;case 3:if(d.cursor>=d.limit)break;d.cursor++;continue}break}}(),d.cursor=r,e=d.cursor,i=d.limit,s=n=i,p(),d.cursor=e,_()&&(n=d.cursor,_()&&(s=d.cursor)),d.limit_backward=r,d.cursor=d.limit,q(),d.cursor=d.limit,function(){var e;if(d.ket=d.cursor,e=d.find_among_b(l,4))switch(d.bra=d.cursor,e){case 1:h()&&(d.slice_del(),d.ket=d.cursor,d.limit,d.cursor,k("u","g")&&k("i","c"));break;case 2:d.slice_from("c")}}(),d.cursor=d.limit_backward,function(){for(var e;;){if(d.bra=d.cursor,e=d.find_among(a,3))switch(d.ket=d.cursor,e){case 1:d.slice_from("ã");continue;case 2:d.slice_from("õ");continue;case 3:if(d.cursor>=d.limit)break;d.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.pt.stemmer,"stemmer-pt"),e.pt.stopWordFilter=e.generateStopWordFilter("a ao aos aquela aquelas aquele aqueles aquilo as até com como da das de dela delas dele deles depois do dos e ela elas ele eles em entre era eram essa essas esse esses esta estamos estas estava estavam este esteja estejam estejamos estes esteve estive estivemos estiver estivera estiveram estiverem estivermos estivesse estivessem estivéramos estivéssemos estou está estávamos estão eu foi fomos for fora foram forem formos fosse fossem fui fôramos fôssemos haja hajam hajamos havemos hei houve houvemos houver houvera houveram houverei houverem houveremos houveria houveriam houvermos houverá houverão houveríamos houvesse houvessem houvéramos houvéssemos há hão isso isto já lhe lhes mais mas me mesmo meu meus minha minhas muito na nas nem no nos nossa nossas nosso nossos num numa não nós o os ou para pela pelas pelo pelos por qual quando que quem se seja sejam sejamos sem serei seremos seria seriam será serão seríamos seu seus somos sou sua suas são só também te tem temos tenha tenham tenhamos tenho terei teremos teria teriam terá terão teríamos teu teus teve tinha tinham tive tivemos tiver tivera tiveram tiverem tivermos tivesse tivessem tivéramos tivéssemos tu tua tuas tém tínhamos um uma você vocês vos à às éramos".split(" ")),e.Pipeline.registerFunction(e.pt.stopWordFilter,"stopWordFilter-pt")}}); \ No newline at end of file diff --git a/docs/api/py/_static/javascripts/lunr/lunr.ro.js b/docs/api/py/_static/javascripts/lunr/lunr.ro.js new file mode 100644 index 0000000000000..b19627e1b35eb --- /dev/null +++ b/docs/api/py/_static/javascripts/lunr/lunr.ro.js @@ -0,0 +1 @@ +!function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var h,z,i;e.ro=function(){this.pipeline.reset(),this.pipeline.add(e.ro.trimmer,e.ro.stopWordFilter,e.ro.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ro.stemmer))},e.ro.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.ro.trimmer=e.trimmerSupport.generateTrimmer(e.ro.wordCharacters),e.Pipeline.registerFunction(e.ro.trimmer,"trimmer-ro"),e.ro.stemmer=(h=e.stemmerSupport.Among,z=e.stemmerSupport.SnowballProgram,i=new function(){var r,n,t,a,o=[new h("",-1,3),new h("I",0,1),new h("U",0,2)],s=[new h("ea",-1,3),new h("aţia",-1,7),new h("aua",-1,2),new h("iua",-1,4),new h("aţie",-1,7),new h("ele",-1,3),new h("ile",-1,5),new h("iile",6,4),new h("iei",-1,4),new h("atei",-1,6),new h("ii",-1,4),new h("ului",-1,1),new h("ul",-1,1),new h("elor",-1,3),new h("ilor",-1,4),new h("iilor",14,4)],c=[new h("icala",-1,4),new h("iciva",-1,4),new h("ativa",-1,5),new h("itiva",-1,6),new h("icale",-1,4),new h("aţiune",-1,5),new h("iţiune",-1,6),new h("atoare",-1,5),new h("itoare",-1,6),new h("ătoare",-1,5),new h("icitate",-1,4),new h("abilitate",-1,1),new h("ibilitate",-1,2),new h("ivitate",-1,3),new h("icive",-1,4),new h("ative",-1,5),new h("itive",-1,6),new h("icali",-1,4),new h("atori",-1,5),new h("icatori",18,4),new h("itori",-1,6),new h("ători",-1,5),new h("icitati",-1,4),new h("abilitati",-1,1),new h("ivitati",-1,3),new h("icivi",-1,4),new h("ativi",-1,5),new h("itivi",-1,6),new h("icităi",-1,4),new h("abilităi",-1,1),new h("ivităi",-1,3),new h("icităţi",-1,4),new h("abilităţi",-1,1),new h("ivităţi",-1,3),new h("ical",-1,4),new h("ator",-1,5),new h("icator",35,4),new h("itor",-1,6),new h("ător",-1,5),new h("iciv",-1,4),new h("ativ",-1,5),new h("itiv",-1,6),new h("icală",-1,4),new h("icivă",-1,4),new h("ativă",-1,5),new h("itivă",-1,6)],u=[new h("ica",-1,1),new h("abila",-1,1),new h("ibila",-1,1),new h("oasa",-1,1),new h("ata",-1,1),new h("ita",-1,1),new h("anta",-1,1),new h("ista",-1,3),new h("uta",-1,1),new h("iva",-1,1),new h("ic",-1,1),new h("ice",-1,1),new h("abile",-1,1),new h("ibile",-1,1),new h("isme",-1,3),new h("iune",-1,2),new h("oase",-1,1),new h("ate",-1,1),new h("itate",17,1),new h("ite",-1,1),new h("ante",-1,1),new h("iste",-1,3),new h("ute",-1,1),new h("ive",-1,1),new h("ici",-1,1),new h("abili",-1,1),new h("ibili",-1,1),new h("iuni",-1,2),new h("atori",-1,1),new h("osi",-1,1),new h("ati",-1,1),new h("itati",30,1),new h("iti",-1,1),new h("anti",-1,1),new h("isti",-1,3),new h("uti",-1,1),new h("işti",-1,3),new h("ivi",-1,1),new h("ităi",-1,1),new h("oşi",-1,1),new h("ităţi",-1,1),new h("abil",-1,1),new h("ibil",-1,1),new h("ism",-1,3),new h("ator",-1,1),new h("os",-1,1),new h("at",-1,1),new h("it",-1,1),new h("ant",-1,1),new h("ist",-1,3),new h("ut",-1,1),new h("iv",-1,1),new h("ică",-1,1),new h("abilă",-1,1),new h("ibilă",-1,1),new h("oasă",-1,1),new h("ată",-1,1),new h("ită",-1,1),new h("antă",-1,1),new h("istă",-1,3),new h("ută",-1,1),new h("ivă",-1,1)],w=[new h("ea",-1,1),new h("ia",-1,1),new h("esc",-1,1),new h("ăsc",-1,1),new h("ind",-1,1),new h("ând",-1,1),new h("are",-1,1),new h("ere",-1,1),new h("ire",-1,1),new h("âre",-1,1),new h("se",-1,2),new h("ase",10,1),new h("sese",10,2),new h("ise",10,1),new h("use",10,1),new h("âse",10,1),new h("eşte",-1,1),new h("ăşte",-1,1),new h("eze",-1,1),new h("ai",-1,1),new h("eai",19,1),new h("iai",19,1),new h("sei",-1,2),new h("eşti",-1,1),new h("ăşti",-1,1),new h("ui",-1,1),new h("ezi",-1,1),new h("âi",-1,1),new h("aşi",-1,1),new h("seşi",-1,2),new h("aseşi",29,1),new h("seseşi",29,2),new h("iseşi",29,1),new h("useşi",29,1),new h("âseşi",29,1),new h("işi",-1,1),new h("uşi",-1,1),new h("âşi",-1,1),new h("aţi",-1,2),new h("eaţi",38,1),new h("iaţi",38,1),new h("eţi",-1,2),new h("iţi",-1,2),new h("âţi",-1,2),new h("arăţi",-1,1),new h("serăţi",-1,2),new h("aserăţi",45,1),new h("seserăţi",45,2),new h("iserăţi",45,1),new h("userăţi",45,1),new h("âserăţi",45,1),new h("irăţi",-1,1),new h("urăţi",-1,1),new h("ârăţi",-1,1),new h("am",-1,1),new h("eam",54,1),new h("iam",54,1),new h("em",-1,2),new h("asem",57,1),new h("sesem",57,2),new h("isem",57,1),new h("usem",57,1),new h("âsem",57,1),new h("im",-1,2),new h("âm",-1,2),new h("ăm",-1,2),new h("arăm",65,1),new h("serăm",65,2),new h("aserăm",67,1),new h("seserăm",67,2),new h("iserăm",67,1),new h("userăm",67,1),new h("âserăm",67,1),new h("irăm",65,1),new h("urăm",65,1),new h("ârăm",65,1),new h("au",-1,1),new h("eau",76,1),new h("iau",76,1),new h("indu",-1,1),new h("ându",-1,1),new h("ez",-1,1),new h("ească",-1,1),new h("ară",-1,1),new h("seră",-1,2),new h("aseră",84,1),new h("seseră",84,2),new h("iseră",84,1),new h("useră",84,1),new h("âseră",84,1),new h("iră",-1,1),new h("ură",-1,1),new h("âră",-1,1),new h("ează",-1,1)],i=[new h("a",-1,1),new h("e",-1,1),new h("ie",1,1),new h("i",-1,1),new h("ă",-1,1)],m=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,2,32,0,0,4],l=new z;function f(e,i){l.eq_s(1,e)&&(l.ket=l.cursor,l.in_grouping(m,97,259)&&l.slice_from(i))}function p(){if(l.out_grouping(m,97,259)){for(;!l.in_grouping(m,97,259);){if(l.cursor>=l.limit)return!0;l.cursor++}return!1}return!0}function d(){var e,i,r=l.cursor;if(l.in_grouping(m,97,259)){if(e=l.cursor,!p())return void(a=l.cursor);if(l.cursor=e,!function(){if(l.in_grouping(m,97,259))for(;!l.out_grouping(m,97,259);){if(l.cursor>=l.limit)return!0;l.cursor++}return!1}())return void(a=l.cursor)}l.cursor=r,l.out_grouping(m,97,259)&&(i=l.cursor,p()&&(l.cursor=i,l.in_grouping(m,97,259)&&l.cursor=l.limit)return!1;l.cursor++}for(;!l.out_grouping(m,97,259);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function v(){return t<=l.cursor}function _(){var e,i=l.limit-l.cursor;if(l.ket=l.cursor,(e=l.find_among_b(c,46))&&(l.bra=l.cursor,v())){switch(e){case 1:l.slice_from("abil");break;case 2:l.slice_from("ibil");break;case 3:l.slice_from("iv");break;case 4:l.slice_from("ic");break;case 5:l.slice_from("at");break;case 6:l.slice_from("it")}return r=!0,l.cursor=l.limit-i,!0}return!1}function g(){var e,i;for(r=!1;;)if(i=l.limit-l.cursor,!_()){l.cursor=l.limit-i;break}if(l.ket=l.cursor,(e=l.find_among_b(u,62))&&(l.bra=l.cursor,n<=l.cursor)){switch(e){case 1:l.slice_del();break;case 2:l.eq_s_b(1,"ţ")&&(l.bra=l.cursor,l.slice_from("t"));break;case 3:l.slice_from("ist")}r=!0}}function k(){var e;l.ket=l.cursor,(e=l.find_among_b(i,5))&&(l.bra=l.cursor,a<=l.cursor&&1==e&&l.slice_del())}this.setCurrent=function(e){l.setCurrent(e)},this.getCurrent=function(){return l.getCurrent()},this.stem=function(){var e,i=l.cursor;return function(){for(var e,i;e=l.cursor,l.in_grouping(m,97,259)&&(i=l.cursor,l.bra=i,f("u","U"),l.cursor=i,f("i","I")),l.cursor=e,!(l.cursor>=l.limit);)l.cursor++}(),l.cursor=i,e=l.cursor,a=l.limit,n=t=a,d(),l.cursor=e,b()&&(t=l.cursor,b()&&(n=l.cursor)),l.limit_backward=i,l.cursor=l.limit,function(){var e,i;if(l.ket=l.cursor,(e=l.find_among_b(s,16))&&(l.bra=l.cursor,v()))switch(e){case 1:l.slice_del();break;case 2:l.slice_from("a");break;case 3:l.slice_from("e");break;case 4:l.slice_from("i");break;case 5:i=l.limit-l.cursor,l.eq_s_b(2,"ab")||(l.cursor=l.limit-i,l.slice_from("i"));break;case 6:l.slice_from("at");break;case 7:l.slice_from("aţi")}}(),l.cursor=l.limit,g(),l.cursor=l.limit,r||(l.cursor=l.limit,function(){var e,i,r;if(l.cursor>=a){if(i=l.limit_backward,l.limit_backward=a,l.ket=l.cursor,e=l.find_among_b(w,94))switch(l.bra=l.cursor,e){case 1:if(r=l.limit-l.cursor,!l.out_grouping_b(m,97,259)&&(l.cursor=l.limit-r,!l.eq_s_b(1,"u")))break;case 2:l.slice_del()}l.limit_backward=i}}(),l.cursor=l.limit),k(),l.cursor=l.limit_backward,function(){for(var e;;){if(l.bra=l.cursor,e=l.find_among(o,3))switch(l.ket=l.cursor,e){case 1:l.slice_from("i");continue;case 2:l.slice_from("u");continue;case 3:if(l.cursor>=l.limit)break;l.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.ro.stemmer,"stemmer-ro"),e.ro.stopWordFilter=e.generateStopWordFilter("acea aceasta această aceea acei aceia acel acela acele acelea acest acesta aceste acestea aceşti aceştia acolo acord acum ai aia aibă aici al ale alea altceva altcineva am ar are asemenea asta astea astăzi asupra au avea avem aveţi azi aş aşadar aţi bine bucur bună ca care caut ce cel ceva chiar cinci cine cineva contra cu cum cumva curând curînd când cât câte câtva câţi cînd cît cîte cîtva cîţi că căci cărei căror cărui către da dacă dar datorită dată dau de deci deja deoarece departe deşi din dinaintea dintr- dintre doi doilea două drept după dă ea ei el ele eram este eu eşti face fata fi fie fiecare fii fim fiu fiţi frumos fără graţie halbă iar ieri la le li lor lui lângă lîngă mai mea mei mele mereu meu mi mie mine mult multă mulţi mulţumesc mâine mîine mă ne nevoie nici nicăieri nimeni nimeri nimic nişte noastre noastră noi noroc nostru nouă noştri nu opt ori oricare orice oricine oricum oricând oricât oricînd oricît oriunde patra patru patrulea pe pentru peste pic poate pot prea prima primul prin puţin puţina puţină până pînă rog sa sale sau se spate spre sub sunt suntem sunteţi sută sînt sîntem sînteţi să săi său ta tale te timp tine toate toată tot totuşi toţi trei treia treilea tu tăi tău un una unde undeva unei uneia unele uneori unii unor unora unu unui unuia unul vi voastre voastră voi vostru vouă voştri vreme vreo vreun vă zece zero zi zice îi îl îmi împotriva în înainte înaintea încotro încât încît între întrucât întrucît îţi ăla ălea ăsta ăstea ăştia şapte şase şi ştiu ţi ţie".split(" ")),e.Pipeline.registerFunction(e.ro.stopWordFilter,"stopWordFilter-ro")}}); \ No newline at end of file diff --git a/docs/api/py/_static/javascripts/lunr/lunr.ru.js b/docs/api/py/_static/javascripts/lunr/lunr.ru.js new file mode 100644 index 0000000000000..ac99248044a35 --- /dev/null +++ b/docs/api/py/_static/javascripts/lunr/lunr.ru.js @@ -0,0 +1 @@ +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var h,g,n;e.ru=function(){this.pipeline.reset(),this.pipeline.add(e.ru.trimmer,e.ru.stopWordFilter,e.ru.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ru.stemmer))},e.ru.wordCharacters="Ѐ-҄҇-ԯᴫᵸⷠ-ⷿꙀ-ꚟ︮︯",e.ru.trimmer=e.trimmerSupport.generateTrimmer(e.ru.wordCharacters),e.Pipeline.registerFunction(e.ru.trimmer,"trimmer-ru"),e.ru.stemmer=(h=e.stemmerSupport.Among,g=e.stemmerSupport.SnowballProgram,n=new function(){var n,e,r=[new h("в",-1,1),new h("ив",0,2),new h("ыв",0,2),new h("вши",-1,1),new h("ивши",3,2),new h("ывши",3,2),new h("вшись",-1,1),new h("ившись",6,2),new h("ывшись",6,2)],t=[new h("ее",-1,1),new h("ие",-1,1),new h("ое",-1,1),new h("ые",-1,1),new h("ими",-1,1),new h("ыми",-1,1),new h("ей",-1,1),new h("ий",-1,1),new h("ой",-1,1),new h("ый",-1,1),new h("ем",-1,1),new h("им",-1,1),new h("ом",-1,1),new h("ым",-1,1),new h("его",-1,1),new h("ого",-1,1),new h("ему",-1,1),new h("ому",-1,1),new h("их",-1,1),new h("ых",-1,1),new h("ею",-1,1),new h("ою",-1,1),new h("ую",-1,1),new h("юю",-1,1),new h("ая",-1,1),new h("яя",-1,1)],w=[new h("ем",-1,1),new h("нн",-1,1),new h("вш",-1,1),new h("ивш",2,2),new h("ывш",2,2),new h("щ",-1,1),new h("ющ",5,1),new h("ующ",6,2)],i=[new h("сь",-1,1),new h("ся",-1,1)],u=[new h("ла",-1,1),new h("ила",0,2),new h("ыла",0,2),new h("на",-1,1),new h("ена",3,2),new h("ете",-1,1),new h("ите",-1,2),new h("йте",-1,1),new h("ейте",7,2),new h("уйте",7,2),new h("ли",-1,1),new h("или",10,2),new h("ыли",10,2),new h("й",-1,1),new h("ей",13,2),new h("уй",13,2),new h("л",-1,1),new h("ил",16,2),new h("ыл",16,2),new h("ем",-1,1),new h("им",-1,2),new h("ым",-1,2),new h("н",-1,1),new h("ен",22,2),new h("ло",-1,1),new h("ило",24,2),new h("ыло",24,2),new h("но",-1,1),new h("ено",27,2),new h("нно",27,1),new h("ет",-1,1),new h("ует",30,2),new h("ит",-1,2),new h("ыт",-1,2),new h("ют",-1,1),new h("уют",34,2),new h("ят",-1,2),new h("ны",-1,1),new h("ены",37,2),new h("ть",-1,1),new h("ить",39,2),new h("ыть",39,2),new h("ешь",-1,1),new h("ишь",-1,2),new h("ю",-1,2),new h("ую",44,2)],s=[new h("а",-1,1),new h("ев",-1,1),new h("ов",-1,1),new h("е",-1,1),new h("ие",3,1),new h("ье",3,1),new h("и",-1,1),new h("еи",6,1),new h("ии",6,1),new h("ами",6,1),new h("ями",6,1),new h("иями",10,1),new h("й",-1,1),new h("ей",12,1),new h("ией",13,1),new h("ий",12,1),new h("ой",12,1),new h("ам",-1,1),new h("ем",-1,1),new h("ием",18,1),new h("ом",-1,1),new h("ям",-1,1),new h("иям",21,1),new h("о",-1,1),new h("у",-1,1),new h("ах",-1,1),new h("ях",-1,1),new h("иях",26,1),new h("ы",-1,1),new h("ь",-1,1),new h("ю",-1,1),new h("ию",30,1),new h("ью",30,1),new h("я",-1,1),new h("ия",33,1),new h("ья",33,1)],o=[new h("ост",-1,1),new h("ость",-1,1)],c=[new h("ейше",-1,1),new h("н",-1,2),new h("ейш",-1,1),new h("ь",-1,3)],m=[33,65,8,232],l=new g;function f(){for(;!l.in_grouping(m,1072,1103);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function a(){for(;!l.out_grouping(m,1072,1103);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function p(e,n){var r,t;if(l.ket=l.cursor,r=l.find_among_b(e,n)){switch(l.bra=l.cursor,r){case 1:if(t=l.limit-l.cursor,!l.eq_s_b(1,"а")&&(l.cursor=l.limit-t,!l.eq_s_b(1,"я")))return!1;case 2:l.slice_del()}return!0}return!1}function d(e,n){var r;return l.ket=l.cursor,!!(r=l.find_among_b(e,n))&&(l.bra=l.cursor,1==r&&l.slice_del(),!0)}function _(){return!!d(t,26)&&(p(w,8),!0)}function b(){var e;l.ket=l.cursor,(e=l.find_among_b(o,2))&&(l.bra=l.cursor,n<=l.cursor&&1==e&&l.slice_del())}this.setCurrent=function(e){l.setCurrent(e)},this.getCurrent=function(){return l.getCurrent()},this.stem=function(){return e=l.limit,n=e,f()&&(e=l.cursor,a()&&f()&&a()&&(n=l.cursor)),l.cursor=l.limit,!(l.cursor>3]&1<<(7&s))return this.cursor++,!0}return!1},in_grouping_b:function(r,t,i){if(this.cursor>this.limit_backward){var s=b.charCodeAt(this.cursor-1);if(s<=i&&t<=s&&r[(s-=t)>>3]&1<<(7&s))return this.cursor--,!0}return!1},out_grouping:function(r,t,i){if(this.cursor>3]&1<<(7&s)))return this.cursor++,!0}return!1},out_grouping_b:function(r,t,i){if(this.cursor>this.limit_backward){var s=b.charCodeAt(this.cursor-1);if(i>3]&1<<(7&s)))return this.cursor--,!0}return!1},eq_s:function(r,t){if(this.limit-this.cursor>1),a=0,f=u=(l=r[i]).s_size){if(this.cursor=e+l.s_size,!l.method)return l.result;var m=l.method();if(this.cursor=e+l.s_size,m)return l.result}if((i=l.substring_i)<0)return 0}},find_among_b:function(r,t){for(var i=0,s=t,e=this.cursor,n=this.limit_backward,u=0,o=0,h=!1;;){for(var c=i+(s-i>>1),a=0,f=u=(_=r[i]).s_size){if(this.cursor=e-_.s_size,!_.method)return _.result;var m=_.method();if(this.cursor=e-_.s_size,m)return _.result}if((i=_.substring_i)<0)return 0}},replace_s:function(r,t,i){var s=i.length-(t-r);return b=b.substring(0,r)+i+b.substring(t),this.limit+=s,this.cursor>=t?this.cursor+=s:this.cursor>r&&(this.cursor=r),s},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>b.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),b.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}}); \ No newline at end of file diff --git a/docs/api/py/_static/javascripts/lunr/lunr.sv.js b/docs/api/py/_static/javascripts/lunr/lunr.sv.js new file mode 100644 index 0000000000000..6daf5f9d807ec --- /dev/null +++ b/docs/api/py/_static/javascripts/lunr/lunr.sv.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,l,n;e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=(r=e.stemmerSupport.Among,l=e.stemmerSupport.SnowballProgram,n=new function(){var n,t,i=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],s=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],a=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],o=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],u=[119,127,149],m=new l;this.setCurrent=function(e){m.setCurrent(e)},this.getCurrent=function(){return m.getCurrent()},this.stem=function(){var e,r=m.cursor;return function(){var e,r=m.cursor+3;if(t=m.limit,0<=r||r<=m.limit){for(n=r;;){if(e=m.cursor,m.in_grouping(o,97,246)){m.cursor=e;break}if(m.cursor=e,m.cursor>=m.limit)return;m.cursor++}for(;!m.out_grouping(o,97,246);){if(m.cursor>=m.limit)return;m.cursor++}(t=m.cursor)=t&&(m.limit_backward=t,m.cursor=m.limit,m.ket=m.cursor,e=m.find_among_b(i,37),m.limit_backward=r,e))switch(m.bra=m.cursor,e){case 1:m.slice_del();break;case 2:m.in_grouping_b(u,98,121)&&m.slice_del()}}(),m.cursor=m.limit,e=m.limit_backward,m.cursor>=t&&(m.limit_backward=t,m.cursor=m.limit,m.find_among_b(s,7)&&(m.cursor=m.limit,m.ket=m.cursor,m.cursor>m.limit_backward&&(m.bra=--m.cursor,m.slice_del())),m.limit_backward=e),m.cursor=m.limit,function(){var e,r;if(m.cursor>=t){if(r=m.limit_backward,m.limit_backward=t,m.cursor=m.limit,m.ket=m.cursor,e=m.find_among_b(a,5))switch(m.bra=m.cursor,e){case 1:m.slice_del();break;case 2:m.slice_from("lös");break;case 3:m.slice_from("full")}m.limit_backward=r}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}}); \ No newline at end of file diff --git a/docs/api/py/_static/javascripts/lunr/lunr.th.js b/docs/api/py/_static/javascripts/lunr/lunr.th.js new file mode 100644 index 0000000000000..ee8ef373a0d0a --- /dev/null +++ b/docs/api/py/_static/javascripts/lunr/lunr.th.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(t){if(void 0===t)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===t.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==t.version[0];t.th=function(){this.pipeline.reset(),this.pipeline.add(t.th.trimmer),i?this.tokenizer=t.th.tokenizer:(t.tokenizer&&(t.tokenizer=t.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=t.th.tokenizer))},t.th.wordCharacters="[฀-๿]",t.th.trimmer=t.trimmerSupport.generateTrimmer(t.th.wordCharacters),t.Pipeline.registerFunction(t.th.trimmer,"trimmer-th");var n=t.wordcut;n.init(),t.th.tokenizer=function(e){if(!arguments.length||null==e||null==e)return[];if(Array.isArray(e))return e.map(function(e){return i?new t.Token(e):e});var r=e.toString().replace(/^\s+/,"");return n.cut(r).split("|")}}}); \ No newline at end of file diff --git a/docs/api/py/_static/javascripts/lunr/lunr.tr.js b/docs/api/py/_static/javascripts/lunr/lunr.tr.js new file mode 100644 index 0000000000000..e8fb5a7df64cf --- /dev/null +++ b/docs/api/py/_static/javascripts/lunr/lunr.tr.js @@ -0,0 +1 @@ +!function(r,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var mr,dr,i;r.tr=function(){this.pipeline.reset(),this.pipeline.add(r.tr.trimmer,r.tr.stopWordFilter,r.tr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(r.tr.stemmer))},r.tr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.tr.trimmer=r.trimmerSupport.generateTrimmer(r.tr.wordCharacters),r.Pipeline.registerFunction(r.tr.trimmer,"trimmer-tr"),r.tr.stemmer=(mr=r.stemmerSupport.Among,dr=r.stemmerSupport.SnowballProgram,i=new function(){var t,r=[new mr("m",-1,-1),new mr("n",-1,-1),new mr("miz",-1,-1),new mr("niz",-1,-1),new mr("muz",-1,-1),new mr("nuz",-1,-1),new mr("müz",-1,-1),new mr("nüz",-1,-1),new mr("mız",-1,-1),new mr("nız",-1,-1)],i=[new mr("leri",-1,-1),new mr("ları",-1,-1)],e=[new mr("ni",-1,-1),new mr("nu",-1,-1),new mr("nü",-1,-1),new mr("nı",-1,-1)],n=[new mr("in",-1,-1),new mr("un",-1,-1),new mr("ün",-1,-1),new mr("ın",-1,-1)],u=[new mr("a",-1,-1),new mr("e",-1,-1)],o=[new mr("na",-1,-1),new mr("ne",-1,-1)],s=[new mr("da",-1,-1),new mr("ta",-1,-1),new mr("de",-1,-1),new mr("te",-1,-1)],c=[new mr("nda",-1,-1),new mr("nde",-1,-1)],l=[new mr("dan",-1,-1),new mr("tan",-1,-1),new mr("den",-1,-1),new mr("ten",-1,-1)],a=[new mr("ndan",-1,-1),new mr("nden",-1,-1)],m=[new mr("la",-1,-1),new mr("le",-1,-1)],d=[new mr("ca",-1,-1),new mr("ce",-1,-1)],f=[new mr("im",-1,-1),new mr("um",-1,-1),new mr("üm",-1,-1),new mr("ım",-1,-1)],b=[new mr("sin",-1,-1),new mr("sun",-1,-1),new mr("sün",-1,-1),new mr("sın",-1,-1)],w=[new mr("iz",-1,-1),new mr("uz",-1,-1),new mr("üz",-1,-1),new mr("ız",-1,-1)],_=[new mr("siniz",-1,-1),new mr("sunuz",-1,-1),new mr("sünüz",-1,-1),new mr("sınız",-1,-1)],k=[new mr("lar",-1,-1),new mr("ler",-1,-1)],p=[new mr("niz",-1,-1),new mr("nuz",-1,-1),new mr("nüz",-1,-1),new mr("nız",-1,-1)],g=[new mr("dir",-1,-1),new mr("tir",-1,-1),new mr("dur",-1,-1),new mr("tur",-1,-1),new mr("dür",-1,-1),new mr("tür",-1,-1),new mr("dır",-1,-1),new mr("tır",-1,-1)],y=[new mr("casına",-1,-1),new mr("cesine",-1,-1)],z=[new mr("di",-1,-1),new mr("ti",-1,-1),new mr("dik",-1,-1),new mr("tik",-1,-1),new mr("duk",-1,-1),new mr("tuk",-1,-1),new mr("dük",-1,-1),new mr("tük",-1,-1),new mr("dık",-1,-1),new mr("tık",-1,-1),new mr("dim",-1,-1),new mr("tim",-1,-1),new mr("dum",-1,-1),new mr("tum",-1,-1),new mr("düm",-1,-1),new mr("tüm",-1,-1),new mr("dım",-1,-1),new mr("tım",-1,-1),new mr("din",-1,-1),new mr("tin",-1,-1),new mr("dun",-1,-1),new mr("tun",-1,-1),new mr("dün",-1,-1),new mr("tün",-1,-1),new mr("dın",-1,-1),new mr("tın",-1,-1),new mr("du",-1,-1),new mr("tu",-1,-1),new mr("dü",-1,-1),new mr("tü",-1,-1),new mr("dı",-1,-1),new mr("tı",-1,-1)],h=[new mr("sa",-1,-1),new mr("se",-1,-1),new mr("sak",-1,-1),new mr("sek",-1,-1),new mr("sam",-1,-1),new mr("sem",-1,-1),new mr("san",-1,-1),new mr("sen",-1,-1)],v=[new mr("miş",-1,-1),new mr("muş",-1,-1),new mr("müş",-1,-1),new mr("mış",-1,-1)],q=[new mr("b",-1,1),new mr("c",-1,2),new mr("d",-1,3),new mr("ğ",-1,4)],C=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,8,0,0,0,0,0,0,1],P=[1,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,1],F=[65],S=[65],W=[["a",[1,64,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],97,305],["e",[17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130],101,252],["ı",[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],97,305],["i",[17],101,105],["o",F,111,117],["ö",S,246,252],["u",F,111,117]],L=new dr;function x(r,i,e){for(;;){var n=L.limit-L.cursor;if(L.in_grouping_b(r,i,e)){L.cursor=L.limit-n;break}if(L.cursor=L.limit-n,L.cursor<=L.limit_backward)return!1;L.cursor--}return!0}function A(){var r,i;r=L.limit-L.cursor,x(C,97,305);for(var e=0;eL.limit_backward&&(L.cursor--,e=L.limit-L.cursor,i()))?(L.cursor=L.limit-e,!0):(L.cursor=L.limit-n,r()?(L.cursor=L.limit-n,!1):(L.cursor=L.limit-n,!(L.cursor<=L.limit_backward)&&(L.cursor--,!!i()&&(L.cursor=L.limit-n,!0))))}function j(r){return E(r,function(){return L.in_grouping_b(C,97,305)})}function T(){return j(function(){return L.eq_s_b(1,"n")})}function Z(){return j(function(){return L.eq_s_b(1,"y")})}function B(){return L.find_among_b(r,10)&&E(function(){return L.in_grouping_b(P,105,305)},function(){return L.out_grouping_b(C,97,305)})}function D(){return A()&&L.in_grouping_b(P,105,305)&&j(function(){return L.eq_s_b(1,"s")})}function G(){return L.find_among_b(i,2)}function H(){return A()&&L.find_among_b(n,4)&&T()}function I(){return A()&&L.find_among_b(s,4)}function J(){return A()&&L.find_among_b(c,2)}function K(){return A()&&L.find_among_b(f,4)&&Z()}function M(){return A()&&L.find_among_b(b,4)}function N(){return A()&&L.find_among_b(w,4)&&Z()}function O(){return L.find_among_b(_,4)}function Q(){return A()&&L.find_among_b(k,2)}function R(){return A()&&L.find_among_b(g,8)}function U(){return A()&&L.find_among_b(z,32)&&Z()}function V(){return L.find_among_b(h,8)&&Z()}function X(){return A()&&L.find_among_b(v,4)&&Z()}function Y(){var r=L.limit-L.cursor;return!(X()||(L.cursor=L.limit-r,U()||(L.cursor=L.limit-r,V()||(L.cursor=L.limit-r,L.eq_s_b(3,"ken")&&Z()))))}function $(){if(L.find_among_b(y,2)){var r=L.limit-L.cursor;if(O()||(L.cursor=L.limit-r,Q()||(L.cursor=L.limit-r,K()||(L.cursor=L.limit-r,M()||(L.cursor=L.limit-r,N()||(L.cursor=L.limit-r))))),X())return!1}return!0}function rr(){if(!A()||!L.find_among_b(p,4))return!0;var r=L.limit-L.cursor;return!U()&&(L.cursor=L.limit-r,!V())}function ir(){var r,i,e,n=L.limit-L.cursor;if(L.ket=L.cursor,t=!0,Y()&&(L.cursor=L.limit-n,$()&&(L.cursor=L.limit-n,function(){if(Q()){L.bra=L.cursor,L.slice_del();var r=L.limit-L.cursor;return L.ket=L.cursor,R()||(L.cursor=L.limit-r,U()||(L.cursor=L.limit-r,V()||(L.cursor=L.limit-r,X()||(L.cursor=L.limit-r)))),t=!1}return!0}()&&(L.cursor=L.limit-n,rr()&&(L.cursor=L.limit-n,e=L.limit-L.cursor,!(O()||(L.cursor=L.limit-e,N()||(L.cursor=L.limit-e,M()||(L.cursor=L.limit-e,K()))))||(L.bra=L.cursor,L.slice_del(),i=L.limit-L.cursor,L.ket=L.cursor,X()||(L.cursor=L.limit-i),0)))))){if(L.cursor=L.limit-n,!R())return;L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,r=L.limit-L.cursor,O()||(L.cursor=L.limit-r,Q()||(L.cursor=L.limit-r,K()||(L.cursor=L.limit-r,M()||(L.cursor=L.limit-r,N()||(L.cursor=L.limit-r))))),X()||(L.cursor=L.limit-r)}L.bra=L.cursor,L.slice_del()}function er(){var r,i,e,n;if(L.ket=L.cursor,L.eq_s_b(2,"ki")){if(r=L.limit-L.cursor,I())return L.bra=L.cursor,L.slice_del(),i=L.limit-L.cursor,L.ket=L.cursor,Q()?(L.bra=L.cursor,L.slice_del(),er()):(L.cursor=L.limit-i,B()&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er()))),!0;if(L.cursor=L.limit-r,H()){if(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,e=L.limit-L.cursor,G())L.bra=L.cursor,L.slice_del();else{if(L.cursor=L.limit-e,L.ket=L.cursor,!B()&&(L.cursor=L.limit-e,!D()&&(L.cursor=L.limit-e,!er())))return!0;L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())}return!0}if(L.cursor=L.limit-r,J()){if(n=L.limit-L.cursor,G())L.bra=L.cursor,L.slice_del();else if(L.cursor=L.limit-n,D())L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er());else if(L.cursor=L.limit-n,!er())return!1;return!0}}return!1}function nr(r){if(L.ket=L.cursor,!J()&&(L.cursor=L.limit-r,!A()||!L.find_among_b(o,2)))return!1;var i=L.limit-L.cursor;if(G())L.bra=L.cursor,L.slice_del();else if(L.cursor=L.limit-i,D())L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er());else if(L.cursor=L.limit-i,!er())return!1;return!0}function tr(r){if(L.ket=L.cursor,!(A()&&L.find_among_b(a,2)||(L.cursor=L.limit-r,A()&&L.find_among_b(e,4))))return!1;var i=L.limit-L.cursor;return!(!D()&&(L.cursor=L.limit-i,!G()))&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er()),!0)}function ur(){var r,i=L.limit-L.cursor;return L.ket=L.cursor,!!(H()||(L.cursor=L.limit-i,A()&&L.find_among_b(m,2)&&Z()))&&(L.bra=L.cursor,L.slice_del(),r=L.limit-L.cursor,L.ket=L.cursor,!(!Q()||(L.bra=L.cursor,L.slice_del(),!er()))||(L.cursor=L.limit-r,L.ket=L.cursor,(B()||(L.cursor=L.limit-r,D()||(L.cursor=L.limit-r,er())))&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())),!0))}function or(){var r,i,e=L.limit-L.cursor;if(L.ket=L.cursor,!(I()||(L.cursor=L.limit-e,A()&&L.in_grouping_b(P,105,305)&&Z()||(L.cursor=L.limit-e,A()&&L.find_among_b(u,2)&&Z()))))return!1;if(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,r=L.limit-L.cursor,B())L.bra=L.cursor,L.slice_del(),i=L.limit-L.cursor,L.ket=L.cursor,Q()||(L.cursor=L.limit-i);else if(L.cursor=L.limit-r,!Q())return!0;return L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,er(),!0}function sr(){var r,i,e=L.limit-L.cursor;if(L.ket=L.cursor,Q())return L.bra=L.cursor,L.slice_del(),void er();if(L.cursor=L.limit-e,L.ket=L.cursor,A()&&L.find_among_b(d,2)&&T())if(L.bra=L.cursor,L.slice_del(),r=L.limit-L.cursor,L.ket=L.cursor,G())L.bra=L.cursor,L.slice_del();else{if(L.cursor=L.limit-r,L.ket=L.cursor,!B()&&(L.cursor=L.limit-r,!D())){if(L.cursor=L.limit-r,L.ket=L.cursor,!Q())return;if(L.bra=L.cursor,L.slice_del(),!er())return}L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())}else if(L.cursor=L.limit-e,!nr(e)&&(L.cursor=L.limit-e,!tr(e))){if(L.cursor=L.limit-e,L.ket=L.cursor,A()&&L.find_among_b(l,4))return L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,i=L.limit-L.cursor,void(B()?(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())):(L.cursor=L.limit-i,Q()?(L.bra=L.cursor,L.slice_del()):L.cursor=L.limit-i,er()));if(L.cursor=L.limit-e,!ur()){if(L.cursor=L.limit-e,G())return L.bra=L.cursor,void L.slice_del();L.cursor=L.limit-e,er()||(L.cursor=L.limit-e,or()||(L.cursor=L.limit-e,L.ket=L.cursor,(B()||(L.cursor=L.limit-e,D()))&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er()))))}}}function cr(r,i,e){if(L.cursor=L.limit-r,function(){for(;;){var r=L.limit-L.cursor;if(L.in_grouping_b(C,97,305)){L.cursor=L.limit-r;break}if(L.cursor=L.limit-r,L.cursor<=L.limit_backward)return!1;L.cursor--}return!0}()){var n=L.limit-L.cursor;if(!L.eq_s_b(1,i)&&(L.cursor=L.limit-n,!L.eq_s_b(1,e)))return!0;L.cursor=L.limit-r;var t=L.cursor;return L.insert(L.cursor,L.cursor,e),L.cursor=t,!1}return!0}function lr(r,i,e){for(;!L.eq_s(i,e);){if(L.cursor>=L.limit)return!0;L.cursor++}return i!=L.limit||(L.cursor=r,!1)}function ar(){var r,i,e=L.cursor;return!(!lr(r=L.cursor,2,"ad")||!lr(L.cursor=r,5,"soyad"))&&(L.limit_backward=e,L.cursor=L.limit,i=L.limit-L.cursor,(L.eq_s_b(1,"d")||(L.cursor=L.limit-i,L.eq_s_b(1,"g")))&&cr(i,"a","ı")&&cr(i,"e","i")&&cr(i,"o","u")&&cr(i,"ö","ü"),L.cursor=L.limit,function(){var r;if(L.ket=L.cursor,r=L.find_among_b(q,4))switch(L.bra=L.cursor,r){case 1:L.slice_from("p");break;case 2:L.slice_from("ç");break;case 3:L.slice_from("t");break;case 4:L.slice_from("k")}}(),!0)}this.setCurrent=function(r){L.setCurrent(r)},this.getCurrent=function(){return L.getCurrent()},this.stem=function(){return!!(function(){for(var r,i=L.cursor,e=2;;){for(r=L.cursor;!L.in_grouping(C,97,305);){if(L.cursor>=L.limit)return L.cursor=r,!(0e&&(this._events[n].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[n].length),"function"==typeof console.trace&&console.trace()));return this},r.prototype.once=function(n,t){if(!a(t))throw TypeError("listener must be a function");var e=!1;function r(){this.removeListener(n,r),e||(e=!0,t.apply(this,arguments))}return r.listener=t,this.on(n,r),this},r.prototype.removeListener=function(n,t){var e,r,i,o;if(!a(t))throw TypeError("listener must be a function");if(!this._events||!this._events[n])return this;if(i=(e=this._events[n]).length,r=-1,e===t||a(e.listener)&&e.listener===t)delete this._events[n],this._events.removeListener&&this.emit("removeListener",n,t);else if(c(e)){for(o=i;0this.maxLength)return i();if(!this.stat&&p(this.cache,o)){var t=this.cache[o];if(Array.isArray(t)&&(t="DIR"),!n||"DIR"===t)return i(null,t);if(n&&"FILE"===t)return i()}var e=this.statCache[o];if(void 0!==e){if(!1===e)return i(null,e);var s=e.isDirectory()?"DIR":"FILE";return n&&"FILE"===s?i():i(null,s,e)}var a=this,c=d("stat\0"+o,function(n,e){{if(e&&e.isSymbolicLink())return u.stat(o,function(n,t){n?a._stat2(r,o,null,e,i):a._stat2(r,o,n,t,i)});a._stat2(r,o,n,e,i)}});c&&u.lstat(o,c)},b.prototype._stat2=function(n,t,e,r,i){if(e)return this.statCache[t]=!1,i();var o="/"===n.slice(-1);if(this.statCache[t]=r,"/"===t.slice(-1)&&!r.isDirectory())return i(null,!1,r);var s=r.isDirectory()?"DIR":"FILE";return this.cache[t]=this.cache[t]||s,o&&"DIR"!==s?i():i(null,s,r)}}).call(this,_("_process"))},{"./common.js":15,"./sync.js":17,_process:24,assert:9,events:14,fs:12,inflight:18,inherits:19,minimatch:20,once:21,path:22,"path-is-absolute":23,util:28}],17:[function(e,r,n){(function(i){(r.exports=n).GlobSync=h;var s=e("fs"),c=e("minimatch"),g=(c.Minimatch,e("./glob.js").Glob,e("util"),e("path")),u=e("assert"),l=e("path-is-absolute"),t=e("./common.js"),o=(t.alphasort,t.alphasorti,t.setopts),a=t.ownProp,f=t.childrenIgnored;function n(n,t){if("function"==typeof t||3===arguments.length)throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");return new h(n,t).found}function h(n,t){if(!n)throw new Error("must provide pattern");if("function"==typeof t||3===arguments.length)throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");if(!(this instanceof h))return new h(n,t);if(o(this,n,t),this.noprocess)return this;var e=this.minimatch.set.length;this.matches=new Array(e);for(var r=0;rthis.maxLength)return!1;if(!this.stat&&a(this.cache,t)){var r=this.cache[t];if(Array.isArray(r)&&(r="DIR"),!e||"DIR"===r)return r;if(e&&"FILE"===r)return!1}var i=this.statCache[t];if(!i){var o;try{o=s.lstatSync(t)}catch(n){return!1}if(o.isSymbolicLink())try{i=s.statSync(t)}catch(n){i=o}else i=o}r=(this.statCache[t]=i).isDirectory()?"DIR":"FILE";return this.cache[t]=this.cache[t]||r,(!e||"DIR"===r)&&r},h.prototype._mark=function(n){return t.mark(this,n)},h.prototype._makeAbs=function(n){return t.makeAbs(this,n)}}).call(this,e("_process"))},{"./common.js":15,"./glob.js":16,_process:24,assert:9,fs:12,minimatch:20,path:22,"path-is-absolute":23,util:28}],18:[function(t,r,n){(function(s){var n=t("wrappy"),a=Object.create(null),e=t("once");r.exports=n(function(n,t){return a[n]?(a[n].push(t),null):(a[n]=[t],o=n,e(function n(){var t=a[o],e=t.length,r=function(n){for(var t=n.length,e=[],r=0;re?(t.splice(0,e),s.nextTick(function(){n.apply(null,r)})):delete a[o]}}));var o})}).call(this,t("_process"))},{_process:24,once:21,wrappy:29}],19:[function(n,t,e){"function"==typeof Object.create?t.exports=function(n,t){n.super_=t,n.prototype=Object.create(t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(n,t){n.super_=t;var e=function(){};e.prototype=t.prototype,n.prototype=new e,n.prototype.constructor=n}},{}],20:[function(n,t,e){(t.exports=s).Minimatch=i;var u={sep:"/"};try{u=n("path")}catch(n){}var M=s.GLOBSTAR=i.GLOBSTAR={},r=n("brace-expansion"),C={"!":{open:"(?:(?!(?:",close:"))[^/]*?)"},"?":{open:"(?:",close:")?"},"+":{open:"(?:",close:")+"},"*":{open:"(?:",close:")*"},"@":{open:"(?:",close:")"}},P="[^/]",z=P+"*?",B="().*{}+?[]^$\\!".split("").reduce(function(n,t){return n[t]=!0,n},{});var l=/\/+/;function o(t,e){t=t||{},e=e||{};var r={};return Object.keys(e).forEach(function(n){r[n]=e[n]}),Object.keys(t).forEach(function(n){r[n]=t[n]}),r}function s(n,t,e){if("string"!=typeof t)throw new TypeError("glob pattern string required");return e||(e={}),!(!e.nocomment&&"#"===t.charAt(0))&&(""===t.trim()?""===n:new i(t,e).match(n))}function i(n,t){if(!(this instanceof i))return new i(n,t);if("string"!=typeof n)throw new TypeError("glob pattern string required");t||(t={}),n=n.trim(),"/"!==u.sep&&(n=n.split(u.sep).join("/")),this.options=t,this.set=[],this.pattern=n,this.regexp=null,this.negate=!1,this.comment=!1,this.empty=!1,this.make()}function a(n,t){if(t||(t=this instanceof i?this.options:{}),void 0===(n=void 0===n?this.pattern:n))throw new TypeError("undefined pattern");return t.nobrace||!n.match(/\{.*\}/)?[n]:r(n)}s.filter=function(r,i){return i=i||{},function(n,t,e){return s(n,r,i)}},s.defaults=function(r){if(!r||!Object.keys(r).length)return s;var i=s,n=function(n,t,e){return i.minimatch(n,t,o(r,e))};return n.Minimatch=function(n,t){return new i.Minimatch(n,o(r,t))},n},i.defaults=function(n){return n&&Object.keys(n).length?s.defaults(n).Minimatch:i},i.prototype.debug=function(){},i.prototype.make=function(){if(this._made)return;var n=this.pattern,t=this.options;if(!t.nocomment&&"#"===n.charAt(0))return void(this.comment=!0);if(!n)return void(this.empty=!0);this.parseNegate();var e=this.globSet=this.braceExpand();t.debug&&(this.debug=console.error);this.debug(this.pattern,e),e=this.globParts=e.map(function(n){return n.split(l)}),this.debug(this.pattern,e),e=e.map(function(n,t,e){return n.map(this.parse,this)},this),this.debug(this.pattern,e),e=e.filter(function(n){return-1===n.indexOf(!1)}),this.debug(this.pattern,e),this.set=e},i.prototype.parseNegate=function(){var n=this.pattern,t=!1,e=this.options,r=0;if(e.nonegate)return;for(var i=0,o=n.length;i>> no match, partial?",n,f,t,h),f!==s))}if("string"==typeof u?(c=r.nocase?l.toLowerCase()===u.toLowerCase():l===u,this.debug("string match",u,l,c)):(c=l.match(u),this.debug("pattern match",u,l,c)),!c)return!1}if(i===s&&o===a)return!0;if(i===s)return e;if(o===a)return i===s-1&&""===n[i];throw new Error("wtf?")}},{"brace-expansion":11,path:22}],21:[function(n,t,e){var r=n("wrappy");function i(n){var t=function(){return t.called?t.value:(t.called=!0,t.value=n.apply(this,arguments))};return t.called=!1,t}function o(n){var t=function(){if(t.called)throw new Error(t.onceError);return t.called=!0,t.value=n.apply(this,arguments)},e=n.name||"Function wrapped with `once`";return t.onceError=e+" shouldn't be called more than once",t.called=!1,t}t.exports=r(i),t.exports.strict=r(o),i.proto=i(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return i(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return o(this)},configurable:!0})})},{wrappy:29}],22:[function(n,t,u){(function(i){function o(n,t){for(var e=0,r=n.length-1;0<=r;r--){var i=n[r];"."===i?n.splice(r,1):".."===i?(n.splice(r,1),e++):e&&(n.splice(r,1),e--)}if(t)for(;e--;e)n.unshift("..");return n}var t=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,s=function(n){return t.exec(n).slice(1)};function a(n,t){if(n.filter)return n.filter(t);for(var e=[],r=0;r":">",'"':""","'":"'","`":"`"},D=d.invert(N),F=function(t){var e=function(n){return t[n]},n="(?:"+d.keys(t).join("|")+")",r=RegExp(n),i=RegExp(n,"g");return function(n){return n=null==n?"":""+n,r.test(n)?n.replace(i,e):n}};d.escape=F(N),d.unescape=F(D),d.result=function(n,t,e){var r=null==n?void 0:n[t];return void 0===r&&(r=e),d.isFunction(r)?r.call(n):r};var M=0;d.uniqueId=function(n){var t=++M+"";return n?n+t:t},d.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var C=/(.)^/,P={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},z=/\\|'|\r|\n|\u2028|\u2029/g,B=function(n){return"\\"+P[n]};d.template=function(o,n,t){!n&&t&&(n=t),n=d.defaults({},n,d.templateSettings);var e=RegExp([(n.escape||C).source,(n.interpolate||C).source,(n.evaluate||C).source].join("|")+"|$","g"),s=0,a="__p+='";o.replace(e,function(n,t,e,r,i){return a+=o.slice(s,i).replace(z,B),s=i+n.length,t?a+="'+\n((__t=("+t+"))==null?'':_.escape(__t))+\n'":e?a+="'+\n((__t=("+e+"))==null?'':__t)+\n'":r&&(a+="';\n"+r+"\n__p+='"),n}),a+="';\n",n.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{var r=new Function(n.variable||"obj","_",a)}catch(n){throw n.source=a,n}var i=function(n){return r.call(this,n,d)},c=n.variable||"obj";return i.source="function("+c+"){\n"+a+"}",i},d.chain=function(n){var t=d(n);return t._chain=!0,t};var U=function(n,t){return n._chain?d(t).chain():t};d.mixin=function(e){d.each(d.functions(e),function(n){var t=d[n]=e[n];d.prototype[n]=function(){var n=[this._wrapped];return i.apply(n,arguments),U(this,t.apply(d,n))}})},d.mixin(d),d.each(["pop","push","reverse","shift","sort","splice","unshift"],function(t){var e=r[t];d.prototype[t]=function(){var n=this._wrapped;return e.apply(n,arguments),"shift"!==t&&"splice"!==t||0!==n.length||delete n[0],U(this,n)}}),d.each(["concat","join","slice"],function(n){var t=r[n];d.prototype[n]=function(){return U(this,t.apply(this._wrapped,arguments))}}),d.prototype.value=function(){return this._wrapped},d.prototype.valueOf=d.prototype.toJSON=d.prototype.value,d.prototype.toString=function(){return""+this._wrapped}}).call(this)},{}],26:[function(n,t,e){arguments[4][19][0].apply(e,arguments)},{dup:19}],27:[function(n,t,e){t.exports=function(n){return n&&"object"==typeof n&&"function"==typeof n.copy&&"function"==typeof n.fill&&"function"==typeof n.readUInt8}},{}],28:[function(h,n,k){(function(r,i){var a=/%[sdj%]/g;k.format=function(n){if(!_(n)){for(var t=[],e=0;e+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":";CAaA,SAAYA,EAAQC,GAEnB,aAEuB,iBAAXC,QAAiD,iBAAnBA,OAAOC,QAShDD,OAAOC,QAAUH,EAAOI,SACvBH,EAASD,GAAQ,GACjB,SAAUK,GACT,IAAMA,EAAED,SACP,MAAM,IAAIE,MAAO,4CAElB,OAAOL,EAASI,IAGlBJ,EAASD,GAtBX,CA0BuB,oBAAXO,OAAyBA,OAASC,KAAM,SAAUD,EAAQE,GAMtE,aAEA,IAAIC,EAAM,GAENC,EAAWC,OAAOC,eAElBC,EAAQJ,EAAII,MAEZC,EAAOL,EAAIK,KAAO,SAAUC,GAC/B,OAAON,EAAIK,KAAKE,KAAMD,IACnB,SAAUA,GACb,OAAON,EAAIQ,OAAOC,MAAO,GAAIH,IAI1BI,EAAOV,EAAIU,KAEXC,EAAUX,EAAIW,QAEdC,EAAa,GAEbC,EAAWD,EAAWC,SAEtBC,EAASF,EAAWG,eAEpBC,EAAaF,EAAOD,SAEpBI,EAAuBD,EAAWT,KAAML,QAExCgB,EAAU,GAEVC,EAAa,SAAqBC,GASpC,MAAsB,mBAARA,GAA8C,iBAAjBA,EAAIC,UAC1B,mBAAbD,EAAIE,MAIVC,EAAW,SAAmBH,GAChC,OAAc,MAAPA,GAAeA,IAAQA,EAAIvB,QAIhCH,EAAWG,EAAOH,SAIjB8B,EAA4B,CAC/BC,MAAM,EACNC,KAAK,EACLC,OAAO,EACPC,UAAU,GAGX,SAASC,EAASC,EAAMC,EAAMC,GAG7B,IAAIC,EAAGC,EACNC,GAHDH,EAAMA,GAAOtC,GAGC0C,cAAe,UAG7B,GADAD,EAAOE,KAAOP,EACTC,EACJ,IAAME,KAAKT,GAYVU,EAAMH,EAAME,IAAOF,EAAKO,cAAgBP,EAAKO,aAAcL,KAE1DE,EAAOI,aAAcN,EAAGC,GAI3BF,EAAIQ,KAAKC,YAAaN,GAASO,WAAWC,YAAaR,GAIzD,SAASS,EAAQxB,GAChB,OAAY,MAAPA,EACGA,EAAM,GAIQ,iBAARA,GAAmC,mBAARA,EACxCR,EAAYC,EAASN,KAAMa,KAAW,gBAC/BA,EAQT,IACCyB,EAAU,QAGVC,EAAS,SAAUC,EAAUC,GAI5B,OAAO,IAAIF,EAAOG,GAAGC,KAAMH,EAAUC,IA0VvC,SAASG,EAAa/B,GAMrB,IAAIgC,IAAWhC,GAAO,WAAYA,GAAOA,EAAIgC,OAC5C3B,EAAOmB,EAAQxB,GAEhB,OAAKD,EAAYC,KAASG,EAAUH,KAIpB,UAATK,GAA+B,IAAX2B,GACR,iBAAXA,GAAgC,EAATA,GAAgBA,EAAS,KAAOhC,GArWhE0B,EAAOG,GAAKH,EAAOO,UAAY,CAG9BC,OAAQT,EAERU,YAAaT,EAGbM,OAAQ,EAERI,QAAS,WACR,OAAOpD,EAAMG,KAAMT,OAKpB2D,IAAK,SAAUC,GAGd,OAAY,MAAPA,EACGtD,EAAMG,KAAMT,MAIb4D,EAAM,EAAI5D,KAAM4D,EAAM5D,KAAKsD,QAAWtD,KAAM4D,IAKpDC,UAAW,SAAUC,GAGpB,IAAIC,EAAMf,EAAOgB,MAAOhE,KAAKyD,cAAeK,GAM5C,OAHAC,EAAIE,WAAajE,KAGV+D,GAIRG,KAAM,SAAUC,GACf,OAAOnB,EAAOkB,KAAMlE,KAAMmE,IAG3BC,IAAK,SAAUD,GACd,OAAOnE,KAAK6D,UAAWb,EAAOoB,IAAKpE,KAAM,SAAUqE,EAAMlC,GACxD,OAAOgC,EAAS1D,KAAM4D,EAAMlC,EAAGkC,OAIjC/D,MAAO,WACN,OAAON,KAAK6D,UAAWvD,EAAMK,MAAOX,KAAMsE,aAG3CC,MAAO,WACN,OAAOvE,KAAKwE,GAAI,IAGjBC,KAAM,WACL,OAAOzE,KAAKwE,IAAK,IAGlBE,KAAM,WACL,OAAO1E,KAAK6D,UAAWb,EAAO2B,KAAM3E,KAAM,SAAU4E,EAAOzC,GAC1D,OAASA,EAAI,GAAM,MAIrB0C,IAAK,WACJ,OAAO7E,KAAK6D,UAAWb,EAAO2B,KAAM3E,KAAM,SAAU4E,EAAOzC,GAC1D,OAAOA,EAAI,MAIbqC,GAAI,SAAUrC,GACb,IAAI2C,EAAM9E,KAAKsD,OACdyB,GAAK5C,GAAMA,EAAI,EAAI2C,EAAM,GAC1B,OAAO9E,KAAK6D,UAAgB,GAALkB,GAAUA,EAAID,EAAM,CAAE9E,KAAM+E,IAAQ,KAG5DC,IAAK,WACJ,OAAOhF,KAAKiE,YAAcjE,KAAKyD,eAKhC7C,KAAMA,EACNqE,KAAM/E,EAAI+E,KACVC,OAAQhF,EAAIgF,QAGblC,EAAOmC,OAASnC,EAAOG,GAAGgC,OAAS,WAClC,IAAIC,EAASC,EAAMzD,EAAK0D,EAAMC,EAAaC,EAC1CC,EAASnB,UAAW,IAAO,GAC3BnC,EAAI,EACJmB,EAASgB,UAAUhB,OACnBoC,GAAO,EAsBR,IAnBuB,kBAAXD,IACXC,EAAOD,EAGPA,EAASnB,UAAWnC,IAAO,GAC3BA,KAIsB,iBAAXsD,GAAwBpE,EAAYoE,KAC/CA,EAAS,IAILtD,IAAMmB,IACVmC,EAASzF,KACTmC,KAGOA,EAAImB,EAAQnB,IAGnB,GAAqC,OAA9BiD,EAAUd,UAAWnC,IAG3B,IAAMkD,KAAQD,EACbE,EAAOF,EAASC,GAIF,cAATA,GAAwBI,IAAWH,IAKnCI,GAAQJ,IAAUtC,EAAO2C,cAAeL,KAC1CC,EAAcK,MAAMC,QAASP,MAC/B1D,EAAM6D,EAAQJ,GAIbG,EADID,IAAgBK,MAAMC,QAASjE,GAC3B,GACI2D,GAAgBvC,EAAO2C,cAAe/D,GAG1CA,EAFA,GAIT2D,GAAc,EAGdE,EAAQJ,GAASrC,EAAOmC,OAAQO,EAAMF,EAAOF,SAGzBQ,IAATR,IACXG,EAAQJ,GAASC,IAOrB,OAAOG,GAGRzC,EAAOmC,OAAQ,CAGdY,QAAS,UAAahD,EAAUiD,KAAKC,UAAWC,QAAS,MAAO,IAGhEC,SAAS,EAETC,MAAO,SAAUC,GAChB,MAAM,IAAIvG,MAAOuG,IAGlBC,KAAM,aAENX,cAAe,SAAUrE,GACxB,IAAIiF,EAAOC,EAIX,SAAMlF,GAAgC,oBAAzBP,EAASN,KAAMa,QAI5BiF,EAAQpG,EAAUmB,KASK,mBADvBkF,EAAOxF,EAAOP,KAAM8F,EAAO,gBAAmBA,EAAM9C,cACfvC,EAAWT,KAAM+F,KAAWrF,IAGlEsF,cAAe,SAAUnF,GACxB,IAAI+D,EAEJ,IAAMA,KAAQ/D,EACb,OAAO,EAER,OAAO,GAKRoF,WAAY,SAAU1E,EAAMoD,EAASlD,GACpCH,EAASC,EAAM,CAAEH,MAAOuD,GAAWA,EAAQvD,OAASK,IAGrDgC,KAAM,SAAU5C,EAAK6C,GACpB,IAAIb,EAAQnB,EAAI,EAEhB,GAAKkB,EAAa/B,IAEjB,IADAgC,EAAShC,EAAIgC,OACLnB,EAAImB,EAAQnB,IACnB,IAAgD,IAA3CgC,EAAS1D,KAAMa,EAAKa,GAAKA,EAAGb,EAAKa,IACrC,WAIF,IAAMA,KAAKb,EACV,IAAgD,IAA3C6C,EAAS1D,KAAMa,EAAKa,GAAKA,EAAGb,EAAKa,IACrC,MAKH,OAAOb,GAIRqF,UAAW,SAAUzG,EAAK0G,GACzB,IAAI7C,EAAM6C,GAAW,GAarB,OAXY,MAAP1G,IACCmD,EAAajD,OAAQF,IACzB8C,EAAOgB,MAAOD,EACE,iBAAR7D,EACN,CAAEA,GAAQA,GAGZU,EAAKH,KAAMsD,EAAK7D,IAIX6D,GAGR8C,QAAS,SAAUxC,EAAMnE,EAAKiC,GAC7B,OAAc,MAAPjC,GAAe,EAAIW,EAAQJ,KAAMP,EAAKmE,EAAMlC,IAKpD6B,MAAO,SAAUO,EAAOuC,GAKvB,IAJA,IAAIhC,GAAOgC,EAAOxD,OACjByB,EAAI,EACJ5C,EAAIoC,EAAMjB,OAEHyB,EAAID,EAAKC,IAChBR,EAAOpC,KAAQ2E,EAAQ/B,GAKxB,OAFAR,EAAMjB,OAASnB,EAERoC,GAGRI,KAAM,SAAUb,EAAOK,EAAU4C,GAShC,IARA,IACCC,EAAU,GACV7E,EAAI,EACJmB,EAASQ,EAAMR,OACf2D,GAAkBF,EAIX5E,EAAImB,EAAQnB,KACAgC,EAAUL,EAAO3B,GAAKA,KAChB8E,GACxBD,EAAQpG,KAAMkD,EAAO3B,IAIvB,OAAO6E,GAIR5C,IAAK,SAAUN,EAAOK,EAAU+C,GAC/B,IAAI5D,EAAQ6D,EACXhF,EAAI,EACJ4B,EAAM,GAGP,GAAKV,EAAaS,GAEjB,IADAR,EAASQ,EAAMR,OACPnB,EAAImB,EAAQnB,IAGL,OAFdgF,EAAQhD,EAAUL,EAAO3B,GAAKA,EAAG+E,KAGhCnD,EAAInD,KAAMuG,QAMZ,IAAMhF,KAAK2B,EAGI,OAFdqD,EAAQhD,EAAUL,EAAO3B,GAAKA,EAAG+E,KAGhCnD,EAAInD,KAAMuG,GAMb,OAAO5G,EAAMwD,IAIdqD,KAAM,EAINhG,QAASA,IAGa,mBAAXiG,SACXrE,EAAOG,GAAIkE,OAAOC,UAAapH,EAAKmH,OAAOC,WAI5CtE,EAAOkB,KAAM,uEAAuEqD,MAAO,KAC1F,SAAUC,EAAInC,GACbvE,EAAY,WAAauE,EAAO,KAAQA,EAAKoC,gBAmB/C,IAAIC,EAWJ,SAAY3H,GACZ,IAAIoC,EACHf,EACAuG,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACAxI,EACAyI,EACAC,EACAC,EACAC,EACAxB,EACAyB,EAGA1C,EAAU,SAAW,EAAI,IAAI2C,KAC7BC,EAAe5I,EAAOH,SACtBgJ,EAAU,EACVC,EAAO,EACPC,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,EAAyBH,KACzBI,EAAY,SAAUC,EAAGC,GAIxB,OAHKD,IAAMC,IACVlB,GAAe,GAET,GAIRnH,EAAS,GAAOC,eAChBf,EAAM,GACNoJ,EAAMpJ,EAAIoJ,IACVC,EAAarJ,EAAIU,KACjBA,EAAOV,EAAIU,KACXN,EAAQJ,EAAII,MAIZO,EAAU,SAAU2I,EAAMnF,GAGzB,IAFA,IAAIlC,EAAI,EACP2C,EAAM0E,EAAKlG,OACJnB,EAAI2C,EAAK3C,IAChB,GAAKqH,EAAMrH,KAAQkC,EAClB,OAAOlC,EAGT,OAAQ,GAGTsH,EAAW,6HAMXC,EAAa,sBAGbC,EAAa,0BAA4BD,EACxC,0CAGDE,EAAa,MAAQF,EAAa,KAAOC,EAAa,OAASD,EAG9D,gBAAkBA,EAIlB,2DAA6DC,EAAa,OAC1ED,EAAa,OAEdG,EAAU,KAAOF,EAAa,wFAOAC,EAAa,eAO3CE,EAAc,IAAIC,OAAQL,EAAa,IAAK,KAC5CM,EAAQ,IAAID,OAAQ,IAAML,EAAa,8BACtCA,EAAa,KAAM,KAEpBO,EAAS,IAAIF,OAAQ,IAAML,EAAa,KAAOA,EAAa,KAC5DQ,EAAe,IAAIH,OAAQ,IAAML,EAAa,WAAaA,EAAa,IAAMA,EAC7E,KACDS,EAAW,IAAIJ,OAAQL,EAAa,MAEpCU,EAAU,IAAIL,OAAQF,GACtBQ,EAAc,IAAIN,OAAQ,IAAMJ,EAAa,KAE7CW,EAAY,CACXC,GAAM,IAAIR,OAAQ,MAAQJ,EAAa,KACvCa,MAAS,IAAIT,OAAQ,QAAUJ,EAAa,KAC5Cc,IAAO,IAAIV,OAAQ,KAAOJ,EAAa,SACvCe,KAAQ,IAAIX,OAAQ,IAAMH,GAC1Be,OAAU,IAAIZ,OAAQ,IAAMF,GAC5Be,MAAS,IAAIb,OAAQ,yDACpBL,EAAa,+BAAiCA,EAAa,cAC3DA,EAAa,aAAeA,EAAa,SAAU,KACpDmB,KAAQ,IAAId,OAAQ,OAASN,EAAW,KAAM,KAI9CqB,aAAgB,IAAIf,OAAQ,IAAML,EACjC,mDAAqDA,EACrD,mBAAqBA,EAAa,mBAAoB,MAGxDqB,EAAQ,SACRC,EAAU,sCACVC,EAAU,SAEVC,EAAU,yBAGVC,EAAa,mCAEbC,GAAW,OAIXC,GAAY,IAAItB,OAAQ,uBAAyBL,EAAa,uBAAwB,KACtF4B,GAAY,SAAUC,EAAQC,GAC7B,IAAIC,EAAO,KAAOF,EAAOjL,MAAO,GAAM,MAEtC,OAAOkL,IASNC,EAAO,EACNC,OAAOC,aAAcF,EAAO,OAC5BC,OAAOC,aAAcF,GAAQ,GAAK,MAAe,KAAPA,EAAe,SAK5DG,GAAa,sDACbC,GAAa,SAAUC,EAAIC,GAC1B,OAAKA,EAGQ,OAAPD,EACG,SAIDA,EAAGxL,MAAO,GAAI,GAAM,KAC1BwL,EAAGE,WAAYF,EAAGxI,OAAS,GAAIvC,SAAU,IAAO,IAI3C,KAAO+K,GAOfG,GAAgB,WACf7D,KAGD8D,GAAqBC,GACpB,SAAU9H,GACT,OAAyB,IAAlBA,EAAK+H,UAAqD,aAAhC/H,EAAKgI,SAAS5E,eAEhD,CAAE6E,IAAK,aAAcC,KAAM,WAI7B,IACC3L,EAAKD,MACFT,EAAMI,EAAMG,KAAMkI,EAAa6D,YACjC7D,EAAa6D,YAMdtM,EAAKyI,EAAa6D,WAAWlJ,QAAS/B,SACrC,MAAQkL,GACT7L,EAAO,CAAED,MAAOT,EAAIoD,OAGnB,SAAUmC,EAAQiH,GACjBnD,EAAW5I,MAAO8E,EAAQnF,EAAMG,KAAMiM,KAKvC,SAAUjH,EAAQiH,GACjB,IAAI3H,EAAIU,EAAOnC,OACdnB,EAAI,EAGL,MAAUsD,EAAQV,KAAQ2H,EAAKvK,MAC/BsD,EAAOnC,OAASyB,EAAI,IAKvB,SAAS2C,GAAQzE,EAAUC,EAAS0D,EAAS+F,GAC5C,IAAIC,EAAGzK,EAAGkC,EAAMwI,EAAKC,EAAOC,EAAQC,EACnCC,EAAa/J,GAAWA,EAAQgK,cAGhC3L,EAAW2B,EAAUA,EAAQ3B,SAAW,EAKzC,GAHAqF,EAAUA,GAAW,GAGI,iBAAb3D,IAA0BA,GACxB,IAAb1B,GAA+B,IAAbA,GAA+B,KAAbA,EAEpC,OAAOqF,EAIR,IAAM+F,IACLvE,EAAalF,GACbA,EAAUA,GAAWtD,EAEhB0I,GAAiB,CAIrB,GAAkB,KAAb/G,IAAqBuL,EAAQ3B,EAAWgC,KAAMlK,IAGlD,GAAO2J,EAAIE,EAAO,IAGjB,GAAkB,IAAbvL,EAAiB,CACrB,KAAO8C,EAAOnB,EAAQkK,eAAgBR,IAUrC,OAAOhG,EALP,GAAKvC,EAAKgJ,KAAOT,EAEhB,OADAhG,EAAQhG,KAAMyD,GACPuC,OAYT,GAAKqG,IAAgB5I,EAAO4I,EAAWG,eAAgBR,KACtDnE,EAAUvF,EAASmB,IACnBA,EAAKgJ,KAAOT,EAGZ,OADAhG,EAAQhG,KAAMyD,GACPuC,MAKH,CAAA,GAAKkG,EAAO,GAElB,OADAlM,EAAKD,MAAOiG,EAAS1D,EAAQoK,qBAAsBrK,IAC5C2D,EAGD,IAAOgG,EAAIE,EAAO,KAAS1L,EAAQmM,wBACzCrK,EAAQqK,uBAGR,OADA3M,EAAKD,MAAOiG,EAAS1D,EAAQqK,uBAAwBX,IAC9ChG,EAKT,GAAKxF,EAAQoM,MACXtE,EAAwBjG,EAAW,QACjCsF,IAAcA,EAAUkF,KAAMxK,MAIlB,IAAb1B,GAAqD,WAAnC2B,EAAQmJ,SAAS5E,eAA+B,CAYpE,GAVAuF,EAAc/J,EACdgK,EAAa/J,EASK,IAAb3B,IACF4I,EAASsD,KAAMxK,IAAciH,EAAauD,KAAMxK,IAAe,EAGjEgK,EAAa7B,GAASqC,KAAMxK,IAAcyK,GAAaxK,EAAQN,aAC9DM,KAImBA,GAAY9B,EAAQuM,SAGhCd,EAAM3J,EAAQV,aAAc,OAClCqK,EAAMA,EAAI3G,QAAS0F,GAAYC,IAE/B3I,EAAQT,aAAc,KAAQoK,EAAM9G,IAMtC5D,GADA4K,EAASjF,EAAU7E,IACRK,OACX,MAAQnB,IACP4K,EAAQ5K,IAAQ0K,EAAM,IAAMA,EAAM,UAAa,IAC9Ce,GAAYb,EAAQ5K,IAEtB6K,EAAcD,EAAOc,KAAM,KAG5B,IAIC,OAHAjN,EAAKD,MAAOiG,EACXqG,EAAWa,iBAAkBd,IAEvBpG,EACN,MAAQmH,GACT7E,EAAwBjG,GAAU,GACjC,QACI4J,IAAQ9G,GACZ7C,EAAQ8K,gBAAiB,QAQ9B,OAAOhG,EAAQ/E,EAASiD,QAAS8D,EAAO,MAAQ9G,EAAS0D,EAAS+F,GASnE,SAAS5D,KACR,IAAIkF,EAAO,GAYX,OAVA,SAASC,EAAOC,EAAKhH,GAQpB,OALK8G,EAAKrN,KAAMuN,EAAM,KAAQxG,EAAKyG,oBAG3BF,EAAOD,EAAKI,SAEXH,EAAOC,EAAM,KAAQhH,GAShC,SAASmH,GAAcnL,GAEtB,OADAA,EAAI4C,IAAY,EACT5C,EAOR,SAASoL,GAAQpL,GAChB,IAAIqL,EAAK5O,EAAS0C,cAAe,YAEjC,IACC,QAASa,EAAIqL,GACZ,MAAQ/B,GACT,OAAO,EACN,QAGI+B,EAAG5L,YACP4L,EAAG5L,WAAWC,YAAa2L,GAI5BA,EAAK,MASP,SAASC,GAAWC,EAAOC,GAC1B,IAAIzO,EAAMwO,EAAMnH,MAAO,KACtBpF,EAAIjC,EAAIoD,OAET,MAAQnB,IACPwF,EAAKiH,WAAY1O,EAAKiC,IAAQwM,EAUhC,SAASE,GAAczF,EAAGC,GACzB,IAAIyF,EAAMzF,GAAKD,EACd2F,EAAOD,GAAsB,IAAf1F,EAAE7H,UAAiC,IAAf8H,EAAE9H,UACnC6H,EAAE4F,YAAc3F,EAAE2F,YAGpB,GAAKD,EACJ,OAAOA,EAIR,GAAKD,EACJ,MAAUA,EAAMA,EAAIG,YACnB,GAAKH,IAAQzF,EACZ,OAAQ,EAKX,OAAOD,EAAI,GAAK,EAOjB,SAAS8F,GAAmBvN,GAC3B,OAAO,SAAU0C,GAEhB,MAAgB,UADLA,EAAKgI,SAAS5E,eACEpD,EAAK1C,OAASA,GAQ3C,SAASwN,GAAoBxN,GAC5B,OAAO,SAAU0C,GAChB,IAAIgB,EAAOhB,EAAKgI,SAAS5E,cACzB,OAAkB,UAATpC,GAA6B,WAATA,IAAuBhB,EAAK1C,OAASA,GAQpE,SAASyN,GAAsBhD,GAG9B,OAAO,SAAU/H,GAKhB,MAAK,SAAUA,EASTA,EAAKzB,aAAgC,IAAlByB,EAAK+H,SAGvB,UAAW/H,EACV,UAAWA,EAAKzB,WACbyB,EAAKzB,WAAWwJ,WAAaA,EAE7B/H,EAAK+H,WAAaA,EAMpB/H,EAAKgL,aAAejD,GAI1B/H,EAAKgL,cAAgBjD,GACrBF,GAAoB7H,KAAW+H,EAG1B/H,EAAK+H,WAAaA,EAKd,UAAW/H,GACfA,EAAK+H,WAAaA,GAY5B,SAASkD,GAAwBnM,GAChC,OAAOmL,GAAc,SAAUiB,GAE9B,OADAA,GAAYA,EACLjB,GAAc,SAAU3B,EAAM3F,GACpC,IAAIjC,EACHyK,EAAerM,EAAI,GAAIwJ,EAAKrJ,OAAQiM,GACpCpN,EAAIqN,EAAalM,OAGlB,MAAQnB,IACFwK,EAAQ5H,EAAIyK,EAAcrN,MAC9BwK,EAAM5H,KAASiC,EAASjC,GAAM4H,EAAM5H,SAYzC,SAAS2I,GAAaxK,GACrB,OAAOA,GAAmD,oBAAjCA,EAAQoK,sBAAwCpK,EAkrC1E,IAAMf,KA9qCNf,EAAUsG,GAAOtG,QAAU,GAO3ByG,EAAQH,GAAOG,MAAQ,SAAUxD,GAChC,IAAIoL,EAAYpL,GAAQA,EAAKqL,aAC5BrH,EAAUhE,IAAUA,EAAK6I,eAAiB7I,GAAOsL,gBAKlD,OAAQ5E,EAAM0C,KAAMgC,GAAapH,GAAWA,EAAQgE,UAAY,SAQjEjE,EAAcV,GAAOU,YAAc,SAAUnG,GAC5C,IAAI2N,EAAYC,EACf3N,EAAMD,EAAOA,EAAKiL,eAAiBjL,EAAO0G,EAO3C,OAAKzG,GAAOtC,GAA6B,IAAjBsC,EAAIX,UAAmBW,EAAIyN,kBAMnDtH,GADAzI,EAAWsC,GACQyN,gBACnBrH,GAAkBT,EAAOjI,GAQpB+I,GAAgB/I,IAClBiQ,EAAYjQ,EAASkQ,cAAiBD,EAAUE,MAAQF,IAGrDA,EAAUG,iBACdH,EAAUG,iBAAkB,SAAU/D,IAAe,GAG1C4D,EAAUI,aACrBJ,EAAUI,YAAa,WAAYhE,KASrC7K,EAAQuM,MAAQY,GAAQ,SAAUC,GAEjC,OADAnG,EAAQ1F,YAAa6L,GAAK7L,YAAa/C,EAAS0C,cAAe,QACzB,oBAAxBkM,EAAGV,mBACfU,EAAGV,iBAAkB,uBAAwBxK,SAShDlC,EAAQwI,WAAa2E,GAAQ,SAAUC,GAEtC,OADAA,EAAG0B,UAAY,KACP1B,EAAGhM,aAAc,eAO1BpB,EAAQkM,qBAAuBiB,GAAQ,SAAUC,GAEhD,OADAA,EAAG7L,YAAa/C,EAASuQ,cAAe,MAChC3B,EAAGlB,qBAAsB,KAAMhK,SAIxClC,EAAQmM,uBAAyBrC,EAAQuC,KAAM7N,EAAS2N,wBAMxDnM,EAAQgP,QAAU7B,GAAQ,SAAUC,GAEnC,OADAnG,EAAQ1F,YAAa6L,GAAKnB,GAAKtH,GACvBnG,EAASyQ,oBAAsBzQ,EAASyQ,kBAAmBtK,GAAUzC,SAIzElC,EAAQgP,SACZzI,EAAK2I,OAAa,GAAI,SAAUjD,GAC/B,IAAIkD,EAASlD,EAAGnH,QAASmF,GAAWC,IACpC,OAAO,SAAUjH,GAChB,OAAOA,EAAK7B,aAAc,QAAW+N,IAGvC5I,EAAK6I,KAAW,GAAI,SAAUnD,EAAInK,GACjC,GAAuC,oBAA3BA,EAAQkK,gBAAkC9E,EAAiB,CACtE,IAAIjE,EAAOnB,EAAQkK,eAAgBC,GACnC,OAAOhJ,EAAO,CAAEA,GAAS,OAI3BsD,EAAK2I,OAAa,GAAK,SAAUjD,GAChC,IAAIkD,EAASlD,EAAGnH,QAASmF,GAAWC,IACpC,OAAO,SAAUjH,GAChB,IAAIpC,EAAwC,oBAA1BoC,EAAKoM,kBACtBpM,EAAKoM,iBAAkB,MACxB,OAAOxO,GAAQA,EAAKkF,QAAUoJ,IAMhC5I,EAAK6I,KAAW,GAAI,SAAUnD,EAAInK,GACjC,GAAuC,oBAA3BA,EAAQkK,gBAAkC9E,EAAiB,CACtE,IAAIrG,EAAME,EAAG2B,EACZO,EAAOnB,EAAQkK,eAAgBC,GAEhC,GAAKhJ,EAAO,CAIX,IADApC,EAAOoC,EAAKoM,iBAAkB,QACjBxO,EAAKkF,QAAUkG,EAC3B,MAAO,CAAEhJ,GAIVP,EAAQZ,EAAQmN,kBAAmBhD,GACnClL,EAAI,EACJ,MAAUkC,EAAOP,EAAO3B,KAEvB,IADAF,EAAOoC,EAAKoM,iBAAkB,QACjBxO,EAAKkF,QAAUkG,EAC3B,MAAO,CAAEhJ,GAKZ,MAAO,MAMVsD,EAAK6I,KAAY,IAAIpP,EAAQkM,qBAC5B,SAAUoD,EAAKxN,GACd,MAA6C,oBAAjCA,EAAQoK,qBACZpK,EAAQoK,qBAAsBoD,GAG1BtP,EAAQoM,IACZtK,EAAQ4K,iBAAkB4C,QAD3B,GAKR,SAAUA,EAAKxN,GACd,IAAImB,EACHsM,EAAM,GACNxO,EAAI,EAGJyE,EAAU1D,EAAQoK,qBAAsBoD,GAGzC,GAAa,MAARA,EAAc,CAClB,MAAUrM,EAAOuC,EAASzE,KACF,IAAlBkC,EAAK9C,UACToP,EAAI/P,KAAMyD,GAIZ,OAAOsM,EAER,OAAO/J,GAITe,EAAK6I,KAAc,MAAIpP,EAAQmM,wBAA0B,SAAU2C,EAAWhN,GAC7E,GAA+C,oBAAnCA,EAAQqK,wBAA0CjF,EAC7D,OAAOpF,EAAQqK,uBAAwB2C,IAUzC1H,EAAgB,GAOhBD,EAAY,IAELnH,EAAQoM,IAAMtC,EAAQuC,KAAM7N,EAASkO,qBAI3CS,GAAQ,SAAUC,GAEjB,IAAIoC,EAOJvI,EAAQ1F,YAAa6L,GAAKqC,UAAY,UAAY9K,EAAU,qBAC1CA,EAAU,kEAOvByI,EAAGV,iBAAkB,wBAAyBxK,QAClDiF,EAAU3H,KAAM,SAAW8I,EAAa,gBAKnC8E,EAAGV,iBAAkB,cAAexK,QACzCiF,EAAU3H,KAAM,MAAQ8I,EAAa,aAAeD,EAAW,KAI1D+E,EAAGV,iBAAkB,QAAU/H,EAAU,MAAOzC,QACrDiF,EAAU3H,KAAM,OAQjBgQ,EAAQhR,EAAS0C,cAAe,UAC1BG,aAAc,OAAQ,IAC5B+L,EAAG7L,YAAaiO,GACVpC,EAAGV,iBAAkB,aAAcxK,QACxCiF,EAAU3H,KAAM,MAAQ8I,EAAa,QAAUA,EAAa,KAC3DA,EAAa,gBAMT8E,EAAGV,iBAAkB,YAAaxK,QACvCiF,EAAU3H,KAAM,YAMX4N,EAAGV,iBAAkB,KAAO/H,EAAU,MAAOzC,QAClDiF,EAAU3H,KAAM,YAKjB4N,EAAGV,iBAAkB,QACrBvF,EAAU3H,KAAM,iBAGjB2N,GAAQ,SAAUC,GACjBA,EAAGqC,UAAY,oFAKf,IAAID,EAAQhR,EAAS0C,cAAe,SACpCsO,EAAMnO,aAAc,OAAQ,UAC5B+L,EAAG7L,YAAaiO,GAAQnO,aAAc,OAAQ,KAIzC+L,EAAGV,iBAAkB,YAAaxK,QACtCiF,EAAU3H,KAAM,OAAS8I,EAAa,eAKW,IAA7C8E,EAAGV,iBAAkB,YAAaxK,QACtCiF,EAAU3H,KAAM,WAAY,aAK7ByH,EAAQ1F,YAAa6L,GAAKpC,UAAW,EACc,IAA9CoC,EAAGV,iBAAkB,aAAcxK,QACvCiF,EAAU3H,KAAM,WAAY,aAK7B4N,EAAGV,iBAAkB,QACrBvF,EAAU3H,KAAM,YAIXQ,EAAQ0P,gBAAkB5F,EAAQuC,KAAQzG,EAAUqB,EAAQrB,SAClEqB,EAAQ0I,uBACR1I,EAAQ2I,oBACR3I,EAAQ4I,kBACR5I,EAAQ6I,qBAER3C,GAAQ,SAAUC,GAIjBpN,EAAQ+P,kBAAoBnK,EAAQvG,KAAM+N,EAAI,KAI9CxH,EAAQvG,KAAM+N,EAAI,aAClBhG,EAAc5H,KAAM,KAAMiJ,KAI5BtB,EAAYA,EAAUjF,QAAU,IAAIyG,OAAQxB,EAAUsF,KAAM,MAC5DrF,EAAgBA,EAAclF,QAAU,IAAIyG,OAAQvB,EAAcqF,KAAM,MAIxE+B,EAAa1E,EAAQuC,KAAMpF,EAAQ+I,yBAKnC3I,EAAWmH,GAAc1E,EAAQuC,KAAMpF,EAAQI,UAC9C,SAAUW,EAAGC,GACZ,IAAIgI,EAAuB,IAAfjI,EAAE7H,SAAiB6H,EAAEuG,gBAAkBvG,EAClDkI,EAAMjI,GAAKA,EAAEzG,WACd,OAAOwG,IAAMkI,MAAWA,GAAwB,IAAjBA,EAAI/P,YAClC8P,EAAM5I,SACL4I,EAAM5I,SAAU6I,GAChBlI,EAAEgI,yBAA8D,GAAnChI,EAAEgI,wBAAyBE,MAG3D,SAAUlI,EAAGC,GACZ,GAAKA,EACJ,MAAUA,EAAIA,EAAEzG,WACf,GAAKyG,IAAMD,EACV,OAAO,EAIV,OAAO,GAOTD,EAAYyG,EACZ,SAAUxG,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,OADAlB,GAAe,EACR,EAIR,IAAIoJ,GAAWnI,EAAEgI,yBAA2B/H,EAAE+H,wBAC9C,OAAKG,IAgBU,GAPfA,GAAYnI,EAAE8D,eAAiB9D,KAASC,EAAE6D,eAAiB7D,GAC1DD,EAAEgI,wBAAyB/H,GAG3B,KAIGjI,EAAQoQ,cAAgBnI,EAAE+H,wBAAyBhI,KAAQmI,EAOzDnI,GAAKxJ,GAAYwJ,EAAE8D,eAAiBvE,GACxCF,EAAUE,EAAcS,IAChB,EAOJC,GAAKzJ,GAAYyJ,EAAE6D,eAAiBvE,GACxCF,EAAUE,EAAcU,GACjB,EAIDnB,EACJrH,EAASqH,EAAWkB,GAAMvI,EAASqH,EAAWmB,GAChD,EAGe,EAAVkI,GAAe,EAAI,IAE3B,SAAUnI,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,OADAlB,GAAe,EACR,EAGR,IAAI2G,EACH3M,EAAI,EACJsP,EAAMrI,EAAExG,WACR0O,EAAMjI,EAAEzG,WACR8O,EAAK,CAAEtI,GACPuI,EAAK,CAAEtI,GAGR,IAAMoI,IAAQH,EAMb,OAAOlI,GAAKxJ,GAAY,EACvByJ,GAAKzJ,EAAW,EAEhB6R,GAAO,EACPH,EAAM,EACNpJ,EACErH,EAASqH,EAAWkB,GAAMvI,EAASqH,EAAWmB,GAChD,EAGK,GAAKoI,IAAQH,EACnB,OAAOzC,GAAczF,EAAGC,GAIzByF,EAAM1F,EACN,MAAU0F,EAAMA,EAAIlM,WACnB8O,EAAGE,QAAS9C,GAEbA,EAAMzF,EACN,MAAUyF,EAAMA,EAAIlM,WACnB+O,EAAGC,QAAS9C,GAIb,MAAQ4C,EAAIvP,KAAQwP,EAAIxP,GACvBA,IAGD,OAAOA,EAGN0M,GAAc6C,EAAIvP,GAAKwP,EAAIxP,IAO3BuP,EAAIvP,IAAOwG,GAAgB,EAC3BgJ,EAAIxP,IAAOwG,EAAe,EAE1B,IAGK/I,GAGR8H,GAAOV,QAAU,SAAU6K,EAAMC,GAChC,OAAOpK,GAAQmK,EAAM,KAAM,KAAMC,IAGlCpK,GAAOoJ,gBAAkB,SAAUzM,EAAMwN,GAGxC,GAFAzJ,EAAa/D,GAERjD,EAAQ0P,iBAAmBxI,IAC9BY,EAAwB2I,EAAO,QAC7BrJ,IAAkBA,EAAciF,KAAMoE,OACtCtJ,IAAkBA,EAAUkF,KAAMoE,IAErC,IACC,IAAI9N,EAAMiD,EAAQvG,KAAM4D,EAAMwN,GAG9B,GAAK9N,GAAO3C,EAAQ+P,mBAInB9M,EAAKzE,UAAuC,KAA3ByE,EAAKzE,SAAS2B,SAC/B,OAAOwC,EAEP,MAAQ0I,GACTvD,EAAwB2I,GAAM,GAIhC,OAAyD,EAAlDnK,GAAQmK,EAAMjS,EAAU,KAAM,CAAEyE,IAASf,QAGjDoE,GAAOe,SAAW,SAAUvF,EAASmB,GAUpC,OAHOnB,EAAQgK,eAAiBhK,IAAatD,GAC5CwI,EAAalF,GAEPuF,EAAUvF,EAASmB,IAG3BqD,GAAOqK,KAAO,SAAU1N,EAAMgB,IAOtBhB,EAAK6I,eAAiB7I,IAAUzE,GACtCwI,EAAa/D,GAGd,IAAIlB,EAAKwE,EAAKiH,WAAYvJ,EAAKoC,eAG9BrF,EAAMe,GAAMnC,EAAOP,KAAMkH,EAAKiH,WAAYvJ,EAAKoC,eAC9CtE,EAAIkB,EAAMgB,GAAOiD,QACjBxC,EAEF,YAAeA,IAAR1D,EACNA,EACAhB,EAAQwI,aAAetB,EACtBjE,EAAK7B,aAAc6C,IACjBjD,EAAMiC,EAAKoM,iBAAkBpL,KAAYjD,EAAI4P,UAC9C5P,EAAI+E,MACJ,MAGJO,GAAO6D,OAAS,SAAU0G,GACzB,OAASA,EAAM,IAAK/L,QAAS0F,GAAYC,KAG1CnE,GAAOtB,MAAQ,SAAUC,GACxB,MAAM,IAAIvG,MAAO,0CAA4CuG,IAO9DqB,GAAOwK,WAAa,SAAUtL,GAC7B,IAAIvC,EACH8N,EAAa,GACbpN,EAAI,EACJ5C,EAAI,EAOL,GAJAgG,GAAgB/G,EAAQgR,iBACxBlK,GAAa9G,EAAQiR,YAAczL,EAAQtG,MAAO,GAClDsG,EAAQ3B,KAAMkE,GAEThB,EAAe,CACnB,MAAU9D,EAAOuC,EAASzE,KACpBkC,IAASuC,EAASzE,KACtB4C,EAAIoN,EAAWvR,KAAMuB,IAGvB,MAAQ4C,IACP6B,EAAQ1B,OAAQiN,EAAYpN,GAAK,GAQnC,OAFAmD,EAAY,KAELtB,GAORgB,EAAUF,GAAOE,QAAU,SAAUvD,GACpC,IAAIpC,EACH8B,EAAM,GACN5B,EAAI,EACJZ,EAAW8C,EAAK9C,SAEjB,GAAMA,GAQC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAIjE,GAAiC,iBAArB8C,EAAKiO,YAChB,OAAOjO,EAAKiO,YAIZ,IAAMjO,EAAOA,EAAKkO,WAAYlO,EAAMA,EAAOA,EAAK4K,YAC/ClL,GAAO6D,EAASvD,QAGZ,GAAkB,IAAb9C,GAA+B,IAAbA,EAC7B,OAAO8C,EAAKmO,eAnBZ,MAAUvQ,EAAOoC,EAAMlC,KAGtB4B,GAAO6D,EAAS3F,GAqBlB,OAAO8B,IAGR4D,EAAOD,GAAO+K,UAAY,CAGzBrE,YAAa,GAEbsE,aAAcpE,GAEdxB,MAAOxC,EAEPsE,WAAY,GAEZ4B,KAAM,GAENmC,SAAU,CACTC,IAAK,CAAEtG,IAAK,aAAc/H,OAAO,GACjCsO,IAAK,CAAEvG,IAAK,cACZwG,IAAK,CAAExG,IAAK,kBAAmB/H,OAAO,GACtCwO,IAAK,CAAEzG,IAAK,oBAGb0G,UAAW,CACVtI,KAAQ,SAAUoC,GAWjB,OAVAA,EAAO,GAAMA,EAAO,GAAI5G,QAASmF,GAAWC,IAG5CwB,EAAO,IAAQA,EAAO,IAAOA,EAAO,IACnCA,EAAO,IAAO,IAAK5G,QAASmF,GAAWC,IAEpB,OAAfwB,EAAO,KACXA,EAAO,GAAM,IAAMA,EAAO,GAAM,KAG1BA,EAAMxM,MAAO,EAAG,IAGxBsK,MAAS,SAAUkC,GAiClB,OArBAA,EAAO,GAAMA,EAAO,GAAIrF,cAEU,QAA7BqF,EAAO,GAAIxM,MAAO,EAAG,IAGnBwM,EAAO,IACZpF,GAAOtB,MAAO0G,EAAO,IAKtBA,EAAO,KAASA,EAAO,GACtBA,EAAO,IAAQA,EAAO,IAAO,GAC7B,GAAqB,SAAfA,EAAO,IAAiC,QAAfA,EAAO,KACvCA,EAAO,KAAWA,EAAO,GAAMA,EAAO,IAAwB,QAAfA,EAAO,KAG3CA,EAAO,IAClBpF,GAAOtB,MAAO0G,EAAO,IAGfA,GAGRnC,OAAU,SAAUmC,GACnB,IAAImG,EACHC,GAAYpG,EAAO,IAAOA,EAAO,GAElC,OAAKxC,EAAmB,MAAEmD,KAAMX,EAAO,IAC/B,MAIHA,EAAO,GACXA,EAAO,GAAMA,EAAO,IAAOA,EAAO,IAAO,GAG9BoG,GAAY9I,EAAQqD,KAAMyF,KAGnCD,EAASnL,EAAUoL,GAAU,MAG7BD,EAASC,EAASrS,QAAS,IAAKqS,EAAS5P,OAAS2P,GAAWC,EAAS5P,UAGxEwJ,EAAO,GAAMA,EAAO,GAAIxM,MAAO,EAAG2S,GAClCnG,EAAO,GAAMoG,EAAS5S,MAAO,EAAG2S,IAI1BnG,EAAMxM,MAAO,EAAG,MAIzBgQ,OAAQ,CAEP7F,IAAO,SAAU0I,GAChB,IAAI9G,EAAW8G,EAAiBjN,QAASmF,GAAWC,IAAY7D,cAChE,MAA4B,MAArB0L,EACN,WACC,OAAO,GAER,SAAU9O,GACT,OAAOA,EAAKgI,UAAYhI,EAAKgI,SAAS5E,gBAAkB4E,IAI3D7B,MAAS,SAAU0F,GAClB,IAAIkD,EAAUtK,EAAYoH,EAAY,KAEtC,OAAOkD,IACJA,EAAU,IAAIrJ,OAAQ,MAAQL,EAC/B,IAAMwG,EAAY,IAAMxG,EAAa,SAAaZ,EACjDoH,EAAW,SAAU7L,GACpB,OAAO+O,EAAQ3F,KACY,iBAAnBpJ,EAAK6L,WAA0B7L,EAAK6L,WACd,oBAAtB7L,EAAK7B,cACX6B,EAAK7B,aAAc,UACpB,OAKNkI,KAAQ,SAAUrF,EAAMgO,EAAUC,GACjC,OAAO,SAAUjP,GAChB,IAAIkP,EAAS7L,GAAOqK,KAAM1N,EAAMgB,GAEhC,OAAe,MAAVkO,EACgB,OAAbF,GAEFA,IAINE,GAAU,GAIU,MAAbF,EAAmBE,IAAWD,EACvB,OAAbD,EAAoBE,IAAWD,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BC,EAAO1S,QAASyS,GAChC,OAAbD,EAAoBC,IAAoC,EAA3BC,EAAO1S,QAASyS,GAChC,OAAbD,EAAoBC,GAASC,EAAOjT,OAAQgT,EAAMhQ,UAAagQ,EAClD,OAAbD,GAA2F,GAArE,IAAME,EAAOrN,QAAS4D,EAAa,KAAQ,KAAMjJ,QAASyS,GACnE,OAAbD,IAAoBE,IAAWD,GAASC,EAAOjT,MAAO,EAAGgT,EAAMhQ,OAAS,KAAQgQ,EAAQ,QAO3F1I,MAAS,SAAUjJ,EAAM6R,EAAMC,EAAWlP,EAAOE,GAChD,IAAIiP,EAAgC,QAAvB/R,EAAKrB,MAAO,EAAG,GAC3BqT,EAA+B,SAArBhS,EAAKrB,OAAQ,GACvBsT,EAAkB,YAATJ,EAEV,OAAiB,IAAVjP,GAAwB,IAATE,EAGrB,SAAUJ,GACT,QAASA,EAAKzB,YAGf,SAAUyB,EAAMwP,EAAUC,GACzB,IAAI5F,EAAO6F,EAAaC,EAAY/R,EAAMgS,EAAWC,EACpD5H,EAAMoH,IAAWC,EAAU,cAAgB,kBAC3CQ,EAAS9P,EAAKzB,WACdyC,EAAOuO,GAAUvP,EAAKgI,SAAS5E,cAC/B2M,GAAYN,IAAQF,EACpB7E,GAAO,EAER,GAAKoF,EAAS,CAGb,GAAKT,EAAS,CACb,MAAQpH,EAAM,CACbrK,EAAOoC,EACP,MAAUpC,EAAOA,EAAMqK,GACtB,GAAKsH,EACJ3R,EAAKoK,SAAS5E,gBAAkBpC,EACd,IAAlBpD,EAAKV,SAEL,OAAO,EAKT2S,EAAQ5H,EAAe,SAAT3K,IAAoBuS,GAAS,cAE5C,OAAO,EAMR,GAHAA,EAAQ,CAAEP,EAAUQ,EAAO5B,WAAa4B,EAAOE,WAG1CV,GAAWS,EAAW,CAe1BrF,GADAkF,GADA/F,GAHA6F,GAJAC,GADA/R,EAAOkS,GACYpO,KAAe9D,EAAM8D,GAAY,KAI1B9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEZ3S,IAAU,IACZ,KAAQiH,GAAWsF,EAAO,KACzBA,EAAO,GAC3BjM,EAAOgS,GAAaE,EAAO3H,WAAYyH,GAEvC,MAAUhS,IAASgS,GAAahS,GAAQA,EAAMqK,KAG3CyC,EAAOkF,EAAY,IAAOC,EAAM5K,MAGlC,GAAuB,IAAlBrH,EAAKV,YAAoBwN,GAAQ9M,IAASoC,EAAO,CACrD0P,EAAapS,GAAS,CAAEiH,EAASqL,EAAWlF,GAC5C,YAyBF,GAlBKqF,IAaJrF,EADAkF,GADA/F,GAHA6F,GAJAC,GADA/R,EAAOoC,GACY0B,KAAe9D,EAAM8D,GAAY,KAI1B9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEZ3S,IAAU,IACZ,KAAQiH,GAAWsF,EAAO,KAMhC,IAATa,EAGJ,MAAU9M,IAASgS,GAAahS,GAAQA,EAAMqK,KAC3CyC,EAAOkF,EAAY,IAAOC,EAAM5K,MAElC,IAAOsK,EACN3R,EAAKoK,SAAS5E,gBAAkBpC,EACd,IAAlBpD,EAAKV,aACHwN,IAGGqF,KAMJL,GALAC,EAAa/R,EAAM8D,KAChB9D,EAAM8D,GAAY,KAIK9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEpB3S,GAAS,CAAEiH,EAASmG,IAG7B9M,IAASoC,GACb,MASL,OADA0K,GAAQtK,KACQF,GAAWwK,EAAOxK,GAAU,GAAqB,GAAhBwK,EAAOxK,KAK5DoG,OAAU,SAAU4J,EAAQhF,GAM3B,IAAIiF,EACHrR,EAAKwE,EAAKkC,QAAS0K,IAAY5M,EAAK8M,WAAYF,EAAO9M,gBACtDC,GAAOtB,MAAO,uBAAyBmO,GAKzC,OAAKpR,EAAI4C,GACD5C,EAAIoM,GAIK,EAAZpM,EAAGG,QACPkR,EAAO,CAAED,EAAQA,EAAQ,GAAIhF,GACtB5H,EAAK8M,WAAWxT,eAAgBsT,EAAO9M,eAC7C6G,GAAc,SAAU3B,EAAM3F,GAC7B,IAAI0N,EACHC,EAAUxR,EAAIwJ,EAAM4C,GACpBpN,EAAIwS,EAAQrR,OACb,MAAQnB,IAEPwK,EADA+H,EAAM7T,EAAS8L,EAAMgI,EAASxS,OACb6E,EAAS0N,GAAQC,EAASxS,MAG7C,SAAUkC,GACT,OAAOlB,EAAIkB,EAAM,EAAGmQ,KAIhBrR,IAIT0G,QAAS,CAGR+K,IAAOtG,GAAc,SAAUrL,GAK9B,IAAI2N,EAAQ,GACXhK,EAAU,GACViO,EAAU9M,EAAS9E,EAASiD,QAAS8D,EAAO,OAE7C,OAAO6K,EAAS9O,GACfuI,GAAc,SAAU3B,EAAM3F,EAAS6M,EAAUC,GAChD,IAAIzP,EACHyQ,EAAYD,EAASlI,EAAM,KAAMmH,EAAK,IACtC3R,EAAIwK,EAAKrJ,OAGV,MAAQnB,KACAkC,EAAOyQ,EAAW3S,MACxBwK,EAAMxK,KAAS6E,EAAS7E,GAAMkC,MAIjC,SAAUA,EAAMwP,EAAUC,GAMzB,OALAlD,EAAO,GAAMvM,EACbwQ,EAASjE,EAAO,KAAMkD,EAAKlN,GAG3BgK,EAAO,GAAM,MACLhK,EAAQ0C,SAInByL,IAAOzG,GAAc,SAAUrL,GAC9B,OAAO,SAAUoB,GAChB,OAAyC,EAAlCqD,GAAQzE,EAAUoB,GAAOf,UAIlCmF,SAAY6F,GAAc,SAAU/L,GAEnC,OADAA,EAAOA,EAAK2D,QAASmF,GAAWC,IACzB,SAAUjH,GAChB,OAAkE,GAAzDA,EAAKiO,aAAe1K,EAASvD,IAASxD,QAAS0B,MAW1DyS,KAAQ1G,GAAc,SAAU0G,GAO/B,OAJM3K,EAAYoD,KAAMuH,GAAQ,KAC/BtN,GAAOtB,MAAO,qBAAuB4O,GAEtCA,EAAOA,EAAK9O,QAASmF,GAAWC,IAAY7D,cACrC,SAAUpD,GAChB,IAAI4Q,EACJ,GACC,GAAOA,EAAW3M,EACjBjE,EAAK2Q,KACL3Q,EAAK7B,aAAc,aAAgB6B,EAAK7B,aAAc,QAGtD,OADAyS,EAAWA,EAASxN,iBACAuN,GAA2C,IAAnCC,EAASpU,QAASmU,EAAO,YAE3C3Q,EAAOA,EAAKzB,aAAkC,IAAlByB,EAAK9C,UAC7C,OAAO,KAKTkE,OAAU,SAAUpB,GACnB,IAAI6Q,EAAOnV,EAAOoV,UAAYpV,EAAOoV,SAASD,KAC9C,OAAOA,GAAQA,EAAK5U,MAAO,KAAQ+D,EAAKgJ,IAGzC+H,KAAQ,SAAU/Q,GACjB,OAAOA,IAASgE,GAGjBgN,MAAS,SAAUhR,GAClB,OAAOA,IAASzE,EAAS0V,iBACrB1V,EAAS2V,UAAY3V,EAAS2V,gBAC7BlR,EAAK1C,MAAQ0C,EAAKmR,OAASnR,EAAKoR,WAItCC,QAAWtG,IAAsB,GACjChD,SAAYgD,IAAsB,GAElCuG,QAAW,SAAUtR,GAIpB,IAAIgI,EAAWhI,EAAKgI,SAAS5E,cAC7B,MAAsB,UAAb4E,KAA0BhI,EAAKsR,SACxB,WAAbtJ,KAA2BhI,EAAKuR,UAGpCA,SAAY,SAAUvR,GASrB,OALKA,EAAKzB,YAETyB,EAAKzB,WAAWiT,eAGQ,IAAlBxR,EAAKuR,UAIbE,MAAS,SAAUzR,GAMlB,IAAMA,EAAOA,EAAKkO,WAAYlO,EAAMA,EAAOA,EAAK4K,YAC/C,GAAK5K,EAAK9C,SAAW,EACpB,OAAO,EAGT,OAAO,GAGR4S,OAAU,SAAU9P,GACnB,OAAQsD,EAAKkC,QAAiB,MAAGxF,IAIlC0R,OAAU,SAAU1R,GACnB,OAAO4G,EAAQwC,KAAMpJ,EAAKgI,WAG3BuE,MAAS,SAAUvM,GAClB,OAAO2G,EAAQyC,KAAMpJ,EAAKgI,WAG3B2J,OAAU,SAAU3R,GACnB,IAAIgB,EAAOhB,EAAKgI,SAAS5E,cACzB,MAAgB,UAATpC,GAAkC,WAAdhB,EAAK1C,MAA8B,WAAT0D,GAGtD9C,KAAQ,SAAU8B,GACjB,IAAI0N,EACJ,MAAuC,UAAhC1N,EAAKgI,SAAS5E,eACN,SAAdpD,EAAK1C,OAIuC,OAAxCoQ,EAAO1N,EAAK7B,aAAc,UACN,SAAvBuP,EAAKtK,gBAIRlD,MAAS+K,GAAwB,WAChC,MAAO,CAAE,KAGV7K,KAAQ6K,GAAwB,SAAU2G,EAAe3S,GACxD,MAAO,CAAEA,EAAS,KAGnBkB,GAAM8K,GAAwB,SAAU2G,EAAe3S,EAAQiM,GAC9D,MAAO,CAAEA,EAAW,EAAIA,EAAWjM,EAASiM,KAG7C7K,KAAQ4K,GAAwB,SAAUE,EAAclM,GAEvD,IADA,IAAInB,EAAI,EACAA,EAAImB,EAAQnB,GAAK,EACxBqN,EAAa5O,KAAMuB,GAEpB,OAAOqN,IAGR3K,IAAOyK,GAAwB,SAAUE,EAAclM,GAEtD,IADA,IAAInB,EAAI,EACAA,EAAImB,EAAQnB,GAAK,EACxBqN,EAAa5O,KAAMuB,GAEpB,OAAOqN,IAGR0G,GAAM5G,GAAwB,SAAUE,EAAclM,EAAQiM,GAM7D,IALA,IAAIpN,EAAIoN,EAAW,EAClBA,EAAWjM,EACAA,EAAXiM,EACCjM,EACAiM,EACa,KAALpN,GACTqN,EAAa5O,KAAMuB,GAEpB,OAAOqN,IAGR2G,GAAM7G,GAAwB,SAAUE,EAAclM,EAAQiM,GAE7D,IADA,IAAIpN,EAAIoN,EAAW,EAAIA,EAAWjM,EAASiM,IACjCpN,EAAImB,GACbkM,EAAa5O,KAAMuB,GAEpB,OAAOqN,OAKL3F,QAAe,IAAIlC,EAAKkC,QAAc,GAGhC,CAAEuM,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5E7O,EAAKkC,QAAS1H,GAAM+M,GAAmB/M,GAExC,IAAMA,IAAK,CAAEsU,QAAQ,EAAMC,OAAO,GACjC/O,EAAKkC,QAAS1H,GAAMgN,GAAoBhN,GAIzC,SAASsS,MA0ET,SAAS7G,GAAY+I,GAIpB,IAHA,IAAIxU,EAAI,EACP2C,EAAM6R,EAAOrT,OACbL,EAAW,GACJd,EAAI2C,EAAK3C,IAChBc,GAAY0T,EAAQxU,GAAIgF,MAEzB,OAAOlE,EAGR,SAASkJ,GAAe0I,EAAS+B,EAAYC,GAC5C,IAAIvK,EAAMsK,EAAWtK,IACpBwK,EAAOF,EAAWrK,KAClB4B,EAAM2I,GAAQxK,EACdyK,EAAmBF,GAAgB,eAAR1I,EAC3B6I,EAAWnO,IAEZ,OAAO+N,EAAWrS,MAGjB,SAAUF,EAAMnB,EAAS4Q,GACxB,MAAUzP,EAAOA,EAAMiI,GACtB,GAAuB,IAAlBjI,EAAK9C,UAAkBwV,EAC3B,OAAOlC,EAASxQ,EAAMnB,EAAS4Q,GAGjC,OAAO,GAIR,SAAUzP,EAAMnB,EAAS4Q,GACxB,IAAImD,EAAUlD,EAAaC,EAC1BkD,EAAW,CAAEtO,EAASoO,GAGvB,GAAKlD,GACJ,MAAUzP,EAAOA,EAAMiI,GACtB,IAAuB,IAAlBjI,EAAK9C,UAAkBwV,IACtBlC,EAASxQ,EAAMnB,EAAS4Q,GAC5B,OAAO,OAKV,MAAUzP,EAAOA,EAAMiI,GACtB,GAAuB,IAAlBjI,EAAK9C,UAAkBwV,EAQ3B,GAHAhD,GAJAC,EAAa3P,EAAM0B,KAAe1B,EAAM0B,GAAY,KAI1B1B,EAAKiQ,YAC5BN,EAAY3P,EAAKiQ,UAAa,IAE5BwC,GAAQA,IAASzS,EAAKgI,SAAS5E,cACnCpD,EAAOA,EAAMiI,IAASjI,MAChB,CAAA,IAAO4S,EAAWlD,EAAa5F,KACrC8I,EAAU,KAAQrO,GAAWqO,EAAU,KAAQD,EAG/C,OAASE,EAAU,GAAMD,EAAU,GAOnC,IAHAlD,EAAa5F,GAAQ+I,GAGJ,GAAMrC,EAASxQ,EAAMnB,EAAS4Q,GAC9C,OAAO,EAMZ,OAAO,GAIV,SAASqD,GAAgBC,GACxB,OAAyB,EAAlBA,EAAS9T,OACf,SAAUe,EAAMnB,EAAS4Q,GACxB,IAAI3R,EAAIiV,EAAS9T,OACjB,MAAQnB,IACP,IAAMiV,EAAUjV,GAAKkC,EAAMnB,EAAS4Q,GACnC,OAAO,EAGT,OAAO,GAERsD,EAAU,GAYZ,SAASC,GAAUvC,EAAW1Q,EAAKkM,EAAQpN,EAAS4Q,GAOnD,IANA,IAAIzP,EACHiT,EAAe,GACfnV,EAAI,EACJ2C,EAAMgQ,EAAUxR,OAChBiU,EAAgB,MAAPnT,EAEFjC,EAAI2C,EAAK3C,KACTkC,EAAOyQ,EAAW3S,MAClBmO,IAAUA,EAAQjM,EAAMnB,EAAS4Q,KACtCwD,EAAa1W,KAAMyD,GACdkT,GACJnT,EAAIxD,KAAMuB,KAMd,OAAOmV,EAGR,SAASE,GAAYxE,EAAW/P,EAAU4R,EAAS4C,EAAYC,EAAYC,GAO1E,OANKF,IAAeA,EAAY1R,KAC/B0R,EAAaD,GAAYC,IAErBC,IAAeA,EAAY3R,KAC/B2R,EAAaF,GAAYE,EAAYC,IAE/BrJ,GAAc,SAAU3B,EAAM/F,EAAS1D,EAAS4Q,GACtD,IAAI8D,EAAMzV,EAAGkC,EACZwT,EAAS,GACTC,EAAU,GACVC,EAAcnR,EAAQtD,OAGtBQ,EAAQ6I,GA5CX,SAA2B1J,EAAU+U,EAAUpR,GAG9C,IAFA,IAAIzE,EAAI,EACP2C,EAAMkT,EAAS1U,OACRnB,EAAI2C,EAAK3C,IAChBuF,GAAQzE,EAAU+U,EAAU7V,GAAKyE,GAElC,OAAOA,EAsCWqR,CACfhV,GAAY,IACZC,EAAQ3B,SAAW,CAAE2B,GAAYA,EACjC,IAIDgV,GAAYlF,IAAerG,GAAS1J,EAEnCa,EADAuT,GAAUvT,EAAO+T,EAAQ7E,EAAW9P,EAAS4Q,GAG9CqE,EAAatD,EAGZ6C,IAAgB/K,EAAOqG,EAAY+E,GAAeN,GAGjD,GAGA7Q,EACDsR,EAQF,GALKrD,GACJA,EAASqD,EAAWC,EAAYjV,EAAS4Q,GAIrC2D,EAAa,CACjBG,EAAOP,GAAUc,EAAYL,GAC7BL,EAAYG,EAAM,GAAI1U,EAAS4Q,GAG/B3R,EAAIyV,EAAKtU,OACT,MAAQnB,KACAkC,EAAOuT,EAAMzV,MACnBgW,EAAYL,EAAS3V,MAAW+V,EAAWJ,EAAS3V,IAAQkC,IAK/D,GAAKsI,GACJ,GAAK+K,GAAc1E,EAAY,CAC9B,GAAK0E,EAAa,CAGjBE,EAAO,GACPzV,EAAIgW,EAAW7U,OACf,MAAQnB,KACAkC,EAAO8T,EAAYhW,KAGzByV,EAAKhX,KAAQsX,EAAW/V,GAAMkC,GAGhCqT,EAAY,KAAQS,EAAa,GAAMP,EAAM9D,GAI9C3R,EAAIgW,EAAW7U,OACf,MAAQnB,KACAkC,EAAO8T,EAAYhW,MACsC,GAA7DyV,EAAOF,EAAa7W,EAAS8L,EAAMtI,GAASwT,EAAQ1V,MAEtDwK,EAAMiL,KAAYhR,EAASgR,GAASvT,UAOvC8T,EAAad,GACZc,IAAevR,EACduR,EAAWjT,OAAQ6S,EAAaI,EAAW7U,QAC3C6U,GAEGT,EACJA,EAAY,KAAM9Q,EAASuR,EAAYrE,GAEvClT,EAAKD,MAAOiG,EAASuR,KAMzB,SAASC,GAAmBzB,GAyB3B,IAxBA,IAAI0B,EAAcxD,EAAS9P,EAC1BD,EAAM6R,EAAOrT,OACbgV,EAAkB3Q,EAAKgL,SAAUgE,EAAQ,GAAIhV,MAC7C4W,EAAmBD,GAAmB3Q,EAAKgL,SAAU,KACrDxQ,EAAImW,EAAkB,EAAI,EAG1BE,EAAerM,GAAe,SAAU9H,GACvC,OAAOA,IAASgU,GACdE,GAAkB,GACrBE,EAAkBtM,GAAe,SAAU9H,GAC1C,OAAwC,EAAjCxD,EAASwX,EAAchU,IAC5BkU,GAAkB,GACrBnB,EAAW,CAAE,SAAU/S,EAAMnB,EAAS4Q,GACrC,IAAI/P,GAASuU,IAAqBxE,GAAO5Q,IAAY+E,MAClDoQ,EAAenV,GAAU3B,SAC1BiX,EAAcnU,EAAMnB,EAAS4Q,GAC7B2E,EAAiBpU,EAAMnB,EAAS4Q,IAIlC,OADAuE,EAAe,KACRtU,IAGD5B,EAAI2C,EAAK3C,IAChB,GAAO0S,EAAUlN,EAAKgL,SAAUgE,EAAQxU,GAAIR,MAC3CyV,EAAW,CAAEjL,GAAegL,GAAgBC,GAAYvC,QAClD,CAIN,IAHAA,EAAUlN,EAAK2I,OAAQqG,EAAQxU,GAAIR,MAAOhB,MAAO,KAAMgW,EAAQxU,GAAI6E,UAGrDjB,GAAY,CAIzB,IADAhB,IAAM5C,EACE4C,EAAID,EAAKC,IAChB,GAAK4C,EAAKgL,SAAUgE,EAAQ5R,GAAIpD,MAC/B,MAGF,OAAO6V,GACF,EAAJrV,GAASgV,GAAgBC,GACrB,EAAJjV,GAASyL,GAGT+I,EACErW,MAAO,EAAG6B,EAAI,GACdzB,OAAQ,CAAEyG,MAAgC,MAAzBwP,EAAQxU,EAAI,GAAIR,KAAe,IAAM,MACtDuE,QAAS8D,EAAO,MAClB6K,EACA1S,EAAI4C,GAAKqT,GAAmBzB,EAAOrW,MAAO6B,EAAG4C,IAC7CA,EAAID,GAAOsT,GAAqBzB,EAASA,EAAOrW,MAAOyE,IACvDA,EAAID,GAAO8I,GAAY+I,IAGzBS,EAASxW,KAAMiU,GAIjB,OAAOsC,GAAgBC,GAoTxB,OAtpBA3C,GAAWlR,UAAYoE,EAAK+Q,QAAU/Q,EAAKkC,QAC3ClC,EAAK8M,WAAa,IAAIA,GAEtB3M,EAAWJ,GAAOI,SAAW,SAAU7E,EAAU0V,GAChD,IAAIhE,EAAS7H,EAAO6J,EAAQhV,EAC3BiX,EAAO7L,EAAQ8L,EACfC,EAAS9P,EAAY/F,EAAW,KAEjC,GAAK6V,EACJ,OAAOH,EAAY,EAAIG,EAAOxY,MAAO,GAGtCsY,EAAQ3V,EACR8J,EAAS,GACT8L,EAAalR,EAAKqL,UAElB,MAAQ4F,EAAQ,CA2Bf,IAAMjX,KAxBAgT,KAAa7H,EAAQ7C,EAAOkD,KAAMyL,MAClC9L,IAGJ8L,EAAQA,EAAMtY,MAAOwM,EAAO,GAAIxJ,SAAYsV,GAE7C7L,EAAOnM,KAAQ+V,EAAS,KAGzBhC,GAAU,GAGH7H,EAAQ5C,EAAaiD,KAAMyL,MACjCjE,EAAU7H,EAAMuB,QAChBsI,EAAO/V,KAAM,CACZuG,MAAOwN,EAGPhT,KAAMmL,EAAO,GAAI5G,QAAS8D,EAAO,OAElC4O,EAAQA,EAAMtY,MAAOqU,EAAQrR,SAIhBqE,EAAK2I,SACXxD,EAAQxC,EAAW3I,GAAOwL,KAAMyL,KAAgBC,EAAYlX,MAChEmL,EAAQ+L,EAAYlX,GAAQmL,MAC9B6H,EAAU7H,EAAMuB,QAChBsI,EAAO/V,KAAM,CACZuG,MAAOwN,EACPhT,KAAMA,EACNqF,QAAS8F,IAEV8L,EAAQA,EAAMtY,MAAOqU,EAAQrR,SAI/B,IAAMqR,EACL,MAOF,OAAOgE,EACNC,EAAMtV,OACNsV,EACClR,GAAOtB,MAAOnD,GAGd+F,EAAY/F,EAAU8J,GAASzM,MAAO,IA4ZzCyH,EAAUL,GAAOK,QAAU,SAAU9E,EAAU6J,GAC9C,IAAI3K,EA9H8B4W,EAAiBC,EAC/CC,EACHC,EACAC,EA4HAH,EAAc,GACdD,EAAkB,GAClBD,EAAS7P,EAAehG,EAAW,KAEpC,IAAM6V,EAAS,CAGRhM,IACLA,EAAQhF,EAAU7E,IAEnBd,EAAI2K,EAAMxJ,OACV,MAAQnB,KACP2W,EAASV,GAAmBtL,EAAO3K,KACtB4D,GACZiT,EAAYpY,KAAMkY,GAElBC,EAAgBnY,KAAMkY,IAKxBA,EAAS7P,EACRhG,GArJgC8V,EAsJNA,EArJxBE,EAA6B,GADkBD,EAsJNA,GArJrB1V,OACvB4V,EAAqC,EAAzBH,EAAgBzV,OAC5B6V,EAAe,SAAUxM,EAAMzJ,EAAS4Q,EAAKlN,EAASwS,GACrD,IAAI/U,EAAMU,EAAG8P,EACZwE,EAAe,EACflX,EAAI,IACJ2S,EAAYnI,GAAQ,GACpB2M,EAAa,GACbC,EAAgBtR,EAGhBnE,EAAQ6I,GAAQuM,GAAavR,EAAK6I,KAAY,IAAG,IAAK4I,GAGtDI,EAAkB5Q,GAA4B,MAAjB2Q,EAAwB,EAAIvT,KAAKC,UAAY,GAC1EnB,EAAMhB,EAAMR,OAcb,IAZK8V,IAMJnR,EAAmB/E,GAAWtD,GAAYsD,GAAWkW,GAM9CjX,IAAM2C,GAAgC,OAAvBT,EAAOP,EAAO3B,IAAeA,IAAM,CACzD,GAAK+W,GAAa7U,EAAO,CACxBU,EAAI,EAME7B,GAAWmB,EAAK6I,eAAiBtN,IACtCwI,EAAa/D,GACbyP,GAAOxL,GAER,MAAUuM,EAAUkE,EAAiBhU,KACpC,GAAK8P,EAASxQ,EAAMnB,GAAWtD,EAAUkU,GAAQ,CAChDlN,EAAQhG,KAAMyD,GACd,MAGG+U,IACJxQ,EAAU4Q,GAKPP,KAGG5U,GAAQwQ,GAAWxQ,IACzBgV,IAII1M,GACJmI,EAAUlU,KAAMyD,IAgBnB,GATAgV,GAAgBlX,EASX8W,GAAS9W,IAAMkX,EAAe,CAClCtU,EAAI,EACJ,MAAU8P,EAAUmE,EAAajU,KAChC8P,EAASC,EAAWwE,EAAYpW,EAAS4Q,GAG1C,GAAKnH,EAAO,CAGX,GAAoB,EAAf0M,EACJ,MAAQlX,IACC2S,EAAW3S,IAAOmX,EAAYnX,KACrCmX,EAAYnX,GAAMmH,EAAI7I,KAAMmG,IAM/B0S,EAAajC,GAAUiC,GAIxB1Y,EAAKD,MAAOiG,EAAS0S,GAGhBF,IAAczM,GAA4B,EAApB2M,EAAWhW,QACG,EAAtC+V,EAAeL,EAAY1V,QAE7BoE,GAAOwK,WAAYtL,GAUrB,OALKwS,IACJxQ,EAAU4Q,EACVvR,EAAmBsR,GAGbzE,GAGFmE,EACN3K,GAAc6K,GACdA,KAgCOlW,SAAWA,EAEnB,OAAO6V,GAYR9Q,EAASN,GAAOM,OAAS,SAAU/E,EAAUC,EAAS0D,EAAS+F,GAC9D,IAAIxK,EAAGwU,EAAQ8C,EAAO9X,EAAM6O,EAC3BkJ,EAA+B,mBAAbzW,GAA2BA,EAC7C6J,GAASH,GAAQ7E,EAAY7E,EAAWyW,EAASzW,UAAYA,GAM9D,GAJA2D,EAAUA,GAAW,GAIC,IAAjBkG,EAAMxJ,OAAe,CAIzB,GAAqB,GADrBqT,EAAS7J,EAAO,GAAMA,EAAO,GAAIxM,MAAO,IAC5BgD,QAA+C,QAA/BmW,EAAQ9C,EAAQ,IAAMhV,MAC5B,IAArBuB,EAAQ3B,UAAkB+G,GAAkBX,EAAKgL,SAAUgE,EAAQ,GAAIhV,MAAS,CAIhF,KAFAuB,GAAYyE,EAAK6I,KAAW,GAAGiJ,EAAMzS,QAAS,GAC5Cd,QAASmF,GAAWC,IAAapI,IAAa,IAAM,IAErD,OAAO0D,EAGI8S,IACXxW,EAAUA,EAAQN,YAGnBK,EAAWA,EAAS3C,MAAOqW,EAAOtI,QAAQlH,MAAM7D,QAIjDnB,EAAImI,EAA0B,aAAEmD,KAAMxK,GAAa,EAAI0T,EAAOrT,OAC9D,MAAQnB,IAAM,CAIb,GAHAsX,EAAQ9C,EAAQxU,GAGXwF,EAAKgL,SAAYhR,EAAO8X,EAAM9X,MAClC,MAED,IAAO6O,EAAO7I,EAAK6I,KAAM7O,MAGjBgL,EAAO6D,EACbiJ,EAAMzS,QAAS,GAAId,QAASmF,GAAWC,IACvCF,GAASqC,KAAMkJ,EAAQ,GAAIhV,OAAU+L,GAAaxK,EAAQN,aACzDM,IACI,CAKL,GAFAyT,EAAOzR,OAAQ/C,EAAG,KAClBc,EAAW0J,EAAKrJ,QAAUsK,GAAY+I,IAGrC,OADA/V,EAAKD,MAAOiG,EAAS+F,GACd/F,EAGR,QAeJ,OAPE8S,GAAY3R,EAAS9E,EAAU6J,IAChCH,EACAzJ,GACCoF,EACD1B,GACC1D,GAAWkI,GAASqC,KAAMxK,IAAcyK,GAAaxK,EAAQN,aAAgBM,GAExE0D,GAMRxF,EAAQiR,WAAatM,EAAQwB,MAAO,IAAKtC,KAAMkE,GAAY0E,KAAM,MAAS9H,EAI1E3E,EAAQgR,mBAAqBjK,EAG7BC,IAIAhH,EAAQoQ,aAAejD,GAAQ,SAAUC,GAGxC,OAA4E,EAArEA,EAAG4C,wBAAyBxR,EAAS0C,cAAe,eAMtDiM,GAAQ,SAAUC,GAEvB,OADAA,EAAGqC,UAAY,mBACiC,MAAzCrC,EAAG+D,WAAW/P,aAAc,WAEnCiM,GAAW,yBAA0B,SAAUpK,EAAMgB,EAAMwC,GAC1D,IAAMA,EACL,OAAOxD,EAAK7B,aAAc6C,EAA6B,SAAvBA,EAAKoC,cAA2B,EAAI,KAOjErG,EAAQwI,YAAe2E,GAAQ,SAAUC,GAG9C,OAFAA,EAAGqC,UAAY,WACfrC,EAAG+D,WAAW9P,aAAc,QAAS,IACY,KAA1C+L,EAAG+D,WAAW/P,aAAc,YAEnCiM,GAAW,QAAS,SAAUpK,EAAMsV,EAAO9R,GAC1C,IAAMA,GAAyC,UAAhCxD,EAAKgI,SAAS5E,cAC5B,OAAOpD,EAAKuV,eAOTrL,GAAQ,SAAUC,GACvB,OAAwC,MAAjCA,EAAGhM,aAAc,eAExBiM,GAAWhF,EAAU,SAAUpF,EAAMgB,EAAMwC,GAC1C,IAAIzF,EACJ,IAAMyF,EACL,OAAwB,IAAjBxD,EAAMgB,GAAkBA,EAAKoC,eACjCrF,EAAMiC,EAAKoM,iBAAkBpL,KAAYjD,EAAI4P,UAC9C5P,EAAI+E,MACJ,OAKEO,GA14EP,CA44EK3H,GAILiD,EAAOwN,KAAO9I,EACd1E,EAAO6O,KAAOnK,EAAO+K,UAGrBzP,EAAO6O,KAAM,KAAQ7O,EAAO6O,KAAKhI,QACjC7G,EAAOkP,WAAalP,EAAO6W,OAASnS,EAAOwK,WAC3ClP,EAAOT,KAAOmF,EAAOE,QACrB5E,EAAO8W,SAAWpS,EAAOG,MACzB7E,EAAOyF,SAAWf,EAAOe,SACzBzF,EAAO+W,eAAiBrS,EAAO6D,OAK/B,IAAIe,EAAM,SAAUjI,EAAMiI,EAAK0N,GAC9B,IAAIrF,EAAU,GACbsF,OAAqBnU,IAAVkU,EAEZ,OAAU3V,EAAOA,EAAMiI,KAA6B,IAAlBjI,EAAK9C,SACtC,GAAuB,IAAlB8C,EAAK9C,SAAiB,CAC1B,GAAK0Y,GAAYjX,EAAQqB,GAAO6V,GAAIF,GACnC,MAEDrF,EAAQ/T,KAAMyD,GAGhB,OAAOsQ,GAIJwF,EAAW,SAAUC,EAAG/V,GAG3B,IAFA,IAAIsQ,EAAU,GAENyF,EAAGA,EAAIA,EAAEnL,YACI,IAAfmL,EAAE7Y,UAAkB6Y,IAAM/V,GAC9BsQ,EAAQ/T,KAAMwZ,GAIhB,OAAOzF,GAIJ0F,EAAgBrX,EAAO6O,KAAK/E,MAAMhC,aAItC,SAASuB,EAAUhI,EAAMgB,GAExB,OAAOhB,EAAKgI,UAAYhI,EAAKgI,SAAS5E,gBAAkBpC,EAAKoC,cAG9D,IAAI6S,EAAa,kEAKjB,SAASC,EAAQzI,EAAU0I,EAAW5F,GACrC,OAAKvT,EAAYmZ,GACTxX,EAAO2B,KAAMmN,EAAU,SAAUzN,EAAMlC,GAC7C,QAASqY,EAAU/Z,KAAM4D,EAAMlC,EAAGkC,KAAWuQ,IAK1C4F,EAAUjZ,SACPyB,EAAO2B,KAAMmN,EAAU,SAAUzN,GACvC,OAASA,IAASmW,IAAgB5F,IAKV,iBAAd4F,EACJxX,EAAO2B,KAAMmN,EAAU,SAAUzN,GACvC,OAA4C,EAAnCxD,EAAQJ,KAAM+Z,EAAWnW,KAAkBuQ,IAK/C5R,EAAOsN,OAAQkK,EAAW1I,EAAU8C,GAG5C5R,EAAOsN,OAAS,SAAUuB,EAAM/N,EAAO8Q,GACtC,IAAIvQ,EAAOP,EAAO,GAMlB,OAJK8Q,IACJ/C,EAAO,QAAUA,EAAO,KAGH,IAAjB/N,EAAMR,QAAkC,IAAlBe,EAAK9C,SACxByB,EAAOwN,KAAKM,gBAAiBzM,EAAMwN,GAAS,CAAExN,GAAS,GAGxDrB,EAAOwN,KAAKxJ,QAAS6K,EAAM7O,EAAO2B,KAAMb,EAAO,SAAUO,GAC/D,OAAyB,IAAlBA,EAAK9C,aAIdyB,EAAOG,GAAGgC,OAAQ,CACjBqL,KAAM,SAAUvN,GACf,IAAId,EAAG4B,EACNe,EAAM9E,KAAKsD,OACXmX,EAAOza,KAER,GAAyB,iBAAbiD,EACX,OAAOjD,KAAK6D,UAAWb,EAAQC,GAAWqN,OAAQ,WACjD,IAAMnO,EAAI,EAAGA,EAAI2C,EAAK3C,IACrB,GAAKa,EAAOyF,SAAUgS,EAAMtY,GAAKnC,MAChC,OAAO,KAQX,IAFA+D,EAAM/D,KAAK6D,UAAW,IAEhB1B,EAAI,EAAGA,EAAI2C,EAAK3C,IACrBa,EAAOwN,KAAMvN,EAAUwX,EAAMtY,GAAK4B,GAGnC,OAAa,EAANe,EAAU9B,EAAOkP,WAAYnO,GAAQA,GAE7CuM,OAAQ,SAAUrN,GACjB,OAAOjD,KAAK6D,UAAW0W,EAAQva,KAAMiD,GAAY,IAAI,KAEtD2R,IAAK,SAAU3R,GACd,OAAOjD,KAAK6D,UAAW0W,EAAQva,KAAMiD,GAAY,IAAI,KAEtDiX,GAAI,SAAUjX,GACb,QAASsX,EACRva,KAIoB,iBAAbiD,GAAyBoX,EAAc5M,KAAMxK,GACnDD,EAAQC,GACRA,GAAY,IACb,GACCK,UASJ,IAAIoX,EAMHvP,EAAa,uCAENnI,EAAOG,GAAGC,KAAO,SAAUH,EAAUC,EAASkS,GACpD,IAAItI,EAAOzI,EAGX,IAAMpB,EACL,OAAOjD,KAQR,GAHAoV,EAAOA,GAAQsF,EAGU,iBAAbzX,EAAwB,CAanC,KAPC6J,EALsB,MAAlB7J,EAAU,IACsB,MAApCA,EAAUA,EAASK,OAAS,IACT,GAAnBL,EAASK,OAGD,CAAE,KAAML,EAAU,MAGlBkI,EAAWgC,KAAMlK,MAIV6J,EAAO,IAAQ5J,EA6CxB,OAAMA,GAAWA,EAAQM,QACtBN,GAAWkS,GAAO5E,KAAMvN,GAK1BjD,KAAKyD,YAAaP,GAAUsN,KAAMvN,GAhDzC,GAAK6J,EAAO,GAAM,CAYjB,GAXA5J,EAAUA,aAAmBF,EAASE,EAAS,GAAMA,EAIrDF,EAAOgB,MAAOhE,KAAMgD,EAAO2X,UAC1B7N,EAAO,GACP5J,GAAWA,EAAQ3B,SAAW2B,EAAQgK,eAAiBhK,EAAUtD,GACjE,IAII0a,EAAW7M,KAAMX,EAAO,KAAS9J,EAAO2C,cAAezC,GAC3D,IAAM4J,KAAS5J,EAGT7B,EAAYrB,KAAM8M,IACtB9M,KAAM8M,GAAS5J,EAAS4J,IAIxB9M,KAAK+R,KAAMjF,EAAO5J,EAAS4J,IAK9B,OAAO9M,KAYP,OARAqE,EAAOzE,EAASwN,eAAgBN,EAAO,OAKtC9M,KAAM,GAAMqE,EACZrE,KAAKsD,OAAS,GAERtD,KAcH,OAAKiD,EAAS1B,UACpBvB,KAAM,GAAMiD,EACZjD,KAAKsD,OAAS,EACPtD,MAIIqB,EAAY4B,QACD6C,IAAfsP,EAAKwF,MACXxF,EAAKwF,MAAO3X,GAGZA,EAAUD,GAGLA,EAAO2D,UAAW1D,EAAUjD,QAIhCuD,UAAYP,EAAOG,GAGxBuX,EAAa1X,EAAQpD,GAGrB,IAAIib,EAAe,iCAGlBC,EAAmB,CAClBC,UAAU,EACVC,UAAU,EACVzO,MAAM,EACN0O,MAAM,GAoFR,SAASC,EAASpM,EAAKxC,GACtB,OAAUwC,EAAMA,EAAKxC,KAA4B,IAAjBwC,EAAIvN,UACpC,OAAOuN,EAnFR9L,EAAOG,GAAGgC,OAAQ,CACjB4P,IAAK,SAAUtP,GACd,IAAI0V,EAAUnY,EAAQyC,EAAQzF,MAC7Bob,EAAID,EAAQ7X,OAEb,OAAOtD,KAAKsQ,OAAQ,WAEnB,IADA,IAAInO,EAAI,EACAA,EAAIiZ,EAAGjZ,IACd,GAAKa,EAAOyF,SAAUzI,KAAMmb,EAAShZ,IACpC,OAAO,KAMXkZ,QAAS,SAAU5I,EAAWvP,GAC7B,IAAI4L,EACH3M,EAAI,EACJiZ,EAAIpb,KAAKsD,OACTqR,EAAU,GACVwG,EAA+B,iBAAd1I,GAA0BzP,EAAQyP,GAGpD,IAAM4H,EAAc5M,KAAMgF,GACzB,KAAQtQ,EAAIiZ,EAAGjZ,IACd,IAAM2M,EAAM9O,KAAMmC,GAAK2M,GAAOA,IAAQ5L,EAAS4L,EAAMA,EAAIlM,WAGxD,GAAKkM,EAAIvN,SAAW,KAAQ4Z,GACH,EAAxBA,EAAQG,MAAOxM,GAGE,IAAjBA,EAAIvN,UACHyB,EAAOwN,KAAKM,gBAAiBhC,EAAK2D,IAAgB,CAEnDkC,EAAQ/T,KAAMkO,GACd,MAMJ,OAAO9O,KAAK6D,UAA4B,EAAjB8Q,EAAQrR,OAAaN,EAAOkP,WAAYyC,GAAYA,IAI5E2G,MAAO,SAAUjX,GAGhB,OAAMA,EAKe,iBAATA,EACJxD,EAAQJ,KAAMuC,EAAQqB,GAAQrE,KAAM,IAIrCa,EAAQJ,KAAMT,KAGpBqE,EAAKb,OAASa,EAAM,GAAMA,GAZjBrE,KAAM,IAAOA,KAAM,GAAI4C,WAAe5C,KAAKuE,QAAQgX,UAAUjY,QAAU,GAgBlFkY,IAAK,SAAUvY,EAAUC,GACxB,OAAOlD,KAAK6D,UACXb,EAAOkP,WACNlP,EAAOgB,MAAOhE,KAAK2D,MAAOX,EAAQC,EAAUC,OAK/CuY,QAAS,SAAUxY,GAClB,OAAOjD,KAAKwb,IAAiB,MAAZvY,EAChBjD,KAAKiE,WAAajE,KAAKiE,WAAWqM,OAAQrN,OAU7CD,EAAOkB,KAAM,CACZiQ,OAAQ,SAAU9P,GACjB,IAAI8P,EAAS9P,EAAKzB,WAClB,OAAOuR,GAA8B,KAApBA,EAAO5S,SAAkB4S,EAAS,MAEpDuH,QAAS,SAAUrX,GAClB,OAAOiI,EAAKjI,EAAM,eAEnBsX,aAAc,SAAUtX,EAAMmD,EAAIwS,GACjC,OAAO1N,EAAKjI,EAAM,aAAc2V,IAEjCzN,KAAM,SAAUlI,GACf,OAAO6W,EAAS7W,EAAM,gBAEvB4W,KAAM,SAAU5W,GACf,OAAO6W,EAAS7W,EAAM,oBAEvBuX,QAAS,SAAUvX,GAClB,OAAOiI,EAAKjI,EAAM,gBAEnBkX,QAAS,SAAUlX,GAClB,OAAOiI,EAAKjI,EAAM,oBAEnBwX,UAAW,SAAUxX,EAAMmD,EAAIwS,GAC9B,OAAO1N,EAAKjI,EAAM,cAAe2V,IAElC8B,UAAW,SAAUzX,EAAMmD,EAAIwS,GAC9B,OAAO1N,EAAKjI,EAAM,kBAAmB2V,IAEtCG,SAAU,SAAU9V,GACnB,OAAO8V,GAAY9V,EAAKzB,YAAc,IAAK2P,WAAYlO,IAExD0W,SAAU,SAAU1W,GACnB,OAAO8V,EAAU9V,EAAKkO,aAEvByI,SAAU,SAAU3W,GACnB,OAA6B,MAAxBA,EAAK0X,iBAKT5b,EAAUkE,EAAK0X,iBAER1X,EAAK0X,iBAMR1P,EAAUhI,EAAM,cACpBA,EAAOA,EAAK2X,SAAW3X,GAGjBrB,EAAOgB,MAAO,GAAIK,EAAKmI,eAE7B,SAAUnH,EAAMlC,GAClBH,EAAOG,GAAIkC,GAAS,SAAU2U,EAAO/W,GACpC,IAAI0R,EAAU3R,EAAOoB,IAAKpE,KAAMmD,EAAI6W,GAuBpC,MArB0B,UAArB3U,EAAK/E,OAAQ,KACjB2C,EAAW+W,GAGP/W,GAAgC,iBAAbA,IACvB0R,EAAU3R,EAAOsN,OAAQrN,EAAU0R,IAGjB,EAAd3U,KAAKsD,SAGHwX,EAAkBzV,IACvBrC,EAAOkP,WAAYyC,GAIfkG,EAAapN,KAAMpI,IACvBsP,EAAQsH,WAIHjc,KAAK6D,UAAW8Q,MAGzB,IAAIuH,EAAgB,oBAsOpB,SAASC,EAAUC,GAClB,OAAOA,EAER,SAASC,EAASC,GACjB,MAAMA,EAGP,SAASC,EAAYpV,EAAOqV,EAASC,EAAQC,GAC5C,IAAIC,EAEJ,IAGMxV,GAAS9F,EAAcsb,EAASxV,EAAMyV,SAC1CD,EAAOlc,KAAM0G,GAAQ0B,KAAM2T,GAAUK,KAAMJ,GAGhCtV,GAAS9F,EAAcsb,EAASxV,EAAM2V,MACjDH,EAAOlc,KAAM0G,EAAOqV,EAASC,GAQ7BD,EAAQ7b,WAAOmF,EAAW,CAAEqB,GAAQ7G,MAAOoc,IAM3C,MAAQvV,GAITsV,EAAO9b,WAAOmF,EAAW,CAAEqB,KAvO7BnE,EAAO+Z,UAAY,SAAU3X,GA9B7B,IAAwBA,EACnB4X,EAiCJ5X,EAA6B,iBAAZA,GAlCMA,EAmCPA,EAlCZ4X,EAAS,GACbha,EAAOkB,KAAMkB,EAAQ0H,MAAOoP,IAAmB,GAAI,SAAUe,EAAGC,GAC/DF,EAAQE,IAAS,IAEXF,GA+BNha,EAAOmC,OAAQ,GAAIC,GAEpB,IACC+X,EAGAC,EAGAC,EAGAC,EAGA9T,EAAO,GAGP+T,EAAQ,GAGRC,GAAe,EAGfC,EAAO,WAQN,IALAH,EAASA,GAAUlY,EAAQsY,KAI3BL,EAAQF,GAAS,EACTI,EAAMja,OAAQka,GAAe,EAAI,CACxCJ,EAASG,EAAMlP,QACf,QAAUmP,EAAchU,EAAKlG,QAGmC,IAA1DkG,EAAMgU,GAAc7c,MAAOyc,EAAQ,GAAKA,EAAQ,KACpDhY,EAAQuY,cAGRH,EAAchU,EAAKlG,OACnB8Z,GAAS,GAMNhY,EAAQgY,SACbA,GAAS,GAGVD,GAAS,EAGJG,IAIH9T,EADI4T,EACG,GAIA,KAMV3C,EAAO,CAGNe,IAAK,WA2BJ,OA1BKhS,IAGC4T,IAAWD,IACfK,EAAchU,EAAKlG,OAAS,EAC5Bia,EAAM3c,KAAMwc,IAGb,SAAW5B,EAAKhH,GACfxR,EAAOkB,KAAMsQ,EAAM,SAAUyI,EAAG/V,GAC1B7F,EAAY6F,GACV9B,EAAQyU,QAAWY,EAAK1F,IAAK7N,IAClCsC,EAAK5I,KAAMsG,GAEDA,GAAOA,EAAI5D,QAA4B,WAAlBR,EAAQoE,IAGxCsU,EAAKtU,KATR,CAYK5C,WAEA8Y,IAAWD,GACfM,KAGKzd,MAIR4d,OAAQ,WAYP,OAXA5a,EAAOkB,KAAMI,UAAW,SAAU2Y,EAAG/V,GACpC,IAAIoU,EACJ,OAA0D,GAAhDA,EAAQtY,EAAO6D,QAASK,EAAKsC,EAAM8R,IAC5C9R,EAAKtE,OAAQoW,EAAO,GAGfA,GAASkC,GACbA,MAIIxd,MAKR+U,IAAK,SAAU5R,GACd,OAAOA,GACwB,EAA9BH,EAAO6D,QAAS1D,EAAIqG,GACN,EAAdA,EAAKlG,QAIPwS,MAAO,WAIN,OAHKtM,IACJA,EAAO,IAEDxJ,MAMR6d,QAAS,WAGR,OAFAP,EAASC,EAAQ,GACjB/T,EAAO4T,EAAS,GACTpd,MAERoM,SAAU,WACT,OAAQ5C,GAMTsU,KAAM,WAKL,OAJAR,EAASC,EAAQ,GACXH,GAAWD,IAChB3T,EAAO4T,EAAS,IAEVpd,MAERsd,OAAQ,WACP,QAASA,GAIVS,SAAU,SAAU7a,EAASsR,GAS5B,OARM8I,IAEL9I,EAAO,CAAEtR,GADTsR,EAAOA,GAAQ,IACQlU,MAAQkU,EAAKlU,QAAUkU,GAC9C+I,EAAM3c,KAAM4T,GACN2I,GACLM,KAGKzd,MAIRyd,KAAM,WAEL,OADAhD,EAAKsD,SAAU/d,KAAMsE,WACdtE,MAIRqd,MAAO,WACN,QAASA,IAIZ,OAAO5C,GA4CRzX,EAAOmC,OAAQ,CAEd6Y,SAAU,SAAUC,GACnB,IAAIC,EAAS,CAIX,CAAE,SAAU,WAAYlb,EAAO+Z,UAAW,UACzC/Z,EAAO+Z,UAAW,UAAY,GAC/B,CAAE,UAAW,OAAQ/Z,EAAO+Z,UAAW,eACtC/Z,EAAO+Z,UAAW,eAAiB,EAAG,YACvC,CAAE,SAAU,OAAQ/Z,EAAO+Z,UAAW,eACrC/Z,EAAO+Z,UAAW,eAAiB,EAAG,aAExCoB,EAAQ,UACRvB,EAAU,CACTuB,MAAO,WACN,OAAOA,GAERC,OAAQ,WAEP,OADAC,EAASxV,KAAMvE,WAAYuY,KAAMvY,WAC1BtE,MAERse,QAAS,SAAUnb,GAClB,OAAOyZ,EAAQE,KAAM,KAAM3Z,IAI5Bob,KAAM,WACL,IAAIC,EAAMla,UAEV,OAAOtB,EAAOgb,SAAU,SAAUS,GACjCzb,EAAOkB,KAAMga,EAAQ,SAAU1W,EAAIkX,GAGlC,IAAIvb,EAAK9B,EAAYmd,EAAKE,EAAO,MAAWF,EAAKE,EAAO,IAKxDL,EAAUK,EAAO,IAAO,WACvB,IAAIC,EAAWxb,GAAMA,EAAGxC,MAAOX,KAAMsE,WAChCqa,GAAYtd,EAAYsd,EAAS/B,SACrC+B,EAAS/B,UACPgC,SAAUH,EAASI,QACnBhW,KAAM4V,EAASjC,SACfK,KAAM4B,EAAShC,QAEjBgC,EAAUC,EAAO,GAAM,QACtB1e,KACAmD,EAAK,CAAEwb,GAAara,eAKxBka,EAAM,OACH5B,WAELE,KAAM,SAAUgC,EAAaC,EAAYC,GACxC,IAAIC,EAAW,EACf,SAASzC,EAAS0C,EAAOb,EAAU1P,EAASwQ,GAC3C,OAAO,WACN,IAAIC,EAAOpf,KACVwU,EAAOlQ,UACP+a,EAAa,WACZ,IAAIV,EAAU7B,EAKd,KAAKoC,EAAQD,GAAb,CAQA,IAJAN,EAAWhQ,EAAQhO,MAAOye,EAAM5K,MAId6J,EAASzB,UAC1B,MAAM,IAAI0C,UAAW,4BAOtBxC,EAAO6B,IAKgB,iBAAbA,GACY,mBAAbA,IACRA,EAAS7B,KAGLzb,EAAYyb,GAGXqC,EACJrC,EAAKrc,KACJke,EACAnC,EAASyC,EAAUZ,EAAUlC,EAAUgD,GACvC3C,EAASyC,EAAUZ,EAAUhC,EAAS8C,KAOvCF,IAEAnC,EAAKrc,KACJke,EACAnC,EAASyC,EAAUZ,EAAUlC,EAAUgD,GACvC3C,EAASyC,EAAUZ,EAAUhC,EAAS8C,GACtC3C,EAASyC,EAAUZ,EAAUlC,EAC5BkC,EAASkB,eASP5Q,IAAYwN,IAChBiD,OAAOtZ,EACP0O,EAAO,CAAEmK,KAKRQ,GAAWd,EAASmB,aAAeJ,EAAM5K,MAK7CiL,EAAUN,EACTE,EACA,WACC,IACCA,IACC,MAAQ5S,GAEJzJ,EAAOgb,SAAS0B,eACpB1c,EAAOgb,SAAS0B,cAAejT,EAC9BgT,EAAQE,YAMQV,GAAbC,EAAQ,IAIPvQ,IAAY0N,IAChB+C,OAAOtZ,EACP0O,EAAO,CAAE/H,IAGV4R,EAASuB,WAAYR,EAAM5K,MAS3B0K,EACJO,KAKKzc,EAAOgb,SAAS6B,eACpBJ,EAAQE,WAAa3c,EAAOgb,SAAS6B,gBAEtC9f,EAAO+f,WAAYL,KAKtB,OAAOzc,EAAOgb,SAAU,SAAUS,GAGjCP,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACApd,EAAY2d,GACXA,EACA7C,EACDsC,EAASc,aAKXrB,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACApd,EAAYyd,GACXA,EACA3C,IAKH+B,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACApd,EAAY0d,GACXA,EACA1C,MAGAO,WAKLA,QAAS,SAAUtb,GAClB,OAAc,MAAPA,EAAc0B,EAAOmC,OAAQ7D,EAAKsb,GAAYA,IAGvDyB,EAAW,GAkEZ,OA/DArb,EAAOkB,KAAMga,EAAQ,SAAU/b,EAAGuc,GACjC,IAAIlV,EAAOkV,EAAO,GACjBqB,EAAcrB,EAAO,GAKtB9B,EAAS8B,EAAO,IAAQlV,EAAKgS,IAGxBuE,GACJvW,EAAKgS,IACJ,WAIC2C,EAAQ4B,GAKT7B,EAAQ,EAAI/b,GAAK,GAAI0b,QAIrBK,EAAQ,EAAI/b,GAAK,GAAI0b,QAGrBK,EAAQ,GAAK,GAAIJ,KAGjBI,EAAQ,GAAK,GAAIJ,MAOnBtU,EAAKgS,IAAKkD,EAAO,GAAIjB,MAKrBY,EAAUK,EAAO,IAAQ,WAExB,OADAL,EAAUK,EAAO,GAAM,QAAU1e,OAASqe,OAAWvY,EAAY9F,KAAMsE,WAChEtE,MAMRqe,EAAUK,EAAO,GAAM,QAAWlV,EAAKuU,WAIxCnB,EAAQA,QAASyB,GAGZJ,GACJA,EAAKxd,KAAM4d,EAAUA,GAIfA,GAIR2B,KAAM,SAAUC,GACf,IAGCC,EAAY5b,UAAUhB,OAGtBnB,EAAI+d,EAGJC,EAAkBva,MAAOzD,GACzBie,EAAgB9f,EAAMG,KAAM6D,WAG5B+b,EAAUrd,EAAOgb,WAGjBsC,EAAa,SAAUne,GACtB,OAAO,SAAUgF,GAChBgZ,EAAiBhe,GAAMnC,KACvBogB,EAAeje,GAAyB,EAAnBmC,UAAUhB,OAAahD,EAAMG,KAAM6D,WAAc6C,IAC5D+Y,GACTG,EAAQb,YAAaW,EAAiBC,KAM1C,GAAKF,GAAa,IACjB3D,EAAY0D,EAAaI,EAAQxX,KAAMyX,EAAYne,IAAMqa,QAAS6D,EAAQ5D,QACxEyD,GAGuB,YAApBG,EAAQlC,SACZ9c,EAAY+e,EAAeje,IAAOie,EAAeje,GAAI2a,OAErD,OAAOuD,EAAQvD,OAKjB,MAAQ3a,IACPoa,EAAY6D,EAAeje,GAAKme,EAAYne,GAAKke,EAAQ5D,QAG1D,OAAO4D,EAAQzD,aAOjB,IAAI2D,EAAc,yDAElBvd,EAAOgb,SAAS0B,cAAgB,SAAUtZ,EAAOoa,GAI3CzgB,EAAO0gB,SAAW1gB,EAAO0gB,QAAQC,MAAQta,GAASma,EAAY9S,KAAMrH,EAAMf,OAC9EtF,EAAO0gB,QAAQC,KAAM,8BAAgCta,EAAMua,QAASva,EAAMoa,MAAOA,IAOnFxd,EAAO4d,eAAiB,SAAUxa,GACjCrG,EAAO+f,WAAY,WAClB,MAAM1Z,KAQR,IAAIya,EAAY7d,EAAOgb,WAkDvB,SAAS8C,IACRlhB,EAASmhB,oBAAqB,mBAAoBD,GAClD/gB,EAAOghB,oBAAqB,OAAQD,GACpC9d,EAAO4X,QAnDR5X,EAAOG,GAAGyX,MAAQ,SAAUzX,GAY3B,OAVA0d,EACE/D,KAAM3Z,GAKNmb,SAAO,SAAUlY,GACjBpD,EAAO4d,eAAgBxa,KAGlBpG,MAGRgD,EAAOmC,OAAQ,CAGdgB,SAAS,EAIT6a,UAAW,EAGXpG,MAAO,SAAUqG,KAGF,IAATA,IAAkBje,EAAOge,UAAYhe,EAAOmD,WAKjDnD,EAAOmD,SAAU,KAGZ8a,GAAsC,IAAnBje,EAAOge,WAK/BH,EAAUrB,YAAa5f,EAAU,CAAEoD,OAIrCA,EAAO4X,MAAMkC,KAAO+D,EAAU/D,KAaD,aAAxBld,EAASshB,YACa,YAAxBthB,EAASshB,aAA6BthB,EAAS+P,gBAAgBwR,SAGjEphB,EAAO+f,WAAY9c,EAAO4X,QAK1Bhb,EAASoQ,iBAAkB,mBAAoB8Q,GAG/C/gB,EAAOiQ,iBAAkB,OAAQ8Q,IAQlC,IAAIM,EAAS,SAAUtd,EAAOX,EAAIgL,EAAKhH,EAAOka,EAAWC,EAAUC,GAClE,IAAIpf,EAAI,EACP2C,EAAMhB,EAAMR,OACZke,EAAc,MAAPrT,EAGR,GAAuB,WAAlBrL,EAAQqL,GAEZ,IAAMhM,KADNkf,GAAY,EACDlT,EACViT,EAAQtd,EAAOX,EAAIhB,EAAGgM,EAAKhM,IAAK,EAAMmf,EAAUC,QAI3C,QAAezb,IAAVqB,IACXka,GAAY,EAENhgB,EAAY8F,KACjBoa,GAAM,GAGFC,IAGCD,GACJpe,EAAG1C,KAAMqD,EAAOqD,GAChBhE,EAAK,OAILqe,EAAOre,EACPA,EAAK,SAAUkB,EAAMod,EAAMta,GAC1B,OAAOqa,EAAK/gB,KAAMuC,EAAQqB,GAAQ8C,MAKhChE,GACJ,KAAQhB,EAAI2C,EAAK3C,IAChBgB,EACCW,EAAO3B,GAAKgM,EAAKoT,EAChBpa,EACAA,EAAM1G,KAAMqD,EAAO3B,GAAKA,EAAGgB,EAAIW,EAAO3B,GAAKgM,KAMhD,OAAKkT,EACGvd,EAIH0d,EACGre,EAAG1C,KAAMqD,GAGVgB,EAAM3B,EAAIW,EAAO,GAAKqK,GAAQmT,GAKlCI,EAAY,QACfC,EAAa,YAGd,SAASC,EAAYC,EAAMC,GAC1B,OAAOA,EAAOC,cAMf,SAASC,EAAWC,GACnB,OAAOA,EAAO/b,QAASwb,EAAW,OAAQxb,QAASyb,EAAYC,GAEhE,IAAIM,EAAa,SAAUC,GAQ1B,OAA0B,IAAnBA,EAAM5gB,UAAqC,IAAnB4gB,EAAM5gB,YAAsB4gB,EAAM5gB,UAMlE,SAAS6gB,IACRpiB,KAAK+F,QAAU/C,EAAO+C,QAAUqc,EAAKC,MAGtCD,EAAKC,IAAM,EAEXD,EAAK7e,UAAY,CAEhB2K,MAAO,SAAUiU,GAGhB,IAAIhb,EAAQgb,EAAOniB,KAAK+F,SA4BxB,OAzBMoB,IACLA,EAAQ,GAKH+a,EAAYC,KAIXA,EAAM5gB,SACV4gB,EAAOniB,KAAK+F,SAAYoB,EAMxB/G,OAAOkiB,eAAgBH,EAAOniB,KAAK+F,QAAS,CAC3CoB,MAAOA,EACPob,cAAc,MAMXpb,GAERqb,IAAK,SAAUL,EAAOM,EAAMtb,GAC3B,IAAIub,EACHxU,EAAQlO,KAAKkO,MAAOiU,GAIrB,GAAqB,iBAATM,EACXvU,EAAO8T,EAAWS,IAAWtb,OAM7B,IAAMub,KAAQD,EACbvU,EAAO8T,EAAWU,IAAWD,EAAMC,GAGrC,OAAOxU,GAERvK,IAAK,SAAUwe,EAAOhU,GACrB,YAAerI,IAARqI,EACNnO,KAAKkO,MAAOiU,GAGZA,EAAOniB,KAAK+F,UAAaoc,EAAOniB,KAAK+F,SAAWic,EAAW7T,KAE7DiT,OAAQ,SAAUe,EAAOhU,EAAKhH,GAa7B,YAAarB,IAARqI,GACCA,GAAsB,iBAARA,QAAgCrI,IAAVqB,EAElCnH,KAAK2D,IAAKwe,EAAOhU,IASzBnO,KAAKwiB,IAAKL,EAAOhU,EAAKhH,QAILrB,IAAVqB,EAAsBA,EAAQgH,IAEtCyP,OAAQ,SAAUuE,EAAOhU,GACxB,IAAIhM,EACH+L,EAAQiU,EAAOniB,KAAK+F,SAErB,QAAeD,IAAVoI,EAAL,CAIA,QAAapI,IAARqI,EAAoB,CAkBxBhM,GAXCgM,EAJIvI,MAAMC,QAASsI,GAIbA,EAAI/J,IAAK4d,IAEf7T,EAAM6T,EAAW7T,MAIJD,EACZ,CAAEC,GACAA,EAAIrB,MAAOoP,IAAmB,IAG1B5Y,OAER,MAAQnB,WACA+L,EAAOC,EAAKhM,UAKR2D,IAARqI,GAAqBnL,EAAOyD,cAAeyH,MAM1CiU,EAAM5gB,SACV4gB,EAAOniB,KAAK+F,cAAYD,SAEjBqc,EAAOniB,KAAK+F,YAItB4c,QAAS,SAAUR,GAClB,IAAIjU,EAAQiU,EAAOniB,KAAK+F,SACxB,YAAiBD,IAAVoI,IAAwBlL,EAAOyD,cAAeyH,KAGvD,IAAI0U,EAAW,IAAIR,EAEfS,EAAW,IAAIT,EAcfU,EAAS,gCACZC,EAAa,SA2Bd,SAASC,EAAU3e,EAAM8J,EAAKsU,GAC7B,IAAIpd,EA1Baod,EA8BjB,QAAc3c,IAAT2c,GAAwC,IAAlBpe,EAAK9C,SAI/B,GAHA8D,EAAO,QAAU8I,EAAIjI,QAAS6c,EAAY,OAAQtb,cAG7B,iBAFrBgb,EAAOpe,EAAK7B,aAAc6C,IAEM,CAC/B,IACCod,EAnCW,UADGA,EAoCEA,IA/BL,UAATA,IAIS,SAATA,EACG,KAIHA,KAAUA,EAAO,IACbA,EAGJK,EAAOrV,KAAMgV,GACVQ,KAAKC,MAAOT,GAGbA,GAeH,MAAQhW,IAGVoW,EAASL,IAAKne,EAAM8J,EAAKsU,QAEzBA,OAAO3c,EAGT,OAAO2c,EAGRzf,EAAOmC,OAAQ,CACdwd,QAAS,SAAUte,GAClB,OAAOwe,EAASF,QAASte,IAAUue,EAASD,QAASte,IAGtDoe,KAAM,SAAUpe,EAAMgB,EAAMod,GAC3B,OAAOI,EAASzB,OAAQ/c,EAAMgB,EAAMod,IAGrCU,WAAY,SAAU9e,EAAMgB,GAC3Bwd,EAASjF,OAAQvZ,EAAMgB,IAKxB+d,MAAO,SAAU/e,EAAMgB,EAAMod,GAC5B,OAAOG,EAASxB,OAAQ/c,EAAMgB,EAAMod,IAGrCY,YAAa,SAAUhf,EAAMgB,GAC5Bud,EAAShF,OAAQvZ,EAAMgB,MAIzBrC,EAAOG,GAAGgC,OAAQ,CACjBsd,KAAM,SAAUtU,EAAKhH,GACpB,IAAIhF,EAAGkD,EAAMod,EACZpe,EAAOrE,KAAM,GACb0O,EAAQrK,GAAQA,EAAKuF,WAGtB,QAAa9D,IAARqI,EAAoB,CACxB,GAAKnO,KAAKsD,SACTmf,EAAOI,EAASlf,IAAKU,GAEE,IAAlBA,EAAK9C,WAAmBqhB,EAASjf,IAAKU,EAAM,iBAAmB,CACnElC,EAAIuM,EAAMpL,OACV,MAAQnB,IAIFuM,EAAOvM,IAEsB,KADjCkD,EAAOqJ,EAAOvM,GAAIkD,MACRxE,QAAS,WAClBwE,EAAO2c,EAAW3c,EAAK/E,MAAO,IAC9B0iB,EAAU3e,EAAMgB,EAAMod,EAAMpd,KAI/Bud,EAASJ,IAAKne,EAAM,gBAAgB,GAItC,OAAOoe,EAIR,MAAoB,iBAARtU,EACJnO,KAAKkE,KAAM,WACjB2e,EAASL,IAAKxiB,KAAMmO,KAIfiT,EAAQphB,KAAM,SAAUmH,GAC9B,IAAIsb,EAOJ,GAAKpe,QAAkByB,IAAVqB,EAKZ,YAAcrB,KADd2c,EAAOI,EAASlf,IAAKU,EAAM8J,IAEnBsU,OAMM3c,KADd2c,EAAOO,EAAU3e,EAAM8J,IAEfsU,OAIR,EAIDziB,KAAKkE,KAAM,WAGV2e,EAASL,IAAKxiB,KAAMmO,EAAKhH,MAExB,KAAMA,EAA0B,EAAnB7C,UAAUhB,OAAY,MAAM,IAG7C6f,WAAY,SAAUhV,GACrB,OAAOnO,KAAKkE,KAAM,WACjB2e,EAASjF,OAAQ5d,KAAMmO,QAM1BnL,EAAOmC,OAAQ,CACdoY,MAAO,SAAUlZ,EAAM1C,EAAM8gB,GAC5B,IAAIlF,EAEJ,GAAKlZ,EAYJ,OAXA1C,GAASA,GAAQ,MAAS,QAC1B4b,EAAQqF,EAASjf,IAAKU,EAAM1C,GAGvB8gB,KACElF,GAAS3X,MAAMC,QAAS4c,GAC7BlF,EAAQqF,EAASxB,OAAQ/c,EAAM1C,EAAMqB,EAAO2D,UAAW8b,IAEvDlF,EAAM3c,KAAM6hB,IAGPlF,GAAS,IAIlB+F,QAAS,SAAUjf,EAAM1C,GACxBA,EAAOA,GAAQ,KAEf,IAAI4b,EAAQva,EAAOua,MAAOlZ,EAAM1C,GAC/B4hB,EAAchG,EAAMja,OACpBH,EAAKoa,EAAMlP,QACXmV,EAAQxgB,EAAOygB,YAAapf,EAAM1C,GAMvB,eAAPwB,IACJA,EAAKoa,EAAMlP,QACXkV,KAGIpgB,IAIU,OAATxB,GACJ4b,EAAM3L,QAAS,qBAIT4R,EAAME,KACbvgB,EAAG1C,KAAM4D,EApBF,WACNrB,EAAOsgB,QAASjf,EAAM1C,IAmBF6hB,KAGhBD,GAAeC,GACpBA,EAAM1N,MAAM2H,QAKdgG,YAAa,SAAUpf,EAAM1C,GAC5B,IAAIwM,EAAMxM,EAAO,aACjB,OAAOihB,EAASjf,IAAKU,EAAM8J,IAASyU,EAASxB,OAAQ/c,EAAM8J,EAAK,CAC/D2H,MAAO9S,EAAO+Z,UAAW,eAAgBvB,IAAK,WAC7CoH,EAAShF,OAAQvZ,EAAM,CAAE1C,EAAO,QAASwM,WAM7CnL,EAAOG,GAAGgC,OAAQ,CACjBoY,MAAO,SAAU5b,EAAM8gB,GACtB,IAAIkB,EAAS,EAQb,MANqB,iBAAThiB,IACX8gB,EAAO9gB,EACPA,EAAO,KACPgiB,KAGIrf,UAAUhB,OAASqgB,EAChB3gB,EAAOua,MAAOvd,KAAM,GAAK2B,QAGjBmE,IAAT2c,EACNziB,KACAA,KAAKkE,KAAM,WACV,IAAIqZ,EAAQva,EAAOua,MAAOvd,KAAM2B,EAAM8gB,GAGtCzf,EAAOygB,YAAazjB,KAAM2B,GAEZ,OAATA,GAAgC,eAAf4b,EAAO,IAC5Bva,EAAOsgB,QAAStjB,KAAM2B,MAI1B2hB,QAAS,SAAU3hB,GAClB,OAAO3B,KAAKkE,KAAM,WACjBlB,EAAOsgB,QAAStjB,KAAM2B,MAGxBiiB,WAAY,SAAUjiB,GACrB,OAAO3B,KAAKud,MAAO5b,GAAQ,KAAM,KAKlCib,QAAS,SAAUjb,EAAML,GACxB,IAAIqP,EACHkT,EAAQ,EACRC,EAAQ9gB,EAAOgb,WACflM,EAAW9R,KACXmC,EAAInC,KAAKsD,OACTkZ,EAAU,aACCqH,GACTC,EAAMtE,YAAa1N,EAAU,CAAEA,KAIb,iBAATnQ,IACXL,EAAMK,EACNA,OAAOmE,GAERnE,EAAOA,GAAQ,KAEf,MAAQQ,KACPwO,EAAMiS,EAASjf,IAAKmO,EAAU3P,GAAKR,EAAO,gBAC9BgP,EAAImF,QACf+N,IACAlT,EAAImF,MAAM0F,IAAKgB,IAIjB,OADAA,IACOsH,EAAMlH,QAAStb,MAGxB,IAAIyiB,GAAO,sCAA0CC,OAEjDC,GAAU,IAAIla,OAAQ,iBAAmBga,GAAO,cAAe,KAG/DG,GAAY,CAAE,MAAO,QAAS,SAAU,QAExCvU,GAAkB/P,EAAS+P,gBAI1BwU,GAAa,SAAU9f,GACzB,OAAOrB,EAAOyF,SAAUpE,EAAK6I,cAAe7I,IAE7C+f,GAAW,CAAEA,UAAU,GAOnBzU,GAAgB0U,cACpBF,GAAa,SAAU9f,GACtB,OAAOrB,EAAOyF,SAAUpE,EAAK6I,cAAe7I,IAC3CA,EAAKggB,YAAaD,MAAe/f,EAAK6I,gBAG1C,IAAIoX,GAAqB,SAAUjgB,EAAMmK,GAOvC,MAA8B,UAH9BnK,EAAOmK,GAAMnK,GAGDkgB,MAAMC,SACM,KAAvBngB,EAAKkgB,MAAMC,SAMXL,GAAY9f,IAEsB,SAAlCrB,EAAOyhB,IAAKpgB,EAAM,YAKrB,SAASqgB,GAAWrgB,EAAMqe,EAAMiC,EAAYC,GAC3C,IAAIC,EAAUC,EACbC,EAAgB,GAChBC,EAAeJ,EACd,WACC,OAAOA,EAAM9V,OAEd,WACC,OAAO9L,EAAOyhB,IAAKpgB,EAAMqe,EAAM,KAEjCuC,EAAUD,IACVE,EAAOP,GAAcA,EAAY,KAAS3hB,EAAOmiB,UAAWzC,GAAS,GAAK,MAG1E0C,EAAgB/gB,EAAK9C,WAClByB,EAAOmiB,UAAWzC,IAAmB,OAATwC,IAAkBD,IAChDhB,GAAQ9W,KAAMnK,EAAOyhB,IAAKpgB,EAAMqe,IAElC,GAAK0C,GAAiBA,EAAe,KAAQF,EAAO,CAInDD,GAAoB,EAGpBC,EAAOA,GAAQE,EAAe,GAG9BA,GAAiBH,GAAW,EAE5B,MAAQF,IAIP/hB,EAAOuhB,MAAOlgB,EAAMqe,EAAM0C,EAAgBF,IACnC,EAAIJ,IAAY,GAAMA,EAAQE,IAAiBC,GAAW,MAAW,IAC3EF,EAAgB,GAEjBK,GAAgCN,EAIjCM,GAAgC,EAChCpiB,EAAOuhB,MAAOlgB,EAAMqe,EAAM0C,EAAgBF,GAG1CP,EAAaA,GAAc,GAgB5B,OAbKA,IACJS,GAAiBA,IAAkBH,GAAW,EAG9CJ,EAAWF,EAAY,GACtBS,GAAkBT,EAAY,GAAM,GAAMA,EAAY,IACrDA,EAAY,GACTC,IACJA,EAAMM,KAAOA,EACbN,EAAM1Q,MAAQkR,EACdR,EAAM5f,IAAM6f,IAGPA,EAIR,IAAIQ,GAAoB,GAyBxB,SAASC,GAAUxT,EAAUyT,GAO5B,IANA,IAAIf,EAASngB,EAxBcA,EACvBuT,EACH1V,EACAmK,EACAmY,EAqBAgB,EAAS,GACTlK,EAAQ,EACRhY,EAASwO,EAASxO,OAGXgY,EAAQhY,EAAQgY,KACvBjX,EAAOyN,EAAUwJ,IACNiJ,QAIXC,EAAUngB,EAAKkgB,MAAMC,QAChBe,GAKa,SAAZf,IACJgB,EAAQlK,GAAUsH,EAASjf,IAAKU,EAAM,YAAe,KAC/CmhB,EAAQlK,KACbjX,EAAKkgB,MAAMC,QAAU,KAGK,KAAvBngB,EAAKkgB,MAAMC,SAAkBF,GAAoBjgB,KACrDmhB,EAAQlK,IA7CVkJ,EAFAtiB,EADG0V,OAAAA,EACH1V,GAF0BmC,EAiDaA,GA/C5B6I,cACXb,EAAWhI,EAAKgI,UAChBmY,EAAUa,GAAmBhZ,MAM9BuL,EAAO1V,EAAIujB,KAAK9iB,YAAaT,EAAII,cAAe+J,IAChDmY,EAAUxhB,EAAOyhB,IAAK7M,EAAM,WAE5BA,EAAKhV,WAAWC,YAAa+U,GAEZ,SAAZ4M,IACJA,EAAU,SAEXa,GAAmBhZ,GAAamY,MAkCb,SAAZA,IACJgB,EAAQlK,GAAU,OAGlBsH,EAASJ,IAAKne,EAAM,UAAWmgB,KAMlC,IAAMlJ,EAAQ,EAAGA,EAAQhY,EAAQgY,IACR,MAAnBkK,EAAQlK,KACZxJ,EAAUwJ,GAAQiJ,MAAMC,QAAUgB,EAAQlK,IAI5C,OAAOxJ,EAGR9O,EAAOG,GAAGgC,OAAQ,CACjBogB,KAAM,WACL,OAAOD,GAAUtlB,MAAM,IAExB0lB,KAAM,WACL,OAAOJ,GAAUtlB,OAElB2lB,OAAQ,SAAUxH,GACjB,MAAsB,kBAAVA,EACJA,EAAQne,KAAKulB,OAASvlB,KAAK0lB,OAG5B1lB,KAAKkE,KAAM,WACZogB,GAAoBtkB,MACxBgD,EAAQhD,MAAOulB,OAEfviB,EAAQhD,MAAO0lB,YAKnB,IAUEE,GACAhV,GAXEiV,GAAiB,wBAEjBC,GAAW,iCAEXC,GAAc,qCAMhBH,GADchmB,EAASomB,yBACRrjB,YAAa/C,EAAS0C,cAAe,SACpDsO,GAAQhR,EAAS0C,cAAe,UAM3BG,aAAc,OAAQ,SAC5BmO,GAAMnO,aAAc,UAAW,WAC/BmO,GAAMnO,aAAc,OAAQ,KAE5BmjB,GAAIjjB,YAAaiO,IAIjBxP,EAAQ6kB,WAAaL,GAAIM,WAAW,GAAOA,WAAW,GAAO7R,UAAUsB,QAIvEiQ,GAAI/U,UAAY,yBAChBzP,EAAQ+kB,iBAAmBP,GAAIM,WAAW,GAAO7R,UAAUuF,aAK3DgM,GAAI/U,UAAY,oBAChBzP,EAAQglB,SAAWR,GAAIvR,UAKxB,IAAIgS,GAAU,CAKbC,MAAO,CAAE,EAAG,UAAW,YACvBC,IAAK,CAAE,EAAG,oBAAqB,uBAC/BC,GAAI,CAAE,EAAG,iBAAkB,oBAC3BC,GAAI,CAAE,EAAG,qBAAsB,yBAE/BC,SAAU,CAAE,EAAG,GAAI,KAYpB,SAASC,GAAQzjB,EAASwN,GAIzB,IAAI3M,EAYJ,OATCA,EAD4C,oBAAjCb,EAAQoK,qBACbpK,EAAQoK,qBAAsBoD,GAAO,KAEI,oBAA7BxN,EAAQ4K,iBACpB5K,EAAQ4K,iBAAkB4C,GAAO,KAGjC,QAGM5K,IAAR4K,GAAqBA,GAAOrE,EAAUnJ,EAASwN,GAC5C1N,EAAOgB,MAAO,CAAEd,GAAWa,GAG5BA,EAKR,SAAS6iB,GAAe9iB,EAAO+iB,GAI9B,IAHA,IAAI1kB,EAAI,EACPiZ,EAAItX,EAAMR,OAEHnB,EAAIiZ,EAAGjZ,IACdygB,EAASJ,IACR1e,EAAO3B,GACP,cACC0kB,GAAejE,EAASjf,IAAKkjB,EAAa1kB,GAAK,eA1CnDkkB,GAAQS,MAAQT,GAAQU,MAAQV,GAAQW,SAAWX,GAAQY,QAAUZ,GAAQC,MAC7ED,GAAQa,GAAKb,GAAQI,GAGfrlB,EAAQglB,SACbC,GAAQc,SAAWd,GAAQD,OAAS,CAAE,EAAG,+BAAgC,cA2C1E,IAAIrb,GAAQ,YAEZ,SAASqc,GAAetjB,EAAOZ,EAASmkB,EAASC,EAAWC,GAO3D,IANA,IAAIljB,EAAMsM,EAAKD,EAAK8W,EAAMC,EAAU1iB,EACnC2iB,EAAWxkB,EAAQ8iB,yBACnB2B,EAAQ,GACRxlB,EAAI,EACJiZ,EAAItX,EAAMR,OAEHnB,EAAIiZ,EAAGjZ,IAGd,IAFAkC,EAAOP,EAAO3B,KAEQ,IAATkC,EAGZ,GAAwB,WAAnBvB,EAAQuB,GAIZrB,EAAOgB,MAAO2jB,EAAOtjB,EAAK9C,SAAW,CAAE8C,GAASA,QAG1C,GAAM0G,GAAM0C,KAAMpJ,GAIlB,CACNsM,EAAMA,GAAO+W,EAAS/kB,YAAaO,EAAQZ,cAAe,QAG1DoO,GAAQoV,GAAS3Y,KAAM9I,IAAU,CAAE,GAAI,KAAQ,GAAIoD,cACnD+f,EAAOnB,GAAS3V,IAAS2V,GAAQK,SACjC/V,EAAIE,UAAY2W,EAAM,GAAMxkB,EAAO4kB,cAAevjB,GAASmjB,EAAM,GAGjEziB,EAAIyiB,EAAM,GACV,MAAQziB,IACP4L,EAAMA,EAAI0D,UAKXrR,EAAOgB,MAAO2jB,EAAOhX,EAAInE,aAGzBmE,EAAM+W,EAASnV,YAGXD,YAAc,QAzBlBqV,EAAM/mB,KAAMsC,EAAQ2kB,eAAgBxjB,IA+BvCqjB,EAASpV,YAAc,GAEvBnQ,EAAI,EACJ,MAAUkC,EAAOsjB,EAAOxlB,KAGvB,GAAKmlB,IAAkD,EAArCtkB,EAAO6D,QAASxC,EAAMijB,GAClCC,GACJA,EAAQ3mB,KAAMyD,QAgBhB,GAXAojB,EAAWtD,GAAY9f,GAGvBsM,EAAMgW,GAAQe,EAAS/kB,YAAa0B,GAAQ,UAGvCojB,GACJb,GAAejW,GAIX0W,EAAU,CACdtiB,EAAI,EACJ,MAAUV,EAAOsM,EAAK5L,KAChBghB,GAAYtY,KAAMpJ,EAAK1C,MAAQ,KACnC0lB,EAAQzmB,KAAMyD,GAMlB,OAAOqjB,EAIR,IAAII,GAAiB,sBAErB,SAASC,KACR,OAAO,EAGR,SAASC,KACR,OAAO,EASR,SAASC,GAAY5jB,EAAM1C,GAC1B,OAAS0C,IAMV,WACC,IACC,OAAOzE,EAAS0V,cACf,MAAQ4S,KATQC,KAAqC,UAATxmB,GAY/C,SAASymB,GAAI/jB,EAAMgkB,EAAOplB,EAAUwf,EAAMtf,EAAImlB,GAC7C,IAAIC,EAAQ5mB,EAGZ,GAAsB,iBAAV0mB,EAAqB,CAShC,IAAM1mB,IANmB,iBAAbsB,IAGXwf,EAAOA,GAAQxf,EACfA,OAAW6C,GAEEuiB,EACbD,GAAI/jB,EAAM1C,EAAMsB,EAAUwf,EAAM4F,EAAO1mB,GAAQ2mB,GAEhD,OAAOjkB,EAsBR,GAnBa,MAARoe,GAAsB,MAANtf,GAGpBA,EAAKF,EACLwf,EAAOxf,OAAW6C,GACD,MAAN3C,IACc,iBAAbF,GAGXE,EAAKsf,EACLA,OAAO3c,IAIP3C,EAAKsf,EACLA,EAAOxf,EACPA,OAAW6C,KAGD,IAAP3C,EACJA,EAAK6kB,QACC,IAAM7kB,EACZ,OAAOkB,EAeR,OAZa,IAARikB,IACJC,EAASplB,GACTA,EAAK,SAAUqlB,GAId,OADAxlB,IAASylB,IAAKD,GACPD,EAAO5nB,MAAOX,KAAMsE,aAIzB8C,KAAOmhB,EAAOnhB,OAAUmhB,EAAOnhB,KAAOpE,EAAOoE,SAE1C/C,EAAKH,KAAM,WACjBlB,EAAOwlB,MAAMhN,IAAKxb,KAAMqoB,EAAOllB,EAAIsf,EAAMxf,KA+a3C,SAASylB,GAAgBla,EAAI7M,EAAMsmB,GAG5BA,GAQNrF,EAASJ,IAAKhU,EAAI7M,GAAM,GACxBqB,EAAOwlB,MAAMhN,IAAKhN,EAAI7M,EAAM,CAC3B8N,WAAW,EACXd,QAAS,SAAU6Z,GAClB,IAAIG,EAAUpV,EACbqV,EAAQhG,EAASjf,IAAK3D,KAAM2B,GAE7B,GAAyB,EAAlB6mB,EAAMK,WAAmB7oB,KAAM2B,IAKrC,GAAMinB,EAAMtlB,QAuCEN,EAAOwlB,MAAMrJ,QAASxd,IAAU,IAAKmnB,cAClDN,EAAMO,uBArBN,GAdAH,EAAQtoB,EAAMG,KAAM6D,WACpBse,EAASJ,IAAKxiB,KAAM2B,EAAMinB,GAK1BD,EAAWV,EAAYjoB,KAAM2B,GAC7B3B,KAAM2B,KAEDinB,KADLrV,EAASqP,EAASjf,IAAK3D,KAAM2B,KACJgnB,EACxB/F,EAASJ,IAAKxiB,KAAM2B,GAAM,GAE1B4R,EAAS,GAELqV,IAAUrV,EAWd,OARAiV,EAAMQ,2BACNR,EAAMS,iBAOC1V,GAAUA,EAAOpM,WAefyhB,EAAMtlB,SAGjBsf,EAASJ,IAAKxiB,KAAM2B,EAAM,CACzBwF,MAAOnE,EAAOwlB,MAAMU,QAInBlmB,EAAOmC,OAAQyjB,EAAO,GAAK5lB,EAAOmmB,MAAM5lB,WACxCqlB,EAAMtoB,MAAO,GACbN,QAKFwoB,EAAMQ,qCA/E0BljB,IAA7B8c,EAASjf,IAAK6K,EAAI7M,IACtBqB,EAAOwlB,MAAMhN,IAAKhN,EAAI7M,EAAMomB,IA5a/B/kB,EAAOwlB,MAAQ,CAEdhpB,OAAQ,GAERgc,IAAK,SAAUnX,EAAMgkB,EAAO1Z,EAAS8T,EAAMxf,GAE1C,IAAImmB,EAAaC,EAAa1Y,EAC7B2Y,EAAQC,EAAGC,EACXrK,EAASsK,EAAU9nB,EAAM+nB,EAAYC,EACrCC,EAAWhH,EAASjf,IAAKU,GAG1B,GAAM6d,EAAY7d,GAAlB,CAKKsK,EAAQA,UAEZA,GADAya,EAAcza,GACQA,QACtB1L,EAAWmmB,EAAYnmB,UAKnBA,GACJD,EAAOwN,KAAKM,gBAAiBnB,GAAiB1M,GAIzC0L,EAAQvH,OACbuH,EAAQvH,KAAOpE,EAAOoE,SAIfkiB,EAASM,EAASN,UACzBA,EAASM,EAASN,OAASlpB,OAAOypB,OAAQ,QAEnCR,EAAcO,EAASE,UAC9BT,EAAcO,EAASE,OAAS,SAAUrd,GAIzC,MAAyB,oBAAXzJ,GAA0BA,EAAOwlB,MAAMuB,YAActd,EAAE9K,KACpEqB,EAAOwlB,MAAMwB,SAASrpB,MAAO0D,EAAMC,gBAAcwB,IAMpDyjB,GADAlB,GAAUA,GAAS,IAAKvb,MAAOoP,IAAmB,CAAE,KAC1C5Y,OACV,MAAQimB,IAEP5nB,EAAOgoB,GADPhZ,EAAMmX,GAAe3a,KAAMkb,EAAOkB,KAAS,IACpB,GACvBG,GAAe/Y,EAAK,IAAO,IAAKpJ,MAAO,KAAMtC,OAGvCtD,IAKNwd,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GAG1CA,GAASsB,EAAWkc,EAAQ2J,aAAe3J,EAAQ8K,WAActoB,EAGjEwd,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GAG1C6nB,EAAYxmB,EAAOmC,OAAQ,CAC1BxD,KAAMA,EACNgoB,SAAUA,EACVlH,KAAMA,EACN9T,QAASA,EACTvH,KAAMuH,EAAQvH,KACdnE,SAAUA,EACV6H,aAAc7H,GAAYD,EAAO6O,KAAK/E,MAAMhC,aAAa2C,KAAMxK,GAC/DwM,UAAWia,EAAW7b,KAAM,MAC1Bub,IAGKK,EAAWH,EAAQ3nB,OAC1B8nB,EAAWH,EAAQ3nB,GAAS,IACnBuoB,cAAgB,EAGnB/K,EAAQgL,QACiD,IAA9DhL,EAAQgL,MAAM1pB,KAAM4D,EAAMoe,EAAMiH,EAAYL,IAEvChlB,EAAK2L,kBACT3L,EAAK2L,iBAAkBrO,EAAM0nB,IAK3BlK,EAAQ3D,MACZ2D,EAAQ3D,IAAI/a,KAAM4D,EAAMmlB,GAElBA,EAAU7a,QAAQvH,OACvBoiB,EAAU7a,QAAQvH,KAAOuH,EAAQvH,OAK9BnE,EACJwmB,EAASvkB,OAAQukB,EAASS,gBAAiB,EAAGV,GAE9CC,EAAS7oB,KAAM4oB,GAIhBxmB,EAAOwlB,MAAMhpB,OAAQmC,IAAS,KAMhCic,OAAQ,SAAUvZ,EAAMgkB,EAAO1Z,EAAS1L,EAAUmnB,GAEjD,IAAIrlB,EAAGslB,EAAW1Z,EACjB2Y,EAAQC,EAAGC,EACXrK,EAASsK,EAAU9nB,EAAM+nB,EAAYC,EACrCC,EAAWhH,EAASD,QAASte,IAAUue,EAASjf,IAAKU,GAEtD,GAAMulB,IAAeN,EAASM,EAASN,QAAvC,CAMAC,GADAlB,GAAUA,GAAS,IAAKvb,MAAOoP,IAAmB,CAAE,KAC1C5Y,OACV,MAAQimB,IAMP,GAJA5nB,EAAOgoB,GADPhZ,EAAMmX,GAAe3a,KAAMkb,EAAOkB,KAAS,IACpB,GACvBG,GAAe/Y,EAAK,IAAO,IAAKpJ,MAAO,KAAMtC,OAGvCtD,EAAN,CAOAwd,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GAE1C8nB,EAAWH,EADX3nB,GAASsB,EAAWkc,EAAQ2J,aAAe3J,EAAQ8K,WAActoB,IACpC,GAC7BgP,EAAMA,EAAK,IACV,IAAI5G,OAAQ,UAAY2f,EAAW7b,KAAM,iBAAoB,WAG9Dwc,EAAYtlB,EAAI0kB,EAASnmB,OACzB,MAAQyB,IACPykB,EAAYC,EAAU1kB,IAEfqlB,GAAeT,IAAaH,EAAUG,UACzChb,GAAWA,EAAQvH,OAASoiB,EAAUpiB,MACtCuJ,IAAOA,EAAIlD,KAAM+b,EAAU/Z,YAC3BxM,GAAYA,IAAaumB,EAAUvmB,WACxB,OAAbA,IAAqBumB,EAAUvmB,YAChCwmB,EAASvkB,OAAQH,EAAG,GAEfykB,EAAUvmB,UACdwmB,EAASS,gBAEL/K,EAAQvB,QACZuB,EAAQvB,OAAOnd,KAAM4D,EAAMmlB,IAOzBa,IAAcZ,EAASnmB,SACrB6b,EAAQmL,WACkD,IAA/DnL,EAAQmL,SAAS7pB,KAAM4D,EAAMqlB,EAAYE,EAASE,SAElD9mB,EAAOunB,YAAalmB,EAAM1C,EAAMioB,EAASE,eAGnCR,EAAQ3nB,SA1Cf,IAAMA,KAAQ2nB,EACbtmB,EAAOwlB,MAAM5K,OAAQvZ,EAAM1C,EAAO0mB,EAAOkB,GAAK5a,EAAS1L,GAAU,GA8C/DD,EAAOyD,cAAe6iB,IAC1B1G,EAAShF,OAAQvZ,EAAM,mBAIzB2lB,SAAU,SAAUQ,GAEnB,IAAIroB,EAAG4C,EAAGhB,EAAK4Q,EAAS6U,EAAWiB,EAClCjW,EAAO,IAAI5O,MAAOtB,UAAUhB,QAG5BklB,EAAQxlB,EAAOwlB,MAAMkC,IAAKF,GAE1Bf,GACC7G,EAASjf,IAAK3D,KAAM,WAAcI,OAAOypB,OAAQ,OAC/CrB,EAAM7mB,OAAU,GACnBwd,EAAUnc,EAAOwlB,MAAMrJ,QAASqJ,EAAM7mB,OAAU,GAKjD,IAFA6S,EAAM,GAAMgU,EAENrmB,EAAI,EAAGA,EAAImC,UAAUhB,OAAQnB,IAClCqS,EAAMrS,GAAMmC,UAAWnC,GAMxB,GAHAqmB,EAAMmC,eAAiB3qB,MAGlBmf,EAAQyL,cAA2D,IAA5CzL,EAAQyL,YAAYnqB,KAAMT,KAAMwoB,GAA5D,CAKAiC,EAAeznB,EAAOwlB,MAAMiB,SAAShpB,KAAMT,KAAMwoB,EAAOiB,GAGxDtnB,EAAI,EACJ,OAAUwS,EAAU8V,EAActoB,QAAYqmB,EAAMqC,uBAAyB,CAC5ErC,EAAMsC,cAAgBnW,EAAQtQ,KAE9BU,EAAI,EACJ,OAAUykB,EAAY7U,EAAQ8U,SAAU1kB,QACtCyjB,EAAMuC,gCAIDvC,EAAMwC,aAAsC,IAAxBxB,EAAU/Z,YACnC+Y,EAAMwC,WAAWvd,KAAM+b,EAAU/Z,aAEjC+Y,EAAMgB,UAAYA,EAClBhB,EAAM/F,KAAO+G,EAAU/G,UAKV3c,KAHb/B,IAAUf,EAAOwlB,MAAMrJ,QAASqK,EAAUG,WAAc,IAAKG,QAC5DN,EAAU7a,SAAUhO,MAAOgU,EAAQtQ,KAAMmQ,MAGT,KAAzBgU,EAAMjV,OAASxP,KACrBykB,EAAMS,iBACNT,EAAMO,oBAYX,OAJK5J,EAAQ8L,cACZ9L,EAAQ8L,aAAaxqB,KAAMT,KAAMwoB,GAG3BA,EAAMjV,SAGdkW,SAAU,SAAUjB,EAAOiB,GAC1B,IAAItnB,EAAGqnB,EAAWvX,EAAKiZ,EAAiBC,EACvCV,EAAe,GACfP,EAAgBT,EAASS,cACzBpb,EAAM0Z,EAAM/iB,OAGb,GAAKykB,GAIJpb,EAAIvN,YAOc,UAAfinB,EAAM7mB,MAAoC,GAAhB6mB,EAAMxS,QAEnC,KAAQlH,IAAQ9O,KAAM8O,EAAMA,EAAIlM,YAAc5C,KAI7C,GAAsB,IAAjB8O,EAAIvN,WAAoC,UAAfinB,EAAM7mB,OAAqC,IAAjBmN,EAAI1C,UAAsB,CAGjF,IAFA8e,EAAkB,GAClBC,EAAmB,GACbhpB,EAAI,EAAGA,EAAI+nB,EAAe/nB,SAME2D,IAA5BqlB,EAFLlZ,GAHAuX,EAAYC,EAAUtnB,IAGNc,SAAW,OAG1BkoB,EAAkBlZ,GAAQuX,EAAU1e,cACC,EAApC9H,EAAQiP,EAAKjS,MAAOsb,MAAOxM,GAC3B9L,EAAOwN,KAAMyB,EAAKjS,KAAM,KAAM,CAAE8O,IAAQxL,QAErC6nB,EAAkBlZ,IACtBiZ,EAAgBtqB,KAAM4oB,GAGnB0B,EAAgB5nB,QACpBmnB,EAAa7pB,KAAM,CAAEyD,KAAMyK,EAAK2a,SAAUyB,IAY9C,OALApc,EAAM9O,KACDkqB,EAAgBT,EAASnmB,QAC7BmnB,EAAa7pB,KAAM,CAAEyD,KAAMyK,EAAK2a,SAAUA,EAASnpB,MAAO4pB,KAGpDO,GAGRW,QAAS,SAAU/lB,EAAMgmB,GACxBjrB,OAAOkiB,eAAgBtf,EAAOmmB,MAAM5lB,UAAW8B,EAAM,CACpDimB,YAAY,EACZ/I,cAAc,EAEd5e,IAAKtC,EAAYgqB,GAChB,WACC,GAAKrrB,KAAKurB,cACT,OAAOF,EAAMrrB,KAAKurB,gBAGpB,WACC,GAAKvrB,KAAKurB,cACT,OAAOvrB,KAAKurB,cAAelmB,IAI9Bmd,IAAK,SAAUrb,GACd/G,OAAOkiB,eAAgBtiB,KAAMqF,EAAM,CAClCimB,YAAY,EACZ/I,cAAc,EACdiJ,UAAU,EACVrkB,MAAOA,QAMXujB,IAAK,SAAUa,GACd,OAAOA,EAAevoB,EAAO+C,SAC5BwlB,EACA,IAAIvoB,EAAOmmB,MAAOoC,IAGpBpM,QAAS,CACRsM,KAAM,CAGLC,UAAU,GAEXC,MAAO,CAGNxB,MAAO,SAAU1H,GAIhB,IAAIjU,EAAKxO,MAAQyiB,EAWjB,OARKoD,GAAepY,KAAMe,EAAG7M,OAC5B6M,EAAGmd,OAAStf,EAAUmC,EAAI,UAG1Bka,GAAgBla,EAAI,QAASuZ,KAIvB,GAERmB,QAAS,SAAUzG,GAIlB,IAAIjU,EAAKxO,MAAQyiB,EAUjB,OAPKoD,GAAepY,KAAMe,EAAG7M,OAC5B6M,EAAGmd,OAAStf,EAAUmC,EAAI,UAE1Bka,GAAgBla,EAAI,UAId,GAKRkY,SAAU,SAAU8B,GACnB,IAAI/iB,EAAS+iB,EAAM/iB,OACnB,OAAOogB,GAAepY,KAAMhI,EAAO9D,OAClC8D,EAAOkmB,OAAStf,EAAU5G,EAAQ,UAClCmd,EAASjf,IAAK8B,EAAQ,UACtB4G,EAAU5G,EAAQ,OAIrBmmB,aAAc,CACbX,aAAc,SAAUzC,QAID1iB,IAAjB0iB,EAAMjV,QAAwBiV,EAAM+C,gBACxC/C,EAAM+C,cAAcM,YAAcrD,EAAMjV,YAoG7CvQ,EAAOunB,YAAc,SAAUlmB,EAAM1C,EAAMmoB,GAGrCzlB,EAAK0c,qBACT1c,EAAK0c,oBAAqBpf,EAAMmoB,IAIlC9mB,EAAOmmB,MAAQ,SAAUvnB,EAAKkqB,GAG7B,KAAQ9rB,gBAAgBgD,EAAOmmB,OAC9B,OAAO,IAAInmB,EAAOmmB,MAAOvnB,EAAKkqB,GAI1BlqB,GAAOA,EAAID,MACf3B,KAAKurB,cAAgB3pB,EACrB5B,KAAK2B,KAAOC,EAAID,KAIhB3B,KAAK+rB,mBAAqBnqB,EAAIoqB,uBACHlmB,IAAzBlE,EAAIoqB,mBAGgB,IAApBpqB,EAAIiqB,YACL9D,GACAC,GAKDhoB,KAAKyF,OAAW7D,EAAI6D,QAAkC,IAAxB7D,EAAI6D,OAAOlE,SACxCK,EAAI6D,OAAO7C,WACXhB,EAAI6D,OAELzF,KAAK8qB,cAAgBlpB,EAAIkpB,cACzB9qB,KAAKisB,cAAgBrqB,EAAIqqB,eAIzBjsB,KAAK2B,KAAOC,EAIRkqB,GACJ9oB,EAAOmC,OAAQnF,KAAM8rB,GAItB9rB,KAAKksB,UAAYtqB,GAAOA,EAAIsqB,WAAaxjB,KAAKyjB,MAG9CnsB,KAAMgD,EAAO+C,UAAY,GAK1B/C,EAAOmmB,MAAM5lB,UAAY,CACxBE,YAAaT,EAAOmmB,MACpB4C,mBAAoB/D,GACpB6C,qBAAsB7C,GACtB+C,8BAA+B/C,GAC/BoE,aAAa,EAEbnD,eAAgB,WACf,IAAIxc,EAAIzM,KAAKurB,cAEbvrB,KAAK+rB,mBAAqBhE,GAErBtb,IAAMzM,KAAKosB,aACf3f,EAAEwc,kBAGJF,gBAAiB,WAChB,IAAItc,EAAIzM,KAAKurB,cAEbvrB,KAAK6qB,qBAAuB9C,GAEvBtb,IAAMzM,KAAKosB,aACf3f,EAAEsc,mBAGJC,yBAA0B,WACzB,IAAIvc,EAAIzM,KAAKurB,cAEbvrB,KAAK+qB,8BAAgChD,GAEhCtb,IAAMzM,KAAKosB,aACf3f,EAAEuc,2BAGHhpB,KAAK+oB,oBAKP/lB,EAAOkB,KAAM,CACZmoB,QAAQ,EACRC,SAAS,EACTC,YAAY,EACZC,gBAAgB,EAChBC,SAAS,EACTC,QAAQ,EACRC,YAAY,EACZC,SAAS,EACTC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,MAAM,EACNC,QAAQ,EACRjrB,MAAM,EACNkrB,UAAU,EACV/e,KAAK,EACLgf,SAAS,EACTnX,QAAQ,EACRoX,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,WAAW,EACXC,aAAa,EACbC,SAAS,EACTC,SAAS,EACTC,eAAe,EACfC,WAAW,EACXC,SAAS,EACTC,OAAO,GACLhrB,EAAOwlB,MAAM4C,SAEhBpoB,EAAOkB,KAAM,CAAEmR,MAAO,UAAW4Y,KAAM,YAAc,SAAUtsB,EAAMmnB,GACpE9lB,EAAOwlB,MAAMrJ,QAASxd,GAAS,CAG9BwoB,MAAO,WAQN,OAHAzB,GAAgB1oB,KAAM2B,EAAMsmB,KAGrB,GAERiB,QAAS,WAMR,OAHAR,GAAgB1oB,KAAM2B,IAGf,GAKR+kB,SAAU,WACT,OAAO,GAGRoC,aAAcA,KAYhB9lB,EAAOkB,KAAM,CACZgqB,WAAY,YACZC,WAAY,WACZC,aAAc,cACdC,aAAc,cACZ,SAAUC,EAAM5D,GAClB1nB,EAAOwlB,MAAMrJ,QAASmP,GAAS,CAC9BxF,aAAc4B,EACdT,SAAUS,EAEVZ,OAAQ,SAAUtB,GACjB,IAAIzkB,EAEHwqB,EAAU/F,EAAMyD,cAChBzC,EAAYhB,EAAMgB,UASnB,OALM+E,IAAaA,IANTvuB,MAMgCgD,EAAOyF,SANvCzI,KAMyDuuB,MAClE/F,EAAM7mB,KAAO6nB,EAAUG,SACvB5lB,EAAMylB,EAAU7a,QAAQhO,MAAOX,KAAMsE,WACrCkkB,EAAM7mB,KAAO+oB,GAEP3mB,MAKVf,EAAOG,GAAGgC,OAAQ,CAEjBijB,GAAI,SAAUC,EAAOplB,EAAUwf,EAAMtf,GACpC,OAAOilB,GAAIpoB,KAAMqoB,EAAOplB,EAAUwf,EAAMtf,IAEzCmlB,IAAK,SAAUD,EAAOplB,EAAUwf,EAAMtf,GACrC,OAAOilB,GAAIpoB,KAAMqoB,EAAOplB,EAAUwf,EAAMtf,EAAI,IAE7CslB,IAAK,SAAUJ,EAAOplB,EAAUE,GAC/B,IAAIqmB,EAAW7nB,EACf,GAAK0mB,GAASA,EAAMY,gBAAkBZ,EAAMmB,UAW3C,OARAA,EAAYnB,EAAMmB,UAClBxmB,EAAQqlB,EAAMsC,gBAAiBlC,IAC9Be,EAAU/Z,UACT+Z,EAAUG,SAAW,IAAMH,EAAU/Z,UACrC+Z,EAAUG,SACXH,EAAUvmB,SACVumB,EAAU7a,SAEJ3O,KAER,GAAsB,iBAAVqoB,EAAqB,CAGhC,IAAM1mB,KAAQ0mB,EACbroB,KAAKyoB,IAAK9mB,EAAMsB,EAAUolB,EAAO1mB,IAElC,OAAO3B,KAWR,OATkB,IAAbiD,GAA0C,mBAAbA,IAGjCE,EAAKF,EACLA,OAAW6C,IAEA,IAAP3C,IACJA,EAAK6kB,IAEChoB,KAAKkE,KAAM,WACjBlB,EAAOwlB,MAAM5K,OAAQ5d,KAAMqoB,EAAOllB,EAAIF,QAMzC,IAKCurB,GAAe,wBAGfC,GAAW,oCACXC,GAAe,2CAGhB,SAASC,GAAoBtqB,EAAM2X,GAClC,OAAK3P,EAAUhI,EAAM,UACpBgI,EAA+B,KAArB2P,EAAQza,SAAkBya,EAAUA,EAAQzJ,WAAY,OAE3DvP,EAAQqB,GAAO0W,SAAU,SAAW,IAGrC1W,EAIR,SAASuqB,GAAevqB,GAEvB,OADAA,EAAK1C,MAAyC,OAAhC0C,EAAK7B,aAAc,SAAsB,IAAM6B,EAAK1C,KAC3D0C,EAER,SAASwqB,GAAexqB,GAOvB,MAN2C,WAApCA,EAAK1C,MAAQ,IAAKrB,MAAO,EAAG,GAClC+D,EAAK1C,KAAO0C,EAAK1C,KAAKrB,MAAO,GAE7B+D,EAAK2J,gBAAiB,QAGhB3J,EAGR,SAASyqB,GAAgBltB,EAAKmtB,GAC7B,IAAI5sB,EAAGiZ,EAAGzZ,EAAgBqtB,EAAUC,EAAU3F,EAE9C,GAAuB,IAAlByF,EAAKxtB,SAAV,CAKA,GAAKqhB,EAASD,QAAS/gB,KAEtB0nB,EADW1G,EAASjf,IAAK/B,GACP0nB,QAKjB,IAAM3nB,KAFNihB,EAAShF,OAAQmR,EAAM,iBAETzF,EACb,IAAMnnB,EAAI,EAAGiZ,EAAIkO,EAAQ3nB,GAAO2B,OAAQnB,EAAIiZ,EAAGjZ,IAC9Ca,EAAOwlB,MAAMhN,IAAKuT,EAAMptB,EAAM2nB,EAAQ3nB,GAAQQ,IAO7C0gB,EAASF,QAAS/gB,KACtBotB,EAAWnM,EAASzB,OAAQxf,GAC5BqtB,EAAWjsB,EAAOmC,OAAQ,GAAI6pB,GAE9BnM,EAASL,IAAKuM,EAAME,KAkBtB,SAASC,GAAUC,EAAY3a,EAAMrQ,EAAUojB,GAG9C/S,EAAOjU,EAAMiU,GAEb,IAAIkT,EAAUnjB,EAAO8iB,EAAS+H,EAAYntB,EAAMC,EAC/CC,EAAI,EACJiZ,EAAI+T,EAAW7rB,OACf+rB,EAAWjU,EAAI,EACfjU,EAAQqN,EAAM,GACd8a,EAAkBjuB,EAAY8F,GAG/B,GAAKmoB,GACG,EAAJlU,GAA0B,iBAAVjU,IAChB/F,EAAQ6kB,YAAcwI,GAAShhB,KAAMtG,GACxC,OAAOgoB,EAAWjrB,KAAM,SAAUoX,GACjC,IAAIb,EAAO0U,EAAW3qB,GAAI8W,GACrBgU,IACJ9a,EAAM,GAAMrN,EAAM1G,KAAMT,KAAMsb,EAAOb,EAAK8U,SAE3CL,GAAUzU,EAAMjG,EAAMrQ,EAAUojB,KAIlC,GAAKnM,IAEJ7W,GADAmjB,EAAWN,GAAe5S,EAAM2a,EAAY,GAAIjiB,eAAe,EAAOiiB,EAAY5H,IACjEhV,WAEmB,IAA/BmV,EAASlb,WAAWlJ,SACxBokB,EAAWnjB,GAIPA,GAASgjB,GAAU,CAOvB,IALA6H,GADA/H,EAAUrkB,EAAOoB,IAAKuiB,GAAQe,EAAU,UAAYkH,KAC/BtrB,OAKbnB,EAAIiZ,EAAGjZ,IACdF,EAAOylB,EAEFvlB,IAAMktB,IACVptB,EAAOe,EAAOwC,MAAOvD,GAAM,GAAM,GAG5BmtB,GAIJpsB,EAAOgB,MAAOqjB,EAASV,GAAQ1kB,EAAM,YAIvCkC,EAAS1D,KAAM0uB,EAAYhtB,GAAKF,EAAME,GAGvC,GAAKitB,EAOJ,IANAltB,EAAMmlB,EAASA,EAAQ/jB,OAAS,GAAI4J,cAGpClK,EAAOoB,IAAKijB,EAASwH,IAGf1sB,EAAI,EAAGA,EAAIitB,EAAYjtB,IAC5BF,EAAOolB,EAASllB,GACX4jB,GAAYtY,KAAMxL,EAAKN,MAAQ,MAClCihB,EAASxB,OAAQnf,EAAM,eACxBe,EAAOyF,SAAUvG,EAAKD,KAEjBA,EAAKL,KAA8C,YAArCK,EAAKN,MAAQ,IAAK8F,cAG/BzE,EAAOwsB,WAAavtB,EAAKH,UAC7BkB,EAAOwsB,SAAUvtB,EAAKL,IAAK,CAC1BC,MAAOI,EAAKJ,OAASI,EAAKO,aAAc,UACtCN,GAGJH,EAASE,EAAKqQ,YAAYpM,QAASwoB,GAAc,IAAMzsB,EAAMC,IAQnE,OAAOitB,EAGR,SAASvR,GAAQvZ,EAAMpB,EAAUwsB,GAKhC,IAJA,IAAIxtB,EACH0lB,EAAQ1kB,EAAWD,EAAOsN,OAAQrN,EAAUoB,GAASA,EACrDlC,EAAI,EAE4B,OAAvBF,EAAO0lB,EAAOxlB,IAAeA,IAChCstB,GAA8B,IAAlBxtB,EAAKV,UACtByB,EAAO0sB,UAAW/I,GAAQ1kB,IAGtBA,EAAKW,aACJ6sB,GAAYtL,GAAYliB,IAC5B2kB,GAAeD,GAAQ1kB,EAAM,WAE9BA,EAAKW,WAAWC,YAAaZ,IAI/B,OAAOoC,EAGRrB,EAAOmC,OAAQ,CACdyiB,cAAe,SAAU2H,GACxB,OAAOA,GAGR/pB,MAAO,SAAUnB,EAAMsrB,EAAeC,GACrC,IAAIztB,EAAGiZ,EAAGyU,EAAaC,EApINluB,EAAKmtB,EACnB1iB,EAoIF7G,EAAQnB,EAAK6hB,WAAW,GACxB6J,EAAS5L,GAAY9f,GAGtB,KAAMjD,EAAQ+kB,gBAAsC,IAAlB9hB,EAAK9C,UAAoC,KAAlB8C,EAAK9C,UAC3DyB,EAAO8W,SAAUzV,IAMnB,IAHAyrB,EAAenJ,GAAQnhB,GAGjBrD,EAAI,EAAGiZ,GAFbyU,EAAclJ,GAAQtiB,IAEOf,OAAQnB,EAAIiZ,EAAGjZ,IAhJ5BP,EAiJLiuB,EAAa1tB,GAjJH4sB,EAiJQe,EAAc3tB,QAhJzCkK,EAGc,WAHdA,EAAW0iB,EAAK1iB,SAAS5E,gBAGAoe,GAAepY,KAAM7L,EAAID,MACrDotB,EAAKpZ,QAAU/T,EAAI+T,QAGK,UAAbtJ,GAAqC,aAAbA,IACnC0iB,EAAKnV,aAAehY,EAAIgY,cA6IxB,GAAK+V,EACJ,GAAKC,EAIJ,IAHAC,EAAcA,GAAelJ,GAAQtiB,GACrCyrB,EAAeA,GAAgBnJ,GAAQnhB,GAEjCrD,EAAI,EAAGiZ,EAAIyU,EAAYvsB,OAAQnB,EAAIiZ,EAAGjZ,IAC3C2sB,GAAgBe,EAAa1tB,GAAK2tB,EAAc3tB,SAGjD2sB,GAAgBzqB,EAAMmB,GAWxB,OAL2B,GAD3BsqB,EAAenJ,GAAQnhB,EAAO,WACZlC,QACjBsjB,GAAekJ,GAAeC,GAAUpJ,GAAQtiB,EAAM,WAIhDmB,GAGRkqB,UAAW,SAAU5rB,GAKpB,IAJA,IAAI2e,EAAMpe,EAAM1C,EACfwd,EAAUnc,EAAOwlB,MAAMrJ,QACvBhd,EAAI,OAE6B2D,KAAxBzB,EAAOP,EAAO3B,IAAqBA,IAC5C,GAAK+f,EAAY7d,GAAS,CACzB,GAAOoe,EAAOpe,EAAMue,EAAS7c,SAAc,CAC1C,GAAK0c,EAAK6G,OACT,IAAM3nB,KAAQ8gB,EAAK6G,OACbnK,EAASxd,GACbqB,EAAOwlB,MAAM5K,OAAQvZ,EAAM1C,GAI3BqB,EAAOunB,YAAalmB,EAAM1C,EAAM8gB,EAAKqH,QAOxCzlB,EAAMue,EAAS7c,cAAYD,EAEvBzB,EAAMwe,EAAS9c,WAInB1B,EAAMwe,EAAS9c,cAAYD,OAOhC9C,EAAOG,GAAGgC,OAAQ,CACjB6qB,OAAQ,SAAU/sB,GACjB,OAAO2a,GAAQ5d,KAAMiD,GAAU,IAGhC2a,OAAQ,SAAU3a,GACjB,OAAO2a,GAAQ5d,KAAMiD,IAGtBV,KAAM,SAAU4E,GACf,OAAOia,EAAQphB,KAAM,SAAUmH,GAC9B,YAAiBrB,IAAVqB,EACNnE,EAAOT,KAAMvC,MACbA,KAAK8V,QAAQ5R,KAAM,WACK,IAAlBlE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,WACxDvB,KAAKsS,YAAcnL,MAGpB,KAAMA,EAAO7C,UAAUhB,SAG3B2sB,OAAQ,WACP,OAAOf,GAAUlvB,KAAMsE,UAAW,SAAUD,GACpB,IAAlBrE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,UAC3CotB,GAAoB3uB,KAAMqE,GAChC1B,YAAa0B,MAKvB6rB,QAAS,WACR,OAAOhB,GAAUlvB,KAAMsE,UAAW,SAAUD,GAC3C,GAAuB,IAAlBrE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,SAAiB,CACzE,IAAIkE,EAASkpB,GAAoB3uB,KAAMqE,GACvCoB,EAAO0qB,aAAc9rB,EAAMoB,EAAO8M,gBAKrC6d,OAAQ,WACP,OAAOlB,GAAUlvB,KAAMsE,UAAW,SAAUD,GACtCrE,KAAK4C,YACT5C,KAAK4C,WAAWutB,aAAc9rB,EAAMrE,SAKvCqwB,MAAO,WACN,OAAOnB,GAAUlvB,KAAMsE,UAAW,SAAUD,GACtCrE,KAAK4C,YACT5C,KAAK4C,WAAWutB,aAAc9rB,EAAMrE,KAAKiP,gBAK5C6G,MAAO,WAIN,IAHA,IAAIzR,EACHlC,EAAI,EAE2B,OAAtBkC,EAAOrE,KAAMmC,IAAeA,IACd,IAAlBkC,EAAK9C,WAGTyB,EAAO0sB,UAAW/I,GAAQtiB,GAAM,IAGhCA,EAAKiO,YAAc,IAIrB,OAAOtS,MAGRwF,MAAO,SAAUmqB,EAAeC,GAI/B,OAHAD,EAAiC,MAAjBA,GAAgCA,EAChDC,EAAyC,MAArBA,EAA4BD,EAAgBC,EAEzD5vB,KAAKoE,IAAK,WAChB,OAAOpB,EAAOwC,MAAOxF,KAAM2vB,EAAeC,MAI5CL,KAAM,SAAUpoB,GACf,OAAOia,EAAQphB,KAAM,SAAUmH,GAC9B,IAAI9C,EAAOrE,KAAM,IAAO,GACvBmC,EAAI,EACJiZ,EAAIpb,KAAKsD,OAEV,QAAewC,IAAVqB,GAAyC,IAAlB9C,EAAK9C,SAChC,OAAO8C,EAAKwM,UAIb,GAAsB,iBAAV1J,IAAuBqnB,GAAa/gB,KAAMtG,KACpDkf,IAAWP,GAAS3Y,KAAMhG,IAAW,CAAE,GAAI,KAAQ,GAAIM,eAAkB,CAE1EN,EAAQnE,EAAO4kB,cAAezgB,GAE9B,IACC,KAAQhF,EAAIiZ,EAAGjZ,IAIS,KAHvBkC,EAAOrE,KAAMmC,IAAO,IAGVZ,WACTyB,EAAO0sB,UAAW/I,GAAQtiB,GAAM,IAChCA,EAAKwM,UAAY1J,GAInB9C,EAAO,EAGN,MAAQoI,KAGNpI,GACJrE,KAAK8V,QAAQma,OAAQ9oB,IAEpB,KAAMA,EAAO7C,UAAUhB,SAG3BgtB,YAAa,WACZ,IAAI/I,EAAU,GAGd,OAAO2H,GAAUlvB,KAAMsE,UAAW,SAAUD,GAC3C,IAAI8P,EAASnU,KAAK4C,WAEbI,EAAO6D,QAAS7G,KAAMunB,GAAY,IACtCvkB,EAAO0sB,UAAW/I,GAAQ3mB,OACrBmU,GACJA,EAAOoc,aAAclsB,EAAMrE,QAK3BunB,MAILvkB,EAAOkB,KAAM,CACZssB,SAAU,SACVC,UAAW,UACXN,aAAc,SACdO,YAAa,QACbC,WAAY,eACV,SAAUtrB,EAAMurB,GAClB5tB,EAAOG,GAAIkC,GAAS,SAAUpC,GAO7B,IANA,IAAIa,EACHC,EAAM,GACN8sB,EAAS7tB,EAAQC,GACjBwB,EAAOosB,EAAOvtB,OAAS,EACvBnB,EAAI,EAEGA,GAAKsC,EAAMtC,IAClB2B,EAAQ3B,IAAMsC,EAAOzE,KAAOA,KAAKwF,OAAO,GACxCxC,EAAQ6tB,EAAQ1uB,IAAOyuB,GAAY9sB,GAInClD,EAAKD,MAAOoD,EAAKD,EAAMH,OAGxB,OAAO3D,KAAK6D,UAAWE,MAGzB,IAAI+sB,GAAY,IAAI/mB,OAAQ,KAAOga,GAAO,kBAAmB,KAEzDgN,GAAY,SAAU1sB,GAKxB,IAAI2oB,EAAO3oB,EAAK6I,cAAc4C,YAM9B,OAJMkd,GAASA,EAAKgE,SACnBhE,EAAOjtB,GAGDitB,EAAKiE,iBAAkB5sB,IAG5B6sB,GAAO,SAAU7sB,EAAMe,EAASjB,GACnC,IAAIJ,EAAKsB,EACR8rB,EAAM,GAGP,IAAM9rB,KAAQD,EACb+rB,EAAK9rB,GAAShB,EAAKkgB,MAAOlf,GAC1BhB,EAAKkgB,MAAOlf,GAASD,EAASC,GAM/B,IAAMA,KAHNtB,EAAMI,EAAS1D,KAAM4D,GAGPe,EACbf,EAAKkgB,MAAOlf,GAAS8rB,EAAK9rB,GAG3B,OAAOtB,GAIJqtB,GAAY,IAAIrnB,OAAQma,GAAUrW,KAAM,KAAO,KAiJnD,SAASwjB,GAAQhtB,EAAMgB,EAAMisB,GAC5B,IAAIC,EAAOC,EAAUC,EAAU1tB,EAM9BwgB,EAAQlgB,EAAKkgB,MAqCd,OAnCA+M,EAAWA,GAAYP,GAAW1sB,MAQpB,MAFbN,EAAMutB,EAASI,iBAAkBrsB,IAAUisB,EAAUjsB,KAEjC8e,GAAY9f,KAC/BN,EAAMf,EAAOuhB,MAAOlgB,EAAMgB,KAQrBjE,EAAQuwB,kBAAoBb,GAAUrjB,KAAM1J,IAASqtB,GAAU3jB,KAAMpI,KAG1EksB,EAAQhN,EAAMgN,MACdC,EAAWjN,EAAMiN,SACjBC,EAAWlN,EAAMkN,SAGjBlN,EAAMiN,SAAWjN,EAAMkN,SAAWlN,EAAMgN,MAAQxtB,EAChDA,EAAMutB,EAASC,MAGfhN,EAAMgN,MAAQA,EACdhN,EAAMiN,SAAWA,EACjBjN,EAAMkN,SAAWA,SAIJ3rB,IAAR/B,EAINA,EAAM,GACNA,EAIF,SAAS6tB,GAAcC,EAAaC,GAGnC,MAAO,CACNnuB,IAAK,WACJ,IAAKkuB,IASL,OAAS7xB,KAAK2D,IAAMmuB,GAASnxB,MAAOX,KAAMsE,kBALlCtE,KAAK2D,OA3MhB,WAIC,SAASouB,IAGR,GAAMnM,EAAN,CAIAoM,EAAUzN,MAAM0N,QAAU,+EAE1BrM,EAAIrB,MAAM0N,QACT,4HAGDtiB,GAAgBhN,YAAaqvB,GAAYrvB,YAAaijB,GAEtD,IAAIsM,EAAWnyB,EAAOkxB,iBAAkBrL,GACxCuM,EAAoC,OAAjBD,EAASniB,IAG5BqiB,EAAsE,KAA9CC,EAAoBH,EAASI,YAIrD1M,EAAIrB,MAAMgO,MAAQ,MAClBC,EAA6D,KAAzCH,EAAoBH,EAASK,OAIjDE,EAAgE,KAAzCJ,EAAoBH,EAASX,OAMpD3L,EAAIrB,MAAMmO,SAAW,WACrBC,EAAiE,KAA9CN,EAAoBzM,EAAIgN,YAAc,GAEzDjjB,GAAgB9M,YAAamvB,GAI7BpM,EAAM,MAGP,SAASyM,EAAoBQ,GAC5B,OAAO7sB,KAAK8sB,MAAOC,WAAYF,IAGhC,IAAIV,EAAkBM,EAAsBE,EAAkBH,EAC7DQ,EAAyBZ,EACzBJ,EAAYpyB,EAAS0C,cAAe,OACpCsjB,EAAMhmB,EAAS0C,cAAe,OAGzBsjB,EAAIrB,QAMVqB,EAAIrB,MAAM0O,eAAiB,cAC3BrN,EAAIM,WAAW,GAAO3B,MAAM0O,eAAiB,GAC7C7xB,EAAQ8xB,gBAA+C,gBAA7BtN,EAAIrB,MAAM0O,eAEpCjwB,EAAOmC,OAAQ/D,EAAS,CACvB+xB,kBAAmB,WAElB,OADApB,IACOU,GAERd,eAAgB,WAEf,OADAI,IACOS,GAERY,cAAe,WAEd,OADArB,IACOI,GAERkB,mBAAoB,WAEnB,OADAtB,IACOK,GAERkB,cAAe,WAEd,OADAvB,IACOY,GAYRY,qBAAsB,WACrB,IAAIC,EAAOhN,EAAIiN,EAASC,EAmCxB,OAlCgC,MAA3BV,IACJQ,EAAQ5zB,EAAS0C,cAAe,SAChCkkB,EAAK5mB,EAAS0C,cAAe,MAC7BmxB,EAAU7zB,EAAS0C,cAAe,OAElCkxB,EAAMjP,MAAM0N,QAAU,2DACtBzL,EAAGjC,MAAM0N,QAAU,mBAKnBzL,EAAGjC,MAAMoP,OAAS,MAClBF,EAAQlP,MAAMoP,OAAS,MAQvBF,EAAQlP,MAAMC,QAAU,QAExB7U,GACEhN,YAAa6wB,GACb7wB,YAAa6jB,GACb7jB,YAAa8wB,GAEfC,EAAU3zB,EAAOkxB,iBAAkBzK,GACnCwM,EAA4BY,SAAUF,EAAQC,OAAQ,IACrDC,SAAUF,EAAQG,eAAgB,IAClCD,SAAUF,EAAQI,kBAAmB,MAAWtN,EAAGuN,aAEpDpkB,GAAgB9M,YAAa2wB,IAEvBR,MAvIV,GAsNA,IAAIgB,GAAc,CAAE,SAAU,MAAO,MACpCC,GAAar0B,EAAS0C,cAAe,OAAQiiB,MAC7C2P,GAAc,GAkBf,SAASC,GAAe9uB,GACvB,IAAI+uB,EAAQpxB,EAAOqxB,SAAUhvB,IAAU6uB,GAAa7uB,GAEpD,OAAK+uB,IAGA/uB,KAAQ4uB,GACL5uB,EAED6uB,GAAa7uB,GAxBrB,SAAyBA,GAGxB,IAAIivB,EAAUjvB,EAAM,GAAI0c,cAAgB1c,EAAK/E,MAAO,GACnD6B,EAAI6xB,GAAY1wB,OAEjB,MAAQnB,IAEP,IADAkD,EAAO2uB,GAAa7xB,GAAMmyB,KACbL,GACZ,OAAO5uB,EAeoBkvB,CAAgBlvB,IAAUA,GAIxD,IAKCmvB,GAAe,4BACfC,GAAc,MACdC,GAAU,CAAEhC,SAAU,WAAYiC,WAAY,SAAUnQ,QAAS,SACjEoQ,GAAqB,CACpBC,cAAe,IACfC,WAAY,OAGd,SAASC,GAAmBnwB,EAAOuC,EAAO6tB,GAIzC,IAAIhuB,EAAUid,GAAQ9W,KAAMhG,GAC5B,OAAOH,EAGNhB,KAAKivB,IAAK,EAAGjuB,EAAS,IAAQguB,GAAY,KAAUhuB,EAAS,IAAO,MACpEG,EAGF,SAAS+tB,GAAoB7wB,EAAM8wB,EAAWC,EAAKC,EAAaC,EAAQC,GACvE,IAAIpzB,EAAkB,UAAdgzB,EAAwB,EAAI,EACnCK,EAAQ,EACRC,EAAQ,EAGT,GAAKL,KAAUC,EAAc,SAAW,WACvC,OAAO,EAGR,KAAQlzB,EAAI,EAAGA,GAAK,EAGN,WAARizB,IACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM+wB,EAAMlR,GAAW/hB,IAAK,EAAMmzB,IAIlDD,GAmBQ,YAARD,IACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM,UAAY6f,GAAW/hB,IAAK,EAAMmzB,IAIjD,WAARF,IACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMmzB,MAtBvEG,GAASzyB,EAAOyhB,IAAKpgB,EAAM,UAAY6f,GAAW/hB,IAAK,EAAMmzB,GAGhD,YAARF,EACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMmzB,GAItEE,GAASxyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMmzB,IAoCzE,OAhBMD,GAA8B,GAAfE,IAIpBE,GAASzvB,KAAKivB,IAAK,EAAGjvB,KAAK0vB,KAC1BrxB,EAAM,SAAW8wB,EAAW,GAAIpT,cAAgBoT,EAAU70B,MAAO,IACjEi1B,EACAE,EACAD,EACA,MAIM,GAGDC,EAGR,SAASE,GAAkBtxB,EAAM8wB,EAAWK,GAG3C,IAAIF,EAASvE,GAAW1sB,GAKvBgxB,IADmBj0B,EAAQ+xB,qBAAuBqC,IAEE,eAAnDxyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOixB,GACvCM,EAAmBP,EAEnBjzB,EAAMivB,GAAQhtB,EAAM8wB,EAAWG,GAC/BO,EAAa,SAAWV,EAAW,GAAIpT,cAAgBoT,EAAU70B,MAAO,GAIzE,GAAKwwB,GAAUrjB,KAAMrL,GAAQ,CAC5B,IAAMozB,EACL,OAAOpzB,EAERA,EAAM,OAyCP,QAlCQhB,EAAQ+xB,qBAAuBkC,IAMrCj0B,EAAQmyB,wBAA0BlnB,EAAUhI,EAAM,OAI3C,SAARjC,IAIC2wB,WAAY3wB,IAA0D,WAAjDY,EAAOyhB,IAAKpgB,EAAM,WAAW,EAAOixB,KAG1DjxB,EAAKyxB,iBAAiBxyB,SAEtB+xB,EAAiE,eAAnDryB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOixB,IAKpDM,EAAmBC,KAAcxxB,KAEhCjC,EAAMiC,EAAMwxB,MAKdzzB,EAAM2wB,WAAY3wB,IAAS,GAI1B8yB,GACC7wB,EACA8wB,EACAK,IAAWH,EAAc,SAAW,WACpCO,EACAN,EAGAlzB,GAEE,KA+SL,SAAS2zB,GAAO1xB,EAAMe,EAASsd,EAAM1d,EAAKgxB,GACzC,OAAO,IAAID,GAAMxyB,UAAUH,KAAMiB,EAAMe,EAASsd,EAAM1d,EAAKgxB,GA7S5DhzB,EAAOmC,OAAQ,CAId8wB,SAAU,CACTC,QAAS,CACRvyB,IAAK,SAAUU,EAAMitB,GACpB,GAAKA,EAAW,CAGf,IAAIvtB,EAAMstB,GAAQhtB,EAAM,WACxB,MAAe,KAARN,EAAa,IAAMA,MAO9BohB,UAAW,CACVgR,yBAA2B,EAC3BC,aAAe,EACfC,aAAe,EACfC,UAAY,EACZC,YAAc,EACdzB,YAAc,EACd0B,UAAY,EACZC,YAAc,EACdC,eAAiB,EACjBC,iBAAmB,EACnBC,SAAW,EACXC,YAAc,EACdC,cAAgB,EAChBC,YAAc,EACdb,SAAW,EACXc,OAAS,EACTC,SAAW,EACXC,QAAU,EACVC,QAAU,EACVC,MAAQ,GAKT/C,SAAU,GAGV9P,MAAO,SAAUlgB,EAAMgB,EAAM8B,EAAOquB,GAGnC,GAAMnxB,GAA0B,IAAlBA,EAAK9C,UAAoC,IAAlB8C,EAAK9C,UAAmB8C,EAAKkgB,MAAlE,CAKA,IAAIxgB,EAAKpC,EAAM6hB,EACd6T,EAAWrV,EAAW3c,GACtBiyB,EAAe7C,GAAYhnB,KAAMpI,GACjCkf,EAAQlgB,EAAKkgB,MAad,GARM+S,IACLjyB,EAAO8uB,GAAekD,IAIvB7T,EAAQxgB,EAAOizB,SAAU5wB,IAAUrC,EAAOizB,SAAUoB,QAGrCvxB,IAAVqB,EA0CJ,OAAKqc,GAAS,QAASA,QACwB1d,KAA5C/B,EAAMyf,EAAM7f,IAAKU,GAAM,EAAOmxB,IAEzBzxB,EAIDwgB,EAAOlf,GA7CA,YAHd1D,SAAcwF,KAGcpD,EAAMkgB,GAAQ9W,KAAMhG,KAAapD,EAAK,KACjEoD,EAAQud,GAAWrgB,EAAMgB,EAAMtB,GAG/BpC,EAAO,UAIM,MAATwF,GAAiBA,GAAUA,IAOlB,WAATxF,GAAsB21B,IAC1BnwB,GAASpD,GAAOA,EAAK,KAASf,EAAOmiB,UAAWkS,GAAa,GAAK,OAI7Dj2B,EAAQ8xB,iBAA6B,KAAV/rB,GAAiD,IAAjC9B,EAAKxE,QAAS,gBAC9D0jB,EAAOlf,GAAS,WAIXme,GAAY,QAASA,QACsB1d,KAA9CqB,EAAQqc,EAAMhB,IAAKne,EAAM8C,EAAOquB,MAE7B8B,EACJ/S,EAAMgT,YAAalyB,EAAM8B,GAEzBod,EAAOlf,GAAS8B,MAkBpBsd,IAAK,SAAUpgB,EAAMgB,EAAMmwB,EAAOF,GACjC,IAAIlzB,EAAKwB,EAAK4f,EACb6T,EAAWrV,EAAW3c,GA6BvB,OA5BgBovB,GAAYhnB,KAAMpI,KAMjCA,EAAO8uB,GAAekD,KAIvB7T,EAAQxgB,EAAOizB,SAAU5wB,IAAUrC,EAAOizB,SAAUoB,KAGtC,QAAS7T,IACtBphB,EAAMohB,EAAM7f,IAAKU,GAAM,EAAMmxB,SAIjB1vB,IAAR1D,IACJA,EAAMivB,GAAQhtB,EAAMgB,EAAMiwB,IAId,WAARlzB,GAAoBiD,KAAQuvB,KAChCxyB,EAAMwyB,GAAoBvvB,IAIZ,KAAVmwB,GAAgBA,GACpB5xB,EAAMmvB,WAAY3wB,IACD,IAAVozB,GAAkBgC,SAAU5zB,GAAQA,GAAO,EAAIxB,GAGhDA,KAITY,EAAOkB,KAAM,CAAE,SAAU,SAAW,SAAUsD,EAAI2tB,GACjDnyB,EAAOizB,SAAUd,GAAc,CAC9BxxB,IAAK,SAAUU,EAAMitB,EAAUkE,GAC9B,GAAKlE,EAIJ,OAAOkD,GAAa/mB,KAAMzK,EAAOyhB,IAAKpgB,EAAM,aAQxCA,EAAKyxB,iBAAiBxyB,QAAWe,EAAKozB,wBAAwBlG,MAIjEoE,GAAkBtxB,EAAM8wB,EAAWK,GAHnCtE,GAAM7sB,EAAMqwB,GAAS,WACpB,OAAOiB,GAAkBtxB,EAAM8wB,EAAWK,MAM9ChT,IAAK,SAAUne,EAAM8C,EAAOquB,GAC3B,IAAIxuB,EACHsuB,EAASvE,GAAW1sB,GAIpBqzB,GAAsBt2B,EAAQkyB,iBACT,aAApBgC,EAAO5C,SAIR2C,GADkBqC,GAAsBlC,IAEY,eAAnDxyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOixB,GACvCN,EAAWQ,EACVN,GACC7wB,EACA8wB,EACAK,EACAH,EACAC,GAED,EAqBF,OAjBKD,GAAeqC,IACnB1C,GAAYhvB,KAAK0vB,KAChBrxB,EAAM,SAAW8wB,EAAW,GAAIpT,cAAgBoT,EAAU70B,MAAO,IACjEyyB,WAAYuC,EAAQH,IACpBD,GAAoB7wB,EAAM8wB,EAAW,UAAU,EAAOG,GACtD,KAKGN,IAAchuB,EAAUid,GAAQ9W,KAAMhG,KACb,QAA3BH,EAAS,IAAO,QAElB3C,EAAKkgB,MAAO4Q,GAAchuB,EAC1BA,EAAQnE,EAAOyhB,IAAKpgB,EAAM8wB,IAGpBJ,GAAmB1wB,EAAM8C,EAAO6tB,OAK1ChyB,EAAOizB,SAAS3D,WAAaV,GAAcxwB,EAAQiyB,mBAClD,SAAUhvB,EAAMitB,GACf,GAAKA,EACJ,OAASyB,WAAY1B,GAAQhtB,EAAM,gBAClCA,EAAKozB,wBAAwBE,KAC5BzG,GAAM7sB,EAAM,CAAEiuB,WAAY,GAAK,WAC9B,OAAOjuB,EAAKozB,wBAAwBE,QAEnC,OAMP30B,EAAOkB,KAAM,CACZ0zB,OAAQ,GACRC,QAAS,GACTC,OAAQ,SACN,SAAUC,EAAQC,GACpBh1B,EAAOizB,SAAU8B,EAASC,GAAW,CACpCC,OAAQ,SAAU9wB,GAOjB,IANA,IAAIhF,EAAI,EACP+1B,EAAW,GAGXC,EAAyB,iBAAVhxB,EAAqBA,EAAMI,MAAO,KAAQ,CAAEJ,GAEpDhF,EAAI,EAAGA,IACd+1B,EAAUH,EAAS7T,GAAW/hB,GAAM61B,GACnCG,EAAOh2B,IAAOg2B,EAAOh2B,EAAI,IAAOg2B,EAAO,GAGzC,OAAOD,IAIO,WAAXH,IACJ/0B,EAAOizB,SAAU8B,EAASC,GAASxV,IAAMuS,MAI3C/xB,EAAOG,GAAGgC,OAAQ,CACjBsf,IAAK,SAAUpf,EAAM8B,GACpB,OAAOia,EAAQphB,KAAM,SAAUqE,EAAMgB,EAAM8B,GAC1C,IAAImuB,EAAQxwB,EACXV,EAAM,GACNjC,EAAI,EAEL,GAAKyD,MAAMC,QAASR,GAAS,CAI5B,IAHAiwB,EAASvE,GAAW1sB,GACpBS,EAAMO,EAAK/B,OAEHnB,EAAI2C,EAAK3C,IAChBiC,EAAKiB,EAAMlD,IAAQa,EAAOyhB,IAAKpgB,EAAMgB,EAAMlD,IAAK,EAAOmzB,GAGxD,OAAOlxB,EAGR,YAAiB0B,IAAVqB,EACNnE,EAAOuhB,MAAOlgB,EAAMgB,EAAM8B,GAC1BnE,EAAOyhB,IAAKpgB,EAAMgB,IACjBA,EAAM8B,EAA0B,EAAnB7C,UAAUhB,aAQ5BN,EAAO+yB,MAAQA,IAETxyB,UAAY,CACjBE,YAAasyB,GACb3yB,KAAM,SAAUiB,EAAMe,EAASsd,EAAM1d,EAAKgxB,EAAQ9Q,GACjDllB,KAAKqE,KAAOA,EACZrE,KAAK0iB,KAAOA,EACZ1iB,KAAKg2B,OAASA,GAAUhzB,EAAOgzB,OAAOtP,SACtC1mB,KAAKoF,QAAUA,EACfpF,KAAKkU,MAAQlU,KAAKmsB,IAAMnsB,KAAK8O,MAC7B9O,KAAKgF,IAAMA,EACXhF,KAAKklB,KAAOA,IAAUliB,EAAOmiB,UAAWzC,GAAS,GAAK,OAEvD5T,IAAK,WACJ,IAAI0U,EAAQuS,GAAMqC,UAAWp4B,KAAK0iB,MAElC,OAAOc,GAASA,EAAM7f,IACrB6f,EAAM7f,IAAK3D,MACX+1B,GAAMqC,UAAU1R,SAAS/iB,IAAK3D,OAEhCq4B,IAAK,SAAUC,GACd,IAAIC,EACH/U,EAAQuS,GAAMqC,UAAWp4B,KAAK0iB,MAoB/B,OAlBK1iB,KAAKoF,QAAQozB,SACjBx4B,KAAKy4B,IAAMF,EAAQv1B,EAAOgzB,OAAQh2B,KAAKg2B,QACtCsC,EAASt4B,KAAKoF,QAAQozB,SAAWF,EAAS,EAAG,EAAGt4B,KAAKoF,QAAQozB,UAG9Dx4B,KAAKy4B,IAAMF,EAAQD,EAEpBt4B,KAAKmsB,KAAQnsB,KAAKgF,IAAMhF,KAAKkU,OAAUqkB,EAAQv4B,KAAKkU,MAE/ClU,KAAKoF,QAAQszB,MACjB14B,KAAKoF,QAAQszB,KAAKj4B,KAAMT,KAAKqE,KAAMrE,KAAKmsB,IAAKnsB,MAGzCwjB,GAASA,EAAMhB,IACnBgB,EAAMhB,IAAKxiB,MAEX+1B,GAAMqC,UAAU1R,SAASlE,IAAKxiB,MAExBA,QAIOoD,KAAKG,UAAYwyB,GAAMxyB,WAEvCwyB,GAAMqC,UAAY,CACjB1R,SAAU,CACT/iB,IAAK,SAAUihB,GACd,IAAIrR,EAIJ,OAA6B,IAAxBqR,EAAMvgB,KAAK9C,UACa,MAA5BqjB,EAAMvgB,KAAMugB,EAAMlC,OAAoD,MAAlCkC,EAAMvgB,KAAKkgB,MAAOK,EAAMlC,MACrDkC,EAAMvgB,KAAMugB,EAAMlC,OAO1BnP,EAASvQ,EAAOyhB,IAAKG,EAAMvgB,KAAMugB,EAAMlC,KAAM,MAGhB,SAAXnP,EAAwBA,EAAJ,GAEvCiP,IAAK,SAAUoC,GAKT5hB,EAAO21B,GAAGD,KAAM9T,EAAMlC,MAC1B1f,EAAO21B,GAAGD,KAAM9T,EAAMlC,MAAQkC,GACK,IAAxBA,EAAMvgB,KAAK9C,WACtByB,EAAOizB,SAAUrR,EAAMlC,OAC6B,MAAnDkC,EAAMvgB,KAAKkgB,MAAO4P,GAAevP,EAAMlC,OAGxCkC,EAAMvgB,KAAMugB,EAAMlC,MAASkC,EAAMuH,IAFjCnpB,EAAOuhB,MAAOK,EAAMvgB,KAAMugB,EAAMlC,KAAMkC,EAAMuH,IAAMvH,EAAMM,UAU5C0T,UAAY7C,GAAMqC,UAAUS,WAAa,CACxDrW,IAAK,SAAUoC,GACTA,EAAMvgB,KAAK9C,UAAYqjB,EAAMvgB,KAAKzB,aACtCgiB,EAAMvgB,KAAMugB,EAAMlC,MAASkC,EAAMuH,OAKpCnpB,EAAOgzB,OAAS,CACf8C,OAAQ,SAAUC,GACjB,OAAOA,GAERC,MAAO,SAAUD,GAChB,MAAO,GAAM/yB,KAAKizB,IAAKF,EAAI/yB,KAAKkzB,IAAO,GAExCxS,SAAU,SAGX1jB,EAAO21B,GAAK5C,GAAMxyB,UAAUH,KAG5BJ,EAAO21B,GAAGD,KAAO,GAKjB,IACCS,GAAOC,GAmrBHxoB,GAEHyoB,GAprBDC,GAAW,yBACXC,GAAO,cAER,SAASC,KACHJ,MACqB,IAApBx5B,EAAS65B,QAAoB15B,EAAO25B,sBACxC35B,EAAO25B,sBAAuBF,IAE9Bz5B,EAAO+f,WAAY0Z,GAAUx2B,EAAO21B,GAAGgB,UAGxC32B,EAAO21B,GAAGiB,QAKZ,SAASC,KAIR,OAHA95B,EAAO+f,WAAY,WAClBqZ,QAAQrzB,IAEAqzB,GAAQzwB,KAAKyjB,MAIvB,SAAS2N,GAAOn4B,EAAMo4B,GACrB,IAAI/L,EACH7rB,EAAI,EACJuM,EAAQ,CAAEilB,OAAQhyB,GAKnB,IADAo4B,EAAeA,EAAe,EAAI,EAC1B53B,EAAI,EAAGA,GAAK,EAAI43B,EAEvBrrB,EAAO,UADPsf,EAAQ9J,GAAW/hB,KACSuM,EAAO,UAAYsf,GAAUrsB,EAO1D,OAJKo4B,IACJrrB,EAAMwnB,QAAUxnB,EAAM6iB,MAAQ5vB,GAGxB+M,EAGR,SAASsrB,GAAa7yB,EAAOub,EAAMuX,GAKlC,IAJA,IAAIrV,EACHuK,GAAe+K,GAAUC,SAAUzX,IAAU,IAAKhiB,OAAQw5B,GAAUC,SAAU,MAC9E7e,EAAQ,EACRhY,EAAS6rB,EAAW7rB,OACbgY,EAAQhY,EAAQgY,IACvB,GAAOsJ,EAAQuK,EAAY7T,GAAQ7a,KAAMw5B,EAAWvX,EAAMvb,GAGzD,OAAOyd,EAsNV,SAASsV,GAAW71B,EAAM+1B,EAAYh1B,GACrC,IAAImO,EACH8mB,EACA/e,EAAQ,EACRhY,EAAS42B,GAAUI,WAAWh3B,OAC9B+a,EAAWrb,EAAOgb,WAAWI,OAAQ,kBAG7Bwb,EAAKv1B,OAEbu1B,EAAO,WACN,GAAKS,EACJ,OAAO,EAYR,IAVA,IAAIE,EAAcpB,IAASU,KAC1B3Z,EAAYla,KAAKivB,IAAK,EAAGgF,EAAUO,UAAYP,EAAUzB,SAAW+B,GAKpEjC,EAAU,GADHpY,EAAY+Z,EAAUzB,UAAY,GAEzCld,EAAQ,EACRhY,EAAS22B,EAAUQ,OAAOn3B,OAEnBgY,EAAQhY,EAAQgY,IACvB2e,EAAUQ,OAAQnf,GAAQ+c,IAAKC,GAMhC,OAHAja,EAASkB,WAAYlb,EAAM,CAAE41B,EAAW3B,EAASpY,IAG5CoY,EAAU,GAAKh1B,EACZ4c,GAIF5c,GACL+a,EAASkB,WAAYlb,EAAM,CAAE41B,EAAW,EAAG,IAI5C5b,EAASmB,YAAanb,EAAM,CAAE41B,KACvB,IAERA,EAAY5b,EAASzB,QAAS,CAC7BvY,KAAMA,EACNynB,MAAO9oB,EAAOmC,OAAQ,GAAIi1B,GAC1BM,KAAM13B,EAAOmC,QAAQ,EAAM,CAC1Bw1B,cAAe,GACf3E,OAAQhzB,EAAOgzB,OAAOtP,UACpBthB,GACHw1B,mBAAoBR,EACpBS,gBAAiBz1B,EACjBo1B,UAAWrB,IAASU,KACpBrB,SAAUpzB,EAAQozB,SAClBiC,OAAQ,GACRT,YAAa,SAAUtX,EAAM1d,GAC5B,IAAI4f,EAAQ5hB,EAAO+yB,MAAO1xB,EAAM41B,EAAUS,KAAMhY,EAAM1d,EACrDi1B,EAAUS,KAAKC,cAAejY,IAAUuX,EAAUS,KAAK1E,QAExD,OADAiE,EAAUQ,OAAO75B,KAAMgkB,GAChBA,GAERlB,KAAM,SAAUoX,GACf,IAAIxf,EAAQ,EAIXhY,EAASw3B,EAAUb,EAAUQ,OAAOn3B,OAAS,EAC9C,GAAK+2B,EACJ,OAAOr6B,KAGR,IADAq6B,GAAU,EACF/e,EAAQhY,EAAQgY,IACvB2e,EAAUQ,OAAQnf,GAAQ+c,IAAK,GAUhC,OANKyC,GACJzc,EAASkB,WAAYlb,EAAM,CAAE41B,EAAW,EAAG,IAC3C5b,EAASmB,YAAanb,EAAM,CAAE41B,EAAWa,KAEzCzc,EAASuB,WAAYvb,EAAM,CAAE41B,EAAWa,IAElC96B,QAGT8rB,EAAQmO,EAAUnO,MAInB,KA/HD,SAAqBA,EAAO6O,GAC3B,IAAIrf,EAAOjW,EAAM2wB,EAAQ7uB,EAAOqc,EAGhC,IAAMlI,KAASwQ,EAed,GAbAkK,EAAS2E,EADTt1B,EAAO2c,EAAW1G,IAElBnU,EAAQ2kB,EAAOxQ,GACV1V,MAAMC,QAASsB,KACnB6uB,EAAS7uB,EAAO,GAChBA,EAAQ2kB,EAAOxQ,GAAUnU,EAAO,IAG5BmU,IAAUjW,IACdymB,EAAOzmB,GAAS8B,SACT2kB,EAAOxQ,KAGfkI,EAAQxgB,EAAOizB,SAAU5wB,KACX,WAAYme,EAMzB,IAAMlI,KALNnU,EAAQqc,EAAMyU,OAAQ9wB,UACf2kB,EAAOzmB,GAIC8B,EACNmU,KAASwQ,IAChBA,EAAOxQ,GAAUnU,EAAOmU,GACxBqf,EAAerf,GAAU0a,QAI3B2E,EAAet1B,GAAS2wB,EA6F1B+E,CAAYjP,EAAOmO,EAAUS,KAAKC,eAE1Brf,EAAQhY,EAAQgY,IAEvB,GADA/H,EAAS2mB,GAAUI,WAAYhf,GAAQ7a,KAAMw5B,EAAW51B,EAAMynB,EAAOmO,EAAUS,MAM9E,OAJKr5B,EAAYkS,EAAOmQ,QACvB1gB,EAAOygB,YAAawW,EAAU51B,KAAM41B,EAAUS,KAAKnd,OAAQmG,KAC1DnQ,EAAOmQ,KAAKsX,KAAMznB,IAEbA,EAyBT,OArBAvQ,EAAOoB,IAAK0nB,EAAOkO,GAAaC,GAE3B54B,EAAY44B,EAAUS,KAAKxmB,QAC/B+lB,EAAUS,KAAKxmB,MAAMzT,KAAM4D,EAAM41B,GAIlCA,EACErb,SAAUqb,EAAUS,KAAK9b,UACzB/V,KAAMoxB,EAAUS,KAAK7xB,KAAMoxB,EAAUS,KAAKO,UAC1Cpe,KAAMod,EAAUS,KAAK7d,MACrBuB,OAAQ6b,EAAUS,KAAKtc,QAEzBpb,EAAO21B,GAAGuC,MACTl4B,EAAOmC,OAAQy0B,EAAM,CACpBv1B,KAAMA,EACN82B,KAAMlB,EACN1c,MAAO0c,EAAUS,KAAKnd,SAIjB0c,EAGRj3B,EAAOk3B,UAAYl3B,EAAOmC,OAAQ+0B,GAAW,CAE5CC,SAAU,CACTiB,IAAK,CAAE,SAAU1Y,EAAMvb,GACtB,IAAIyd,EAAQ5kB,KAAKg6B,YAAatX,EAAMvb,GAEpC,OADAud,GAAWE,EAAMvgB,KAAMqe,EAAMuB,GAAQ9W,KAAMhG,GAASyd,GAC7CA,KAITyW,QAAS,SAAUvP,EAAO3nB,GACpB9C,EAAYyqB,IAChB3nB,EAAW2nB,EACXA,EAAQ,CAAE,MAEVA,EAAQA,EAAMhf,MAAOoP,GAOtB,IAJA,IAAIwG,EACHpH,EAAQ,EACRhY,EAASwoB,EAAMxoB,OAERgY,EAAQhY,EAAQgY,IACvBoH,EAAOoJ,EAAOxQ,GACd4e,GAAUC,SAAUzX,GAASwX,GAAUC,SAAUzX,IAAU,GAC3DwX,GAAUC,SAAUzX,GAAO9Q,QAASzN,IAItCm2B,WAAY,CA3Wb,SAA2Bj2B,EAAMynB,EAAO4O,GACvC,IAAIhY,EAAMvb,EAAOwe,EAAQnC,EAAO8X,EAASC,EAAWC,EAAgBhX,EACnEiX,EAAQ,UAAW3P,GAAS,WAAYA,EACxCqP,EAAOn7B,KACPsuB,EAAO,GACP/J,EAAQlgB,EAAKkgB,MACbkV,EAASp1B,EAAK9C,UAAY+iB,GAAoBjgB,GAC9Cq3B,EAAW9Y,EAASjf,IAAKU,EAAM,UA6BhC,IAAMqe,KA1BAgY,EAAKnd,QAEa,OADvBiG,EAAQxgB,EAAOygB,YAAapf,EAAM,OACvBs3B,WACVnY,EAAMmY,SAAW,EACjBL,EAAU9X,EAAM1N,MAAM2H,KACtB+F,EAAM1N,MAAM2H,KAAO,WACZ+F,EAAMmY,UACXL,MAIH9X,EAAMmY,WAENR,EAAK/c,OAAQ,WAGZ+c,EAAK/c,OAAQ,WACZoF,EAAMmY,WACA34B,EAAOua,MAAOlZ,EAAM,MAAOf,QAChCkgB,EAAM1N,MAAM2H,YAOFqO,EAEb,GADA3kB,EAAQ2kB,EAAOpJ,GACV4W,GAAS7rB,KAAMtG,GAAU,CAG7B,UAFO2kB,EAAOpJ,GACdiD,EAASA,GAAoB,WAAVxe,EACdA,KAAYsyB,EAAS,OAAS,QAAW,CAI7C,GAAe,SAAVtyB,IAAoBu0B,QAAiC51B,IAArB41B,EAAUhZ,GAK9C,SAJA+W,GAAS,EAOXnL,EAAM5L,GAASgZ,GAAYA,EAAUhZ,IAAU1f,EAAOuhB,MAAOlgB,EAAMqe,GAMrE,IADA6Y,GAAav4B,EAAOyD,cAAeqlB,MAChB9oB,EAAOyD,cAAe6nB,GA8DzC,IAAM5L,KAzDD+Y,GAA2B,IAAlBp3B,EAAK9C,WAMlBm5B,EAAKkB,SAAW,CAAErX,EAAMqX,SAAUrX,EAAMsX,UAAWtX,EAAMuX,WAIlC,OADvBN,EAAiBE,GAAYA,EAASlX,WAErCgX,EAAiB5Y,EAASjf,IAAKU,EAAM,YAGrB,UADjBmgB,EAAUxhB,EAAOyhB,IAAKpgB,EAAM,cAEtBm3B,EACJhX,EAAUgX,GAIVlW,GAAU,CAAEjhB,IAAQ,GACpBm3B,EAAiBn3B,EAAKkgB,MAAMC,SAAWgX,EACvChX,EAAUxhB,EAAOyhB,IAAKpgB,EAAM,WAC5BihB,GAAU,CAAEjhB,OAKG,WAAZmgB,GAAoC,iBAAZA,GAAgD,MAAlBgX,IACrB,SAAhCx4B,EAAOyhB,IAAKpgB,EAAM,WAGhBk3B,IACLJ,EAAKtyB,KAAM,WACV0b,EAAMC,QAAUgX,IAEM,MAAlBA,IACJhX,EAAUD,EAAMC,QAChBgX,EAA6B,SAAZhX,EAAqB,GAAKA,IAG7CD,EAAMC,QAAU,iBAKdkW,EAAKkB,WACTrX,EAAMqX,SAAW,SACjBT,EAAK/c,OAAQ,WACZmG,EAAMqX,SAAWlB,EAAKkB,SAAU,GAChCrX,EAAMsX,UAAYnB,EAAKkB,SAAU,GACjCrX,EAAMuX,UAAYpB,EAAKkB,SAAU,MAKnCL,GAAY,EACEjN,EAGPiN,IACAG,EACC,WAAYA,IAChBjC,EAASiC,EAASjC,QAGnBiC,EAAW9Y,EAASxB,OAAQ/c,EAAM,SAAU,CAAEmgB,QAASgX,IAInD7V,IACJ+V,EAASjC,QAAUA,GAIfA,GACJnU,GAAU,CAAEjhB,IAAQ,GAKrB82B,EAAKtyB,KAAM,WASV,IAAM6Z,KAJA+W,GACLnU,GAAU,CAAEjhB,IAEbue,EAAShF,OAAQvZ,EAAM,UACTiqB,EACbtrB,EAAOuhB,MAAOlgB,EAAMqe,EAAM4L,EAAM5L,OAMnC6Y,EAAYvB,GAAaP,EAASiC,EAAUhZ,GAAS,EAAGA,EAAMyY,GACtDzY,KAAQgZ,IACfA,EAAUhZ,GAAS6Y,EAAUrnB,MACxBulB,IACJ8B,EAAUv2B,IAAMu2B,EAAUrnB,MAC1BqnB,EAAUrnB,MAAQ,MAuMrB6nB,UAAW,SAAU53B,EAAU+rB,GACzBA,EACJgK,GAAUI,WAAW1oB,QAASzN,GAE9B+1B,GAAUI,WAAW15B,KAAMuD,MAK9BnB,EAAOg5B,MAAQ,SAAUA,EAAOhG,EAAQ7yB,GACvC,IAAIk2B,EAAM2C,GAA0B,iBAAVA,EAAqBh5B,EAAOmC,OAAQ,GAAI62B,GAAU,CAC3Ef,SAAU93B,IAAOA,GAAM6yB,GACtB30B,EAAY26B,IAAWA,EACxBxD,SAAUwD,EACVhG,OAAQ7yB,GAAM6yB,GAAUA,IAAW30B,EAAY20B,IAAYA,GAoC5D,OAhCKhzB,EAAO21B,GAAGlQ,IACd4Q,EAAIb,SAAW,EAGc,iBAAjBa,EAAIb,WACVa,EAAIb,YAAYx1B,EAAO21B,GAAGsD,OAC9B5C,EAAIb,SAAWx1B,EAAO21B,GAAGsD,OAAQ5C,EAAIb,UAGrCa,EAAIb,SAAWx1B,EAAO21B,GAAGsD,OAAOvV,UAMjB,MAAb2S,EAAI9b,QAA+B,IAAd8b,EAAI9b,QAC7B8b,EAAI9b,MAAQ,MAIb8b,EAAIlI,IAAMkI,EAAI4B,SAEd5B,EAAI4B,SAAW,WACT55B,EAAYg4B,EAAIlI,MACpBkI,EAAIlI,IAAI1wB,KAAMT,MAGVq5B,EAAI9b,OACRva,EAAOsgB,QAAStjB,KAAMq5B,EAAI9b,QAIrB8b,GAGRr2B,EAAOG,GAAGgC,OAAQ,CACjB+2B,OAAQ,SAAUF,EAAOG,EAAInG,EAAQ7xB,GAGpC,OAAOnE,KAAKsQ,OAAQgU,IAAqBG,IAAK,UAAW,GAAIc,OAG3DvgB,MAAMo3B,QAAS,CAAElG,QAASiG,GAAMH,EAAOhG,EAAQ7xB,IAElDi4B,QAAS,SAAU1Z,EAAMsZ,EAAOhG,EAAQ7xB,GACvC,IAAI2R,EAAQ9S,EAAOyD,cAAeic,GACjC2Z,EAASr5B,EAAOg5B,MAAOA,EAAOhG,EAAQ7xB,GACtCm4B,EAAc,WAGb,IAAInB,EAAOjB,GAAWl6B,KAAMgD,EAAOmC,OAAQ,GAAIud,GAAQ2Z,IAGlDvmB,GAAS8M,EAASjf,IAAK3D,KAAM,YACjCm7B,EAAKzX,MAAM,IAMd,OAFA4Y,EAAYC,OAASD,EAEdxmB,IAA0B,IAAjBumB,EAAO9e,MACtBvd,KAAKkE,KAAMo4B,GACXt8B,KAAKud,MAAO8e,EAAO9e,MAAO+e,IAE5B5Y,KAAM,SAAU/hB,EAAMiiB,EAAYkX,GACjC,IAAI0B,EAAY,SAAUhZ,GACzB,IAAIE,EAAOF,EAAME,YACVF,EAAME,KACbA,EAAMoX,IAYP,MATqB,iBAATn5B,IACXm5B,EAAUlX,EACVA,EAAajiB,EACbA,OAAOmE,GAEH8d,GACJ5jB,KAAKud,MAAO5b,GAAQ,KAAM,IAGpB3B,KAAKkE,KAAM,WACjB,IAAIof,GAAU,EACbhI,EAAgB,MAAR3Z,GAAgBA,EAAO,aAC/B86B,EAASz5B,EAAOy5B,OAChBha,EAAOG,EAASjf,IAAK3D,MAEtB,GAAKsb,EACCmH,EAAMnH,IAAWmH,EAAMnH,GAAQoI,MACnC8Y,EAAW/Z,EAAMnH,SAGlB,IAAMA,KAASmH,EACTA,EAAMnH,IAAWmH,EAAMnH,GAAQoI,MAAQ6V,GAAK9rB,KAAM6N,IACtDkhB,EAAW/Z,EAAMnH,IAKpB,IAAMA,EAAQmhB,EAAOn5B,OAAQgY,KACvBmhB,EAAQnhB,GAAQjX,OAASrE,MACnB,MAAR2B,GAAgB86B,EAAQnhB,GAAQiC,QAAU5b,IAE5C86B,EAAQnhB,GAAQ6f,KAAKzX,KAAMoX,GAC3BxX,GAAU,EACVmZ,EAAOv3B,OAAQoW,EAAO,KAOnBgI,GAAYwX,GAChB93B,EAAOsgB,QAAStjB,KAAM2B,MAIzB46B,OAAQ,SAAU56B,GAIjB,OAHc,IAATA,IACJA,EAAOA,GAAQ,MAET3B,KAAKkE,KAAM,WACjB,IAAIoX,EACHmH,EAAOG,EAASjf,IAAK3D,MACrBud,EAAQkF,EAAM9gB,EAAO,SACrB6hB,EAAQf,EAAM9gB,EAAO,cACrB86B,EAASz5B,EAAOy5B,OAChBn5B,EAASia,EAAQA,EAAMja,OAAS,EAajC,IAVAmf,EAAK8Z,QAAS,EAGdv5B,EAAOua,MAAOvd,KAAM2B,EAAM,IAErB6hB,GAASA,EAAME,MACnBF,EAAME,KAAKjjB,KAAMT,MAAM,GAIlBsb,EAAQmhB,EAAOn5B,OAAQgY,KACvBmhB,EAAQnhB,GAAQjX,OAASrE,MAAQy8B,EAAQnhB,GAAQiC,QAAU5b,IAC/D86B,EAAQnhB,GAAQ6f,KAAKzX,MAAM,GAC3B+Y,EAAOv3B,OAAQoW,EAAO,IAKxB,IAAMA,EAAQ,EAAGA,EAAQhY,EAAQgY,IAC3BiC,EAAOjC,IAAWiC,EAAOjC,GAAQihB,QACrChf,EAAOjC,GAAQihB,OAAO97B,KAAMT,aAKvByiB,EAAK8Z,YAKfv5B,EAAOkB,KAAM,CAAE,SAAU,OAAQ,QAAU,SAAUsD,EAAInC,GACxD,IAAIq3B,EAAQ15B,EAAOG,GAAIkC,GACvBrC,EAAOG,GAAIkC,GAAS,SAAU22B,EAAOhG,EAAQ7xB,GAC5C,OAAgB,MAAT63B,GAAkC,kBAAVA,EAC9BU,EAAM/7B,MAAOX,KAAMsE,WACnBtE,KAAKo8B,QAAStC,GAAOz0B,GAAM,GAAQ22B,EAAOhG,EAAQ7xB,MAKrDnB,EAAOkB,KAAM,CACZy4B,UAAW7C,GAAO,QAClB8C,QAAS9C,GAAO,QAChB+C,YAAa/C,GAAO,UACpBgD,OAAQ,CAAE5G,QAAS,QACnB6G,QAAS,CAAE7G,QAAS,QACpB8G,WAAY,CAAE9G,QAAS,WACrB,SAAU7wB,EAAMymB,GAClB9oB,EAAOG,GAAIkC,GAAS,SAAU22B,EAAOhG,EAAQ7xB,GAC5C,OAAOnE,KAAKo8B,QAAStQ,EAAOkQ,EAAOhG,EAAQ7xB,MAI7CnB,EAAOy5B,OAAS,GAChBz5B,EAAO21B,GAAGiB,KAAO,WAChB,IAAIsB,EACH/4B,EAAI,EACJs6B,EAASz5B,EAAOy5B,OAIjB,IAFAtD,GAAQzwB,KAAKyjB,MAELhqB,EAAIs6B,EAAOn5B,OAAQnB,KAC1B+4B,EAAQuB,EAAQt6B,OAGCs6B,EAAQt6B,KAAQ+4B,GAChCuB,EAAOv3B,OAAQ/C,IAAK,GAIhBs6B,EAAOn5B,QACZN,EAAO21B,GAAGjV,OAEXyV,QAAQrzB,GAGT9C,EAAO21B,GAAGuC,MAAQ,SAAUA,GAC3Bl4B,EAAOy5B,OAAO77B,KAAMs6B,GACpBl4B,EAAO21B,GAAGzkB,SAGXlR,EAAO21B,GAAGgB,SAAW,GACrB32B,EAAO21B,GAAGzkB,MAAQ,WACZklB,KAILA,IAAa,EACbI,OAGDx2B,EAAO21B,GAAGjV,KAAO,WAChB0V,GAAa,MAGdp2B,EAAO21B,GAAGsD,OAAS,CAClBgB,KAAM,IACNC,KAAM,IAGNxW,SAAU,KAMX1jB,EAAOG,GAAGg6B,MAAQ,SAAUC,EAAMz7B,GAIjC,OAHAy7B,EAAOp6B,EAAO21B,IAAK31B,EAAO21B,GAAGsD,OAAQmB,IAAiBA,EACtDz7B,EAAOA,GAAQ,KAER3B,KAAKud,MAAO5b,EAAM,SAAU4K,EAAMiX,GACxC,IAAI6Z,EAAUt9B,EAAO+f,WAAYvT,EAAM6wB,GACvC5Z,EAAME,KAAO,WACZ3jB,EAAOu9B,aAAcD,OAOnBzsB,GAAQhR,EAAS0C,cAAe,SAEnC+2B,GADSz5B,EAAS0C,cAAe,UACpBK,YAAa/C,EAAS0C,cAAe,WAEnDsO,GAAMjP,KAAO,WAIbP,EAAQm8B,QAA0B,KAAhB3sB,GAAMzJ,MAIxB/F,EAAQo8B,YAAcnE,GAAIzjB,UAI1BhF,GAAQhR,EAAS0C,cAAe,UAC1B6E,MAAQ,IACdyJ,GAAMjP,KAAO,QACbP,EAAQq8B,WAA6B,MAAhB7sB,GAAMzJ,MAI5B,IAAIu2B,GACH9uB,GAAa5L,EAAO6O,KAAKjD,WAE1B5L,EAAOG,GAAGgC,OAAQ,CACjB4M,KAAM,SAAU1M,EAAM8B,GACrB,OAAOia,EAAQphB,KAAMgD,EAAO+O,KAAM1M,EAAM8B,EAA0B,EAAnB7C,UAAUhB,SAG1Dq6B,WAAY,SAAUt4B,GACrB,OAAOrF,KAAKkE,KAAM,WACjBlB,EAAO26B,WAAY39B,KAAMqF,QAK5BrC,EAAOmC,OAAQ,CACd4M,KAAM,SAAU1N,EAAMgB,EAAM8B,GAC3B,IAAIpD,EAAKyf,EACRoa,EAAQv5B,EAAK9C,SAGd,GAAe,IAAVq8B,GAAyB,IAAVA,GAAyB,IAAVA,EAKnC,MAAkC,oBAAtBv5B,EAAK7B,aACTQ,EAAO0f,KAAMre,EAAMgB,EAAM8B,IAKlB,IAAVy2B,GAAgB56B,EAAO8W,SAAUzV,KACrCmf,EAAQxgB,EAAO66B,UAAWx4B,EAAKoC,iBAC5BzE,EAAO6O,KAAK/E,MAAMjC,KAAK4C,KAAMpI,GAASq4B,QAAW53B,SAGtCA,IAAVqB,EACW,OAAVA,OACJnE,EAAO26B,WAAYt5B,EAAMgB,GAIrBme,GAAS,QAASA,QACuB1d,KAA3C/B,EAAMyf,EAAMhB,IAAKne,EAAM8C,EAAO9B,IACzBtB,GAGRM,EAAK5B,aAAc4C,EAAM8B,EAAQ,IAC1BA,GAGHqc,GAAS,QAASA,GAA+C,QAApCzf,EAAMyf,EAAM7f,IAAKU,EAAMgB,IACjDtB,EAMM,OAHdA,EAAMf,EAAOwN,KAAKuB,KAAM1N,EAAMgB,SAGTS,EAAY/B,IAGlC85B,UAAW,CACVl8B,KAAM,CACL6gB,IAAK,SAAUne,EAAM8C,GACpB,IAAM/F,EAAQq8B,YAAwB,UAAVt2B,GAC3BkF,EAAUhI,EAAM,SAAY,CAC5B,IAAIjC,EAAMiC,EAAK8C,MAKf,OAJA9C,EAAK5B,aAAc,OAAQ0E,GACtB/E,IACJiC,EAAK8C,MAAQ/E,GAEP+E,MAMXw2B,WAAY,SAAUt5B,EAAM8C,GAC3B,IAAI9B,EACHlD,EAAI,EAIJ27B,EAAY32B,GAASA,EAAM2F,MAAOoP,GAEnC,GAAK4hB,GAA+B,IAAlBz5B,EAAK9C,SACtB,MAAU8D,EAAOy4B,EAAW37B,KAC3BkC,EAAK2J,gBAAiB3I,MAO1Bq4B,GAAW,CACVlb,IAAK,SAAUne,EAAM8C,EAAO9B,GAQ3B,OAPe,IAAV8B,EAGJnE,EAAO26B,WAAYt5B,EAAMgB,GAEzBhB,EAAK5B,aAAc4C,EAAMA,GAEnBA,IAITrC,EAAOkB,KAAMlB,EAAO6O,KAAK/E,MAAMjC,KAAKmZ,OAAOlX,MAAO,QAAU,SAAUtF,EAAInC,GACzE,IAAI04B,EAASnvB,GAAYvJ,IAAUrC,EAAOwN,KAAKuB,KAE/CnD,GAAYvJ,GAAS,SAAUhB,EAAMgB,EAAMwC,GAC1C,IAAI9D,EAAK+lB,EACRkU,EAAgB34B,EAAKoC,cAYtB,OAVMI,IAGLiiB,EAASlb,GAAYovB,GACrBpvB,GAAYovB,GAAkBj6B,EAC9BA,EAAqC,MAA/Bg6B,EAAQ15B,EAAMgB,EAAMwC,GACzBm2B,EACA,KACDpvB,GAAYovB,GAAkBlU,GAExB/lB,KAOT,IAAIk6B,GAAa,sCAChBC,GAAa,gBAyIb,SAASC,GAAkBh3B,GAE1B,OADaA,EAAM2F,MAAOoP,IAAmB,IAC/BrO,KAAM,KAItB,SAASuwB,GAAU/5B,GAClB,OAAOA,EAAK7B,cAAgB6B,EAAK7B,aAAc,UAAa,GAG7D,SAAS67B,GAAgBl3B,GACxB,OAAKvB,MAAMC,QAASsB,GACZA,EAEc,iBAAVA,GACJA,EAAM2F,MAAOoP,IAEd,GAxJRlZ,EAAOG,GAAGgC,OAAQ,CACjBud,KAAM,SAAUrd,EAAM8B,GACrB,OAAOia,EAAQphB,KAAMgD,EAAO0f,KAAMrd,EAAM8B,EAA0B,EAAnB7C,UAAUhB,SAG1Dg7B,WAAY,SAAUj5B,GACrB,OAAOrF,KAAKkE,KAAM,kBACVlE,KAAMgD,EAAOu7B,QAASl5B,IAAUA,QAK1CrC,EAAOmC,OAAQ,CACdud,KAAM,SAAUre,EAAMgB,EAAM8B,GAC3B,IAAIpD,EAAKyf,EACRoa,EAAQv5B,EAAK9C,SAGd,GAAe,IAAVq8B,GAAyB,IAAVA,GAAyB,IAAVA,EAWnC,OAPe,IAAVA,GAAgB56B,EAAO8W,SAAUzV,KAGrCgB,EAAOrC,EAAOu7B,QAASl5B,IAAUA,EACjCme,EAAQxgB,EAAOo1B,UAAW/yB,SAGZS,IAAVqB,EACCqc,GAAS,QAASA,QACuB1d,KAA3C/B,EAAMyf,EAAMhB,IAAKne,EAAM8C,EAAO9B,IACzBtB,EAGCM,EAAMgB,GAAS8B,EAGpBqc,GAAS,QAASA,GAA+C,QAApCzf,EAAMyf,EAAM7f,IAAKU,EAAMgB,IACjDtB,EAGDM,EAAMgB,IAGd+yB,UAAW,CACV3iB,SAAU,CACT9R,IAAK,SAAUU,GAOd,IAAIm6B,EAAWx7B,EAAOwN,KAAKuB,KAAM1N,EAAM,YAEvC,OAAKm6B,EACG5K,SAAU4K,EAAU,IAI3BP,GAAWxwB,KAAMpJ,EAAKgI,WACtB6xB,GAAWzwB,KAAMpJ,EAAKgI,WACtBhI,EAAKmR,KAEE,GAGA,KAKX+oB,QAAS,CACRE,MAAO,UACPC,QAAS,eAYLt9B,EAAQo8B,cACbx6B,EAAOo1B,UAAUxiB,SAAW,CAC3BjS,IAAK,SAAUU,GAId,IAAI8P,EAAS9P,EAAKzB,WAIlB,OAHKuR,GAAUA,EAAOvR,YACrBuR,EAAOvR,WAAWiT,cAEZ,MAER2M,IAAK,SAAUne,GAId,IAAI8P,EAAS9P,EAAKzB,WACbuR,IACJA,EAAO0B,cAEF1B,EAAOvR,YACXuR,EAAOvR,WAAWiT,kBAOvB7S,EAAOkB,KAAM,CACZ,WACA,WACA,YACA,cACA,cACA,UACA,UACA,SACA,cACA,mBACE,WACFlB,EAAOu7B,QAASv+B,KAAKyH,eAAkBzH,OA4BxCgD,EAAOG,GAAGgC,OAAQ,CACjBw5B,SAAU,SAAUx3B,GACnB,IAAIy3B,EAASv6B,EAAMyK,EAAK+vB,EAAUC,EAAO/5B,EAAGg6B,EAC3C58B,EAAI,EAEL,GAAKd,EAAY8F,GAChB,OAAOnH,KAAKkE,KAAM,SAAUa,GAC3B/B,EAAQhD,MAAO2+B,SAAUx3B,EAAM1G,KAAMT,KAAM+E,EAAGq5B,GAAUp+B,UAM1D,IAFA4+B,EAAUP,GAAgBl3B,IAEb7D,OACZ,MAAUe,EAAOrE,KAAMmC,KAItB,GAHA08B,EAAWT,GAAU/5B,GACrByK,EAAwB,IAAlBzK,EAAK9C,UAAoB,IAAM48B,GAAkBU,GAAa,IAEzD,CACV95B,EAAI,EACJ,MAAU+5B,EAAQF,EAAS75B,KACrB+J,EAAIjO,QAAS,IAAMi+B,EAAQ,KAAQ,IACvChwB,GAAOgwB,EAAQ,KAMZD,KADLE,EAAaZ,GAAkBrvB,KAE9BzK,EAAK5B,aAAc,QAASs8B,GAMhC,OAAO/+B,MAGRg/B,YAAa,SAAU73B,GACtB,IAAIy3B,EAASv6B,EAAMyK,EAAK+vB,EAAUC,EAAO/5B,EAAGg6B,EAC3C58B,EAAI,EAEL,GAAKd,EAAY8F,GAChB,OAAOnH,KAAKkE,KAAM,SAAUa,GAC3B/B,EAAQhD,MAAOg/B,YAAa73B,EAAM1G,KAAMT,KAAM+E,EAAGq5B,GAAUp+B,UAI7D,IAAMsE,UAAUhB,OACf,OAAOtD,KAAK+R,KAAM,QAAS,IAK5B,IAFA6sB,EAAUP,GAAgBl3B,IAEb7D,OACZ,MAAUe,EAAOrE,KAAMmC,KAMtB,GALA08B,EAAWT,GAAU/5B,GAGrByK,EAAwB,IAAlBzK,EAAK9C,UAAoB,IAAM48B,GAAkBU,GAAa,IAEzD,CACV95B,EAAI,EACJ,MAAU+5B,EAAQF,EAAS75B,KAG1B,OAA4C,EAApC+J,EAAIjO,QAAS,IAAMi+B,EAAQ,KAClChwB,EAAMA,EAAI5I,QAAS,IAAM44B,EAAQ,IAAK,KAMnCD,KADLE,EAAaZ,GAAkBrvB,KAE9BzK,EAAK5B,aAAc,QAASs8B,GAMhC,OAAO/+B,MAGRi/B,YAAa,SAAU93B,EAAO+3B,GAC7B,IAAIv9B,SAAcwF,EACjBg4B,EAAwB,WAATx9B,GAAqBiE,MAAMC,QAASsB,GAEpD,MAAyB,kBAAb+3B,GAA0BC,EAC9BD,EAAWl/B,KAAK2+B,SAAUx3B,GAAUnH,KAAKg/B,YAAa73B,GAGzD9F,EAAY8F,GACTnH,KAAKkE,KAAM,SAAU/B,GAC3Ba,EAAQhD,MAAOi/B,YACd93B,EAAM1G,KAAMT,KAAMmC,EAAGi8B,GAAUp+B,MAAQk/B,GACvCA,KAKIl/B,KAAKkE,KAAM,WACjB,IAAIgM,EAAW/N,EAAGsY,EAAM2kB,EAExB,GAAKD,EAAe,CAGnBh9B,EAAI,EACJsY,EAAOzX,EAAQhD,MACfo/B,EAAaf,GAAgBl3B,GAE7B,MAAU+I,EAAYkvB,EAAYj9B,KAG5BsY,EAAK4kB,SAAUnvB,GACnBuK,EAAKukB,YAAa9uB,GAElBuK,EAAKkkB,SAAUzuB,aAKIpK,IAAVqB,GAAgC,YAATxF,KAClCuO,EAAYkuB,GAAUp+B,QAIrB4iB,EAASJ,IAAKxiB,KAAM,gBAAiBkQ,GAOjClQ,KAAKyC,cACTzC,KAAKyC,aAAc,QAClByN,IAAuB,IAAV/I,EACZ,GACAyb,EAASjf,IAAK3D,KAAM,kBAAqB,QAO/Cq/B,SAAU,SAAUp8B,GACnB,IAAIiN,EAAW7L,EACdlC,EAAI,EAEL+N,EAAY,IAAMjN,EAAW,IAC7B,MAAUoB,EAAOrE,KAAMmC,KACtB,GAAuB,IAAlBkC,EAAK9C,WACoE,GAA3E,IAAM48B,GAAkBC,GAAU/5B,IAAW,KAAMxD,QAASqP,GAC9D,OAAO,EAIT,OAAO,KAOT,IAAIovB,GAAU,MAEdt8B,EAAOG,GAAGgC,OAAQ,CACjB/C,IAAK,SAAU+E,GACd,IAAIqc,EAAOzf,EAAKurB,EACfjrB,EAAOrE,KAAM,GAEd,OAAMsE,UAAUhB,QA0BhBgsB,EAAkBjuB,EAAY8F,GAEvBnH,KAAKkE,KAAM,SAAU/B,GAC3B,IAAIC,EAEmB,IAAlBpC,KAAKuB,WAWE,OANXa,EADIktB,EACEnoB,EAAM1G,KAAMT,KAAMmC,EAAGa,EAAQhD,MAAOoC,OAEpC+E,GAKN/E,EAAM,GAEoB,iBAARA,EAClBA,GAAO,GAEIwD,MAAMC,QAASzD,KAC1BA,EAAMY,EAAOoB,IAAKhC,EAAK,SAAU+E,GAChC,OAAgB,MAATA,EAAgB,GAAKA,EAAQ,OAItCqc,EAAQxgB,EAAOu8B,SAAUv/B,KAAK2B,OAAUqB,EAAOu8B,SAAUv/B,KAAKqM,SAAS5E,iBAGrD,QAAS+b,QAA+C1d,IAApC0d,EAAMhB,IAAKxiB,KAAMoC,EAAK,WAC3DpC,KAAKmH,MAAQ/E,OAzDTiC,GACJmf,EAAQxgB,EAAOu8B,SAAUl7B,EAAK1C,OAC7BqB,EAAOu8B,SAAUl7B,EAAKgI,SAAS5E,iBAG/B,QAAS+b,QACgC1d,KAAvC/B,EAAMyf,EAAM7f,IAAKU,EAAM,UAElBN,EAMY,iBAHpBA,EAAMM,EAAK8C,OAIHpD,EAAImC,QAASo5B,GAAS,IAIhB,MAAPv7B,EAAc,GAAKA,OAG3B,KAyCHf,EAAOmC,OAAQ,CACdo6B,SAAU,CACTnZ,OAAQ,CACPziB,IAAK,SAAUU,GAEd,IAAIjC,EAAMY,EAAOwN,KAAKuB,KAAM1N,EAAM,SAClC,OAAc,MAAPjC,EACNA,EAMA+7B,GAAkBn7B,EAAOT,KAAM8B,MAGlC2D,OAAQ,CACPrE,IAAK,SAAUU,GACd,IAAI8C,EAAOif,EAAQjkB,EAClBiD,EAAUf,EAAKe,QACfkW,EAAQjX,EAAKwR,cACbyS,EAAoB,eAAdjkB,EAAK1C,KACX6jB,EAAS8C,EAAM,KAAO,GACtB2M,EAAM3M,EAAMhN,EAAQ,EAAIlW,EAAQ9B,OAUjC,IAPCnB,EADImZ,EAAQ,EACR2Z,EAGA3M,EAAMhN,EAAQ,EAIXnZ,EAAI8yB,EAAK9yB,IAKhB,KAJAikB,EAAShhB,EAASjD,IAIJyT,UAAYzT,IAAMmZ,KAG7B8K,EAAOha,YACLga,EAAOxjB,WAAWwJ,WACnBC,EAAU+Z,EAAOxjB,WAAY,aAAiB,CAMjD,GAHAuE,EAAQnE,EAAQojB,GAAShkB,MAGpBkmB,EACJ,OAAOnhB,EAIRqe,EAAO5kB,KAAMuG,GAIf,OAAOqe,GAGRhD,IAAK,SAAUne,EAAM8C,GACpB,IAAIq4B,EAAWpZ,EACdhhB,EAAUf,EAAKe,QACfogB,EAASxiB,EAAO2D,UAAWQ,GAC3BhF,EAAIiD,EAAQ9B,OAEb,MAAQnB,MACPikB,EAAShhB,EAASjD,IAINyT,UACuD,EAAlE5S,EAAO6D,QAAS7D,EAAOu8B,SAASnZ,OAAOziB,IAAKyiB,GAAUZ,MAEtDga,GAAY,GAUd,OAHMA,IACLn7B,EAAKwR,eAAiB,GAEhB2P,OAOXxiB,EAAOkB,KAAM,CAAE,QAAS,YAAc,WACrClB,EAAOu8B,SAAUv/B,MAAS,CACzBwiB,IAAK,SAAUne,EAAM8C,GACpB,GAAKvB,MAAMC,QAASsB,GACnB,OAAS9C,EAAKsR,SAA2D,EAAjD3S,EAAO6D,QAAS7D,EAAQqB,GAAOjC,MAAO+E,KAI3D/F,EAAQm8B,UACbv6B,EAAOu8B,SAAUv/B,MAAO2D,IAAM,SAAUU,GACvC,OAAwC,OAAjCA,EAAK7B,aAAc,SAAqB,KAAO6B,EAAK8C,UAW9D/F,EAAQq+B,QAAU,cAAe1/B,EAGjC,IAAI2/B,GAAc,kCACjBC,GAA0B,SAAUlzB,GACnCA,EAAEsc,mBAGJ/lB,EAAOmC,OAAQnC,EAAOwlB,MAAO,CAE5BU,QAAS,SAAUV,EAAO/F,EAAMpe,EAAMu7B,GAErC,IAAIz9B,EAAG2M,EAAK6B,EAAKkvB,EAAYC,EAAQhW,EAAQ3K,EAAS4gB,EACrDC,EAAY,CAAE37B,GAAQzE,GACtB+B,EAAOX,EAAOP,KAAM+nB,EAAO,QAAWA,EAAM7mB,KAAO6mB,EACnDkB,EAAa1oB,EAAOP,KAAM+nB,EAAO,aAAgBA,EAAM/Y,UAAUlI,MAAO,KAAQ,GAKjF,GAHAuH,EAAMixB,EAAcpvB,EAAMtM,EAAOA,GAAQzE,EAGlB,IAAlByE,EAAK9C,UAAoC,IAAlB8C,EAAK9C,WAK5Bm+B,GAAYjyB,KAAM9L,EAAOqB,EAAOwlB,MAAMuB,cAIf,EAAvBpoB,EAAKd,QAAS,OAIlBc,GADA+nB,EAAa/nB,EAAK4F,MAAO,MACP8G,QAClBqb,EAAWzkB,QAEZ66B,EAASn+B,EAAKd,QAAS,KAAQ,GAAK,KAAOc,GAG3C6mB,EAAQA,EAAOxlB,EAAO+C,SACrByiB,EACA,IAAIxlB,EAAOmmB,MAAOxnB,EAAuB,iBAAV6mB,GAAsBA,IAGhDK,UAAY+W,EAAe,EAAI,EACrCpX,EAAM/Y,UAAYia,EAAW7b,KAAM,KACnC2a,EAAMwC,WAAaxC,EAAM/Y,UACxB,IAAI1F,OAAQ,UAAY2f,EAAW7b,KAAM,iBAAoB,WAC7D,KAGD2a,EAAMjV,YAASzN,EACT0iB,EAAM/iB,SACX+iB,EAAM/iB,OAASpB,GAIhBoe,EAAe,MAARA,EACN,CAAE+F,GACFxlB,EAAO2D,UAAW8b,EAAM,CAAE+F,IAG3BrJ,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GACpCi+B,IAAgBzgB,EAAQ+J,UAAmD,IAAxC/J,EAAQ+J,QAAQvoB,MAAO0D,EAAMoe,IAAtE,CAMA,IAAMmd,IAAiBzgB,EAAQuM,WAAajqB,EAAU4C,GAAS,CAM9D,IAJAw7B,EAAa1gB,EAAQ2J,cAAgBnnB,EAC/B+9B,GAAYjyB,KAAMoyB,EAAal+B,KACpCmN,EAAMA,EAAIlM,YAEHkM,EAAKA,EAAMA,EAAIlM,WACtBo9B,EAAUp/B,KAAMkO,GAChB6B,EAAM7B,EAIF6B,KAAUtM,EAAK6I,eAAiBtN,IACpCogC,EAAUp/B,KAAM+P,EAAIb,aAAea,EAAIsvB,cAAgBlgC,GAKzDoC,EAAI,EACJ,OAAU2M,EAAMkxB,EAAW79B,QAAYqmB,EAAMqC,uBAC5CkV,EAAcjxB,EACd0Z,EAAM7mB,KAAW,EAAJQ,EACZ09B,EACA1gB,EAAQ8K,UAAYtoB,GAGrBmoB,GAAWlH,EAASjf,IAAKmL,EAAK,WAAc1O,OAAOypB,OAAQ,OAAUrB,EAAM7mB,OAC1EihB,EAASjf,IAAKmL,EAAK,YAEnBgb,EAAOnpB,MAAOmO,EAAK2T,IAIpBqH,EAASgW,GAAUhxB,EAAKgxB,KACThW,EAAOnpB,OAASuhB,EAAYpT,KAC1C0Z,EAAMjV,OAASuW,EAAOnpB,MAAOmO,EAAK2T,IACZ,IAAjB+F,EAAMjV,QACViV,EAAMS,kBA8CT,OA1CAT,EAAM7mB,KAAOA,EAGPi+B,GAAiBpX,EAAMuD,sBAEpB5M,EAAQuH,WACqC,IAApDvH,EAAQuH,SAAS/lB,MAAOq/B,EAAU12B,MAAOmZ,KACzCP,EAAY7d,IAIPy7B,GAAUz+B,EAAYgD,EAAM1C,MAAaF,EAAU4C,MAGvDsM,EAAMtM,EAAMy7B,MAGXz7B,EAAMy7B,GAAW,MAIlB98B,EAAOwlB,MAAMuB,UAAYpoB,EAEpB6mB,EAAMqC,wBACVkV,EAAY/vB,iBAAkBrO,EAAMg+B,IAGrCt7B,EAAM1C,KAED6mB,EAAMqC,wBACVkV,EAAYhf,oBAAqBpf,EAAMg+B,IAGxC38B,EAAOwlB,MAAMuB,eAAYjkB,EAEpB6K,IACJtM,EAAMy7B,GAAWnvB,IAMd6X,EAAMjV,SAKd2sB,SAAU,SAAUv+B,EAAM0C,EAAMmkB,GAC/B,IAAI/b,EAAIzJ,EAAOmC,OACd,IAAInC,EAAOmmB,MACXX,EACA,CACC7mB,KAAMA,EACNyqB,aAAa,IAIfppB,EAAOwlB,MAAMU,QAASzc,EAAG,KAAMpI,MAKjCrB,EAAOG,GAAGgC,OAAQ,CAEjB+jB,QAAS,SAAUvnB,EAAM8gB,GACxB,OAAOziB,KAAKkE,KAAM,WACjBlB,EAAOwlB,MAAMU,QAASvnB,EAAM8gB,EAAMziB,SAGpCmgC,eAAgB,SAAUx+B,EAAM8gB,GAC/B,IAAIpe,EAAOrE,KAAM,GACjB,GAAKqE,EACJ,OAAOrB,EAAOwlB,MAAMU,QAASvnB,EAAM8gB,EAAMpe,GAAM,MAc5CjD,EAAQq+B,SACbz8B,EAAOkB,KAAM,CAAEmR,MAAO,UAAW4Y,KAAM,YAAc,SAAUK,EAAM5D,GAGpE,IAAI/b,EAAU,SAAU6Z,GACvBxlB,EAAOwlB,MAAM0X,SAAUxV,EAAKlC,EAAM/iB,OAAQzC,EAAOwlB,MAAMkC,IAAKlC,KAG7DxlB,EAAOwlB,MAAMrJ,QAASuL,GAAQ,CAC7BP,MAAO,WAIN,IAAIjoB,EAAMlC,KAAKkN,eAAiBlN,KAAKJ,UAAYI,KAChDogC,EAAWxd,EAASxB,OAAQlf,EAAKwoB,GAE5B0V,GACLl+B,EAAI8N,iBAAkBse,EAAM3f,GAAS,GAEtCiU,EAASxB,OAAQlf,EAAKwoB,GAAO0V,GAAY,GAAM,IAEhD9V,SAAU,WACT,IAAIpoB,EAAMlC,KAAKkN,eAAiBlN,KAAKJ,UAAYI,KAChDogC,EAAWxd,EAASxB,OAAQlf,EAAKwoB,GAAQ,EAEpC0V,EAKLxd,EAASxB,OAAQlf,EAAKwoB,EAAK0V,IAJ3Bl+B,EAAI6e,oBAAqBuN,EAAM3f,GAAS,GACxCiU,EAAShF,OAAQ1b,EAAKwoB,QAS3B,IAAIvV,GAAWpV,EAAOoV,SAElBtT,GAAQ,CAAEuF,KAAMsB,KAAKyjB,OAErBkU,GAAS,KAKbr9B,EAAOs9B,SAAW,SAAU7d,GAC3B,IAAI3O,EAAKysB,EACT,IAAM9d,GAAwB,iBAATA,EACpB,OAAO,KAKR,IACC3O,GAAM,IAAM/T,EAAOygC,WAAcC,gBAAiBhe,EAAM,YACvD,MAAQhW,IAYV,OAVA8zB,EAAkBzsB,GAAOA,EAAIxG,qBAAsB,eAAiB,GAC9DwG,IAAOysB,GACZv9B,EAAOoD,MAAO,iBACbm6B,EACCv9B,EAAOoB,IAAKm8B,EAAgB/zB,WAAY,SAAUgC,GACjD,OAAOA,EAAG8D,cACPzE,KAAM,MACV4U,IAGI3O,GAIR,IACC4sB,GAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,qCAEhB,SAASC,GAAa/I,EAAQz2B,EAAKy/B,EAAavlB,GAC/C,IAAInW,EAEJ,GAAKO,MAAMC,QAASvE,GAGnB0B,EAAOkB,KAAM5C,EAAK,SAAUa,EAAGia,GACzB2kB,GAAeL,GAASjzB,KAAMsqB,GAGlCvc,EAAKuc,EAAQ3b,GAKb0kB,GACC/I,EAAS,KAAqB,iBAAN3b,GAAuB,MAALA,EAAYja,EAAI,IAAO,IACjEia,EACA2kB,EACAvlB,UAKG,GAAMulB,GAAiC,WAAlBj+B,EAAQxB,GAUnCka,EAAKuc,EAAQz2B,QAPb,IAAM+D,KAAQ/D,EACbw/B,GAAa/I,EAAS,IAAM1yB,EAAO,IAAK/D,EAAK+D,GAAQ07B,EAAavlB,GAYrExY,EAAOg+B,MAAQ,SAAU53B,EAAG23B,GAC3B,IAAIhJ,EACHkJ,EAAI,GACJzlB,EAAM,SAAUrN,EAAK+yB,GAGpB,IAAI/5B,EAAQ9F,EAAY6/B,GACvBA,IACAA,EAEDD,EAAGA,EAAE39B,QAAW69B,mBAAoBhzB,GAAQ,IAC3CgzB,mBAA6B,MAATh6B,EAAgB,GAAKA,IAG5C,GAAU,MAALiC,EACJ,MAAO,GAIR,GAAKxD,MAAMC,QAASuD,IAASA,EAAE5F,SAAWR,EAAO2C,cAAeyD,GAG/DpG,EAAOkB,KAAMkF,EAAG,WACfoS,EAAKxb,KAAKqF,KAAMrF,KAAKmH,cAOtB,IAAM4wB,KAAU3uB,EACf03B,GAAa/I,EAAQ3uB,EAAG2uB,GAAUgJ,EAAavlB,GAKjD,OAAOylB,EAAEpzB,KAAM,MAGhB7K,EAAOG,GAAGgC,OAAQ,CACjBi8B,UAAW,WACV,OAAOp+B,EAAOg+B,MAAOhhC,KAAKqhC,mBAE3BA,eAAgB,WACf,OAAOrhC,KAAKoE,IAAK,WAGhB,IAAI0N,EAAW9O,EAAO0f,KAAM1iB,KAAM,YAClC,OAAO8R,EAAW9O,EAAO2D,UAAWmL,GAAa9R,OAC9CsQ,OAAQ,WACX,IAAI3O,EAAO3B,KAAK2B,KAGhB,OAAO3B,KAAKqF,OAASrC,EAAQhD,MAAOka,GAAI,cACvC2mB,GAAapzB,KAAMzN,KAAKqM,YAAeu0B,GAAgBnzB,KAAM9L,KAC3D3B,KAAK2V,UAAYkQ,GAAepY,KAAM9L,MACtCyC,IAAK,SAAUoD,EAAInD,GACtB,IAAIjC,EAAMY,EAAQhD,MAAOoC,MAEzB,OAAY,MAAPA,EACG,KAGHwD,MAAMC,QAASzD,GACZY,EAAOoB,IAAKhC,EAAK,SAAUA,GACjC,MAAO,CAAEiD,KAAMhB,EAAKgB,KAAM8B,MAAO/E,EAAI8D,QAASy6B,GAAO,WAIhD,CAAEt7B,KAAMhB,EAAKgB,KAAM8B,MAAO/E,EAAI8D,QAASy6B,GAAO,WAClDh9B,SAKN,IACC29B,GAAM,OACNC,GAAQ,OACRC,GAAa,gBACbC,GAAW,6BAIXC,GAAa,iBACbC,GAAY,QAWZrH,GAAa,GAObsH,GAAa,GAGbC,GAAW,KAAKnhC,OAAQ,KAGxBohC,GAAeliC,EAAS0C,cAAe,KAKxC,SAASy/B,GAA6BC,GAGrC,OAAO,SAAUC,EAAoBhkB,GAED,iBAAvBgkB,IACXhkB,EAAOgkB,EACPA,EAAqB,KAGtB,IAAIC,EACH//B,EAAI,EACJggC,EAAYF,EAAmBx6B,cAAcqF,MAAOoP,IAAmB,GAExE,GAAK7a,EAAY4c,GAGhB,MAAUikB,EAAWC,EAAWhgC,KAGR,MAAlB+/B,EAAU,IACdA,EAAWA,EAAS5hC,MAAO,IAAO,KAChC0hC,EAAWE,GAAaF,EAAWE,IAAc,IAAKtwB,QAASqM,KAI/D+jB,EAAWE,GAAaF,EAAWE,IAAc,IAAKthC,KAAMqd,IAQnE,SAASmkB,GAA+BJ,EAAW58B,EAASy1B,EAAiBwH,GAE5E,IAAIC,EAAY,GACfC,EAAqBP,IAAcJ,GAEpC,SAASY,EAASN,GACjB,IAAItsB,EAcJ,OAbA0sB,EAAWJ,IAAa,EACxBl/B,EAAOkB,KAAM89B,EAAWE,IAAc,GAAI,SAAUjlB,EAAGwlB,GACtD,IAAIC,EAAsBD,EAAoBr9B,EAASy1B,EAAiBwH,GACxE,MAAoC,iBAAxBK,GACVH,GAAqBD,EAAWI,GAKtBH,IACD3sB,EAAW8sB,QADf,GAHNt9B,EAAQ+8B,UAAUvwB,QAAS8wB,GAC3BF,EAASE,IACF,KAKF9sB,EAGR,OAAO4sB,EAASp9B,EAAQ+8B,UAAW,MAAUG,EAAW,MAASE,EAAS,KAM3E,SAASG,GAAYl9B,EAAQ7D,GAC5B,IAAIuM,EAAKzI,EACRk9B,EAAc5/B,EAAO6/B,aAAaD,aAAe,GAElD,IAAMz0B,KAAOvM,OACQkE,IAAflE,EAAKuM,MACPy0B,EAAaz0B,GAAQ1I,EAAWC,IAAUA,EAAO,KAAUyI,GAAQvM,EAAKuM,IAO5E,OAJKzI,GACJ1C,EAAOmC,QAAQ,EAAMM,EAAQC,GAGvBD,EA/ERq8B,GAAatsB,KAAOL,GAASK,KAgP7BxS,EAAOmC,OAAQ,CAGd29B,OAAQ,EAGRC,aAAc,GACdC,KAAM,GAENH,aAAc,CACbI,IAAK9tB,GAASK,KACd7T,KAAM,MACNuhC,QAxRgB,4DAwRQz1B,KAAM0H,GAASguB,UACvC3jC,QAAQ,EACR4jC,aAAa,EACbC,OAAO,EACPC,YAAa,mDAcbC,QAAS,CACRnI,IAAKyG,GACLt/B,KAAM,aACNgtB,KAAM,YACNzb,IAAK,4BACL0vB,KAAM,qCAGPxoB,SAAU,CACTlH,IAAK,UACLyb,KAAM,SACNiU,KAAM,YAGPC,eAAgB,CACf3vB,IAAK,cACLvR,KAAM,eACNihC,KAAM,gBAKPE,WAAY,CAGXC,SAAUj4B,OAGVk4B,aAAa,EAGbC,YAAa5gB,KAAKC,MAGlB4gB,WAAY9gC,EAAOs9B,UAOpBsC,YAAa,CACZK,KAAK,EACL//B,SAAS,IAOX6gC,UAAW,SAAUt+B,EAAQu+B,GAC5B,OAAOA,EAGNrB,GAAYA,GAAYl9B,EAAQzC,EAAO6/B,cAAgBmB,GAGvDrB,GAAY3/B,EAAO6/B,aAAcp9B,IAGnCw+B,cAAelC,GAA6BzH,IAC5C4J,cAAenC,GAA6BH,IAG5CuC,KAAM,SAAUlB,EAAK79B,GAGA,iBAAR69B,IACX79B,EAAU69B,EACVA,OAAMn9B,GAIPV,EAAUA,GAAW,GAErB,IAAIg/B,EAGHC,EAGAC,EACAC,EAGAC,EAGAC,EAGA3jB,EAGA4jB,EAGAviC,EAGAwiC,EAGA1D,EAAIj+B,EAAO+gC,UAAW,GAAI3+B,GAG1Bw/B,EAAkB3D,EAAE/9B,SAAW+9B,EAG/B4D,EAAqB5D,EAAE/9B,UACpB0hC,EAAgBrjC,UAAYqjC,EAAgBphC,QAC9CR,EAAQ4hC,GACR5hC,EAAOwlB,MAGRnK,EAAWrb,EAAOgb,WAClB8mB,EAAmB9hC,EAAO+Z,UAAW,eAGrCgoB,EAAa9D,EAAE8D,YAAc,GAG7BC,EAAiB,GACjBC,EAAsB,GAGtBC,EAAW,WAGX7C,EAAQ,CACPnhB,WAAY,EAGZikB,kBAAmB,SAAUh3B,GAC5B,IAAIrB,EACJ,GAAKgU,EAAY,CAChB,IAAMyjB,EAAkB,CACvBA,EAAkB,GAClB,MAAUz3B,EAAQ20B,GAASt0B,KAAMm3B,GAChCC,EAAiBz3B,EAAO,GAAIrF,cAAgB,MACzC88B,EAAiBz3B,EAAO,GAAIrF,cAAgB,MAAS,IACrD/G,OAAQoM,EAAO,IAGpBA,EAAQy3B,EAAiBp2B,EAAI1G,cAAgB,KAE9C,OAAgB,MAATqF,EAAgB,KAAOA,EAAMe,KAAM,OAI3Cu3B,sBAAuB,WACtB,OAAOtkB,EAAYwjB,EAAwB,MAI5Ce,iBAAkB,SAAUhgC,EAAM8B,GAMjC,OALkB,MAAb2Z,IACJzb,EAAO4/B,EAAqB5/B,EAAKoC,eAChCw9B,EAAqB5/B,EAAKoC,gBAAmBpC,EAC9C2/B,EAAgB3/B,GAAS8B,GAEnBnH,MAIRslC,iBAAkB,SAAU3jC,GAI3B,OAHkB,MAAbmf,IACJmgB,EAAEsE,SAAW5jC,GAEP3B,MAIR+kC,WAAY,SAAU3gC,GACrB,IAAIpC,EACJ,GAAKoC,EACJ,GAAK0c,EAGJuhB,EAAMjkB,OAAQha,EAAKi+B,EAAMmD,cAIzB,IAAMxjC,KAAQoC,EACb2gC,EAAY/iC,GAAS,CAAE+iC,EAAY/iC,GAAQoC,EAAKpC,IAInD,OAAOhC,MAIRylC,MAAO,SAAUC,GAChB,IAAIC,EAAYD,GAAcR,EAK9B,OAJKd,GACJA,EAAUqB,MAAOE,GAElB98B,EAAM,EAAG88B,GACF3lC,OAoBV,GAfAqe,EAASzB,QAASylB,GAKlBpB,EAAEgC,MAAUA,GAAOhC,EAAEgC,KAAO9tB,GAASK,MAAS,IAC5CtP,QAASy7B,GAAWxsB,GAASguB,SAAW,MAG1ClC,EAAEt/B,KAAOyD,EAAQuX,QAAUvX,EAAQzD,MAAQs/B,EAAEtkB,QAAUskB,EAAEt/B,KAGzDs/B,EAAEkB,WAAclB,EAAEiB,UAAY,KAAMz6B,cAAcqF,MAAOoP,IAAmB,CAAE,IAGxD,MAAjB+kB,EAAE2E,YAAsB,CAC5BnB,EAAY7kC,EAAS0C,cAAe,KAKpC,IACCmiC,EAAUjvB,KAAOyrB,EAAEgC,IAInBwB,EAAUjvB,KAAOivB,EAAUjvB,KAC3ByrB,EAAE2E,YAAc9D,GAAaqB,SAAW,KAAOrB,GAAa+D,MAC3DpB,EAAUtB,SAAW,KAAOsB,EAAUoB,KACtC,MAAQp5B,GAITw0B,EAAE2E,aAAc,GAalB,GARK3E,EAAExe,MAAQwe,EAAEmC,aAAiC,iBAAXnC,EAAExe,OACxCwe,EAAExe,KAAOzf,EAAOg+B,MAAOC,EAAExe,KAAMwe,EAAEF,cAIlCqB,GAA+B9H,GAAY2G,EAAG77B,EAASi9B,GAGlDvhB,EACJ,OAAOuhB,EA8ER,IAAMlgC,KAzENuiC,EAAc1hC,EAAOwlB,OAASyY,EAAEzhC,SAGQ,GAApBwD,EAAO8/B,UAC1B9/B,EAAOwlB,MAAMU,QAAS,aAIvB+X,EAAEt/B,KAAOs/B,EAAEt/B,KAAKogB,cAGhBkf,EAAE6E,YAAcpE,GAAWj0B,KAAMwzB,EAAEt/B,MAKnC0iC,EAAWpD,EAAEgC,IAAI/8B,QAASq7B,GAAO,IAG3BN,EAAE6E,WAwBI7E,EAAExe,MAAQwe,EAAEmC,aACoD,KAAzEnC,EAAEqC,aAAe,IAAKziC,QAAS,uCACjCogC,EAAExe,KAAOwe,EAAExe,KAAKvc,QAASo7B,GAAK,OAvB9BqD,EAAW1D,EAAEgC,IAAI3iC,MAAO+jC,EAAS/gC,QAG5B29B,EAAExe,OAAUwe,EAAEmC,aAAiC,iBAAXnC,EAAExe,QAC1C4hB,IAAchE,GAAO5yB,KAAM42B,GAAa,IAAM,KAAQpD,EAAExe,YAGjDwe,EAAExe,OAIO,IAAZwe,EAAE/yB,QACNm2B,EAAWA,EAASn+B,QAASs7B,GAAY,MACzCmD,GAAatE,GAAO5yB,KAAM42B,GAAa,IAAM,KAAQ,KAASxiC,GAAMuF,OACnEu9B,GAIF1D,EAAEgC,IAAMoB,EAAWM,GASf1D,EAAE8E,aACD/iC,EAAO+/B,aAAcsB,IACzBhC,EAAMgD,iBAAkB,oBAAqBriC,EAAO+/B,aAAcsB,IAE9DrhC,EAAOggC,KAAMqB,IACjBhC,EAAMgD,iBAAkB,gBAAiBriC,EAAOggC,KAAMqB,MAKnDpD,EAAExe,MAAQwe,EAAE6E,aAAgC,IAAlB7E,EAAEqC,aAAyBl+B,EAAQk+B,cACjEjB,EAAMgD,iBAAkB,eAAgBpE,EAAEqC,aAI3CjB,EAAMgD,iBACL,SACApE,EAAEkB,UAAW,IAAOlB,EAAEsC,QAAStC,EAAEkB,UAAW,IAC3ClB,EAAEsC,QAAStC,EAAEkB,UAAW,KACA,MAArBlB,EAAEkB,UAAW,GAAc,KAAON,GAAW,WAAa,IAC7DZ,EAAEsC,QAAS,MAIFtC,EAAE+E,QACZ3D,EAAMgD,iBAAkBljC,EAAG8+B,EAAE+E,QAAS7jC,IAIvC,GAAK8+B,EAAEgF,cAC+C,IAAnDhF,EAAEgF,WAAWxlC,KAAMmkC,EAAiBvC,EAAOpB,IAAiBngB,GAG9D,OAAOuhB,EAAMoD,QAed,GAXAP,EAAW,QAGXJ,EAAiBtpB,IAAKylB,EAAEhG,UACxBoH,EAAMx5B,KAAMo4B,EAAEiF,SACd7D,EAAMxlB,KAAMokB,EAAE76B,OAGdg+B,EAAYhC,GAA+BR,GAAYX,EAAG77B,EAASi9B,GAK5D,CASN,GARAA,EAAMnhB,WAAa,EAGdwjB,GACJG,EAAmB3b,QAAS,WAAY,CAAEmZ,EAAOpB,IAI7CngB,EACJ,OAAOuhB,EAIHpB,EAAEoC,OAAqB,EAAZpC,EAAE5D,UACjBmH,EAAezkC,EAAO+f,WAAY,WACjCuiB,EAAMoD,MAAO,YACXxE,EAAE5D,UAGN,IACCvc,GAAY,EACZsjB,EAAU+B,KAAMnB,EAAgBn8B,GAC/B,MAAQ4D,GAGT,GAAKqU,EACJ,MAAMrU,EAIP5D,GAAO,EAAG4D,SAhCX5D,GAAO,EAAG,gBAqCX,SAASA,EAAM28B,EAAQY,EAAkBC,EAAWL,GACnD,IAAIM,EAAWJ,EAAS9/B,EAAOmgC,EAAUC,EACxCd,EAAaU,EAGTtlB,IAILA,GAAY,EAGP0jB,GACJzkC,EAAOu9B,aAAckH,GAKtBJ,OAAYt+B,EAGZw+B,EAAwB0B,GAAW,GAGnC3D,EAAMnhB,WAAsB,EAATskB,EAAa,EAAI,EAGpCc,EAAsB,KAAVd,GAAiBA,EAAS,KAAkB,MAAXA,EAGxCa,IACJE,EA7lBJ,SAA8BtF,EAAGoB,EAAOgE,GAEvC,IAAII,EAAI9kC,EAAM+kC,EAAeC,EAC5B3rB,EAAWimB,EAAEjmB,SACbmnB,EAAYlB,EAAEkB,UAGf,MAA2B,MAAnBA,EAAW,GAClBA,EAAU9zB,aACEvI,IAAP2gC,IACJA,EAAKxF,EAAEsE,UAAYlD,EAAM8C,kBAAmB,iBAK9C,GAAKsB,EACJ,IAAM9kC,KAAQqZ,EACb,GAAKA,EAAUrZ,IAAUqZ,EAAUrZ,GAAO8L,KAAMg5B,GAAO,CACtDtE,EAAUvwB,QAASjQ,GACnB,MAMH,GAAKwgC,EAAW,KAAOkE,EACtBK,EAAgBvE,EAAW,OACrB,CAGN,IAAMxgC,KAAQ0kC,EAAY,CACzB,IAAMlE,EAAW,IAAOlB,EAAEyC,WAAY/hC,EAAO,IAAMwgC,EAAW,IAAQ,CACrEuE,EAAgB/kC,EAChB,MAEKglC,IACLA,EAAgBhlC,GAKlB+kC,EAAgBA,GAAiBC,EAMlC,GAAKD,EAIJ,OAHKA,IAAkBvE,EAAW,IACjCA,EAAUvwB,QAAS80B,GAEbL,EAAWK,GA0iBLE,CAAqB3F,EAAGoB,EAAOgE,KAIrCC,IACsC,EAA3CtjC,EAAO6D,QAAS,SAAUo6B,EAAEkB,YAC5Bn/B,EAAO6D,QAAS,OAAQo6B,EAAEkB,WAAc,IACxClB,EAAEyC,WAAY,eAAkB,cAIjC6C,EA9iBH,SAAsBtF,EAAGsF,EAAUlE,EAAOiE,GACzC,IAAIO,EAAOC,EAASC,EAAMp2B,EAAKsK,EAC9ByoB,EAAa,GAGbvB,EAAYlB,EAAEkB,UAAU7hC,QAGzB,GAAK6hC,EAAW,GACf,IAAM4E,KAAQ9F,EAAEyC,WACfA,EAAYqD,EAAKt/B,eAAkBw5B,EAAEyC,WAAYqD,GAInDD,EAAU3E,EAAU9zB,QAGpB,MAAQy4B,EAcP,GAZK7F,EAAEwC,eAAgBqD,KACtBzE,EAAOpB,EAAEwC,eAAgBqD,IAAcP,IAIlCtrB,GAAQqrB,GAAarF,EAAE+F,aAC5BT,EAAWtF,EAAE+F,WAAYT,EAAUtF,EAAEiB,WAGtCjnB,EAAO6rB,EACPA,EAAU3E,EAAU9zB,QAKnB,GAAiB,MAAZy4B,EAEJA,EAAU7rB,OAGJ,GAAc,MAATA,GAAgBA,IAAS6rB,EAAU,CAM9C,KAHAC,EAAOrD,EAAYzoB,EAAO,IAAM6rB,IAAapD,EAAY,KAAOoD,IAI/D,IAAMD,KAASnD,EAId,IADA/yB,EAAMk2B,EAAMt/B,MAAO,MACT,KAAQu/B,IAGjBC,EAAOrD,EAAYzoB,EAAO,IAAMtK,EAAK,KACpC+yB,EAAY,KAAO/yB,EAAK,KACb,EAGG,IAATo2B,EACJA,EAAOrD,EAAYmD,IAGgB,IAAxBnD,EAAYmD,KACvBC,EAAUn2B,EAAK,GACfwxB,EAAUvwB,QAASjB,EAAK,KAEzB,MAOJ,IAAc,IAATo2B,EAGJ,GAAKA,GAAQ9F,EAAEgG,UACdV,EAAWQ,EAAMR,QAEjB,IACCA,EAAWQ,EAAMR,GAChB,MAAQ95B,GACT,MAAO,CACN0R,MAAO,cACP/X,MAAO2gC,EAAOt6B,EAAI,sBAAwBwO,EAAO,OAAS6rB,IASjE,MAAO,CAAE3oB,MAAO,UAAWsE,KAAM8jB,GAidpBW,CAAajG,EAAGsF,EAAUlE,EAAOiE,GAGvCA,GAGCrF,EAAE8E,cACNS,EAAWnE,EAAM8C,kBAAmB,oBAEnCniC,EAAO+/B,aAAcsB,GAAamC,IAEnCA,EAAWnE,EAAM8C,kBAAmB,WAEnCniC,EAAOggC,KAAMqB,GAAamC,IAKZ,MAAXhB,GAA6B,SAAXvE,EAAEt/B,KACxB+jC,EAAa,YAGS,MAAXF,EACXE,EAAa,eAIbA,EAAaa,EAASpoB,MACtB+nB,EAAUK,EAAS9jB,KAEnB6jB,IADAlgC,EAAQmgC,EAASngC,UAMlBA,EAAQs/B,GACHF,GAAWE,IACfA,EAAa,QACRF,EAAS,IACbA,EAAS,KAMZnD,EAAMmD,OAASA,EACfnD,EAAMqD,YAAeU,GAAoBV,GAAe,GAGnDY,EACJjoB,EAASmB,YAAaolB,EAAiB,CAAEsB,EAASR,EAAYrD,IAE9DhkB,EAASuB,WAAYglB,EAAiB,CAAEvC,EAAOqD,EAAYt/B,IAI5Di8B,EAAM0C,WAAYA,GAClBA,OAAaj/B,EAER4+B,GACJG,EAAmB3b,QAASod,EAAY,cAAgB,YACvD,CAAEjE,EAAOpB,EAAGqF,EAAYJ,EAAU9/B,IAIpC0+B,EAAiB/mB,SAAU6mB,EAAiB,CAAEvC,EAAOqD,IAEhDhB,IACJG,EAAmB3b,QAAS,eAAgB,CAAEmZ,EAAOpB,MAG3Cj+B,EAAO8/B,QAChB9/B,EAAOwlB,MAAMU,QAAS,cAKzB,OAAOmZ,GAGR8E,QAAS,SAAUlE,EAAKxgB,EAAMte,GAC7B,OAAOnB,EAAOW,IAAKs/B,EAAKxgB,EAAMte,EAAU,SAGzCijC,UAAW,SAAUnE,EAAK9+B,GACzB,OAAOnB,EAAOW,IAAKs/B,OAAKn9B,EAAW3B,EAAU,aAI/CnB,EAAOkB,KAAM,CAAE,MAAO,QAAU,SAAUsD,EAAImV,GAC7C3Z,EAAQ2Z,GAAW,SAAUsmB,EAAKxgB,EAAMte,EAAUxC,GAUjD,OAPKN,EAAYohB,KAChB9gB,EAAOA,GAAQwC,EACfA,EAAWse,EACXA,OAAO3c,GAID9C,EAAOmhC,KAAMnhC,EAAOmC,OAAQ,CAClC89B,IAAKA,EACLthC,KAAMgb,EACNulB,SAAUvgC,EACV8gB,KAAMA,EACNyjB,QAAS/hC,GACPnB,EAAO2C,cAAes9B,IAASA,OAIpCjgC,EAAOihC,cAAe,SAAUhD,GAC/B,IAAI9+B,EACJ,IAAMA,KAAK8+B,EAAE+E,QACa,iBAApB7jC,EAAEsF,gBACNw5B,EAAEqC,YAAcrC,EAAE+E,QAAS7jC,IAAO,MAMrCa,EAAOwsB,SAAW,SAAUyT,EAAK79B,EAASlD,GACzC,OAAOc,EAAOmhC,KAAM,CACnBlB,IAAKA,EAGLthC,KAAM,MACNugC,SAAU,SACVh0B,OAAO,EACPm1B,OAAO,EACP7jC,QAAQ,EAKRkkC,WAAY,CACX2D,cAAe,cAEhBL,WAAY,SAAUT,GACrBvjC,EAAO0D,WAAY6/B,EAAUnhC,EAASlD,OAMzCc,EAAOG,GAAGgC,OAAQ,CACjBmiC,QAAS,SAAU/X,GAClB,IAAI/H,EAyBJ,OAvBKxnB,KAAM,KACLqB,EAAYkuB,KAChBA,EAAOA,EAAK9uB,KAAMT,KAAM,KAIzBwnB,EAAOxkB,EAAQusB,EAAMvvB,KAAM,GAAIkN,eAAgB1I,GAAI,GAAIgB,OAAO,GAEzDxF,KAAM,GAAI4C,YACd4kB,EAAK2I,aAAcnwB,KAAM,IAG1BwnB,EAAKpjB,IAAK,WACT,IAAIC,EAAOrE,KAEX,MAAQqE,EAAKkjC,kBACZljC,EAAOA,EAAKkjC,kBAGb,OAAOljC,IACJ4rB,OAAQjwB,OAGNA,MAGRwnC,UAAW,SAAUjY,GACpB,OAAKluB,EAAYkuB,GACTvvB,KAAKkE,KAAM,SAAU/B,GAC3Ba,EAAQhD,MAAOwnC,UAAWjY,EAAK9uB,KAAMT,KAAMmC,MAItCnC,KAAKkE,KAAM,WACjB,IAAIuW,EAAOzX,EAAQhD,MAClBgb,EAAWP,EAAKO,WAEZA,EAAS1X,OACb0X,EAASssB,QAAS/X,GAGlB9U,EAAKwV,OAAQV,MAKhB/H,KAAM,SAAU+H,GACf,IAAIkY,EAAiBpmC,EAAYkuB,GAEjC,OAAOvvB,KAAKkE,KAAM,SAAU/B,GAC3Ba,EAAQhD,MAAOsnC,QAASG,EAAiBlY,EAAK9uB,KAAMT,KAAMmC,GAAMotB,MAIlEmY,OAAQ,SAAUzkC,GAIjB,OAHAjD,KAAKmU,OAAQlR,GAAW2R,IAAK,QAAS1Q,KAAM,WAC3ClB,EAAQhD,MAAOswB,YAAatwB,KAAKwM,cAE3BxM,QAKTgD,EAAO6O,KAAKhI,QAAQ4vB,OAAS,SAAUp1B,GACtC,OAAQrB,EAAO6O,KAAKhI,QAAQ89B,QAAStjC,IAEtCrB,EAAO6O,KAAKhI,QAAQ89B,QAAU,SAAUtjC,GACvC,SAAWA,EAAKuuB,aAAevuB,EAAK0vB,cAAgB1vB,EAAKyxB,iBAAiBxyB,SAM3EN,EAAO6/B,aAAa+E,IAAM,WACzB,IACC,OAAO,IAAI7nC,EAAO8nC,eACjB,MAAQp7B,MAGX,IAAIq7B,GAAmB,CAGrBC,EAAG,IAIHC,KAAM,KAEPC,GAAejlC,EAAO6/B,aAAa+E,MAEpCxmC,EAAQ8mC,OAASD,IAAkB,oBAAqBA,GACxD7mC,EAAQ+iC,KAAO8D,KAAiBA,GAEhCjlC,EAAOkhC,cAAe,SAAU9+B,GAC/B,IAAIjB,EAAUgkC,EAGd,GAAK/mC,EAAQ8mC,MAAQD,KAAiB7iC,EAAQwgC,YAC7C,MAAO,CACNO,KAAM,SAAUH,EAAS/K,GACxB,IAAI94B,EACHylC,EAAMxiC,EAAQwiC,MAWf,GATAA,EAAIQ,KACHhjC,EAAQzD,KACRyD,EAAQ69B,IACR79B,EAAQi+B,MACRj+B,EAAQijC,SACRjjC,EAAQmR,UAIJnR,EAAQkjC,UACZ,IAAMnmC,KAAKiD,EAAQkjC,UAClBV,EAAKzlC,GAAMiD,EAAQkjC,UAAWnmC,GAmBhC,IAAMA,KAdDiD,EAAQmgC,UAAYqC,EAAItC,kBAC5BsC,EAAItC,iBAAkBlgC,EAAQmgC,UAQzBngC,EAAQwgC,aAAgBI,EAAS,sBACtCA,EAAS,oBAAuB,kBAItBA,EACV4B,EAAIvC,iBAAkBljC,EAAG6jC,EAAS7jC,IAInCgC,EAAW,SAAUxC,GACpB,OAAO,WACDwC,IACJA,EAAWgkC,EAAgBP,EAAIW,OAC9BX,EAAIY,QAAUZ,EAAIa,QAAUb,EAAIc,UAC/Bd,EAAIe,mBAAqB,KAEb,UAAThnC,EACJimC,EAAInC,QACgB,UAAT9jC,EAKgB,iBAAfimC,EAAIpC,OACfvK,EAAU,EAAG,SAEbA,EAGC2M,EAAIpC,OACJoC,EAAIlC,YAINzK,EACC6M,GAAkBF,EAAIpC,SAAYoC,EAAIpC,OACtCoC,EAAIlC,WAK+B,UAAjCkC,EAAIgB,cAAgB,SACM,iBAArBhB,EAAIiB,aACV,CAAEC,OAAQlB,EAAIrB,UACd,CAAEhkC,KAAMqlC,EAAIiB,cACbjB,EAAIxC,4BAQTwC,EAAIW,OAASpkC,IACbgkC,EAAgBP,EAAIY,QAAUZ,EAAIc,UAAYvkC,EAAU,cAKnC2B,IAAhB8hC,EAAIa,QACRb,EAAIa,QAAUN,EAEdP,EAAIe,mBAAqB,WAGA,IAAnBf,EAAI1mB,YAMRnhB,EAAO+f,WAAY,WACb3b,GACJgkC,OAQLhkC,EAAWA,EAAU,SAErB,IAGCyjC,EAAIzB,KAAM/gC,EAAQ0gC,YAAc1gC,EAAQqd,MAAQ,MAC/C,MAAQhW,GAGT,GAAKtI,EACJ,MAAMsI,IAKTg5B,MAAO,WACDthC,GACJA,QAWLnB,EAAOihC,cAAe,SAAUhD,GAC1BA,EAAE2E,cACN3E,EAAEjmB,SAAS3Y,QAAS,KAKtBW,EAAO+gC,UAAW,CACjBR,QAAS,CACRlhC,OAAQ,6FAGT2Y,SAAU,CACT3Y,OAAQ,2BAETqhC,WAAY,CACX2D,cAAe,SAAU9kC,GAExB,OADAS,EAAO0D,WAAYnE,GACZA,MAMVS,EAAOihC,cAAe,SAAU,SAAUhD,QACxBn7B,IAAZm7B,EAAE/yB,QACN+yB,EAAE/yB,OAAQ,GAEN+yB,EAAE2E,cACN3E,EAAEt/B,KAAO,SAKXqB,EAAOkhC,cAAe,SAAU,SAAUjD,GAIxC,IAAI5+B,EAAQ8B,EADb,GAAK88B,EAAE2E,aAAe3E,EAAE8H,YAEvB,MAAO,CACN5C,KAAM,SAAUlpB,EAAGge,GAClB54B,EAASW,EAAQ,YACf+O,KAAMkvB,EAAE8H,aAAe,IACvBrmB,KAAM,CAAEsmB,QAAS/H,EAAEgI,cAAernC,IAAKq/B,EAAEgC,MACzC7a,GAAI,aAAcjkB,EAAW,SAAU+kC,GACvC7mC,EAAOub,SACPzZ,EAAW,KACN+kC,GACJjO,EAAuB,UAAbiO,EAAIvnC,KAAmB,IAAM,IAAKunC,EAAIvnC,QAKnD/B,EAAS8C,KAAKC,YAAaN,EAAQ,KAEpCojC,MAAO,WACDthC,GACJA,QAUL,IAqGKshB,GArGD0jB,GAAe,GAClBC,GAAS,oBAGVpmC,EAAO+gC,UAAW,CACjBsF,MAAO,WACPC,cAAe,WACd,IAAInlC,EAAWglC,GAAa7/B,OAAWtG,EAAO+C,QAAU,IAAQlE,GAAMuF,OAEtE,OADApH,KAAMmE,IAAa,EACZA,KAKTnB,EAAOihC,cAAe,aAAc,SAAUhD,EAAGsI,EAAkBlH,GAElE,IAAImH,EAAcC,EAAaC,EAC9BC,GAAuB,IAAZ1I,EAAEoI,QAAqBD,GAAO37B,KAAMwzB,EAAEgC,KAChD,MACkB,iBAAXhC,EAAExe,MAE6C,KADnDwe,EAAEqC,aAAe,IACjBziC,QAAS,sCACXuoC,GAAO37B,KAAMwzB,EAAExe,OAAU,QAI5B,GAAKknB,GAAiC,UAArB1I,EAAEkB,UAAW,GA8D7B,OA3DAqH,EAAevI,EAAEqI,cAAgBjoC,EAAY4/B,EAAEqI,eAC9CrI,EAAEqI,gBACFrI,EAAEqI,cAGEK,EACJ1I,EAAG0I,GAAa1I,EAAG0I,GAAWzjC,QAASkjC,GAAQ,KAAOI,IAC/B,IAAZvI,EAAEoI,QACbpI,EAAEgC,MAAS5C,GAAO5yB,KAAMwzB,EAAEgC,KAAQ,IAAM,KAAQhC,EAAEoI,MAAQ,IAAMG,GAIjEvI,EAAEyC,WAAY,eAAkB,WAI/B,OAHMgG,GACL1mC,EAAOoD,MAAOojC,EAAe,mBAEvBE,EAAmB,IAI3BzI,EAAEkB,UAAW,GAAM,OAGnBsH,EAAc1pC,EAAQypC,GACtBzpC,EAAQypC,GAAiB,WACxBE,EAAoBplC,WAIrB+9B,EAAMjkB,OAAQ,gBAGQtY,IAAhB2jC,EACJzmC,EAAQjD,GAASu+B,WAAYkL,GAI7BzpC,EAAQypC,GAAiBC,EAIrBxI,EAAGuI,KAGPvI,EAAEqI,cAAgBC,EAAiBD,cAGnCH,GAAavoC,KAAM4oC,IAIfE,GAAqBroC,EAAYooC,IACrCA,EAAaC,EAAmB,IAGjCA,EAAoBD,OAAc3jC,IAI5B,WAYT1E,EAAQwoC,qBACHnkB,GAAO7lB,EAASiqC,eAAeD,mBAAoB,IAAKnkB,MACvD5U,UAAY,6BACiB,IAA3B4U,GAAKjZ,WAAWlJ,QAQxBN,EAAO2X,UAAY,SAAU8H,EAAMvf,EAAS4mC,GAC3C,MAAqB,iBAATrnB,EACJ,IAEgB,kBAAZvf,IACX4mC,EAAc5mC,EACdA,GAAU,GAKLA,IAIA9B,EAAQwoC,qBAMZ/yB,GALA3T,EAAUtD,EAASiqC,eAAeD,mBAAoB,KAKvCtnC,cAAe,SACzBkT,KAAO5V,EAASuV,SAASK,KAC9BtS,EAAQR,KAAKC,YAAakU,IAE1B3T,EAAUtD,GAKZynB,GAAWyiB,GAAe,IAD1BC,EAASzvB,EAAWnN,KAAMsV,IAKlB,CAAEvf,EAAQZ,cAAeynC,EAAQ,MAGzCA,EAAS3iB,GAAe,CAAE3E,GAAQvf,EAASmkB,GAEtCA,GAAWA,EAAQ/jB,QACvBN,EAAQqkB,GAAUzJ,SAGZ5a,EAAOgB,MAAO,GAAI+lC,EAAOv9B,cAlChC,IAAIqK,EAAMkzB,EAAQ1iB,GAyCnBrkB,EAAOG,GAAGsoB,KAAO,SAAUwX,EAAK+G,EAAQ7lC,GACvC,IAAIlB,EAAUtB,EAAM4kC,EACnB9rB,EAAOza,KACPyoB,EAAMwa,EAAIpiC,QAAS,KAsDpB,OApDY,EAAP4nB,IACJxlB,EAAWk7B,GAAkB8E,EAAI3iC,MAAOmoB,IACxCwa,EAAMA,EAAI3iC,MAAO,EAAGmoB,IAIhBpnB,EAAY2oC,IAGhB7lC,EAAW6lC,EACXA,OAASlkC,GAGEkkC,GAA4B,iBAAXA,IAC5BroC,EAAO,QAIW,EAAd8Y,EAAKnX,QACTN,EAAOmhC,KAAM,CACZlB,IAAKA,EAKLthC,KAAMA,GAAQ,MACdugC,SAAU,OACVzf,KAAMunB,IACHnhC,KAAM,SAAUggC,GAGnBtC,EAAWjiC,UAEXmW,EAAK8U,KAAMtsB,EAIVD,EAAQ,SAAUitB,OAAQjtB,EAAO2X,UAAWkuB,IAAiBr4B,KAAMvN,GAGnE4lC,KAKEzqB,OAAQja,GAAY,SAAUk+B,EAAOmD,GACxC/qB,EAAKvW,KAAM,WACVC,EAASxD,MAAOX,KAAMumC,GAAY,CAAElE,EAAMwG,aAAcrD,EAAQnD,QAK5DriC,MAMRgD,EAAO6O,KAAKhI,QAAQogC,SAAW,SAAU5lC,GACxC,OAAOrB,EAAO2B,KAAM3B,EAAOy5B,OAAQ,SAAUt5B,GAC5C,OAAOkB,IAASlB,EAAGkB,OAChBf,QAMLN,EAAOknC,OAAS,CACfC,UAAW,SAAU9lC,EAAMe,EAASjD,GACnC,IAAIioC,EAAaC,EAASC,EAAWC,EAAQC,EAAWC,EACvD/X,EAAW1vB,EAAOyhB,IAAKpgB,EAAM,YAC7BqmC,EAAU1nC,EAAQqB,GAClBynB,EAAQ,GAGS,WAAb4G,IACJruB,EAAKkgB,MAAMmO,SAAW,YAGvB8X,EAAYE,EAAQR,SACpBI,EAAYtnC,EAAOyhB,IAAKpgB,EAAM,OAC9BomC,EAAaznC,EAAOyhB,IAAKpgB,EAAM,SACI,aAAbquB,GAAwC,UAAbA,KACA,GAA9C4X,EAAYG,GAAa5pC,QAAS,SAMpC0pC,GADAH,EAAcM,EAAQhY,YACD3iB,IACrBs6B,EAAUD,EAAYzS,OAGtB4S,EAASxX,WAAYuX,IAAe,EACpCD,EAAUtX,WAAY0X,IAAgB,GAGlCppC,EAAY+D,KAGhBA,EAAUA,EAAQ3E,KAAM4D,EAAMlC,EAAGa,EAAOmC,OAAQ,GAAIqlC,KAGjC,MAAfplC,EAAQ2K,MACZ+b,EAAM/b,IAAQ3K,EAAQ2K,IAAMy6B,EAAUz6B,IAAQw6B,GAE1B,MAAhBnlC,EAAQuyB,OACZ7L,EAAM6L,KAASvyB,EAAQuyB,KAAO6S,EAAU7S,KAAS0S,GAG7C,UAAWjlC,EACfA,EAAQulC,MAAMlqC,KAAM4D,EAAMynB,GAG1B4e,EAAQjmB,IAAKqH,KAKhB9oB,EAAOG,GAAGgC,OAAQ,CAGjB+kC,OAAQ,SAAU9kC,GAGjB,GAAKd,UAAUhB,OACd,YAAmBwC,IAAZV,EACNpF,KACAA,KAAKkE,KAAM,SAAU/B,GACpBa,EAAOknC,OAAOC,UAAWnqC,KAAMoF,EAASjD,KAI3C,IAAIyoC,EAAMC,EACTxmC,EAAOrE,KAAM,GAEd,OAAMqE,EAQAA,EAAKyxB,iBAAiBxyB,QAK5BsnC,EAAOvmC,EAAKozB,wBACZoT,EAAMxmC,EAAK6I,cAAc4C,YAClB,CACNC,IAAK66B,EAAK76B,IAAM86B,EAAIC,YACpBnT,KAAMiT,EAAKjT,KAAOkT,EAAIE,cARf,CAAEh7B,IAAK,EAAG4nB,KAAM,QATxB,GAuBDjF,SAAU,WACT,GAAM1yB,KAAM,GAAZ,CAIA,IAAIgrC,EAAcd,EAAQhoC,EACzBmC,EAAOrE,KAAM,GACbirC,EAAe,CAAEl7B,IAAK,EAAG4nB,KAAM,GAGhC,GAAwC,UAAnC30B,EAAOyhB,IAAKpgB,EAAM,YAGtB6lC,EAAS7lC,EAAKozB,4BAER,CACNyS,EAASlqC,KAAKkqC,SAIdhoC,EAAMmC,EAAK6I,cACX89B,EAAe3mC,EAAK2mC,cAAgB9oC,EAAIyN,gBACxC,MAAQq7B,IACLA,IAAiB9oC,EAAIujB,MAAQulB,IAAiB9oC,EAAIyN,kBACT,WAA3C3M,EAAOyhB,IAAKumB,EAAc,YAE1BA,EAAeA,EAAapoC,WAExBooC,GAAgBA,IAAiB3mC,GAAkC,IAA1B2mC,EAAazpC,YAG1D0pC,EAAejoC,EAAQgoC,GAAed,UACzBn6B,KAAO/M,EAAOyhB,IAAKumB,EAAc,kBAAkB,GAChEC,EAAatT,MAAQ30B,EAAOyhB,IAAKumB,EAAc,mBAAmB,IAKpE,MAAO,CACNj7B,IAAKm6B,EAAOn6B,IAAMk7B,EAAal7B,IAAM/M,EAAOyhB,IAAKpgB,EAAM,aAAa,GACpEszB,KAAMuS,EAAOvS,KAAOsT,EAAatT,KAAO30B,EAAOyhB,IAAKpgB,EAAM,cAAc,MAc1E2mC,aAAc,WACb,OAAOhrC,KAAKoE,IAAK,WAChB,IAAI4mC,EAAehrC,KAAKgrC,aAExB,MAAQA,GAA2D,WAA3ChoC,EAAOyhB,IAAKumB,EAAc,YACjDA,EAAeA,EAAaA,aAG7B,OAAOA,GAAgBr7B,QAM1B3M,EAAOkB,KAAM,CAAE20B,WAAY,cAAeD,UAAW,eAAiB,SAAUjc,EAAQ+F,GACvF,IAAI3S,EAAM,gBAAkB2S,EAE5B1f,EAAOG,GAAIwZ,GAAW,SAAUva,GAC/B,OAAOgf,EAAQphB,KAAM,SAAUqE,EAAMsY,EAAQva,GAG5C,IAAIyoC,EAOJ,GANKppC,EAAU4C,GACdwmC,EAAMxmC,EACuB,IAAlBA,EAAK9C,WAChBspC,EAAMxmC,EAAKyL,kBAGChK,IAAR1D,EACJ,OAAOyoC,EAAMA,EAAKnoB,GAASre,EAAMsY,GAG7BkuB,EACJA,EAAIK,SACFn7B,EAAY86B,EAAIE,YAAV3oC,EACP2N,EAAM3N,EAAMyoC,EAAIC,aAIjBzmC,EAAMsY,GAAWva,GAEhBua,EAAQva,EAAKkC,UAAUhB,WAU5BN,EAAOkB,KAAM,CAAE,MAAO,QAAU,SAAUsD,EAAIkb,GAC7C1f,EAAOizB,SAAUvT,GAASkP,GAAcxwB,EAAQgyB,cAC/C,SAAU/uB,EAAMitB,GACf,GAAKA,EAIJ,OAHAA,EAAWD,GAAQhtB,EAAMqe,GAGlBoO,GAAUrjB,KAAM6jB,GACtBtuB,EAAQqB,GAAOquB,WAAYhQ,GAAS,KACpC4O,MAQLtuB,EAAOkB,KAAM,CAAEinC,OAAQ,SAAUC,MAAO,SAAW,SAAU/lC,EAAM1D,GAClEqB,EAAOkB,KAAM,CACZ2zB,QAAS,QAAUxyB,EACnB2W,QAASra,EACT0pC,GAAI,QAAUhmC,GACZ,SAAUimC,EAAcC,GAG1BvoC,EAAOG,GAAIooC,GAAa,SAAU3T,EAAQzwB,GACzC,IAAIka,EAAY/c,UAAUhB,SAAYgoC,GAAkC,kBAAX1T,GAC5DpC,EAAQ8V,KAA6B,IAAX1T,IAA6B,IAAVzwB,EAAiB,SAAW,UAE1E,OAAOia,EAAQphB,KAAM,SAAUqE,EAAM1C,EAAMwF,GAC1C,IAAIjF,EAEJ,OAAKT,EAAU4C,GAGyB,IAAhCknC,EAAS1qC,QAAS,SACxBwD,EAAM,QAAUgB,GAChBhB,EAAKzE,SAAS+P,gBAAiB,SAAWtK,GAIrB,IAAlBhB,EAAK9C,UACTW,EAAMmC,EAAKsL,gBAIJ3J,KAAKivB,IACX5wB,EAAKohB,KAAM,SAAWpgB,GAAQnD,EAAK,SAAWmD,GAC9ChB,EAAKohB,KAAM,SAAWpgB,GAAQnD,EAAK,SAAWmD,GAC9CnD,EAAK,SAAWmD,UAIDS,IAAVqB,EAGNnE,EAAOyhB,IAAKpgB,EAAM1C,EAAM6zB,GAGxBxyB,EAAOuhB,MAAOlgB,EAAM1C,EAAMwF,EAAOquB,IAChC7zB,EAAM0f,EAAYuW,OAAS9xB,EAAWub,QAM5Cre,EAAOkB,KAAM,CACZ,YACA,WACA,eACA,YACA,cACA,YACE,SAAUsD,EAAI7F,GAChBqB,EAAOG,GAAIxB,GAAS,SAAUwB,GAC7B,OAAOnD,KAAKooB,GAAIzmB,EAAMwB,MAOxBH,EAAOG,GAAGgC,OAAQ,CAEjB61B,KAAM,SAAU3S,EAAO5F,EAAMtf,GAC5B,OAAOnD,KAAKooB,GAAIC,EAAO,KAAM5F,EAAMtf,IAEpCqoC,OAAQ,SAAUnjB,EAAOllB,GACxB,OAAOnD,KAAKyoB,IAAKJ,EAAO,KAAMllB,IAG/BsoC,SAAU,SAAUxoC,EAAUolB,EAAO5F,EAAMtf,GAC1C,OAAOnD,KAAKooB,GAAIC,EAAOplB,EAAUwf,EAAMtf,IAExCuoC,WAAY,SAAUzoC,EAAUolB,EAAOllB,GAGtC,OAA4B,IAArBmB,UAAUhB,OAChBtD,KAAKyoB,IAAKxlB,EAAU,MACpBjD,KAAKyoB,IAAKJ,EAAOplB,GAAY,KAAME,IAGrCwoC,MAAO,SAAUC,EAAQC,GACxB,OAAO7rC,KAAKkuB,WAAY0d,GAASzd,WAAY0d,GAASD,MAIxD5oC,EAAOkB,KACN,wLAE4DqD,MAAO,KACnE,SAAUC,EAAInC,GAGbrC,EAAOG,GAAIkC,GAAS,SAAUod,EAAMtf,GACnC,OAA0B,EAAnBmB,UAAUhB,OAChBtD,KAAKooB,GAAI/iB,EAAM,KAAMod,EAAMtf,GAC3BnD,KAAKkpB,QAAS7jB,MAUlB,IAAI2E,GAAQ,qCAMZhH,EAAO8oC,MAAQ,SAAU3oC,EAAID,GAC5B,IAAIyN,EAAK6D,EAAMs3B,EAUf,GARwB,iBAAZ5oC,IACXyN,EAAMxN,EAAID,GACVA,EAAUC,EACVA,EAAKwN,GAKAtP,EAAY8B,GAalB,OARAqR,EAAOlU,EAAMG,KAAM6D,UAAW,IAC9BwnC,EAAQ,WACP,OAAO3oC,EAAGxC,MAAOuC,GAAWlD,KAAMwU,EAAK9T,OAAQJ,EAAMG,KAAM6D,eAItD8C,KAAOjE,EAAGiE,KAAOjE,EAAGiE,MAAQpE,EAAOoE,OAElC0kC,GAGR9oC,EAAO+oC,UAAY,SAAUC,GACvBA,EACJhpC,EAAOge,YAEPhe,EAAO4X,OAAO,IAGhB5X,EAAO6C,QAAUD,MAAMC,QACvB7C,EAAOipC,UAAYhpB,KAAKC,MACxBlgB,EAAOqJ,SAAWA,EAClBrJ,EAAO3B,WAAaA,EACpB2B,EAAOvB,SAAWA,EAClBuB,EAAOgf,UAAYA,EACnBhf,EAAOrB,KAAOmB,EAEdE,EAAOmpB,IAAMzjB,KAAKyjB,IAElBnpB,EAAOkpC,UAAY,SAAU5qC,GAK5B,IAAIK,EAAOqB,EAAOrB,KAAML,GACxB,OAAkB,WAATK,GAA8B,WAATA,KAK5BwqC,MAAO7qC,EAAMyxB,WAAYzxB,KAG5B0B,EAAOopC,KAAO,SAAU7pC,GACvB,OAAe,MAARA,EACN,IACEA,EAAO,IAAK2D,QAAS8D,GAAO,KAkBT,mBAAXqiC,QAAyBA,OAAOC,KAC3CD,OAAQ,SAAU,GAAI,WACrB,OAAOrpC,IAOT,IAGCupC,GAAUxsC,EAAOiD,OAGjBwpC,GAAKzsC,EAAO0sC,EAwBb,OAtBAzpC,EAAO0pC,WAAa,SAAUhnC,GAS7B,OARK3F,EAAO0sC,IAAMzpC,IACjBjD,EAAO0sC,EAAID,IAGP9mC,GAAQ3F,EAAOiD,SAAWA,IAC9BjD,EAAOiD,OAASupC,IAGVvpC,GAMiB,oBAAb/C,IACXF,EAAOiD,OAASjD,EAAO0sC,EAAIzpC,GAMrBA","file":"jquery-3.6.0.min.js"} \ No newline at end of file diff --git a/docs/api/py/_static/language_data.js b/docs/api/py/_static/language_data.js index 250f5665fa64b..367b8ed81b4e4 100644 --- a/docs/api/py/_static/language_data.js +++ b/docs/api/py/_static/language_data.js @@ -5,7 +5,7 @@ * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -13,7 +13,7 @@ var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; -/* Non-minified version is copied as a separate JS file, is available */ +/* Non-minified version is copied as a separate JS file, if available */ /** * Porter Stemmer diff --git a/docs/api/py/_static/material.css b/docs/api/py/_static/material.css new file mode 100644 index 0000000000000..5fa22e886b899 --- /dev/null +++ b/docs/api/py/_static/material.css @@ -0,0 +1,35 @@ +.dropdown { + width: 125px; + vertical-align: middle; +} + +.dropdownbutton { + color: inherit; + font-weight: 700; + font-size: .65rem; + +} + +.dropdown-content { + display: none; + position: absolute; + z-index: 1; + background-color: inherit; +} + +.dropdown-content a { + display: block; + width: 125px; + margin: 8px; + font-size: .65rem; + font-weight: 200; +} + +/* Change color of dropdown links on hover */ +.dropdown-content a:hover {} + +/* Show the dropdown menu on hover */ +.dropdown:hover .dropdown-content {display: block;} + +/* Change the background color of the dropdown button when the dropdown content is shown */ +.dropdown:hover .dropbtn {} \ No newline at end of file diff --git a/docs/api/py/_static/searchtools.js b/docs/api/py/_static/searchtools.js index 97d56a74d8207..b08d58c9b9b9a 100644 --- a/docs/api/py/_static/searchtools.js +++ b/docs/api/py/_static/searchtools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for the full-text search. * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -57,12 +57,12 @@ const _removeChildren = (element) => { const _escapeRegExp = (string) => string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string -const _displayItem = (item, searchTerms) => { +const _displayItem = (item, searchTerms, highlightTerms) => { const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; - const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; const [docName, title, anchor, descr, score, _filename] = item; @@ -75,28 +75,35 @@ const _displayItem = (item, searchTerms) => { if (dirname.match(/\/index\/$/)) dirname = dirname.substring(0, dirname.length - 6); else if (dirname === "index/") dirname = ""; - requestUrl = docUrlRoot + dirname; + requestUrl = contentRoot + dirname; linkUrl = requestUrl; } else { // normal html builders - requestUrl = docUrlRoot + docName + docFileSuffix; + requestUrl = contentRoot + docName + docFileSuffix; linkUrl = docName + docLinkSuffix; } let linkEl = listItem.appendChild(document.createElement("a")); linkEl.href = linkUrl + anchor; linkEl.dataset.score = score; linkEl.innerHTML = title; - if (descr) + if (descr) { listItem.appendChild(document.createElement("span")).innerHTML = " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } else if (showSearchSummary) fetch(requestUrl) .then((responseData) => responseData.text()) .then((data) => { if (data) listItem.appendChild( - Search.makeSearchSummary(data, searchTerms) + Search.makeSearchSummary(data, searchTerms, anchor) ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); }); Search.output.appendChild(listItem); }; @@ -109,26 +116,43 @@ const _finishSearch = (resultCount) => { ); else Search.status.innerText = _( - `Search finished, found ${resultCount} page(s) matching the search query.` - ); + "Search finished, found ${resultCount} page(s) matching the search query." + ).replace('${resultCount}', resultCount); }; const _displayNextItem = ( results, resultCount, - searchTerms + searchTerms, + highlightTerms, ) => { // results left, load the summary and display it // this is intended to be dynamic (don't sub resultsCount) if (results.length) { - _displayItem(results.pop(), searchTerms); + _displayItem(results.pop(), searchTerms, highlightTerms); setTimeout( - () => _displayNextItem(results, resultCount, searchTerms), + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), 5 ); } // search finished, update title and status message else _finishSearch(resultCount); }; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; /** * Default splitQuery function. Can be overridden in ``sphinx.search`` with a @@ -152,13 +176,26 @@ const Search = { _queued_query: null, _pulse_status: -1, - htmlToText: (htmlString) => { + htmlToText: (htmlString, anchor) => { const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); - htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content const docContent = htmlElement.querySelector('[role="main"]'); - if (docContent !== undefined) return docContent.textContent; + if (docContent) return docContent.textContent; + console.warn( - "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." ); return ""; }, @@ -231,16 +268,7 @@ const Search = { else Search.deferQuery(query); }, - /** - * execute search (requires search index to be loaded) - */ - query: (query) => { - const filenames = Search._index.filenames; - const docNames = Search._index.docnames; - const titles = Search._index.titles; - const allTitles = Search._index.alltitles; - const indexEntries = Search._index.indexentries; - + _parseQuery: (query) => { // stem the search terms and add them to the correct list const stemmer = new Stemmer(); const searchTerms = new Set(); @@ -276,21 +304,38 @@ const Search = { // console.info("required: ", [...searchTerms]); // console.info("excluded: ", [...excludedTerms]); - // array of [docname, title, anchor, descr, score, filename] - let results = []; + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + _removeChildren(document.getElementById("search-progress")); - const queryLower = query.toLowerCase(); + const queryLower = query.toLowerCase().trim(); for (const [title, foundTitles] of Object.entries(allTitles)) { - if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { for (const [file, id] of foundTitles) { - let score = Math.round(100 * queryLower.length / title.length) - results.push([ + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ docNames[file], titles[file] !== title ? `${titles[file]} > ${title}` : title, id !== null ? "#" + id : "", null, - score, + score + boost, filenames[file], ]); } @@ -300,46 +345,47 @@ const Search = { // search for explicit entries in index directives for (const [entry, foundEntries] of Object.entries(indexEntries)) { if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { - for (const [file, id] of foundEntries) { - let score = Math.round(100 * queryLower.length / entry.length) - results.push([ + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ docNames[file], titles[file], id ? "#" + id : "", null, score, filenames[file], - ]); + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } } } } // lookup as object objectTerms.forEach((term) => - results.push(...Search.performObjectSearch(term, objectTerms)) + normalResults.push(...Search.performObjectSearch(term, objectTerms)) ); // lookup as search terms in fulltext - results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); // let the scorer override scores with a custom scoring function - if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); - - // now sort the results by score (in opposite order of appearance, since the - // display function below uses pop() to retrieve items) and then - // alphabetically - results.sort((a, b) => { - const leftScore = a[4]; - const rightScore = b[4]; - if (leftScore === rightScore) { - // same score: sort alphabetically - const leftTitle = a[1].toLowerCase(); - const rightTitle = b[1].toLowerCase(); - if (leftTitle === rightTitle) return 0; - return leftTitle > rightTitle ? -1 : 1; // inverted is intentional - } - return leftScore > rightScore ? 1 : -1; - }); + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; // remove duplicate search results // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept @@ -353,14 +399,19 @@ const Search = { return acc; }, []); - results = results.reverse(); + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); // for debugging //Search.lastresults = results.slice(); // a copy // console.info("search results:", Search.lastresults); // print the results - _displayNextItem(results, results.length, searchTerms); + _displayNextItem(results, results.length, searchTerms, highlightTerms); }, /** @@ -458,14 +509,18 @@ const Search = { // add support for partial matches if (word.length > 2) { const escapedWord = _escapeRegExp(word); - Object.keys(terms).forEach((term) => { - if (term.match(escapedWord) && !terms[word]) - arr.push({ files: terms[term], score: Scorer.partialTerm }); - }); - Object.keys(titleTerms).forEach((term) => { - if (term.match(escapedWord) && !titleTerms[word]) - arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); - }); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } } // no match but word was a required one @@ -488,9 +543,8 @@ const Search = { // create the mapping files.forEach((file) => { - if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) - fileMap.get(file).push(word); - else fileMap.set(file, [word]); + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); }); }); @@ -541,8 +595,8 @@ const Search = { * search summary for a given text. keywords is a list * of stemmed words. */ - makeSearchSummary: (htmlText, keywords) => { - const text = Search.htmlToText(htmlText); + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); if (text === "") return null; const textLower = text.toLowerCase(); diff --git a/docs/api/py/_static/selenium_logo_small.png b/docs/api/py/_static/selenium_logo_small.png new file mode 100644 index 0000000000000..8028a2be827d0 Binary files /dev/null and b/docs/api/py/_static/selenium_logo_small.png differ diff --git a/docs/api/py/_static/sidebar.js b/docs/api/py/_static/sidebar.js deleted file mode 100644 index c5e2692c4656b..0000000000000 --- a/docs/api/py/_static/sidebar.js +++ /dev/null @@ -1,70 +0,0 @@ -/* - * sidebar.js - * ~~~~~~~~~~ - * - * This script makes the Sphinx sidebar collapsible. - * - * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds - * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton - * used to collapse and expand the sidebar. - * - * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden - * and the width of the sidebar and the margin-left of the document - * are decreased. When the sidebar is expanded the opposite happens. - * This script saves a per-browser/per-session cookie used to - * remember the position of the sidebar among the pages. - * Once the browser is closed the cookie is deleted and the position - * reset to the default (expanded). - * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -const initialiseSidebar = () => { - - - - - // global elements used by the functions. - const bodyWrapper = document.getElementsByClassName("bodywrapper")[0] - const sidebar = document.getElementsByClassName("sphinxsidebar")[0] - const sidebarWrapper = document.getElementsByClassName('sphinxsidebarwrapper')[0] - const sidebarButton = document.getElementById("sidebarbutton") - const sidebarArrow = sidebarButton.querySelector('span') - - // for some reason, the document has no sidebar; do not run into errors - if (typeof sidebar === "undefined") return; - - const flipArrow = element => element.innerText = (element.innerText === "»") ? "«" : "»" - - const collapse_sidebar = () => { - bodyWrapper.style.marginLeft = ".8em"; - sidebar.style.width = ".8em" - sidebarWrapper.style.display = "none" - flipArrow(sidebarArrow) - sidebarButton.title = _('Expand sidebar') - window.localStorage.setItem("sidebar", "collapsed") - } - - const expand_sidebar = () => { - bodyWrapper.style.marginLeft = "" - sidebar.style.removeProperty("width") - sidebarWrapper.style.display = "" - flipArrow(sidebarArrow) - sidebarButton.title = _('Collapse sidebar') - window.localStorage.setItem("sidebar", "expanded") - } - - sidebarButton.addEventListener("click", () => { - (sidebarWrapper.style.display === "none") ? expand_sidebar() : collapse_sidebar() - }) - - if (!window.localStorage.getItem("sidebar")) return - const value = window.localStorage.getItem("sidebar") - if (value === "collapsed") collapse_sidebar(); - else if (value === "expanded") expand_sidebar(); -} - -if (document.readyState !== "loading") initialiseSidebar() -else document.addEventListener("DOMContentLoaded", initialiseSidebar) \ No newline at end of file diff --git a/docs/api/py/_static/sphinx_highlight.js b/docs/api/py/_static/sphinx_highlight.js index aae669d7ea6b1..8a96c69a19423 100644 --- a/docs/api/py/_static/sphinx_highlight.js +++ b/docs/api/py/_static/sphinx_highlight.js @@ -29,14 +29,19 @@ const _highlight = (node, addItems, text, className) => { } span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); parent.insertBefore( span, parent.insertBefore( - document.createTextNode(val.substr(pos + text.length)), + rest, node.nextSibling ) ); node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); if (isInSVG) { const rect = document.createElementNS( @@ -140,5 +145,10 @@ const SphinxHighlight = { }, }; -_ready(SphinxHighlight.highlightSearchWords); -_ready(SphinxHighlight.initEscapeListener); +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/docs/api/py/_static/stylesheets/application-fixes.css b/docs/api/py/_static/stylesheets/application-fixes.css new file mode 100644 index 0000000000000..a65d194b7adbb --- /dev/null +++ b/docs/api/py/_static/stylesheets/application-fixes.css @@ -0,0 +1,423 @@ +.md-nav--primary ul, .md-nav--primary ul li ul, .md-nav--secondary ul, .md-nav--secondary ul li ul { + margin: 0; + padding: 0; + list-style: none +} + +.md-nav--primary ul li, .md-nav--primary ul li ul li, .md-nav--secondary ul li, .md-nav--secondary ul li ul li { + padding: 0 .6rem; +} + +.md-nav--primary a.reference, .md-nav--secondary a.reference { + display: block; + margin-top: .625em; + transition: color .125s; + text-overflow: ellipsis; + cursor: pointer; + overflow: hidden +} + +.md-typeset td p, .md-typeset th p { + margin: 0 +} + +.md-typeset .admonition, .md-typeset details { + font-size: 0.8rem +} + +.classifier:before { + font-style: normal; + margin: 0.5em; + content: ":"; +} + +dl.footnote > dt, dl.citation > dt { + float: left; +} + +code.xref { + background-color: transparent; + font-weight: bold; +} + +table.docutils { + width: 100%; +} + +.longtable tr td:first-child { + width: 50%; + white-space: nowrap; +} + +dt:target { + margin-top: -3.55rem; + padding-top: 3.45rem; +} + +.md-typeset code { + margin: 0 +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +span.highlighted { + background-color: #fbe54e; +} + +p.rubric { + margin-top: 1rem; + font-weight: bold; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +table.longtable { + border-collapse: collapse; +} + +.longtable tr { + border: solid; + border-width: 1px 0; +} + +.longtable tr:first-child { + border-top: none; +} + +.md-tabs code, kbd, pre, .md-footer-nav code, kbd, pre { + color: rgb(255, 255, 255); +} + +.toctree-wrapper.compound li { + list-style: none; + padding: 0; + margin: 0 0 0.1rem 0.2rem; +} + +table.indextable.genindextable li { + margin: 0 0.5rem; +} + +table.indextable.genindextable li ul li { + list-style: none; +} + +p.highlight-link { + margin: 0.625rem 0 0 0; +} + +table.longtable.docutils.align-default { + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} + +@media only screen and (max-width: 40em) { + table.longtable.docutils.align-default { + display: block; + } + + .longtable.docutils.align-default td { + padding-right: 1rem; + } +} + +.md-nav__extra_link:after { + font-family: Material Icons; + font-style: normal; + font-variant: normal; + font-weight: 400; + line-height: 1; + text-transform: none; + white-space: nowrap; + speak: none; + word-wrap: normal; + direction: ltr +} + +.md-nav__extra_link { + display: block; + margin-top: .625em; + transition: color .125s; + text-overflow: ellipsis; + cursor: pointer; + overflow: hidden +} + +.md-nav__extra_link:active { + color: #3f51b5 +} + +.md-nav__extra_link:focus, .md-nav__extra_link:hover { + color: #536dfe +} + +@media only screen and (max-width: 76.1875em) { + .md-nav--primary .md-nav--secondary .md-nav__extra_link { + position: static + } + + .md-nav--primary .md-nav--secondary .md-nav .md-nav__extra_link { + padding-left: 1.4rem + } + + .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__extra_link { + padding-left: 2.6rem + } +} + +[data-md-color-primary=red] .md-nav__extra_link:active { + color: #ef5350 +} + +[data-md-color-primary=red] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=pink] .md-nav__extra_link:active { + color: #e91e63 +} + +[data-md-color-primary=pink] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=purple] .md-nav__extra_link:active { + color: #ab47bc +} + +[data-md-color-primary=purple] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=deep-purple] .md-nav__extra_link:active { + color: #7e57c2 +} + +[data-md-color-primary=deep-purple] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=indigo] .md-nav__extra_link:active { + color: #3f51b5 +} + +[data-md-color-primary=indigo] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=blue] .md-nav__extra_link:active { + color: #2196f3 +} + +[data-md-color-primary=blue] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=light-blue] .md-nav__extra_link:active { + color: #03a9f4 +} + +[data-md-color-primary=light-blue] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=cyan] .md-nav__extra_link:active { + color: #00bcd4 +} + +[data-md-color-primary=cyan] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=teal] .md-nav__extra_link:active { + color: #009688 +} + +[data-md-color-primary=teal] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=green] .md-nav__extra_link:active { + color: #4caf50 +} + +[data-md-color-primary=green] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=light-green] .md-nav__extra_link:active { + color: #7cb342 +} + +[data-md-color-primary=light-green] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=lime] .md-nav__extra_link:active { + color: #c0ca33 +} + +[data-md-color-primary=lime] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=yellow] .md-nav__extra_link:active { + color: #f9a825 +} + +[data-md-color-primary=yellow] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=amber] .md-nav__extra_link:active { + color: #ffa000 +} + +[data-md-color-primary=amber] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=orange] .md-nav__extra_link:active { + color: #fb8c00 +} + +[data-md-color-primary=orange] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=deep-orange] .md-nav__extra_link:active { + color: #ff7043 +} + +[data-md-color-primary=deep-orange] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=brown] .md-nav__extra_link:active { + color: #795548 +} + +[data-md-color-primary=brown] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=grey] .md-nav__extra_link:active { + color: #757575 +} + +[data-md-color-primary=grey] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-primary=blue-grey] .md-nav__extra_link:active { + color: #546e7a +} + +[data-md-color-primary=blue-grey] .md-nav__item--nested > .md-nav__extra_link { + color: inherit +} + +[data-md-color-accent=red] .md-nav__extra_link:focus, [data-md-color-accent=red] .md-nav__extra_link:hover { + color: #ff1744 +} + +[data-md-color-accent=pink] .md-nav__extra_link:focus, [data-md-color-accent=pink] .md-nav__extra_link:hover { + color: #f50057 +} + +[data-md-color-accent=purple] .md-nav__extra_link:focus, [data-md-color-accent=purple] .md-nav__extra_link:hover { + color: #e040fb +} + +[data-md-color-accent=deep-purple] .md-nav__extra_link:focus, [data-md-color-accent=deep-purple] .md-nav__extra_link:hover { + color: #7c4dff +} + +[data-md-color-accent=indigo] .md-nav__extra_link:focus, [data-md-color-accent=indigo] .md-nav__extra_link:hover { + color: #536dfe +} + +[data-md-color-accent=blue] .md-nav__extra_link:focus, [data-md-color-accent=blue] .md-nav__extra_link:hover { + color: #448aff +} + +[data-md-color-accent=light-blue] .md-nav__extra_link:focus, [data-md-color-accent=light-blue] .md-nav__extra_link:hover { + color: #0091ea +} + +[data-md-color-accent=cyan] .md-nav__extra_link:focus, [data-md-color-accent=cyan] .md-nav__extra_link:hover { + color: #00b8d4 +} + +[data-md-color-accent=teal] .md-nav__extra_link:focus, [data-md-color-accent=teal] .md-nav__extra_link:hover { + color: #00bfa5 +} + +[data-md-color-accent=green] .md-nav__extra_link:focus, [data-md-color-accent=green] .md-nav__extra_link:hover { + color: #00c853 +} + +[data-md-color-accent=light-green] .md-nav__extra_link:focus, [data-md-color-accent=light-green] .md-nav__extra_link:hover { + color: #64dd17 +} + +[data-md-color-accent=lime] .md-nav__extra_link:focus, [data-md-color-accent=lime] .md-nav__extra_link:hover { + color: #aeea00 +} + +[data-md-color-accent=yellow] .md-nav__extra_link:focus, [data-md-color-accent=yellow] .md-nav__extra_link:hover { + color: #ffd600 +} + +[data-md-color-accent=amber] .md-nav__extra_link:focus, [data-md-color-accent=amber] .md-nav__extra_link:hover { + color: #ffab00 +} + +[data-md-color-accent=orange] .md-nav__extra_link:focus, [data-md-color-accent=orange] .md-nav__extra_link:hover { + color: #ff9100 +} + +[data-md-color-accent=deep-orange] .md-nav__extra_link:focus, [data-md-color-accent=deep-orange] .md-nav__extra_link:hover { + color: #ff6e40 +} + +div.rendered_html table { + font-size: 0.8rem !important; +} + +/* TODO: This is hacky; should have own class and not derive from link */ +.md-nav span.caption { + font-weight: 700; + pointer-events: none; +} + +.md-nav span.caption:hover, .md-nav span.caption:active { + color: #000; +} + +.md-typeset img.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +.md-typeset img.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +/* GH 93 */ +dl.citation dt span.brackets { + margin-right: 0.3rem; +} diff --git a/docs/api/py/_static/stylesheets/application-palette.css b/docs/api/py/_static/stylesheets/application-palette.css new file mode 100644 index 0000000000000..5eadc1c5b64a0 --- /dev/null +++ b/docs/api/py/_static/stylesheets/application-palette.css @@ -0,0 +1,1352 @@ +button[data-md-color-accent], +button[data-md-color-primary] { + width: 6.5rem; + margin-bottom: .2rem; + padding: 1.2rem .4rem .2rem; + transition: background-color .25s, opacity .25s; + border-radius: .1rem; + color: #fff; + font-size: .64rem; + text-align: left; + cursor: pointer +} + +button[data-md-color-accent]:hover, +button[data-md-color-primary]:hover { + opacity: .75 +} + +button[data-md-color-primary=red] { + background-color: #ef5350 +} + +[data-md-color-primary=red] .md-typeset a { + color: #ef5350 +} + +[data-md-color-primary=red] .md-header, +[data-md-color-primary=red] .md-hero { + background-color: #ef5350 +} + +[data-md-color-primary=red] .md-nav__link--active, +[data-md-color-primary=red] .md-nav__link:active { + color: #ef5350 +} + +[data-md-color-primary=red] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=pink] { + background-color: #e91e63 +} + +[data-md-color-primary=pink] .md-typeset a { + color: #e91e63 +} + +[data-md-color-primary=pink] .md-header, +[data-md-color-primary=pink] .md-hero { + background-color: #e91e63 +} + +[data-md-color-primary=pink] .md-nav__link--active, +[data-md-color-primary=pink] .md-nav__link:active { + color: #e91e63 +} + +[data-md-color-primary=pink] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=purple] { + background-color: #ab47bc +} + +[data-md-color-primary=purple] .md-typeset a { + color: #ab47bc +} + +[data-md-color-primary=purple] .md-header, +[data-md-color-primary=purple] .md-hero { + background-color: #ab47bc +} + +[data-md-color-primary=purple] .md-nav__link--active, +[data-md-color-primary=purple] .md-nav__link:active { + color: #ab47bc +} + +[data-md-color-primary=purple] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=deep-purple] { + background-color: #7e57c2 +} + +[data-md-color-primary=deep-purple] .md-typeset a { + color: #7e57c2 +} + +[data-md-color-primary=deep-purple] .md-header, +[data-md-color-primary=deep-purple] .md-hero { + background-color: #7e57c2 +} + +[data-md-color-primary=deep-purple] .md-nav__link--active, +[data-md-color-primary=deep-purple] .md-nav__link:active { + color: #7e57c2 +} + +[data-md-color-primary=deep-purple] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=indigo] { + background-color: #3f51b5 +} + +[data-md-color-primary=indigo] .md-typeset a { + color: #3f51b5 +} + +[data-md-color-primary=indigo] .md-header, +[data-md-color-primary=indigo] .md-hero { + background-color: #3f51b5 +} + +[data-md-color-primary=indigo] .md-nav__link--active, +[data-md-color-primary=indigo] .md-nav__link:active { + color: #3f51b5 +} + +[data-md-color-primary=indigo] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=blue] { + background-color: #2196f3 +} + +[data-md-color-primary=blue] .md-typeset a { + color: #2196f3 +} + +[data-md-color-primary=blue] .md-header, +[data-md-color-primary=blue] .md-hero { + background-color: #2196f3 +} + +[data-md-color-primary=blue] .md-nav__link--active, +[data-md-color-primary=blue] .md-nav__link:active { + color: #2196f3 +} + +[data-md-color-primary=blue] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=light-blue] { + background-color: #03a9f4 +} + +[data-md-color-primary=light-blue] .md-typeset a { + color: #03a9f4 +} + +[data-md-color-primary=light-blue] .md-header, +[data-md-color-primary=light-blue] .md-hero { + background-color: #03a9f4 +} + +[data-md-color-primary=light-blue] .md-nav__link--active, +[data-md-color-primary=light-blue] .md-nav__link:active { + color: #03a9f4 +} + +[data-md-color-primary=light-blue] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=cyan] { + background-color: #00bcd4 +} + +[data-md-color-primary=cyan] .md-typeset a { + color: #00bcd4 +} + +[data-md-color-primary=cyan] .md-header, +[data-md-color-primary=cyan] .md-hero { + background-color: #00bcd4 +} + +[data-md-color-primary=cyan] .md-nav__link--active, +[data-md-color-primary=cyan] .md-nav__link:active { + color: #00bcd4 +} + +[data-md-color-primary=cyan] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=teal] { + background-color: #009688 +} + +[data-md-color-primary=teal] .md-typeset a { + color: #009688 +} + +[data-md-color-primary=teal] .md-header, +[data-md-color-primary=teal] .md-hero { + background-color: #009688 +} + +[data-md-color-primary=teal] .md-nav__link--active, +[data-md-color-primary=teal] .md-nav__link:active { + color: #009688 +} + +[data-md-color-primary=teal] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=green] { + background-color: #4caf50 +} + +[data-md-color-primary=green] .md-typeset a { + color: #4caf50 +} + +[data-md-color-primary=green] .md-header, +[data-md-color-primary=green] .md-hero { + background-color: #4caf50 +} + +[data-md-color-primary=green] .md-nav__link--active, +[data-md-color-primary=green] .md-nav__link:active { + color: #4caf50 +} + +[data-md-color-primary=green] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=light-green] { + background-color: #7cb342 +} + +[data-md-color-primary=light-green] .md-typeset a { + color: #7cb342 +} + +[data-md-color-primary=light-green] .md-header, +[data-md-color-primary=light-green] .md-hero { + background-color: #7cb342 +} + +[data-md-color-primary=light-green] .md-nav__link--active, +[data-md-color-primary=light-green] .md-nav__link:active { + color: #7cb342 +} + +[data-md-color-primary=light-green] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=lime] { + background-color: #c0ca33 +} + +[data-md-color-primary=lime] .md-typeset a { + color: #c0ca33 +} + +[data-md-color-primary=lime] .md-header, +[data-md-color-primary=lime] .md-hero { + background-color: #c0ca33 +} + +[data-md-color-primary=lime] .md-nav__link--active, +[data-md-color-primary=lime] .md-nav__link:active { + color: #c0ca33 +} + +[data-md-color-primary=lime] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=yellow] { + background-color: #f9a825 +} + +[data-md-color-primary=yellow] .md-typeset a { + color: #f9a825 +} + +[data-md-color-primary=yellow] .md-header, +[data-md-color-primary=yellow] .md-hero { + background-color: #f9a825 +} + +[data-md-color-primary=yellow] .md-nav__link--active, +[data-md-color-primary=yellow] .md-nav__link:active { + color: #f9a825 +} + +[data-md-color-primary=yellow] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=amber] { + background-color: #ffa000 +} + +[data-md-color-primary=amber] .md-typeset a { + color: #ffa000 +} + +[data-md-color-primary=amber] .md-header, +[data-md-color-primary=amber] .md-hero { + background-color: #ffa000 +} + +[data-md-color-primary=amber] .md-nav__link--active, +[data-md-color-primary=amber] .md-nav__link:active { + color: #ffa000 +} + +[data-md-color-primary=amber] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=orange] { + background-color: #fb8c00 +} + +[data-md-color-primary=orange] .md-typeset a { + color: #fb8c00 +} + +[data-md-color-primary=orange] .md-header, +[data-md-color-primary=orange] .md-hero { + background-color: #fb8c00 +} + +[data-md-color-primary=orange] .md-nav__link--active, +[data-md-color-primary=orange] .md-nav__link:active { + color: #fb8c00 +} + +[data-md-color-primary=orange] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=deep-orange] { + background-color: #ff7043 +} + +[data-md-color-primary=deep-orange] .md-typeset a { + color: #ff7043 +} + +[data-md-color-primary=deep-orange] .md-header, +[data-md-color-primary=deep-orange] .md-hero { + background-color: #ff7043 +} + +[data-md-color-primary=deep-orange] .md-nav__link--active, +[data-md-color-primary=deep-orange] .md-nav__link:active { + color: #ff7043 +} + +[data-md-color-primary=deep-orange] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=brown] { + background-color: #795548 +} + +[data-md-color-primary=brown] .md-typeset a { + color: #795548 +} + +[data-md-color-primary=brown] .md-header, +[data-md-color-primary=brown] .md-hero { + background-color: #795548 +} + +[data-md-color-primary=brown] .md-nav__link--active, +[data-md-color-primary=brown] .md-nav__link:active { + color: #795548 +} + +[data-md-color-primary=brown] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=grey] { + background-color: #757575 +} + +[data-md-color-primary=grey] .md-typeset a { + color: #757575 +} + +[data-md-color-primary=grey] .md-header, +[data-md-color-primary=grey] .md-hero { + background-color: #757575 +} + +[data-md-color-primary=grey] .md-nav__link--active, +[data-md-color-primary=grey] .md-nav__link:active { + color: #757575 +} + +[data-md-color-primary=grey] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=blue-grey] { + background-color: #546e7a +} + +[data-md-color-primary=blue-grey] .md-typeset a { + color: #546e7a +} + +[data-md-color-primary=blue-grey] .md-header, +[data-md-color-primary=blue-grey] .md-hero { + background-color: #546e7a +} + +[data-md-color-primary=blue-grey] .md-nav__link--active, +[data-md-color-primary=blue-grey] .md-nav__link:active { + color: #546e7a +} + +[data-md-color-primary=blue-grey] .md-nav__item--nested>.md-nav__link { + color: inherit +} + +button[data-md-color-primary=white] { + box-shadow: inset 0 0 .05rem rgba(0, 0, 0, .54) +} + +[data-md-color-primary=white] .md-header, +[data-md-color-primary=white] .md-hero, +button[data-md-color-primary=white] { + background-color: #fff; + color: rgba(0, 0, 0, .87) +} + +[data-md-color-primary=white] .md-hero--expand { + border-bottom: .05rem solid rgba(0, 0, 0, .07) +} + +button[data-md-color-accent=red] { + background-color: #ff1744 +} + +[data-md-color-accent=red] .md-typeset a:active, +[data-md-color-accent=red] .md-typeset a:hover { + color: #ff1744 +} + +[data-md-color-accent=red] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=red] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #ff1744 +} + +[data-md-color-accent=red] .md-nav__link:focus, +[data-md-color-accent=red] .md-nav__link:hover, +[data-md-color-accent=red] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=red] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=red] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=red] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=red] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=red] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=red] .md-typeset [id]:target .headerlink { + color: #ff1744 +} + +[data-md-color-accent=red] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff1744 +} + +[data-md-color-accent=red] .md-search-result__link:hover, +[data-md-color-accent=red] .md-search-result__link[data-md-state=active] { + background-color: rgba(255, 23, 68, .1) +} + +[data-md-color-accent=red] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff1744 +} + +[data-md-color-accent=red] .md-source-file:hover:before { + background-color: #ff1744 +} + +button[data-md-color-accent=pink] { + background-color: #f50057 +} + +[data-md-color-accent=pink] .md-typeset a:active, +[data-md-color-accent=pink] .md-typeset a:hover { + color: #f50057 +} + +[data-md-color-accent=pink] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=pink] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #f50057 +} + +[data-md-color-accent=pink] .md-nav__link:focus, +[data-md-color-accent=pink] .md-nav__link:hover, +[data-md-color-accent=pink] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=pink] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=pink] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=pink] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=pink] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=pink] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=pink] .md-typeset [id]:target .headerlink { + color: #f50057 +} + +[data-md-color-accent=pink] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #f50057 +} + +[data-md-color-accent=pink] .md-search-result__link:hover, +[data-md-color-accent=pink] .md-search-result__link[data-md-state=active] { + background-color: rgba(245, 0, 87, .1) +} + +[data-md-color-accent=pink] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #f50057 +} + +[data-md-color-accent=pink] .md-source-file:hover:before { + background-color: #f50057 +} + +button[data-md-color-accent=purple] { + background-color: #e040fb +} + +[data-md-color-accent=purple] .md-typeset a:active, +[data-md-color-accent=purple] .md-typeset a:hover { + color: #e040fb +} + +[data-md-color-accent=purple] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=purple] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #e040fb +} + +[data-md-color-accent=purple] .md-nav__link:focus, +[data-md-color-accent=purple] .md-nav__link:hover, +[data-md-color-accent=purple] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=purple] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=purple] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=purple] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=purple] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=purple] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=purple] .md-typeset [id]:target .headerlink { + color: #e040fb +} + +[data-md-color-accent=purple] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #e040fb +} + +[data-md-color-accent=purple] .md-search-result__link:hover, +[data-md-color-accent=purple] .md-search-result__link[data-md-state=active] { + background-color: rgba(224, 64, 251, .1) +} + +[data-md-color-accent=purple] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #e040fb +} + +[data-md-color-accent=purple] .md-source-file:hover:before { + background-color: #e040fb +} + +button[data-md-color-accent=deep-purple] { + background-color: #7c4dff +} + +[data-md-color-accent=deep-purple] .md-typeset a:active, +[data-md-color-accent=deep-purple] .md-typeset a:hover { + color: #7c4dff +} + +[data-md-color-accent=deep-purple] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=deep-purple] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #7c4dff +} + +[data-md-color-accent=deep-purple] .md-nav__link:focus, +[data-md-color-accent=deep-purple] .md-nav__link:hover, +[data-md-color-accent=deep-purple] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=deep-purple] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=deep-purple] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=deep-purple] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=deep-purple] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=deep-purple] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=deep-purple] .md-typeset [id]:target .headerlink { + color: #7c4dff +} + +[data-md-color-accent=deep-purple] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #7c4dff +} + +[data-md-color-accent=deep-purple] .md-search-result__link:hover, +[data-md-color-accent=deep-purple] .md-search-result__link[data-md-state=active] { + background-color: rgba(124, 77, 255, .1) +} + +[data-md-color-accent=deep-purple] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #7c4dff +} + +[data-md-color-accent=deep-purple] .md-source-file:hover:before { + background-color: #7c4dff +} + +button[data-md-color-accent=indigo] { + background-color: #536dfe +} + +[data-md-color-accent=indigo] .md-typeset a:active, +[data-md-color-accent=indigo] .md-typeset a:hover { + color: #536dfe +} + +[data-md-color-accent=indigo] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=indigo] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #536dfe +} + +[data-md-color-accent=indigo] .md-nav__link:focus, +[data-md-color-accent=indigo] .md-nav__link:hover, +[data-md-color-accent=indigo] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=indigo] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=indigo] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=indigo] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=indigo] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=indigo] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=indigo] .md-typeset [id]:target .headerlink { + color: #536dfe +} + +[data-md-color-accent=indigo] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #536dfe +} + +[data-md-color-accent=indigo] .md-search-result__link:hover, +[data-md-color-accent=indigo] .md-search-result__link[data-md-state=active] { + background-color: rgba(83, 109, 254, .1) +} + +[data-md-color-accent=indigo] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #536dfe +} + +[data-md-color-accent=indigo] .md-source-file:hover:before { + background-color: #536dfe +} + +button[data-md-color-accent=blue] { + background-color: #448aff +} + +[data-md-color-accent=blue] .md-typeset a:active, +[data-md-color-accent=blue] .md-typeset a:hover { + color: #448aff +} + +[data-md-color-accent=blue] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=blue] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #448aff +} + +[data-md-color-accent=blue] .md-nav__link:focus, +[data-md-color-accent=blue] .md-nav__link:hover, +[data-md-color-accent=blue] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=blue] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=blue] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=blue] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=blue] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=blue] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=blue] .md-typeset [id]:target .headerlink { + color: #448aff +} + +[data-md-color-accent=blue] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #448aff +} + +[data-md-color-accent=blue] .md-search-result__link:hover, +[data-md-color-accent=blue] .md-search-result__link[data-md-state=active] { + background-color: rgba(68, 138, 255, .1) +} + +[data-md-color-accent=blue] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #448aff +} + +[data-md-color-accent=blue] .md-source-file:hover:before { + background-color: #448aff +} + +button[data-md-color-accent=light-blue] { + background-color: #0091ea +} + +[data-md-color-accent=light-blue] .md-typeset a:active, +[data-md-color-accent=light-blue] .md-typeset a:hover { + color: #0091ea +} + +[data-md-color-accent=light-blue] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=light-blue] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #0091ea +} + +[data-md-color-accent=light-blue] .md-nav__link:focus, +[data-md-color-accent=light-blue] .md-nav__link:hover, +[data-md-color-accent=light-blue] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=light-blue] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=light-blue] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=light-blue] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=light-blue] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=light-blue] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=light-blue] .md-typeset [id]:target .headerlink { + color: #0091ea +} + +[data-md-color-accent=light-blue] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #0091ea +} + +[data-md-color-accent=light-blue] .md-search-result__link:hover, +[data-md-color-accent=light-blue] .md-search-result__link[data-md-state=active] { + background-color: rgba(0, 145, 234, .1) +} + +[data-md-color-accent=light-blue] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #0091ea +} + +[data-md-color-accent=light-blue] .md-source-file:hover:before { + background-color: #0091ea +} + +button[data-md-color-accent=cyan] { + background-color: #00b8d4 +} + +[data-md-color-accent=cyan] .md-typeset a:active, +[data-md-color-accent=cyan] .md-typeset a:hover { + color: #00b8d4 +} + +[data-md-color-accent=cyan] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=cyan] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #00b8d4 +} + +[data-md-color-accent=cyan] .md-nav__link:focus, +[data-md-color-accent=cyan] .md-nav__link:hover, +[data-md-color-accent=cyan] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=cyan] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=cyan] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=cyan] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=cyan] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=cyan] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=cyan] .md-typeset [id]:target .headerlink { + color: #00b8d4 +} + +[data-md-color-accent=cyan] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00b8d4 +} + +[data-md-color-accent=cyan] .md-search-result__link:hover, +[data-md-color-accent=cyan] .md-search-result__link[data-md-state=active] { + background-color: rgba(0, 184, 212, .1) +} + +[data-md-color-accent=cyan] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00b8d4 +} + +[data-md-color-accent=cyan] .md-source-file:hover:before { + background-color: #00b8d4 +} + +button[data-md-color-accent=teal] { + background-color: #00bfa5 +} + +[data-md-color-accent=teal] .md-typeset a:active, +[data-md-color-accent=teal] .md-typeset a:hover { + color: #00bfa5 +} + +[data-md-color-accent=teal] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=teal] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #00bfa5 +} + +[data-md-color-accent=teal] .md-nav__link:focus, +[data-md-color-accent=teal] .md-nav__link:hover, +[data-md-color-accent=teal] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=teal] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=teal] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=teal] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=teal] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=teal] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=teal] .md-typeset [id]:target .headerlink { + color: #00bfa5 +} + +[data-md-color-accent=teal] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00bfa5 +} + +[data-md-color-accent=teal] .md-search-result__link:hover, +[data-md-color-accent=teal] .md-search-result__link[data-md-state=active] { + background-color: rgba(0, 191, 165, .1) +} + +[data-md-color-accent=teal] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00bfa5 +} + +[data-md-color-accent=teal] .md-source-file:hover:before { + background-color: #00bfa5 +} + +button[data-md-color-accent=green] { + background-color: #00c853 +} + +[data-md-color-accent=green] .md-typeset a:active, +[data-md-color-accent=green] .md-typeset a:hover { + color: #00c853 +} + +[data-md-color-accent=green] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=green] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #00c853 +} + +[data-md-color-accent=green] .md-nav__link:focus, +[data-md-color-accent=green] .md-nav__link:hover, +[data-md-color-accent=green] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=green] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=green] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=green] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=green] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=green] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=green] .md-typeset [id]:target .headerlink { + color: #00c853 +} + +[data-md-color-accent=green] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00c853 +} + +[data-md-color-accent=green] .md-search-result__link:hover, +[data-md-color-accent=green] .md-search-result__link[data-md-state=active] { + background-color: rgba(0, 200, 83, .1) +} + +[data-md-color-accent=green] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00c853 +} + +[data-md-color-accent=green] .md-source-file:hover:before { + background-color: #00c853 +} + +button[data-md-color-accent=light-green] { + background-color: #64dd17 +} + +[data-md-color-accent=light-green] .md-typeset a:active, +[data-md-color-accent=light-green] .md-typeset a:hover { + color: #64dd17 +} + +[data-md-color-accent=light-green] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=light-green] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #64dd17 +} + +[data-md-color-accent=light-green] .md-nav__link:focus, +[data-md-color-accent=light-green] .md-nav__link:hover, +[data-md-color-accent=light-green] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=light-green] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=light-green] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=light-green] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=light-green] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=light-green] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=light-green] .md-typeset [id]:target .headerlink { + color: #64dd17 +} + +[data-md-color-accent=light-green] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #64dd17 +} + +[data-md-color-accent=light-green] .md-search-result__link:hover, +[data-md-color-accent=light-green] .md-search-result__link[data-md-state=active] { + background-color: rgba(100, 221, 23, .1) +} + +[data-md-color-accent=light-green] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #64dd17 +} + +[data-md-color-accent=light-green] .md-source-file:hover:before { + background-color: #64dd17 +} + +button[data-md-color-accent=lime] { + background-color: #aeea00 +} + +[data-md-color-accent=lime] .md-typeset a:active, +[data-md-color-accent=lime] .md-typeset a:hover { + color: #aeea00 +} + +[data-md-color-accent=lime] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=lime] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #aeea00 +} + +[data-md-color-accent=lime] .md-nav__link:focus, +[data-md-color-accent=lime] .md-nav__link:hover, +[data-md-color-accent=lime] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=lime] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=lime] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=lime] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=lime] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=lime] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=lime] .md-typeset [id]:target .headerlink { + color: #aeea00 +} + +[data-md-color-accent=lime] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #aeea00 +} + +[data-md-color-accent=lime] .md-search-result__link:hover, +[data-md-color-accent=lime] .md-search-result__link[data-md-state=active] { + background-color: rgba(174, 234, 0, .1) +} + +[data-md-color-accent=lime] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #aeea00 +} + +[data-md-color-accent=lime] .md-source-file:hover:before { + background-color: #aeea00 +} + +button[data-md-color-accent=yellow] { + background-color: #ffd600 +} + +[data-md-color-accent=yellow] .md-typeset a:active, +[data-md-color-accent=yellow] .md-typeset a:hover { + color: #ffd600 +} + +[data-md-color-accent=yellow] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=yellow] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #ffd600 +} + +[data-md-color-accent=yellow] .md-nav__link:focus, +[data-md-color-accent=yellow] .md-nav__link:hover, +[data-md-color-accent=yellow] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=yellow] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=yellow] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=yellow] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=yellow] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=yellow] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=yellow] .md-typeset [id]:target .headerlink { + color: #ffd600 +} + +[data-md-color-accent=yellow] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ffd600 +} + +[data-md-color-accent=yellow] .md-search-result__link:hover, +[data-md-color-accent=yellow] .md-search-result__link[data-md-state=active] { + background-color: rgba(255, 214, 0, .1) +} + +[data-md-color-accent=yellow] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ffd600 +} + +[data-md-color-accent=yellow] .md-source-file:hover:before { + background-color: #ffd600 +} + +button[data-md-color-accent=amber] { + background-color: #ffab00 +} + +[data-md-color-accent=amber] .md-typeset a:active, +[data-md-color-accent=amber] .md-typeset a:hover { + color: #ffab00 +} + +[data-md-color-accent=amber] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=amber] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #ffab00 +} + +[data-md-color-accent=amber] .md-nav__link:focus, +[data-md-color-accent=amber] .md-nav__link:hover, +[data-md-color-accent=amber] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=amber] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=amber] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=amber] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=amber] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=amber] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=amber] .md-typeset [id]:target .headerlink { + color: #ffab00 +} + +[data-md-color-accent=amber] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ffab00 +} + +[data-md-color-accent=amber] .md-search-result__link:hover, +[data-md-color-accent=amber] .md-search-result__link[data-md-state=active] { + background-color: rgba(255, 171, 0, .1) +} + +[data-md-color-accent=amber] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ffab00 +} + +[data-md-color-accent=amber] .md-source-file:hover:before { + background-color: #ffab00 +} + +button[data-md-color-accent=orange] { + background-color: #ff9100 +} + +[data-md-color-accent=orange] .md-typeset a:active, +[data-md-color-accent=orange] .md-typeset a:hover { + color: #ff9100 +} + +[data-md-color-accent=orange] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=orange] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #ff9100 +} + +[data-md-color-accent=orange] .md-nav__link:focus, +[data-md-color-accent=orange] .md-nav__link:hover, +[data-md-color-accent=orange] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=orange] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=orange] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=orange] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=orange] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=orange] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=orange] .md-typeset [id]:target .headerlink { + color: #ff9100 +} + +[data-md-color-accent=orange] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff9100 +} + +[data-md-color-accent=orange] .md-search-result__link:hover, +[data-md-color-accent=orange] .md-search-result__link[data-md-state=active] { + background-color: rgba(255, 145, 0, .1) +} + +[data-md-color-accent=orange] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff9100 +} + +[data-md-color-accent=orange] .md-source-file:hover:before { + background-color: #ff9100 +} + +button[data-md-color-accent=deep-orange] { + background-color: #ff6e40 +} + +[data-md-color-accent=deep-orange] .md-typeset a:active, +[data-md-color-accent=deep-orange] .md-typeset a:hover { + color: #ff6e40 +} + +[data-md-color-accent=deep-orange] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, +[data-md-color-accent=deep-orange] .md-typeset pre code::-webkit-scrollbar-thumb:hover { + background-color: #ff6e40 +} + +[data-md-color-accent=deep-orange] .md-nav__link:focus, +[data-md-color-accent=deep-orange] .md-nav__link:hover, +[data-md-color-accent=deep-orange] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent=deep-orange] .md-typeset .footnote li:target .footnote-backref, +[data-md-color-accent=deep-orange] .md-typeset .md-clipboard:active:before, +[data-md-color-accent=deep-orange] .md-typeset .md-clipboard:hover:before, +[data-md-color-accent=deep-orange] .md-typeset [id] .headerlink:focus, +[data-md-color-accent=deep-orange] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent=deep-orange] .md-typeset [id]:target .headerlink { + color: #ff6e40 +} + +[data-md-color-accent=deep-orange] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff6e40 +} + +[data-md-color-accent=deep-orange] .md-search-result__link:hover, +[data-md-color-accent=deep-orange] .md-search-result__link[data-md-state=active] { + background-color: rgba(255, 110, 64, .1) +} + +[data-md-color-accent=deep-orange] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff6e40 +} + +[data-md-color-accent=deep-orange] .md-source-file:hover:before { + background-color: #ff6e40 +} + +@media only screen and (max-width:59.9375em) { + [data-md-color-primary=red] .md-nav__source { + background-color: rgba(190, 66, 64, .9675) + } + [data-md-color-primary=pink] .md-nav__source { + background-color: rgba(185, 24, 79, .9675) + } + [data-md-color-primary=purple] .md-nav__source { + background-color: rgba(136, 57, 150, .9675) + } + [data-md-color-primary=deep-purple] .md-nav__source { + background-color: rgba(100, 69, 154, .9675) + } + [data-md-color-primary=indigo] .md-nav__source { + background-color: rgba(50, 64, 144, .9675) + } + [data-md-color-primary=blue] .md-nav__source { + background-color: rgba(26, 119, 193, .9675) + } + [data-md-color-primary=light-blue] .md-nav__source { + background-color: rgba(2, 134, 194, .9675) + } + [data-md-color-primary=cyan] .md-nav__source { + background-color: rgba(0, 150, 169, .9675) + } + [data-md-color-primary=teal] .md-nav__source { + background-color: rgba(0, 119, 108, .9675) + } + [data-md-color-primary=green] .md-nav__source { + background-color: rgba(60, 139, 64, .9675) + } + [data-md-color-primary=light-green] .md-nav__source { + background-color: rgba(99, 142, 53, .9675) + } + [data-md-color-primary=lime] .md-nav__source { + background-color: rgba(153, 161, 41, .9675) + } + [data-md-color-primary=yellow] .md-nav__source { + background-color: rgba(198, 134, 29, .9675) + } + [data-md-color-primary=amber] .md-nav__source { + background-color: rgba(203, 127, 0, .9675) + } + [data-md-color-primary=orange] .md-nav__source { + background-color: rgba(200, 111, 0, .9675) + } + [data-md-color-primary=deep-orange] .md-nav__source { + background-color: rgba(203, 89, 53, .9675) + } + [data-md-color-primary=brown] .md-nav__source { + background-color: rgba(96, 68, 57, .9675) + } + [data-md-color-primary=grey] .md-nav__source { + background-color: rgba(93, 93, 93, .9675) + } + [data-md-color-primary=blue-grey] .md-nav__source { + background-color: rgba(67, 88, 97, .9675) + } + [data-md-color-primary=white] .md-nav__source { + background-color: rgba(0, 0, 0, .07); + color: rgba(0, 0, 0, .87) + } +} + +@media only screen and (max-width:76.1875em) { + html [data-md-color-primary=red] .md-nav--primary .md-nav__title--site { + background-color: #ef5350 + } + html [data-md-color-primary=pink] .md-nav--primary .md-nav__title--site { + background-color: #e91e63 + } + html [data-md-color-primary=purple] .md-nav--primary .md-nav__title--site { + background-color: #ab47bc + } + html [data-md-color-primary=deep-purple] .md-nav--primary .md-nav__title--site { + background-color: #7e57c2 + } + html [data-md-color-primary=indigo] .md-nav--primary .md-nav__title--site { + background-color: #3f51b5 + } + html [data-md-color-primary=blue] .md-nav--primary .md-nav__title--site { + background-color: #2196f3 + } + html [data-md-color-primary=light-blue] .md-nav--primary .md-nav__title--site { + background-color: #03a9f4 + } + html [data-md-color-primary=cyan] .md-nav--primary .md-nav__title--site { + background-color: #00bcd4 + } + html [data-md-color-primary=teal] .md-nav--primary .md-nav__title--site { + background-color: #009688 + } + html [data-md-color-primary=green] .md-nav--primary .md-nav__title--site { + background-color: #4caf50 + } + html [data-md-color-primary=light-green] .md-nav--primary .md-nav__title--site { + background-color: #7cb342 + } + html [data-md-color-primary=lime] .md-nav--primary .md-nav__title--site { + background-color: #c0ca33 + } + html [data-md-color-primary=yellow] .md-nav--primary .md-nav__title--site { + background-color: #f9a825 + } + html [data-md-color-primary=amber] .md-nav--primary .md-nav__title--site { + background-color: #ffa000 + } + html [data-md-color-primary=orange] .md-nav--primary .md-nav__title--site { + background-color: #fb8c00 + } + html [data-md-color-primary=deep-orange] .md-nav--primary .md-nav__title--site { + background-color: #ff7043 + } + html [data-md-color-primary=brown] .md-nav--primary .md-nav__title--site { + background-color: #795548 + } + html [data-md-color-primary=grey] .md-nav--primary .md-nav__title--site { + background-color: #757575 + } + html [data-md-color-primary=blue-grey] .md-nav--primary .md-nav__title--site { + background-color: #546e7a + } + html [data-md-color-primary=white] .md-nav--primary .md-nav__title--site { + background-color: #fff; + color: rgba(0, 0, 0, .87) + } + [data-md-color-primary=white] .md-hero { + border-bottom: .05rem solid rgba(0, 0, 0, .07) + } +} + +@media only screen and (min-width:76.25em) { + [data-md-color-primary=red] .md-tabs { + background-color: #ef5350 + } + [data-md-color-primary=pink] .md-tabs { + background-color: #e91e63 + } + [data-md-color-primary=purple] .md-tabs { + background-color: #ab47bc + } + [data-md-color-primary=deep-purple] .md-tabs { + background-color: #7e57c2 + } + [data-md-color-primary=indigo] .md-tabs { + background-color: #3f51b5 + } + [data-md-color-primary=blue] .md-tabs { + background-color: #2196f3 + } + [data-md-color-primary=light-blue] .md-tabs { + background-color: #03a9f4 + } + [data-md-color-primary=cyan] .md-tabs { + background-color: #00bcd4 + } + [data-md-color-primary=teal] .md-tabs { + background-color: #009688 + } + [data-md-color-primary=green] .md-tabs { + background-color: #4caf50 + } + [data-md-color-primary=light-green] .md-tabs { + background-color: #7cb342 + } + [data-md-color-primary=lime] .md-tabs { + background-color: #c0ca33 + } + [data-md-color-primary=yellow] .md-tabs { + background-color: #f9a825 + } + [data-md-color-primary=amber] .md-tabs { + background-color: #ffa000 + } + [data-md-color-primary=orange] .md-tabs { + background-color: #fb8c00 + } + [data-md-color-primary=deep-orange] .md-tabs { + background-color: #ff7043 + } + [data-md-color-primary=brown] .md-tabs { + background-color: #795548 + } + [data-md-color-primary=grey] .md-tabs { + background-color: #757575 + } + [data-md-color-primary=blue-grey] .md-tabs { + background-color: #546e7a + } + [data-md-color-primary=white] .md-tabs { + border-bottom: .05rem solid rgba(0, 0, 0, .07); + background-color: #fff; + color: rgba(0, 0, 0, .87) + } +} + +@media only screen and (min-width:60em) { + [data-md-color-primary=white] .md-search__input { + background-color: rgba(0, 0, 0, .07) + } + [data-md-color-primary=white] .md-search__input::-webkit-input-placeholder { + color: rgba(0, 0, 0, .54) + } + [data-md-color-primary=white] .md-search__input:-ms-input-placeholder { + color: rgba(0, 0, 0, .54) + } + [data-md-color-primary=white] .md-search__input::-ms-input-placeholder { + color: rgba(0, 0, 0, .54) + } + [data-md-color-primary=white] .md-search__input::placeholder { + color: rgba(0, 0, 0, .54) + } +} diff --git a/docs/api/py/_static/stylesheets/application.css b/docs/api/py/_static/stylesheets/application.css new file mode 100644 index 0000000000000..4abdd66d1abde --- /dev/null +++ b/docs/api/py/_static/stylesheets/application.css @@ -0,0 +1,2871 @@ +@charset "UTF-8"; +html{ + box-sizing:border-box +} +*,:after,:before{ + box-sizing:inherit +} +html{ + -webkit-text-size-adjust:none; + -moz-text-size-adjust:none; + -ms-text-size-adjust:none; + text-size-adjust:none +} +body{ + margin:0 +} +hr{ + overflow:visible; + box-sizing:content-box +} +a{ + -webkit-text-decoration-skip:objects +} +a,button,input,label{ + -webkit-tap-highlight-color:transparent +} +a{ + color:inherit; + text-decoration:none +} +small,sub,sup{ + font-size:80% +} +sub,sup{ + position:relative; + line-height:0; + vertical-align:baseline +} +sub{ + bottom:-.25em +} +sup{ + top:-.5em +} +img{ + border-style:none +} +table{ + border-collapse:separate; + border-spacing:0 +} +td,th{ + font-weight:400; + vertical-align:top +} +button{ + margin:0; + padding:0; + border:0; + outline-style:none; + background:transparent; + font-size:inherit +} +input{ + border:0; + outline:0 +} +.md-clipboard:before,.md-icon,.md-nav__button,.md-nav__link:after,.md-nav__title:before,.md-search-result__article--document:before,.md-source-file:before,.md-typeset .admonition>.admonition-title:before,.md-typeset .admonition>summary:before,.md-typeset .critic.comment:before,.md-typeset .footnote-backref,.md-typeset .task-list-control .task-list-indicator:before,.md-typeset details>.admonition-title:before,.md-typeset details>summary:before,.md-typeset summary:after{ + font-family:Material Icons; + font-style:normal; + font-variant:normal; + font-weight:400; + line-height:1; + text-transform:none; + white-space:nowrap; + speak:none; + word-wrap:normal; + direction:ltr +} +.md-content__icon,.md-footer-nav__button,.md-header-nav__button,.md-nav__button,.md-nav__title:before,.md-search-result__article--document:before{ + display:inline-block; + margin:.2rem; + padding:.4rem; + font-size:1.2rem; + cursor:pointer +} +.md-icon--arrow-back:before{ + content:"" +} +.md-icon--arrow-forward:before{ + content:"" +} +.md-icon--menu:before{ + content:"" +} +.md-icon--search:before{ + content:"" +} +[dir=rtl] .md-icon--arrow-back:before{ + content:"" +} +[dir=rtl] .md-icon--arrow-forward:before{ + content:"" +} +body{ + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale +} +body,input{ + color:rgba(0,0,0,.87); + -webkit-font-feature-settings:"kern","liga"; + font-feature-settings:"kern","liga"; + font-family:"Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif; +} +code,kbd,pre{ + color:rgba(0,0,0,.87); + -webkit-font-feature-settings:"kern"; + font-feature-settings:"kern"; + font-family:"Roboto Mono", "Courier New", Courier, monospace; +} +.md-typeset{ + font-size:.8rem; + line-height:1.6; + -webkit-print-color-adjust:exact +} +.md-typeset blockquote,.md-typeset ol,.md-typeset p,.md-typeset ul{ + margin:1em 0 +} +.md-typeset h1{ + margin:0 0 2rem; + color:rgba(0,0,0,.54); + font-size:1.5625rem; + line-height:1.3 +} +.md-typeset h1,.md-typeset h2{ + font-weight:300; + letter-spacing:-.01em +} +.md-typeset h2{ + margin:2rem 0 .8rem; + font-size:1.25rem; + line-height:1.4 +} +.md-typeset h3{ + margin:1.6rem 0 .8rem; + font-size:1rem; + font-weight:400; + letter-spacing:-.01em; + line-height:1.5 +} +.md-typeset h2+h3{ + margin-top:.8rem +} +.md-typeset h4{ + font-size:.8rem +} +.md-typeset h4,.md-typeset h5,.md-typeset h6{ + margin:.8rem 0; + font-weight:700; + letter-spacing:-.01em +} +.md-typeset h5,.md-typeset h6{ + color:rgba(0,0,0,.54); + font-size:.64rem +} +.md-typeset h5{ + text-transform:uppercase +} +.md-typeset hr{ + margin:1.5em 0; + border-bottom:.05rem dotted rgba(0,0,0,.26) +} +.md-typeset a{ + color:#3f51b5; + word-break:break-word +} +.md-typeset a,.md-typeset a:before{ + transition:color .125s +} +.md-typeset a:active,.md-typeset a:hover{ + color:#536dfe +} +.md-typeset code,.md-typeset pre{ + background-color:hsla(0,0%,92.5%,.5); + color:#37474f; + font-size:85%; + direction:ltr +} +.md-typeset code{ + margin:0 .29412em; + padding:.07353em 0; + border-radius:.1rem; + word-break:break-word; + -webkit-box-decoration-break:clone; + box-decoration-break:clone +} +/* TODO: Reverted from #35, needs a different fix +.md-typeset code::before { + content: "\00a0"; +} +.md-typeset code::after { + content: "\00a0"; +} +*/ +.md-typeset h1 code,.md-typeset h2 code,.md-typeset h3 code,.md-typeset h4 code,.md-typeset h5 code,.md-typeset h6 code{ + margin:0; + background-color:transparent; + box-shadow:none +} +.md-typeset a>code{ + margin:inherit; + padding:inherit; + border-radius:initial; + background-color:inherit; + color:inherit; + box-shadow:none +} +.md-typeset pre{ + position:relative; + margin:1em 0; + border-radius:.1rem; + line-height:1.4; + -webkit-overflow-scrolling:touch +} +.md-typeset pre>code{ + /* + See GH #32 + display:block; + */ + margin:0; + padding:.525rem .6rem; + background-color:transparent; + font-size:inherit; + box-shadow:none; + -webkit-box-decoration-break:slice; + box-decoration-break:slice; + overflow:auto +} +.md-typeset pre>code::-webkit-scrollbar{ + width:.2rem; + height:.2rem +} +.md-typeset pre>code::-webkit-scrollbar-thumb{ + background-color:rgba(0,0,0,.26) +} +.md-typeset pre>code::-webkit-scrollbar-thumb:hover{ + background-color:#536dfe +} +.md-typeset kbd{ + padding:0 .29412em; + border-radius:.15rem; + border:.05rem solid #c9c9c9; + border-bottom-color:#bcbcbc; + background-color:#fcfcfc; + color:#555; + font-size:85%; + box-shadow:0 .05rem 0 #b0b0b0; + word-break:break-word +} +.md-typeset mark{ + margin:0 .25em; + padding:.0625em 0; + border-radius:.1rem; + background-color:rgba(255,235,59,.5); + box-shadow:.25em 0 0 rgba(255,235,59,.5),-.25em 0 0 rgba(255,235,59,.5); + word-break:break-word; + -webkit-box-decoration-break:clone; + box-decoration-break:clone +} +.md-typeset abbr{ + border-bottom:.05rem dotted rgba(0,0,0,.54); + text-decoration:none; + cursor:help +} +.md-typeset small{ + opacity:.75 +} +.md-typeset sub,.md-typeset sup{ + margin-left:.07812em +} +[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{ + margin-right:.07812em; + margin-left:0 +} +.md-typeset blockquote{ + padding-left:.6rem; + border-left:.2rem solid rgba(0,0,0,.26); + color:rgba(0,0,0,.54) +} +[dir=rtl] .md-typeset blockquote{ + padding-right:.6rem; + padding-left:0; + border-right:.2rem solid rgba(0,0,0,.26); + border-left:initial +} +.md-typeset ul{ + list-style-type:disc +} +.md-typeset ol,.md-typeset ul{ + margin-left:.625em; + padding:0 +} +[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{ + margin-right:.625em; + margin-left:0 +} +.md-typeset ol ol,.md-typeset ul ol{ + list-style-type:lower-alpha +} +.md-typeset ol ol ol,.md-typeset ul ol ol{ + list-style-type:lower-roman +} +.md-typeset ol li,.md-typeset ul li{ + margin-bottom:.5em; + margin-left:1.25em +} +[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{ + margin-right:1.25em; + margin-left:0 +} +.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{ + margin:.5em 0 +} +.md-typeset ol li:last-child,.md-typeset ul li:last-child{ + margin-bottom:0 +} +.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{ + margin:.5em 0 .5em .625em +} +[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{ + margin-right:.625em; + margin-left:0 +} +.md-typeset dd{ + margin:1em 0 1em 1.875em +} +[dir=rtl] .md-typeset dd{ + margin-right:1.875em; + margin-left:0 +} +.md-typeset iframe,.md-typeset img,.md-typeset svg{ + max-width:100% +} +.md-typeset table:not([class]){ + box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2); + display:inline-block; + max-width:100%; + border-radius:.1rem; + font-size:.64rem; + overflow:auto; + -webkit-overflow-scrolling:touch +} +.md-typeset table:not([class])+*{ + margin-top:1.5em +} +.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){ + text-align:left +} +[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){ + text-align:right +} +.md-typeset table:not([class]) th{ + min-width:5rem; + padding:.6rem .8rem; + background-color:rgba(0,0,0,.54); + color:#fff; + vertical-align:top +} +.md-typeset table:not([class]) td{ + padding:.6rem .8rem; + border-top:.05rem solid rgba(0,0,0,.07); + vertical-align:top +} +.md-typeset table:not([class]) tr{ + transition:background-color .125s +} +.md-typeset table:not([class]) tr:hover{ + background-color:rgba(0,0,0,.035); + box-shadow:inset 0 .05rem 0 #fff +} +.md-typeset table:not([class]) tr:first-child td{ + border-top:0 +} +.md-typeset table:not([class]) a{ + word-break:normal +} +.md-typeset__scrollwrap{ + margin:1em -.8rem; + overflow-x:auto; + -webkit-overflow-scrolling:touch +} +.md-typeset .md-typeset__table{ + display:inline-block; + margin-bottom:.5em; + padding:0 .8rem +} +.md-typeset .md-typeset__table table{ + display:table; + width:100%; + margin:0; + overflow:hidden +} +html{ + font-size:125%; + overflow-x:hidden +} +body,html{ + height:100% +} +body{ + position:relative; + font-size:.5rem +} +hr{ + display:block; + height:.05rem; + padding:0; + border:0 +} +.md-svg{ + display:none +} +.md-grid{ + max-width:73rem; + margin-right:auto; + margin-left:auto +} +.md-container,.md-main{ + overflow:auto +} +.md-container{ + display:table; + width:100%; + height:100%; + padding-top:2.4rem; + table-layout:fixed +} +.md-main{ + display:table-row; + height:100% +} +.md-main__inner{ + height:100%; + padding-top:1.5rem; + padding-bottom:.05rem +} +.md-toggle{ + display:none +} +.md-overlay{ + position:fixed; + top:0; + width:0; + height:0; + transition:width 0s .25s,height 0s .25s,opacity .25s; + background-color:rgba(0,0,0,.54); + opacity:0; + z-index:3 +} +.md-flex{ + display:table +} +.md-flex__cell{ + display:table-cell; + position:relative; + vertical-align:top +} +.md-flex__cell--shrink{ + width:0 +} +.md-flex__cell--stretch{ + display:table; + width:100%; + table-layout:fixed +} +.md-flex__ellipsis{ + display:table-cell; + text-overflow:ellipsis; + white-space:nowrap; + overflow:hidden +} +.md-skip{ + position:fixed; + width:.05rem; + height:.05rem; + margin:.5rem; + padding:.3rem .5rem; + -webkit-transform:translateY(.4rem); + transform:translateY(.4rem); + border-radius:.1rem; + background-color:rgba(0,0,0,.87); + color:#fff; + font-size:.64rem; + opacity:0; + overflow:hidden +} +.md-skip:focus{ + width:auto; + height:auto; + clip:auto; + -webkit-transform:translateX(0); + transform:translateX(0); + transition:opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1); + transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms; + transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1); + opacity:1; + z-index:10 +} +@page{ + margin:25mm +} +.md-clipboard{ + position:absolute; + top:.3rem; + right:.3rem; + width:1.4rem; + height:1.4rem; + border-radius:.1rem; + font-size:.8rem; + cursor:pointer; + z-index:1; + -webkit-backface-visibility:hidden; + backface-visibility:hidden +} +.md-clipboard:before{ + transition:color .25s,opacity .25s; + color:rgba(0,0,0,.07); + content:"\E14D" +} +.codehilite:hover .md-clipboard:before,.md-typeset .highlight:hover .md-clipboard:before,pre:hover .md-clipboard:before{ + color:rgba(0,0,0,.54) +} +.md-clipboard:focus:before,.md-clipboard:hover:before{ + color:#536dfe +} +.md-clipboard__message{ + display:block; + position:absolute; + top:0; + right:1.7rem; + padding:.3rem .5rem; + -webkit-transform:translateX(.4rem); + transform:translateX(.4rem); + transition:opacity .175s,-webkit-transform .25s cubic-bezier(.9,.1,.9,0); + transition:transform .25s cubic-bezier(.9,.1,.9,0),opacity .175s; + transition:transform .25s cubic-bezier(.9,.1,.9,0),opacity .175s,-webkit-transform .25s cubic-bezier(.9,.1,.9,0); + border-radius:.1rem; + background-color:rgba(0,0,0,.54); + color:#fff; + font-size:.64rem; + white-space:nowrap; + opacity:0; + pointer-events:none +} +.md-clipboard__message--active{ + -webkit-transform:translateX(0); + transform:translateX(0); + transition:opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1); + transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms; + transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1); + opacity:1; + pointer-events:auto +} +.md-clipboard__message:before{ + content:attr(aria-label) +} +.md-clipboard__message:after{ + display:block; + position:absolute; + top:50%; + right:-.2rem; + width:0; + margin-top:-.2rem; + border-color:transparent rgba(0,0,0,.54); + border-style:solid; + border-width:.2rem 0 .2rem .2rem; + content:"" +} +.md-content__inner{ + margin:0 .8rem 1.2rem; + padding-top:.6rem +} +.md-content__inner:before{ + display:block; + height:.4rem; + content:"" +} +.md-content__inner>:last-child{ + margin-bottom:0 +} +.md-content__icon{ + position:relative; + margin:.4rem 0; + padding:0; + float:right +} +.md-typeset .md-content__icon{ + color:rgba(0,0,0,.26) +} +.md-header{ + position:fixed; + top:0; + right:0; + left:0; + height:2.4rem; + transition:background-color .25s,color .25s; + background-color:#3f51b5; + color:#fff; + box-shadow:none; + z-index:2; + -webkit-backface-visibility:hidden; + backface-visibility:hidden +} +.no-js .md-header{ + transition:none; + box-shadow:none +} +.md-header[data-md-state=shadow]{ + transition:background-color .25s,color .25s,box-shadow .25s; + box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2) +} +.md-header-nav{ + padding:0 .2rem +} +.md-header-nav__button{ + position:relative; + transition:opacity .25s; + z-index:1 +} +.md-header-nav__button:hover{ + opacity:.7 +} +.md-header-nav__button.md-logo *{ + display:block +} +.no-js .md-header-nav__button.md-icon--search{ + display:none +} +.md-header-nav__topic{ + display:block; + position:absolute; + transition:opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1); + transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s; + transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1); + text-overflow:ellipsis; + white-space:nowrap; + overflow:hidden +} +.md-header-nav__topic+.md-header-nav__topic{ + -webkit-transform:translateX(1.25rem); + transform:translateX(1.25rem); + transition:opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1); + transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s; + transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1); + opacity:0; + z-index:-1; + pointer-events:none +} +[dir=rtl] .md-header-nav__topic+.md-header-nav__topic{ + -webkit-transform:translateX(-1.25rem); + transform:translateX(-1.25rem) +} +.no-js .md-header-nav__topic{ + position:static +} +.no-js .md-header-nav__topic+.md-header-nav__topic{ + display:none +} +.md-header-nav__title{ + padding:0 1rem; + font-size:.9rem; + line-height:2.4rem +} +.md-header-nav__title[data-md-state=active] .md-header-nav__topic{ + -webkit-transform:translateX(-1.25rem); + transform:translateX(-1.25rem); + transition:opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1); + transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s; + transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1); + opacity:0; + z-index:-1; + pointer-events:none +} +[dir=rtl] .md-header-nav__title[data-md-state=active] .md-header-nav__topic{ + -webkit-transform:translateX(1.25rem); + transform:translateX(1.25rem) +} +.md-header-nav__title[data-md-state=active] .md-header-nav__topic+.md-header-nav__topic{ + -webkit-transform:translateX(0); + transform:translateX(0); + transition:opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1); + transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s; + transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1); + opacity:1; + z-index:0; + pointer-events:auto +} +.md-header-nav__source{ + display:none +} +.md-hero{ + transition:background .25s; + background-color:#3f51b5; + color:#fff; + font-size:1rem; + overflow:hidden +} +.md-hero__inner{ + margin-top:1rem; + padding:.8rem .8rem .4rem; + transition:opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1); + transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s; + transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1); + transition-delay:.1s +} +[data-md-state=hidden] .md-hero__inner{ + pointer-events:none; + -webkit-transform:translateY(.625rem); + transform:translateY(.625rem); + transition:opacity .1s 0s,-webkit-transform 0s .4s; + transition:transform 0s .4s,opacity .1s 0s; + transition:transform 0s .4s,opacity .1s 0s,-webkit-transform 0s .4s; + opacity:0 +} +.md-hero--expand .md-hero__inner{ + margin-bottom:1.2rem +} +.md-footer-nav{ + background-color:rgba(0,0,0,.87); + color:#fff +} +.md-footer-nav__inner{ + padding:.2rem; + overflow:auto +} +.md-footer-nav__link{ + padding-top:1.4rem; + padding-bottom:.4rem; + transition:opacity .25s +} +.md-footer-nav__link:hover{ + opacity:.7 +} +.md-footer-nav__link--prev{ + width:25%; + float:left +} +[dir=rtl] .md-footer-nav__link--prev{ + float:right +} +.md-footer-nav__link--next{ + width:75%; + float:right; + text-align:right +} +[dir=rtl] .md-footer-nav__link--next{ + float:left; + text-align:left +} +.md-footer-nav__button{ + transition:background .25s +} +.md-footer-nav__title{ + position:relative; + padding:0 1rem; + font-size:.9rem; + line-height:2.4rem +} +.md-footer-nav__direction{ + position:absolute; + right:0; + left:0; + margin-top:-1rem; + padding:0 1rem; + color:hsla(0,0%,100%,.7); + font-size:.75rem +} +.md-footer-meta{ + background-color:rgba(0,0,0,.895) +} +.md-footer-meta__inner{ + padding:.2rem; + overflow:auto +} +html .md-footer-meta.md-typeset a{ + color:hsla(0,0%,100%,.7) +} +html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{ + color:#fff +} +.md-footer-copyright{ + margin:0 .6rem; + padding:.4rem 0; + color:hsla(0,0%,100%,.3); + font-size:.64rem +} +.md-footer-copyright__highlight{ + color:hsla(0,0%,100%,.7) +} +.md-footer-social{ + margin:0 .4rem; + padding:.2rem 0 .6rem +} +.md-footer-social__link{ + display:inline-block; + width:1.6rem; + height:1.6rem; + font-size:.8rem; + text-align:center +} +.md-footer-social__link:before{ + line-height:1.9 +} +.md-nav{ + font-size:.7rem; + line-height:1.3 +} +.md-nav__title{ + display:block; + padding:0 .6rem; + font-weight:700; + text-overflow:ellipsis; + overflow:hidden +} +.md-nav__title:before{ + display:none; + content:"\E5C4" +} +[dir=rtl] .md-nav__title:before{ + content:"\E5C8" +} +.md-nav__title .md-nav__button{ + display:none +} +.md-nav__list{ + margin:0; + padding:0; + list-style:none +} +.md-nav__item{ + padding:0 .6rem +} +.md-nav__item:last-child{ + padding-bottom:.6rem +} +.md-nav__item .md-nav__item{ + padding-right:0 +} +[dir=rtl] .md-nav__item .md-nav__item{ + padding-right:.6rem; + padding-left:0 +} +.md-nav__item .md-nav__item:last-child{ + padding-bottom:0 +} +.md-nav__button img{ + width:100%; + height:auto +} +.md-nav__link{ + display:block; + margin-top:.625em; + transition:color .125s; + text-overflow:ellipsis; + cursor:pointer; + overflow:hidden +} +.md-nav__item--nested>.md-nav__link:after{ + content:"\E313" +} +html .md-nav__link[for=__toc],html .md-nav__link[for=__toc]+.md-nav__link:after,html .md-nav__link[for=__toc]~.md-nav{ + display:none +} +.md-nav__link[data-md-state=blur]{ + color:rgba(0,0,0,.54) +} +.md-nav__link--active,.md-nav__link:active{ + color:#3f51b5 +} +.md-nav__item--nested>.md-nav__link{ + color:inherit +} +.md-nav__link:focus,.md-nav__link:hover{ + color:#536dfe +} +.md-nav__source,.no-js .md-search{ + display:none +} +.md-search__overlay{ + opacity:0; + z-index:1 +} +.md-search__form{ + position:relative +} +.md-search__input{ + position:relative; + padding:0 2.2rem 0 3.6rem; + text-overflow:ellipsis; + z-index:2 +} +[dir=rtl] .md-search__input{ + padding:0 3.6rem 0 2.2rem +} +.md-search__input::-webkit-input-placeholder{ + transition:color .25s cubic-bezier(.1,.7,.1,1) +} +.md-search__input:-ms-input-placeholder{ + transition:color .25s cubic-bezier(.1,.7,.1,1) +} +.md-search__input::-ms-input-placeholder{ + transition:color .25s cubic-bezier(.1,.7,.1,1) +} +.md-search__input::placeholder{ + transition:color .25s cubic-bezier(.1,.7,.1,1) +} +.md-search__input::-webkit-input-placeholder,.md-search__input~.md-search__icon{ + color:rgba(0,0,0,.54) +} +.md-search__input:-ms-input-placeholder,.md-search__input~.md-search__icon{ + color:rgba(0,0,0,.54) +} +.md-search__input::-ms-input-placeholder,.md-search__input~.md-search__icon{ + color:rgba(0,0,0,.54) +} +.md-search__input::placeholder,.md-search__input~.md-search__icon{ + color:rgba(0,0,0,.54) +} +.md-search__input::-ms-clear{ + display:none +} +.md-search__icon{ + position:absolute; + transition:color .25s cubic-bezier(.1,.7,.1,1),opacity .25s; + font-size:1.2rem; + cursor:pointer; + z-index:2 +} +.md-search__icon:hover{ + opacity:.7 +} +.md-search__icon[for=__search]{ + top:.3rem; + left:.5rem +} +[dir=rtl] .md-search__icon[for=__search]{ + right:.5rem; + left:auto +} +.md-search__icon[for=__search]:before{ + content:"\E8B6" +} +.md-search__icon[type=reset]{ + top:.3rem; + right:.5rem; + -webkit-transform:scale(.125); + transform:scale(.125); + transition:opacity .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1); + transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s; + transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1); + opacity:0 +} +[dir=rtl] .md-search__icon[type=reset]{ + right:auto; + left:.5rem +} +[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__icon[type=reset]{ + -webkit-transform:scale(1); + transform:scale(1); + opacity:1 +} +[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__icon[type=reset]:hover{ + opacity:.7 +} +.md-search__output{ + position:absolute; + width:100%; + border-radius:0 0 .1rem .1rem; + overflow:hidden; + z-index:1 +} +.md-search__scrollwrap{ + height:100%; + background-color:#fff; + box-shadow:inset 0 .05rem 0 rgba(0,0,0,.07); + overflow-y:auto; + -webkit-overflow-scrolling:touch +} +.md-search-result{ + color:rgba(0,0,0,.87); + word-break:break-word +} +.md-search-result__meta{ + padding:0 .8rem; + background-color:rgba(0,0,0,.07); + color:rgba(0,0,0,.54); + font-size:.64rem; + line-height:1.8rem +} +.md-search-result__list{ + margin:0; + padding:0; + border-top:.05rem solid rgba(0,0,0,.07); + list-style:none +} +.md-search-result__item{ + box-shadow:0 -.05rem 0 rgba(0,0,0,.07) +} +.md-search-result__link{ + display:block; + transition:background .25s; + outline:0; + overflow:hidden +} +.md-search-result__link:hover,.md-search-result__link[data-md-state=active]{ + background-color:rgba(83,109,254,.1) +} +.md-search-result__link:hover .md-search-result__article:before,.md-search-result__link[data-md-state=active] .md-search-result__article:before{ + opacity:.7 +} +.md-search-result__link:last-child .md-search-result__teaser{ + margin-bottom:.6rem +} +.md-search-result__article{ + position:relative; + padding:0 .8rem; + overflow:auto +} +.md-search-result__article--document:before{ + position:absolute; + left:0; + margin:.1rem; + transition:opacity .25s; + color:rgba(0,0,0,.54); + content:"\E880" +} +[dir=rtl] .md-search-result__article--document:before{ + right:0; + left:auto +} +.md-search-result__article--document .md-search-result__title{ + margin:.55rem 0; + font-size:.8rem; + font-weight:400; + line-height:1.4 +} +.md-search-result__title{ + margin:.5em 0; + font-size:.64rem; + font-weight:700; + line-height:1.4 +} +.md-search-result__teaser{ + display:-webkit-box; + max-height:1.65rem; + margin:.5em 0; + color:rgba(0,0,0,.54); + font-size:.64rem; + line-height:1.4; + text-overflow:ellipsis; + overflow:hidden; + -webkit-line-clamp:2 +} +.md-search-result em{ + font-style:normal; + font-weight:700; + text-decoration:underline +} +.md-sidebar{ + position:absolute; + width:12.1rem; + padding:1.2rem 0; + overflow:hidden +} +.md-sidebar[data-md-state=lock]{ + position:fixed; + top:2.4rem +} +.md-sidebar--secondary{ + display:none +} +.md-sidebar__scrollwrap{ + max-height:100%; + margin:0 .2rem; + overflow-y:auto; + -webkit-backface-visibility:hidden; + backface-visibility:hidden +} +.md-sidebar__scrollwrap::-webkit-scrollbar{ + width:.2rem; + height:.2rem +} +.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{ + background-color:rgba(0,0,0,.26) +} +.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{ + background-color:#536dfe +} + +.rst-versions { + /* Read the Docs' versions menu */ + font-size: .85rem; +} + +@-webkit-keyframes md-source__facts--done{ + 0%{ + height:0 + } + to{ + height:.65rem + } +} +@keyframes md-source__facts--done{ + 0%{ + height:0 + } + to{ + height:.65rem + } +} +@-webkit-keyframes md-source__fact--done{ + 0%{ + -webkit-transform:translateY(100%); + transform:translateY(100%); + opacity:0 + } + 50%{ + opacity:0 + } + to{ + -webkit-transform:translateY(0); + transform:translateY(0); + opacity:1 + } +} +@keyframes md-source__fact--done{ + 0%{ + -webkit-transform:translateY(100%); + transform:translateY(100%); + opacity:0 + } + 50%{ + opacity:0 + } + to{ + -webkit-transform:translateY(0); + transform:translateY(0); + opacity:1 + } +} +.md-source{ + display:block; + padding-right:.6rem; + transition:opacity .25s; + font-size:.65rem; + line-height:1.2; + white-space:nowrap +} +[dir=rtl] .md-source{ + padding-right:0; + padding-left:.6rem +} +.md-source:hover{ + opacity:.7 +} +.md-source:after,.md-source__icon{ + display:inline-block; + height:2.4rem; + content:""; + vertical-align:middle +} +.md-source__icon{ + width:2.4rem +} +.md-source__icon svg{ + width:1.2rem; + height:1.2rem; + margin-top:.6rem; + margin-left:.6rem +} +[dir=rtl] .md-source__icon svg{ + margin-right:.6rem; + margin-left:0 +} +.md-source__icon+.md-source__repository{ + margin-left:-2rem; + padding-left:2rem +} +[dir=rtl] .md-source__icon+.md-source__repository{ + margin-right:-2rem; + margin-left:0; + padding-right:2rem; + padding-left:0 +} +.md-source__repository{ + display:inline-block; + max-width:100%; + margin-left:.6rem; + font-weight:700; + text-overflow:ellipsis; + overflow:hidden; + vertical-align:middle +} +.md-source__facts{ + margin:0; + padding:0; + font-size:.55rem; + font-weight:700; + list-style-type:none; + opacity:.75; + overflow:hidden +} +[data-md-state=done] .md-source__facts{ + -webkit-animation:md-source__facts--done .25s ease-in; + animation:md-source__facts--done .25s ease-in +} +.md-source__fact{ + float:left +} +[dir=rtl] .md-source__fact{ + float:right +} +[data-md-state=done] .md-source__fact{ + -webkit-animation:md-source__fact--done .4s ease-out; + animation:md-source__fact--done .4s ease-out +} +.md-source__fact:before{ + margin:0 .1rem; + content:"\00B7" +} +.md-source__fact:first-child:before{ + display:none +} +.md-source-file{ + display:inline-block; + margin:1em .5em 1em 0; + padding-right:.25rem; + border-radius:.1rem; + background-color:rgba(0,0,0,.07); + font-size:.64rem; + list-style-type:none; + cursor:pointer; + overflow:hidden +} +.md-source-file:before{ + display:inline-block; + margin-right:.25rem; + padding:.25rem; + background-color:rgba(0,0,0,.26); + color:#fff; + font-size:.8rem; + content:"\E86F"; + vertical-align:middle +} +html .md-source-file{ + transition:background .4s,color .4s,box-shadow .4s cubic-bezier(.4,0,.2,1) +} +html .md-source-file:before{ + transition:inherit +} +html body .md-typeset .md-source-file{ + color:rgba(0,0,0,.54) +} +.md-source-file:hover{ + box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36) +} +.md-source-file:hover:before{ + background-color:#536dfe +} +.md-tabs{ + width:100%; + transition:background .25s; + background-color:#3f51b5; + color:#fff; + overflow:auto +} +.md-tabs__list{ + margin:0 0 0 .2rem; + padding:0; + list-style:none; + white-space:nowrap +} +.md-tabs__item{ + display:inline-block; + height:2.4rem; + padding-right:.6rem; + padding-left:.6rem +} +.md-tabs__link{ + display:block; + margin-top:.8rem; + transition:opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1); + transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s; + transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1); + font-size:.7rem; + opacity:.7 +} +.md-tabs__link--active,.md-tabs__link:hover{ + color:inherit; + opacity:1 +} +.md-tabs__item:nth-child(2) .md-tabs__link{ + transition-delay:.02s +} +.md-tabs__item:nth-child(3) .md-tabs__link{ + transition-delay:.04s +} +.md-tabs__item:nth-child(4) .md-tabs__link{ + transition-delay:.06s +} +.md-tabs__item:nth-child(5) .md-tabs__link{ + transition-delay:.08s +} +.md-tabs__item:nth-child(6) .md-tabs__link{ + transition-delay:.1s +} +.md-tabs__item:nth-child(7) .md-tabs__link{ + transition-delay:.12s +} +.md-tabs__item:nth-child(8) .md-tabs__link{ + transition-delay:.14s +} +.md-tabs__item:nth-child(9) .md-tabs__link{ + transition-delay:.16s +} +.md-tabs__item:nth-child(10) .md-tabs__link{ + transition-delay:.18s +} +.md-tabs__item:nth-child(11) .md-tabs__link{ + transition-delay:.2s +} +.md-tabs__item:nth-child(12) .md-tabs__link{ + transition-delay:.22s +} +.md-tabs__item:nth-child(13) .md-tabs__link{ + transition-delay:.24s +} +.md-tabs__item:nth-child(14) .md-tabs__link{ + transition-delay:.26s +} +.md-tabs__item:nth-child(15) .md-tabs__link{ + transition-delay:.28s +} +.md-tabs__item:nth-child(16) .md-tabs__link{ + transition-delay:.3s +} +.md-tabs[data-md-state=hidden]{ + pointer-events:none +} +.md-tabs[data-md-state=hidden] .md-tabs__link{ + -webkit-transform:translateY(50%); + transform:translateY(50%); + transition:color .25s,opacity .1s,-webkit-transform 0s .4s; + transition:color .25s,transform 0s .4s,opacity .1s; + transition:color .25s,transform 0s .4s,opacity .1s,-webkit-transform 0s .4s; + opacity:0 +} +.md-typeset .admonition,.md-typeset details{ + box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2); + position:relative; + margin:1.5625em 0; + padding:0 .6rem; + border-left:.2rem solid #448aff; + border-radius:.1rem; + font-size:.64rem; + overflow:auto +} +[dir=rtl] .md-typeset .admonition,[dir=rtl] .md-typeset details{ + border-right:.2rem solid #448aff; + border-left:none +} +html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{ + margin-bottom:.6rem +} +.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{ + margin:1em 0 +} +.md-typeset .admonition>.admonition-title,.md-typeset .admonition>summary,.md-typeset details>.admonition-title,.md-typeset details>summary{ + margin:0 -.6rem; + padding:.4rem .6rem .4rem 2rem; + border-bottom:.05rem solid rgba(68,138,255,.1); + background-color:rgba(68,138,255,.1); + font-weight:700 +} +[dir=rtl] .md-typeset .admonition>.admonition-title,[dir=rtl] .md-typeset .admonition>summary,[dir=rtl] .md-typeset details>.admonition-title,[dir=rtl] .md-typeset details>summary{ + padding:.4rem 2rem .4rem .6rem +} +.md-typeset .admonition>.admonition-title:last-child,.md-typeset .admonition>summary:last-child,.md-typeset details>.admonition-title:last-child,.md-typeset details>summary:last-child{ + margin-bottom:0 +} +.md-typeset .admonition>.admonition-title:before,.md-typeset .admonition>summary:before,.md-typeset details>.admonition-title:before,.md-typeset details>summary:before{ + position:absolute; + left:.6rem; + color:#448aff; + font-size:1rem; + content:"\E3C9" +} +[dir=rtl] .md-typeset .admonition>.admonition-title:before,[dir=rtl] .md-typeset .admonition>summary:before,[dir=rtl] .md-typeset details>.admonition-title:before,[dir=rtl] .md-typeset details>summary:before{ + right:.6rem; + left:auto +} +.md-typeset .admonition.abstract,.md-typeset .admonition.summary,.md-typeset .admonition.tldr,.md-typeset details.abstract,.md-typeset details.summary,.md-typeset details.tldr{ + border-left-color:#00b0ff +} +[dir=rtl] .md-typeset .admonition.abstract,[dir=rtl] .md-typeset .admonition.summary,[dir=rtl] .md-typeset .admonition.tldr,[dir=rtl] .md-typeset details.abstract,[dir=rtl] .md-typeset details.summary,[dir=rtl] .md-typeset details.tldr{ + border-right-color:#00b0ff +} +.md-typeset .admonition.abstract>.admonition-title,.md-typeset .admonition.abstract>summary,.md-typeset .admonition.summary>.admonition-title,.md-typeset .admonition.summary>summary,.md-typeset .admonition.tldr>.admonition-title,.md-typeset .admonition.tldr>summary,.md-typeset details.abstract>.admonition-title,.md-typeset details.abstract>summary,.md-typeset details.summary>.admonition-title,.md-typeset details.summary>summary,.md-typeset details.tldr>.admonition-title,.md-typeset details.tldr>summary{ + border-bottom-color:rgba(0,176,255,.1); + background-color:rgba(0,176,255,.1) +} +.md-typeset .admonition.abstract>.admonition-title:before,.md-typeset .admonition.abstract>summary:before,.md-typeset .admonition.summary>.admonition-title:before,.md-typeset .admonition.summary>summary:before,.md-typeset .admonition.tldr>.admonition-title:before,.md-typeset .admonition.tldr>summary:before,.md-typeset details.abstract>.admonition-title:before,.md-typeset details.abstract>summary:before,.md-typeset details.summary>.admonition-title:before,.md-typeset details.summary>summary:before,.md-typeset details.tldr>.admonition-title:before,.md-typeset details.tldr>summary:before{ + color:#00b0ff; + content:"" +} +.md-typeset .admonition.info,.md-typeset .admonition.todo,.md-typeset details.info,.md-typeset details.todo{ + border-left-color:#00b8d4 +} +[dir=rtl] .md-typeset .admonition.info,[dir=rtl] .md-typeset .admonition.todo,[dir=rtl] .md-typeset details.info,[dir=rtl] .md-typeset details.todo{ + border-right-color:#00b8d4 +} +.md-typeset .admonition.info>.admonition-title,.md-typeset .admonition.info>summary,.md-typeset .admonition.todo>.admonition-title,.md-typeset .admonition.todo>summary,.md-typeset details.info>.admonition-title,.md-typeset details.info>summary,.md-typeset details.todo>.admonition-title,.md-typeset details.todo>summary{ + border-bottom-color:rgba(0,184,212,.1); + background-color:rgba(0,184,212,.1) +} +.md-typeset .admonition.info>.admonition-title:before,.md-typeset .admonition.info>summary:before,.md-typeset .admonition.todo>.admonition-title:before,.md-typeset .admonition.todo>summary:before,.md-typeset details.info>.admonition-title:before,.md-typeset details.info>summary:before,.md-typeset details.todo>.admonition-title:before,.md-typeset details.todo>summary:before{ + color:#00b8d4; + content:"" +} +.md-typeset .admonition.hint,.md-typeset .admonition.important,.md-typeset .admonition.tip,.md-typeset details.hint,.md-typeset details.important,.md-typeset details.tip{ + border-left-color:#00bfa5 +} +[dir=rtl] .md-typeset .admonition.hint,[dir=rtl] .md-typeset .admonition.important,[dir=rtl] .md-typeset .admonition.tip,[dir=rtl] .md-typeset details.hint,[dir=rtl] .md-typeset details.important,[dir=rtl] .md-typeset details.tip{ + border-right-color:#00bfa5 +} +.md-typeset .admonition.hint>.admonition-title,.md-typeset .admonition.hint>summary,.md-typeset .admonition.important>.admonition-title,.md-typeset .admonition.important>summary,.md-typeset .admonition.tip>.admonition-title,.md-typeset .admonition.tip>summary,.md-typeset details.hint>.admonition-title,.md-typeset details.hint>summary,.md-typeset details.important>.admonition-title,.md-typeset details.important>summary,.md-typeset details.tip>.admonition-title,.md-typeset details.tip>summary{ + border-bottom-color:rgba(0,191,165,.1); + background-color:rgba(0,191,165,.1) +} +.md-typeset .admonition.hint>.admonition-title:before,.md-typeset .admonition.hint>summary:before,.md-typeset .admonition.important>.admonition-title:before,.md-typeset .admonition.important>summary:before,.md-typeset .admonition.tip>.admonition-title:before,.md-typeset .admonition.tip>summary:before,.md-typeset details.hint>.admonition-title:before,.md-typeset details.hint>summary:before,.md-typeset details.important>.admonition-title:before,.md-typeset details.important>summary:before,.md-typeset details.tip>.admonition-title:before,.md-typeset details.tip>summary:before{ + color:#00bfa5; + content:"" +} +.md-typeset .admonition.check,.md-typeset .admonition.done,.md-typeset .admonition.success,.md-typeset details.check,.md-typeset details.done,.md-typeset details.success{ + border-left-color:#00c853 +} +[dir=rtl] .md-typeset .admonition.check,[dir=rtl] .md-typeset .admonition.done,[dir=rtl] .md-typeset .admonition.success,[dir=rtl] .md-typeset details.check,[dir=rtl] .md-typeset details.done,[dir=rtl] .md-typeset details.success{ + border-right-color:#00c853 +} +.md-typeset .admonition.check>.admonition-title,.md-typeset .admonition.check>summary,.md-typeset .admonition.done>.admonition-title,.md-typeset .admonition.done>summary,.md-typeset .admonition.success>.admonition-title,.md-typeset .admonition.success>summary,.md-typeset details.check>.admonition-title,.md-typeset details.check>summary,.md-typeset details.done>.admonition-title,.md-typeset details.done>summary,.md-typeset details.success>.admonition-title,.md-typeset details.success>summary{ + border-bottom-color:rgba(0,200,83,.1); + background-color:rgba(0,200,83,.1) +} +.md-typeset .admonition.check>.admonition-title:before,.md-typeset .admonition.check>summary:before,.md-typeset .admonition.done>.admonition-title:before,.md-typeset .admonition.done>summary:before,.md-typeset .admonition.success>.admonition-title:before,.md-typeset .admonition.success>summary:before,.md-typeset details.check>.admonition-title:before,.md-typeset details.check>summary:before,.md-typeset details.done>.admonition-title:before,.md-typeset details.done>summary:before,.md-typeset details.success>.admonition-title:before,.md-typeset details.success>summary:before{ + color:#00c853; + content:"" +} +.md-typeset .admonition.faq,.md-typeset .admonition.help,.md-typeset .admonition.question,.md-typeset details.faq,.md-typeset details.help,.md-typeset details.question{ + border-left-color:#64dd17 +} +[dir=rtl] .md-typeset .admonition.faq,[dir=rtl] .md-typeset .admonition.help,[dir=rtl] .md-typeset .admonition.question,[dir=rtl] .md-typeset details.faq,[dir=rtl] .md-typeset details.help,[dir=rtl] .md-typeset details.question{ + border-right-color:#64dd17 +} +.md-typeset .admonition.faq>.admonition-title,.md-typeset .admonition.faq>summary,.md-typeset .admonition.help>.admonition-title,.md-typeset .admonition.help>summary,.md-typeset .admonition.question>.admonition-title,.md-typeset .admonition.question>summary,.md-typeset details.faq>.admonition-title,.md-typeset details.faq>summary,.md-typeset details.help>.admonition-title,.md-typeset details.help>summary,.md-typeset details.question>.admonition-title,.md-typeset details.question>summary{ + border-bottom-color:rgba(100,221,23,.1); + background-color:rgba(100,221,23,.1) +} +.md-typeset .admonition.faq>.admonition-title:before,.md-typeset .admonition.faq>summary:before,.md-typeset .admonition.help>.admonition-title:before,.md-typeset .admonition.help>summary:before,.md-typeset .admonition.question>.admonition-title:before,.md-typeset .admonition.question>summary:before,.md-typeset details.faq>.admonition-title:before,.md-typeset details.faq>summary:before,.md-typeset details.help>.admonition-title:before,.md-typeset details.help>summary:before,.md-typeset details.question>.admonition-title:before,.md-typeset details.question>summary:before{ + color:#64dd17; + content:"" +} +.md-typeset .admonition.attention,.md-typeset .admonition.caution,.md-typeset .admonition.warning,.md-typeset details.attention,.md-typeset details.caution,.md-typeset details.warning{ + border-left-color:#ff9100 +} +[dir=rtl] .md-typeset .admonition.attention,[dir=rtl] .md-typeset .admonition.caution,[dir=rtl] .md-typeset .admonition.warning,[dir=rtl] .md-typeset details.attention,[dir=rtl] .md-typeset details.caution,[dir=rtl] .md-typeset details.warning{ + border-right-color:#ff9100 +} +.md-typeset .admonition.attention>.admonition-title,.md-typeset .admonition.attention>summary,.md-typeset .admonition.caution>.admonition-title,.md-typeset .admonition.caution>summary,.md-typeset .admonition.warning>.admonition-title,.md-typeset .admonition.warning>summary,.md-typeset details.attention>.admonition-title,.md-typeset details.attention>summary,.md-typeset details.caution>.admonition-title,.md-typeset details.caution>summary,.md-typeset details.warning>.admonition-title,.md-typeset details.warning>summary{ + border-bottom-color:rgba(255,145,0,.1); + background-color:rgba(255,145,0,.1) +} +.md-typeset .admonition.attention>.admonition-title:before,.md-typeset .admonition.attention>summary:before,.md-typeset .admonition.caution>.admonition-title:before,.md-typeset .admonition.caution>summary:before,.md-typeset .admonition.warning>.admonition-title:before,.md-typeset .admonition.warning>summary:before,.md-typeset details.attention>.admonition-title:before,.md-typeset details.attention>summary:before,.md-typeset details.caution>.admonition-title:before,.md-typeset details.caution>summary:before,.md-typeset details.warning>.admonition-title:before,.md-typeset details.warning>summary:before{ + color:#ff9100; + content:"" +} +.md-typeset .admonition.fail,.md-typeset .admonition.failure,.md-typeset .admonition.missing,.md-typeset details.fail,.md-typeset details.failure,.md-typeset details.missing{ + border-left-color:#ff5252 +} +[dir=rtl] .md-typeset .admonition.fail,[dir=rtl] .md-typeset .admonition.failure,[dir=rtl] .md-typeset .admonition.missing,[dir=rtl] .md-typeset details.fail,[dir=rtl] .md-typeset details.failure,[dir=rtl] .md-typeset details.missing{ + border-right-color:#ff5252 +} +.md-typeset .admonition.fail>.admonition-title,.md-typeset .admonition.fail>summary,.md-typeset .admonition.failure>.admonition-title,.md-typeset .admonition.failure>summary,.md-typeset .admonition.missing>.admonition-title,.md-typeset .admonition.missing>summary,.md-typeset details.fail>.admonition-title,.md-typeset details.fail>summary,.md-typeset details.failure>.admonition-title,.md-typeset details.failure>summary,.md-typeset details.missing>.admonition-title,.md-typeset details.missing>summary{ + border-bottom-color:rgba(255,82,82,.1); + background-color:rgba(255,82,82,.1) +} +.md-typeset .admonition.fail>.admonition-title:before,.md-typeset .admonition.fail>summary:before,.md-typeset .admonition.failure>.admonition-title:before,.md-typeset .admonition.failure>summary:before,.md-typeset .admonition.missing>.admonition-title:before,.md-typeset .admonition.missing>summary:before,.md-typeset details.fail>.admonition-title:before,.md-typeset details.fail>summary:before,.md-typeset details.failure>.admonition-title:before,.md-typeset details.failure>summary:before,.md-typeset details.missing>.admonition-title:before,.md-typeset details.missing>summary:before{ + color:#ff5252; + content:"" +} +.md-typeset .admonition.danger,.md-typeset .admonition.error,.md-typeset details.danger,.md-typeset details.error{ + border-left-color:#ff1744 +} +[dir=rtl] .md-typeset .admonition.danger,[dir=rtl] .md-typeset .admonition.error,[dir=rtl] .md-typeset details.danger,[dir=rtl] .md-typeset details.error{ + border-right-color:#ff1744 +} +.md-typeset .admonition.danger>.admonition-title,.md-typeset .admonition.danger>summary,.md-typeset .admonition.error>.admonition-title,.md-typeset .admonition.error>summary,.md-typeset details.danger>.admonition-title,.md-typeset details.danger>summary,.md-typeset details.error>.admonition-title,.md-typeset details.error>summary{ + border-bottom-color:rgba(255,23,68,.1); + background-color:rgba(255,23,68,.1) +} +.md-typeset .admonition.danger>.admonition-title:before,.md-typeset .admonition.danger>summary:before,.md-typeset .admonition.error>.admonition-title:before,.md-typeset .admonition.error>summary:before,.md-typeset details.danger>.admonition-title:before,.md-typeset details.danger>summary:before,.md-typeset details.error>.admonition-title:before,.md-typeset details.error>summary:before{ + color:#ff1744; + content:"" +} +.md-typeset .admonition.bug,.md-typeset details.bug{ + border-left-color:#f50057 +} +[dir=rtl] .md-typeset .admonition.bug,[dir=rtl] .md-typeset details.bug{ + border-right-color:#f50057 +} +.md-typeset .admonition.bug>.admonition-title,.md-typeset .admonition.bug>summary,.md-typeset details.bug>.admonition-title,.md-typeset details.bug>summary{ + border-bottom-color:rgba(245,0,87,.1); + background-color:rgba(245,0,87,.1) +} +.md-typeset .admonition.bug>.admonition-title:before,.md-typeset .admonition.bug>summary:before,.md-typeset details.bug>.admonition-title:before,.md-typeset details.bug>summary:before{ + color:#f50057; + content:"" +} +.md-typeset .admonition.example,.md-typeset details.example{ + border-left-color:#651fff +} +[dir=rtl] .md-typeset .admonition.example,[dir=rtl] .md-typeset details.example{ + border-right-color:#651fff +} +.md-typeset .admonition.example>.admonition-title,.md-typeset .admonition.example>summary,.md-typeset details.example>.admonition-title,.md-typeset details.example>summary{ + border-bottom-color:rgba(101,31,255,.1); + background-color:rgba(101,31,255,.1) +} +.md-typeset .admonition.example>.admonition-title:before,.md-typeset .admonition.example>summary:before,.md-typeset details.example>.admonition-title:before,.md-typeset details.example>summary:before{ + color:#651fff; + content:"" +} +.md-typeset .admonition.cite,.md-typeset .admonition.quote,.md-typeset details.cite,.md-typeset details.quote{ + border-left-color:#9e9e9e +} +[dir=rtl] .md-typeset .admonition.cite,[dir=rtl] .md-typeset .admonition.quote,[dir=rtl] .md-typeset details.cite,[dir=rtl] .md-typeset details.quote{ + border-right-color:#9e9e9e +} +.md-typeset .admonition.cite>.admonition-title,.md-typeset .admonition.cite>summary,.md-typeset .admonition.quote>.admonition-title,.md-typeset .admonition.quote>summary,.md-typeset details.cite>.admonition-title,.md-typeset details.cite>summary,.md-typeset details.quote>.admonition-title,.md-typeset details.quote>summary{ + border-bottom-color:hsla(0,0%,62%,.1); + background-color:hsla(0,0%,62%,.1) +} +.md-typeset .admonition.cite>.admonition-title:before,.md-typeset .admonition.cite>summary:before,.md-typeset .admonition.quote>.admonition-title:before,.md-typeset .admonition.quote>summary:before,.md-typeset details.cite>.admonition-title:before,.md-typeset details.cite>summary:before,.md-typeset details.quote>.admonition-title:before,.md-typeset details.quote>summary:before{ + color:#9e9e9e; + content:"" +} +.codehilite .o,.codehilite .ow,.highlight .o,.highlight .ow{ + color:inherit +} +.codehilite .ge,.highlight .ge{ + color:#000 +} +.codehilite .gr,.highlight .gr{ + color:#a00 +} +.codehilite .gh,.highlight .gh{ + color:#999 +} +.codehilite .go,.highlight .go{ + color:#888 +} +.codehilite .gp,.highlight .gp{ + color:#555 +} +.codehilite .gs,.highlight .gs{ + color:inherit +} +.codehilite .gu,.highlight .gu{ + color:#aaa +} +.codehilite .gt,.highlight .gt{ + color:#a00 +} +.codehilite .gd,.highlight .gd{ + background-color:#fdd +} +.codehilite .gi,.highlight .gi{ + background-color:#dfd +} +.codehilite .k,.highlight .k{ + color:#3b78e7 +} +.codehilite .kc,.highlight .kc{ + color:#a71d5d +} +.codehilite .kd,.codehilite .kn,.highlight .kd,.highlight .kn{ + color:#3b78e7 +} +.codehilite .kp,.highlight .kp{ + color:#a71d5d +} +.codehilite .kr,.codehilite .kt,.highlight .kr,.highlight .kt{ + color:#3e61a2 +} +.codehilite .c,.codehilite .cm,.highlight .c,.highlight .cm{ + color:#999 +} +.codehilite .cp,.highlight .cp{ + color:#666 +} +.codehilite .c1,.codehilite .ch,.codehilite .cs,.highlight .c1,.highlight .ch,.highlight .cs{ + color:#999 +} +.codehilite .na,.codehilite .nb,.highlight .na,.highlight .nb{ + color:#c2185b +} +.codehilite .bp,.highlight .bp{ + color:#3e61a2 +} +.codehilite .nc,.highlight .nc{ + color:#c2185b +} +.codehilite .no,.highlight .no{ + color:#3e61a2 +} +.codehilite .nd,.codehilite .ni,.highlight .nd,.highlight .ni{ + color:#666 +} +.codehilite .ne,.codehilite .nf,.highlight .ne,.highlight .nf{ + color:#c2185b +} +.codehilite .nl,.highlight .nl{ + color:#3b5179 +} +.codehilite .nn,.highlight .nn{ + color:#ec407a +} +.codehilite .nt,.highlight .nt{ + color:#3b78e7 +} +.codehilite .nv,.codehilite .vc,.codehilite .vg,.codehilite .vi,.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{ + color:#3e61a2 +} +.codehilite .nx,.highlight .nx{ + color:#ec407a +} +.codehilite .il,.codehilite .m,.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo,.highlight .il,.highlight .m,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{ + color:#e74c3c +} +.codehilite .s,.codehilite .sb,.codehilite .sc,.highlight .s,.highlight .sb,.highlight .sc{ + color:#0d904f +} +.codehilite .sd,.highlight .sd{ + color:#999 +} +.codehilite .s2,.highlight .s2{ + color:#0d904f +} +.codehilite .se,.codehilite .sh,.codehilite .si,.codehilite .sx,.highlight .se,.highlight .sh,.highlight .si,.highlight .sx{ + color:#183691 +} +.codehilite .sr,.highlight .sr{ + color:#009926 +} +.codehilite .s1,.codehilite .ss,.highlight .s1,.highlight .ss{ + color:#0d904f +} +.codehilite .err,.highlight .err{ + color:#a61717 +} +.codehilite .w,.highlight .w{ + color:transparent +} +.codehilite .hll, .highlight .hll{ + display:block; + margin:0 -.6rem; + padding:0 .6rem; + background-color:rgba(255,235,59,.5) +} +.md-typeset .codehilite,.highlight{ + position:relative; + margin:1em 0; + padding:0; + border-radius:.1rem; + background-color:hsla(0,0%,92.5%,.5); + color:#37474f; + line-height:1.4; + -webkit-overflow-scrolling:touch +} +.md-typeset .codehilite code,.md-typeset .codehilite pre,.highlight code,.highlight pre{ + display:block; + margin:0; + padding:.525rem .6rem; + background-color:transparent; + overflow:auto; + vertical-align:top +} +.md-typeset .codehilite code::-webkit-scrollbar,.md-typeset .codehilite pre::-webkit-scrollbar,.highlight code::-webkit-scrollbar,.highlight pre::-webkit-scrollbar{ + width:.2rem; + height:.2rem +} +.md-typeset .codehilite code::-webkit-scrollbar-thumb,.md-typeset .codehilite pre::-webkit-scrollbar-thumb,.highlight code::-webkit-scrollbar-thumb,.highlight pre::-webkit-scrollbar-thumb{ + background-color:rgba(0,0,0,.26) +} +.md-typeset .codehilite code::-webkit-scrollbar-thumb:hover,.md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,.highlight code::-webkit-scrollbar-thumb:hover, .highlight pre::-webkit-scrollbar-thumb:hover{ + background-color:#536dfe +} +.md-typeset pre.codehilite,.md-typeset pre.highlight{ + overflow:visible +} +.md-typeset pre.codehilite code,.md-typeset pre.highlight code{ + display:block; + padding:.525rem .6rem; + overflow:auto +} +.md-typeset .codehilitetable,.md-typeset .highlighttable{ + display:block; + margin:1em 0; + border-radius:.2em; + font-size:.8rem; + overflow:hidden +} +.md-typeset .codehilitetable tbody,.md-typeset .codehilitetable td,.md-typeset .highlighttable tbody,.md-typeset .highlighttable td{ + display:block; + padding:0 +} +.md-typeset .codehilitetable tr,.md-typeset .highlighttable tr{ + display:flex +} +.md-typeset .codehilitetable .codehilite,.md-typeset .codehilitetable .highlight,.md-typeset .codehilitetable .linenodiv,.md-typeset .highlighttable .codehilite,.md-typeset .highlighttable .highlight,.md-typeset .highlighttable .linenodiv{ + margin:0; + border-radius:0 +} +.md-typeset .codehilitetable .linenodiv,.md-typeset .highlighttable .linenodiv{ + padding:.525rem .6rem +} +.md-typeset .codehilitetable .linenos,.md-typeset .highlighttable .linenos{ + background-color:rgba(0,0,0,.07); + color:rgba(0,0,0,.26); + -webkit-user-select:none; + -moz-user-select:none; + -ms-user-select:none; + user-select:none +} +.md-typeset .codehilitetable .linenos pre,.md-typeset .highlighttable .linenos pre{ + margin:0; + padding:0; + background-color:transparent; + color:inherit; + text-align:right +} +.md-typeset .codehilitetable .code,.md-typeset .highlighttable .code{ + flex:1; + overflow:hidden +} +.md-typeset>.codehilitetable,.md-typeset>.highlighttable{ + box-shadow:none +} +.md-typeset [id^="fnref:"]{ + display:inline-block +} +.md-typeset [id^="fnref:"]:target{ + margin-top:-3.8rem; + padding-top:3.8rem; + pointer-events:none +} +.md-typeset [id^="fn:"]:before{ + display:none; + height:0; + content:"" +} +.md-typeset [id^="fn:"]:target:before{ + display:block; + margin-top:-3.5rem; + padding-top:3.5rem; + pointer-events:none +} +.md-typeset .footnote{ + color:rgba(0,0,0,.54); + font-size:.64rem +} +.md-typeset .footnote ol{ + margin-left:0 +} +.md-typeset .footnote li{ + transition:color .25s +} +.md-typeset .footnote li:target{ + color:rgba(0,0,0,.87) +} +.md-typeset .footnote li :first-child{ + margin-top:0 +} +.md-typeset .footnote li:hover .footnote-backref,.md-typeset .footnote li:target .footnote-backref{ + -webkit-transform:translateX(0); + transform:translateX(0); + opacity:1 +} +.md-typeset .footnote li:hover .footnote-backref:hover,.md-typeset .footnote li:target .footnote-backref{ + color:#536dfe +} +.md-typeset .footnote-ref{ + display:inline-block; + pointer-events:auto +} +.md-typeset .footnote-ref:before{ + display:inline; + margin:0 .2em; + border-left:.05rem solid rgba(0,0,0,.26); + font-size:1.25em; + content:""; + vertical-align:-.25rem +} +.md-typeset .footnote-backref{ + display:inline-block; + -webkit-transform:translateX(.25rem); + transform:translateX(.25rem); + transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s; + transition:transform .25s .125s,color .25s,opacity .125s .125s; + transition:transform .25s .125s,color .25s,opacity .125s .125s,-webkit-transform .25s .125s; + color:rgba(0,0,0,.26); + font-size:0; + opacity:0; + vertical-align:text-bottom +} +[dir=rtl] .md-typeset .footnote-backref{ + -webkit-transform:translateX(-.25rem); + transform:translateX(-.25rem) +} +.md-typeset .footnote-backref:before{ + display:inline-block; + font-size:.8rem; + content:"\E31B" +} +[dir=rtl] .md-typeset .footnote-backref:before{ + -webkit-transform:scaleX(-1); + transform:scaleX(-1) +} +.md-typeset .headerlink{ + display:inline-block; + margin-left:.5rem; + -webkit-transform:translateY(.25rem); + transform:translateY(.25rem); + transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s; + transition:transform .25s .25s,color .25s,opacity .125s .25s; + transition:transform .25s .25s,color .25s,opacity .125s .25s,-webkit-transform .25s .25s; + opacity:0 +} +[dir=rtl] .md-typeset .headerlink{ + margin-right:.5rem; + margin-left:0 +} +html body .md-typeset .headerlink{ + color:rgba(0,0,0,.26) +} +.md-typeset h1[id]:before{ + display:block; + margin-top:-9px; + padding-top:9px; + content:"" +} +.md-typeset h1[id]:target:before{ + margin-top:-3.45rem; + padding-top:3.45rem +} +.md-typeset h1[id] .headerlink:focus,.md-typeset h1[id]:hover .headerlink,.md-typeset h1[id]:target .headerlink{ + -webkit-transform:translate(0); + transform:translate(0); + opacity:1 +} +.md-typeset h1[id] .headerlink:focus,.md-typeset h1[id]:hover .headerlink:hover,.md-typeset h1[id]:target .headerlink{ + color:#536dfe +} +.md-typeset h2[id]:before{ + display:block; + margin-top:-8px; + padding-top:8px; + content:"" +} +.md-typeset h2[id]:target:before{ + margin-top:-3.4rem; + padding-top:3.4rem +} +.md-typeset h2[id] .headerlink:focus,.md-typeset h2[id]:hover .headerlink,.md-typeset h2[id]:target .headerlink{ + -webkit-transform:translate(0); + transform:translate(0); + opacity:1 +} +.md-typeset h2[id] .headerlink:focus,.md-typeset h2[id]:hover .headerlink:hover,.md-typeset h2[id]:target .headerlink{ + color:#536dfe +} +.md-typeset h3[id]:before{ + display:block; + margin-top:-9px; + padding-top:9px; + content:"" +} +.md-typeset h3[id]:target:before{ + margin-top:-3.45rem; + padding-top:3.45rem +} +.md-typeset h3[id] .headerlink:focus,.md-typeset h3[id]:hover .headerlink,.md-typeset h3[id]:target .headerlink{ + -webkit-transform:translate(0); + transform:translate(0); + opacity:1 +} +.md-typeset h3[id] .headerlink:focus,.md-typeset h3[id]:hover .headerlink:hover,.md-typeset h3[id]:target .headerlink{ + color:#536dfe +} +.md-typeset h4[id]:before{ + display:block; + margin-top:-9px; + padding-top:9px; + content:"" +} +.md-typeset h4[id]:target:before{ + margin-top:-3.45rem; + padding-top:3.45rem +} +.md-typeset h4[id] .headerlink:focus,.md-typeset h4[id]:hover .headerlink,.md-typeset h4[id]:target .headerlink{ + -webkit-transform:translate(0); + transform:translate(0); + opacity:1 +} +.md-typeset h4[id] .headerlink:focus,.md-typeset h4[id]:hover .headerlink:hover,.md-typeset h4[id]:target .headerlink{ + color:#536dfe +} +.md-typeset h5[id]:before{ + display:block; + margin-top:-11px; + padding-top:11px; + content:"" +} +.md-typeset h5[id]:target:before{ + margin-top:-3.55rem; + padding-top:3.55rem +} +.md-typeset h5[id] .headerlink:focus,.md-typeset h5[id]:hover .headerlink,.md-typeset h5[id]:target .headerlink{ + -webkit-transform:translate(0); + transform:translate(0); + opacity:1 +} +.md-typeset h5[id] .headerlink:focus,.md-typeset h5[id]:hover .headerlink:hover,.md-typeset h5[id]:target .headerlink{ + color:#536dfe +} +.md-typeset h6[id]:before{ + display:block; + margin-top:-11px; + padding-top:11px; + content:"" +} +.md-typeset h6[id]:target:before{ + margin-top:-3.55rem; + padding-top:3.55rem +} +.md-typeset h6[id] .headerlink:focus,.md-typeset h6[id]:hover .headerlink,.md-typeset h6[id]:target .headerlink{ + -webkit-transform:translate(0); + transform:translate(0); + opacity:1 +} +.md-typeset h6[id] .headerlink:focus,.md-typeset h6[id]:hover .headerlink:hover,.md-typeset h6[id]:target .headerlink{ + color:#536dfe +} +.md-typeset .MJXc-display{ + margin:.75em 0; + padding:.75em 0; + overflow:auto; + -webkit-overflow-scrolling:touch +} +.md-typeset .MathJax_CHTML{ + outline:0 +} +.md-typeset .critic.comment,.md-typeset del.critic,.md-typeset ins.critic{ + margin:0 .25em; + padding:.0625em 0; + border-radius:.1rem; + -webkit-box-decoration-break:clone; + box-decoration-break:clone +} +.md-typeset del.critic{ + background-color:#fdd; + box-shadow:.25em 0 0 #fdd,-.25em 0 0 #fdd +} +.md-typeset ins.critic{ + background-color:#dfd; + box-shadow:.25em 0 0 #dfd,-.25em 0 0 #dfd +} +.md-typeset .critic.comment{ + background-color:hsla(0,0%,92.5%,.5); + color:#37474f; + box-shadow:.25em 0 0 hsla(0,0%,92.5%,.5),-.25em 0 0 hsla(0,0%,92.5%,.5) +} +.md-typeset .critic.comment:before{ + padding-right:.125em; + color:rgba(0,0,0,.26); + content:"\E0B7"; + vertical-align:-.125em +} +.md-typeset .critic.block{ + display:block; + margin:1em 0; + padding-right:.8rem; + padding-left:.8rem; + box-shadow:none +} +.md-typeset .critic.block :first-child{ + margin-top:.5em +} +.md-typeset .critic.block :last-child{ + margin-bottom:.5em +} +.md-typeset details{ + display:block; + padding-top:0 +} +.md-typeset details[open]>summary:after{ + -webkit-transform:rotate(180deg); + transform:rotate(180deg) +} +.md-typeset details:not([open]){ + padding-bottom:0 +} +.md-typeset details:not([open])>summary{ + border-bottom:none +} +.md-typeset details summary{ + padding-right:2rem +} +[dir=rtl] .md-typeset details summary{ + padding-left:2rem +} +.no-details .md-typeset details:not([open])>*{ + display:none +} +.no-details .md-typeset details:not([open]) summary{ + display:block +} +.md-typeset summary{ + display:block; + outline:none; + cursor:pointer +} +.md-typeset summary::-webkit-details-marker{ + display:none +} +.md-typeset summary:after{ + position:absolute; + top:.4rem; + right:.6rem; + color:rgba(0,0,0,.26); + font-size:1rem; + content:"\E313" +} +[dir=rtl] .md-typeset summary:after{ + right:auto; + left:.6rem +} +.md-typeset .emojione{ + width:1rem; + vertical-align:text-top +} +.md-typeset code.codehilite,.md-typeset code.highlight{ + margin:0 .29412em; + padding:.07353em 0 +} +.md-typeset .superfences-content{ + display:none; + order:99; + width:100%; + background-color:#fff +} +.md-typeset .superfences-content>*{ + margin:0; + border-radius:0 +} +.md-typeset .superfences-tabs{ + display:flex; + position:relative; + flex-wrap:wrap; + margin:1em 0; + border:.05rem solid rgba(0,0,0,.07); + border-radius:.2em +} +.md-typeset .superfences-tabs>input{ + display:none +} +.md-typeset .superfences-tabs>input:checked+label{ + font-weight:700 +} +.md-typeset .superfences-tabs>input:checked+label+.superfences-content{ + display:block +} +.md-typeset .superfences-tabs>label{ + width:auto; + padding:.6rem; + transition:color .125s; + font-size:.64rem; + cursor:pointer +} +html .md-typeset .superfences-tabs>label:hover{ + color:#536dfe +} +.md-typeset .task-list-item{ + position:relative; + list-style-type:none +} +.md-typeset .task-list-item [type=checkbox]{ + position:absolute; + top:.45em; + left:-2em +} +[dir=rtl] .md-typeset .task-list-item [type=checkbox]{ + right:-2em; + left:auto +} +.md-typeset .task-list-control .task-list-indicator:before{ + position:absolute; + top:.15em; + left:-1.25em; + color:rgba(0,0,0,.26); + font-size:1.25em; + content:"\E835"; + vertical-align:-.25em +} +[dir=rtl] .md-typeset .task-list-control .task-list-indicator:before{ + right:-1.25em; + left:auto +} +.md-typeset .task-list-control [type=checkbox]:checked+.task-list-indicator:before{ + content:"\E834" +} +.md-typeset .task-list-control [type=checkbox]{ + opacity:0; + z-index:-1 +} +@media print{ + .md-typeset a:after{ + color:rgba(0,0,0,.54); + content:" [" attr(href) "]" + } + .md-typeset code,.md-typeset pre{ + white-space:pre-wrap + } + .md-typeset code{ + box-shadow:none; + -webkit-box-decoration-break:initial; + box-decoration-break:slice + } + .md-clipboard,.md-content__icon,.md-footer,.md-header,.md-sidebar,.md-tabs,.md-typeset .headerlink{ + display:none + } +} +@media only screen and (max-width:44.9375em){ + .md-typeset pre{ + margin:1em -.8rem; + border-radius:0 + } + .md-typeset pre>code{ + padding:.525rem .8rem + } + .md-footer-nav__link--prev .md-footer-nav__title{ + display:none + } + .md-search-result__teaser{ + max-height:2.5rem; + -webkit-line-clamp:3 + } + .codehilite .hll,.md-typeset .highlight .hll{ + margin:0 -.8rem; + padding:0 .8rem + } + .md-typeset>.codehilite,.md-typeset>.highlight{ + margin:1em -.8rem; + border-radius:0 + } + .md-typeset>.codehilite code,.md-typeset>.codehilite pre,.md-typeset>.highlight code,.md-typeset>.highlight pre{ + padding:.525rem .8rem + } + .md-typeset>.codehilitetable,.md-typeset>.highlighttable{ + margin:1em -.8rem; + border-radius:0 + } + .md-typeset>.codehilitetable .codehilite>code,.md-typeset>.codehilitetable .codehilite>pre,.md-typeset>.codehilitetable .highlight>code,.md-typeset>.codehilitetable .highlight>pre,.md-typeset>.codehilitetable .linenodiv,.md-typeset>.highlighttable .codehilite>code,.md-typeset>.highlighttable .codehilite>pre,.md-typeset>.highlighttable .highlight>code,.md-typeset>.highlighttable .highlight>pre,.md-typeset>.highlighttable .linenodiv{ + padding:.5rem .8rem + } + .md-typeset>p>.MJXc-display{ + margin:.75em -.8rem; + padding:.25em .8rem + } + .md-typeset>.superfences-tabs{ + margin:1em -.8rem; + border:0; + border-top:.05rem solid rgba(0,0,0,.07); + border-radius:0 + } + .md-typeset>.superfences-tabs code,.md-typeset>.superfences-tabs pre{ + padding:.525rem .8rem + } +} +@media only screen and (min-width:100em){ + html{ + font-size:137.5% + } +} +@media only screen and (min-width:125em){ + html{ + font-size:150% + } +} +@media only screen and (max-width:59.9375em){ + body[data-md-state=lock]{ + overflow:hidden + } + .ios body[data-md-state=lock] .md-container{ + display:none + } + html .md-nav__link[for=__toc]{ + display:block; + padding-right:2.4rem + } + html .md-nav__link[for=__toc]:after{ + color:inherit; + content:"\E8DE" + } + html .md-nav__link[for=__toc]+.md-nav__link{ + display:none + } + html .md-nav__link[for=__toc]~.md-nav{ + display:flex + } + html [dir=rtl] .md-nav__link{ + padding-right:.8rem; + padding-left:2.4rem + } + .md-nav__source{ + display:block; + padding:0 .2rem; + background-color:rgba(50,64,144,.9675); + color:#fff + } + .md-search__overlay{ + position:absolute; + top:.2rem; + left:.2rem; + width:1.8rem; + height:1.8rem; + -webkit-transform-origin:center; + transform-origin:center; + transition:opacity .2s .2s,-webkit-transform .3s .1s; + transition:transform .3s .1s,opacity .2s .2s; + transition:transform .3s .1s,opacity .2s .2s,-webkit-transform .3s .1s; + border-radius:1rem; + background-color:#fff; + overflow:hidden; + pointer-events:none + } + [dir=rtl] .md-search__overlay{ + right:.2rem; + left:auto + } + [data-md-toggle=search]:checked~.md-header .md-search__overlay{ + transition:opacity .1s,-webkit-transform .4s; + transition:transform .4s,opacity .1s; + transition:transform .4s,opacity .1s,-webkit-transform .4s; + opacity:1 + } + .md-search__inner{ + position:fixed; + top:0; + left:100%; + width:100%; + height:100%; + -webkit-transform:translateX(5%); + transform:translateX(5%); + transition:right 0s .3s,left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s; + transition:right 0s .3s,left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s; + transition:right 0s .3s,left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s; + opacity:0; + z-index:2 + } + [data-md-toggle=search]:checked~.md-header .md-search__inner{ + left:0; + -webkit-transform:translateX(0); + transform:translateX(0); + transition:right 0s 0s,left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s; + transition:right 0s 0s,left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s; + transition:right 0s 0s,left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s; + opacity:1 + } + [dir=rtl] [data-md-toggle=search]:checked~.md-header .md-search__inner{ + right:0; + left:auto + } + html [dir=rtl] .md-search__inner{ + right:100%; + left:auto; + -webkit-transform:translateX(-5%); + transform:translateX(-5%) + } + .md-search__input{ + width:100%; + height:2.4rem; + font-size:.9rem + } + .md-search__icon[for=__search]{ + top:.6rem; + left:.8rem + } + .md-search__icon[for=__search][for=__search]:before{ + content:"\E5C4" + } + [dir=rtl] .md-search__icon[for=__search][for=__search]:before{ + content:"\E5C8" + } + .md-search__icon[type=reset]{ + top:.6rem; + right:.8rem + } + .md-search__output{ + top:2.4rem; + bottom:0 + } + .md-search-result__article--document:before{ + display:none + } +} +@media only screen and (max-width:76.1875em){ + [data-md-toggle=drawer]:checked~.md-overlay{ + width:100%; + height:100%; + transition:width 0s,height 0s,opacity .25s; + opacity:1 + } + .md-header-nav__button.md-icon--home,.md-header-nav__button.md-logo{ + display:none + } + .md-hero__inner{ + margin-top:2.4rem; + margin-bottom:1.2rem + } + .md-nav{ + background-color:#fff + } + .md-nav--primary,.md-nav--primary .md-nav{ + display:flex; + position:absolute; + top:0; + right:0; + left:0; + flex-direction:column; + height:100%; + z-index:1 + } + .md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{ + font-size:.8rem; + line-height:1.5 + } + html .md-nav--primary .md-nav__title{ + position:relative; + height:5.6rem; + padding:3rem .8rem .2rem; + background-color:rgba(0,0,0,.07); + color:rgba(0,0,0,.54); + font-weight:400; + line-height:2.4rem; + white-space:nowrap; + cursor:pointer + } + html .md-nav--primary .md-nav__title:before{ + display:block; + position:absolute; + top:.2rem; + left:.2rem; + width:2rem; + height:2rem; + color:rgba(0,0,0,.54) + } + html .md-nav--primary .md-nav__title~.md-nav__list{ + background-color:#fff; + box-shadow:inset 0 .05rem 0 rgba(0,0,0,.07) + } + html .md-nav--primary .md-nav__title~.md-nav__list>.md-nav__item:first-child{ + border-top:0 + } + html .md-nav--primary .md-nav__title--site{ + position:relative; + background-color:#3f51b5; + color:#fff + } + html .md-nav--primary .md-nav__title--site .md-nav__button{ + display:block; + position:absolute; + top:.2rem; + left:.2rem; + width:3.2rem; + height:3.2rem; + font-size:2.4rem + } + html .md-nav--primary .md-nav__title--site:before{ + display:none + } + html [dir=rtl] .md-nav--primary .md-nav__title--site .md-nav__button,html [dir=rtl] .md-nav--primary .md-nav__title:before{ + right:.2rem; + left:auto + } + .md-nav--primary .md-nav__list{ + /* TODO: Consider changing, but need more fix + See GH#48 + */ + flex:1; + overflow-y:auto + } + .md-nav--primary .md-nav__item{ + padding:0; + border-top:.05rem solid rgba(0,0,0,.07) + } + [dir=rtl] .md-nav--primary .md-nav__item{ + padding:0 + } + .md-nav--primary .md-nav__item--nested>.md-nav__link{ + padding-right:2.4rem + } + [dir=rtl] .md-nav--primary .md-nav__item--nested>.md-nav__link{ + padding-right:.8rem; + padding-left:2.4rem + } + .md-nav--primary .md-nav__item--nested>.md-nav__link:after{ + content:"\E315" + } + [dir=rtl] .md-nav--primary .md-nav__item--nested>.md-nav__link:after{ + content:"\E314" + } + .md-nav--primary .md-nav__link{ + position:relative; + margin-top:0; + padding:.6rem .8rem + } + .md-nav--primary .md-nav__link:after{ + position:absolute; + top:50%; + right:.6rem; + margin-top:-.6rem; + color:inherit; + font-size:1.2rem + } + [dir=rtl] .md-nav--primary .md-nav__link:after{ + right:auto; + left:.6rem + } + .md-nav--primary .md-nav--secondary .md-nav__link{ + position:static + } + .md-nav--primary .md-nav--secondary .md-nav{ + position:static; + background-color:transparent + } + .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{ + padding-left:1.4rem + } + [dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{ + padding-right:1.4rem; + padding-left:0 + } + .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{ + padding-left:2rem + } + [dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{ + padding-right:2rem; + padding-left:0 + } + .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{ + padding-left:2.6rem + } + [dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{ + padding-right:2.6rem; + padding-left:0 + } + .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{ + padding-left:3.2rem + } + [dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{ + padding-right:3.2rem; + padding-left:0 + } + .md-nav__toggle~.md-nav{ + display:flex; + -webkit-transform:translateX(100%); + transform:translateX(100%); + transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1); + transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s; + transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1); + opacity:0 + } + [dir=rtl] .md-nav__toggle~.md-nav{ + -webkit-transform:translateX(-100%); + transform:translateX(-100%) + } + .no-csstransforms3d .md-nav__toggle~.md-nav{ + display:none + } + .md-nav__toggle:checked~.md-nav{ + -webkit-transform:translateX(0); + transform:translateX(0); + transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1); + transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s; + transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1); + opacity:1 + } + .no-csstransforms3d .md-nav__toggle:checked~.md-nav{ + display:flex + } + .md-sidebar--primary{ + position:fixed; + top:0; + left:-12.1rem; + width:12.1rem; + height:100%; + -webkit-transform:translateX(0); + transform:translateX(0); + transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1); + transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s; + transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1); + background-color:#fff; + z-index:3 + } + [dir=rtl] .md-sidebar--primary{ + right:-12.1rem; + left:auto + } + .no-csstransforms3d .md-sidebar--primary{ + display:none + } + [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{ + box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.4); + -webkit-transform:translateX(12.1rem); + transform:translateX(12.1rem) + } + [dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{ + -webkit-transform:translateX(-12.1rem); + transform:translateX(-12.1rem) + } + .no-csstransforms3d [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{ + display:block + } + .md-sidebar--primary .md-sidebar__scrollwrap{ + overflow:hidden; + position:absolute; + top:0; + right:0; + bottom:0; + left:0; + margin:0 + } + .md-tabs{ + display:none + } +} +@media only screen and (min-width:60em){ + .md-content{ + margin-right:12.1rem + } + [dir=rtl] .md-content{ + margin-right:0; + margin-left:12.1rem + } + .md-header-nav__button.md-icon--search{ + display:none + } + .md-header-nav__source{ + display:block; + width:11.7rem; + max-width:11.7rem; + padding-right:.6rem + } + [dir=rtl] .md-header-nav__source{ + padding-right:0; + padding-left:.6rem + } + .md-search{ + padding:.2rem + } + .md-search__overlay{ + position:fixed; + top:0; + left:0; + width:0; + height:0; + transition:width 0s .25s,height 0s .25s,opacity .25s; + background-color:rgba(0,0,0,.54); + cursor:pointer + } + [dir=rtl] .md-search__overlay{ + right:0; + left:auto + } + [data-md-toggle=search]:checked~.md-header .md-search__overlay{ + width:100%; + height:100%; + transition:width 0s,height 0s,opacity .25s; + opacity:1 + } + .md-search__inner{ + position:relative; + width:11.5rem; + margin-right:.8rem; + padding:.1rem 0; + float:right; + transition:width .25s cubic-bezier(.1,.7,.1,1) + } + [dir=rtl] .md-search__inner{ + margin-right:0; + margin-left:.8rem; + float:left + } + .md-search__form,.md-search__input{ + border-radius:.1rem + } + .md-search__input{ + width:100%; + height:1.8rem; + padding-left:2.2rem; + transition:background-color .25s cubic-bezier(.1,.7,.1,1),color .25s cubic-bezier(.1,.7,.1,1); + background-color:rgba(0,0,0,.26); + color:inherit; + font-size:.8rem + } + [dir=rtl] .md-search__input{ + padding-right:2.2rem + } + .md-search__input+.md-search__icon{ + color:inherit + } + .md-search__input::-webkit-input-placeholder{ + color:hsla(0,0%,100%,.7) + } + .md-search__input:-ms-input-placeholder{ + color:hsla(0,0%,100%,.7) + } + .md-search__input::-ms-input-placeholder{ + color:hsla(0,0%,100%,.7) + } + .md-search__input::placeholder{ + color:hsla(0,0%,100%,.7) + } + .md-search__input:hover{ + background-color:hsla(0,0%,100%,.12) + } + [data-md-toggle=search]:checked~.md-header .md-search__input{ + border-radius:.1rem .1rem 0 0; + background-color:#fff; + color:rgba(0,0,0,.87); + text-overflow:clip + } + [data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-webkit-input-placeholder{ + color:rgba(0,0,0,.54) + } + [data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input:-ms-input-placeholder{ + color:rgba(0,0,0,.54) + } + [data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-ms-input-placeholder{ + color:rgba(0,0,0,.54) + } + [data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{ + color:rgba(0,0,0,.54) + } + .md-search__output{ + top:1.9rem; + transition:opacity .4s; + opacity:0 + } + [data-md-toggle=search]:checked~.md-header .md-search__output{ + box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.4); + opacity:1 + } + .md-search__scrollwrap{ + max-height:0 + } + [data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{ + max-height:75vh + } + .md-search__scrollwrap::-webkit-scrollbar{ + width:.2rem; + height:.2rem + } + .md-search__scrollwrap::-webkit-scrollbar-thumb{ + background-color:rgba(0,0,0,.26) + } + .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{ + background-color:#536dfe + } + .md-search-result__meta{ + padding-left:2.2rem + } + [dir=rtl] .md-search-result__meta{ + padding-right:2.2rem; + padding-left:0 + } + .md-search-result__article{ + padding-left:2.2rem + } + [dir=rtl] .md-search-result__article{ + padding-right:2.2rem; + padding-left:.8rem + } + .md-sidebar--secondary{ + display:block; + margin-left:100%; + -webkit-transform:translate(-100%); + transform:translate(-100%) + } + [dir=rtl] .md-sidebar--secondary{ + margin-right:100%; + margin-left:0; + -webkit-transform:translate(100%); + transform:translate(100%) + } +} +@media only screen and (min-width:88.25em) { + .md-sidebar--secondary { + margin-left: 73rem + } + [dir=rtl] .md-sidebar--secondary { + margin-right: 73rem; + margin-left: 0 + } +} +@media only screen and (min-width:76.25em){ + .md-content{ + margin-left:12.1rem + } + [dir=rtl] .md-content{ + margin-right:12.1rem + } + .md-content__inner{ + margin-right:1.2rem; + margin-left:1.2rem + } + .md-header-nav__button.md-icon--menu{ + display:none + } + .md-nav[data-md-state=animate]{ + transition:max-height .25s cubic-bezier(.86,0,.07,1) + } + .md-nav__toggle~.md-nav{ + max-height:0; + overflow:hidden + } + .no-js .md-nav__toggle~.md-nav{ + display:none + } + .md-nav[data-md-state=expand],.md-nav__toggle:checked~.md-nav{ + max-height:100% + } + .no-js .md-nav[data-md-state=expand],.no-js .md-nav__toggle:checked~.md-nav{ + display:block + } + .md-nav__item--nested>.md-nav>.md-nav__title{ + display:none + } + .md-nav__item--nested>.md-nav__link:after{ + display:inline-block; + -webkit-transform-origin:.45em .45em; + transform-origin:.45em .45em; + -webkit-transform-style:preserve-3d; + transform-style:preserve-3d; + vertical-align:-.125em + } + .js .md-nav__item--nested>.md-nav__link:after{ + transition:-webkit-transform .4s; + transition:transform .4s; + transition:transform .4s,-webkit-transform .4s + } + .md-nav__item--nested .md-nav__toggle:checked~.md-nav__link:after{ + -webkit-transform:rotateX(180deg); + transform:rotateX(180deg) + } + .md-search__inner{ + margin-right:1.2rem + } + [dir=rtl] .md-search__inner{ + margin-left:1.2rem + } + .md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__inner{ + width:34.4rem + } + .md-tabs~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested{ + font-size:0; + visibility:hidden + } + .md-tabs--active~.md-main .md-nav--primary .md-nav__title{ + display:block; + padding:0 + } + .md-tabs--active~.md-main .md-nav--primary .md-nav__title--site{ + display:none + } + .no-js .md-tabs--active~.md-main .md-nav--primary .md-nav{ + display:block + } + .md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item{ + font-size:0; + visibility:hidden + } + .md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested{ + display:none; + font-size:.7rem; + overflow:auto; + visibility:visible + } + .md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested>.md-nav__link{ + display:none + } + .md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--active{ + display:block + } + .md-tabs--active~.md-main .md-nav[data-md-level="1"]{ + max-height:none; + overflow:visible + } + .md-tabs--active~.md-main .md-nav[data-md-level="1"]>.md-nav__list>.md-nav__item{ + padding-left:0 + } + .md-tabs--active~.md-main .md-nav[data-md-level="1"] .md-nav .md-nav__title{ + display:none + } +} +@media only screen and (min-width:45em){ + .md-footer-nav__link{ + width:50% + } + .md-footer-copyright{ + max-width:75%; + float:left + } + [dir=rtl] .md-footer-copyright{ + float:right + } + .md-footer-social{ + padding:.6rem 0; + float:right + } + [dir=rtl] .md-footer-social{ + float:left + } +} +@media only screen and (max-width:29.9375em){ + [data-md-toggle=search]:checked~.md-header .md-search__overlay{ + -webkit-transform:scale(45); + transform:scale(45) + } +} +@media only screen and (min-width:30em) and (max-width:44.9375em){ + [data-md-toggle=search]:checked~.md-header .md-search__overlay{ + -webkit-transform:scale(60); + transform:scale(60) + } +} +@media only screen and (min-width:45em) and (max-width:59.9375em){ + [data-md-toggle=search]:checked~.md-header .md-search__overlay{ + -webkit-transform:scale(75); + transform:scale(75) + } +} +@media only screen and (min-width:60em) and (max-width:76.1875em){ + .md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__inner{ + width:23.4rem + } + .md-search-result__teaser{ + max-height:2.5rem; + -webkit-line-clamp:3 + } +} diff --git a/docs/api/py/api.html b/docs/api/py/api.html index efb1e89b8dda3..2b09d5e95870c 100644 --- a/docs/api/py/api.html +++ b/docs/api/py/api.html @@ -1,44 +1,230 @@ - + - Selenium Documentation — Selenium 4.29.0.202501201850 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Selenium Documentation — Selenium 4.30.0 documentation - + + + + + + + + + + + + + + + + + + + + + + + + Skip to content +
+ +
+ + +
- - - - - - - + +
+
+ +
+
+ +
+
+ + +
+
-

Selenium Documentation

+

Selenium Documentation

-

Common

+

Common

@@ -48,7 +234,7 @@

Common
-

Webdriver.common

+

Webdriver.common

selenium.common.exceptions

@@ -145,7 +331,7 @@

Webdriver.common -

Webdriver.support

+

Webdriver.support

selenium.webdriver.common.action_chains

@@ -179,7 +365,7 @@

Webdriver.support -

Webdriver.chrome

+

Webdriver.chrome

selenium.webdriver.support.abstract_event_listener

@@ -198,7 +384,7 @@

Webdriver.chrome -

Webdriver.chromium

+

Webdriver.chromium

selenium.webdriver.chrome.options

@@ -217,7 +403,7 @@

Webdriver.chromium -

Webdriver.edge

+

Webdriver.edge

selenium.webdriver.chromium.options

@@ -236,7 +422,7 @@

Webdriver.edge -

Webdriver.firefox

+

Webdriver.firefox

selenium.webdriver.edge.options

@@ -261,7 +447,7 @@

Webdriver.firefox -

Webdriver.ie

+

Webdriver.ie

selenium.webdriver.firefox.firefox_binary

@@ -277,7 +463,7 @@

Webdriver.ie -

Webdriver.remote

+

Webdriver.remote

selenium.webdriver.ie.service

@@ -323,7 +509,7 @@

Webdriver.remote -

Webdriver.safari

+

Webdriver.safari

selenium.webdriver.remote.bidi_connection

@@ -345,7 +531,7 @@

Webdriver.safari -

Webdriver.wpewebkit

+

Webdriver.wpewebkit

selenium.webdriver.safari.options

@@ -361,7 +547,7 @@

Webdriver.wpewebkit -

Webdriver.webkitgtk

+

Webdriver.webkitgtk

selenium.webdriver.wpewebkit.options

@@ -385,69 +571,32 @@

Webdriver.webkitgtk - + -

selenium.webdriver.webkitgtk.options

@@ -123,7 +557,7 @@

Navigation

- + @@ -147,112 +581,72 @@

Navigation

A new session could not be created.

StaleElementReferenceException([msg, ...])

Thrown when a reference to an element is now "stale".

Thrown when a reference to an element is now "stale".

TimeoutException([msg, screen, stacktrace])

Thrown when a command does not complete in enough time.

-exception selenium.common.exceptions.WebDriverException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.WebDriverException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Base webdriver exception.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.InvalidSwitchToTargetException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.InvalidSwitchToTargetException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when frame or window target to be switched doesn’t exist.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.NoSuchFrameException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.NoSuchFrameException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when frame target to be switched doesn’t exist.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.NoSuchWindowException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.NoSuchWindowException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when window target to be switched doesn’t exist.

To find the current set of active window handles, you can get a list of the active window handles in the following way:

print driver.window_handles
 
-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.NoSuchElementException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.NoSuchElementException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when element could not be found.

If you encounter this exception, you may want to check the following:
    @@ -263,85 +657,55 @@

    Navigation

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.NoSuchAttributeException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.NoSuchAttributeException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when the attribute of element could not be found.

You may want to check if the attribute exists in the particular browser you are testing against. Some browsers may have different property names for the same property. (IE8’s .innerText vs. Firefox .textContent)

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.NoSuchShadowRootException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.NoSuchShadowRootException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when trying to access the shadow root of an element when it does not have a shadow root attached.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.StaleElementReferenceException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.StaleElementReferenceException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when a reference to an element is now “stale”.

Stale means the element no longer appears on the DOM of the page.

@@ -356,962 +720,463 @@

Navigation

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

- -
-exception selenium.common.exceptions.InvalidElementStateException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.InvalidElementStateException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when a command could not be completed because the element is in an invalid state.

This can be caused by attempting to clear an element that isn’t both editable and resettable.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.UnexpectedAlertPresentException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None, alert_text: str | None = None)[source]
+exception selenium.common.exceptions.UnexpectedAlertPresentException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None, alert_text: str | None = None)[source]

Thrown when an unexpected alert has appeared.

Usually raised when an unexpected modal is blocking the webdriver from executing commands.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.NoAlertPresentException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.NoAlertPresentException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when switching to no presented alert.

This can be caused by calling an operation on the Alert() class when an alert is not yet on the screen.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.ElementNotVisibleException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.ElementNotVisibleException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when an element is present on the DOM, but it is not visible, and so is not able to be interacted with.

Most commonly encountered when trying to click or read text of an element that is hidden from view.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.ElementNotInteractableException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.ElementNotInteractableException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when an element is present in the DOM but interactions with that element will hit another element due to paint order.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.ElementNotSelectableException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.ElementNotSelectableException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when trying to select an unselectable element.

For example, selecting a ‘script’ element.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.InvalidCookieDomainException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.InvalidCookieDomainException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when attempting to add a cookie under a different domain than the current URL.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.UnableToSetCookieException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.UnableToSetCookieException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when a driver fails to set a cookie.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.TimeoutException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.TimeoutException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when a command does not complete in enough time.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.MoveTargetOutOfBoundsException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.MoveTargetOutOfBoundsException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when the target provided to the ActionsChains move() method is invalid, i.e. out of document.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.UnexpectedTagNameException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.UnexpectedTagNameException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when a support class did not get an expected web element.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.InvalidSelectorException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.InvalidSelectorException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when the selector which is used to find an element does not return a WebElement.

Currently this only happens when the selector is an xpath expression and it is either syntactically invalid (i.e. it is not a xpath expression) or the expression does not select WebElements (e.g. “count(//input)”).

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.ImeNotAvailableException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.ImeNotAvailableException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when IME support is not available.

This exception is thrown for every IME-related method call if IME support is not available on the machine.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.ImeActivationFailedException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.ImeActivationFailedException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Thrown when activating an IME engine has failed.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.InvalidArgumentException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.InvalidArgumentException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

The arguments passed to a command are either invalid or malformed.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.JavascriptException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.JavascriptException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

An error occurred while executing JavaScript supplied by the user.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.NoSuchCookieException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.NoSuchCookieException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

No cookie matching the given path name was found amongst the associated cookies of the current browsing context’s active document.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.ScreenshotException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.ScreenshotException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

A screen capture was made impossible.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.ElementClickInterceptedException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.ElementClickInterceptedException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

The Element Click command could not be completed because the element receiving the events is obscuring the element that was requested to be clicked.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.InsecureCertificateException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.InsecureCertificateException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Navigation caused the user agent to hit a certificate warning, which is usually the result of an expired or invalid TLS certificate.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.InvalidCoordinatesException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.InvalidCoordinatesException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

The coordinates provided to an interaction’s operation are invalid.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.InvalidSessionIdException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.InvalidSessionIdException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Occurs if the given session id is not in the list of active sessions, meaning the session either does not exist or that it’s not active.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.SessionNotCreatedException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.SessionNotCreatedException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

A new session could not be created.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.UnknownMethodException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.UnknownMethodException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

The requested command matched a known URL but did not match any methods for that URL.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.NoSuchDriverException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.NoSuchDriverException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Raised when driver is not specified and cannot be located.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-exception selenium.common.exceptions.DetachedShadowRootException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]
+exception selenium.common.exceptions.DetachedShadowRootException(msg: str | None = None, screen: str | None = None, stacktrace: Sequence[str] | None = None)[source]

Raised when referenced shadow root is no longer attached to the DOM.

-
-
-add_note()
-

Exception.add_note(note) – -add a note to the exception

-
-
-args
+args
-
-with_traceback()
+with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

-
-
-
-
+
-