From 1823f8bbdf8d67d61bcbca38a52eb64f6e211e5c Mon Sep 17 00:00:00 2001 From: Leon <51339494+Blatko1@users.noreply.github.com> Date: Fri, 1 Dec 2023 20:02:00 +0100 Subject: [PATCH 01/14] Fixes and changes to the documentation for increasing clarity (#4806) Co-authored-by: Connor Fitzgerald --- README.md | 33 ++++++++++++++++----------------- deno_webgpu/README.md | 2 +- examples/README.md | 26 +++++++++++++------------- naga/README.md | 8 ++++---- player/README.md | 6 +++--- wgpu-hal/README.md | 2 +- wgpu-info/README.md | 2 +- wgpu/src/lib.rs | 4 ++-- 8 files changed, 41 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index 62596b4634..dded2bdb75 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,9 @@ [![Build Status](https://github.com/gfx-rs/wgpu/workflows/CI/badge.svg)](https://github.com/gfx-rs/wgpu/actions) [![codecov.io](https://codecov.io/gh/gfx-rs/wgpu/branch/trunk/graph/badge.svg?token=84qJTesmeS)](https://codecov.io/gh/gfx-rs/wgpu) -`wgpu` is a cross-platform, safe, pure-rust graphics api. It runs natively on Vulkan, Metal, D3D12, and OpenGL; and on top of WebGL2 and WebGPU on wasm. +`wgpu` is a cross-platform, safe, pure-rust graphics API. It runs natively on Vulkan, Metal, D3D12, and OpenGL; and on top of WebGL2 and WebGPU on wasm. -The api is based on the [WebGPU standard](https://gpuweb.github.io/gpuweb/). It serves as the core of the WebGPU integration in Firefox and Deno. +The API is based on the [WebGPU standard](https://gpuweb.github.io/gpuweb/). It serves as the core of the WebGPU integration in Firefox and Deno. ## Repo Overview @@ -26,7 +26,7 @@ The repository hosts the following libraries: The following binaries: -- [![Crates.io](https://img.shields.io/crates/v/naga-cli.svg?label=naga-cli)](https://crates.io/crates/naga-cli) - Tool for translating shaders between different languages using naga. +- [![Crates.io](https://img.shields.io/crates/v/naga-cli.svg?label=naga-cli)](https://crates.io/crates/naga-cli) - Tool for translating shaders between different languages using `naga`. - [![Crates.io](https://img.shields.io/crates/v/wgpu-info.svg?label=wgpu-info)](https://crates.io/crates/wgpu-info) - Tool for getting information on GPUs in the system. - `cts_runner` - WebGPU Conformance Test Suite runner using `deno_webgpu`. - `player` - standalone application for replaying the API traces. @@ -39,9 +39,9 @@ For an overview of all the components in the gfx-rs ecosystem, see [the big pict Rust examples can be found at [wgpu/examples](examples). You can run the examples on native with `cargo run --bin wgpu-examples `. See the [list of examples](examples). -To run the examples on WebGPU on wasm, run `cargo xtask run-wasm --bin wgpu-example`. Then connect to `http://localhost:8000` in your WebGPU enabled browser, and you can choose an example to run. +To run the examples on WebGPU on wasm, run `cargo xtask run-wasm --bin wgpu-example`. Then connect to `http://localhost:8000` in your WebGPU-enabled browser, and you can choose an example to run. -To run the examples on WebGL on wasm, run `cargo xtask run-wasm --bin wgpu-example --features webgl`. Then connect to `http://localhost:8000` in your WebGL enabled browser, and you can choose an example to run. +To run the examples on WebGL on wasm, run `cargo xtask run-wasm --bin wgpu-example --features webgl`. Then connect to `http://localhost:8000` in your WebGL-enabled browser, and you can choose an example to run. If you are looking for a wgpu tutorial, look at the following: @@ -93,8 +93,7 @@ We have a [wiki](https://github.com/gfx-rs/wgpu/wiki) that serves as a knowledge wgpu supports shaders in [WGSL](https://gpuweb.github.io/gpuweb/wgsl/), SPIR-V, and GLSL. Both [HLSL](https://github.com/Microsoft/DirectXShaderCompiler) and [GLSL](https://github.com/KhronosGroup/glslang) -have compilers to target SPIR-V. All of these shader languages can be used with any backend, we -will handle all of the conversion. Additionally, support for these shader inputs is not going away. +have compilers to target SPIR-V. All of these shader languages can be used with any backend as we handle all of the conversions. Additionally, support for these shader inputs is not going away. While WebGPU does not support any shading language other than WGSL, we will automatically convert your non-WGSL shaders if you're running on WebGPU. @@ -110,9 +109,9 @@ To enable GLSL shaders, enable the `glsl` feature of wgpu. ### Angle -[Angle](http://angleproject.org) is a translation layer from GLES to other backends, developed by Google. +[Angle](http://angleproject.org) is a translation layer from GLES to other backends developed by Google. We support running our GLES3 backend over it in order to reach platforms DX11 support, which aren't accessible otherwise. -In order to run with Angle, "angle" feature has to be enabled, and Angle libraries placed in a location visible to the application. +In order to run with Angle, the "angle" feature has to be enabled, and Angle libraries placed in a location visible to the application. These binaries can be downloaded from [gfbuild-angle](https://github.com/DileSoft/gfbuild-angle) artifacts, [manual compilation](https://github.com/google/angle/blob/main/doc/DevSetup.md) may be required on Macs with Apple silicon. On Windows, you generally need to copy them into the working directory, in the same directory as the executable, or somewhere in your path. @@ -122,10 +121,10 @@ On Linux, you can point to them using `LD_LIBRARY_PATH` environment. Due to complex dependants, we have two MSRV policies: - `d3d12`, `naga`, `wgpu-core`, `wgpu-hal`, and `wgpu-types`'s MSRV is **1.65**. - - The rest of the workspace has the MSRV of **1.71**. + - The rest of the workspace has an MSRV of **1.71**. -It is enforced on CI (in "/.github/workflows/ci.yml") with `CORE_MSRV` and `REPO_MSRV` variable. -This version can only be upgraded in breaking releases, though we release a breaking version every 3 months. +It is enforced on CI (in "/.github/workflows/ci.yml") with the `CORE_MSRV` and `REPO_MSRV` variables. +This version can only be upgraded in breaking releases, though we release a breaking version every three months. The `naga`, `wgpu-core`, `wgpu-hal`, and `wgpu-types` crates should never require an MSRV ahead of Firefox's MSRV for nightly builds, as @@ -136,10 +135,10 @@ determined by the value of `MINIMUM_RUST_VERSION` in ## Environment Variables -All testing and example infrastructure shares the same set of environment variables that determine which Backend/GPU it will run on. +All testing and example infrastructure share the same set of environment variables that determine which Backend/GPU it will run on. - `WGPU_ADAPTER_NAME` with a substring of the name of the adapter you want to use (ex. `1080` will match `NVIDIA GeForce 1080ti`). -- `WGPU_BACKEND` with a comma separated list of the backends you want to use (`vulkan`, `metal`, `dx12`, `dx11`, or `gl`). +- `WGPU_BACKEND` with a comma-separated list of the backends you want to use (`vulkan`, `metal`, `dx12`, `dx11`, or `gl`). - `WGPU_POWER_PREF` with the power preference to choose when a specific adapter name isn't specified (`high`, `low` or `none`) - `WGPU_DX12_COMPILER` with the DX12 shader compiler you wish to use (`dxc` or `fxc`, note that `dxc` requires `dxil.dll` and `dxcompiler.dll` to be in the working directory otherwise it will fall back to `fxc`) - `WGPU_GLES_MINOR_VERSION` with the minor OpenGL ES 3 version number to request (`0`, `1`, `2` or `automatic`). @@ -187,7 +186,7 @@ If you are a user and want a way to help contribute to wgpu, we always need more WebGPU includes a Conformance Test Suite to validate that implementations are working correctly. We can run this CTS against wgpu. -To run the CTS, first you need to check it out: +To run the CTS, first, you need to check it out: ``` git clone https://github.com/gpuweb/cts.git @@ -199,7 +198,7 @@ git checkout $(cat ../cts_runner/revision.txt) To run a given set of tests: ``` -# Must be inside the cts folder we just checked out, else this will fail +# Must be inside the `cts` folder we just checked out, else this will fail cargo run --manifest-path ../Cargo.toml --bin cts_runner -- ./tools/run_deno --verbose "" ``` @@ -224,7 +223,7 @@ Exactly which WGSL features `wgpu` supports depends on how you are using it: to translate WGSL code into the shading language of your platform's native GPU API. Naga has [a milestone][naga wgsl milestone] for catching up to the WGSL specification, - but in general there is no up-to-date summary + but in general, there is no up-to-date summary of the differences between Naga and the WGSL spec. - When running in a web browser (by compilation to WebAssembly) diff --git a/deno_webgpu/README.md b/deno_webgpu/README.md index 2f915dcbbe..1cf031cda2 100644 --- a/deno_webgpu/README.md +++ b/deno_webgpu/README.md @@ -19,7 +19,7 @@ running through our WPT runner. This will be used to validate implementation conformance. GitHub CI doesn't run with GPUs, so testing relies on software like DX WARP & -Vulkan lavapipe. Currently only using DX WARP works, so tests are only run on +Vulkan lavapipe. Currently, only using DX WARP works, so tests are only run on Windows. ## Links diff --git a/examples/README.md b/examples/README.md index 09a33bbbf0..8232b863ad 100644 --- a/examples/README.md +++ b/examples/README.md @@ -8,9 +8,9 @@ For the simplest examples without using any helping code (see `framework.rs` her ### Summary of examples -A summary of the basic examples as split along the graphics and compute "pathways", layed out roughly in order of building on each other. Those further indented and thus more roughly dependant on more other examples tend to be more complicated as well as those further down. It should be noted though that computing examples, even though they are mentioned further down (because rendering to a window is by far the most common use case), tend to be less complex as they require less surrounding context to create and manage a window to render to. +A summary of the basic examples as split along the graphics and compute "pathways" laid out roughly in order of building on each other. Those further indented, and thus more roughly dependent on more other examples, tend to be more complicated as well as those further down. It should be noted, though, that computing examples, even though they are mentioned further down (because rendering to a window is by far the most common use case), tend to be less complex as they require less surrounding context to create and manage a window to render to. -The rest of the example are for demonstrating specific features that you can come back for later when you know what those features are. +The rest of the examples are for demonstrating specific features that you can come back for later when you know what those features are. #### General @@ -19,24 +19,24 @@ The rest of the example are for demonstrating specific features that you can com #### Graphics - `hello-triangle` - Provides an example of a bare-bones WGPU workflow using the Winit crate that simply renders a red triangle on a green background. -- `uniform-values` - Demonstrates the basics of enabling shaders and the GPU in general to access app state through uniform variables. `uniform-values` also serves as an example of rudimentary app building as the app stores state and takes window-captured keyboard events. The app displays the Mandelbrot Set in grayscale (similar to `storage-texture`) but allows the user to navigate and explore it using their arrow keys and scroll wheel. +- `uniform-values` - Demonstrates the basics of enabling shaders and the GPU, in general, to access app state through uniform variables. `uniform-values` also serves as an example of rudimentary app building as the app stores state and takes window-captured keyboard events. The app displays the Mandelbrot Set in grayscale (similar to `storage-texture`) but allows the user to navigate and explore it using their arrow keys and scroll wheel. - `cube` - Introduces the user to slightly more advanced models. The example creates a set of triangles to form a cube on the CPU and then uses a vertex and index buffer to send the generated model to the GPU for usage in rendering. It also uses a texture generated on the CPU to shade the sides of the cube and a uniform variable to apply a transformation matrix to the cube in the shader. -- `bunnymark` - Demonstrates many things but chief among them, preforming numerous draw calls with different bind groups in one render pass. The example also uses textures for the icon and uniform buffers to transfer both global and per-particle state. -- `skybox` - Shows off too many concepts to list here. The name comes from game development where a "skybox" acts as a background for rendering, usually to add a sky texture for immersion although they can also be used for backdrops to give the idea of a world beyond of the game scene. This example does so much more than this though as it uses a car model loaded from a file and uses the user's mouse to rotate the car model in 3d. `skybox` also makes use of depth textures and similar app patterns to `uniform-values`. -- `shadow` - Likely by far the most complex example (certainly the largest in lines of code) of the official WGPU examples. `shadow` demonstrates basic scene rendering with the main attraction being lighting and shadows (as the name implies). It is recommended that any user looking into lighting be very familiar with the basic concepts of not only rendering with WGPU but the primary mathematical ideas of computer graphics. +- `bunnymark` - Demonstrates many things, but chief among them is performing numerous draw calls with different bind groups in one render pass. The example also uses textures for the icon and uniform buffers to transfer both global and per-particle states. +- `skybox` - Shows off too many concepts to list here. The name comes from game development where a "skybox" acts as a background for rendering, usually to add a sky texture for immersion, although they can also be used for backdrops to give the idea of a world beyond the game scene. This example does so much more than this, though, as it uses a car model loaded from a file and uses the user's mouse to rotate the car model in 3d. `skybox` also makes use of depth textures and similar app patterns to `uniform-values`. +- `shadow` - Likely by far the most complex example (certainly the largest in lines of code) of the official WGPU examples. `shadow` demonstrates basic scene rendering with the main attraction being lighting and shadows (as the name implies). It is recommended that any user looking into lighting be very familiar with the basic concepts of not only rendering with WGPU but also the primary mathematical ideas of computer graphics. - `render-to-texture` - Renders to an image texture offscreen, demonstrating both off-screen rendering as well as how to add a sort of resolution-agnostic screenshot feature to an engine. This example either outputs an image file of your naming (pass command line arguments after specifying a `--` like `cargo run --bin render-to-texture -- "test.png"`) or adds an `img` element containing the image to the page in WASM. #### Compute -- `hello-compute` - Demonstrates the basic workflow for getting arrays of numbers to the GPU, executing a shader on them, and getting the results back. The operation it preforms is finding the Collatz value (how many iterations of the [Collatz equation](https://en.wikipedia.org/wiki/Collatz_conjecture) it takes for the number to either reach 1 or overflow) of a set of numbers and prints the results. -- `repeated-compute` - Mostly for going into detail on subjects `hello-compute` did not. It, too, computes the Collatz conjecture but this time, it automatically loads large arrays of randomly generated numbers, prints them, runs them, and prints the result. It does this cycle 10 times. +- `hello-compute` - Demonstrates the basic workflow for getting arrays of numbers to the GPU, executing a shader on them, and getting the results back. The operation it performs is finding the Collatz value (how many iterations of the [Collatz equation](https://en.wikipedia.org/wiki/Collatz_conjecture) it takes for the number to either reach 1 or overflow) of a set of numbers and prints the results. +- `repeated-compute` - Mostly for going into detail on subjects `hello-compute` did not. It, too, computes the Collatz conjecture, but this time, it automatically loads large arrays of randomly generated numbers, prints them, runs them, and prints the result. It does this cycle 10 times. - `hello-workgroups` - Teaches the user about the basics of compute workgroups; what they are and what they can do. - `hello-synchronization` - Teaches the user about synchronization in WGSL, the ability to force all invocations in a workgroup to synchronize with each other before continuing via a sort of barrier. -- `storage-texture` - Demonstrates the use of storage textures as outputs to compute shaders. The example on the outside seems very similar to `render-to-texture` in that it outputs an image either to the file system or the web page except displaying a grayscale render of the Mandelbrot Set. However, inside, the example dispatches a grid of compute workgroups, one for each pixel which calculates the pixel value and stores it to the corresponding pixel of the output storage texture. +- `storage-texture` - Demonstrates the use of storage textures as outputs to compute shaders. The example on the outside seems very similar to `render-to-texture` in that it outputs an image either to the file system or the web page, except displaying a grayscale render of the Mandelbrot Set. However, inside, the example dispatches a grid of compute workgroups, one for each pixel, which calculates the pixel value and stores it to the corresponding pixel of the output storage texture. #### Combined -- `boids` - Demonstrates how to combine compute and render workflows by preforming a [boid](https://en.wikipedia.org/wiki/Boids) simulation and rendering the boids to the screen as little triangles. +- `boids` - Demonstrates how to combine compute and render workflows by performing a [boid](https://en.wikipedia.org/wiki/Boids) simulation and rendering the boids to the screen as little triangles. ## Feature matrix @@ -83,7 +83,7 @@ The rest of the example are for demonstrating specific features that you can com ## Additional notes -Note that the examples regarding computing build off of each other; repeated-compute extends hello-compute, hello-workgroups assumes you know the basic workflow of gpu computation, and hello-synchronization assumes you know what a workgroup is. Also note that the computing examples cannot be downleveled to WebGL as WebGL does not allow storage textures. Running these in a browser will require that browser to support WebGPU. +Note that the examples regarding computing build off of each other; repeated-compute extends hello-compute, hello-workgroups assumes you know the basic workflow of GPU computation, and hello-synchronization assumes you know what a workgroup is. Also, note that the computing examples cannot be downleveled to WebGL as WebGL does not allow storage textures. Running these in a browser will require that browser to support WebGPU. All the examples use [WGSL](https://gpuweb.github.io/gpuweb/wgsl.html) shaders unless specified otherwise. @@ -91,8 +91,8 @@ All framework-based examples render to the window and are reftested against the ## Hacking -You can record an API trace any of the framework-based examples by starting them as: +You can record an API trace for any of the framework-based examples by starting them as: ```sh -mkdir -p trace && WGPU_TRACE=trace cargo run --features trace --bin +mkdir -p trace && WGPU_TRACE=trace cargo run --features trace --bin wgpu-examples ``` diff --git a/naga/README.md b/naga/README.md index 04ed84ab5e..8cce5bc35f 100644 --- a/naga/README.md +++ b/naga/README.md @@ -33,7 +33,7 @@ DOT (GraphViz) | :ok: | dot-out | Not a shading language | ## Conversion tool -Naga can be used as a CLI, which allows to test the conversion of different code paths. +Naga can be used as a CLI, which allows testing the conversion of different code paths. First, install `naga-cli` from crates.io or directly from GitHub. @@ -54,7 +54,7 @@ naga my_shader.spv my_shader.metal --flow-dir flow-dir # convert the SPV to Meta naga my_shader.wgsl my_shader.vert --profile es310 # convert the WGSL to GLSL vertex stage under ES 3.20 profile ``` -As naga includes a default binary target, you can also use `cargo run` without installation. This is useful when you develop naga itself, or investigate the behavior of naga at a specific commit (e.g. [wgpu](https://github.com/gfx-rs/wgpu) might pin a different version of naga than the `HEAD` of this repository). +As naga includes a default binary target, you can also use `cargo run` without installation. This is useful when you develop naga itself or investigate the behavior of naga at a specific commit (e.g. [wgpu](https://github.com/gfx-rs/wgpu) might pin a different version of naga than the `HEAD` of this repository). ```bash cargo run my_shader.wgsl @@ -63,7 +63,7 @@ cargo run my_shader.wgsl ## Development workflow The main instrument aiding the development is the good old `cargo test --all-features --workspace`, -which will run the unit tests, and also update all the snapshots. You'll see these +which will run the unit tests and also update all the snapshots. You'll see these changes in git before committing the code. If working on a particular front-end or back-end, it may be convenient to @@ -71,7 +71,7 @@ enable the relevant features in `Cargo.toml`, e.g. ```toml default = ["spv-out"] #TEMP! ``` -This allows IDE basic checks to report errors there, unless your IDE is sufficiently configurable already. +This allows IDE basic checks to report errors there unless your IDE is sufficiently configurable already. Finally, when changes to the snapshots are made, we should verify that the produced shaders are indeed valid for the target platforms they are compiled for: diff --git a/player/README.md b/player/README.md index 859e079c7e..101756c607 100644 --- a/player/README.md +++ b/player/README.md @@ -1,13 +1,13 @@ # wgpu player This is an application that allows replaying the `wgpu` workloads recorded elsewhere. It requires the player to be built from -the same revision as an application was linking to, or otherwise the data may fail to load. +the same revision as an application was linking to, or otherwise, the data may fail to load. Launch as: ```rust play ``` -When built with "winit" feature, it's able to replay the workloads that operate on a swapchain. It renders each frame sequentially, then waits for the user to close the window. When built without "winit", it launches in console mode and can replay any trace that doesn't use swapchains. +When built with "winit" feature, it's able to replay the workloads that operate on a swapchain. It renders each frame sequentially and then waits for the user to close the window. When built without "winit", it launches in console mode and can replay any trace that doesn't use swapchains. -Note: replaying is currently restricted to the same backend, as one used for recording a trace. It is straightforward, however, to just replace the backend in RON, since it's serialized as plain text. Valid values are: Vulkan, Metal, Dx12, and Dx11. +Note: replaying is currently restricted to the same backend as one used for recording a trace. It is straightforward, however, to just replace the backend in RON since it's serialized as plain text. Valid values are: Vulkan, Metal, Dx12, and Dx11. diff --git a/wgpu-hal/README.md b/wgpu-hal/README.md index 0ab7a0283a..588baa3cf5 100644 --- a/wgpu-hal/README.md +++ b/wgpu-hal/README.md @@ -15,7 +15,7 @@ such as running out-of-memory, or losing the device. For the counter-example, there is no error for mapping a buffer that's not mappable. As the buffer creator, the user should already know if they can map it. -The API accept iterators in order to avoid forcing the user to store data in particular containers. The implementation doesn't guarantee that any of the iterators are drained, unless stated otherwise by the function documentation. +The API accepts iterators in order to avoid forcing the user to store data in particular containers. The implementation doesn't guarantee that any of the iterators are drained, unless stated otherwise by the function documentation. For this reason, we recommend that iterators don't do any mutating work. # Debugging diff --git a/wgpu-info/README.md b/wgpu-info/README.md index 7857553b7a..8bfdd7d210 100644 --- a/wgpu-info/README.md +++ b/wgpu-info/README.md @@ -14,6 +14,6 @@ cargo run --bin wgpu-info #### Running Test on many Adapters -When called with any amount of arguments it will interpret all of the arguments as a command to run. It will run this command N different times, one for every combination of adapter and backend on the system. +When called with any amount of arguments, it will interpret all of the arguments as a command to run. It will run this command N different times, one for every combination of adapter and backend on the system. For every command invocation, it will set `WGPU_ADAPTER_NAME` to the name of the adapter name and `WGPU_BACKEND` to the name of the backend. This is used as the primary means of testing across many adapters. diff --git a/wgpu/src/lib.rs b/wgpu/src/lib.rs index 9069b8758b..19199a0490 100644 --- a/wgpu/src/lib.rs +++ b/wgpu/src/lib.rs @@ -3971,7 +3971,7 @@ impl<'a> RenderPass<'a> { /// This is like calling [`RenderPass::draw`] but the contents of the call are specified in the `indirect_buffer`. /// The structure expected in `indirect_buffer` must conform to [`DrawIndirectArgs`](crate::util::DrawIndirectArgs). /// - /// Indirect drawing has some caviats depending on the features available. We are not currently able to validate + /// Indirect drawing has some caveats depending on the features available. We are not currently able to validate /// these and issue an error. /// - If [`Features::INDIRECT_FIRST_INSTANCE`] is not present on the adapter, /// [`DrawIndirect::first_instance`](crate::util::DrawIndirectArgs::first_instance) will be ignored. @@ -3996,7 +3996,7 @@ impl<'a> RenderPass<'a> { /// This is like calling [`RenderPass::draw_indexed`] but the contents of the call are specified in the `indirect_buffer`. /// The structure expected in `indirect_buffer` must conform to [`DrawIndexedIndirectArgs`](crate::util::DrawIndexedIndirectArgs). /// - /// Indirect drawing has some caviats depending on the features available. We are not currently able to validate + /// Indirect drawing has some caveats depending on the features available. We are not currently able to validate /// these and issue an error. /// - If [`Features::INDIRECT_FIRST_INSTANCE`] is not present on the adapter, /// [`DrawIndexedIndirect::first_instance`](crate::util::DrawIndexedIndirectArgs::first_instance) will be ignored. From 07b83ab6c0a19b2b355a3d76d5a47eea91a2ea11 Mon Sep 17 00:00:00 2001 From: Jim Blandy Date: Wed, 29 Nov 2023 18:59:11 -0800 Subject: [PATCH 02/14] [naga wgsl-in] Use a better span for errors in constructors. When reporting errors in construction expressions, use the span of the constructor itself (that is, the type name) in preference to the span of the overall expression. This makes errors easier to follow. --- naga/src/front/wgsl/lower/construction.rs | 4 ++-- naga/tests/wgsl_errors.rs | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/naga/src/front/wgsl/lower/construction.rs b/naga/src/front/wgsl/lower/construction.rs index c7e4106460..96cc45bfa5 100644 --- a/naga/src/front/wgsl/lower/construction.rs +++ b/naga/src/front/wgsl/lower/construction.rs @@ -448,7 +448,7 @@ impl<'source, 'temp> Lowerer<'source, 'temp> { ctx.try_automatic_conversions_slice( &mut components, &Tr::Value(component_ty), - span, + ty_span, )?; expr = crate::Expression::Compose { ty, components }; } @@ -497,7 +497,7 @@ impl<'source, 'temp> Lowerer<'source, 'temp> { // Array constructor, explicit type (components, Constructor::Type((ty, &crate::TypeInner::Array { base, .. }))) => { let mut components = components.into_components_vec(); - ctx.try_automatic_conversions_slice(&mut components, &Tr::Handle(base), span)?; + ctx.try_automatic_conversions_slice(&mut components, &Tr::Handle(base), ty_span)?; expr = crate::Expression::Compose { ty, components }; } diff --git a/naga/tests/wgsl_errors.rs b/naga/tests/wgsl_errors.rs index 56ca313464..b74f805f0d 100644 --- a/naga/tests/wgsl_errors.rs +++ b/naga/tests/wgsl_errors.rs @@ -213,9 +213,8 @@ fn constructor_parameter_type_mismatch() { ┌─ wgsl:3:21 │ 3 │ _ = mat2x2(array(0, 1), vec2(2, 3)); - │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - │ │ │ - │ │ this expression has type array<{AbstractInt}, 2> + │ ^^^^^^^^^^^ ^^^^^^^^^^^ this expression has type array<{AbstractInt}, 2> + │ │ │ a value of type vec2 is required here "#, From 33339e46ce170aaf93e109e129524ea593655d5f Mon Sep 17 00:00:00 2001 From: Jim Blandy Date: Wed, 29 Nov 2023 18:28:50 -0800 Subject: [PATCH 03/14] [naga wgsl-in] Drop spanless labels from front-end error messages. When a label in a WGSL front end error has an undefined span, omit the label from the error message. This is not great, but because of the way Naga IR represents local variable references it is hard to get the right span, and omitting the label better than panicking in `unwrap`, since the error message has a general message anyway. --- naga/src/front/wgsl/error.rs | 6 +++--- naga/tests/wgsl_errors.rs | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/naga/src/front/wgsl/error.rs b/naga/src/front/wgsl/error.rs index dc10124680..f2db433e81 100644 --- a/naga/src/front/wgsl/error.rs +++ b/naga/src/front/wgsl/error.rs @@ -34,9 +34,9 @@ impl ParseError { .with_labels( self.labels .iter() - .map(|label| { - Label::primary((), label.0.to_range().unwrap()) - .with_message(label.1.to_string()) + .filter_map(|label| label.0.to_range().map(|range| (label, range))) + .map(|(label, range)| { + Label::primary((), range).with_message(label.1.to_string()) }) .collect(), ) diff --git a/naga/tests/wgsl_errors.rs b/naga/tests/wgsl_errors.rs index b74f805f0d..c761ad361e 100644 --- a/naga/tests/wgsl_errors.rs +++ b/naga/tests/wgsl_errors.rs @@ -1984,6 +1984,25 @@ fn function_param_redefinition_as_local() { ) } +#[test] +fn constructor_type_error_span() { + check( + " + fn unfortunate() { + var i: i32; + var a: array = array(i); + } + ", + r###"error: automatic conversions cannot convert `i32` to `f32` + ┌─ wgsl:4:36 + │ +4 │ var a: array = array(i); + │ ^^^^^^^^^^^^^^^^ a value of type f32 is required here + +"###, + ) +} + #[test] fn binding_array_local() { check_validation! { From dd7e33250b167f7a313ded0a9220409f6f526023 Mon Sep 17 00:00:00 2001 From: Teodor Tanasoaia <28601907+teoxoy@users.noreply.github.com> Date: Mon, 4 Dec 2023 13:57:57 +0100 Subject: [PATCH 04/14] fix expected error message --- naga/tests/wgsl_errors.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/naga/tests/wgsl_errors.rs b/naga/tests/wgsl_errors.rs index c761ad361e..b01c94d72e 100644 --- a/naga/tests/wgsl_errors.rs +++ b/naga/tests/wgsl_errors.rs @@ -1997,7 +1997,7 @@ fn constructor_type_error_span() { ┌─ wgsl:4:36 │ 4 │ var a: array = array(i); - │ ^^^^^^^^^^^^^^^^ a value of type f32 is required here + │ ^^^^^^^^^^^^^ a value of type f32 is required here "###, ) From 32c5a22293675d85b008256745aa209dd62b6c0a Mon Sep 17 00:00:00 2001 From: Almar Klein Date: Mon, 4 Dec 2023 14:23:13 +0100 Subject: [PATCH 05/14] Add feature float32-filterable (#4759) --- CHANGELOG.md | 1 + deno_webgpu/01_webgpu.js | 1 + deno_webgpu/lib.rs | 7 +++ deno_webgpu/webgpu.idl | 1 + tests/tests/bgra8unorm_storage.rs | 2 +- tests/tests/float32_filterable.rs | 75 +++++++++++++++++++++++++++++++ tests/tests/root.rs | 1 + wgpu-core/src/device/resource.rs | 27 +++++++++-- wgpu-hal/src/dx11/adapter.rs | 4 ++ wgpu-hal/src/dx12/adapter.rs | 3 ++ wgpu-hal/src/gles/adapter.rs | 18 ++++---- wgpu-hal/src/gles/command.rs | 2 +- wgpu-hal/src/gles/device.rs | 2 +- wgpu-hal/src/gles/mod.rs | 2 - wgpu-hal/src/metal/adapter.rs | 4 ++ wgpu-hal/src/metal/mod.rs | 1 + wgpu-hal/src/vulkan/adapter.rs | 23 +++++++++- wgpu-hal/src/vulkan/conv.rs | 2 +- wgpu-types/src/lib.rs | 39 +++++++++++++--- wgpu/src/backend/web.rs | 6 ++- 20 files changed, 191 insertions(+), 30 deletions(-) create mode 100644 tests/tests/float32_filterable.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 881c879560..1a4fe90827 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,7 @@ Previously, `DeviceExt::create_texture_with_data` only allowed data to be provid #### General - Added `DownlevelFlags::VERTEX_AND_INSTANCE_INDEX_RESPECTS_RESPECTIVE_FIRST_VALUE_IN_INDIRECT_DRAW` to know if `@builtin(vertex_index)` and `@builtin(instance_index)` will respect the `first_vertex` / `first_instance` in indirect calls. If this is not present, both will always start counting from 0. Currently enabled on all backends except DX12. By @cwfitzgerald in [#4722](https://github.com/gfx-rs/wgpu/pull/4722) - No longer validate surfaces against their allowed extent range on configure. This caused warnings that were almost impossible to avoid. As before, the resulting behavior depends on the compositor. By @wumpf in [#????](https://github.com/gfx-rs/wgpu/pull/????) +- Added support for the float32-filterable feature. By @almarklein in [#4759](https://github.com/gfx-rs/wgpu/pull/4759) #### OpenGL - `@builtin(instance_index)` now properly reflects the range provided in the draw call instead of always counting from 0. By @cwfitzgerald in [#4722](https://github.com/gfx-rs/wgpu/pull/4722). diff --git a/deno_webgpu/01_webgpu.js b/deno_webgpu/01_webgpu.js index 92157e5490..3f7b1ed570 100644 --- a/deno_webgpu/01_webgpu.js +++ b/deno_webgpu/01_webgpu.js @@ -4980,6 +4980,7 @@ webidl.converters["GPUFeatureName"] = webidl.createEnumConverter( "texture-compression-astc", "rg11b10ufloat-renderable", "bgra8unorm-storage", + "float32-filterable", // extended from spec diff --git a/deno_webgpu/lib.rs b/deno_webgpu/lib.rs index b69157df52..7d801e8ae4 100644 --- a/deno_webgpu/lib.rs +++ b/deno_webgpu/lib.rs @@ -266,6 +266,9 @@ fn deserialize_features(features: &wgpu_types::Features) -> Vec<&'static str> { if features.contains(wgpu_types::Features::BGRA8UNORM_STORAGE) { return_features.push("bgra8unorm-storage"); } + if features.contains(wgpu_types::Features::FLOAT32_FILTERABLE) { + return_features.push("float32-filterable"); + } // extended from spec @@ -498,6 +501,10 @@ impl From for wgpu_types::Features { wgpu_types::Features::BGRA8UNORM_STORAGE, required_features.0.contains("bgra8unorm-storage"), ); + features.set( + wgpu_types::Features::FLOAT32_FILTERABLE, + required_features.0.contains("float32-filterable"), + ); // extended from spec diff --git a/deno_webgpu/webgpu.idl b/deno_webgpu/webgpu.idl index 0b6b04eb4e..bf4da0124b 100644 --- a/deno_webgpu/webgpu.idl +++ b/deno_webgpu/webgpu.idl @@ -103,6 +103,7 @@ enum GPUFeatureName { "shader-f16", "rg11b10ufloat-renderable", "bgra8unorm-storage", + "float32-filterable", // extended from spec diff --git a/tests/tests/bgra8unorm_storage.rs b/tests/tests/bgra8unorm_storage.rs index 0caf7f80e3..942b6c5a8b 100644 --- a/tests/tests/bgra8unorm_storage.rs +++ b/tests/tests/bgra8unorm_storage.rs @@ -1,4 +1,4 @@ -//! Tests for texture copy bounds checks. +//! Tests for BGRA8UNORM_STORAGE feature use std::borrow::Cow; diff --git a/tests/tests/float32_filterable.rs b/tests/tests/float32_filterable.rs new file mode 100644 index 0000000000..c170deda9b --- /dev/null +++ b/tests/tests/float32_filterable.rs @@ -0,0 +1,75 @@ +//! Tests for FLOAT32_FILTERABLE feature. + +use wgpu_test::{fail, gpu_test, GpuTestConfiguration, TestParameters}; + +fn create_texture_binding(device: &wgpu::Device, format: wgpu::TextureFormat, filterable: bool) { + let texture = device.create_texture(&wgpu::TextureDescriptor { + label: None, + size: wgpu::Extent3d { + width: 256, + height: 256, + depth_or_array_layers: 1, + }, + mip_level_count: 1, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format, + usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, + view_formats: &[], + }); + + let view = texture.create_view(&wgpu::TextureViewDescriptor::default()); + + let bgl = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: None, + entries: &[wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Texture { + sample_type: wgpu::TextureSampleType::Float { filterable }, + multisampled: false, + view_dimension: wgpu::TextureViewDimension::D2, + }, + count: None, + }], + }); + + let _bg = device.create_bind_group(&wgpu::BindGroupDescriptor { + label: None, + layout: &bgl, + entries: &[wgpu::BindGroupEntry { + binding: 0, + resource: wgpu::BindingResource::TextureView(&view), + }], + }); +} + +#[gpu_test] +static FLOAT32_FILTERABLE_WITHOUT_FEATURE: GpuTestConfiguration = GpuTestConfiguration::new() + .parameters(TestParameters::default()) + .run_sync(|ctx| { + let device = &ctx.device; + // Unorm textures are always filterable + create_texture_binding(device, wgpu::TextureFormat::R8Unorm, true); + create_texture_binding(device, wgpu::TextureFormat::R8Unorm, false); + // As are float16 textures + create_texture_binding(device, wgpu::TextureFormat::R16Float, true); + create_texture_binding(device, wgpu::TextureFormat::R16Float, false); + // Float 32 textures can be used as non-filterable only + create_texture_binding(device, wgpu::TextureFormat::R32Float, false); + // This is supposed to fail, since we have not activated the feature + fail(&ctx.device, || { + create_texture_binding(device, wgpu::TextureFormat::R32Float, true); + }); + }); + +#[gpu_test] +static FLOAT32_FILTERABLE_WITH_FEATURE: GpuTestConfiguration = GpuTestConfiguration::new() + .parameters(TestParameters::default().features(wgpu::Features::FLOAT32_FILTERABLE)) + .run_sync(|ctx| { + let device = &ctx.device; + // With the feature enabled, it does work! + create_texture_binding(device, wgpu::TextureFormat::R32Float, true); + create_texture_binding(device, wgpu::TextureFormat::Rg32Float, true); + create_texture_binding(device, wgpu::TextureFormat::Rgba32Float, true); + }); diff --git a/tests/tests/root.rs b/tests/tests/root.rs index 5fd119b2c9..e3f116b0c7 100644 --- a/tests/tests/root.rs +++ b/tests/tests/root.rs @@ -15,6 +15,7 @@ mod create_surface_error; mod device; mod encoder; mod external_texture; +mod float32_filterable; mod instance; mod life_cycle; mod mem_leaks; diff --git a/wgpu-core/src/device/resource.rs b/wgpu-core/src/device/resource.rs index fb48115ca8..b6ee9aec07 100644 --- a/wgpu-core/src/device/resource.rs +++ b/wgpu-core/src/device/resource.rs @@ -2064,7 +2064,7 @@ impl Device { .views .add_single(&*texture_view_guard, id) .ok_or(Error::InvalidTextureView(id))?; - let (pub_usage, internal_use) = Self::texture_use_parameters( + let (pub_usage, internal_use) = self.texture_use_parameters( binding, decl, view, @@ -2095,7 +2095,7 @@ impl Device { .add_single(&*texture_view_guard, id) .ok_or(Error::InvalidTextureView(id))?; let (pub_usage, internal_use) = - Self::texture_use_parameters(binding, decl, view, + self.texture_use_parameters(binding, decl, view, "SampledTextureArray, ReadonlyStorageTextureArray or WriteonlyStorageTextureArray")?; Self::create_texture_binding( view, @@ -2197,6 +2197,7 @@ impl Device { } pub(crate) fn texture_use_parameters( + self: &Arc, binding: u32, decl: &wgt::BindGroupLayoutEntry, view: &TextureView, @@ -2227,7 +2228,7 @@ impl Device { let compat_sample_type = view .desc .format - .sample_type(Some(view.desc.range.aspect)) + .sample_type(Some(view.desc.range.aspect), Some(self.features)) .unwrap(); match (sample_type, compat_sample_type) { (Tst::Uint, Tst::Uint) | @@ -3198,6 +3199,24 @@ impl Device { Ok(pipeline) } + pub(crate) fn get_texture_format_features( + &self, + adapter: &Adapter, + format: TextureFormat, + ) -> wgt::TextureFormatFeatures { + // Variant of adapter.get_texture_format_features that takes device features into account + use wgt::TextureFormatFeatureFlags as tfsc; + let mut format_features = adapter.get_texture_format_features(format); + if (format == TextureFormat::R32Float + || format == TextureFormat::Rg32Float + || format == TextureFormat::Rgba32Float) + && !self.features.contains(wgt::Features::FLOAT32_FILTERABLE) + { + format_features.flags.set(tfsc::FILTERABLE, false); + } + format_features + } + pub(crate) fn describe_format_features( &self, adapter: &Adapter, @@ -3213,7 +3232,7 @@ impl Device { let downlevel = !self.downlevel.is_webgpu_compliant(); if using_device_features || downlevel { - Ok(adapter.get_texture_format_features(format)) + Ok(self.get_texture_format_features(adapter, format)) } else { Ok(format.guaranteed_format_features(self.features)) } diff --git a/wgpu-hal/src/dx11/adapter.rs b/wgpu-hal/src/dx11/adapter.rs index 41b4b4e573..3d465ae21f 100644 --- a/wgpu-hal/src/dx11/adapter.rs +++ b/wgpu-hal/src/dx11/adapter.rs @@ -155,6 +155,10 @@ impl super::Adapter { // bgra8unorm-storage is never supported on dx11 according to: // https://learn.microsoft.com/en-us/windows/win32/direct3ddxgi/format-support-for-direct3d-11-0-feature-level-hardware#dxgi_format_b8g8r8a8_unormfcs-87 + // float32-filterable should always be available on dx11 + // https://learn.microsoft.com/en-us/windows/win32/direct3ddxgi/format-support-for-direct3d-11-0-feature-level-hardware#dxgi_format_r32g32b32a32_floatfcs-2 + features.set(wgt::Features::FLOAT32_FILTERABLE, true); + // // Fill out limits and alignments // diff --git a/wgpu-hal/src/dx12/adapter.rs b/wgpu-hal/src/dx12/adapter.rs index c28e88c658..1db9b0877d 100644 --- a/wgpu-hal/src/dx12/adapter.rs +++ b/wgpu-hal/src/dx12/adapter.rs @@ -294,6 +294,9 @@ impl super::Adapter { bgra8unorm_storage_supported, ); + // float32-filterable should always be available on d3d12 + features.set(wgt::Features::FLOAT32_FILTERABLE, true); + // TODO: Determine if IPresentationManager is supported let presentation_timer = auxil::dxgi::time::PresentationTimer::new_dxgi(); diff --git a/wgpu-hal/src/gles/adapter.rs b/wgpu-hal/src/gles/adapter.rs index 0e8285240a..8c35e452c1 100644 --- a/wgpu-hal/src/gles/adapter.rs +++ b/wgpu-hal/src/gles/adapter.rs @@ -549,6 +549,13 @@ impl super::Adapter { ); } + features.set( + wgt::Features::FLOAT32_FILTERABLE, + extensions.contains("GL_ARB_color_buffer_float") + || extensions.contains("GL_EXT_color_buffer_float") + || extensions.contains("OES_texture_float_linear"), + ); + // We *might* be able to emulate bgra8unorm-storage but currently don't attempt to. let mut private_caps = super::PrivateCapabilities::empty(); @@ -594,14 +601,6 @@ impl super::Adapter { super::PrivateCapabilities::COLOR_BUFFER_FLOAT, color_buffer_float, ); - private_caps.set( - super::PrivateCapabilities::TEXTURE_FLOAT_LINEAR, - if full_ver.is_some() { - color_buffer_float - } else { - extensions.contains("OES_texture_float_linear") - }, - ); private_caps.set(super::PrivateCapabilities::QUERY_BUFFERS, query_buffers); private_caps.set(super::PrivateCapabilities::QUERY_64BIT, full_ver.is_some()); private_caps.set( @@ -1022,8 +1021,7 @@ impl crate::Adapter for super::Adapter { | Tfc::MULTISAMPLE_RESOLVE, ); - let texture_float_linear = - private_caps_fn(super::PrivateCapabilities::TEXTURE_FLOAT_LINEAR, filterable); + let texture_float_linear = feature_fn(wgt::Features::FLOAT32_FILTERABLE, filterable); match format { Tf::R8Unorm => filterable_renderable, diff --git a/wgpu-hal/src/gles/command.rs b/wgpu-hal/src/gles/command.rs index 133e99598e..28dbf1688d 100644 --- a/wgpu-hal/src/gles/command.rs +++ b/wgpu-hal/src/gles/command.rs @@ -605,7 +605,7 @@ impl crate::CommandEncoder for super::CommandEncoder { if !cat.ops.contains(crate::AttachmentOps::LOAD) { let c = &cat.clear_value; self.cmd_buffer.commands.push( - match cat.target.view.format.sample_type(None).unwrap() { + match cat.target.view.format.sample_type(None, None).unwrap() { wgt::TextureSampleType::Float { .. } => C::ClearColorF { draw_buffer: i as u32, color: [c.r as f32, c.g as f32, c.b as f32, c.a as f32], diff --git a/wgpu-hal/src/gles/device.rs b/wgpu-hal/src/gles/device.rs index e610d37fb5..35c6f910de 100644 --- a/wgpu-hal/src/gles/device.rs +++ b/wgpu-hal/src/gles/device.rs @@ -746,7 +746,7 @@ impl crate::Device for super::Device { unsafe { gl.bind_texture(target, Some(raw)) }; //Note: this has to be done before defining the storage! - match desc.format.sample_type(None) { + match desc.format.sample_type(None, Some(self.shared.features)) { Some( wgt::TextureSampleType::Float { filterable: false } | wgt::TextureSampleType::Uint diff --git a/wgpu-hal/src/gles/mod.rs b/wgpu-hal/src/gles/mod.rs index df5ca4e9e8..9525e45d13 100644 --- a/wgpu-hal/src/gles/mod.rs +++ b/wgpu-hal/src/gles/mod.rs @@ -186,8 +186,6 @@ bitflags::bitflags! { const COLOR_BUFFER_HALF_FLOAT = 1 << 8; /// Supports `f11/f10` and `f32` color buffers const COLOR_BUFFER_FLOAT = 1 << 9; - /// Supports linear flitering `f32` textures. - const TEXTURE_FLOAT_LINEAR = 1 << 10; /// Supports query buffer objects. const QUERY_BUFFERS = 1 << 11; /// Supports 64 bit queries via `glGetQueryObjectui64v` diff --git a/wgpu-hal/src/metal/adapter.rs b/wgpu-hal/src/metal/adapter.rs index 1d3e2e5016..c398b28583 100644 --- a/wgpu-hal/src/metal/adapter.rs +++ b/wgpu-hal/src/metal/adapter.rs @@ -604,6 +604,9 @@ impl super::PrivateCapabilities { function_specialization: Self::supports_any(device, FUNCTION_SPECIALIZATION_SUPPORT), depth_clip_mode: Self::supports_any(device, DEPTH_CLIP_MODE), texture_cube_array: Self::supports_any(device, TEXTURE_CUBE_ARRAY_SUPPORT), + supports_float_filtering: os_is_mac + || (version.at_least((11, 0), (14, 0), os_is_mac) + && device.supports_32bit_float_filtering()), format_depth24_stencil8: os_is_mac && device.d24_s8_supported(), format_depth32_stencil8_filter: os_is_mac, format_depth32_stencil8_none: !os_is_mac, @@ -821,6 +824,7 @@ impl super::PrivateCapabilities { | F::DEPTH32FLOAT_STENCIL8 | F::BGRA8UNORM_STORAGE; + features.set(F::FLOAT32_FILTERABLE, self.supports_float_filtering); features.set( F::INDIRECT_FIRST_INSTANCE | F::MULTI_DRAW_INDIRECT, self.indirect_draw_dispatch, diff --git a/wgpu-hal/src/metal/mod.rs b/wgpu-hal/src/metal/mod.rs index 0ddf96ed4a..8890092d31 100644 --- a/wgpu-hal/src/metal/mod.rs +++ b/wgpu-hal/src/metal/mod.rs @@ -191,6 +191,7 @@ struct PrivateCapabilities { function_specialization: bool, depth_clip_mode: bool, texture_cube_array: bool, + supports_float_filtering: bool, format_depth24_stencil8: bool, format_depth32_stencil8_filter: bool, format_depth32_stencil8_none: bool, diff --git a/wgpu-hal/src/vulkan/adapter.rs b/wgpu-hal/src/vulkan/adapter.rs index e0f465db52..dc67e85a5e 100644 --- a/wgpu-hal/src/vulkan/adapter.rs +++ b/wgpu-hal/src/vulkan/adapter.rs @@ -536,6 +536,10 @@ impl PhysicalDeviceFeatures { supports_bgra8unorm_storage(instance, phd, caps.device_api_version), ); + features.set( + F::FLOAT32_FILTERABLE, + is_float32_filterable_supported(instance, phd), + ); features.set( F::TEXTURE_FORMAT_NV12, (caps.device_api_version >= vk::API_VERSION_1_1 @@ -1568,8 +1572,8 @@ impl crate::Adapter for super::Adapter { .framebuffer_stencil_sample_counts .min(limits.sampled_image_stencil_sample_counts) } else { - match format.sample_type(None) { - Some(wgt::TextureSampleType::Float { filterable: _ }) => limits + match format.sample_type(None, None) { + Some(wgt::TextureSampleType::Float { .. }) => limits .framebuffer_color_sample_counts .min(limits.sampled_image_color_sample_counts), Some(wgt::TextureSampleType::Sint) | Some(wgt::TextureSampleType::Uint) => { @@ -1760,6 +1764,21 @@ fn is_format_16bit_norm_supported(instance: &ash::Instance, phd: vk::PhysicalDev r16unorm && r16snorm && rg16unorm && rg16snorm && rgba16unorm && rgba16snorm } +fn is_float32_filterable_supported(instance: &ash::Instance, phd: vk::PhysicalDevice) -> bool { + let tiling = vk::ImageTiling::OPTIMAL; + let features = vk::FormatFeatureFlags::SAMPLED_IMAGE_FILTER_LINEAR; + let r_float = supports_format(instance, phd, vk::Format::R32_SFLOAT, tiling, features); + let rg_float = supports_format(instance, phd, vk::Format::R32G32_SFLOAT, tiling, features); + let rgba_float = supports_format( + instance, + phd, + vk::Format::R32G32B32A32_SFLOAT, + tiling, + features, + ); + r_float && rg_float && rgba_float +} + fn supports_format( instance: &ash::Instance, phd: vk::PhysicalDevice, diff --git a/wgpu-hal/src/vulkan/conv.rs b/wgpu-hal/src/vulkan/conv.rs index e2d33b20e7..70dbb5714d 100644 --- a/wgpu-hal/src/vulkan/conv.rs +++ b/wgpu-hal/src/vulkan/conv.rs @@ -200,7 +200,7 @@ impl crate::ColorAttachment<'_, super::Api> { .view .attachment .view_format - .sample_type(None) + .sample_type(None, None) .unwrap() { wgt::TextureSampleType::Float { .. } => vk::ClearColorValue { diff --git a/wgpu-types/src/lib.rs b/wgpu-types/src/lib.rs index 56b8ee4d0c..bdef49a60c 100644 --- a/wgpu-types/src/lib.rs +++ b/wgpu-types/src/lib.rs @@ -337,7 +337,18 @@ bitflags::bitflags! { // ? const NORM16_FILTERABLE = 1 << 17; (https://github.com/gpuweb/gpuweb/issues/3839) // ? const NORM16_RESOLVE = 1 << 18; (https://github.com/gpuweb/gpuweb/issues/3839) - // TODO const FLOAT32_FILTERABLE = 1 << 19; + + /// Allows textures with formats "r32float", "rg32float", and "rgba32float" to be filterable. + /// + /// Supported Platforms: + /// - Vulkan (mainly on Desktop GPUs) + /// - DX12 + /// - Metal on macOS or Apple9+ GPUs, optional on iOS/iPadOS with Apple7/8 GPUs + /// - GL with one of `GL_ARB_color_buffer_float`/`GL_EXT_color_buffer_float`/`OES_texture_float_linear` + /// + /// This is a web and native feature. + const FLOAT32_FILTERABLE = 1 << 19; + // ? const FLOAT32_BLENDABLE = 1 << 20; (https://github.com/gpuweb/gpuweb/issues/3556) // ? const 32BIT_FORMAT_MULTISAMPLE = 1 << 21; (https://github.com/gpuweb/gpuweb/issues/3844) // ? const 32BIT_FORMAT_RESOLVE = 1 << 22; (https://github.com/gpuweb/gpuweb/issues/3844) @@ -3218,10 +3229,16 @@ impl TextureFormat { Self::Astc { .. } => ( noaa, basic), }; - let is_filterable = - self.sample_type(None) == Some(TextureSampleType::Float { filterable: true }); + // Get whether the format is filterable, taking features into account + let sample_type1 = self.sample_type(None, Some(device_features)); + let is_filterable = sample_type1 == Some(TextureSampleType::Float { filterable: true }); + + // Features that enable filtering don't affect blendability + let sample_type2 = self.sample_type(None, None); + let is_blendable = sample_type2 == Some(TextureSampleType::Float { filterable: true }); + flags.set(TextureFormatFeatureFlags::FILTERABLE, is_filterable); - flags.set(TextureFormatFeatureFlags::BLENDABLE, is_filterable); + flags.set(TextureFormatFeatureFlags::BLENDABLE, is_blendable); TextureFormatFeatures { allowed_usages, @@ -3233,9 +3250,17 @@ impl TextureFormat { /// /// Returns `None` only if the format is combined depth-stencil /// and `TextureAspect::All` or no `aspect` was provided - pub fn sample_type(&self, aspect: Option) -> Option { + pub fn sample_type( + &self, + aspect: Option, + device_features: Option, + ) -> Option { let float = TextureSampleType::Float { filterable: true }; - let unfilterable_float = TextureSampleType::Float { filterable: false }; + let float32_sample_type = TextureSampleType::Float { + filterable: device_features + .unwrap_or(Features::empty()) + .contains(Features::FLOAT32_FILTERABLE), + }; let depth = TextureSampleType::Depth; let uint = TextureSampleType::Uint; let sint = TextureSampleType::Sint; @@ -3256,7 +3281,7 @@ impl TextureFormat { | Self::Rgb10a2Unorm | Self::Rg11b10Float => Some(float), - Self::R32Float | Self::Rg32Float | Self::Rgba32Float => Some(unfilterable_float), + Self::R32Float | Self::Rg32Float | Self::Rgba32Float => Some(float32_sample_type), Self::R8Uint | Self::Rg8Uint diff --git a/wgpu/src/backend/web.rs b/wgpu/src/backend/web.rs index 05e05db8de..b9bb04ffb0 100644 --- a/wgpu/src/backend/web.rs +++ b/wgpu/src/backend/web.rs @@ -661,7 +661,7 @@ fn map_map_mode(mode: crate::MapMode) -> u32 { } } -const FEATURES_MAPPING: [(wgt::Features, web_sys::GpuFeatureName); 10] = [ +const FEATURES_MAPPING: [(wgt::Features, web_sys::GpuFeatureName); 11] = [ //TODO: update the name ( wgt::Features::DEPTH_CLIP_CONTROL, @@ -703,6 +703,10 @@ const FEATURES_MAPPING: [(wgt::Features, web_sys::GpuFeatureName); 10] = [ wgt::Features::BGRA8UNORM_STORAGE, web_sys::GpuFeatureName::Bgra8unormStorage, ), + ( + wgt::Features::FLOAT32_FILTERABLE, + web_sys::GpuFeatureName::Float32Filterable, + ), ]; fn map_wgt_features(supported_features: web_sys::GpuSupportedFeatures) -> wgt::Features { From 767ac03245ee937d3dc552edc13fe7ab0a860eec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 14:23:41 +0100 Subject: [PATCH 06/14] Bump core-graphics-types from 0.1.2 to 0.1.3 (#4813) --- Cargo.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 48e9c91757..c9ab1650c4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -685,9 +685,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -695,9 +695,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "core-graphics" @@ -727,9 +727,9 @@ dependencies = [ [[package]] name = "core-graphics-types" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", "core-foundation", From 65512cf668ed517eb6c903f735ca7f20a23578d2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 10:58:02 -0500 Subject: [PATCH 07/14] Bump wasm-bindgen-test from 0.3.38 to 0.3.39 (#4807) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c9ab1650c4..ef639cf4f4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3754,9 +3754,9 @@ checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "wasm-bindgen-test" -version = "0.3.38" +version = "0.3.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6433b7c56db97397842c46b67e11873eda263170afeb3a2dc74a7cb370fee0d" +checksum = "2cf9242c0d27999b831eae4767b2a146feb0b27d332d553e605864acd2afd403" dependencies = [ "console_error_panic_hook", "js-sys", @@ -3768,9 +3768,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.38" +version = "0.3.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "493fcbab756bb764fa37e6bee8cec2dd709eb4273d06d0c282a5e74275ded735" +checksum = "794645f5408c9a039fd09f4d113cdfb2e7eba5ff1956b07bcf701cf4b394fe89" dependencies = [ "proc-macro2", "quote", From 537f6566262c6f964bcd2f7c94b7f7b235106352 Mon Sep 17 00:00:00 2001 From: Nicolas Silva Date: Tue, 5 Dec 2023 00:49:33 +0100 Subject: [PATCH 08/14] Use Display instead of Debug to log errors. (#4830) --- wgpu-core/src/device/global.rs | 28 +++++++++++++--------------- wgpu-core/src/device/life.rs | 2 +- wgpu-core/src/device/resource.rs | 4 ++-- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/wgpu-core/src/device/global.rs b/wgpu-core/src/device/global.rs index b043e2106c..0f3cee9125 100644 --- a/wgpu-core/src/device/global.rs +++ b/wgpu-core/src/device/global.rs @@ -526,7 +526,7 @@ impl Global { if wait { match device.wait_for_submit(last_submit_index) { Ok(()) => (), - Err(e) => log::error!("Failed to wait for buffer {:?}: {:?}", buffer_id, e), + Err(e) => log::error!("Failed to wait for buffer {:?}: {}", buffer_id, e), } } } @@ -574,7 +574,7 @@ impl Global { return (id, None); }; - log::error!("Device::create_texture error {error:?}"); + log::error!("Device::create_texture error: {error}"); let id = fid.assign_error(desc.label.borrow_or_default()); (id, Some(error)) @@ -648,7 +648,7 @@ impl Global { return (id, None); }; - log::error!("Device::create_texture error {error:?}"); + log::error!("Device::create_texture error: {error}"); let id = fid.assign_error(desc.label.borrow_or_default()); (id, Some(error)) @@ -702,7 +702,7 @@ impl Global { return (id, None); }; - log::error!("Device::create_buffer error {error:?}"); + log::error!("Device::create_buffer error: {error}"); let id = fid.assign_error(desc.label.borrow_or_default()); (id, Some(error)) @@ -790,7 +790,7 @@ impl Global { if wait { match device.wait_for_submit(last_submit_index) { Ok(()) => (), - Err(e) => log::error!("Failed to wait for texture {:?}: {:?}", texture_id, e), + Err(e) => log::error!("Failed to wait for texture {texture_id:?}: {e}"), } } } @@ -835,7 +835,7 @@ impl Global { return (id, None); }; - log::error!("Texture::create_view({texture_id:?}) error {error:?}"); + log::error!("Texture::create_view({texture_id:?}) error: {error}"); let id = fid.assign_error(desc.label.borrow_or_default()); (id, Some(error)) } @@ -865,11 +865,9 @@ impl Global { if wait { match view.device.wait_for_submit(last_submit_index) { Ok(()) => (), - Err(e) => log::error!( - "Failed to wait for texture view {:?}: {:?}", - texture_view_id, - e - ), + Err(e) => { + log::error!("Failed to wait for texture view {texture_view_id:?}: {e}") + } } } } @@ -1217,7 +1215,7 @@ impl Global { return (id, None); }; - log::error!("Device::create_shader_module error: {error:?}"); + log::error!("Device::create_shader_module error: {error}"); let id = fid.assign_error(desc.label.borrow_or_default()); (id, Some(error)) @@ -1274,7 +1272,7 @@ impl Global { return (id, None); }; - log::error!("Device::create_shader_module_spirv error: {error:?}"); + log::error!("Device::create_shader_module_spirv error: {error}"); let id = fid.assign_error(desc.label.borrow_or_default()); (id, Some(error)) @@ -1598,7 +1596,7 @@ impl Global { } } - log::error!("Device::create_render_pipeline error {error:?}"); + log::error!("Device::create_render_pipeline error: {error}"); (id, Some(error)) } @@ -2321,7 +2319,7 @@ impl Global { if let Some(callback) = operation.callback.take() { callback.call(Err(err.clone())); } - log::error!("Buffer::map_async error {err:?}"); + log::error!("Buffer::map_async error: {err}"); return Err(err); } diff --git a/wgpu-core/src/device/life.rs b/wgpu-core/src/device/life.rs index 8b421c11af..0193d0987b 100644 --- a/wgpu-core/src/device/life.rs +++ b/wgpu-core/src/device/life.rs @@ -930,7 +930,7 @@ impl LifetimeTracker { Ok(()) } Err(e) => { - log::error!("Mapping failed {:?}", e); + log::error!("Mapping failed: {e}"); Err(e) } } diff --git a/wgpu-core/src/device/resource.rs b/wgpu-core/src/device/resource.rs index b6ee9aec07..015996c98f 100644 --- a/wgpu-core/src/device/resource.rs +++ b/wgpu-core/src/device/resource.rs @@ -268,7 +268,7 @@ impl Device { Some(trace) } Err(e) => { - log::error!("Unable to start a trace in '{:?}': {:?}", path, e); + log::error!("Unable to start a trace in '{path:?}': {e}"); None } })), @@ -3358,7 +3358,7 @@ impl Device { .unwrap() .wait(fence, current_index, CLEANUP_WAIT_MS) } { - log::error!("failed to wait for the device: {:?}", error); + log::error!("failed to wait for the device: {error}"); } let mut life_tracker = self.lock_life(); let _ = life_tracker.triage_submissions( From 19702108ab1cd605e141e882aa14f6c09f16edda Mon Sep 17 00:00:00 2001 From: Jim Blandy Date: Wed, 22 Nov 2023 21:35:41 -0800 Subject: [PATCH 09/14] [naga] Rename abstract-types snapshots abstract-types-const. This prepares for introducing a similar test for global variables. --- .../tests/in/{abstract-types.wgsl => abstract-types-const.wgsl} | 0 .../out/msl/{abstract-types.msl => abstract-types-const.msl} | 0 .../spv/{abstract-types.spvasm => abstract-types-const.spvasm} | 0 .../out/wgsl/{abstract-types.wgsl => abstract-types-const.wgsl} | 0 naga/tests/snapshots.rs | 2 +- 5 files changed, 1 insertion(+), 1 deletion(-) rename naga/tests/in/{abstract-types.wgsl => abstract-types-const.wgsl} (100%) rename naga/tests/out/msl/{abstract-types.msl => abstract-types-const.msl} (100%) rename naga/tests/out/spv/{abstract-types.spvasm => abstract-types-const.spvasm} (100%) rename naga/tests/out/wgsl/{abstract-types.wgsl => abstract-types-const.wgsl} (100%) diff --git a/naga/tests/in/abstract-types.wgsl b/naga/tests/in/abstract-types-const.wgsl similarity index 100% rename from naga/tests/in/abstract-types.wgsl rename to naga/tests/in/abstract-types-const.wgsl diff --git a/naga/tests/out/msl/abstract-types.msl b/naga/tests/out/msl/abstract-types-const.msl similarity index 100% rename from naga/tests/out/msl/abstract-types.msl rename to naga/tests/out/msl/abstract-types-const.msl diff --git a/naga/tests/out/spv/abstract-types.spvasm b/naga/tests/out/spv/abstract-types-const.spvasm similarity index 100% rename from naga/tests/out/spv/abstract-types.spvasm rename to naga/tests/out/spv/abstract-types-const.spvasm diff --git a/naga/tests/out/wgsl/abstract-types.wgsl b/naga/tests/out/wgsl/abstract-types-const.wgsl similarity index 100% rename from naga/tests/out/wgsl/abstract-types.wgsl rename to naga/tests/out/wgsl/abstract-types-const.wgsl diff --git a/naga/tests/snapshots.rs b/naga/tests/snapshots.rs index 35370e7f07..fd955be32a 100644 --- a/naga/tests/snapshots.rs +++ b/naga/tests/snapshots.rs @@ -791,7 +791,7 @@ fn convert_wgsl() { Targets::SPIRV | Targets::GLSL | Targets::HLSL | Targets::WGSL, ), ( - "abstract-types", + "abstract-types-const", Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::WGSL, ), ]; From 1676ee0dc0b2d90e5d631c668af1b1bb258ca1ef Mon Sep 17 00:00:00 2001 From: Jim Blandy Date: Wed, 22 Nov 2023 21:34:19 -0800 Subject: [PATCH 10/14] [naga wgsl-in] Automatic conversions for global `var` initializers. --- naga/src/front/wgsl/lower/mod.rs | 28 ++++++- naga/tests/in/abstract-types-var.wgsl | 44 +++++++++++ naga/tests/out/msl/abstract-types-var.msl | 12 +++ naga/tests/out/spv/abstract-types-var.spvasm | 78 ++++++++++++++++++++ naga/tests/out/wgsl/abstract-types-var.wgsl | 25 +++++++ naga/tests/snapshots.rs | 4 + naga/tests/wgsl_errors.rs | 16 ++++ 7 files changed, 203 insertions(+), 4 deletions(-) create mode 100644 naga/tests/in/abstract-types-var.wgsl create mode 100644 naga/tests/out/msl/abstract-types-var.msl create mode 100644 naga/tests/out/spv/abstract-types-var.spvasm create mode 100644 naga/tests/out/wgsl/abstract-types-var.wgsl diff --git a/naga/src/front/wgsl/lower/mod.rs b/naga/src/front/wgsl/lower/mod.rs index b050ffc343..27ed142286 100644 --- a/naga/src/front/wgsl/lower/mod.rs +++ b/naga/src/front/wgsl/lower/mod.rs @@ -875,10 +875,30 @@ impl<'source, 'temp> Lowerer<'source, 'temp> { ast::GlobalDeclKind::Var(ref v) => { let ty = self.resolve_ast_type(v.ty, &mut ctx)?; - let init = v - .init - .map(|init| self.expression(init, &mut ctx.as_const())) - .transpose()?; + let init; + if let Some(init_ast) = v.init { + let mut ectx = ctx.as_const(); + let lowered = self.expression_for_abstract(init_ast, &mut ectx)?; + let ty_res = crate::proc::TypeResolution::Handle(ty); + let converted = ectx + .try_automatic_conversions(lowered, &ty_res, v.name.span) + .map_err(|error| match error { + Error::AutoConversion { + dest_span: _, + dest_type, + source_span: _, + source_type, + } => Error::InitializationTypeMismatch { + name: v.name.span, + expected: dest_type, + got: source_type, + }, + other => other, + })?; + init = Some(converted); + } else { + init = None; + } let binding = if let Some(ref binding) = v.binding { Some(crate::ResourceBinding { diff --git a/naga/tests/in/abstract-types-var.wgsl b/naga/tests/in/abstract-types-var.wgsl new file mode 100644 index 0000000000..7eeb69065c --- /dev/null +++ b/naga/tests/in/abstract-types-var.wgsl @@ -0,0 +1,44 @@ +// i/x: type inferred / explicit +// vX/mX/aX: vector / matrix / array of X +// where X: u/i/f: u32 / i32 / f32 +// s: vector splat +// r: vector spread (vector arg to vector constructor) +// p: "partial" constructor (type parameter inferred) +// u/i/f/ai/af: u32 / i32 / f32 / abstract float / abstract integer as parameter +// _: just for alignment + +// Ensure that: +// - the inferred type is correct. +// - all parameters' types are considered. +// - all parameters are converted to the consensus type. + +var xvipaiai: vec2 = vec2(42, 43); +var xvupaiai: vec2 = vec2(44, 45); +var xvfpaiai: vec2 = vec2(46, 47); + +var xvupuai: vec2 = vec2(42u, 43); +var xvupaiu: vec2 = vec2(42, 43u); + +var xvuuai: vec2 = vec2(42u, 43); +var xvuaiu: vec2 = vec2(42, 43u); + +var xmfpaiaiaiai: mat2x2 = mat2x2(1, 2, 3, 4); +var xmfpafaiaiai: mat2x2 = mat2x2(1.0, 2, 3, 4); +var xmfpaiafaiai: mat2x2 = mat2x2(1, 2.0, 3, 4); +var xmfpaiaiafai: mat2x2 = mat2x2(1, 2, 3.0, 4); +var xmfpaiaiaiaf: mat2x2 = mat2x2(1, 2, 3, 4.0); + +var xvispai: vec2 = vec2(1); +var xvfspaf: vec2 = vec2(1.0); +var xvis_ai: vec2 = vec2(1); +var xvus_ai: vec2 = vec2(1); +var xvfs_ai: vec2 = vec2(1); +var xvfs_af: vec2 = vec2(1.0); + +var xafafaf: array = array(1.0, 2.0); +var xafaiai: array = array(1, 2); + +var xafpaiai: array = array(1, 2); +var xafpaiaf: array = array(1, 2.0); +var xafpafai: array = array(1.0, 2); +var xafpafaf: array = array(1.0, 2.0); diff --git a/naga/tests/out/msl/abstract-types-var.msl b/naga/tests/out/msl/abstract-types-var.msl new file mode 100644 index 0000000000..63f1cdfa75 --- /dev/null +++ b/naga/tests/out/msl/abstract-types-var.msl @@ -0,0 +1,12 @@ +// language: metal1.0 +#include +#include + +using metal::uint; + +struct type_5 { + float inner[2]; +}; +struct type_7 { + int inner[2]; +}; diff --git a/naga/tests/out/spv/abstract-types-var.spvasm b/naga/tests/out/spv/abstract-types-var.spvasm new file mode 100644 index 0000000000..ee9b4c1c72 --- /dev/null +++ b/naga/tests/out/spv/abstract-types-var.spvasm @@ -0,0 +1,78 @@ +; SPIR-V +; Version: 1.1 +; Generator: rspirv +; Bound: 70 +OpCapability Shader +OpCapability Linkage +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpDecorate %10 ArrayStride 4 +OpDecorate %12 ArrayStride 4 +%2 = OpTypeVoid +%4 = OpTypeInt 32 1 +%3 = OpTypeVector %4 2 +%6 = OpTypeInt 32 0 +%5 = OpTypeVector %6 2 +%8 = OpTypeFloat 32 +%7 = OpTypeVector %8 2 +%9 = OpTypeMatrix %7 2 +%11 = OpConstant %6 2 +%10 = OpTypeArray %8 %11 +%12 = OpTypeArray %4 %11 +%13 = OpConstant %4 42 +%14 = OpConstant %4 43 +%15 = OpConstantComposite %3 %13 %14 +%16 = OpConstant %6 44 +%17 = OpConstant %6 45 +%18 = OpConstantComposite %5 %16 %17 +%19 = OpConstant %8 46.0 +%20 = OpConstant %8 47.0 +%21 = OpConstantComposite %7 %19 %20 +%22 = OpConstant %6 42 +%23 = OpConstant %6 43 +%24 = OpConstantComposite %5 %22 %23 +%25 = OpConstant %8 1.0 +%26 = OpConstant %8 2.0 +%27 = OpConstantComposite %7 %25 %26 +%28 = OpConstant %8 3.0 +%29 = OpConstant %8 4.0 +%30 = OpConstantComposite %7 %28 %29 +%31 = OpConstantComposite %9 %27 %30 +%32 = OpConstant %4 1 +%33 = OpConstantComposite %3 %32 %32 +%34 = OpConstantComposite %7 %25 %25 +%35 = OpConstant %6 1 +%36 = OpConstantComposite %5 %35 %35 +%37 = OpConstantComposite %10 %25 %26 +%38 = OpConstant %4 2 +%39 = OpConstantComposite %12 %32 %38 +%41 = OpTypePointer Private %3 +%40 = OpVariable %41 Private %15 +%43 = OpTypePointer Private %5 +%42 = OpVariable %43 Private %18 +%45 = OpTypePointer Private %7 +%44 = OpVariable %45 Private %21 +%46 = OpVariable %43 Private %24 +%47 = OpVariable %43 Private %24 +%48 = OpVariable %43 Private %24 +%49 = OpVariable %43 Private %24 +%51 = OpTypePointer Private %9 +%50 = OpVariable %51 Private %31 +%52 = OpVariable %51 Private %31 +%53 = OpVariable %51 Private %31 +%54 = OpVariable %51 Private %31 +%55 = OpVariable %51 Private %31 +%56 = OpVariable %41 Private %33 +%57 = OpVariable %45 Private %34 +%58 = OpVariable %41 Private %33 +%59 = OpVariable %43 Private %36 +%60 = OpVariable %45 Private %34 +%61 = OpVariable %45 Private %34 +%63 = OpTypePointer Private %10 +%62 = OpVariable %63 Private %37 +%64 = OpVariable %63 Private %37 +%66 = OpTypePointer Private %12 +%65 = OpVariable %66 Private %39 +%67 = OpVariable %63 Private %37 +%68 = OpVariable %63 Private %37 +%69 = OpVariable %63 Private %37 \ No newline at end of file diff --git a/naga/tests/out/wgsl/abstract-types-var.wgsl b/naga/tests/out/wgsl/abstract-types-var.wgsl new file mode 100644 index 0000000000..cf05b83cde --- /dev/null +++ b/naga/tests/out/wgsl/abstract-types-var.wgsl @@ -0,0 +1,25 @@ +var xvipaiai: vec2 = vec2(42, 43); +var xvupaiai: vec2 = vec2(44u, 45u); +var xvfpaiai: vec2 = vec2(46.0, 47.0); +var xvupuai: vec2 = vec2(42u, 43u); +var xvupaiu: vec2 = vec2(42u, 43u); +var xvuuai: vec2 = vec2(42u, 43u); +var xvuaiu: vec2 = vec2(42u, 43u); +var xmfpaiaiaiai: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); +var xmfpafaiaiai: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); +var xmfpaiafaiai: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); +var xmfpaiaiafai: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); +var xmfpaiaiaiaf: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); +var xvispai: vec2 = vec2(1); +var xvfspaf: vec2 = vec2(1.0); +var xvis_ai: vec2 = vec2(1); +var xvus_ai: vec2 = vec2(1u); +var xvfs_ai: vec2 = vec2(1.0); +var xvfs_af: vec2 = vec2(1.0); +var xafafaf: array = array(1.0, 2.0); +var xafaiai: array = array(1.0, 2.0); +var xafpaiai: array = array(1, 2); +var xafpaiaf: array = array(1.0, 2.0); +var xafpafai: array = array(1.0, 2.0); +var xafpafaf: array = array(1.0, 2.0); + diff --git a/naga/tests/snapshots.rs b/naga/tests/snapshots.rs index fd955be32a..c201b206a2 100644 --- a/naga/tests/snapshots.rs +++ b/naga/tests/snapshots.rs @@ -794,6 +794,10 @@ fn convert_wgsl() { "abstract-types-const", Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::WGSL, ), + ( + "abstract-types-var", + Targets::SPIRV | Targets::METAL | Targets::GLSL | Targets::WGSL, + ), ]; for &(name, targets) in inputs.iter() { diff --git a/naga/tests/wgsl_errors.rs b/naga/tests/wgsl_errors.rs index b01c94d72e..7dddf633a4 100644 --- a/naga/tests/wgsl_errors.rs +++ b/naga/tests/wgsl_errors.rs @@ -2003,6 +2003,22 @@ fn constructor_type_error_span() { ) } +#[test] +fn global_initialization_type_mismatch() { + check( + " + var a: vec2 = vec2(1i, 2i); + ", + r###"error: the type of `a` is expected to be `vec2`, but got `vec2` + ┌─ wgsl:2:22 + │ +2 │ var a: vec2 = vec2(1i, 2i); + │ ^ definition of `a` + +"###, + ) +} + #[test] fn binding_array_local() { check_validation! { From f470103874272520f2bbaa4bf64e142fcef12635 Mon Sep 17 00:00:00 2001 From: Jim Blandy Date: Sat, 25 Nov 2023 14:07:07 -0800 Subject: [PATCH 11/14] [naga wgsl-in] Automatic conversions for local `var` initializers. --- CHANGELOG.md | 7 +- naga/src/front/wgsl/lower/mod.rs | 70 ++++---- naga/tests/in/abstract-types-var.wgsl | 76 +++++++++ naga/tests/out/msl/abstract-types-var.msl | 105 ++++++++++++ naga/tests/out/spv/abstract-types-var.spvasm | 169 ++++++++++++++++++- naga/tests/out/wgsl/abstract-types-var.wgsl | 153 ++++++++++++++--- 6 files changed, 518 insertions(+), 62 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a4fe90827..2b402c86dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -104,7 +104,7 @@ Passing an owned value `window` to `Surface` will return a `Surface<'static>`. S - Introduce a new `Scalar` struct type for use in Naga's IR, and update all frontend, middle, and backend code appropriately. By @jimblandy in [#4673](https://github.com/gfx-rs/wgpu/pull/4673). - Add more metal keywords. By @fornwall in [#4707](https://github.com/gfx-rs/wgpu/pull/4707). -- Add partial support for WGSL abstract types (@jimblandy in [#4743](https://github.com/gfx-rs/wgpu/pull/4743)). +- Add partial support for WGSL abstract types (@jimblandy in [#4743](https://github.com/gfx-rs/wgpu/pull/4743), [#4755](https://github.com/gfx-rs/wgpu/pull/4755)). Abstract types make numeric literals easier to use, by automatically converting literals and other constant expressions @@ -121,9 +121,10 @@ Passing an owned value `window` to `Surface` will return a `Surface<'static>`. S Even though the literals are abstract integers, Naga recognizes that it is safe and necessary to convert them to `f32` values in order to build the vector. You can also use abstract values as - initializers for global constants, like this: + initializers for global constants and global and local variables, + like this: - const unit_x: vec2 = vec2(1, 0); + var unit_x: vec2 = vec2(1, 0); The literals `1` and `0` are abstract integers, and the expression `vec2(1, 0)` is an abstract vector. However, Naga recognizes that diff --git a/naga/src/front/wgsl/lower/mod.rs b/naga/src/front/wgsl/lower/mod.rs index 27ed142286..6486e6cf6b 100644 --- a/naga/src/front/wgsl/lower/mod.rs +++ b/naga/src/front/wgsl/lower/mod.rs @@ -1162,45 +1162,49 @@ impl<'source, 'temp> Lowerer<'source, 'temp> { return Ok(()); } ast::LocalDecl::Var(ref v) => { - let mut emitter = Emitter::default(); - emitter.start(&ctx.function.expressions); - - let initializer = match v.init { - Some(init) => Some( - self.expression(init, &mut ctx.as_expression(block, &mut emitter))?, - ), - None => None, - }; - let explicit_ty = - v.ty.map(|ty| self.resolve_ast_type(ty, &mut ctx.as_global())) + v.ty.map(|ast| self.resolve_ast_type(ast, &mut ctx.as_global())) .transpose()?; - let ty = match (explicit_ty, initializer) { - (Some(explicit), Some(initializer)) => { - let mut ctx = ctx.as_expression(block, &mut emitter); - let initializer_ty = resolve_inner!(ctx, initializer); - if !ctx.module.types[explicit] - .inner - .equivalent(initializer_ty, &ctx.module.types) - { - let gctx = &ctx.module.to_ctx(); - return Err(Error::InitializationTypeMismatch { + let mut emitter = Emitter::default(); + emitter.start(&ctx.function.expressions); + let mut ectx = ctx.as_expression(block, &mut emitter); + + let ty; + let initializer; + match (v.init, explicit_ty) { + (Some(init), Some(explicit_ty)) => { + let init = self.expression_for_abstract(init, &mut ectx)?; + let ty_res = crate::proc::TypeResolution::Handle(explicit_ty); + let init = ectx + .try_automatic_conversions(init, &ty_res, v.name.span) + .map_err(|error| match error { + Error::AutoConversion { + dest_span: _, + dest_type, + source_span: _, + source_type, + } => Error::InitializationTypeMismatch { name: v.name.span, - expected: explicit.to_wgsl(gctx), - got: initializer_ty.to_wgsl(gctx), - }); - } - explicit + expected: dest_type, + got: source_type, + }, + other => other, + })?; + ty = explicit_ty; + initializer = Some(init); } - (Some(explicit), None) => explicit, - (None, Some(initializer)) => ctx - .as_expression(block, &mut emitter) - .register_type(initializer)?, - (None, None) => { - return Err(Error::MissingType(v.name.span)); + (Some(init), None) => { + let concretized = self.expression(init, &mut ectx)?; + ty = ectx.register_type(concretized)?; + initializer = Some(concretized); } - }; + (None, Some(explicit_ty)) => { + ty = explicit_ty; + initializer = None; + } + (None, None) => return Err(Error::MissingType(v.name.span)), + } let (const_initializer, initializer) = { match initializer { diff --git a/naga/tests/in/abstract-types-var.wgsl b/naga/tests/in/abstract-types-var.wgsl index 7eeb69065c..a733888530 100644 --- a/naga/tests/in/abstract-types-var.wgsl +++ b/naga/tests/in/abstract-types-var.wgsl @@ -42,3 +42,79 @@ var xafpaiai: array = array(1, 2); var xafpaiaf: array = array(1, 2.0); var xafpafai: array = array(1.0, 2); var xafpafaf: array = array(1.0, 2.0); + +fn all_constant_arguments() { + var xvipaiai: vec2 = vec2(42, 43); + var xvupaiai: vec2 = vec2(44, 45); + var xvfpaiai: vec2 = vec2(46, 47); + + var xvupuai: vec2 = vec2(42u, 43); + var xvupaiu: vec2 = vec2(42, 43u); + + var xvuuai: vec2 = vec2(42u, 43); + var xvuaiu: vec2 = vec2(42, 43u); + + var xmfpaiaiaiai: mat2x2 = mat2x2(1, 2, 3, 4); + var xmfpafaiaiai: mat2x2 = mat2x2(1.0, 2, 3, 4); + var xmfpaiafaiai: mat2x2 = mat2x2(1, 2.0, 3, 4); + var xmfpaiaiafai: mat2x2 = mat2x2(1, 2, 3.0, 4); + var xmfpaiaiaiaf: mat2x2 = mat2x2(1, 2, 3, 4.0); + + var xmfp_faiaiai: mat2x2 = mat2x2(1.0f, 2, 3, 4); + var xmfpai_faiai: mat2x2 = mat2x2(1, 2.0f, 3, 4); + var xmfpaiai_fai: mat2x2 = mat2x2(1, 2, 3.0f, 4); + var xmfpaiaiai_f: mat2x2 = mat2x2(1, 2, 3, 4.0f); + + var xvispai: vec2 = vec2(1); + var xvfspaf: vec2 = vec2(1.0); + var xvis_ai: vec2 = vec2(1); + var xvus_ai: vec2 = vec2(1); + var xvfs_ai: vec2 = vec2(1); + var xvfs_af: vec2 = vec2(1.0); + + var xafafaf: array = array(1.0, 2.0); + var xaf_faf: array = array(1.0f, 2.0); + var xafaf_f: array = array(1.0, 2.0f); + var xafaiai: array = array(1, 2); + var xai_iai: array = array(1i, 2); + var xaiai_i: array = array(1, 2i); + + // Ideally these would infer the var type from the initializer, + // but we don't support that yet. + var xaipaiai: array = array(1, 2); + var xafpaiai: array = array(1, 2); + var xafpaiaf: array = array(1, 2.0); + var xafpafai: array = array(1.0, 2); + var xafpafaf: array = array(1.0, 2.0); +} + +fn mixed_constant_and_runtime_arguments() { + var u: u32; + var i: i32; + var f: f32; + + var xvupuai: vec2 = vec2(u, 43); + var xvupaiu: vec2 = vec2(42, u); + + var xvuuai: vec2 = vec2(u, 43); + var xvuaiu: vec2 = vec2(42, u); + + var xmfp_faiaiai: mat2x2 = mat2x2(f, 2, 3, 4); + var xmfpai_faiai: mat2x2 = mat2x2(1, f, 3, 4); + var xmfpaiai_fai: mat2x2 = mat2x2(1, 2, f, 4); + var xmfpaiaiai_f: mat2x2 = mat2x2(1, 2, 3, f); + + var xaf_faf: array = array(f, 2.0); + var xafaf_f: array = array(1.0, f); + var xaf_fai: array = array(f, 2); + var xafai_f: array = array(1, f); + var xai_iai: array = array(i, 2); + var xaiai_i: array = array(1, i); + + var xafp_faf: array = array(f, 2.0); + var xafpaf_f: array = array(1.0, f); + var xafp_fai: array = array(f, 2); + var xafpai_f: array = array(1, f); + var xaip_iai: array = array(i, 2); + var xaipai_i: array = array(1, i); +} diff --git a/naga/tests/out/msl/abstract-types-var.msl b/naga/tests/out/msl/abstract-types-var.msl index 63f1cdfa75..45096f8672 100644 --- a/naga/tests/out/msl/abstract-types-var.msl +++ b/naga/tests/out/msl/abstract-types-var.msl @@ -10,3 +10,108 @@ struct type_5 { struct type_7 { int inner[2]; }; + +void all_constant_arguments( +) { + metal::int2 xvipaiai = metal::int2(42, 43); + metal::uint2 xvupaiai = metal::uint2(44u, 45u); + metal::float2 xvfpaiai = metal::float2(46.0, 47.0); + metal::uint2 xvupuai = metal::uint2(42u, 43u); + metal::uint2 xvupaiu = metal::uint2(42u, 43u); + metal::uint2 xvuuai = metal::uint2(42u, 43u); + metal::uint2 xvuaiu = metal::uint2(42u, 43u); + metal::float2x2 xmfpaiaiaiai = metal::float2x2(metal::float2(1.0, 2.0), metal::float2(3.0, 4.0)); + metal::float2x2 xmfpafaiaiai = metal::float2x2(metal::float2(1.0, 2.0), metal::float2(3.0, 4.0)); + metal::float2x2 xmfpaiafaiai = metal::float2x2(metal::float2(1.0, 2.0), metal::float2(3.0, 4.0)); + metal::float2x2 xmfpaiaiafai = metal::float2x2(metal::float2(1.0, 2.0), metal::float2(3.0, 4.0)); + metal::float2x2 xmfpaiaiaiaf = metal::float2x2(metal::float2(1.0, 2.0), metal::float2(3.0, 4.0)); + metal::float2x2 xmfp_faiaiai = metal::float2x2(metal::float2(1.0, 2.0), metal::float2(3.0, 4.0)); + metal::float2x2 xmfpai_faiai = metal::float2x2(metal::float2(1.0, 2.0), metal::float2(3.0, 4.0)); + metal::float2x2 xmfpaiai_fai = metal::float2x2(metal::float2(1.0, 2.0), metal::float2(3.0, 4.0)); + metal::float2x2 xmfpaiaiai_f = metal::float2x2(metal::float2(1.0, 2.0), metal::float2(3.0, 4.0)); + metal::int2 xvispai = metal::int2(1); + metal::float2 xvfspaf = metal::float2(1.0); + metal::int2 xvis_ai = metal::int2(1); + metal::uint2 xvus_ai = metal::uint2(1u); + metal::float2 xvfs_ai = metal::float2(1.0); + metal::float2 xvfs_af = metal::float2(1.0); + type_5 xafafaf = type_5 {1.0, 2.0}; + type_5 xaf_faf = type_5 {1.0, 2.0}; + type_5 xafaf_f = type_5 {1.0, 2.0}; + type_5 xafaiai = type_5 {1.0, 2.0}; + type_7 xai_iai = type_7 {1, 2}; + type_7 xaiai_i = type_7 {1, 2}; + type_7 xaipaiai = type_7 {1, 2}; + type_5 xafpaiai = type_5 {1.0, 2.0}; + type_5 xafpaiaf = type_5 {1.0, 2.0}; + type_5 xafpafai = type_5 {1.0, 2.0}; + type_5 xafpafaf = type_5 {1.0, 2.0}; +} + +void mixed_constant_and_runtime_arguments( +) { + uint u = {}; + int i = {}; + float f = {}; + metal::uint2 xvupuai_1 = {}; + metal::uint2 xvupaiu_1 = {}; + metal::uint2 xvuuai_1 = {}; + metal::uint2 xvuaiu_1 = {}; + metal::float2x2 xmfp_faiaiai_1 = {}; + metal::float2x2 xmfpai_faiai_1 = {}; + metal::float2x2 xmfpaiai_fai_1 = {}; + metal::float2x2 xmfpaiaiai_f_1 = {}; + type_5 xaf_faf_1 = {}; + type_5 xafaf_f_1 = {}; + type_5 xaf_fai = {}; + type_5 xafai_f = {}; + type_7 xai_iai_1 = {}; + type_7 xaiai_i_1 = {}; + type_5 xafp_faf = {}; + type_5 xafpaf_f = {}; + type_5 xafp_fai = {}; + type_5 xafpai_f = {}; + type_7 xaip_iai = {}; + type_7 xaipai_i = {}; + uint _e3 = u; + xvupuai_1 = metal::uint2(_e3, 43u); + uint _e7 = u; + xvupaiu_1 = metal::uint2(42u, _e7); + uint _e11 = u; + xvuuai_1 = metal::uint2(_e11, 43u); + uint _e15 = u; + xvuaiu_1 = metal::uint2(42u, _e15); + float _e19 = f; + xmfp_faiaiai_1 = metal::float2x2(metal::float2(_e19, 2.0), metal::float2(3.0, 4.0)); + float _e27 = f; + xmfpai_faiai_1 = metal::float2x2(metal::float2(1.0, _e27), metal::float2(3.0, 4.0)); + float _e35 = f; + xmfpaiai_fai_1 = metal::float2x2(metal::float2(1.0, 2.0), metal::float2(_e35, 4.0)); + float _e43 = f; + xmfpaiaiai_f_1 = metal::float2x2(metal::float2(1.0, 2.0), metal::float2(3.0, _e43)); + float _e51 = f; + xaf_faf_1 = type_5 {_e51, 2.0}; + float _e55 = f; + xafaf_f_1 = type_5 {1.0, _e55}; + float _e59 = f; + xaf_fai = type_5 {_e59, 2.0}; + float _e63 = f; + xafai_f = type_5 {1.0, _e63}; + int _e67 = i; + xai_iai_1 = type_7 {_e67, 2}; + int _e71 = i; + xaiai_i_1 = type_7 {1, _e71}; + float _e75 = f; + xafp_faf = type_5 {_e75, 2.0}; + float _e79 = f; + xafpaf_f = type_5 {1.0, _e79}; + float _e83 = f; + xafp_fai = type_5 {_e83, 2.0}; + float _e87 = f; + xafpai_f = type_5 {1.0, _e87}; + int _e91 = i; + xaip_iai = type_7 {_e91, 2}; + int _e95 = i; + xaipai_i = type_7 {1, _e95}; + return; +} diff --git a/naga/tests/out/spv/abstract-types-var.spvasm b/naga/tests/out/spv/abstract-types-var.spvasm index ee9b4c1c72..1b4b0664b4 100644 --- a/naga/tests/out/spv/abstract-types-var.spvasm +++ b/naga/tests/out/spv/abstract-types-var.spvasm @@ -1,7 +1,7 @@ ; SPIR-V ; Version: 1.1 ; Generator: rspirv -; Bound: 70 +; Bound: 209 OpCapability Shader OpCapability Linkage %1 = OpExtInstImport "GLSL.std.450" @@ -75,4 +75,169 @@ OpDecorate %12 ArrayStride 4 %65 = OpVariable %66 Private %39 %67 = OpVariable %63 Private %37 %68 = OpVariable %63 Private %37 -%69 = OpVariable %63 Private %37 \ No newline at end of file +%69 = OpVariable %63 Private %37 +%72 = OpTypeFunction %2 +%74 = OpTypePointer Function %3 +%76 = OpTypePointer Function %5 +%78 = OpTypePointer Function %7 +%84 = OpTypePointer Function %9 +%100 = OpTypePointer Function %10 +%105 = OpTypePointer Function %12 +%116 = OpTypePointer Function %6 +%117 = OpConstantNull %6 +%119 = OpTypePointer Function %4 +%120 = OpConstantNull %4 +%122 = OpTypePointer Function %8 +%123 = OpConstantNull %8 +%125 = OpConstantNull %5 +%127 = OpConstantNull %5 +%129 = OpConstantNull %5 +%131 = OpConstantNull %5 +%133 = OpConstantNull %9 +%135 = OpConstantNull %9 +%137 = OpConstantNull %9 +%139 = OpConstantNull %9 +%141 = OpConstantNull %10 +%143 = OpConstantNull %10 +%145 = OpConstantNull %10 +%147 = OpConstantNull %10 +%149 = OpConstantNull %12 +%151 = OpConstantNull %12 +%153 = OpConstantNull %10 +%155 = OpConstantNull %10 +%157 = OpConstantNull %10 +%159 = OpConstantNull %10 +%161 = OpConstantNull %12 +%163 = OpConstantNull %12 +%71 = OpFunction %2 None %72 +%70 = OpLabel +%109 = OpVariable %100 Function %37 +%106 = OpVariable %105 Function %39 +%102 = OpVariable %100 Function %37 +%98 = OpVariable %78 Function %34 +%95 = OpVariable %74 Function %33 +%92 = OpVariable %84 Function %31 +%89 = OpVariable %84 Function %31 +%86 = OpVariable %84 Function %31 +%82 = OpVariable %76 Function %24 +%79 = OpVariable %76 Function %24 +%73 = OpVariable %74 Function %15 +%110 = OpVariable %100 Function %37 +%107 = OpVariable %105 Function %39 +%103 = OpVariable %100 Function %37 +%99 = OpVariable %100 Function %37 +%96 = OpVariable %76 Function %36 +%93 = OpVariable %74 Function %33 +%90 = OpVariable %84 Function %31 +%87 = OpVariable %84 Function %31 +%83 = OpVariable %84 Function %31 +%80 = OpVariable %76 Function %24 +%75 = OpVariable %76 Function %18 +%111 = OpVariable %100 Function %37 +%108 = OpVariable %100 Function %37 +%104 = OpVariable %105 Function %39 +%101 = OpVariable %100 Function %37 +%97 = OpVariable %78 Function %34 +%94 = OpVariable %78 Function %34 +%91 = OpVariable %84 Function %31 +%88 = OpVariable %84 Function %31 +%85 = OpVariable %84 Function %31 +%81 = OpVariable %76 Function %24 +%77 = OpVariable %78 Function %21 +OpBranch %112 +%112 = OpLabel +OpReturn +OpFunctionEnd +%114 = OpFunction %2 None %72 +%113 = OpLabel +%162 = OpVariable %105 Function %163 +%156 = OpVariable %100 Function %157 +%150 = OpVariable %105 Function %151 +%144 = OpVariable %100 Function %145 +%138 = OpVariable %84 Function %139 +%132 = OpVariable %84 Function %133 +%126 = OpVariable %76 Function %127 +%118 = OpVariable %119 Function %120 +%160 = OpVariable %105 Function %161 +%154 = OpVariable %100 Function %155 +%148 = OpVariable %105 Function %149 +%142 = OpVariable %100 Function %143 +%136 = OpVariable %84 Function %137 +%130 = OpVariable %76 Function %131 +%124 = OpVariable %76 Function %125 +%115 = OpVariable %116 Function %117 +%158 = OpVariable %100 Function %159 +%152 = OpVariable %100 Function %153 +%146 = OpVariable %100 Function %147 +%140 = OpVariable %100 Function %141 +%134 = OpVariable %84 Function %135 +%128 = OpVariable %76 Function %129 +%121 = OpVariable %122 Function %123 +OpBranch %164 +%164 = OpLabel +%165 = OpLoad %6 %115 +%166 = OpCompositeConstruct %5 %165 %23 +OpStore %124 %166 +%167 = OpLoad %6 %115 +%168 = OpCompositeConstruct %5 %22 %167 +OpStore %126 %168 +%169 = OpLoad %6 %115 +%170 = OpCompositeConstruct %5 %169 %23 +OpStore %128 %170 +%171 = OpLoad %6 %115 +%172 = OpCompositeConstruct %5 %22 %171 +OpStore %130 %172 +%173 = OpLoad %8 %121 +%174 = OpCompositeConstruct %7 %173 %26 +%175 = OpCompositeConstruct %9 %174 %30 +OpStore %132 %175 +%176 = OpLoad %8 %121 +%177 = OpCompositeConstruct %7 %25 %176 +%178 = OpCompositeConstruct %9 %177 %30 +OpStore %134 %178 +%179 = OpLoad %8 %121 +%180 = OpCompositeConstruct %7 %179 %29 +%181 = OpCompositeConstruct %9 %27 %180 +OpStore %136 %181 +%182 = OpLoad %8 %121 +%183 = OpCompositeConstruct %7 %28 %182 +%184 = OpCompositeConstruct %9 %27 %183 +OpStore %138 %184 +%185 = OpLoad %8 %121 +%186 = OpCompositeConstruct %10 %185 %26 +OpStore %140 %186 +%187 = OpLoad %8 %121 +%188 = OpCompositeConstruct %10 %25 %187 +OpStore %142 %188 +%189 = OpLoad %8 %121 +%190 = OpCompositeConstruct %10 %189 %26 +OpStore %144 %190 +%191 = OpLoad %8 %121 +%192 = OpCompositeConstruct %10 %25 %191 +OpStore %146 %192 +%193 = OpLoad %4 %118 +%194 = OpCompositeConstruct %12 %193 %38 +OpStore %148 %194 +%195 = OpLoad %4 %118 +%196 = OpCompositeConstruct %12 %32 %195 +OpStore %150 %196 +%197 = OpLoad %8 %121 +%198 = OpCompositeConstruct %10 %197 %26 +OpStore %152 %198 +%199 = OpLoad %8 %121 +%200 = OpCompositeConstruct %10 %25 %199 +OpStore %154 %200 +%201 = OpLoad %8 %121 +%202 = OpCompositeConstruct %10 %201 %26 +OpStore %156 %202 +%203 = OpLoad %8 %121 +%204 = OpCompositeConstruct %10 %25 %203 +OpStore %158 %204 +%205 = OpLoad %4 %118 +%206 = OpCompositeConstruct %12 %205 %38 +OpStore %160 %206 +%207 = OpLoad %4 %118 +%208 = OpCompositeConstruct %12 %32 %207 +OpStore %162 %208 +OpReturn +OpFunctionEnd \ No newline at end of file diff --git a/naga/tests/out/wgsl/abstract-types-var.wgsl b/naga/tests/out/wgsl/abstract-types-var.wgsl index cf05b83cde..ae95ff2e82 100644 --- a/naga/tests/out/wgsl/abstract-types-var.wgsl +++ b/naga/tests/out/wgsl/abstract-types-var.wgsl @@ -1,25 +1,130 @@ -var xvipaiai: vec2 = vec2(42, 43); -var xvupaiai: vec2 = vec2(44u, 45u); -var xvfpaiai: vec2 = vec2(46.0, 47.0); -var xvupuai: vec2 = vec2(42u, 43u); -var xvupaiu: vec2 = vec2(42u, 43u); -var xvuuai: vec2 = vec2(42u, 43u); -var xvuaiu: vec2 = vec2(42u, 43u); -var xmfpaiaiaiai: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); -var xmfpafaiaiai: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); -var xmfpaiafaiai: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); -var xmfpaiaiafai: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); -var xmfpaiaiaiaf: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); -var xvispai: vec2 = vec2(1); -var xvfspaf: vec2 = vec2(1.0); -var xvis_ai: vec2 = vec2(1); -var xvus_ai: vec2 = vec2(1u); -var xvfs_ai: vec2 = vec2(1.0); -var xvfs_af: vec2 = vec2(1.0); -var xafafaf: array = array(1.0, 2.0); -var xafaiai: array = array(1.0, 2.0); -var xafpaiai: array = array(1, 2); -var xafpaiaf: array = array(1.0, 2.0); -var xafpafai: array = array(1.0, 2.0); -var xafpafaf: array = array(1.0, 2.0); +var xvipaiai_1: vec2 = vec2(42, 43); +var xvupaiai_1: vec2 = vec2(44u, 45u); +var xvfpaiai_1: vec2 = vec2(46.0, 47.0); +var xvupuai_2: vec2 = vec2(42u, 43u); +var xvupaiu_2: vec2 = vec2(42u, 43u); +var xvuuai_2: vec2 = vec2(42u, 43u); +var xvuaiu_2: vec2 = vec2(42u, 43u); +var xmfpaiaiaiai_1: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); +var xmfpafaiaiai_1: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); +var xmfpaiafaiai_1: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); +var xmfpaiaiafai_1: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); +var xmfpaiaiaiaf_1: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); +var xvispai_1: vec2 = vec2(1); +var xvfspaf_1: vec2 = vec2(1.0); +var xvis_ai_1: vec2 = vec2(1); +var xvus_ai_1: vec2 = vec2(1u); +var xvfs_ai_1: vec2 = vec2(1.0); +var xvfs_af_1: vec2 = vec2(1.0); +var xafafaf_1: array = array(1.0, 2.0); +var xafaiai_1: array = array(1.0, 2.0); +var xafpaiai_1: array = array(1, 2); +var xafpaiaf_1: array = array(1.0, 2.0); +var xafpafai_1: array = array(1.0, 2.0); +var xafpafaf_1: array = array(1.0, 2.0); + +fn all_constant_arguments() { + var xvipaiai: vec2 = vec2(42, 43); + var xvupaiai: vec2 = vec2(44u, 45u); + var xvfpaiai: vec2 = vec2(46.0, 47.0); + var xvupuai: vec2 = vec2(42u, 43u); + var xvupaiu: vec2 = vec2(42u, 43u); + var xvuuai: vec2 = vec2(42u, 43u); + var xvuaiu: vec2 = vec2(42u, 43u); + var xmfpaiaiaiai: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); + var xmfpafaiaiai: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); + var xmfpaiafaiai: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); + var xmfpaiaiafai: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); + var xmfpaiaiaiaf: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); + var xmfp_faiaiai: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); + var xmfpai_faiai: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); + var xmfpaiai_fai: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); + var xmfpaiaiai_f: mat2x2 = mat2x2(vec2(1.0, 2.0), vec2(3.0, 4.0)); + var xvispai: vec2 = vec2(1); + var xvfspaf: vec2 = vec2(1.0); + var xvis_ai: vec2 = vec2(1); + var xvus_ai: vec2 = vec2(1u); + var xvfs_ai: vec2 = vec2(1.0); + var xvfs_af: vec2 = vec2(1.0); + var xafafaf: array = array(1.0, 2.0); + var xaf_faf: array = array(1.0, 2.0); + var xafaf_f: array = array(1.0, 2.0); + var xafaiai: array = array(1.0, 2.0); + var xai_iai: array = array(1, 2); + var xaiai_i: array = array(1, 2); + var xaipaiai: array = array(1, 2); + var xafpaiai: array = array(1.0, 2.0); + var xafpaiaf: array = array(1.0, 2.0); + var xafpafai: array = array(1.0, 2.0); + var xafpafaf: array = array(1.0, 2.0); + +} + +fn mixed_constant_and_runtime_arguments() { + var u: u32; + var i: i32; + var f: f32; + var xvupuai_1: vec2; + var xvupaiu_1: vec2; + var xvuuai_1: vec2; + var xvuaiu_1: vec2; + var xmfp_faiaiai_1: mat2x2; + var xmfpai_faiai_1: mat2x2; + var xmfpaiai_fai_1: mat2x2; + var xmfpaiaiai_f_1: mat2x2; + var xaf_faf_1: array; + var xafaf_f_1: array; + var xaf_fai: array; + var xafai_f: array; + var xai_iai_1: array; + var xaiai_i_1: array; + var xafp_faf: array; + var xafpaf_f: array; + var xafp_fai: array; + var xafpai_f: array; + var xaip_iai: array; + var xaipai_i: array; + + let _e3 = u; + xvupuai_1 = vec2(_e3, 43u); + let _e7 = u; + xvupaiu_1 = vec2(42u, _e7); + let _e11 = u; + xvuuai_1 = vec2(_e11, 43u); + let _e15 = u; + xvuaiu_1 = vec2(42u, _e15); + let _e19 = f; + xmfp_faiaiai_1 = mat2x2(vec2(_e19, 2.0), vec2(3.0, 4.0)); + let _e27 = f; + xmfpai_faiai_1 = mat2x2(vec2(1.0, _e27), vec2(3.0, 4.0)); + let _e35 = f; + xmfpaiai_fai_1 = mat2x2(vec2(1.0, 2.0), vec2(_e35, 4.0)); + let _e43 = f; + xmfpaiaiai_f_1 = mat2x2(vec2(1.0, 2.0), vec2(3.0, _e43)); + let _e51 = f; + xaf_faf_1 = array(_e51, 2.0); + let _e55 = f; + xafaf_f_1 = array(1.0, _e55); + let _e59 = f; + xaf_fai = array(_e59, 2.0); + let _e63 = f; + xafai_f = array(1.0, _e63); + let _e67 = i; + xai_iai_1 = array(_e67, 2); + let _e71 = i; + xaiai_i_1 = array(1, _e71); + let _e75 = f; + xafp_faf = array(_e75, 2.0); + let _e79 = f; + xafpaf_f = array(1.0, _e79); + let _e83 = f; + xafp_fai = array(_e83, 2.0); + let _e87 = f; + xafpai_f = array(1.0, _e87); + let _e91 = i; + xaip_iai = array(_e91, 2); + let _e95 = i; + xaipai_i = array(1, _e95); + return; +} From 2882735cb94b501a72eadfac0a5e6e1bf20e9174 Mon Sep 17 00:00:00 2001 From: xiaopengli89 Date: Tue, 5 Dec 2023 21:16:22 +0800 Subject: [PATCH 12/14] check multi-planar format --- wgpu-hal/src/vulkan/device.rs | 2 +- wgpu-types/src/lib.rs | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/wgpu-hal/src/vulkan/device.rs b/wgpu-hal/src/vulkan/device.rs index d9aba50281..28ff5b1265 100644 --- a/wgpu-hal/src/vulkan/device.rs +++ b/wgpu-hal/src/vulkan/device.rs @@ -980,7 +980,7 @@ impl crate::Device for super::Device { wgt_view_formats = desc.view_formats.clone(); wgt_view_formats.push(desc.format); - if self.shared.private_caps.image_format_list { + if self.shared.private_caps.image_format_list && !desc.format.is_multi_planar_format() { vk_view_formats = desc .view_formats .iter() diff --git a/wgpu-types/src/lib.rs b/wgpu-types/src/lib.rs index bdef49a60c..07fa3276be 100644 --- a/wgpu-types/src/lib.rs +++ b/wgpu-types/src/lib.rs @@ -2890,6 +2890,11 @@ impl TextureFormat { } } + /// Returns `true` if the format is a multi-planar format + pub fn is_multi_planar_format(&self) -> bool { + matches!(*self, Self::NV12) + } + /// Returns `true` if the format has a color aspect pub fn has_color_aspect(&self) -> bool { !self.is_depth_stencil_format() From 12869e36fedec1bcea60a025795bb511f9967852 Mon Sep 17 00:00:00 2001 From: Teodor Tanasoaia <28601907+teoxoy@users.noreply.github.com> Date: Wed, 6 Dec 2023 15:50:10 +0100 Subject: [PATCH 13/14] [vk] remove (old) unused blocklist for dual source blending (#4758) --- wgpu-hal/src/vulkan/adapter.rs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/wgpu-hal/src/vulkan/adapter.rs b/wgpu-hal/src/vulkan/adapter.rs index dc67e85a5e..01bb6f88d4 100644 --- a/wgpu-hal/src/vulkan/adapter.rs +++ b/wgpu-hal/src/vulkan/adapter.rs @@ -993,13 +993,6 @@ impl super::Instance { phd_features.to_wgpu(&info, &self.shared.raw, phd, &phd_capabilities); let mut workarounds = super::Workarounds::empty(); { - // see https://github.com/gfx-rs/gfx/issues/1930 - let _is_windows_intel_dual_src_bug = cfg!(windows) - && phd_capabilities.properties.vendor_id == db::intel::VENDOR - && (phd_capabilities.properties.device_id & db::intel::DEVICE_KABY_LAKE_MASK - == db::intel::DEVICE_KABY_LAKE_MASK - || phd_capabilities.properties.device_id & db::intel::DEVICE_SKY_LAKE_MASK - == db::intel::DEVICE_SKY_LAKE_MASK); // TODO: only enable for particular devices workarounds |= super::Workarounds::SEPARATE_ENTRY_POINTS; workarounds.set( From a1fafe394f52c1a15d7309bee8acbbe8680e4cd1 Mon Sep 17 00:00:00 2001 From: Valaphee The Meerkat <32491319+valaphee@users.noreply.github.com> Date: Wed, 6 Dec 2023 21:12:46 +0100 Subject: [PATCH 14/14] Remove DX11 backend (#4828) --- CHANGELOG.md | 5 +- README.md | 5 +- deno_webgpu/Cargo.toml | 4 +- deno_webgpu/lib.rs | 2 - etc/big-picture.png | Bin 128836 -> 149220 bytes etc/big-picture.xml | 2 +- player/Cargo.toml | 2 +- player/README.md | 2 +- player/tests/test.rs | 2 - tests/src/expectations.rs | 2 +- wgpu-core/Cargo.toml | 1 - wgpu-core/src/any_surface.rs | 4 - wgpu-core/src/device/global.rs | 5 - wgpu-core/src/global.rs | 14 -- wgpu-core/src/hal_api.rs | 21 --- wgpu-core/src/hub.rs | 6 - wgpu-core/src/id.rs | 8 +- wgpu-core/src/instance.rs | 34 ---- wgpu-core/src/lib.rs | 3 - wgpu-hal/Cargo.toml | 15 +- wgpu-hal/src/auxil/mod.rs | 2 +- wgpu-hal/src/dx11/adapter.rs | 303 --------------------------------- wgpu-hal/src/dx11/command.rs | 271 ----------------------------- wgpu-hal/src/dx11/device.rs | 242 -------------------------- wgpu-hal/src/dx11/instance.rs | 53 ------ wgpu-hal/src/dx11/library.rs | 142 --------------- wgpu-hal/src/dx11/mod.rs | 139 --------------- wgpu-hal/src/lib.rs | 7 +- wgpu-types/src/lib.rs | 25 +-- wgpu/Cargo.toml | 4 +- 30 files changed, 28 insertions(+), 1297 deletions(-) delete mode 100644 wgpu-hal/src/dx11/adapter.rs delete mode 100644 wgpu-hal/src/dx11/command.rs delete mode 100644 wgpu-hal/src/dx11/device.rs delete mode 100644 wgpu-hal/src/dx11/instance.rs delete mode 100644 wgpu-hal/src/dx11/library.rs delete mode 100644 wgpu-hal/src/dx11/mod.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b402c86dc..a42d2ab846 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,7 +31,6 @@ Bottom level categories: - DX12 - Vulkan - Metal -- DX11 - GLES - WebGPU - Emscripten @@ -40,6 +39,10 @@ Bottom level categories: ## Unreleased +### Direct3D 11 backend removal + +This backend had no functionality, and with the recent support for GL on Desktop, which allows wgpu to run on older devices, there is no need to keep the backend. + ### `WGPU_ALLOW_UNDERLYING_NONCOMPLIANT_ADAPTER` environment variable This adds a way to allow a Vulkan driver which is non-compliant per VK_KHR_driver_properties to be enumerated. This is intended for testing new Vulkan drivers which are not Vulkan compliant yet. diff --git a/README.md b/README.md index dded2bdb75..711f3c395c 100644 --- a/README.md +++ b/README.md @@ -78,8 +78,7 @@ We have a [wiki](https://github.com/gfx-rs/wgpu/wiki) that serves as a knowledge | ----------- | ------------------------------ | ------------------ | ------------------------- | ------------------------- | | Vulkan | :white_check_mark: | :white_check_mark: | :volcano: | | | Metal | | | :white_check_mark: | | -| DX12 | :white_check_mark: | | | | -| DX11 | :hammer_and_wrench: | | | | +| DX12 | :white_check_mark: | | | | | OpenGL | :ok: (GL 3.3+) | :ok: (GL ES 3.0+) | :triangular_ruler: | :ok: (WebGL2) | | WebGPU | | | | :white_check_mark: | @@ -138,7 +137,7 @@ determined by the value of `MINIMUM_RUST_VERSION` in All testing and example infrastructure share the same set of environment variables that determine which Backend/GPU it will run on. - `WGPU_ADAPTER_NAME` with a substring of the name of the adapter you want to use (ex. `1080` will match `NVIDIA GeForce 1080ti`). -- `WGPU_BACKEND` with a comma-separated list of the backends you want to use (`vulkan`, `metal`, `dx12`, `dx11`, or `gl`). +- `WGPU_BACKEND` with a comma-separated list of the backends you want to use (`vulkan`, `metal`, `dx12`, or `gl`). - `WGPU_POWER_PREF` with the power preference to choose when a specific adapter name isn't specified (`high`, `low` or `none`) - `WGPU_DX12_COMPILER` with the DX12 shader compiler you wish to use (`dxc` or `fxc`, note that `dxc` requires `dxil.dll` and `dxcompiler.dll` to be in the working directory otherwise it will fall back to `fxc`) - `WGPU_GLES_MINOR_VERSION` with the minor OpenGL ES 3 version number to request (`0`, `1`, `2` or `automatic`). diff --git a/deno_webgpu/Cargo.toml b/deno_webgpu/Cargo.toml index 716f3770d8..b9d281f04d 100644 --- a/deno_webgpu/Cargo.toml +++ b/deno_webgpu/Cargo.toml @@ -34,10 +34,10 @@ features = ["trace", "replay", "serde", "strict_asserts", "wgsl", "gles"] workspace = true features = ["metal"] -# We want the wgpu-core Direct3D backends on Windows. +# We want the wgpu-core Direct3D backend on Windows. [target.'cfg(windows)'.dependencies.wgpu-core] workspace = true -features = ["dx11", "dx12"] +features = ["dx12"] [target.'cfg(windows)'.dependencies.wgpu-hal] version = "0.18.0" diff --git a/deno_webgpu/lib.rs b/deno_webgpu/lib.rs index 7d801e8ae4..15151ce952 100644 --- a/deno_webgpu/lib.rs +++ b/deno_webgpu/lib.rs @@ -33,8 +33,6 @@ mod macros { wgpu_types::Backend::Metal => $global.$method::( $($param),* ), #[cfg(all(not(target_arch = "wasm32"), windows))] wgpu_types::Backend::Dx12 => $global.$method::( $($param),* ), - #[cfg(all(not(target_arch = "wasm32"), windows))] - wgpu_types::Backend::Dx11 => $global.$method::( $($param),* ), #[cfg(any( all(unix, not(target_os = "macos"), not(target_os = "ios")), feature = "angle", diff --git a/etc/big-picture.png b/etc/big-picture.png index d52d60189c4533a02d2121b8922d1ee1d35bb981..86d754da9d9e5bcc596c619c3305d3e6bc52570a 100644 GIT binary patch literal 149220 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 b;D*|Hiyu(gw(Fl7v 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 literal 128836 zcmdSAhhL8G-#>1TWRJ*JDTHee8oKtry7oX^d+)1jQJE#86p11-vZFFmRtZTYk&%(g zCJidW@9gvb-1qPPeDCi+@O?Z~=Xo5j^K~4raXeq+JS9dlh{L^nz54X&Gn`DqvHSGt zPwmsEA8E)SVB}10oF4eo*TyDd`kcNu8i@U>J%4u7C*y?4L^)0yYO2i7=b> z3V}jO)c~s#;85fOC;}J`qLR3DS^xwKT%i>%x=% zVPcd3yZx8GBLP*-2miwa$p@R|a2t#O>=y=%5ezCNi|7e}U?4cQ+3aE1p>VgsC`0Pp zE|*PAi6*Kdlv-LO6m0e2$ZVBOrE+0)I+V-pAtJ3%heHN;!#H?=5e^WW5UoeU3?Qfx zLRPBP3>*rMGQda_4UuLx6Dg54A*y#tk3$ACn!N6H;qD7_xX4vvbK&2RT zuY)K(NWhs07&Md4cQC*XsYRi}Gu*gd0tC&bRN*4kawU@lCBmSQFf|v8)Nx@L0t}dz zlF2-%0MH~xOcH|eL=y=jmD7+moJyup*+fFMlLR+_WG~>lpY$`U|fX1*9R6N`&!bReB9J-N*!SeM~iiGQ;;Mj5n&IWQ~=@1IWXb_nrv2>!7 zX=CVQ0;ZioWJqLqnG|oM(?LX(Llq$e%f!8F0y{&Jlx7}>1_$v3SOEDjWHchupywdi zRF58tCEAQ&GDpja5Ry6J1qMJCo^)moRDYh&w-2##3cg5!lkGZZ2;dmu`a z+oR)J=$>Aqip&7mVF(UjB_%|{b5kR@Fam-P+?s4)G2qGstpf?bj@@At!udEefRY%I z6H0cl0E{D`$WS*9tP;6p?hN!ne*g8FquY>DVdWxK2> zwsJ{YjsfLnOT`)qiOEp|!+a?mq0^e2L340+I3?gzAPBsDOVS+`@UJQdkL`t0m zi>8y=Y6l(x_yNZ0a)>Zg6#yO>0?F9xHAaq#$`W|6W|)d=Ww?k~7?n(bD&cei)@sE^ z*ex!Rj&89=Fc=zz1WJKP`49k1F+`F@Yz0;|;^l0*5NX0g@d#)H-j1Q;vDyf-4TrZ# z<#dPz&b873a-N6*hT{n|jf(^maiG0X2d5Tru~ZT}LaWu|ohlce2KG?x0y~fEa;hvW z56Q@;!H5_)F#<#8IvrXtiVFnSUU41BXe!|A7_C|l1#bT}h~Y2+ti^C~1O&&p0 zgb1#J6YN;LnP}4J)DSyeMgz%JWQ?1S!+;dgToyS(5}{#QBC$lK73C2TTy|qGdy2?N zLL$Wscmxz_BbXd;Fbd6e5=BNRlnmyP2xJ~uz{j)nV7JxGmq55!Iv=lBVlg-niRT8{ z@FFOV#4~WsDzR1T0Re78fD;%X6%wu1g0Ybr9|R=Gsl3m zcqBM7ih@KdBUNUO%qRnkz)-A>p|>$KQYW5>MMBs@kw#_q=zu_tiI9twBo$7lXR38{ z0~w`+VTCFTOebgS87e3nrngcQ1iYS2^av1SodAR|8>NvE7(s*r3@Do$tv8S<6nKQ5 z8)>w&2~4z-NcE6iE{wtr;wxEPAW9Rk2&%=yP-&oi1iv?!q1Y^g3xmbzNjy7@$Y)3e zV890n7!1}z#uy_l010r*qhqxq99AoHDnx3Mnq`2|C0Zq4tFzGbM2R4pX_Z6yfEC#m zumHrfv*8*Z$L!Qf-C#6uglTFxh!6I#At0NOrkA4CRKOo~bdnAwb8%Tn5|RpmgXJu- zg`={=BdkIhpmu`F91TUQ+%SnoVTRCL2o0TY!bcM!I+L8KrGgyR=_sl zxMCc_gI3cbZD5_117_GwXb#s-K+-KBi-3)C*m+=%#9?(2Am)gFS<6Uuo2fc&G}aJ7 zu%dwDpw(cRl1NoFT_Qu1HAFcN=Eez?43dCEHbuI14!j6P)6mQ`x>3)MU@6eiL^;7} zFd&6ME=8vh@J=0{qJwhX93;)c;W}+xsLZ)}b`oMwNoSfITqe>eCbI#ojppkkO%kn#%fSj+4iZ?)0jtR>D?#fdAlMo_94)ZP+&psx zkn6hOk_d`HWC!zcc(suOwcDv?0t!Jxus{wVORy_hy%`jN?;weF6fR86B5Q;uxn79o z8?6R|31Pg|jN#)XH z9HoguQQ4tvg`LXtFaY2b$Ygf11!`p&xR6Ma#4YC`&}^qO0_hgw@N|y^=?0O(C_9j-807#>5y&;UR}z$wLav(AVHM@ZOEGC`xF zb6q?;U*a$loje?tOtV;tCWXi;9a+Cx+f`WxQ zAQqWNNt3f&c!t$wm%x-Z2#T)9>B&O3!X{LhkSLGGD2E}j7Lv;C0^k?VRth782&~$o z!U`}(ItGqq>EUcJfk@It!dN)EiKv%RBS>7U*22abc@PH_ViZ_`;AxNw0huGkP88Y9 zlEL&^s@W)va1$8aS(|ZDTrW;>`jnl7B|C* z(nwu)9?=dYCWJ^Klp#P`&Av27nt#&&Lz>Fg;aj*7mxMi4PS-aNQ!b zQw883w6|2nA{qAHIzi5(S=l7M!D`{*)g%_vAm(e0KzT}l8?Xi-_c3chRt18oRx6@) zPNfCOqeZx&4uS>{1j3-|t-yvc7FGlki`UbHETtxb#=^-Nb}B2v;|9q%bUWFMl{#$# zg%AodI3kfwIYrSM#DITz8j(g~TXc3BAPk1p8y>|pAPIzG)l!e!Ep^NJ2Bm~V^qAm8 ztjCH{ljInN9)UxfsB{g)$hE)(B0EVyHmD6AFph1vA}JEM6Au@I&=kDWrqD-HH59cY zk`1-u92k!=Qsh#pG%QZ93%gwcv&ju*+SqQp(PEX#=q86iCs7+w0zH<^(!p&cvKd0L zi+BVm!5~+o31nJtnqef!Sa1h9k|#upqXC^nD&#N;2V+FA*#-%bYL##~S}_l$azR~c z3rtVbG38Q&%FJTm)Krg}gXV}`HY){4>IfPEj@5g7Fuhj5QQ;t+I?@WVM%Z-(t{cjh zQQ0DpSx$2zZ63SHDPTpqsVJPiHw$o5*g}>XueCC*D!!X6CWyfTCd(-%09FQ6MW+Md zN>Ao;)w)QHHQG%vl3Yj_mIozbBhVfu6lH~wO>C9ZtYvW21igU|CJ^jA5)^1+IMKb$ z6O6$Y%>pT$LMt02vMU`rK2c-f*#N(EFo`s^Rl#HRR(a7GcmIOz^12PE}yxO|6BZb6Gwdb*>xjFAI|AYdYBVuspfbhyN5 zyPSzrIe;pdKx1+A5~CSzx8a;fEsv}>svSxuUC%cYB~F+V;*ro~L}6R=s?v%aFQJ=nak!h$ut7F zNe|T5crwDp7HBvav%t*fT2wAO+e{&=s4~0T!jO>-aF>u^SIGo&JUg1}65HfPJPn9F z90Xly4<0$T;C zJS;qhXf=U3HYuLNg|f70Ig|uLg9QkogiAvRTtX@sf)VQNZW+eLlA)YrH(PJBvs7kX zgwmlDSxK4*K1fPciMe=;O{5h=MRH4T#Q*_ANq!6;yKvAj*W+0gm0)@4M%;O4CP&9_sXj65Xb2vUPkFg&aD+JMzyQp`nnQDf&Z`ym9P^{7bs99UMZ=)WcY?=4>oh+i{{y6efB6SsK(sg!^3b^GCJ zGg~$1f2!-Bhj&fvw>fyZwEyX8g8!}2A;SU9{68b)41Gmv-KX#22mZw1a2tB=bxn%n zU#;8EMs0{+Kl(&<`u0WC{}ge*|Ey6C`G+6Ms&Ci7zJN?fBPQRhJuADt4HR=7b9dQA zPGXA*0~yqv5NH*kwbH5QiXk2uL2-;AHrb=>kF?p!`@?U`BBY01RWZ?m0WmeCrx zFT4Z;7^O*ms=f(j+iK1-Zj|F^E_&8?OZjn3YiV@k!pN)9->a64zqjsXl#fpZqdfJ? zyuPU=2d3yx_Oskuy5*yOR!TN}WmfTldyOk~!L_=D9i-;LV=pJWcc(RMsMt8Ie{}f9 zC6ZoQ6B9cruMeDwUvciBA4vH@98zuQlQm*8Wv4aA{y~i+60d7{zEy??5@uzywOS8Mj-mXfi|(C@)_(&q<+Lw7PbChq2~Plpdc zJ_-BNCDT7S(|7vnZ+&CCn|;vdBxUhO1$onsFtfKl5vnExkKcEI{;A~jT8QG#>zk8J z<32wxEE+l7w?64;(5eaFAFQ0*r`Xv-C{R`%;zWOXTn@covO#?AxKAbgjG}Ua{mU~r ztWS)p{Kk#_jJ=C4ems7nx}80Y0i|`{BdIsZVz}HJZF2tu*K8Le;c97yVq)uafV&aJSBdSuywLv z*vvMa9E)a}BDyaMU9)Jj2sz^>7ffH5l;j;OJkuvR{Ew?T?PtfN zZHEp`I`jNX$Ajzodv}@K4Rbn=Ew6@07AWcdvuD4#7x$t+b--EVz!!Z$WBR9VrY~KA z`|@#DrSGNzJE=t@Hs3mO{cTm|gHuZ{)L*Y`NP7QX-SG)I#&6o>_|1o@*$Knmy*<6W zxVpq`(==mbrNcKd!@38&THQX})A{vF=iK94Gy4rMzH~9e53nacv!(M zEL$KyM%z6R@YW;i-F+`DkHmtD7a&Y8r|IezV2(j7XZBRNetoH{K1}sN@5Ozr2o%gh zAP5-jDgLloe(-XF;%HX#`xALr=Ei^84OOix4K;|z{2ckQ|CWjYnN|J9@<4Q72|LrT zXkkvNu)qHxz;4*iuP;_!SUO5FgZ^{k#Kh~vk@ainndjeZp0{9^rG`uOlblUaFYl?Z zDV;%G)HZ+V%k_X^UmrhlddUDJ(ObSRqfq?-!?>K1(bLm@KcC!D%VA2M6>2hIn$0Nz zvKY)chjqo`k4fLKGd|x=P0+gH{)~2zvQg1qp|feFKbYZFHJym9zLJMoqM)%pg8iyz zw)eK4o?k7ljunPswf7EtTHgog%q!~tY)U-uw;*0VX95^JVtl;w7-Q3veVI3}Hf%)X8ef46Dh zUES#u8{eyok3x*ke@yfIs12dQ_VG^&H$Qoz29Gfy=A9gI_{l{5Q8tGIR^FW$(t2ZT zo8?2zVX*n`fWoWo3vglsiNP4_m&Y!*o)HC~AwC_YP~ARN^km}8a`%VPi&F!9?}ivJ z9h(%tb<#lMp{di77pv>y{{D9Md@E!2n$XhmUh)^+Tv>N*4;(lZZoemb|Gz!cKXgJS zC0>uNgI~K8eS&pPJ05-Cm}@;YP+5S#clAm9rR~AIyjVX%^0f8&ippWL7abciAkeRD zYj*6Ju!G7fKeN*=aFAt)z*=&%uHt1y3W%1A3 zpeD=Mz?n6lHZGpkPgz|iSY5KZ-2MCLm5tMTqvd`u;Ej!$rqUa+G0ms1$L`Ahy82i9 z!uLPB1|)raN#B0Br_Yer8Mii+1=erceEuL;52Nhb7NI|RM|3AJE8r)@H`E(%DGDJm znYW5;8dPT1x(=>S%?qO|beik(wYZUSTlXz*>6C5HxHzV2DPnL)%5sZ1boO*fTcAC2 z*2-(XRuEh-p%##|AMBi<@Cg3Bf~F0tQ8Cmd!#z;^Kw*tCv{5vB$l` zk0Yg{kngH8`xZR%a+S**x#lHWI!7RL{A?3mTTU z^!buj<@&_1$E!N0UrU;k*7`2{Rb^gIPR<$ai+1&k{Il5;Q$gVDME@-Zj`(<`Ey;&j z-UKI2T|8x4vcP?5OS_a8GjH60(rv*TbrYjN(jBSk@n_rLRW7+Veer~ZD`D%Nuj;)1 z>r>rn=cOju0}fMWdo!i>Qkz$IQC-s<>y@wD-*gg^c|H5r#zKzVAJrHgt$oyX zfoK}na!aQ?xhx>}Q{ATlC!-s0J~^uzd8O;e(hm30%N-9T1rdL^XoODB)*e{biWnS+uBcPwzXHVal9)a9=F%|z=SQ((r&6Su=^L{}@1 zSJV)H22*_FXRjC$U#?tRrYtXRxsvem@?!F2dgjaIfy2hUwiC*<7iKNGxmK9l7CR`D zaBJJtv~T#m!J(};l=ZQzZ2q~2%l0;;Pc?fMzUSp6-23W}enc5KZdc0bHzgtcD%fd@ zTd;3xC!NU%&S#C1Ag*f@H_S;D;l&y0DFb7N%m@wbUn$7D&e8eYxv!{D*v+2*BASb*D@-~8H<7MU?h11`H!e{x2Y z!ky>3?E1St8LTKB5Wf90dZqtO@9Enhhoz&(E5@22?c>i4pS*QR)DT)~T3UHQp|Z+% zQrcOLN+Q4dX9~}~>%rL5h{>DVj|1i$(oaH6FXatiIPQKbBWm6DfD!p$Loc1sjGalk zv};1QD%VW*&McUfJMAxTS2wTFUgrW~8I&RtmV=ShSe3>{;-`Wtb{SrW_LO)2 zqCFQ@j-H!7Z(bAvid=GXLdI?t{yrqsIBj}jhosT6%F>n{2MP`AYr0azyQisXGTzNf zTT^+QPoU{{WY@Ms<2wOZB&8F!O#z&vj&k+A=;PDkgp|gh;(;R)`u|W*)^GP7A3SZ{ zQzmhHe2P=j;H59CVU9M-BAkCvEuJfH355 z_%Z47N@&9HvL;34nXiX;6}U3J`X1Txc)-AEFP}2tApzga4+hOlGM-$uiDoKrt21mB&VwqZ5C{7FOM^J~Lr%rV6I(*wBP*H1C;Ro>d^Z1POFR4T;r(U1IrKyI z&mLFQ{P^;`xpre^-9bgc+iw>`F*}kPmU@qoO`W zE1Y?swLRk=cMbHT+TP@r8CCBgTUI?kD~p3< zFlR%W+IGvZ$?DhJ8470lMys?*|6k!e)luZyr_RHc-@}8*vSZ?E)w}7jes-1E3OzuEFAve zUQpajr%Y&${kUYKhb}oi-f#9=U3i{t=7r9*pCLWH1rC>8`c0V^!^XTyx)B(de*+Zq z+c##w_J1PQyJ;+yJi{k$N`3;WyBfZ}G+!Tj- zcW-1v`~C3y(bAK`R+#p2Nxzt%_Un09|IB@NLH~5jWMtU-9ZZ(r!V>0so$$C)3!Dr%7Zf?RD+RoOqwy@k0ScB}T4?G!}K$@G%5 zxlnJ|z3!g-p`BS9B(Xo9s`A4&4ZL;H*%EPd`7doz?BkOIu9C`+&=>Bvy&D|UzNj!- zmZiQPLiH{?vFuo?>sprgLOY?`nx8M76~CzLX-U*m7nvkn=Wd_fmAT@=hw=5R9}dU( z7Y(}F{c}r*q%{8Gm9U@h{YpA&s80%1$)vdUYTdTb9a?T_tevufB3d`h5qe15j%3}(eDjUvbRlL{IjklVft5m+U)Q7Nw*Tm1|Hfr{@o?M z?bD=XmU5n}y~=sk^IiJ6zKHX7@h9u|&*(_4`$5{2u4z4=@~(bst6W(5>+P0>S5m&0 zdIb8k)X!5F*~_Er9(j2Trx*G}V-j&da?ZYZqT#~<+ahpx`;EkQ>!$olQH^RpV@*eo z-=DC>YX^@B4#nM*TzHq^x6>#8#;9S_2+5-Tx8`N>lf24?G<;|TK()$Vw1Hx>&r)kUum*+2y`Z0N`Keb@?E!q9k z_dzN~KSuVStNOJUe|=2=$Hn$Lz9MGl)d}=7v(A?c9v&E9SAF#Ehn35x%-#PY+O!yT zx4yOR>A(<0ceM!SXZ#&aGGke1_*8u7wvmag zY0u9}%Q>#2*v0yox08~lpl`(e%mBA$EQ-#Wm~=gaPTjR&{K*d4(@W9sUmPo#_;TQ} z7==GI=GPDWs{?*u&D|j-oiA6t3%zqvv;}N!>NC^Jyb5q==%(c9!+cZGQ@I1CEV75h zZ=JSbV)4NxjXp`iReKj<2MnDUb*Gz-C!RWr49)FWU^%6p+|Qr-sm^qLe?(~0yUD&U z;tw4wV4Yt*Y35R2(dIGMo~NpWo+cCkJgY!leM9L+5`}Vy57}pJ?msB$=7ymM&&VsZ z{{HIdi;qn&HWR0*7rr8T3Lcxh$_rAaijK33@;9vd7&SBAr>5Wr8cXZI-n#i^wun-C zQZ%;t;EB`P4L7=N=H_PJs75=03|_BR+Xh^Cab*0*s^McdSEtOde0f`V<;jG)C+h}6 zEzLZ5PYi6r&3ne!M<<^S_*A!W>=;UP>AUQ>s%+gPZOp|b`GvAhBkXcBpY^QKWuCS- z#J%kH7&7P+_0+PWzIi2Wi&9fzJVN7x(=QGR3zS2plv~|-;m)t#K>3`Ys7zNZ4(~t& zElN!RjpiNaj$U{q${!V;IkV_;a_zhF=|FF8LG{FefG1)b`{BnQ)#kn%81ti9fH|`5 zZ##2B>tMg3iyUp)Kv#_Ak1_dyyqSNycXm29uh{@r9h2^cq;Bb`Vun}#CU5FzJJK&y z>NBJUb9w6+R}dGqu;OOFvKYsgI~{9Ar3|D#&e5d39n&`6=MygL{{Gtb`Tel(`fbfy zDy~mlR2P-7^@LBt2Gj4K7i4Aek1oF1T)8qoqr40JSU!skxXZlw;gi!(959qLY#RL# zYQ+?O> zx)s%@o*(RLiTj&5FRXHx2>@=V--|D$H(EL0N{3Bu+T%5T?#eIER1XR@G4pS1LDR$T z4{Y9}Ir<@L@|bfU9_DVUTZ1=D@|yj9PuuoR`N;tL{m`lSX8rT?yY8*p26O|4PDbWo zPo2=sD4o1EaGz@oCwE)bclXx7j?ZY{#Kf`qby0b*(gaVxyq0Sg<>X{x(vxQ9+$dMC zY!h!|U5)*HW7tiZ6*K19h2rUVpGq?PcaokCN-Y0#dGK#}B77slxO#$M8S6_4D8%zy zxW?6dXXng@2M2EjRTPNMY0qa}wKUo;cD_6>9cSBWtpcg$*7jrqX!B_9&gR`DD=7md z_TYT6G25w?-+Brb{<{49Dcs6?K@jdPoLCpNbgHA69umI1SQ{`Bb84is z>Go**$J&Y((X+EMpO23(vu>_Gu-890mzlkD3M2I}0F={K-!jx6#a9lPHjjVuR#|dL zkmP>JpZnp-lAbOWW(qbmsPc-mykBiz+`L&qnmn(y30}(+7cT^aArCEUq}8;q$@q0} zRa!^nV$W84z@?R1S4q^>n@<=kQCSb#%Mj#P*TkXKn=8hi{n_nFhp;_|C`Fi+BV$rIV$;MS4O;7}@a#kZ+N&Q3t?NJ^euuAEy)ocKdgH^XrY`2x#SULW(zIFRhPC|$d2^(rHpByplPtWg>9Uq{5R>YlhKmPMQ zZ!lQ*SkFB!j<^SYeiG&WJl%U*y-(idAA7QFpH9thy|G7elzkv)NDOKF%2j`K@R**~ zTYt{X{oNfjYSi@bsq{Vdvwr`%`uA7=!GC{^H=3S$vk;48e|{j^TmB4*{q+S|bVzn9 zY+~5zl+PQ|ZYW*#sOX=tDN4y=f_xU7tOg{+10!;_=9_8 zhZ)q9C`kt#A*C8K%^B7;L&>15c_i(Bc`iYEU}J;Alddia>u#FMJtgLa44>lk3aOq~ zAg{pCGEyd8B1l6mZ&3BC+pBW!?b@?v+xqOdn3u~Qw;qwcx%%gkxOC8*KiA(6y_frW z6aDqlpul|G{V_xLGt%wupDRuIBg4A-B!~SB`qPCy5%~1-FSGZ=`W3j~jK+yR??&a{ zI76A{E|+(Go2jnPfS>woE`ol0w<1pVDcuJMM$*4OwXd#>RaVh)hpmd=?4R%M9bVbg zbnHpK=UBb7>zl@PX8qg5#y$Cq=Ug?VIjeqrX*nQRNH2%h{xq+M`+Y7Y;03hj=cnm8 zjJ?nH%-Ax-{lxsSR@CwS!6eUuoUrWatMs!MIac>!sKx>P+^xxBzrB$!T%mJ$b4O-A zU1xij3iQfcC9UzZ_Z-OE^=JL6gPwCA^ED~y4W(ygx6aC*j|g6N@pem5-qH(m_@|ez z)#;*|pL-|n_#PFR>^XB*aCP35AseQOyae!)H>iQuwjmp5`Ld>D&$$}Imbkj{jO9Mw zYjb8%S*-D3Plv01RoqfsA~<&=>H)T_`bgv7tZR2a6r7DIKELYOrSF$XGzzBKtNC2d z(V%%JkC0kR&rI_!yJ|0!XiNQXpt4A0+x0IwYWxxJMWIs{hW(v2W^7<(ck>Ymy1*nlEz_3f9C5|K$-vy`UniD~oy`D4nq7sV@f+U7ied6ew8XpO&j zs&?JDiZkewXO{N1bUQ&xT3q$w>#{pLir&90*wU2Fnqz8x)146(b7}QW(COUlKS-dR zxUJSO>&G|<=&|Xr*0`kX$z6--{+v?7D<@-!A?K#9XVgK2is!9`3m^ z(DU7Qy`?d}R5z=Exl{SsQQXwd8l5axw7l#ed%xyf-Q!zr&6PlRQo-7}C1)aT$JB%o zF&l}~ibnqZ_3H1Tt;QFFB&9oA&tw`Pgse*A!q)a#^Fyajt_xkibDm21;YZEk$>v*A zFC=;+hR22`fw;@sFzNZ3)BRJh2_vd7gZQUBgDyP2%KLe5^#V`&mF~B?aFN&ev|lYP z>n0Vv8SOLG`Ep9bPtV`=Bf;IR4Y8##Q>)k>+tqjGkk$9kq_o!_dw9li>TSg&gx+_W zi^PF8?a8^7v~OYV!?ge|=9pH{GiC$szE=KWqu_kw&1ZF+a-{Yh{TaE#b2*&qVjVvp zCcD|M(Ddr1&urD0tPJ9v^*8GDTW(PA|DD`;Yh>Ch-UqR<0m^lbrPO znCWs)M|)ld)OI{>{Q*IqBm<&Y=aNlQ-mcc*GunzjmbEVe%0pYd*WtR&!HUwO1EzT? zD8~q^hm0F9@)W*X>HRTuNeLM?L31O6?oZoYeYN!_B58VfWNbvhsl&E+2l-XLn-qPS zxmfSU@$=H(oV_(I&E|_J>3?G1vb8nf!zr{JT)%72P*Gp^DG{`mN9zVsTkk^WHC+me zx%v9+tpq;=V$g$=zf+0pGo$wWYN<<_zjaN?jHop`cEDPL$PL2d{oAthrvLrZd3E&k z@SA_n?Dcq;ru*%w?+f?}dw39+w|!J_@uWE)7Tnz%I`~9P z@!Rq9qP7N5(+^0>GF!XfB~+jLR2DmPUEI)`8>)WDwBWu+`-;A_DQ^&t65ZYIJ?!9*-RXWehhul$+FCv=^;=WgGhy(GD0)bEUDT>!c~^dh%;g=A_k90Iy)F7sbN0>Drqh?}D=*0QJ;yBY&bOO#8Jnhujy`;6 z$M$vi7BJ&$HPRJF+iu4`2>RXe@NZW|YSjC4+H({Tv~d2jzL`}?lb~;|uZC2iu1=mO zSP)+}X-jPrto4k0bVDZ9KXbN!V0QW4-L`MfbW3}Z7dabz3$-)$Tj%`Ow*XJsZCgmS z?+03O&m{+YipawP?tZw9RwcTHBeGSA-!}<`eBIW5KH-0R3S9M%^H#KU=C>69mE5|s zvcPNd^S6DIx77@owrxuHo$2wpGIn$RX7=4Z8KcVF?Mm6bEVOl`2eT_ryt%FU&dmAf zsgp1z=SuI=GT#&&K3sIh+`!g9&DnkcV3$B{ZHzo^Kk1@B3VcWy7nXhq#^*AE5d zqsIhpn_BkzdKqp=!mV`!E31L+9y)Zm63W`WJz?8=#N5#+^J`m@FTCHaLzdsB+>|FFiDSMuafgR!HfJ0$Y_Dr2$?WCkwb^zZ5dopZ;6@q>%Y z;wNVNM0`p{Z}~YBJJx5xvUPWM@z%YNrdOZmZ;hXac>Q(NSInKK_Cv+c z4gRA?-c!Xk+a89!yxbE0{?&=~uhJmSuXBfPZ0cEgg}V$^CjT-sS;dePbi4o7+c{AG zfGXlsujbd*B83dMi}&~KH_6p&SP*UE>1P*APS(}N(c#WXo{*lDln?d`M6ZFLGT!U5 zGCp^yk&pAl+q93g4e^stm+y6+Cp>LC++cr#KOa+ia`%%Gir--@@&1x`3Fn+^t0b+| zgSP&&7JhH&aN=i(JYS10unHXXiphSWS?oB5POH`JTIdqv@>?|LT$)Zy29FQxG~devMZdr#%NWI>;*@ zcQ6R7={tAF!oh?sPc$8ir*4`}mKe8^p#!e|{X+!Or@HL*1(x;`M{SMY+XnBGzX1|% zd@f^TD%P%?u3wGt z1^bF9mA9|0b5qZ(TsvV*-KpoJIzBucxlNrAGTGUp>9Sq8vh>2ACqbHb;*bIyREYP*Gj*$TWX%EqSDj*k6Wv#L`d42XaQG$ef_j9 zVUgp;_qtk){+N2S_{_7a*w3g~m`jA)edtN!cQ3Sb$U*+YAZU2txP@Mi9vz`S3J``x(mRE%N7;w-NA-JwB?dcN z?sWuPh6f9mDX!e_D0o+al>7qt0{rhtAD!( z|NP;b81w68s*ao{d&36C>q@H%=olzk@nH?nKM-(`qUQuI_Ahk!rY6KN+a7?(^hs?qKs^#ptc6Zb0q3>(HjDD)F{+T|<=kL!?c>_+3B$`ei@p}JlPJq&Q zazN_gQ%heFPU&=ajtqT18_Zxb@fVDHfxLRehq6Otn|Z~r!2q%k+xV#D5W;h*eDV-~ z|GQ;5c=7G#gTLdYcb=U6cCqA5Mbm8WE$o67J$JIdcSp=R=W4L}&t`1beJGFBcad)F z-1gw+%*|0v)rbU)d*o5uW+d=3czjDM>vHjuAwg>sh7ITlux94WpwhpVj4a5dt*_GO zej++h8vFb2`dJxQHw@|NDNA-WZBO|2NU&n)GiLa&L8nhFuUuHM`h9iZs}@mp!^$s5 z7q?t|@$TH_wn?LsKHPs=d_znc8J)k>!?4+pS5NRPQ3i&tEpAb7?C9{GGf2B_)0*{BlUBU+e(p7{ z|Lc(3AF2c1Y`v2Ri+wj=xM6eioy{RG+PFu}>P@MyMNQ7x3%`9?NPLj1Tk-i--e|_} zl`EDOUL5Ou@o2(@7mo+Pwaez*ueeg}htJuuo$+Qz!@T#}39}ANjy*u~8|+Ei#sQ8Yn2fW(sm2~K1rGA z`$;>{ZxGOEzqHBpZRL=cZxmZrZY`Wy_GvVGN&S1by~}C}YP~mQZ*9SxiE!=QeX(NB zX4!-H&-Wlkk9=7^gX&)ac+L9ro#C5ifB$%W^5~his>Y31t4&#^%Pqg!QdWe8Pn^Bj zc_k1tB*a*97MuVwd%f*nj?0#wJfP^n4ECeKbt}HK2M-LS-i7L(97@zT z;m{{HZL`dnz31E&{p(+#ZhQWYLDf444r{xjd-Sm{jhYePrl3@=+O;9^<^4$8GcT(t z`b#;n_v;a_vf{3^BmO^@Y(JceI_}f5d-LYt0LI?FTQ+XgS4qcB+#2hf9s=Z25t|Eu z*BZOp+S5;&a(=+!iiEwzmjEGK1jpwFVW7(3vd}MI@67T!m0)Wgw^_C0&SS@w71wvd zk8cqqmJXwx&duE{F-&-6T=?tGiYNK;P;8 zQz&$F7J*lgUNu^?c@zYn*ViV6VVf5nw`{`V?R zFH+htDs>Fd4DuuV~y7wwPz9go@k9`BdF7V`9f zmwiAWl_M#5w!!;Bhx~=G5|E{vYeEviwji z{&vZ$0#)1ueZNpD(1E;GU$mzh54=AD8J^iQf)PXE2kU5o6Mc6-@;aSby?qpIH{@YU z^vbD)N_ys5`v37YUcWu&@VQBQZXd*N8N9s^6!CKMYKL^pr>33@ zi8X$q$SF=~&iJ}}qe^#tl>W(CiqVpfx`5&c|8Y+1MCk0k%U9VaWEDyL{7H{@47?xq z%hd6?dsCJw_{j2c@?(~Vv#rxTJMDQp-v+=NyISL_Pc6+2UN@;b<{e!3W8n>EGO^sN zdE<`qMSI;|5AU|bJc=&wzxIqDl`=ffMaxQkJPdfNUPI`36UJnv1o%!(Y<;-$0PlP=frPOw6-OXdOxHcak}Wo+@W~~8-D-!HN9&XVZyk>x29(&44!t0 z*%qe`J{u1EY<+Hk1OHp2YKzpXd2aex*@8O_-_rUYys$o|c|;p=`WNg8{+_isQS@LfL1d*Raaqv=aw>(MnEf^vsj9x!IgeY>k~r@nQ!zUgXhd>`(a z^76^0ijntUIGw;Z9R~-5r}l{-Y*p>Pv4s$rb~&!AVd?hON9uwvG#<;{hyV4Xb6D$v zI(j;}gw%aQ+J}?ktw%IRC4*&aY*yEE=Hw~YRcq=@b5p(Ht zekDkP37O_@8r}LNQLwc;q%ZuU^-~-uAD5T=;?1bMK--7U{1Y22dscT5T(e%oHTwec z2H!TXYARawqqdCOl$ zC~Xt^Y4pTST+LG1X4uf}64%7C*GZ-Q+%r?S2Q$Ot1_e73np#mZc>axU(~TP!2QA|s z=$Ip|Iq2`$wYYzB^6sSQPlZ{B&&pIex=u#eefDgTG;`?%<@_U|rf1$L;rbJ!LZ~l_ zRbCc_W%YWMnaKq+2Ds8-&{(aW@qN)$|VW#T+17|b$Z9V>I?(J1ezBbpE z3T*9%-aS75v!u&!|7~{bbiYSs!`7@Bq#tO`Zpt<=l=SMqg3M=P{;^cFw_g^V$ z*jC5osEUI7S2l{hRju0tJn26>+*|^-Q@Ue5k8d?+OqNSh3z>@KcN6i~Ch`b}Lww4L zYM`&HzHK^i&0Hv~m{;wU`1Z(*2|~f9?xFC!B1)Sj>%ouq+e!Pd*!+&`gR|dkTfB$z zch!$6n`f5A-&v5~^m54A+q;9${$5#JIt2=R=hWT)PF8b>{I2TpXql>^;m4PzFxZjZ zeuqyC8xwaYEP;|Pe3%>at9T==y0Np|XYd2yd&j>ScUP25+&PcGfsXUel77>jJ4D(H z&l~V7bKlqWu!2GNUfp6gyneSrTDR}A>)mBT*Z2RAt9K5pD`@+*+s0~a8;xyy2Mrpd zK^v#B(b(FtZQFJlqp@vU-|BPD`QGQ8{@tc~PiD=!=br0#jRiv`{Q`@v8k*$oIkgq^ z7mc)KWh4p^B5FFi5aA6tdV>dmI(`Ua9saN>GC+gV480)fJ?)>$^b$GWB)3^mhX^%@ zH^C7Ym07oM}8XQOTzxKSaX}irC3@?p%?yuTg6BFSOF&tiRC*dM$D6#WY1w= zfMqu<+D|cy_;U_cVvQfh$5>{9g4!YS8cs>ar1+74uO}7=V8_}mycF3bJ{=>h1j#~0x9f;ZF z7yd~z)?nm9YSPT2CHfgSc7$3ts+-dlxExQ~LjuN^U_B-ONq{erVCQb+|Gp0(MXES@ z4~i{Y50F5;HmC%*E{KV#IqhtUTkOSo&@pLYniL?^>dc!b>1A@)7iwh7*H$K{j2AyFD10KANK?UBhlU zi4qqXaW_#2w3c-Iv0Wg^L6U}(ML-8RCF6sML%6^F&qm1wEDQ4pJPvq^`HJ`k?8=4U zWo>qB33l0TY-r6CK5tS0LSmBS7UNi?R?=m&I1XLoe4VuGKj=5;(5H~Ya!VK`ix|HU z2+Wm~G=J3h;j#9~4&ie$4qVck&-#c(NiW$Px*H%I8bgd8Pq|KI6LFjulI{8=;uFbY zB>8X&A5VYz7G}a2^NihKB6E)ea$#r}z|doM34edwC%!pdp09jatXwxbm@9>0O@f6+ z9;K?Ku~yE=+<<{kHP!ois!MJ6LKRDMc1Q%0-w|<5=(%TdJP<(UtI3j~BI zl$IFj+eHj-q?RdIgc^Cp`u2d0ExK|J2!A4@{gd)In$BytgI{NzE(sbH1{n&WNez&AwyR{CW&ZwNJKbqfBv{Pn(VVKtS0Pf-y$X zP$?df0LZ>@Jh}}(^dpYF6t@sNS=Jc#>Idr0x4r$$snZyuhZp;DZr0;qq%$t*0sTJ+ zAwBc@-Z8mX%iVtZ8y(L}L$?%-VF?Ukw_hrUrkMAe34YPBb^zpn9mBA4=^g_`RB6=^ z7}im>>_gb%PU2tAXMWtW`#j>7ZTU9B4lS*mk%38pq`uU=pv5b^y%(juG%4m!t`8Te zD~{@*$Fx3|(?D!n`SQ|NNbm#nABH?xN(6}+?co#?-IkjHBrYBD)15?mxJO_W{#L3w zZuj1GFaGtHJ&F&E5ssc(O`dCBM0Tv1nHi3dS6e5vdMf8B^Vy}#<>%T+g25j1IqBlI zIp4VH>Ag};=lle8pyC8)3Fzm4dhx61fcx?fe=FToPG_KljO!9pB6T-w&`ujxHaCZd zM#9^x6uH^(^JI27AVF2FTBsK-cS}dh1t$xF-Sh(9YIg)Q$P5}&P-V8oL<8*9dW{H^ zY_|st`r*rqj>w}ByMmR(P|>$Be#tv!tj z5vPoNmJl0@HqvDT!}9w2T^@IDuLy3o!tq&@5nRK5Ea(*6xLP~b__`+Gkm2oyV}V6E zc+M_nNG2-Iu$C7(Jh6$q9*DfV*MagcSVjcthsVt~d^iP7;!VhLco2@>$n==8F z_s5AKI|ain*_Fix`HBomynXr|_q|cv<_a2q5XMmv03G?eP37W_>Cp4B3?Esci|Muz zrtC{E7fp7~ci@Tb+L43G1SI4D_KVg^A(<8XzVR1R=x?C=>vX;r0SqBL6@UqHWVr6F zH+3jj9pd+10Ea%R(grSw=(A8D0OrC)NTe5;EBR(DcQY0(T+?8;D~m|PzwiztHc`Jb z5aETC-|GhyAbozW;XH$XD^`7dAX-7K6xY{@mOTtydi#F_@?IaJDt>lD=E!Di@Se@9D5EBp+sH$4}!<2zpz6my1@ZSf*5&Ox?RAUXdGA#b?7 ziFtF(so%kh8lh?osUbNSaKFrRRS=Pu@|rT&=+bB^kGyFB9Wl2ayo;yTmM9#Y+y@ETg*M!lh{F4 zrI%?U5pICBTAx&l)cYrbo`pDK`gq;*KK;h|^>4Y$&f2qw`A^jra$EZ_kA^{s^H}`C z@wEO?+}g{R>*Jl24lybN;qx;uOcp@|vDcgE@w5RZ;Mn(5QBdchIBOCC57HBmyxBY~ ztk223`CX<_jXS?)lkP8ZNcVf)>(w#RIOIM!N)d<(X!&e&S`qbZ$5Le}Kh`Yn(X&AQ z+8G*s!PjfFd8Ard%Yh@y4kN+fHwiH=mfalz8x^@O*J&ARMamU4jy(*_*do7_WTHP< z!%31ru$ZkpIQ0!qh}N6OzrMnbYUW@EHoM*AT{XSGF=}*pe9XyB-&!0QvN1SWkmG1e z>$ylW`P*=M>V?*3c>9yxe1X{%ha~fQXE=6i%567Z{pG9W;uRLK{V|u{=}V?1%uuhn z*-cyzrA{}f;Xi9RHVDV%`iwb}7~`B?tp~Op&*XK4?hTCSe}7$n_X!1`F0F=05gn4q zMx+!nO{-sr6BVX~*#y1ov)@7j6;5av-dc0#`+)Pgb+3?=w{mS!63N%2tD~l3(7ea3 zWWeSw0;i)ACoG0ZP2WmRu9UY(p@P8Wsx!Q+L1zHvVnPu67s^%$-^GnwI566LjS3aF|9!{f7&fns9-cc zy0}oiy>55BH@5u!ZsoDa%N3IpG%A&Chg(g?VxXa;r4@)Vb=$OZq5L*xW18(!Ue`^mKGsgNSDoYe%^aLUnRewES+XnFAjb>;^_i;AimKPfG~l6IXQO`PDT!;)H~C!g5xEL z8pRzL45r70HQP8QZ@iGoAcof@qk=&u65bz=dg!&{b0QAj^n=M(&cE6(-mG3V$@IkX zgGRb?U;10Q9@=_tO@43mrs_ZF2Zvr@)C(=o>oHq&c(4{Wy_rJL$w)XJ;RkG~33Xcq zeHDdXRma<(&px}HTwWGwRHXS=nsb}_QWh5%16W+o&Ee8de=p0mCunm$U35+h3d7uF z@&o@r@%1$2O1rFl6KDcuGX<1}XDcq=%ZT>`JaN~#b?eL2HD?_J3~v5F03^WmdhfB) z_35zOWy9yW?yG=(p1%}brSb+MW3$kgnz)JTSHt648r^p25)R9x39Q*40U^R7gJN*} z7<;Bg4WVB&x2y$vJ8(p=uKrXSPG)t055~#qO2`1PH6%lTSRw*XJ$T;#*2U}nRnc;_ z1@2D*1B6(HOBLsIAkxHE!?G5vNEVkbUsqX}7z9}obvO5yVC3bs`eSm3b3vTWS0{17 z3a3*BoY`{fv(9%t)e_auSV5TH@8`cP*V>3c3G|oi`oBso<_(lhhBvEz7T02!kE5}+ z1xIDl46sE33!35W(O6UV_^mWgVkn}%XPR^=)bky2--cIu7m6s6=W}F#QMH&-i$hr@ zG+L%^sg#)S?k$-8vh?T1Po(`R<`D&6e(IV${Mqxi>ugxZ0|R3Y^V#lTRPw13d3)7j z4UyS#)}&PX6YdP}Cn$OiW-+G=*D9i^BwKWpU7OJE5#J7<;Y-&``qhO8C*X+tgHtM! z6Pp+h?W{q-V6O+hfC(+;XovyquJ*6?_#gCNREvH?f#$bcmga}rvV6+^IPWLaiW>@V z`aNFHlaU(Kd8bqdn@)InPL&Op)2Q>RwOLC=dH^RM=#>5}7vIzK_r_9WV80v8YO;d! zg>Pkz&NTJb6SBei-;-ub=MfYQXM8x9v`+c4eBi1448y{ z8pdli?`g|$a3LDab{!7QcDq_h%s*JIOWghZFMxQM0tOlF^4M53(2XHuu?>B{)N1rX z5qQ3neAPbAk}K9olG8g`YbXAbNbTd8ZD?pHPLwX5GB_|+xz(ao|GhdDfEUu4YVyh@ zn7m%EnGnzT5P@;c=@jZS+_;!BUCSe)Q>Q_QoeQshPwVgSgn99tRxC)gy4<2DcldD4 zo3Dq}d6izs4{}ZK-E{F0nmiOeu<6wb|CmrNQ}Tv1SGju zSm@21nZ}JnT3h1CotjyrZ~A!YGdPA7lSFZ0(DIw@6SH+&z2Q)^uzL(^Wd;3N%=oyB zQYGb5_#l|9J)y(`Z$1|z->=Llg_o3Tb37XEts)-sp>PJtBfcr;+f~*YulRWF_H(hA zensw#;kI5OxH(_fy<$r`7yH4EACk06$2Wq2UD4$WmAvUq`!f z3=@+~(f-SI{V|<|v+bs*6Zndm*C_@#rwB~^e%jW}O7N@7@NS>r{tpY_^?HFUl=G|6 z3pg9k)%o>@xiK$~(&hd2b)iP0bi2-M=1bAH(gJ^m=`T_}aq1Ij%cQpU&HN90slTQQ zCs4etwJXxE(uMi=CNcwnY@dwF7dW(id@j>)9#D2e;W&cgzaW^dB?o`ty64>v-RwCZ z%J|i8ul+3OYbAmOKhOYxOTp;hPznvF@1GD>4NnlS{1OR8HB~#V>@>Z}p2MzbGWMXT zpwK&>-Wn4Z7wp-g#l_RD-e|2NmyQ?33*@4pVbMEj&xCD1vXJ*DX$j;exNvGHaO5^|}2;c4_KyoEk{!0PjH9 z?tb6Z;rX0b&S|w|)a@${*9lSt&G7$J`(l`m(Kc!43iRl?ZjLy*etoF-|61p5Q;ifBn^F)D$fo(4()CSSH*wknytc4u{xJR6+>EFZ{hwfaO>ppYK1 z?mchEYR7waItvji87_J_{UaKDh9(BKn|||1L4k*_eeEFw0WF8XsqMks@%nm+{wTDu zm3r#S*<+2<*DVq)t}(q0A5X63axy8elLa$+y|zzZ)Ttf?e*3sYr$ykhp(8t)hLJ)H z8qG5@DE>TK`DXezC)s6(hF%HBIHW(IRJFoEPq!}TjvkkV$CDQdpUZlnOf#ezi{VVr zg<=4S2r-O776WrtFN#K$bvEw$d8K&>6gSN=lCmyM3FB?Co_&Q(}HQ9%n?`&sTaw0cj=w)#2u7+(462P56Ay zgbJMDw9?$p_WMuN)4z@3~tV|BmQ+{%V%MfpG#i zWIBG&P+dL}MQOv%grFBzd%y25+;u;5Up;yW*&0rJo-U06SrG^zN{lwY?h=7hcjkb+ zqBnMJSg)N2ZkImPDkp`5Jb-RI)0O2*4D5X4jZEhg8US+bxiVW$P3OGmY?Ns-nnda<<;rs~SE5O>MjT!YmQG0E(Ldzyf*EIfXY*0!7QE@I-xABB{Icdt`6JEjx#k2j&xnQp-JN z%c$(A_cWd$WWgoBc|A9X%s1yw3{Yf5c_`p7*vNn(>N*|M8q%OH%qO$`%g=usCz-%$ z>4H12>m1?Yv~7qJh#g>Gp?Y)p7YbOA674_DJ393j+}4ZA+yK3y%WbC4Er^Q5D4{+e zrEpd$BDt9YjbtskJ-}eQY&EtK9ul~mkC`6;N9ML|v#^ui_3jo?{}TB_?{6gU{nmeM z8HRzI#TTt%e3}sFdN`ZTZmB>|wXz!Ner+;q>RmW2XDQkEae_H_1-=pwNx2~=VN+ye zQ8i5&jB(14mfXCh6eySSEi$fo%_XL28GJPKhZSz^O+ijO_5 znY3Ukouk_{t?UMr9BLgh`y69?1(+ZEPblkQD%^OSc!PF7dR9>O4{A(8?gBR=WC7Kc z+k6r1g&RmOf3RN3^ z>ij9p;~%_4Q%L0M74zr&^%A!_&fB1C51u?O5%MSoG>UI&L~Zp$mF?gQLHzxAo)5go zz$KgEV3jbu{K2-A*h0^x{Z9MO@PenoOPkHnW{gR9+mvfQ9(hqV@=+=ch8SiReYmx( zenFnWHX^!vGw@=}o-}DtnNM#t)7i?gK?Gw3M6oU=0e+yjorm-Xw(047DipxzYsbsV zkE;wjk6{3|-4&@k0=5YeA?QGWDC2(Dxm3+c0_YljchtBd3^dWHB#;^}MvTJ$oJxgC zY)NqaRDs~wagc09K*wi-TdwWi?80j;t*BYAjAsHYyNiH}v!4HB58&R^$bl z0FUl~??jR)a@+(tjb0)RAAv&P?vinP4D5AB;RGc)1BdS4s&FnSg_n}w$)4Yf@CU=2 zE%-mhLmrOpu|ZW>C^dvd!fTB#X>=vu4r#ofSjy7r6f@dbhlu94oj3h-{J~fLz^RUi zj7Ayw%!`|FysiQ3nZECsHuu<%@b3T;8-&Efwqk*jw)+ROQmGBnT}5Nlnb(01@fT-a$$530Dy zk#OCpOmTMei)fcqIV`Y%R*Vl&t7FQaH9<6TSccXia!rG0Vvg)&h)ox+UHhv1;L1=r z?Ds6&?otY}5~HgKtj??%B!tqZJ{OaUeHzyJB%eG^DS6$@Ml0?3gJc?mbmw=UB-fk6 z`BJlev9yAH$Pu;}LP$JI-PZ{*S?AW63@~&C({{I$nRJXxaF9IP)wL{MJ|pqg~M9O+=BdY*T6z>=|%RK_LaN+_<>s3*tPFyOwk|KFFPr&s$bGme1e8 zdlVie{lKzOz&@vI*VOrv^ZhU%2SNSM<8eQQtL)N?@mqqP5iQ2I|xaAFy} zozrtJ3VHM?T@9FoZqD&ty-;{fpaV`HzIQX)LqpXha*u2VCpUPSP+;G7xrg=mDzto`sp`6r-_gc zrEAj9Soq>ptDV8e(gS9V#irI0+y+;rz?@I3Nh~Sc-JbW31EH7*n>OO4482fMVg27$ zZA@G?P$_xF@NEvldT}^yP~P62rHcOmdJ_cYuzn0P(Yl$lL?$ZD&BsF`E}a#5MNlH4 zHJ%|xZWc>LY2DPaXc~^2c$rIjJjGXOe>E57d$g$}c=jfs5(({KA?+Tq*lM(`2zCx@ zy|s=KO4j+sHp#v1IB=P(G*Z1&YxA*kdUVbdIm;AalxTegC}b1%>H1FCf_x^tQ5%e$t5Rz2wEkzpeXDa;%V;*PogL+ zAlJ>?PY&uQE4Yz1wa?9xbkf^Hc>W`Z0#We=EFBmxLsKB7y-np7esFp@hK!{YzpYmqEqEE;i*ujRO1{U_5htBiTj9&0bB!tc{B;>6fw4O_n zZTaA%>VdJ?Xr$6paeQrI^kK!_0#RVzvI|5i@pmPQt#b!`_^K!b*}uzRm`)yp8`&4w z#RAt-<(e%5J12qPU&F33UgOKJX~f_*j2t8aZMS$Lj|&l{93$4-tKH+ty9~bmp#1X- zc$q8LgtwP##qh|?-|3a@RPq8B!cuZ++)y!UsW=?UeQ_K*h#8cETr4E6S>5HRq-;$p zqaK7~(RqDb6T{K`^pVJLW!4mU5oEdD{VzDAlx4XX-8S7r*B3|uE(b;=(B)BeHB1!! zDcM7Wo+B6*dAwEf>CA_AyC=x)sx>NSe-RZTNWQjAQcN&pKtvL^b6wf5Aql0&#YVRr z##4APt|?x_Lh{vhSlokOKZ(i)5&KA(mL>QP62<3t53!8fV_IUn^m7(VU zcD4_rJ~l_i)Cm69p^Bb%H;JwGz8h~NO(Nkn2WB(s z>EV;|z;yEqKY2P#Q;4t{iko@_jsED4D5O|dkbqF*Bdae?}Z;r)xTYs*)e)+OLR0vyd8unp>xRkU68ar>aTQp0ZPE9hs@?* zkGGJR1KfL0C?fDg7Ls0PMiwgs!{<+&g1K*=S@+BrxOOd)=k7EM0d@*{m#trqDdW6~ z?L)EuB}EwH@br`d+<$Pr@M=C?_rX~zr1@#7n_vD7r8f)4ymbNigsodc<#yUf*aMj( zM(iH}Dz*ng`dj6VPFr0*QMLz@g>N}A6w>l3?2^Dnz(#C!3CtBOLJGg99b8vMrJF&# zcm|HL8}=3*vmaVP{|h4vKskj~_Va}<_Yqbi77DAjQV4bCa|H3FY6<>cT-S>lY>07z z4P=~JvA?F-C8`_!}trTm48pv(uZ0YWY`GHnj@y#1;$^#;@5%p?BZp(s>dpUif3Z=@Qe< zPA@{dbyf9_bwGc%vep{qvA&;uXQxkOS$QmQKjP}PPKA7MPHl_rHjMG@A^nY@d-lQ? z^QCQaqWr87g{ByGawuO)IB~0BdU0__wKz!J_7hREV+O0zo3CUXAW+3x#B>pR{cwyov$&TF%8$VQyXl z!ZQDo57Pm#y{*xk&QIdgaKlL%0#$qc*e~M!(h0!bDwUdH^7cQo<#Y)Cc~cmP=h{=F z@rfw-{z*Fon&MSp>+w|Y>gFG5`E-#x7mzKPG@*CB4hLn{8 z*8y?}P>ID;=$|nj$trC&9Y8pX&wV!Ijx-!Tt(_Xm_uvZKDo{3H%;Nk!H(FDAjiHf9 z-D#jgiMr&Yw+S~3osDX{;goZ%AoY*f9j}3?@Z@GA4%)jnW$d0q*1RR0OAvBUnN5fWH7j9jk7V>BD7is zyd5(_p+1zL2L%2;E6%&3fQyyZYSj<|#ddT3MV#3wAxAOe^x+5?RReWcC}1u@6a@m3 zSRcbMK%e+g%s#vK{AL*@uw@EDwcY&NqXxFicO_Z3=o=eeuK}CZG=35OAOn{$Vq)qw z8gfmy-S+ea$BW-WJBrAQAOen@g=k8KmkMY`i^(c!Y*Z+s4&Jjsfsw!kZtAU^+`ihr zK3mzqz-T7zyw^XVZPhMbrxR`CC0)VT)eT*+KeqGa~^_gnmAh|Iune-U# z--{SLUZ^4-Og)<7H9ElS>MHRsfTI++sXMw=>jUtj0YusOmCceRA#Cr#85HEra5wZ& z2&sQU=vj3B`L))tSNY=SWfIn}nZzH`*SNs>?-@hC$E@RDDi#)Ky3^z5BRDj#p6RiV zc?C|aAFt%4rE&bQ^*vA<8#`*dIP4hzUKc$l$U%mq%~Cvq3tXo2fH6ar8L6 zX2ESNBd3Dr8*7ZJ;y;7$&^pd9Jp^(c@s%V*9aZB)!+`Z&KxkCOmtJ>pwY4ntieZJv zA^I-GyOF-y%51;DET`8%ZyJfZJi&;lIH3Zs+Pi&zD4+Ati@oj@=4vEq^zPl+6QJ7L z`W0wOys7psH=MG;^@fE+h*}~FfH=j{Bf_{Z5nL>=-e%t1t34hiJ+6j>T+W&!Y7*qI zYEh_k`$Tcmp&+$&^=M!rOZ(BJLuYjuFp5AP{g?t;y`0+Me_Lv7O7?q+U-X}J+otqn5p#GO|6N+^uiQg6L13r}^5iJoV15?5!3lb;yc~uKeGP>S5c#+Y~k!C3p^a; z-m}>68MeJ#*^7QU)D5lEigT7>ko>>Iv>##p(@lz*doNTUbT74#vB_T)q=czKH~+xP zp2clL)!?Vw`S)ziTIh$P(q9`+?g5Be_2-FRGCrKBaH;-}gg2{+%w`x&iRq=@RHmsP?&$E13WpRV!%3P)NtYbmSNz!Zm4m{PB77u{l0Q^Mh2;bkObz0c_0JW5cyvp z7c<8#_kYyFUHzi}))bLBU?5lfQ_Q>1wRHxzm0^2lq=YNg69CTe#sQm^RXRZ~xK8ss z2Md8B?G|R`xBvHNY=Fr@bT4Oy^7R|{?F&GEq|y%Eg@)F^#X~QhK0hyyj6t3pgyCAX z$Q}~}#&FVT``LOF@n3T6&A@-lhOhr7W{^##O)81R;`-LV(_5hGi?i3QFaMtpEbQ{H zMO{o{?h@2sIRJ1l@Dnj~KJAQ-u8y;9*A-zoUf8hv`8a{VAu*+mQnA#3d60oesVQ$r zIh(8y?~4+w4xPCR0XqfdR+&*@?Ph#eaQer~kaOgYhy_py7Q^P`(%!SB-yBfA-lfWuJ>;ju98k@y;+wu) zn!avUC7m!QlYM73GnPRu2xF%?YWUy7XVd+krAepfqGJK@XsTEGm?PoqRdp+KjS%_x zMh20ABoq@mUQShB_7inYZ5*{Z;(K9zat9+f&Q;!n?i`=slmI94_mE(5V~X#r$ruLk zxz(z=|685z)Ar9iT+Cgx`P%S{SmEUX;>f{`{XDqz3p}BZ{{311aHbdi|U zr0vsG6xx)tQXe1)qv|IS)K$3N9#ASfFEKXV*kjDn{j;IVx{-u+8nIUMnvoV+Woolh zOYMI>`#xd+iW1kp%uVM^foAyI=g-<47 z8uPa&1G=Q0OtfoPVbB6bZL_0PvU{r@IKk{WtRklyfiI1JCua(ErX?l)I9IAJmB^?& z?tZl;zEX2+A}b3Im~kTj^>U8cOo3)bHur63a6!De+J7dTKjwe-8BREQBE9WB=1%@1 zCOkwx%yk0(;IY$u{e`JXr&V*)U+HeMF|RneQPPUQu5h%45cWar!s~6@eFeu6nQZK* zIG<&3WTdE^9LC8M=K|SSaQKV&T?GVxXvrxeMzX;FVF5B$jkTS)pn`*Ef9GhRJc>(H zU4GH6@|nhnrjsxiEuw3u%W<&$9dKTog+c2}Mkw(S>LcZEl6D!H3iBd1);Z<0FX=#AfoC40uxYJi`dNfH!B=W@IAW#+bJ{AAb z7OJhO(J?;kh9P!{@VWDyBF%Bk*4@wH@cAt)O!5`ylM?WPI1HrTagK3hp(X9yCP!oC zcO0HBTwWLPeUv2a4l4r{4Xs(ObrPsaNyIs=KR$m8m^5QeG z=M5?#lnyE@v%mq!3deH`b_IZaY8HM566^s}ID<=#TICvmDcK@uNm`~Ef~kELp2OmA zA9bdO&(WMp+Z`JpAB-Q&{hqX?Tm{`Hxp(AumKccGIq^XsKlJzT%-> zIt3J1SV+iEB_t$6;Hav-KkaTkX*vUg%3JL9C|_m02A`=BiDt<`nho@FZ+G8FyH$=2 zzZUB;cDHh!NthB!CT-t@Q&3WBpb!(o_;qi9Hy@V+UZ3v)`T+_EXJSMW@Py3k6Nm0+ zo(EHBS_T6ya^D#L_m@Jfr+aUxnS%B(c+3$NJEaO89z*z3Tc51AzJk8)$wU zEL8IWUYX$5vle{7C?@{;gfs<|TnnA=D5XXt;hGE0$0h`8t%)%u*ZWL{J3|gYo|GHF zn}~36JB=2qVz`~pe2-rN1jlHjYYk8aCKqX3Qc2boz24kxCNUe(H&`zEA`89Xm`r3y zJ>Qj2*8I>0KE?0bh|h0J+Cnf$cs`uznS+PqQWwwXK`aiY-f68KxW5pIL#J}7v*eN~ z)R1F1iOkUahu7n&#fb)to)>%2wv5+ntsYxd?E>U2DLnklAeAdOLdAh zbZ$N6v!oO*vZT06ZqmMqwuV9_3-8F))w~*8;nH&KhVde(vl!wDV|qkfaWUOTkGY?128Qa#M`-D`kBFEsPj zrj2xSM*`z(V7rjV!-ua=OhLWfZ~6C~&(`F?(+80|^_!5dVY~f4;rrFjRCw1^Q^*D| znNdBT3k-IKR8@dk%uEfA!Vn11KL3-=7Rr1e){y$NBB~Vpe zZhq)^Gv~P@<_jnFbTgW-SigAKzSZqNYuff|yPqOZEmnn6p&IMk85UbKvH1HEtW|H$ zy2b8#rJclWOX2Q)x)gEp`m00JM&eC2Ii*gR96*>#J4wnzz6QE(B*sc>d)LcP_wzlwDGVk>N7^KSW9ZxYL| zY?Z>l59{x0S+?75MJhoQuHxcmzzmG~0KYGyKVQMENJ4^w0!tI}n*=10Rb00M8Xo=< z;#kZo(iy?&NXO)be2J7}GReq3!vM-jrRqHBnDAim~$hLKXXL1%M!RvVRAn zknZ)!bZTXz6js4gThpED(Y$sT)6e%}fH5ySKwK{P0TCxTkn~mg^0{IiAZZNp@^1qn zoEA=IVTxZhYxe-?Hq`V|l}+d6p0(6Mx>H@LUReTb7ucsWyWO1y6ranYR*AIh`wVRM z@tuzvzj`!lt0NNgeLl@J4{(38$0k?u&J>Cg!-ctg+E9(7i;tE{s5@DjHKoy_lDPE8 zVB)Q$ow5MlCM0gC!MrsX=C~Qr>k@yr)U>UQP%+0B~m~u1Ie}O zfG|A+V{m`AesLB=oF(-f*|fjbYV$C(E{&fQd8smxBl{TYvY);vSCg2)2@5D7P`zF* zsYg@qsqp0*tt-C|MYF4xXZW5m-HW?DeV^^Px2Au!gDQ}BM?kbd!?rGjkwrdE1;&I?tBMmb^UmC5uf#=^K<6QxW)c6VT%HUXJhie zwrmnEcOdN}LnWT57KiZJJism?%M6}D!03DvyzGK_uzAslla>Bjk{nzih4e^BY$Fr9 zIajO#^J~HrnWJQHzw#MQ1=o^4&68|&IrEpq>Km@TeTQ8+1 zT`bX1Q1#Vzyk5;%vs>KJxa)SlsU-2(qXB=IO~yU22zBetAvi4`KH2Xx8Y&TmwnQUV zfD#+ZMgeVLmB~b<>DmjfYN;BWfcxixfe8KT31AvTxu2JZAS6~+na&~$(VLuC0!~op z`HtB3x7&RI)1@2Ks8jnIhqv`Vj5Tq}&0tUFT~710*ndBjn0@w=6*H`|-cx?PAk zcx9)D(bF>YqNBAHHMhY#s9M1hQG@C}59{<1ZN8rS5 zXE`)h-+D*UT%=5-O$s(9|6~*!9H#=(j=H)(zwob~c1&@ORDs~DuH>%~-wmdp%Ah3U z4#(jk439=-8K&m@{BxiyI08!!P0BxLzF&}Ju|$nbVJhXE7bYi0jOzcdN4w@It3DZ~+zwvfJU%_#tkumF?$QtT{}x zpcLSB``4G19{~)`(_!UJkBkZWYE^PK8#!$?gQTsd#`uS@)@~P1wbY5Nb#pt0QlAs7 z!a5FAY0cJe+>uuu@Njy0x-uQNgQ<{Aq}`uN7lRixe#i+2)1xLe{; z)&!j);-phBitU8*Y?U2APnn;oYK^R&r!BltT=N8HNV#+`cT;Yxocc9^LgHWbzrpm$ zm%f>_pkd|DIvhBb@?HSM?uD3lHpuc#&v}ZUMmzM z9FLn>tS|kpvGG30aUiy?P2^wyhDLr#Mv)4WX4TiR;pvB}MuA z>0>_e9_>^iSR*J2#?eIJXb8N-+9n;lK0FM5&Y%RZMx^pZCG(dp)#0WGM$uGhHGPEi zl$^@j&v5aTxmd#kkI0c0y*v@}Ej-82b;s^Fe^c7*c>dOo)`XwYZzgs?%(T3D{SA8w5HxT7UiBF0I7M{P%4)p&_i>Z`HyHgoqURuW$^njAc4AS0eS_u^3&< zD{wiEsNnQ!-O3F{<$uoEKNhRG&tZOqGk(QX3q(if7(fr@h3M{G_kx;{Wd8AbYErc? zrKL|^F7&ohs=7WL+;3Q2)i-HtYkShIr>s2fsH;>Wpg({!((rJf#q_GYmDV%hbhRUs zmzT#3kmJ^+5pK6cUAoTSoITb5bk@cngcXq!`xKFb%v&}k?5;EwS=+7?8Jj7bgw9w0 zz{XJ5!gMGWf6EPAu)oMUCZH4AN_V!gh{vFyrj$s7WWu=O^P-JLto*TDL7#~zAQRO% z(2ZsiO}U1+IuGrsnZf7$F;_C87oe#90fHS5fL;xii1VdmDJ*gd7dZjy90#~iN#gy@ z%;jo$k48P4z;F@z>7{V-ipi#>S-@rk7Dz>6Ha9mT;yj_2>$P(ZL=uKTBM}W?x9*V+ z+mX{H7NhcRh=WAPh0)rO!jQ8ZbTGM%>X}WAzH{O)Xffl_&LfwLxcd;B+)GyKTxLmJ zPqOLDpb1SJ&OUMo{ocBcOX`_(CW-rQ(HULbZKuoSCVBZ z1UfAYwa&ueu=ZxY*I-lR4{F~Px_HQmf7$Qwx_f5l(jr`yRLLtx4;j06Z$5r2n&c3I6 zEM_<&p@X){4(%Wb^Z}_jNT%6q5oqL2{VK6vlfXqRe*NaY{l@;0D@CRVF0kH^I-hm$ zkOm^$@%fysd#Cd=YXlHKP!`7-f9>|boyKMv_O!Df_8E-?Zk_^ocL|NoH+(Fm9BTC& zN{`JRsHk-jRj>69&#c18D?f^Wa;@7gE32BR8YkqwfrGiX&*-;b{D15CVsEnxW0(3- zDj&7jP)a+N#Ny1o?scVSePJJkEgu-Z6OE~c;7b2)CmKQ)aPv$p`Vnmv zp8V6cleNseTo_IgePJnHa(&Eih{V`yG?ETt$*X!bZ$8Jh{&Y8Sm z+FmM_W0z%c<}e#WS#RtTL)RJmpGB3URGmrKZpYf?j3>!dac1yOf_`G+@TwBi=<(E? zN70URn}}q>_@Y7ZOs_dhw|Rt7>Y^jBfc+#qsk)&q_>ML zGb$u~8f)#zv{rVYoi__&n;%~pI>_ov#b!)1;xhA4lu*l{03D^Gy9GgvrEt&*7lcca z6SOY6Mxv^v;lIOAM-DGcr?!}6|p!gW| z|LjY-P|EYZzTPd@0=FM&0n%gaX~F-Grmqf*>ifP{K|(qtB$NgjLXebZh#?ga1Zf6P zK)O@9Yk;8}1f)wEq#Gm@>F!24-^1tod;gg~cz9;+z31G0_FjAKwWNQ7?TJky7-TF2-FK1S)e)UhoOksH_a(up$zFWGPCS}Do-Rt(L z$lWysM4LZdDxN+IiePST6)MAduYF2a=MIAh*9AVc-l-Syky<5TyF^7nKNVM3Ckdhl zJ`CJd`+v!6-nWpum3aEv=CWd8rj=reNDM8rJHvi_#HS#_s_cDG`Mc+IFA-bNL{HJh z|F7a(U8St7diLSOj^UH)qP%+H-x_MqJJ#EP8|EnvT7-p#%*OK{yPmp}gQ=tby{E6AaeV=UEB?z5<8A5i zyc8MIApTl=Pj6Y`U853H2XkEP4}=t>f7MtIqVqYIX@$v_B}FHE^8RfmQ6xT`_RDVz zEB%hyhE@{S0H|BE(M67TrU`qMaR{wN<%aqzv3g*l{TmOO<|Bg9wm~C|R;U?o@LlKJ zB;YR@a)oSdZGV*+U;&MEs;8{L{@an=qMq{F+Kg9geD7gu)PhtS!>a1@C$$T$JuCSn zmBG97bOJ9KWa3T-F4R)_3s7kmR?V|eY2IE3YH>P|IXTDL2ByBTi%7)2KI+$UjB1wSL-iKFalL1052 zCqWd;q5k-*fM(wzVV^HH^=VoS-H;*Fu<tPKy2OpPJytF~Y5<5^jG>!X+# zE2ds*geeg>N@q8QZuXJA-7a4L*ZOhpPER!rD=Yfsq(D#Kpi~4m(1Q19j9T!wU3~eA z1fV!vj$d01;HMXdn2hwDV?6o+G(!t=P*zK4;s@GlH2BPD7zguMD)iUUHe|!RR$;r- zUIu)-$6w!-GHsT`z7-%VaDMew?u4dieQCK=q?<3Dt^4|7zkcs&)#V2QohP;=SrHHx zhIXQ(h8G$UZJq55Ez9jeY8CVZr0CNe61IFHD^bLeX@s3*_B&Wn=IwDwgf43RO-dSn z=O3=990wD8)Bc-^d+l&*dTnEpXWgo5Mk}Ef3C^?roi>;c={h1S;L2M(NFRUj9-Q{1 z{b@B?syirMXWM(eo~~*!&nm1&!$KX+KrnJZH2y$&9Z#Ll;%@{29h%X_k(Ew`hmv-1 z2U?6R{m+u8p@#SGl=c0k_GmRM#?IT&(<%lqrPI*LgORc>FzZC7Nvlciu?b7w+w4uf z)LLOt{g&~u#u5_qCQ|6|M$J8PY;=A-yXu7TzE#j)*fZyhSYTiPYPA4rgdr0q8&HR1 zgrLyO5I@}%P>Q>vZcOE&JJUB@oy`|2yc`;p-`K2yO*Q1iUeau}s<=F`FFiQy)-xDL z$ovaLhLf?xwc{Q(bpX(!Mb%`H`MrG3Kwv|wWPysh35}BSZ%J|KC+#uK4+8O?M*v&C zER#XEzcFvNRGE7by>LTz7l5|QXiZsvfY`9t2wfTs*q9hyI-y9ixAqSXb|xFmw`HOP za^9xe$i9s0$QbDB>*{z%RDRJtnDFZEi&{%lJ=Rj>n!6uQ{~yDpBFx%?HbsbSjlnJ& zB&7!9qt{GGQnh)OPXH%?MYbNdU693xRE1& zl20dwtn~DZ#Gle{W!;3sS6P;1y7U5HWo$oaoGIi^5}npAkY~wo4M8kKJBSF=oaQ(H zUlhuzYV$xKFkb#6SV1}Qh(v+W*F4h4IfVRIRglCZ?|kvEGVwuVI!#HKQ~h#yqvKH_ zGC0fzTg-!<5mau!vSnldWCFw2c)U&nVB@lT~2Y*n`9DW^%BmA>BjTZN*!rXU`JRB0*EtqU31G|~^@ zenlv085p|8)=>mpZte~*fh!Y}&FzkWv>(I-%W?0o3zg>O=YHj{IL-?r=m#INyUUy= z_7g;n9#ZG)q0{9x0(wBq6Z}G1MtN_!1O9iw-ar_%gCtv}+^-MU0q>QEQPGviq_O}E z6;%KE=EW+N!UpR9eDAN?FVkY^3Z9S0h7`UESbEEJqYh@~lsD#@8bToiHpU29|1*A4 z^u}v)Nr1HJ&m7Q-@2w865TDu6eHNkB4Cpq--EVGrU=>agxUxblbow{jc_VWwUu9Jt z4B=Coa0?F($HVI8Q(XHKSGJ$gwFg!h$JpFnyQurgqE!R`6ESQGUJP??5os3lx-!`V z+#TVsB085@!$0RrWCuB>y~KyvOUs&@fx*j0%%4C|Ysfg<&fGCwI#GQ!QRb7J5YfRW zVl_?^wLicQXcDAsaN28*fUsRyW1?a2M@9$>)(_=jjD0OZd3Ao$>I@n|?OpD&k!ULCM_J4FXF=Dz*$9CWO#SU}#t z6a2#aL=NRRguI@wI@{ZpFNsm|2hLvXcW#ffFC*K+pISlh3~tDxKOT(`THF{=yqs6T zMEATyS)NY}I`?xf(yOK>(oNq$tVPpX9R@zvWBN@8TpwViis0!OUnhFQ_LVwt_~sUT z{A7x3OI8<7`1AsmN{zV01ZjCHi1Sf7xVd9`Uv2*`3>6ohgC3cb9$c%UA)j62nqL&3jrg}>jl{3)n3$_RPi+BY{Sl@ zTI zyPNDVpnShS2sF1QN}u1iKn3x}O(KGzu^X6-RIwUTmwH&m>?GyS*tqEl zuHvtojyf(Ld2fh`MdkJ+G6`sA-5A-PX%lEZaZkHH>;S69ubltYxze~8y1 zQSa{;d{Dl5S3yRD-;0Ka%FQH1tWzOCWj&R1P(Qn84NG4cYYirfmpTmF_ErM=`MqJx zCwq-QBOLxe7eE-5O0X($w&0<_$fTj|L3_cZLCnJ8;kDh)^PCe(pLIc@z?Z*Y8Yx_U zP)Opz&7-RBm%m&vtF$u+g_=o7*|b2<6mX#*$5N#Q39Viw@!JSen_psV-R9wL zKTGtAqKt$)(^e2~SOnWX^6ruTZ=IiuBgYc~E+a1ykT)d3yjd+RsJX;faGVY0`vyhq zJY#z8c=-__>cVaFmbT)x$EBNdxvKd_m6moh(s#f-v269P^=LVssqLM_?3QACyb1LpPt!br;yb1E9k>y+h_dqmC#a|u;&p8 ze?LegF_y~;0Ul|aEs z97dsQ{Wf^CliXW2e$i$};E<+`o?JAFm}B4T%Plp-S)GdEFd;*2|3L3!Ko!v$3`n(* z8}iVU5`udSB2yfbXQYZr^J z4H={rC?mcp^BJEI-BL_gbu8=^kck+O(TPD#K6{P-2%qM3Ifbj`tED-_^o+&weOnsC z6OrQYRRN1B@LAMh>yfVe;bV8;0eFtcsG@)I981|R3fdGW6HheGwPkoO;UG$H<~2jX>4C< zT)05W#`))MWwIHzr*T#VVLwu*IP0cDI5b|oVWqgEykoL}efEt8O)99loF)HKvuQ8^ z1KV^5{V7Ch(kXMJMC_;DeP@UC)yWVk97bi49Ra~4PZPw-%$a!h1s*&c&jIa;w+l(~ z3W38SOdU;ROkhpxk}tSnX34x`*X7q1_ahzmL#5q}#@4T()w{m?L@B}7N( zo5+!)R;ZF8>X@7=l`e9zplWer!)o@YBp6p`x>6fvXEIb<;e*zg*7 z(x@VrD?v2)eWY2-!8K-qf&K%&)hk+F^=`-}79Fq98L3n}GYuQ;HH(}~#ajVQ+HLEp z^{#CqIILLn>B$q+wm`6(7Tf2VjPHX27Wim=KmN=Z1M1r+|Mqje4yQ6E3|^DJGHkPEERK;u3ax5Bslv;I zXvCrpXxr|2Az#5Kn1^Vrxp)-={@W)H z#gVZRT<5MJAX7^!^FXOILr}@*esh~zTc5nt7D~z-DhkrNk-kq&%&N`zodk42RCC_| zvOU0k0BO(_My{KU)e!lmwY2-kQnOh&N|zAf6KVl_R7uyob~K8#FE^0y?@L37x|Izl z*ZZwkhUv(-jj*@Io8ld+`J-~_OwSBvyR1es}#zfxff;*th2g>*+0qQ&p22 ze|Du9v)#6fYdAmsdco`1R|pso@Kdc@5r(`}ew!yT#!BfT=$o4!lLCMtV$|k0kwCn^ zTQlDQ#0Rm8yFcD^Zr%Wy70THLCmFzzN~Dk3nb=(Dc>AGHrj5^ML-NJ_cEB*(iX{Mh zUmNUwDIbctJ!MgG6}k6njdz|7CQ{>Dq>tnV0;3jJCDYQ*;jZdw33E-yFg7vab=<$Dx^HIy@tj>+`9NGMsgtcZETI&9gj9adDH?+xK7T5Y2~{9=FnuVz_vhagt8Bf zQslWaH{i26@^nPNvrgXtr9g}SAL(n8`_sgpZW-W^}XR$ zyiodnaT?%u#xSMnR)%$1)>5?roH)2cw;nC)ZUua6RYksqw<-< z$f5`h4aFm`qe3|J_!pFNiw>~L1j%H8!C4-538}bE3?xr4X*W=;!$Et10^q6ytMCfljZ@nO&OFH4GiGuWuNe1O)nG@Sj zil|J({z!RlprtX1e)~j3z$h5R9DL@{?fvnZC=DJYP9Jk{y)^xl>{m8A?(^G^wgdyA zTfy*VhU=_w#3EJ&u>cVRxF0(LK=Dekbe8LB8c*y(XtEB<6ny{v7WB4!&|W-)JA2)n zkRmzsBG^9u&>v0{R^T$>B#VlTMGft2)8+d-iVCcN+1e#bUpNze-nnk5&QiJAl)jSSw$bVsv!AUCQ<`P@+K2SH$cM|ApvCy;*1Q7{L2rQy1 z>+i7mK%1WKyG52=_(n1+H}?=ym{()F31WD)@q=!?z3zvSz`bV#Y>)3xO7F#Q(kvjX zi9N-K_sVGdUk}M-NZ2OEi#+;k& z!sQeUapO`JHdTAKY>Fd#9ZL&#AVyA{9IE=kyJQ0n|rRpfO zZ;wUX@_{gFg$^m}JPY(Q1B_wxaBT`$I0DA(j`dW83=W9W=qP14vmC3qf%e=JbtpOU~LG+sKZW!M-&& zezEOEo;T>_mhF)it5KS0y+g1NrXCek9fd5`37Y>N|C9ea7DIl%@7W*MboT!9z3MvR zj1GZAy|ESo=hxJ%E1Uij#u+^wb=(Z!AE1M!X;)o?D-};@Db_#(8S7np~4|?LH zK$*E++2vnsnpQ0P!+-+H{{faX%08s&`VuOQadnI2;jSAevHa>4*rYO_2%;#;WFrg( zN&;UTJ1Jl%iUrkS?iL08xfU0TV(|KXZ9&b=`&*&3uw+> zQui|oWxur(p-qLn+e;U{8_@3+t*rdAV-f;aEia!Ex`>4)?9AAbdCwjn;oR~j`$luy zwl^dtqI^_hk1)OqFw(gDiBj_#bNCT{F`A#40ijUgZ`3B;eJ(AN z5(VWX^aCLgkhU+u(;w)5hZr7P}MUvnrXb)83*!s#LP>(9-gB} zJtu>aBjW_FPxuNhe}usg?a$FI#<8)K42OX6$DHJi;gDj)Aa|f9#5;*?qi zH4%;&J)zp+p{5E7(v`+~Thl8r!6w_LzslQ;_(elWQd*lE|5l11m<@-&oI%b^)ylJ8{?)O^*WL-LeT zLjdpF==%I{V=NC3q*sxEPD-}l#D@noKHGu_h<>$rDVrRNxyAEq68gai&ZQW{U%b$3 z01Zv!mw~JrB?fbiXRqKr4|4L9+cLy;CQ*dNPkkRu4QKg4E-(`!^ZvUd3SIscr?jBx z6tUDMYl7Xt9HTRD6z3&xbnP5DCFG|ebj3uU$LU_Z-@I_$+p*>Fu zt^SzG|E-f(FP0eG`d$91%~`EfWwM(g_xiJ0-@daI-MfGqARP!qj>(+nT$twE|LqFd zp*OHv`6N;B3K%Srbl*)25CyNaSSMZ7dNS#ahJ2Sp+0TVOrd)bxt1;{*r zZszATY1xZ`AwZc_$(8d)NW>hU{4I|esEbMN|o8sui>3?a6pS8spweG?yuRl-Z?UMDEW$!AD8y>BZP#WiHVMZ z!CwkN?V3;XjL-5Xz4f!e*ssVS#EK8oEI;fBtpZnLLfv^{KKZbJ{-d>Cbt62H;A`TB z#0UlkrtS!t{}uKWnb+nhPb{lOfPnImFXa=by=xQ`JIaQx&2M8l6XK?$?f8;8FriE! zt{HcH`gvEk(fKLgY^?k2)NF+@p8^Rtb^uwzF&Z-MC!Cg!d~-1^h`pc&)IKWc)Bj`5 z_)B^+rK^XWTl*aUn``=e-mj!_9F!$|-#BF!5#eE~{NsGmwDBiO?;4 z*>&6z!O#J=2su6Z6Rj4!trp*^lhd!YigeNqPOqSd{j*(wMtik96cC8*m}6mi2TfyW zDUT%unFC(9tgJ|Xws^Jq_|GAaEA4k#Z3>jAAa6tX6#mhyQrT}jU*-~2~LePt2U<_UPx$Ui$@=Q4ad zEqr)Ha7kha1buO}{Qi{0%aossu&~$BR6zNZ%a5xBP@%zpasfKQ-+FdpH#im)!8iO$|kBNHboUG zo-NS{%uvm9?5Up43=J07PQk>)gdTNH;r!MD$0=0~s7ng~I&687>TdS=4nOhLJ&*9o z4$%^jL{FQ^9Ma$u0%-E7djW?woF(??O@y#ryZOXpG&(8dQciLVzv|pv#xH5)%&vDZ zy?{|wkPV4_yUMh^PZgsIAHr@e_06F zq~ZlnJ)bU1hZ$CUMEr`1A?uA_S{^Lxf^jiU(eLk0almSOCxWlG^-DRLsV`a>o=#+y z$VZw_>_L@Es9bfh2S{Qjs^t?%-ixMpBm6|4n`gA_`#>JMow%{zv{8tV@r&*WiKXOv9hgd}EMca+9cxLcsTO=gQQr|O@WTQ! zbIEvHm#}#DbC>sxp`p<=JJSUjmApF;(Nw0&`GVui{S^{ka4WJCAwz zPtG)X%Nn-ccc-3w=MLYrO2#uB{)Td~FY1itrh}L-wbA2ID^>Mp_%_=j44hAF{R|}b z=ij#oR=v`?X1BI0j=4&n=<63|*j>kF{JcMTv%ffy`MzjxC03d_RU&{_DW(5|KR5Z& z8AZ8W#}y&2DR*<{WZ3T=2Sb0fvRF4_+&m%;<)Zf7Wzn)Tc?}mzW0j2CG#1nSHxvQ&yF#HHYtQyF_>2l{}G7Uk@0iRNgjM}G{<%1W+?KZ(LE}O z$wEwC9O7jmnE{v&KMvsZI3j!Pp2VIq#lQku@E+Xbs*k|-X4(9YQta@Juigwt>PXWn zsFo>r)dl&fl4tfq03xTSmvG-Ie>%_c0&UKs0Y_7#!sgLqI0jl^$zM5;?51mE_8p&$G7KEMFFH8t)lHpU!;2LN{Xl{^~We91-dE*N2Yovp@Ffs1#edMhj*iO_yXm5hJp)CJ5eFK5C*?3^pt*>1+;@9rg&LH7N9giQR7#78I+c*F<%pwiV>_FP`V=KM7_PgWr^G#{UoI2=W8u!LzQuB} zq!`3vFZz+;UhF#XI`^Zqm1y6BJGY}xsb;pyVlj3q84!F7tVc4ZRua-{bdc{Ir;1ET z(fXMukk$A9PTcNq>|5#o$RnmSkG0GJ>!EQT(dwJp8%Mazw%~@8Xd)MROZgkp9ZWDu zuF7jIIK!p~Xb%Cv!G~(1M8^mk*)k6hvm4jNUZ%fU&%-e9?u z>#RMI41G+5QMb~vmO8E*l_~vXGy!AG94qp|r9MbO0A=o+8e4k&PM{zi(>G9GjM!M1 z_F(!H<(EbUmkZ162Sx_XM@S{C3VIUFS^|ELS7;5m{C{1QWHX8%cng<-)DP?OWIOO= z+e?2FeS_~~UZ{9jS}ew`yjpv>d`{JK0Jf3+H*wWh5pziZ`$yBGvS{8eydQMEQ&a?r zWl=?QY@iCK5Dhfyj##|C+FtDExC_K0jmUz<`~cK(dTuiP(Jp@B>DrfB@=|({(6^g` z5fMa8LrZ2zVofdzhoDgIH7OAWNE21-+Aec_{M<0euE>s|lOUk@2AU~;Z+~WL8=Whb zJ0=mp^hXQag2TH|y|Xv^uPA(6^;tnZ%1wTMjePga6H@}P2H?nap7+P*_@x<}r2sqx zJ8Esltf#;H{#Et)js5-{=5OqZWR~!ouIOtEewK4O{v9`RS>h-mdbv7u(+k1 zGZ@I}jN#7E^Y7Iv++-O{r2y^|>AU5KH~PcXtp&f^;N$mssUgp5-Sv4(>5BtuX)72l z#as{J;wFr7i#&dTdvZO23`h z#(7oEWk23p`O;7EX}%ssI;W{M=UdtobJ46MxmV`ISIc~zZP60JbGKQ&J^#EUQB`JL z;=$CbR*1cGCY^#bk+d>p@6h_qA=VDFu*>j|o1o%Pn3rpa0Ojr1Z!4;td*u{d-Dr@F zqSQ5WDv6nOpSRh^t#kEB=?t0mJgmlb5zDgxkIjj?fAPOc{&5y*)% z*meCvWw^)1-;HnaJqnIfv6gR_Hn3~4+b;wC0_DuY2gBX5Mm2PNtQ3REPGa$CsW$tw zPOWQYmC0Xht+K-l5&qR88H#_s&p2J>FXfP+BjgJ}iKWV6k#^v7atNZptEI6YUq1c{ zKl%C)1pvEl{xWS)EYyf6H-m>aKE4tDDuca`P8*ROGz=*(jK zd-YgNBAhee!Iu!G2Wro6nm+YPSko@c%rH{^e=Yzkj5!2S=QT7f;&^REYG5n6o~P%y zFnP+x>9N!h_7_zSc}o2^bePm5+-<)A#S5q%8HLONM0>b&O}o9Ed;RI8>9a8G;hV0M z`D>?7)7Zm8lV1rU!`hj&`Ocane_bUuhP&d8w*}GY#O7CsQDrj?bbl*uslQb4ilpSD z;4xQsik3LD6LQF6u2|W$Q+h36VA~xZ?^5D|!s{rGd_v37gIJ13Ddha$;jksfVisW9s7Fu5F^JEM(m!Ap_EXXT$J?3OizQf*Kp0FwAW`2E^|8Ebn+z$K)Ie-;R#0wvQsaTt_dMgwr<0<`s@!H|xWlp&05VS^-XZgT`;)(FgQ&?*6voIG~Q~=*gB$ z%My9orvZnD;wru6-(2)^OD3}N3mMA$ge&DTldaJVMSc=Wxz?$*P79BY43wDw3Wvhm zB$4^O-LMY|$($&mA~#=C$8P;2$T)L`9UKlYQr%MLx(0(OP9kxYo?KkvO?VMg@Olof z`5Fyk?&kL2RdCH0X>TPJerNf;FvnXu7Qg*-Oh7IsS8Vp6adtq|d7r9;IjrW@5yf4^ zmn5U#NrRC3qpn}n?2lHc9WsZ}nx?!7$|mQjU!OxZIhR{QL zB~+E7a(^vAw1TZs{aPihiJ*L)U_QPM7d?s3h2-Y)r0eEv9xHjUm0tT*JsFw(D~R~Z z)w{*ucfON&MB0(r*;T;3PgYrL>TMP?nXv0i%a$7xp_B2L48JyC^hoIRkKyG%AFaf} zj1AePtDvQP0cykSVujCh(OX5Z$T+|z$#h>83M*w&p>X#6rjJd%0u9I#vLk5>z4bs_ z9wd(;Cx3AyIYL#xnCIJ4g0!`Ji1|GJ*NBVLpW0BVeCP2`i+Rt9Sw^z!f78nU{yy6# z`v4N* z4|6oR=RwcZ7@JmkP(0IU->NSVXIu^`fdc2k8>AGz^ zbyBJD8CYsfokkMGrM>EO7Hp{>7kTrV$6;l(E-#|#+D!Y7{UP zL~mcPu3L@ok3VK}+{c@X)_@|fFGvn=W&md7-FM&~2u;x>yzjNtYOb50LKDCUaM(kX zQEOmj*1l)|HEgP9Bs>VAF8?Q&xESM0bNYfbY4fO5G(%sjct;G}IgWMW=fB|^G0PGv zqwb-fUuxcq_ag`OD_3cG9Owm|EW@X&_d7Es$;0@;IEa<=VW%hX86=y&0-bP$@%(5X z6J_2u>qVk852slX0zLn7$Yo}%BGW6?L-5feEuB0%xP#}j&s$4fzunjz*VfzL2se(Dc- zr=q2V)T*)c-m#$Q0+$@?L&BD{bhOF}oD8YSUKw(lO*98eA(+q5ZW`=2ZFhu^NYT#r z{8{#gpy6`wM;fJw_)~B@KJkP^<%-3O+GdGGW6~07%XI}mYEnjTfvpq1iC}MGaf+mN z3HeYbqcOAUl7>wk!j*I&6(B>vMg8t&syoV1s=#0mVdUtqgc&+hp{aIbuRXV#TLGIC zseI-qHRoe^I<<$d>PkhN1Sq?2juXcq5>;1cI_zzd#;YpgUOj{y{ka~k2*%uA1Og53 zwYsOOGT*PGCXuurLOzqI`LF+yoep>AB3Hdw*3r}yzPZw?3f>3))7>i+WuZg-KSdV= zFjz2%o{zpMkVpE_vm!m~e0DWmj|#peT<$@nk!co_33ZE|pQ<>?eBu`$F9mduM8^ z6Cty^m0TT`?3iq9XfiM>&QfpV-Z2i!^b4GJMDoRl7$cN7C{J}LWke->^z-;pAu>7(=5Xft;hVX}#{9E`-u+B-Mz?T4q=}yMN<q#n#NxC&jahAP(A6smvr zMb|TS-V4CoE3vk*;&(33R?Mw3o;lC?m4`RW)@|)#@vOU-G*9fz22hG7TZTa=){jCL&XNCVH#KUJh1(8_WUd&u`}yE?{>OBwdm1d| zN4;LcYB7XN!z^0z;1JxA-Ycg`=6LGin^2PI#t7Wv09jVp;cG|*^lrqhszpJthh4j$ z)@MbV3>(mI17w;O=%IU->+D3!1Xy~r2P+-@sj0xk4Z#)x)+&QwC`@}Hldc{Z&>If8U*xi2xK@(GQ6`YY6Ixfe6 zG$bfDP4}c0wbaJ5-C7=@5g@PpP?T^pH}L2xW@efl`?+2T83-bxXn3}?i!441?7c@w zAfO1sI7xg4!Dc2iLHy1k@5aqU;F(yB=kk*k%_ArjLql)oU_(eZjfiS$Y=zy3)k5#7 z$67Cr^4_V;u5(|dni}AUo-C$KeCIU6ahec}D402Dd-goC*UIC=&kSFp3~6Pdpog1d zB{Ayt>%K>PHAoe%Mv(Yasu67e@rX>Jq`11x6K;Rys`JxL*`tm+^h&@7^7M?HWceTF zLxY0_A_b{5`W}^N{0j#kQFyNub9dGwU+T*ky8bVzAH1zAN-6Ux-VPi z8BLhKj@B2Q2M;7Lw^0l{-3(i} zc#r(0a`I)op`q90!76BYpa<()zrQX`r3sY5=9x57Hs1hJ^hLyb15*H$VMjEQ=mE6K zW8(#rM951R0bKzai$R&M)Omi1kXA>QG&E#GsJAz2X8)6@X0tp^G}~t5&*HhqnktUM zehoilY31c8gw9{KW1Ue3o&LUOEI3%Ru~&m%3nAufEHoWjSlD`B>-;*qw#eU5AfiK# zCI5GcN3;;^?08H?kqy1ehveCtYE-?`*-?Nr(&d@*jGJoTJbUP5u>HOA&mtS*huJrlsersSy zTJ8&jlQ@VCq2xMIYxHxAVL~_2bjaa97tbPh!nhW5n5%MM4RKH%N*vyw1sd6N=;8gZ zatVneLkOvQGpL@-qULu7Nf5%yRRqn$8ymJdV8aV8yKpbya%Ge+h6$s z#9Op(v0g;YAA!$DxlYiCm3Pc~ea>%WdJg^%f&{M;r!)RGTM7mSxi0?*NBtLYLtXhl z$!}#Fu8Xu%O7I`OmdX9DF6n=@_peSG>}75>|1?>?Nid!)S)-x%luPLGixa+z9I==X zbsB7HVt-XNMoF>H9Q!;uBfkYGr5D&sCTl^E zrqe0&{P#8N)TL*fmF3?&I9xr7SoM@SE7*-)$%U&yU=y}uaDAqQ8q4bpR`%CW`lsR- z_w@eLkbB)CcD_dU&l<`JG5yffBIK{R$FwcWZ^04I6&lbpN~A30-Te78J0Do5N8LXF z`BNV;iWZT=tT{vQHVFcNy`^SDS~qt97*GDA16pza=vJIW9zE?EdlWr?xc9^t-Iy_= zXLQzSK3sF3qhq#4eb}xY#a8IK2 zCl$o>ji6hFnZc}ULGX5JLA>W6WLG6P#G6G532gZM#C_2)D{>Bs?g` zJ;RyUh-H*-TcFYAW|?9@jYTYi?;dg`gco1{Hl0$ce;&NJ6@Y)D_h}OMXp@^$EQcO- zLBVH*M`CamMrpbpm9GaR=oPP-PPkuhUw`IB}Pnr6@23sa%XjqJZIq9|bAbY*3w&C&_b zqql9_>6Yke<(rMzdl35{o;t1}EA^HY_H1TUPu|gY&Sog&GL#{)CX|-rCFkihHK-l> zt1ws}fv5)kj=kTJUKs7LO5Zm-gD>45ZqO-|M8SlODW9DS0e@m%3IH!)2k5KdN`VE4 zqevqhE$KWKl2Ong7U7`h`R-=r$%xgHK-V7Tv2i06&Hs-U+# z_&3qvk40*Iupn+RS@BrU?eqi0U<5%>=aYRUI6LHaobSgmpm5_lE#=Gig(v?xO zkIRW~*q^af2!VpoZA(H69FTmq{@3g|+Z-8P^cOns)oS-|zxKJkgjzbcq*u0+nToml zkYghGNi?~hodgBbY$g~gN;yb5zNwr3tYc&?_^>`R&+BtKA-Ui$bEVkV^<*2b>Dyz1 z5JA5#_-;DAA^v?h!we0DGY?q!z-4){vYl7zR5Wt2y%pB=s1X8r!XmwVG&2^Krxa8f zC;Dp(r*qKG3E_XloHSVxipkJ8*E~Rcj7;bmwOaqeNp@1EwREq4DNosZz)UOQ_J#I& z^4pUrB5E$HjP}JStu-&AcOl^nK2Um9S~tCfGN4aO8)-6+Ie>{cG7KkA>vmT>S(aDn( zV&0P=rmRp12o?+5Kl&+#Jfn&HV3rXaE>$EQnm`u9g{c}SR$2l=@ObPZ=A=#rtNg4j z0Yw$AB^23TPFFf1=cYKHETr&E5;Wdt)R+H&1`V=ct*Y`Z=Y zERWY_+4wL&=8FdFRj?Ys1b1pJW~-JjWb0Se3LurMAjYiVs9qOM+Q#d?W(Elb=)$nx z_xGOtH~(vD!=hQJb@WC+Q>)1pUBLte5F&tZgaI!_XBq=X%%^z&gx9~swo#`ep?<;i zq3&LYzuCky@4>g2Ueiy`z5;>oRWzKpmf@S(XC7l05b6Bn0=j8QinYf6{@lszFKqJ;m!y*dNg62ZrmCzllis`$K~Kx&&6KbDcJpfA-N8L0P^rY zi5WSeeg<;bwgWfeKNhl!Y_YD8a`HszK`G_frVx8`!d|S zH=(t``y2N)lpLT6Ut)tieNw2ByKC)c0}%^>FAX6XP*lfjE9%%mr4y0>D{^;lH8P$; z00H$cKa*2!<}^CHEeZZ6kD8dYy(UC`m*Y&*dICX!H3N>vhxf$?byMmlhT4*ydSacjB?OG~rD0xKMaZIlNx5R{)vA(5B z)NDzRh|w|PKF8fC2?r{4N{?0vFe0cz!FCXqx)N#Pt&CW`{dX?lemIezoZ_~{XF)re zrG9mS>C!k`)Oq*Lvr(iNok5Uj^I?5%J?Ddi~yS< zJHwl`=tSjzb0<4PKVsL|Bu5T}YZtd5&)xY|PLDs0Wbkf6?Dp2xYfft;pqlm#WlcTu zO+$M>Hs`2~AtjAl-=8P^Qp@T5rkKC3&E}uR9QZCsqS$x~5kVK1f;L4*&C0}?3mJ@eg?$1_#&2#C< zxoLa3Cfxq*PbA6&n+sY*3G8T`r?Bl8x$(d8pl0KfL8%26bXmHZBc)7!ycd=;P4n4; zj*u;(Wak?5&H+-PQkATLbuJRi{UM{o>MxFVItFoq7Xj?tec!(as5C#As`b6h5aF{{0Wr*~_M0@!>;7EHz!FZKA#}`dl4}jtE|{f zE<@xE3ffSfNG8mmTcEKLLxBeyoaA!#NYWvBbhAB`MLZggZODBy!_vc~lRe|85?ZeM zm-ro4e<2&oeQyE^@7C(eh~n6xy@kdu9-2dTf-g5iUu zocs}tlzeE=;a72kLiqkiL~>EpjBk4FIdC#lyiU_s{jx!z=Km(W2JH1Z_5a~=?4szD zesH}HzmLzSnyJ7$Z2xRn6y!u`I1?}~ z2Pj0u<3JpieKflf!*=}dgOohKEwQ?!vS?JY`?H9+r4WljGzH%P9q}rMBZeOb2Bkl~ z;-=n*5x12`{kWRWXWcae_Pj*H2knZPC4S?Rk!f9F3F1@v(k!@iI=Z^=z5j|^(boRT zAo~w3!=j?x9BWKB_8q602Y_v2jjgqXv_Mu>!;l@}NAf;Z*>xSyeTq8n%vGelX;$}r zz-A$ev+s-oS7zWxw7mvlp4X-4JJJTpinZ6VP&cN>m3fe7>&TYX(F|w{5$zP4_(y8G zj`59<6XSRTO@5+5{8s8hAi>Fk@Yy4;oqUY1I(qQqikiDY^4Srz6$JQb$vCuF@zBE{ z)rsFxZ!>qtf`Zr;Gl5L5a#?x#eH_Re1OiH+d=YHkjzOOMf*t2|g$4|bh^zcpW>lh{ z56G)G0z5!0zJ#az-oJ-|@K~Y{cuS&t@BXnPSDm%6oV#{XiK|r99`Broknj|j?P|Qd z-_62B*mI!!BQUaZJ`>2Z%(n-~nB48D%%82OuhVff0p^ow1P;4x8FmM5JPZtx_Eo<4 zeit0z-GKat;amdU#knnkeWiK%LmlKk&hYxNqzcK;*YbsM4l1I)D73P6C4P;&r~>5~ z5K>_4wcIKnzG3=_TUY-uT5hIX^cPD-uj`lO|HgrhTK8EKraoPCIc-O`dpU#uJ`3P% zPv7zw7dGSUy*n~GG<~2A^dW#DweC-<4>;o;cV?Nk{8cs-1fc3`_a|NkuwHQ(G%{!# z`|rInujS7JNPxJ)es3g5#6)8IO*mU&kO1c;3TK?QQ6+UF<765-yw|DR&>8s6*+4Ry#S;dm-X=3l(v zn%we(U^;Lt4juHiS;jf;fOnqFN!)Y8Y*=5uhBdU8t2D7<8yCL%_Q=bd9lSejg0M(? z$pbteL}|q>>FjvU%D{A599zyQIj?NywIZ}>^By-Cz~ycF7B^FZ`H-?n6SP(bZ zV?d;KPRfYzd)=yJ)*xZ-H^ohChBST^P%U^L=vrv6kuHf`Ux^i)*=J(G-^E9|v(LM*t3ZzoBOL^C)gx*X^I#ALhne z>(V9=768T#0cHc=t4*fdu`b^u!w=H1ui%fX089GckrDyWhbIL&nacoYdH$x1U0@O0rHWg1M1QY>!bY=6+;` z*+4QE7*(kUINAV~sw~%TSV$c`AOc>rYFzZRLzqRKGAQ*lsri6-2vMRYyk7^P@UHM` z9n-jwe^e~LLE@Z{T|Kkc{y=MP7X$pCqsSyMcd3p}ln7#opxXGD7U++=ispa&V@*&x zD@#uto=t%(NR`N6oLOvAf`lgK3gWK4(X{z~;xJoCG1&+jQL_znN?{8~=Z`ME+9-FX z02)gHQqBWThn?L$JN^_(I|`*e`{XoydACI!J0WQ$Lrcr+O%iZE22KbsZh%FFsXPbsGLOf7VgA)c9JPi4{(Hf}^%w`v%omRZp<}9}ZYv&s1mE#*u$d z3l=PwUmffVeXKSdeB2fsME-PS8ih@KJOPfJ|5rDgPPzgE_grIjo!=+amUYG{Ovu^xv<3n_jz*tvR|8~p8a z&pv+d&S}Yo7UkJKudLf4qn3eJ-5@UpG2x4OL7NTwP(HG+MO<3~c>1N^?D)E^g?gM@ zUcX;t!O%6xL?y!x$Si3!Y)yEI!Dl>)KB)I@BjRk(ao` zhyAbVqF-quRBshfu?hJg@TW!O(RdkaGB6H2TBy8z4*J77dWLen;)WMYsjQLTFo_0> z1n|5P(B;29DD6jk+ZR{ugx=6dGvrQW+)%$Lo|~63x)mlPo>GoTS@~m~fTq`rfJqGb zr4PcA&Awr>uso*_b7xNydxLv) z6lJyCiTd&8Y-wnmw>Og9`}4C`fBRmxoGR6|?a7Thi}a$Qs6MX;KI22E@X-0&O3p2och67xDE)=!8Sm zbcIt?f_L@6X6A;80Omthcn;!a2pD6)4(+ed=e`T?ZNUf)gfd<`4Kv(dGJ(e;AZ;(j$1Sz%`aIAPFx?>fK2PY!sov4SIGA#bB8Cty_TPN_nmZW zqLB-Qjy|yS!N|x+YMulvrMz)$n}Kyp@coaLy8Eg(5rbN@q>WK&xxwSHh<*fU+=1Zl zvt|^tIGJRHWv4GcCZy7)QzL?~VXDbO;tdyc~=nY|WMm zpwbY1tysRx&E5{Xl_40lFiv{*>StVNIJ!QPML>Md;mEBw7xKLYmZdeyx2 zMZ*a|;a?lpS!7GUda5CP15MA+XW(^_%oUM-+}bMt-v8A9$E!P6z+5V|o8Cqv40N8a z8tpG@cWmL|qgJn<|H5bTC7*(8$zbCjI0inTY#&I8y_YQ2AyO+V`Da zSITh;=&Y6B4ANhHYuT4RxV_qs7heBO1~l$gR$Y)AAaUXT!);Jn?k}}iFuxK`JNe_d z2wT2x2cbSh$eUYcCb=b#CZ`P z15G^{+ds#oq}!0tIrCySWDD0ydDQ9xi@G!@7a@8~oH~&3TPr1+Vqr`XymJVliX+-& zB=qI=iE`l8rDm@|jRZ}y0d0~p14TElV~fpIOIPf;X_HIRj4dti?NYn5vQlvH^6rxF zT5K{uUG%?!zF6DuqE9RbpI!ZOpW|f9az@xnd|sb)N`l65{Iq56bDUbmx(Ir@JO7U? z&Zm~dX2NYf(v>FYNk39GQ`zjn;6y?H^0l9>pu~!k)1^Dl8u5njLB?&| z%TUwQjV1^i8=(1DL!V136J_{pjARUrkJ~ns9e4f_*z~9YRUB zXi8J*w2+dr5qS6^D*7p_@f>1~qRfqBtn1qpV4ltIKRAVb+>v<0zzUqJ^Q_{J7b!^k z@ik?cvdoH+s~6Qcj#MdCt{G8Z)5q&NOPH4YY@3OGHuDere=}-@!04ZgKHa|haevV0 zAFT>`x1m{;443y4(HfWZTh`5n%SVrBnVH1}p{ptoaEWPPUa8S$5uJY;Sk5pkj3?zX z;Cf4y5j0^fTM*`|k88EzNH@qxW2Y9Y(yp{H?h^LXDtz&;f<_Xyn6;!SID>kyEd-2_ zg%JN@v~VnAB18p05iKDLOBT}IPz!0~51Twcp{zO4i^MZLnmu6s$4v3?2ipC-nxN?v zK=sT04pzUtcBf(I=zksloSpla;n!(2MyP+7;;VR{aMer()XB1|%>wa)C{2TxBoC1l z<4W@SSg5@$x~|{&>FkJ{o3ej-8l`6ZmGRC*H6E)Re$IT1-J9`&=pyhb4U}WBM;_et z9o5^W-MrzohNl7FJhtz|3qmuBoD@=StC-~lgXR5%1P+30@kLH=oX`?&1!xSg&71@5 zB=f$OeV(L~%9Vm2`V}~`!ae;yF|uD)si{^m7u1-k5LmF7$nwSIMIt9TCnY1H6Fz_} z;#3P!O_ltz`aP&NgU}LA&B;HxW12`lj?AIm!^(jk26vajV1LKz#S3DTN=0|7E>;s2k#C41 zw<^bL4BPN|_I9{No_>OTRUg^mQ{X!t`V}cFWFmr@AZiK`XnrL>R5O;CHXfEsDwMIs zF{7PG1u2Jz8c-te@-94M9iOA!FHk806|V+n^7*oe#b+yuk+bn3n#R7mtoS2w)Ei%P z>zZCHY(~f)|5ktRwX=VK1_$;$U?23ZDu7{P}YVVJC`v9eN-w%&|^c zGRkZIi6l?NWdI0%_HUlJSD8H0lTszQZdp z3(edq&iGz^*gk0q1KZ7X5o6A^nAN6tTVcF*Eu7h%vNb+3RicQV+kb!`}Ee5ej>^JwnINEGg+lf5peJ4(FGC9gB3WAY-O% zsoZLFrz6_2cDfMNzx`UK(i-hJ7+R={7u~!t$MT0g(KfsvO#lbiw5RG^g2! zO^Q9aw``w0sN}7{SQ|)`2cjzd8GEg^6}~+;JI|6)L?d)HrATW`i=t{wMP7SsRvrBC z(6s#hrPWpZZ#MsPbqt?{~8MOCqbSn--waSZ6p86~Rm&h&+vEI)9^29{ zfAes2D=S7CqR}vn6T!X=wJB76nI0xuGa#n(|53C3KKsv_&ghNt;v8wKP+u7$!S?5Q z4NX@nlG!+E7)hrY(zio^um|1k7#f-o!$jAYwom-e_d*|GlQ9tRS^w&8JN)6n`|C5Y z>DuMTVBG~@yMe>rqvX-a<=lHk(Y=qqL2ovw|Ic}1@_Y}T1lj&_x_B)=b}1_6=2F*bEMv$Kq9QYo&tM$pP~20a#)9U%%bL}k4ecMK13@+!S=_?$ z(UDtmH4Z)wZMdmR2WD{BL)|xDxN~`xOretY8t+8s&+A3iv6w0jS2ed=4IgB4H+n~!PuF3*$u`U z2jt!REDuTp&Z*Hb#ZRY*-EK~2F)<(7*K+*%MP1hsn>-sF`|i?4QB=W%wyL5+#(9q! zYJ5aM7v#zD$$JM&GV$eMXv}{%vSKSR;3>Y3BA@mBdglo$j)hKTLI(Ce z#}cPzi75Fha)@H4UU6b_5C=)Q&gh`0vMdlaTKBg>N|^rQmv8yARbTTK0#TFiX6J>L85PI>q#T*ElVkgk%CF>-kr`eA8d_-4* z3>G9(;*TpY+L)F)&Q>X|leA?Vu^L5c%MX9y@2C2q3C>naG(8YXj^wX&BRD*q3Y?|N zw-SwwjpuX&AEeXCAX(DBqEunfjv+X-h3~dXleM(8x)Ctj?nlNY(Soo;yXT{#tozp_*ByDvjA%P+FKf3tRt(&1%>Y~#-4>36Cd|4W0OgS zgD#3hqgi#`pS(D+%k)|WuH;o;w z;`jc*eL!2D^4{8sGp(HB;rc3WRCit1ZQSv=G`;k71LeaJO?}Gz2={06oGfJ%kD+$; z8s%G&Ibhklf>QH5*iA6~$Y{sw2;ax4*zzz2R^slQgq8Wv;TTkvn`T>nQ`xROw$5 z!)PahnM>dEKcV~!t4s)4$A7FCCg+CRsGY)sCBnf}0mQQL|6@UZ!uwFn#_Rr{9nYOV z68r7ppt0x5Y0DBBVtD_pN)jst_lwM6mbp2#%vDrh;Mgvv-)m9{+0$}lP?QrgH`qXW zQTxj|@#Avpm_2mE4o0U@7wSmLpzFbrc8?N67)+G93G|4DCSVp(T1RL}sKJJGi2hIdT7 zN=lNhPK!ia>){!cWfE)Te)B;;CNM@u48u!*Xda0{_%e>#RL6-3Uq6UESIV%333D02 zs@Hu6EM=;BDx@?Zf*&jKIBjqUw3)08auOGvqUJ40E?Gq1Dg-8s-EZ?U4h-P=Lc3+k zTshD`p^({BJ2apfjT_f}wi?fi=|#l-A#GJf!E!BfUm-7iSSO!=91**nS;%cM?^9TD3A`J7qq1+Diox^#UF0NQRFQB$7)66l_%<&EQN)A-cCS zrof*`p!EEydnkjM;NeJz-zay>ujBFAlCK;!{lOrIBIv`^fOylMLzerUvg#`(@!aQx zHj;qMRhuIMV;y2vm@E6o@E$G22nY)=7N(90>9nry<$+^lTIGdj-v4+`mxN%4ycV9U zid4%ykwfml&`>;ne<8dKEPQn^%l7ylQu@Wm#l=-NtHE?kPlM!r z!4AC;Sq{%yeOnY9hwotK_!%SLa}xIP?$&BmR@FvMK~a$XYVzXVEzZ3+gBTMN@$lsK zbk%#Od48aaq1s*tB*hXZN|oc=lLMLYQH1kwm1*427CyY>I^r<*`Kc~?wflXAZ6h@~ z%#$PZ(-uP=lBjqTdiw&?!uqcY!v4ocH{YwjJ_??W3kFPQ$@)k`ynM0(scjaxkopV! z48s@(`~ikvu15H64gUfb!kH7(Dq;`i@ueaFJ?+;doHr4Vl&72vC7z61Zt(+KsmCT< zQ9&VF4H6SQtS7}^QcJ!uLJ=w`6EdtrMWJm&&L0a6y87D!DqC?nZ~r--?1EGLSs>{` zvjn9w-FzAUbc}aDmjNpeALz8=&~YdT=s$m) zi6LOfx@lPsj(!^CObm-vCnI)hI{faezV$JtVj_^ADTVodRTIfG7gOfQW!~%H<+*fH zrm?E`-kjs>vo2!v5@O4FkWK{_6f7%bXivJzfZ$;1mJbO}J`qF2eUT@`Xq*oV76B;a z%7DvEwQ(T9nu!pT4AmwObuBgAmvB?~Uivvo^Pk&CCs#42dL!s-6|r2d4Pwer964av z-xLzWLqyz&!hpS2>+w;2Lvt>oN!>~!maiB$dh@27P37`1Oo|M#HO8C(&X-Iqr-GWy zq=Z#UR7(zE7q$rp#`~1m)om@=VoD4(_ltGrcg;+z z8UtM9hbyYM&t8ITcoaqn$-zIF*gvoVMTHpF71gIoiY46mITp+wO7cf%dd_cC&KQv- z%nfKqP>y%ce5Kv{=97nY0_*G2pzoedZI9NOoZ_k(2s9K3gU*xN^_j!_KY1jmghrIS zKcE^^2{q00(wSRbnoDXWc4{D(Ys}l|K=&n599Ci{;rO}b%)j1YWqI=&0Y3&6PHHxh zV9&naGsSjOVhqYav4tgGlQd`)`YI}#XgMGwUy|Rg1F}{!`~e5+!G-?A5Z`efh|=p1 zjw$Bron9;NJI8T-Oq0{nBM^U>hNg?1%nURwmzcy(1~;5JeXQsp75BGhDPQA zWJqny-zRdz$DfJHGzgmv8qqgFQM1?-J#QB^Z6%vIs{OU<^Hqj*UpCzKF&GSg-`Lcs zCmTG=+?x`pMJ31cb`S(78~SFb__N8Y$3Kwaq|9oPRPPo0D1Y<={d8kYtuXV&3;4ae zy{DbVf`t!5RxS)7GZ6mH61l?eOl-=B(Ef1f`)i)3s7wncu;7*#U;RBL_xJg766>?M zhulpbxxI0d3CO6%GnGRLR#-&m8N^`51|vcC6CJuJe@ZI{jyhdY@IRI$@k&f^&>nE6 zHpr}p5Q_QP-Er>w#NMf_ah2WMangyn%SALJLPv`O& zkT@5-PejDw*8+-@Q80OtEaA%r zot0s&%4psI_k&ndrLqLGA;u^+3kT?dGj-VWQFeF|D1E)Rn}8%xJb{$KW&YGlMk0CHtOOuzByMlvO+{LWC+#w61d7)LB0{4z$j_l5s zhWO|KVr)QugY>{K1&x=XWGU5b+38IaM75aSLS{7oa7=2N{^6(b7^rsV1kj_Urc0*p zy6dDKqzfQX6UMH#e#WruIKi;Y0Kno&AYZ^2aORYHc=@XbNnkul6wLo~-RGS~X77fN zMG?MB`x#YXpnGlo{tRu~uZBg-1`~x~o=)S^R{d5rR>-}hU0n!64DaA#gekyAGHz6% zqhtB0U9~C9|z*)9ofe5j}7n z@DI;X@g+kRUAoNE8RbsFjv05XvRUv2y*2Reyh~{Adgr0!-52?icj@r(r2PD~daFJv zw{R*Bev9&;>C|LotIH4JAc9|7jT37_2oC>Uof?EVah&I#X=S2-v&%n5nd9x_F$vH% zyZYUX7*^%c#oAqeKY0;$+B8nyJmmMBg9{J*S#x4^L`r!mYV_*gmOJda*{T}-=KPF; zf<%iBf6O}d#us0$E4j2Ihez+R5YT_Bg34GYjX~%&#AOl)aLAW&<_sg#mtQWuC#UZ` z#<~uERbsiZ!~6uL$z;R3%?;r9uR%A9kJm>#6OFblBl_Gdu~zyz^72IIWh;3Dh<7V5 zQ!2>H1YWCbcCt7G9(YlNE)W!7?fh*qT>YI_CvR_Wzh!3?_TzuK08PhZZ4{c)9cX-% zXxa^JPOb~k`Z=*6cv&e2BO>;!;!BPI{qd$|-EU*acweP{5d(qN5qAnBEuI8TQ%j^= z991G;#cv&Ka-MFExB1AXBMHo>sRiIOk9K;UIo)yj8^}v|RbKG$^75_+>7e_nkT#TM zE_eJJaP+;+x$NznY+U!I2a2%9n57SUtH5$&qHPZhK7weOm_&h=oYp@-O@o?IpL&OB ztoK7eGR##r-OfW~Q}5k!uv+Fe5Z@nDv6V|53xa1I4&JDkqix-mv_B^|bETZAy)p8P zXjjD_d-d41$nUY*3*vlXE;EJ9e7rd`;knPZEO?bA)7zMgaOW0c;k-v6DOz0bN(X{n zPS$CKs3`oR2B_XiyOI-u1@5z6I$y$&2IhplsxPLDR4|8i#xZ)@id6f% z9TOF8o6lVmXi;1aN&95g!M1OTafPvW z$*{i|5OZ>l98OJ=AD*mI=I&DeDc(5N#eUfOOSbG!ZQEWSp|W8Ak5=6WjhHV8tRSmp zDXdQ`??X-xC58WfZod<>_Us!VGUtX2GFSZ_00Hf?`TmCYuui#1{whr~@)`514-9Ok z!#+6~&<82WF)j3os&J{+TMyh8BB@#>QfJ>3WvSoj1OJH#R`um#PD(SUw)Y5d7eS zVjA?H-|qW<(T(&pw?E}sN;7Sb#Z9@JsexEI2nEoN7*Zor!lbp5*u{19qYSw(tLJeV z`*E^Y22YFVukdNQ8w{5#XFG8btes9_1jQ;@C-MM)M1OU)XzaV5I(Yc% zZWfc|y5F)GBUW|Ga>;1~!6Dnn|A!}SECR9=#KeM1d(;w`H1rB?bG(T~lpyc_t2j7@ z(D=wd$f)z0Tk`zJF~Cg4@iH>|Hu1ZyS{S$%ANhQs<%u?57iQ8|zF1oE?0D9@e`iN` zi^&9UdYynbvSeJZ{Pd)#2eG(89nLDDf0bOUvg=$55_55^^rD;VG- zw+fS*jm*3>>Sxet>CVXwoQBi?f@P0MNi7(QUT?C(<}$9?-{r-#(;@78Kc;3I37TfV z`Z2eX&F38vQz>CJNkgKMTlz2X<3*mdEls)`vQzY%gm>TsjaqI=!d+?~x{cFbkTraC z{m=1}px=Rqem!$m+3b5+C!M?o!AFmlg3i}QigomR%1eyX)iI1mhTVD`n&UET`pvhZ z2iN3VXR(WheybOR#AGV+K1S|pKP~*(cGq17Q{-Umf@hI?o8Mq$E$4iBAxdlT-a575 zrE=ydW}Ci$Cd$D@kk^8UWQa1q^~JocW4-5}H9(^0`8`$;o5{ThlDO1WHDerHUc+<$ zqFmBW*eBvhe_lP7C%C6lY?bC&UY$ut>>8x7#EYfZXK(oGdjo9dz(!P?o556~Kx22w zFrj#s9MntYJu)bb9oETajDf2A78{m)>6^6z5iyB;_piMeB$8j23^o1P2*J(MKM|=c zs+o#9d6wT8Bw?MF4`hophngKm8wFq8N~Q)1>#zH82q!_DorNw7CUC0yP_n+``QW9p zur(BTXS2U0@*}{hnC*O5ulO8b+P-J=woe>q!a?@?pA{g}$(2+a*-6ESD!6yf_@`Y; zZa4m0>Z(2#qL6+{4%YATXXX?lGLOCJK5lRd<|sFJzAOzWQ;a9OIB4W`^(-AYxJ2na zc4*4Yfkw)5qhdV5*Bj?5tyBCce2?TkM>}Gb4rgRy#XvHr9gX-!iATm}K4ndZPDJrL z6gP~hA@hrezRIVmn}izt&QtYX!IxIsTW>V!R)6c^fLw0nEUik}{I=oVy{!eQW(kk1 zB{+VdcGzJSucOUt@Z9u6smnMWa5|ohiM>TtN}`GDk0-}YI|t3^8*RBT{go3a!fcYI z$cS0h2=3l2UtT_1b%8bTGj66#$$eihnsmdZ;6nq43Z8T4C2MHpv;)}^3zam@Skv}! z4{(MGOT5k__fkiByJ-53kKKlsc}TEhAs3iw<$WPG0O>e?be>KaLl!Du=(PJ|lSCm_ z?(HH+m)?e?(4?PIFF5Sy*txzQDKlz?aZ)}+1^^Vl;hJZGu*9QvVZ#US<4>NC<|Ii- zVO)dc#b&fI^w!S#f4x2jJ3u5DGKQP;!Z^Q?F z0?@oldmnKAOfE{qYlh}a!6Bc9Sh>)c=$a=9*;seG-}i|odmE4mP-G}9lGaG?`1@gr zLdptdO!62ihmfc-RtsI^^qW8hprt${+Q(`W&6K*VxILrh z`O2PO?kYL>a)aD+XC6Hbi*>CB{cYb$z0JKQ(%%n-0Ay>_G7EelAN|{U^|RS75c>go z5j1Z!3Sz|K$*fM5i&j=0YvtnKs82MTl4s*6?asZ&y}P#M1Rc;PV+*;=ew*EZoCBYVh8fAtkr)<=*RPsr$%VX3LRLL@Nf< zFZbHMX7e%P2mL$g0ia!?c4<^edpk;NYuds1tFvxnTd(d9FBhL!E8HIdarZi1@7`Jr ztiQYTwL7$Kk~%{(b01dB=CguC;Zlc{=7|i>wQ~T69NVoAcebRu8l@Bq`!IRu6HtOk zd*ZdN=egreJSNtHdPYj$UE#KtD&dI%x`aJ!>;Z{2XqYu((t=jV7>pEylQXcFmZ!dg zIVIl%=2s2yyT!pBE7~-oX$&AhHNq)LAz)9GOB*DpgijUod~~TdUkraW$Chpo$Zj2e8NKT-yME#u zcvuQ@mzf^{>Ityh#okgu%Wm4CB5~5JyTl(8-J>#AhRTo&ytn{kg6reEPi8{+)pNxK%@X zZDvjDGlUDW9QZMdAOF0`OUV*JJzsvM4D!1@$y5+gjcS7!bmNjp(xfQzs^=dinNm72 zaK_9Nc0S<)P6(~oJddFLD!|lMjpICBJST?^jDoYwP(QF<(zf!)W<)D@!M!gF6bx#A z@E9Kv6$W`fp$j^p6m87MKntJy5QM(>sYY7(`u)Rd>qpyBSHrE z2hRb}`@{z8@TX6e+gjq?XQ5fMgftC@y2c`3cI&K^79Zx?(kBu201gIx%A&b%u(0mK z!4{cC-LX)Kw;VtnFkgeq%=nC|beW~?S_Ai;S?lRl5IgUAFVLcBKnPMqyhSfAVn8{$ zBdH;jr9e?FQ+lq7pRGswIPq~d`>f74_7Uyd`Vd1{yILBZ$)h)DqmQxBWJ76iNJ1lf zqqrV2PO>DcGWTV=mZ$tBF$g}{dIFIZqK%7IpC9Z8S^(Ot@YICrDQQEVtrVZwLT!sW z{Qro#JPRTRb-iN2m(RmhULJI#;>UQRZ-cDB*lH17GWveU`D+ZE*BYANQpz~!5FEq^ zU*;XULJ{~}2J4FFHvqn@lA3wVUxv|$(VjVMepBdp!-S0W=SP++Sie8%Z{f39LiP~P;X_w5hPc@W0e%TV&2 zF#5InOfW=BwnR-odO{{bMeH+k#AD`41K;o-(2(XpmxqxOs|d10X(>!;8G)2nQ5s`P zP}DK?c(Fl_1?r4WZr5@7wjGs^RYwl^ajOoF=sMHdQpPhXWKXpyE@7)%3v&WDe*-Y?vrF z+)~e0X0s5=7N+J(=Jd^eqci5y?e<4J@g&&IJ}OA~Q9GNpiI+0{%{DKtV# zSYT3qRdx-Kb0%0Aa}9+cr4?ChcE&N4`>DtiCb;o|RzPMpbUH~gtz02-WW6=%i>C4t zOTX@4Vhbbx4@2vJtyBADEOsg%(OiCcZ9DXewrpkyLs?Rl@as5lp4P@cy?pxf~2|;heIQUiu^WH}HEso}hBw%gO z(=iBbKw|kyS{%x!X^I0rqB9?nF;Q9|mYiivuYC(9ZEfG{^=p+4OEmY5na$%q7mQv7 z#(>x<0>-zbMn?pfl^Dr#ag{@<%y7M^+tTn60??iWHbi1wR((6U|3KY!t7}Bx8ulSQ zV>K%0GqbaTzIiMl-%jN~?FTsv#?r?Ly67{O93b!!6b(CEW$0YRepO{xd^~>1%SGaY zpFYxS6{SfJ9z_*PAy3*E&$0)?q0hr`lA)Dno=!{c#9cSH=tuNh$-$`Dk>}-JJ2vuZ zSLDz9TXIFhSx-EJFFxnAb9ur3_I6d-ccm;4LpscmQ0=y9i>ia8qvgBZpO0wA9Sjro zra#zn=s;(x7xfZP2v$swez?oxk@MVY3gtUMtlVGeTr8C@AiVvD4jg**kSs9qX}ap+ zHFTy|t9`2jSpnr!L~>O43Ru$?&7S@mGqYJuEbu1x-mZkK0kCd1;dbP`J-)%oiXQS5QT}Dt%=etk; z6j=1?98hd<=rkI7-5gc?5^BShY@VxS3ZnD}WHzB@MA=pr=_;gOTi-Fm0;@*D`{k@R zuytSEbp()~Y`K-rQFF+phDvzG|f*$p(e6|Gq=cvQ08~NHR0((yvQ>Djy`x9Yz{J znZ?qHOI`O8-5P0udBN{i>aIcQm5TiVtzLoLPELR#sw$SGx^(d z4JOw)rS^3lvU5Tfj%5QprmB$dRMVM}D{1kr5gD;@z5Xgm71svui>cIf^lhj8PBUs^ zBZLx~iGB3%snajU0fm0@Pz|u$&zVvoEL+hRKa5WEQ!BBLkl$tZ#{jhW*l{K>(YWzV zj1*ke-BdR`;y0)OSlrUn{8B!s)FA@XnB2iy)iRYqsZ3rEaxWsD_L^teG+@GUaM8T* z5qczFyfkt)fp)VpU;4!N^9j{CBaF!XyH{51REF^10f8dL#^mK1NetBK{csAwJ*n!{&n!6 zfJ_8KXx6hknG}xZtQdrq;oVKIe}~%Ctt+KvQ$Qx9M^4?@VX;wC+~*AMD_{u(_W$?@VIsgU~Jb#q3}(|Hl-GWJ z;D6{{f;#dUeAB9el2o(qt2If^-bf|j%{fF>g8E0tb-jZm(=^fW!do!Tt|H*mZ zi`Jn1ijuvdz$x1QPUpj7Vh;XO^Ovu5dHaB}Xv`=yzd{F5!0pPQ_XEiTgjFz*FJB;Va3$e5 zxYCQU8xcE*{{Q+34etLL$|%Uo{{P+@(NMNYQNezR{mLnro~3{Bq&gE+w}e^})GBdL ztezB}&K&%FE3hpUt*P=7O{2q3uY>m21N>9D&usU%YWR-cdx(|7d1JMfBLl)72ryUloF z`Hq6U#58^GQ&(jf6`KZs)6d~f4!==>Eb^j@%PrXk>!X*jaO)b-k4 zWUxHAR*)a*Zk^Z?m!{R0o!K86A$Jr@{DVOFxT z58tTeghgT(^@7kVF@*8K+pknd&?m-|Nw%y7??hx{A4zm95@|Ll9JPJjDU{i1+zCMPRS(&^{RghS>{A5lN^=B}BCV*p7M#>Sw8mam8 z5(Ojy6Rm9G`O2QXLPL?A`)eRtU@+(OA;osslFzO#dt5C5?Sz&6{R3deRgS)Rg*{Si zRx<-?6a>EEnt|P9d+7(12jGQ-42RfQNl{Gxjv_eTeHlo+$C*{`KPy`9-tAFdk=5(t zags<2zYQtRt#5Q71BMrkEBqGMAPti>?IBoZYq^-V+v-}@J!<(R9(YGgTAl=>F4bmynU4nFXm$a00^H9># zNJy7-gCHf{-QCR`?w#MvUGuK@-)FHF-&6aXz4s>qvE&gMyk9pQsGn*+KXt`s3FE7W zU}+*lRy7T{s@Lh8C|EUZ8*;O0jg4q)MMYM zDxtYJU4AnrE7ngqY~d)i%mBG@v9eSpDIcO(SYU6{+O8PuTcr5NX00M zH%?A*rSXwGt{El2E|TQZdC+{?NOC1({HOPE8bAYXmD{;JphEd0hG-TGY}QBwleVi- zXW;40v2SvCH9%{>)T;6Nh};N4u`!5R-e%3YwSLXHB*Sx$*J8d73H%ClcO^MX;}07P zUUsH(%X|)vrqQh~W71@s4dcte@8&7+tS4lWc-ln;r{-%5p`Lw?C2elYc<>I><7};F z7os{A`TgFwj^zcYx9@T*?y=kRRG8DTr^(V0dn7mOvHbZ%Utu$QuW>VEWOIMTa4=ub zQU!l&ql*gKYO13@RcQoH+BIsdz6eB0cxJv69jOiWsoMp+>9zcE-40!s@&D&zKpcu! zBlfYRh_*}pR;?hYP>A1{s)4F;HO9?T8$^JUwInA;Yrx)N!#d7VN!OB1gH?GEH7F7N zDn7rTEq*EgLwm@$3JN`a^IC`#^JC+_qRry(xBRX)UBBMmC%g+A-!tsKC5|9GPn9`X zXvE@oJHixhd%6>(r>F0>yk6o*2Y$96SuOme#b`>k5UpqrUKW+K2rMf63F(I0ecj5< z6;hga-GA3m;!wM@TF-g-GM34(`&FxKO3#`;QOlOJ&iFi&IRNORtgq5G%=dN1EKjJltw910L0+fvCNU?0w&jpBr}7ha4*?-GrkK{x0<}&M zg*J*dM?E_SV*=w`1!PrP; z$GW3U9R7m^pyZEw_igSEy7JxOweZLIIgoG%YajJ@b!z6m4`PJDxPr0O=_c^Jo@80-;gzl631JpGGK$i=<>3Ry$lZ>A>6ZG z90iXUz?P!4a|SB6d&g_P|AFMWx-T*6xUA0ZI1h4W{|@~yrW`x3*l)L+E}7{r?oHjI zAXXeK!215vR_S}i4$DIY#7WWkL*VBS&PVxrzTs4|d#^I|XV(|ZDN&!~a1+asC8LYR z_ayHcA4}ql@4QFfzGo$K^CMOIGOP5sDCp*j17&>}d@Pzt)fv>QbZ#aYar)!RXy9CR z;687%y4&Pu5<&E)+o@-y_~&B=67Q%2WMKuNKk(IKlpl$j{sTr7>o+b*BzMQlZF-d~ zBMq)VaeFT5?+-rhIEa8N*Rg#bK_VQN_rdRprZehocwZRGBU)?)eJsrB`AC{$4;D^1 z!q>-36rQymiq#rT!#YjzaRbk8syp7om%tzn0fjyWy%dIXwgsMt= ztVVJ_VIc^Ez7|P#@J~q`{oOB+(vDS$JBuVyM-c>82Azu-`{!j?jcm>mDg2bkxu`O4 z-XD_zq9R;OozX{Sm;jR%cY0&l z5k*h@&fFiQ3J+c>ci&~@Qz_YUr1Ng(ElAtY<%W_jUh|h?2dI%1$c!75bNdlB`E)H0 z^S=F?R^Q`A^2-l!Fc$5=Y=p8>dHVj>JxO|LC(Fp*dP75Ff_WM$h$!&t9) z+b9IW8e+x5^Hlc2iWlr%mi^L7q)R8biYy@vgJT}ax=wadu2e0k16!JNP0pM$SGGN; zg}Ve%O8X{!No-}GXXmaM0UK|Qe0~zUU*z$&G$aYul6Zji{XjKHH703IZ!`4jONB1M zuIT&Qdt+|}lF+DEG z>cCfXc37y4wvEQk&R)vuPlIfm?&MXBa8p4qi0OWU@g8%9_ z01p0>M&8hP^?&fDGld(jyyAW#!LfPWOZ>k?Sio?0gD9ut5n(@}6_5gx4j}+)F=EuZ zApF&^rt)1*VkU#jgxB&ILY3{s@p9c7l(}i=#H~_QKQIf7pbs3FxHO+wxSutp3do-6 z;9bhiG2-Q}_JG)149rqZ5#|OU~`!;@@A^{>7&C5_lsBlV#PRObnvnFsKd2^Q3W8^+U-Xp+mPIm@#kW zD78FGUt+2kh^dw!rp7P#1eo$AHczp}ek;ygxzN z_8u?bW+(T0tXyBeK}SI&BRy0dr$V(Eom!U8?t`6A6znJzP~}%vMhlK&>KuJ~EA|Su zNjGloCk`S;rTxnph?oT@ozjF(bJMMICFPGPgUq$T`CQ+aR^N`>s=GyoTp@dO%7Saz zmHh216fww4<}+Ju-etnR`d{eS9B)hr>*Uo(Y0g_+fLM08&6wWq0wla(nyhq&0|2;S zZaAoeRviC6fRb#o#}A}Is-Ww|S)c+rY}Ujuv9XQZMdD5vm3iE#Yy)0W4z6lQVA_C+ zk`%i5+0vh)qPUIhaIxUzp)>xLUOoCr3dn12%OL8%{JmwfAnkCpe)XB~GgQqSx9Nb2 zhX-7Nd|Gg$^ESMb7{+dArzS4P4s#p|r2$7fCP%xCI^orft(sS0dqV+GKxq9{37U2#B05Y-i~)LjO4*6q0CqKa9S)TU~cJ z+};)QL=crm=#O@N)k8y4hPsVJ#QFLfi6r8;fUI@f10uo}=4y=abNlReW(=A~Jge89 zhB6D$M8PjX&%Q5yQ|gTg%S5&%?bd_ItILYQgjMz;9dZ|KO)NIp7(lorQbM)m$~IQv zL>wa+yl4YO{^H1xzTx;aP%UO+*&Qm4%bq9P{94$??2K{N&}|k2e@4RIUV%|*ZxOo; zXixayL`+_=5ZHqlTnS?Eli&tEhQFWseL*_n$p3@5^*09`kP44;uDINQs=pW>RkOv4 zMP2^S7LN+0&mJVdju(W`xZu!8f6sgmtFE+M=X=QA?+HlPnayt^{YW&@B!!w7g z4BvlFz1>(74?KQrc^eGSDNq%Xf{_nVVwPE8AziCd?smK_a59Xe`-|92CShPhYsfuU zg~cv|)O^`)KqFVZD#2;&1R9wzyngwKrCHBjuECsS62E>^C|XE&SmYm}x!e~^CdL+V z2x^d*Zzw5|+ed31?^(4@Z4L)_p<$upPSkFV@(+arz*`x21tVE3G_Yya*}&aht9||=I{oW&hXHIb zrI^+=PVn1K6S~b1ShpY0P!lGW8~p=dh4neBHk_!qyc=GU*4&o?u?qmYiV@r6AoWKd zAavr}L}eUhDVs!_HJr|S&gT1c0hDFVfUEFj*bJ2H_KYqU*=Gk0Izu|?Q>l4f(_-<# z)-E2?Owg69K zYBzw$Xs=BsXJRceH7$~bqbpO;krGkf=3Y^qDGeU$eO>1SC~9v*{aru@i0P5cDh(Wa zwW?M;(i&#NuV3N=bwwx;n8j`1^E~D4Kb_@E?E83$(;J-;kY@LrSRyw&^%EDmB1U}v zUFG(B6%_DzshwveHVI3h?RaZ#)l3VJ3j0rJARcNvdV771ADNnxEsNjX_!y?0iv>zT z^1OJN^M{xOyeLHUB8IC1j9MIOa>ZeYNF+jVi@(44&ss?&{Ud{1YaViakE%hNLM4~Y zvc1Ddt0NJcmR0x{UdX&H{xQia!oBc{c;HcH{4G|PIbAyA0J0SlX*L3BVq)lyo3`s} zso9^rSqpZGm1{5)`e^<{d0#`27(QMfO?MdOZq(Gye;%oG)V(A9LH*(48hEosqEQ@4 z#t?sHbM2(9Y>PeXhrO4qu*?{M2wkmeK@h+w2Sk$AQVuwPOqo>;b=(<$Sm@M%ixp{q z8KNX82dOf*zulavoM$3uSJF&@@qKDUIo}qJmL$obrq(3+rNiK)q_ief_z$_H3qInz zH{LsmCX^)O4u)mwPd+qJxrvNH$C~6Q6DvE5;fo6Ty-9` ztjd$*wERV8{>hG;8T_0Vq~YZewTRk}gu1FJ5iP2dlzm{KdoMlkFj zBaPFj)O~P}0G>FQhGJr1Wct_B$Jm_mY2To@xA)<)n13H|S|81bq_(CTELH!Sguz1i za`ebe-6tU<<0i94!Gm@|-*N;~{u(JpjBNKky@jbbn5^HcwLe>eq%5-UYC=3p=!~cy zZRRcn!7IcFpq5a0_KGMzyw*X44tJ8$>%HqDf3NxHz%lVxi+NRoMwQ9QQ9#GJS8W8f z)=}awW6g3O&V-kG;pHC9biBsPHAH3Vj@=~x1MlQcN$*GmK!Ec%iQWISd^ys*yV%#A zX~^eUJ!|St75eh4AZa;;wlib)P2pmADI<)I9lwp)ix7G_3YH#8GnNpo=jGjXUOqB> z%CrjFoG>b?N!S|?L?S+7Nun>5PR=l4k3rDzNcz&>_YfXHz5Tpbk^18MfJ#?<{-J)G zA7srog>^wCC+1f=hJ(xgAV@^wMz6+AQe!S8Rwg1OCg(d6B7&3S*8?W4uu6tGR^g!@ zKt-7L+HmWn{G94dt_O#Xi(pmw; zE+S24ngjJ+P5Acp>q*PylUKxeu$F&ZG$Hw~JiOk%_P*W32Woh)gdQA%X0)XO!?<)* znVHCYzr6DX=yi6p?O+MN|K2-uChln888;R42MlaQm{nSx7hcQ5%BBCt#n_>-f7QE< zH2R5JRY69&%A|TWP>u$d16C2jg8N}~8^ft=?u?Pidy{~JpPeRq?3mpYRs7$G)fs;- zo_feT=0c()LULIJ6aGV1Wd*9UkGM+ZU+Gw1k^KDjN*;RmDZeG8;|Ga+Do1aDd>bi0 zzwE+%%}n;jsLFog{$alPAt`CNOK3EwJ>k})edz%R6y`Z9x|(L7}=j|0tJO^#{TIj8qgyEiG;KF zEF;Of(?LXnfu!8_DR=>u+iMjsk_r|Tc!E5J`m7j-5S;nU5~Mk zj-v=!`)(X9V(0T(&;8QW=E)2J=;|3=?v*QP@Vu2xVw6z$*ZW<_-IIe{ng9&b ze1_lB;%^da{=_idc(mNqIkBbuqs69mK+O2KJ)8`uNsK0(2Aufv0jUOT`JO)u!!KhRRg+$A5dO;AJ4f+0y~?w^1mDeXL%6|a~-)TrK)6*%pV z_|BG#YTwrKCXMSc5@0jK1+`vzL|7bWpq01&Mg)F=2u{u+Mtc*Dz-g>IX{Ay|2@{4ZqJ#$)zGFWidDWDLrZrr2z_CE@`7~2ejkBjYXBTT8XGw?!}$B z5Aat0CcCT8b|$yFKtrpt{}@t4@P%vhg$vK#{Ihzi-HaoTFG94<|v7(M|2?mt@ zelvxlz5u1ne{(tg7nkQmk5T&yyY+5Qb|Z!WA!IS!w7fM)e%_~}-|HAS)<%rw^qlU@ zl_AJMQ*i_I4CmpsOj4ziDu3qyx<^uijwOJJ&Dt&0-Mlm=2UH#;KL6#cMr0WarCGiN zI3~Mz;VXj5r;t}wI$Ru1=Gl(xHfS9wXRTAoYn09EAaOs@r>xDMOgmX`L755*)2o{g ztLCrydFqwQ@xSwS>S=ZtcUzS*UY63Xq~-8bFY^w06C1-$Wyd(OowjEi-fP4w}bzPHXmP!7F!0 zjS5)bhf^BBsSLYb(hkeuuQz^?0J__^Ut6y&Vaq2a+1$k1@!b}@X?t#hy|3J~IXgowv@tWV*fIJQ>e< z%6-~!HkKlggrR|~9TbY?cy|=&_*emBP_r88h4s@F14~|HLfVdwxB0XT=Ra~fBYrHS zg#RIwx7d#K`6fB*K?a9_Z@`LYSdFIXL>p$lD04PDm$NMH(Fn~zEeP(lNC^yTMIYS4 z^l|vh>R!nUh27^jws=8FhHx^78U(v^{ArICPoP($an` z_kF^+z9I=tWJm^hN#>pDW8_l6L;`|8J>Xa|^{aq4bUWzeSaIbe0lE{NKK{Uo9C^E_ z?gp40B(8%|D%F;`?d^_*? z#y8JP%6CHDmNc2(K>MHh!T9~CEFRgN(zld4N)CWpJz0w=U#aXX_@Up%*07soS0h1+ zjQ>so7fosLO-ca4;+2acu5^bn&}0QRl|cYB-9O+IddonUL$0}_h(Cf3WPh$#EfC5kF_XAa{gbgR-Ykhy z5cR~L`T@|xHu-DM>^&c#b_Jn?k;H_l)UF~HKDwx)4+Mk>I9${f^I0@Qe+|j92GSOB zR}5&HIcZ#+AmtR44NP08{*+Y+kQ>4#<7lrvUz&!>lv%{QPVB*myD%UZ&P+sx5#*P? z6Un~ZO;LW-L_-nCV-JLdV&Xw>j9q=)C602bLX{=Bw2Oe?reSM*<p$QLWoBj5DzYEBkQPq3A__^6`SCDcX&eOtvjCMtc}4VPp3;~Wtd z>Mbi&C?g$qsX%=DC5`1c|_ zhLm6umSY`_%LXSJa)lC?4`|~Uu1#pqH~-6Bi(mr2BpB}GGLqMx74*`o@~oP26=N~< zs}}U~2m5ba<}JT!zPNK5%H$)0L4F7(@tKK~h*~frVf8TF&5YT0{`69Q#9AN2uBC5Z zKlS(VuBq57G_M)gdZ&LY$NlM?G5>CRq76`djP|FNS1<2__B!M+M6>UTgwW*72~`%O zD{Hcj{BO@mI%+K6;R-dQx-B>|cz2M>vC=|y7-0oUdsaus7yl87Q8zLkfXUmRx5h+@M`fcNH1TmeN-r9Jhp+IW)` zu7}BI`GZ*}Z@4cRz@OeKw??$=8T(lRRbrJ%Mg1(VPb%eMbWr0~PX6}>FMMV=6wOP; zvGigoC1FGbPId2J6!%hSrrUx)bMljJKh7k(08mSEB|M)*kMZ-2LDy{obUFZDL8$P) zMQAwf)w@}Ko-*1VCK2oEjZ6sz&$@^(*__P6Q&QTo9Kx8oqHV;4xqTMMt4uG z?Z}k$>AE9vqJ0sEe5RUKUC*Jut}3O}p&U?c{_@A?U6^$-F#RhB8dP@8jz2Fx_#GV! zdLjRiPs0$a8JdeOEoB4})Dj$)5Q^rDnlnXzrG%F7)7g8vEKv?aW+t^O#xavr^-t1d zvHf2mr#2C#+P7uy(d^=OVqa_LnRwhQFtMwMO|I~Dcz>+&_5zu9dp}ew#r=% z4um5gvQ44VE!r)Si=*0_zRNeB!F2kQd9`FbIwY$wA<8D+Fz+#Z`W8qE<5cO`7n6Rt zeuWl$x?X7bC*eUWP0-@TeF5BP-^`r|%` zW`8tW1+c2)`~MO}H#g(q@>cnV7WJsYfA6pRRLV$vXZ?GRN@XmOgKi5S5l_R0ljUrs>racXrY12DS+TxB=ch%XkCA+V8b0~K z?%G78saY2&u_7myMX-l2mxK@R(aKB_+xe1Q8?HP4`y%q;C?%Wr*Lt5K);)A*Ow%#( zx6BrMe>JH7?CvE6jz6y9n1~7DnP+jkbY1yeo12@4M+=SQ=Gg+Y<^Apcxok$=2H#7u zXNJr~mNuTS1?Nf2Q{-&NdRC;>r3J41sWfpKc`r$SEOBdo{v9CIW%B+c1W?VxB;Nrj zkyxZ3rEL9z5C5;G19;>URJH&eQX`L)(y#3;E~40g}V#_Eo12g zIu5J4j4Jnz)N+CczJBWIff;SS9s3wAX|mgL{RC4z2`>|T=rHrnaPW^);1x%=XhA&K zC4GhfjQ0OC1+{ThR56IA$mL%rb%a)SO@%!#aLHD4Md_^3r9Ic#JO-6i9qZS@ioGLl z6W-9p7chF`dD);Dc$%-Y`pbsjsS2wck`cfk>d<;8*_m)(BtR?-X2f8%Gi7I47{_g4 zjAjCx+>V!5EFnG7Ln9$C(Gw;^x}dJx1C~ST66{N;tGwT|AU#Y0igIfeTMTS(EWdpK zO5)VoV(wB?6uCB&6NdEK8XB;Gu{f3+;z#Z361wnS9f47TTuY5ijxIY8?gjeM`Go82zDc-?>C=wL|L+-*DS zJj?ljaSZA*NJ`s_&Jv2n9w;m)Ap;ZRA9TI!-^rkNoVA=oX0M2 zzIii6k{X7)*voA_we+5IT(WvNt^@cvOCLV;x+2jjdj-uABy#AN0O zAG5dqQk7mJNmXpSXr9Hudn`=@7@CIEHpG7*HA4N7>;k$_qc?xKmG^eNZ*Cvl+zU)H zLhWfx*ME(z)tVK$0L-b@RrESlAiS==O2 z+1XbN$%XJ$39_$xHsAO+hrXhb{gTGjBfM2U`s1T{k=k4{thh$>tW~|iKgDY0Hg^__ zbWe**t?!7QNo%QAXG#wmdKb)bQ1%a3*Fl0I`D*5iyHZsz6O?%@B`g}7-~P7(%u<)u zf;1^A8>~asg#Aepk@*&oKUV;Xf_)yRBmOG8rb z8$^eX0?`4+ljK{n}HyO=DYJ;I^%EXRcDe zJCcC~F)&YxW`sl%&5NmM690RYXLoNZDgi-I5$)Ru%^dO1dfFCnaC#=%zIn5PAh(+V z28q}pve|IKOjuFXXpzeRpWZr7*<1|pU#c1Z$7#5L*j*_QC3vn$*VtXE|L0#x%v1E6 zv%D))?=nhU!_{Ob3&*0*&)98FhEtR}A)mja_AjUwPPfQB*PA9E|~^mj=9-1NfhTk!iw@{M=BcHGJ4-a{oa{-EQ68NarB z>G2*Tvts+C#@ybED9rWwFZc2f-{+^9M(g?r#yE57pK1tI8)b%pw;nI&;m!Xz4=eq% z_NV_W<2V@?s3+nv>8N`{8ya?+nL0482<-~e%bp~17HO!d*A^O`afN-}#IMGghsEbN zr~YNvmOy(=g8)8K8uS1C$Vd)4NV%EFOm%rI;$K(x>U&%nE2F89{EHfyM0#8{BSNdG zQs{^t_>i}ej6ZAeEz}^0EG*cG$nppmisew6XDGiiwf^stzIpvJa?40DItYu|$C+vt zCB#LpBh%}F0dD0ycS8wgT1UdT2nSN!67{l=Dk|u$Po69Xt^}p({OJlGa+O7XDub{5 zy|wc%6L<}&@*K~8|39Y+4Hgzo&t1WoQYOxu4Wl#jtH04s-Ri&*7CeD^sYV#y``%pd z+q0SaV}9C1a7i$CVixD^-kh$xKizIuI;_e}c<=J^l%i|qeCvm3l?6-Wn#?kaenHH( zW?G$m|8mOo(G-*VzwfO0!XRro77n4VusEEOqbL%fLGn-1xyd@t1?)RByZ&Xi9M&!z z{To-QbY1sk)aOZzgTI3YHZF>^npHdp@b41j{!n|Qe2lZP0bt$?em9A7y>Fm$tqs(4 zE41?6sUVA%94d1Ta^{uJerChneC68RvN)cFrT5NhPS8O{q?(d(*idf^B`-#+w^zs`6Pf`TVq zrBzlcq5ODP21L<5Q5#Z>pex4yP*xgJwCFzrrV_%S!IP{}Y4q+zM<9}j{~Z#3Gjt)a zcD)GkN))3OuxFxRAAUJN=eThuyIr-CCm)`06MUNuR$?*T{$TpcH~Dm|2j!eT{6nci zLH`;w0Z(<08?<(m@%_&b8Y-Br8sz^uTb%XxdgY42e_gR$o5UD*Sn;F!lgm*l3Rp~NmIK>ovlTxYze0)yV#JhWY147X+8?|b!+#fH^ES6iT4jewNI<%WrSAVQQ z4%tx4F{+WtmytSY=8T5rQ3SzP-l#h+pT(E&o2ajzcneM@B4PNNLJGOV$&6+?uNxkd zo_j(|zZyQ4OI}HVCv%R2-i&5+EMw4OLM1W+T;{e1I6#?K2e##nizG7-+(M5oSi@P* zC<6mHGn<|*#D{a2A6h&wzb6O7a}Xd>8mfwxPgg_-*lnQxtmQINOfs%6)fa92IvRF-+zp1{I#?wm{K~!EcdJ14kD==4nl`>ht31nbr~d z(jy_L-hiq3rHyuL9O*Bryf8rVCb@jM_l!w6$MG`6F-y5iNaEm|$#{p!s7UTugKGy= zV0Mfj7{L>v$6j{qibp25;m9gLv|ef1UDFpL?_NmxAnNykjQ9w2E37 z5_8vO0Q+-`A?L+j@7=INbK}1|7GDXUZ$vRzqaVvYiCB+znv7HQ+V~Ba7??JsU%P>kn8q+&JfFxIApE(thf{DiHo#L;K7HK5IY`aIlgrt!x;9L2(3saSC+jp% z3bGyg(bqCQ&crQ&TBrLtINtWIxEv@q!w;0shrw1+Zn$YGx{!{noHcC|zbDtq^^^G- zFp&3c*5*UaY+w;B#f2G>3%!gpKC$?#w_*CUOA)e3d!Kg@qhtuebuqu5`T2pB=Rz1+7T#}@eHc5)Ik!`)+d3h2XNJ43%pEb4PMRL1oUH71gm5eL#Kr1m!j^cB$ zrXk`r%aH305KxM4r+1lOt*)flE9bi(j_xMxNGHK=hy}PE&T%G%MF@4rX(7nZI42cg zOwlyV3-b+#dOKr5KN_?iE>W{TvjREVM6MdC3&1XKh)xe zMBEdbJ2)_h$p%zPZ^);Y84JWt?nh`VxBU8RJnfE>QaXe#}+;m3KFc>6-;sVzXF=3m?$y9ZivCKS+ySHdl?oK=|NeeV z`=jnnw@F!i)ZEvftT-c~nTC|1u?sP6*{h&XK4B{5abH4@jq*rJB^_mkIFQQfgnv?a zrglLVjK>l0!$rj*>dBN8%s-wkc3AI4df~Hx6Y?6ZfQbKU<#xLSz}VubFVU_D@sF{5 zFUc92rt!WolD#294*B+!g+{}dPER$VRHdQSDuViRNzHeaWe$n(&C9cLzk*u!qYn;` z=;@Y1=7t+}uK(dyoH^Z`iGf&{N>%tp!4fGx{x*2Uxfpm;lJLP?vrj5G=k);M;kMhHwBR-WK0@X&EeA3New>9_m)?_2w?p5 zK^RT0U;U$r<~vQ;KU!l3Sv(43w6=W%v6e>jk6b|EC%OuQBS|m^IT4hnXm-m_@95P_ zVVnL9U`JtID4Y_=D)qNa%al*azcL4Govi7SXyP5A2!Y7n)&$ z7}2Eh-f0Nuw^@G-erSHUleM`2RRia^*G)H+#zn$ke;_6&hp1<-0`rBS zExJ2;6bZ=`s2LYQuj9$;ho>UW@nASLN?ns z`8D2L%e2j@D|9rzACon=@p)=lgU=&h@nlhO^l@8MUzX>oqH|yv=Q)LL$4x+|#Oi@9_M1ohuS?XE9etXJlmTZ8tcvk~sLe z((YEvMyEDx)_iiiILGuJyY#vE;?um#Qa(a*h0_>dE?vCiFP95qw-_ybjn7en@=bXT zabskoCn8y?X{qG95Wq3;+`#~?1>2ha@ubP=+-<|%X48Y&g50xb`rJc)+xG$pydK(S zR2}Q%s@XREaKG15l|+FxY5QNP4+APzR_y2)7;GMACKAyWWJDywXh7$Lt3*!Tl1)wF zCwXl;M`ITn?X9kr6+Feq66_K22-oA4EY(7tOe&A8P}B^;FP-9cp$|1h&jK=n%E2CC zkofZVBje?g$VM~m*WYQZ2Jh7H0GRt~=MGOgSI{##Z#k;7M;1pp+ez&LFTqdRIHW>o zoXxQpJtpsO7In|28_Ldjh2tP~sm?>TwND6ghM&T5T~IWAr1b=&16RrIrMbTN{H!P` z*oVMNxayr*rAp7JwS!{ahaBTe$RzHpFfpf|53+G#jHrto$Ng>V;&P5#-_oylbaBCk zf+3DAV?}CRh$fbg;Yh3!1j-MUYemxy#K3dfFTXmu zgV0)H?V^%ar?kQvZJUlwRG}YoFIcYI7;YMowBDOfAf?3$rVIh_!3JKA{)o3&fw~Eg$H2Ze%kfJ=2ou;g_Z)G6om%Xc%*y^ zr}quQ+1pK4RFHpW%JPtW3cVVgeVqNX=YCe+HrAwS&tbJRDh_;pZdMym*zD&7YAlxD zJW5`DQz&$vz4;?v63f8?Cmw<0Utc#gFz#=U@`~$+Ra9|g>4WDD?UrxDE4Am(cwN-d zVyzF3LbaP1zUl2N#G(%Sb4(nz(@<10$=x{ft_Fj1wmU*a{8}xOkT?&YOe8K2yD41p zaGc(bW8coTSy|;=SELJ)F=5f=I-42z>e)yMCVX-(ea5x3p6v1J#0uMW*Y4{G$&_%@ z(L8zMoeNLz-&d*!vyCvKeMll15?`FsgV-40GK&szh84?qn)qMtlVR#NACq>v_&v_t zvBl)#tt&NVV9z%PLojF*Dl_ChkSp@(_P(p-$817={NIoDyr58Fl(Q3^2KQlcm(W*b za~GWPtEb;E=#MnlGIMXbcinU3JS6IN`elM?NJ40KiJw8@Pp(5UtR0rqLt^aoL1Ci* zJ~4p@vjrv^{(E4|hFjkgPlWI_U|vwEYI56h5!~}r7my;82$7oNyV6(~Y#`)G%cNj2L+7ohKm_31!Kf`Z0oY2T~(M9I^ zORv1I$RDo3=Mr8*0YB&-exdJ!Ok+ks*lB!))fm0Y@v|Ou)y3+~uFcq-n+C}=GWVh0 z_3i>rdGize@2lNE%^Iy2jAMcWX_KwaUeibSBQU?#(^W^qa zv;XA&TdS^$k9t|Aw@3tT=ofS(VY?LNG9u5@pd%);ChodF#ul}xyCRLIPf?1R(?Us(wvmmB__3q>Sl-|#W*WWqJ$-@&Fd*|xr4?u|G zy8^+OdMMNH;d;|}o#%F2Ix;hLg)b&^QBeO-q|NOXd>r%(a&_kiTR z){WFf-{FUE{<<)g@=>o(A9Y9Q7wwk-&&Tu;TP`y>5IrWbKTh04G9WpZAT$E%4Ot-2 zHS$l3^oz~6Tl6%#zv8UWDr>~o{N!(B!R_!`Yq~7-fvs1kHgU2i9g5RtAvliW`nh1g z5k{KWSWI}n!Zjs=u<@B&cbm>E>^j6JnYDo?I5M-dKlXn0=!?^}l_@8){!`}QvCq8~ zS?k>IH?B>K$$um2oc!7mSepG7o7~Jj@(a(8?ldt`+t!FSYEYR5lGpB|IxkHBotmW3 zd=D)2t$$r~s)FQQd5KW7Hv?bJSrnDVZD;6SzDoP488v?E(e;9xdUb!i-Wl2h11UT{ zZtF13^n$T$c7M@#ZiFmzx0%1;=}a20^Y>N%wd)b3yb{EQN->A5l;~l*T@Z zr5`<+oN1?tpfH+bWE}f!2(GbWo60%Kpl>UKnV+0oXr;y9V!Qw@X-FsF)VVj?rl*RT z*RrLc{QdkUM8MuA1t3Z&)4fj{R|Ee#%?HHAOOn$Akq~X6uV);0&GR_5dL=<_Uaj#R zxuSJEX8jrx3pvKd>|d!pmhJSKw$89IH1BNAx200~;lyPzzog(w<6uBXx5|!7(V!MA z^0&s+^Sd?dH(vKj1VN1uBy{t}{r9T<^^2wY(;b( zb$YIDkeCq5Qs+JI#&%=Y*?i+8kJFKtfa+Q;VMpJlti9WQ`&tt6vpX&v5Vh$JT-D(7 z#Uu9K5s{#M;(MaerbHqX@*9YjD)@K3*h*}TbUIV8$62z7RlV_Z3r#=$uO??2liAlw zf{}sorShvr>=8mz1wUfChtNR;k+$6JwXLYMA3eK4&Nz+-{mKsw&!j#x&!W&QDgU*o zSPi#~b+)tqi3~VvSBDY2sa;aPi#j9nM=c$+1)fd1Y)~S4=Dr++Yo6yfP*o{If&dKc zy$jYw1}&XCUJGQpvGA=o1+wfZ6!%m7rw3 zey7}ye^BsndUb!bbWpect7;2}2&)+$%~cgC0|YWDgnaO~hVTZlQN)5huN6LY1%Jt& zDmLW8H^_^$^dy>)8ShgqdkYu&wN04G_s-ttATO|)AKYgr z$fG&?VxH}aM*-v7cmEjTbs=+$&Xe?bwBeE9t3;NsrS@~RLc7v%(KBhrf5g6AFL$(P zY=3m8h{ty8e1EVttnLVtc?02ch_&%^#ZzG$v)I#4NHvuvWI5!RXL~R!riZCazmfRf z&9~3BS6asH;Dqh!c#+@L@HPNT?nt#_lw!sIJQKd!^Q?FD%|U15IWCVC>IL-I;OyV^ zn@pN(*RxI5_Q6-~Syfh&3Q5fAO@5YPs+EqHg{4d~M@qk(c(I2RB9?LVJeR~DyhW0v z!c8iKBE9P%2aPU#wlftT3`tDiy%c$u66j==@51^%uxqyHA(bh>WT?NZRq457T5f>v zGe2k=v_4UK%HgdtKf?NYnwV;_Scw$znH)}gT1c1G;{tQ%g74zt2MqS`4Qv|`Z}<%z zoSah%k@l8Jm`S0oms=x)T^|P7DfLtIe1i9I@pREJJbl)~IweCuI+o_|X`Uio`#b7n zyrn^()LQE#!`u#SZ47h)`#AJ%arl=D+m8C}$E2d(XuWd7T7DH3#s-&N`T|9LKaX>C zJi|MyYemLa3pNuS789b@qgADr;TN5b&r5PWk(ZKh$=l*ZSz?HCHV_5O!iM8y4>z{+ z3l?1Saj&_|=oof0niWB1safV70* zReAY_V#{$no+q?-kvo5@BE`ieD}yQuD>srD9qCjwAJazpzKj-evhHwQs6n zVUMJ3$8o5Y-oQ&l;UyCD7aPu=e8T_f$HA8GFdSg6T3~p;tm-14_r8f9W3U@Fh$@^+|8<)$Dwjeq)SVb|>NqVlzc<}m+am-oZy(RY5@myAZ-o)ZB zuz#G^G@WRiGJ97_xT|7UZsDcJ6nMx!jC^WxJp_W*Du8*(W;Iz%w#RsD`39_6gL&A7 z>(8I+d3kwj5>EKP^jd>o3W;-YWASPbsd_^b|z`_;clSr+@<;~sH{0S zl%F<*$uCCtj<`+lfvpc+z=uSuNcqFHU*MAlyFJ}p%fBS)!v?W(>3!ho`K3^{S8Upp zX1MF$FRnK37)`#5b+Tka+V>u)G07Ga8wyD+UU;$fnfYx#&k;SI9G24?%=Z3;URz0w z1Nl-LYV7z@bEQEdg~oXytc~7>_(Gbs*a$eoO|qHXU-p~?PAAsUwl(?U@7_N(ekD|s z-I7z0sr#^$7=u%0Ho#BoA<~%ug&omn+iVkMd ziz;f@KJt;5^?=<7*a)@Ire+NDl3$L2-zN*ZCMCFjpxC@Xq z`XEB6IQkAV7}*oW$TRy`JKX5#7dM2;$5peAjIYJCn5JsAH#QO41YUaCy%}kKFto6f=3QI~iw)Iz8Fe<2ZBA@8L#U3$@fQ`F3~w8{%-7Ty%r( zb4$~O^>UBq`>8{}l*kVghcfaC8QC;`gT!WgmysH*ln2ubRrv#`BKo=)R>s0?PGm%5 z1~Dop?#_Ky;C%#-^wL%~)Aew^SVuKh7Cmbu5@g|6mlNr?J5ziRHRw@~y2$uEl={K+ zzF1m|c*JO2Le9W1txbJWDtrSqoru6NS1%C3DSmq>_cc1RS}PM%I`-K4;KnZd`}Poo z8%(nZ)8RNam)d%}nA&F=dC!B&P8oONUrLDEr zANbNMvXYF?a}2-&UnJMxq1fd9oC=Y>;{v`CZ$1Q=td@Mv`2f&E25Ff+V}83+UPC5b!MJQBiwOvH5?RMB|{v4a(Lox@+GHmpuBTw4r-bg8v8}a76kDJ4$ z!>^6g|IvrPHI72a3%i>MnW=@+6D>zM~htnenTJ?Yml7WLA zmigM)A}sIX!;QVKYoL{O4n!;3{DhJk*=n`qJqqbcp>DJ>C&}sL0SDLEbY90p;2WYU ziNqusouT9V>m5twi$1c4ER31$77j7Dqq#nH+9{g!>lpC}^UjEd!tJ@K41>Vzto7QQ^3vwwb~KU%&Mm1-G1(!c6a z*HBLsaAg(M{m$PrR`+3;9V`fPEY5u076ztw<-#~r0)sZB({}o=q-=Z)=WAR2@TYlO z{skiBE2ZW6oihtw?d~eX`d0}mY8rW-W<1j$)3wOe{uKZ1pwZ-4KuF6ztKGYfqso-M zmDa}A)ZfcZPKf0Ew&FlV$HPk=M-I30n|3tP2MOpwgOebNg{lRTb9YDA^3d;`S8#20 z^A_o9s5zh3|1np{q_MG`7o6RoADRHtKzqjvDTMG|LxE5KCls(r_@^%5rQSUEa1D{{SE5x$wiB z(Zs~$)GJxAOsh_CxNNr87gO8IxSf-3Z1R7ALXb9iH<2&n%WJntz*WOV+AMd({;2`i z(0*~trct+LJ43`AhteZIAUfn}!6@e*%vPGh4*TX>Enbf1iVUx(>D7OT+p!TDsP$J9 zbY;m_Jk$R{qnHUzG%+nQ;@+D>O~J_;f&V%^%Kw#>nW$KYwYpe0v()XXAAK;YV7^xtCGOlJU=aE&$%O4@(cK3}92`Sr;NX zJk{X8@}a)0nJomGhUHeULaVt}8ZusoP8(s^Gs8LV2KTM=x2%TMFY+AzW*@01$4>Id zl0Rc2RZI3Ltbvq>zGz3z!YtD7jX+Ym{eR%UcFzlo&({~* zA{nVj9Isy^*I6j{{3_Sr0{KJrcHZHv6R#p{1z#L3klTV5ELQyA;{z9n@N+$0LZw>| zr)KNxo|#R_4^M>T#4%$a=?=9~Ab~W8;LJaT~8Ta<3Z~agD!(^mDqyY=c(How0)T)4rTtu>l+(fK7So~9oVgRKFsQ7o_eDw0UKSRkD_9OuL1$`@R-V<%!?rtMM_r>XXj@7#vZ!ycV>yN{jt$@s5 z`7W43sJ-v+S&O=!|1MkFyAo0;gNv1}a11j;(|Z}qZVM6X&hW!I$-#zYaK zp+h3v$+UgF8F=QCb*%1}aV73-s};36^pn!L47AGMd4=A!_V-HHg#KV2g7X@kw!u#3 z3hO}$zw_CwudeObnO;t-Q=m9Lc?|h*mpR|2UeX!#gUWcOBC^Tth-}eU%WRQP0$Jv7<7>etQ-Am04aNZ1pETuf~4ZFuUC3z)wstNN2@xW?rgl{9)Cl zHnzAJ7E>y?b<%71c|FWt_mp0JcY?i5NXBc0yFdLQ;_Bd4ZM@AlJwA|a;Ci{o6JYMR znFTixpC|5fuLCyow2}z0Tuj0>6)aBB(UUU>K6VBe*sj5Z70LMMGFg$m6SRx0ziY;< zuF%aUl`N6Gn5Hf4bpG;w>T=|Br3}_uqwS+}g+Vh}@(!d%07D{;zPK%w_RKQQK???b z-p8HDx{zd`|H<`4Fefe1i&n813$0Pcy!z<1(04$u`LjxvduZ?tg}-t&;I#|G8Zf`B zlqCk%7_zaSs+ENocoT|CSgd&W6Fjah{4dv|TBAAvIb5yEK!pE3^`-WDs`h@6Bnne& z=nR=xQJi`D_Q{b^)k|9A+#uOB0S|X|a>ZMQTaq`1cRZ9$Zw5~!`#O&y9dxzyt6h$U zN}iuqRUyz94(BX{FSW2nJ~fyLofd5{0=Y<3p-N6OE3W6^oV9@4A*XEIVfaw$*Ukb} z?lC-yjy%CwH7Wdr6kZ~RMx(Z$%09tx?A> zoV@uR4Riw)+YHWJ0Cq$zx)SIuWweLM%=#C zV8m@=5)%;}EvuOl*cUT&6zyQvl+2I>dWnV6{ojG+jr2DLWpkE5dN=nco8ldj8FNcr z*2FQ}e_>@s9p{6Y8?0DDRvlbazgtqAEU74=w=Z?eF{9!c;$M3H>9M1uzO#ya*-ZhT z)QOy*QxPBHUP? z^k+cC&~DyWe*Wc7Y^m)>Y+DskC99HK(j7`Acd>nym}b$pJ3+-=t661Wr{Cd+cm_>Y zJ1e00hPVnG73A|93KMR_oP9q{o(+^OJ`bW%;V3Zdpkz%spmWK!nG9P-{dkE}vNPZ1x3kb1-@ra`^ZoaW!W*U6%8s?sr&%WAF+ z;n#Q!$>?H_9%!ZmDxH%hF1l{Q%zL514+Y5OvPD6XML}B3(~@Z0(QI=`CAP{b0`sBb zZV->_ptxj)YnN`dLVEBYQQ_NPBioBc+r4u$+8PRVC)C|WYrXX1NnyDpNl{=tWFf34 zK&mS8fKZ3lCaw^vmkfSSJEeF(UmIVbQ$x$7bBafz9@0SGved|ro$FP)%YLX|Fp;_tUBde)yS)3pR-To zed0TK3WDq|iYGD>IvP;P6aRO764(m`F^FX7=o_3)>pDyBhA-$u{c~@?F|2TE#Gl1w z@zXVi{1s=9a6RxEkBpScsLZHLY*pyuctPB8@2kmtjexPNEjZvt$Bre8@H+Lk`LxFM zCllQqDw_^VeBmjn?p!H56Q5sHfSrbH2_Ck{@iC46Jw?>zU!l+-NQC+UFXw)}>OnnCGAD~t z{?(T(8mY7-QPGIxony1gvoF`{^c^&(MxuxcD^=q4vhbzXH3R11g$Pvk ze3*YA9yy{k5(Oo&-Yg^`OyzRWdj#%T8=cS|zOME_y|rID9^PLKnJEvJ{T3)u8mLtz zp{EDt?FPYp7u)94%2HwU1s31PICovgvs^i?_*AVmRX?YMMeM);iSKDAg}1N|i>uWX0We6Y6KWl)@yD&x)ge z3DDQ}zF)2+!AWaSi&85jsJ{$HqdQVn*ModnHP%+;B4=ig9OH_9>ns3b2J$tTG8eN= zppsp6(n%$41MY?WQ?U<5M}<&-n%|1(U`9<6;}(j4+2@ zdYAV958yC87d~hAy`R8X1H=N}NTC}vcxH)U=@hHF8R!A_t<(WpY)U}*483z`l>Gj0 zy3?sFbmm%VWPE0s({Jy}n-YDfjlYamd;FpKQkIrXVIS| zX%fd+wkHn|LqnkOjD!MaF0g~J*Ce`0t#6HvoHz)Lzp9nL&n+<;I@J%g3N?c@I?Te= zZ*!mNLji-NGJq3zdH{V&CJh`5@GD~oun`YCs^>Vhx?Mlz*a>D2G zpApmkFTc#``~nwj6zmimhz3STxBIKz&M2G^R)opV74;Is`#hg5f0ta*Jv0hG_*T!x z(_osg3lgcDMY^3vvO-FWX&{*xwz~6Fl$}JRW>6Lty#ibG`_m1lgpEL9(#=fO$)5bA z&G$()E@#^876Rev__`)5_>(>R4V?RX8HNpo(UK`3qmG)p6!{J zgyd{TJ`R|0_# zX3zs-rlyJIE3`O3g}mAh`DlUqi?smPt5g^pZ=tJzUHV1_K_=T!4g zPez_{>0Itgv2G`yweg(>RafJJoB{~_MJ*o1~bNxjH zzmPbevZjI+)1V>4$@ynC|D2vS2*DevW_yZ6@Gvim#1Lx>8t?M=0X+q-~G? zz?~DPyS7~hZRA31dL%+JBA)-4vR-&EB#p0oel-EIDFJ6AoKNV(46Ez@ugHfxK-smL ztEPz}U=FhRm@Ave@~lYVY@xlq&1x(jP=IqS9l^9IUX~a^+0x>=rbbQaMtqf7Q2vjS zQxU*V=#;Gih~mb){VRXEmj0P+8^5o%!9qE4xHxqRUj9|64@I|#e0TEZKV3}H+TOYZ zHDzh?63KeSGs?`8+AA^M#}>rcNP|OS_V*w0Bvllc;vkxvcGCxYm?qZGAeDZym%eBK6~S>J=nI(bn-0y`J{isIr@1c)^kOCnu4Qz5|)9y2<{W}Uccp^>J7i3IHBp$cPi%S0Rr z6d~Yev>eK0z+c47+4pUk^G0q4I@h%uhxN(R_fx*P9_#2obA*VeziL~SPF?iU2RL$9 z5#41ky=KoaYKJpT2l0`t$3pr&&(f)0bfIN< zp7M+6zmI-mI`(VJpWc6P@3I$ZapTZNO|S`7EU8BU>Ai zq-7MwYmQHCX}X3fdug2blWBE9DJsWo)j*apBHP;sWC$N5Q($lnpEhOOZJa}-OA*J> zflLB!P@+{v<;XzglLsp^osuTcSgI;>1mg2XA~ZB4Niukev>;BA`j%8u-6X)#%d%!i zbKEI^H#C*2!7synksCB^?l`t!>GIilGR^?pZVRIIZv?Q_c|s{{e(>!Lq-S>iKE|LL z9B)sNxO3|*WCr`81KLddb~ac=;Rhjb9IyIoUe{j@@}y>H7(xL_e=p}nE!kaC|5;TG|Qq8 zkk2)S2$Vur<2s$M)u;=5g>Q{&%Uy@Qr( zW_*n&{KLcwArMy%aFVE%5~vj=;6&n=Carka*ZYQ9dy+*&Mt%%2m-wb1T!fl23uAW^ zs~4ZXxM}ldJA93Ac{Q35vMl%KK57CTNs{6}H%vt~ z^0oL^lYSltz2cfRu4L4v=Sql3c&Ui@;s@jF6K`G4H<9!n&b9Ra`I0-oMXaK4`GY|_{J#H7@~`%Onv$U-At5}9 zizh(*^PldLDq&*^hMG@7%M%*@dgyz!vN(6WB04eS(G-Bm7^f|R=rnrcC?2rC@>g_6bkWVd{+0XH(J5rzwn4Av?rW9W zL8_j6tg6<~&`FWD05f(gg5EbWlwcgE35MQY65SlgH?83$4_w_LMLBR~9L5l;4@cTx zj23rRSFf<9o*`IIt^DRVTzMM&Bftj+bbuuZGaOtgdJk4SoEK#igpDkoQY1>fgmR3! z$0c5Oy&+@rkiU3Ep$B-_Ivvc|Eh#{Qmo0*qkBf!9GHKm5cMPj-=2>FMp1(oAE|%(w z7EO~j3?Owl&6i|$i4p(W4w)PO zys-YhKjMK__h~G>C%xra*IvHKbPDqnI`W0WXR%3|%NLj}*A`lR|M!xC2nxxpkIlNk zwgz{t06AgvjOGNNt=hB1tNpn{&75(Kj^o{TWEgXKb+Mk&oAh&Ym9!Lr(+wKdclBt` zlNq{?6DE_BUrCi{io=9;vxUu$b1-Dx$`^It}PaoSp_-LZF;koV}rLr)bl#M|O!3R@tRpYW({CjaR!sRjSH zB(rS%J)BreojKpXx|zE*;?zn1*#+u=+3A1Yvn0zN7e>YU+?{h)EpOPKS&g#WIeUp- zqD5V|aY@j3x4{>T?gg?Pi;X98fIo~Gojw{gavYN6S5|nrX;UW7&8cT4L-f16oG67^ z1Ha>i5PHkVsIY?qa-tOSFO0Xh>y!UX8T1J;zGTWE>GZ9q>^jiC$;Q3wATIbAzBK1z z6-)2fRv`D?aSio!C(@;Q;V@tszAR}^a;_yP~>p{V0`nqzugT(qTF@M=m_1FY$P z*GZn&KJyDfSKw%MH`L;hetmg@_W8_BeM zYYE&i-^;+U zV1H{R`bytemA&9XKX2vMFX_?OFT2)V^0oRMGieNkLP^woo$SXQ-^3jL2hYlCZ~wxV z3s1Xvtt8mbDsa!wPHs$6+=3leRb=!&rS?UPcPo}o$w#YPQNU8-9XLKk8zFHIhn1?9 z=?DG;{5Sh(98{QNu|T#r9^~;ZN2o(qebTDJumhbaE4EK)+`e9=G)%Gxfv_vKzKPUJ zi^{VYj@{t?8NH!vCk{kYf|O@KYvCcCJ|Qv8U4?Qgd(K7W_&NG4t`c5uYA_2s)1%8MMDMa)*Y9 z`lml%Vq>Dwq13fjde7gp(QYjeh37xMb(EDL8n-0W@ zWC%DB@Z0`P>61&8i$W7+t4~o#3PxsMlgQt`0eWjD)qFT0EmH7O%1DmQTo1DfrXw*; zJNb@^5w6-wf^74BG=+@v4`LaWM>ua;0D8>KsRWY5JWDfaK)MJa<5K8xSZ0+a2Ql&uwz zq3gd4(%tfk(kg;XN-96 zgP@H7ED40*CxTj6CL0qfHdzQPnXwMb>^`4WYq=R)JWq6a-bABRtHtelGgKP!m$Fk9 zr)+>_$;SNYityF!h-KT7>Yvo=QD zq+qZzPn8y>3mHthX4*O80n^i9)c9%=q+INH6FeWtS3EOlLP_gGicJ45vTjt2CqWVJ z|G9xj=g)PU{T@&#{rvIt-qqhHM;@r9Q_ zSxRfc+=4yrAP9_LR4hnQNSka>XGQl+U)f)IZW@LY-g6w%XA`bf z6a=$1$}O=<4uqb1R6rvZRN`77>K)r8&E5v`-zm#%Jv`aE5ECIo7M@r8e2Kri#I|4R zVN)Zl$)-u}2~l=h<2OG2%yD3VaEpUI&w~ZBD*y;CcE(I^&bR(<#EaFEb^P@Wzy*3k z`W62UVgihEl=w2bE$`nl{KBiIL+=R8VE%JaX^8RSWyvM}{~m}9{ca%bH{0a*w+B^E zu;4t`ZW{@og6>mDzsWWQk&tWGF@%NP+#L$viNVteO439sT6l zIzghD_5QDNCbdE&pa>=Xc|&-uB4-2!mrQT>xmr&pm6=j8hRm@WB=_nT#1M9c&?0O- z9&1n}((Z%5TJZ^>g|O)AH969xvAqiu@&1#qk|X#OYp(X)R+oUoAe$}ir-e)9hdyLf zCnxQv0=E=xoB@5BLBwSn3rweh5zXH~yW;UN1K%rb*WFuw7U462cZRngctqC+C&3?N z5bWi+ufXcvwD4s7DA@0prq7$xi_U&t`4cUoV*4_35okn>$uj948T1cws#*peQz+u zzfM<+p(Nul1jm^pZic!CFHQ|MwG4*sba?)sN0m?lnzD`HXQG`vW5U7hzITN{&Kig+ z1s)JJE}A!z#b|aU5X=0kT!u64r>8b-w_+lwr#T^?Bv3Phg3-wEisfi_=dUv|Wc3w(nlYI+P*M`zb<%&5Uw78#v&7ANKt%LdLP|;qHaUNnNln+9qa+aC%9!au zJTV^%NO86+!1kha+1KV9E6$WqQu)5c5&}Y?a2Ooy3fMA7 zfXE}HWX3VcqlJe2UuC}dfAF~eb2$g))Hlm-#3&@Ezf?&Us7sVibsCKW`f0?j)$_s_ zFRSwQ6g`6FtLdM3x`LkP^pu{(xVDbsdyd@&n&Lff+P{-|FI}HWq&>;Vf4adc-?FF) zFKF|#E}&x}bkQpU^jxyeVnl}(A7)8wXA0ruVLGM-rG;5oXK9{a6b^-8zIGMO?&Ox; zuB#0ZN;i*^1~m7O5>Fy6Uj0y$9?6@a4arGG8Ib+219Zj;bJU*mX4Qen=b16 zTUretR$m?}{w!>iV0ds&0@ZhC0bGj8P^kor*GEd>f<;#W3YBR0xsl#?T+R4m1sOy` zie^=_XaNJTA`oY<#Lj^Oma#bX?`KGlw+9@&b_)c2Hmz}iRF{EjRptf^>K&W(Y0R`w zlFFN&U(PGrF{C`koV^7)k&I9H8lM%2a^?0&m2OoZJsUY3iYDeL1eQZ{H5-_+X%Ta{ zcw3*AvkyNvt-j<)E@^5K&~I^j|4aA0Z7+%lF-Dwo5Z^NeaK%Cm+Pn(hHQK{d)->fj zovO3A`L>=7A3Ea5_-u-_SC2XO8UW@y&Q#YC_~OrhSJ6Gx&;55Njpmngd`%k&uMPH3 zS+)xXFmBbUNSeuyo|{WE8tn%MzOH2KnCK!p$b>3Yrx8{Z{e*kY3N+hvoH9HTa?~Vd zkx2rrXZ_^eMFf}g#1yz_n-oa$dzwZ4!@F}0j0?OU&=4WSQwO!m8Qq_rWSUl_!s)Bi z71L;3Tu!Rx)0|}WoN}Z(+3NMML44t|Y1;lCDjqolDhx*?O-I2aM?o5sG#?OirzncR z-JNx&$;n4x-XF-InDR5wtQ(~K#yVo+_B^$LlGyNHhBd(`3)r(_6227OqE*sQ+KJs~ zsDOc6ADRaBN?Of~K>>4=%>NO+m0~{YlaaQf`P8;DE;(ZF-fclwNDn(LrnMuOW9nnw zB66YWdCuK>sB6BNCt~x93B+*!5yu$Nd=WjSi7%xZL`D^!qSnhoq3HyO1nq@ z?r!zpWBAOscXgJZ8k4guUniJFP6o%nc#Yq2f38@$Dz;+8FpB;RY4E%E^>NPHO@6Ln zyHDo4AjNPxhuq`+O^>N~VLDALTnSNLof#outKf5~p^(H*_P5E>*{xV!iDI+pHhW$$ z42Mkt!&zH@B+2)F?z`hOwhQ&>!0{{Gpz1mkujKP*K=V0cmH)2)!&&sht43_kq}6f) zmBWQAWI;Du%w!naH#LI75w_9H_is{9m??iJ%2Aq|p;Ol)38X5d@h1=Bw_(+K(U?t( zNu>G6rFHjVCZ;NHZmm97y9K7UV9p`E>x%M1=nvyUy>%3<&a%j7uawJ3+@aq7f&Ytk z6)W9qb=HDcW3-HlVEaK)SOsC;=dM^08PM*(%QMo?I|n*C+Z&yS_&s)*op9RM#_ zMsJB3Y(PKr6b-=>^1(rWM7N7!Q2lsNUBHW`wl=c$*89h7scv0bb>gd8i=N#H=%M#a z=^OXU6ETA6uj$C;)P9dQmaO^>7;NONT}hP{`aghpoX`AJjqHf< zM#U?KmF$PdhFP*A-8z&ey9OiilU$u@Blx@5*Ct1c?r`YnQjU9*5Ut;-?cY*JHI89P z{%;Uv(ty5ez6mBp4K|k-@b0y}k?IqLGP)FEwT6BP4+-IEalok}pf&X=7Jk=P0hLj! zRrxrQFai^46D{FIl|kF*x!ZZ1&FDxA(oZ86Ioexd2nuQH8p#qIV^1Y)JUUzP#s=eh z+x3cDpLSU`hBo`TH@z&$TRa+Wu=eb*NwzEhCdGQ|ZI-UWZPtw`be~24jm8M zx36GVaa3ZX{G@})%$wc?uXYN?>CVTASu}}`7GKFJ#gJOmX?m>Je3^ysmZ@)wWT%bq9({_E5HYa+N4H`g3N;UuPDwWSEJO(lQp-pt2 z9DS5%k}DOhv1`4Ta8)eFa{Hv7iF8Ncr?0AU>G3g%FtDX@ zv!^&;{2qT`IsnXhjcUIKSshm3C8=V?%d-8tH~{K!+3{mfinFpr8Gixm2lzNnJv_XQ zn3lvNd{`vXRUbT4hxU1dOS{6Nv1+7C->R1tMC2&X$YO~NeTc61r;YiVZ~st)826wQ zc${?~ddrP5QUIs!u8AUl)A4)*5+OJ4T(2)oD;`B$i_$OnY-knI*~9jy^P~pi-gA1K z!f96O$KloaJ%r`kEn38gL+F)y*Zb=5$jN&u>5?`znMH_7aFBFqtvT&T?7<*I|Fgy= zPXMq4k|xEU{q}BPMnF2s!-wi)Xsa^l$|>o@H=*mOi6tg|QC!xHcB09ak(G1^AJ==) zY1S}*3x_R!i?D69nTG!`>p#TJ%hPT4OXAy%Su=YH7fJ~0$Ag*Yi;Y!*(>5c7m1=5g zR`a!xMX3L27plv&mOXpg0G-`@ZD^vX*D36-&h1D~b(@M-#(7M=L?M-A58OJzWSw!$ z0JNn0ghs{LVG%9Oq98X#P{IuOQDSg`SJQp{C!x>Pjn`}(3zf#>y^Q0{`Rbt<;P=FX z5*x>>4OF=8eTRWK-4Tuj!Tr6FWq*H24{iyxKKxmnYxU#-4l7I*0&Jg1b!qRx`1A-wlRlf?UOE8*?WX5k z%Qg9T9_5`~WkC`wFA}EjGCl82+%4>Ys)p%(v#aW+yYnJVx74KI`T6*I?q)!7=#v$< zL@kro>FcvKZebPsB^Z7i)27#Px}o3vR$vli1e#1Oefp~1Tr1w!G$qT6VG+fNiFl*g zS1kpa0iLN=_R4C4B+PzLnIvIr?YFsWkw;;lpTnKGM53Ah3;_13B0TsKNjT-7lcdu! zh*e6?txZs8eM2mn<#Hj`quo=Ocx$U8FP_D_wLu9vO?s_*`(?Rm%^DVKtb2&=-L~nQ z-S;DCiU#tPdp#uKn05!NxoD*f)yh(Ym26dZ;@Wmg>Id-MR(&q` z9{+9#toU9p2LxnJE2pu)$CxxtMv96UA4+}cboa+@yfRF9d)L4$ve?V{WTH)2QJ9}a zR8*86KtLULYvI8ae_4|~%YQk}eVePc7g0Q+9UBJo(JaHn^aiolszYVD#ICx~@RC2Ropp902< zczbJg>MkQB@?wuXVk;#l|8LMF{q~>g5Rc z>#9UtH9j1tY0CK&lB@Eb5qfY8!Ioad#im#IxV6&k>}>`;ZfzR>KNZt_(Cyb{v6@TYV)Ejp9lhW*b7c)C`mvsl ze+HeKu;;<-9m&CRlt44B{EP`U7$KY^?3r{Fq-q-s1Z%H#*CWYyDbF(?xu-NKCTUA` ztL3RIWgp3Q`N+x|Sc*$ZOeW5!b%fnpc{>arka8q2ljj5GF7N-;Z$LNY*Bq<+P<(r# zhE=Ze21%-quM?l|3sJ0G^3+{GI6l#8ZQ`pyA)l;cG`Sck&4=!{J0+is+>aqe}Ur%4H+WdqWv+XKmD|ejz2J^h>00g{UcLX*Wlte#@Zfz zNLaS-kAakF>=3>Xyo?4d?3x3uVv1%sKQk=)%}}g3g9mlyO;Nn)Q2YEkE}DlVHIM~u zG8fvq3HwE+ysB?sKNo(36lF>JG2Rn@5EF@8DnR%+&we==6=PG*Hk*{of(I+*kS4k5 z0BAx1sK18`B?L+>C%V_M$gTGJjmWX&vzED#;KWv(Bui+KI#(6`L#CKNyF$8O3|_M8 zYk8ub-0U>~%#hYD!A#SHVW&(qNYhG%pVXd-T;evn?sc2_N`+w=_eKw2$S(|R0kcn| zS=}L3pEP<(GCn0QHY^5_#gSrU!Rgx{{}m{OF({L9auZhOLRi@6t5%IbHA4XCqbQI! z)ar7mp8Y8}Upx_H^V>lU4tlT7-bkozdQjY=)=QK>d!cCnSMUmrQj#1PG#2bCaH&0j zx-fN`xmP^HC>c)PH1O}6#V5h5OS#A>alDcY84`L0#?xkz7!vQSrv_|HPeg7VSTIH= ziC|HKlYcPm;3ivw`bfKRgxWA)sB>9|2S-5_SA~bj6p+I0UeLTZkQft8W)dn;;t*#e z%uA~*_zsnntn^#xG=U}Y+Qd`&`+KMDzEhTl{?fvb`HCGYY7Vpk?#G)0ZJR+t%t@Am z&+%KwGgehkWVVLho@te?l}9@D;5 z&j{ME!ee25eO%=TCI<Db&56D~kI7qY&xrypFmMoYD6r{Mus!SE3UU?(bU(y}Mu#wf)zLalnq}0J0muRo z)M*$X%eR-<@UV|(`X!eq4Q!i9xjp5Jx}LCSl(O@`n>LeXk67;g^=UIJ>M~wrsUD{kE zYe{nX90OxUE;E)FR z8xHw&We*^$rLcEnTCLGdxmP+fk;9Onun@~Oc~Rs0HdxdOV{#Pvp)|hwR;aP+IHh{u zs!Mc@>!3mxDJGxH5b5WOavJ>qwMB%4sL?<=FjKyT(CRv;ua^I^A;H$mC}PTrptMNF z^J2SZeQi{;$o-S!$W@)Qu0KCi3yLnxUC8_|V^|{`^*Hgee1$&Uo-Bn zbs!dk_d5?Eh+iD!PCtxg2)fjvNk|7wVUi&{J93yQYsUjaAGV>1zFV|8PjTk&;7N;-|K#nLWFj z^=f`EUEtL@?r(G&CJ_-xATGG4?~trS+>Q;&^%`x%cA4nbO$svz;!R{l2+OdUK(bh8 zPI_zoJBBvZ5&~EflH!8hzx}VjiSw?AE?XUQ8E_i7ae(>@O;J5pfuaxNwL==K6o~7g~USA0T$e7Sh zomk9yFk96VN3m*hIJc%+P7gJ4K4)va(z3)NolJlKCK}y~XfWA}V|_Q?Y3sYPN*dG0 z$L5dZ=SpgNh6zvG=;n+C?Soh3A+8hj`Vu#=&H)OdE~Xdi)mjG zX_rxY|31Olr;W^SDL zIxD~Zo<-vkdhff>EBM_X_2U75Z@$Db=~+=tf}O+CUuL)Cdlb|D7^6&hD5VQvN3=e; zSz=Kxp_&h+m^+gz#J+K!s`w&%=b+^>!)+{Cg9iHk=Vs6xk@=(+VuS=U9esnX1Lq z2krOohtTmIsVNAUO-HFR0W28Q< zB-R!dJQkmy2w8!DJWCuf9G9$+j>HEJWVC5s95;aQp0uilf_MD-lE7tyxt&2eY^R32 zKA<3@1klXaKyr=M@~s`1<5Ip6)x`inyVO(~TebZ#QLFxuf0=55trr6eGQY#h(4e}> zI@&g0VQ@0!oK@t(RhP&#U+atRcNU2>$$5<9OE#h0k_xw9Kf)sizBGB${JoohAI02P zDZi=U7b{E&VKhLCEMAWE#oSVkG19@j=GK@{R0(T;aO3b6OHg`c*nW3RZ(+n0fCxS+TFJ>@b#}wJS z-H9TPogDXC9($+CJlw&!`%#U<*u3VgYm2?$H_`N7`DFaIh~a9%I3s$-2Q$iLIyD&k zd==3erDI0oc@iXfDG}?Tm=Z;5T(y^d#NM3tOY%&q_)j@D;W+Ozu&Qk5oquMD*B}Fn zLSHgpx8RDw$;XE~(3Op~9A6K;tTKWnrLw;X@(yTQIvC<`Hazv(Z*92_;`q7M8^y7^ z=U%+WD8x_|2Ii}Iq9P<`Ra)QFy-X5>qMffrZ?RfA9U>gES@r5)I5~0I@|q4XaNdjl zHDUtht6`tng$)VzteJT1K!!%R4>K@tH|E*_0wU&on!J@ncf{Ds!e#%Bh>! zx@Q3eI~O@6p%yUgw z&CJZd#TJ~?vM=9SKF`wg%BbN=z>}lhCR|sDiITgiQlib_%0w|Kd!48g;7TB48Ud%q zAmj zmSC=U?og+1Mq7y~w}NNm3MW_|fhq~Sdb zCME!SW=}Hr2X$}B%2#<_>OXHwmW4`?6DnLn&VWUA*td6$Yg_5*Mho>d)jAb4P!F;` zAn61Muoy_pkVAH&Rd?w^-Z8!0g=L8Paz9m0p_qn!_0}6QF_Saj7SFmdtD;Ec1cl*K zEJMe3dII2koUWITCaTwTP1q7c%MIF^GlaeQN6Tm7hz&dftA$0bei0a-6-sYQujl$W z7gD=|v$3-~vVh*QQ^}brYe-?}?rlqtL3kHJSGIIxS@%L)Yp)Cgq-u-Bt2xl_l zjb@R{C+jV^U-aJT9=qF@zLgIN|GHX|e3#R!{7qjrB$A(izDiNzroKRp-c#}X^I$8J z#E=s{90CF2y7pjFlKc$yx)N3&7h}|La^Zd1M|1HjJ(F6^PprNVSLxl(7n6!r)ZwhJ z`kZg-Z&GY5FK@u)J<}vvftE^I{r1vRzDbip^q#n~{Z`#}?zCp^9*0EL1m5Ez_0`$g zz)9e`E|Bd-sN@`X#*mIhILC{v5P#hNg=cS+!t43FbHH)0WHw(ae6hy+n)32s7E{Ag zgsy^ULr$qvCM!^`r+dKx8yg z^1pW?$q`y*9>VJ?{P=bAOigozyK6`~oSe${GLxFJNEW-l+E~N!YMRYy(XKJSx*81; zC8iHVmy_ORTvENJLJ(Z0W>pN)ogBj+yHENqvWkTpKX;BqM}e)kPb zPiqTwk_!KwE)_n0v=V-L)R-5#uLr28`+3uFh;lK#zXvG$GC#f}oh zF*l@`L_eieRMO-FmK&=izeKRI={I2|Gd?4xKm67>^SkB2o3q;e8HoguBb~GJ(%{Hj z@K^-0mruXkw!yA>5MlyEamU$oKM8(hdA#oUw}-fewQIiId^KJMlNlT>M^BzWDxG2p z`aPuHp~!eG#HX7S0{d!(kgkBm48_HxX}&KGBW9WxPwOpCVMAnnm6K$(Z$6a?&gqS_ z&Mjw}SJxip!it8zSI7oldk{Pq$^Ebv_kRJSIaHk>T8d?+Pw2#lo>dX3^T^C;KZ}7Rn@VPsBw!7HK2nZ8_A1ZGc7rxsuM$9%jO^p{r z5kc_U)q0!%zZOFKmTz{YQ;k*=Xzx>rSyMUQz?+%x*PPN{dK8_2{ zOqH;KMAAzJ%Drp;h~E*|W-4ShuK%`T`>WCYjX82QrNvi|7bo<8n*E+JUn1ck@6`Y} z5C5WKG@nC?&5!&TbYuQ>i&vG0kmPK$QspHA)>CTj_@va*Q4>I(Y?K`S z5ZLeN(mO=0W@mh57G{@mc$W#w+uHH8lKNcmFr(b_g|;gbOd8df$&xmx9Xo{1^G&9)Hd6SgBx5(Lv$kBlb+>`eRzA_U_`egdC z0Y{TOr8!ycFog!Ej^Vat`=Mtp_YQ6)$Nm1<+9@Zae5@A*OX?+fO~?B%w(hc7?UZ~Q1= zwr!{;{PNwKw)OJrF57*E(09(eWI5Ke!);rv-S~-}$$jt9#qzd5PZiQ}@4h zc5Mh33=9@Rbfnn)A}n#@JWuXh`#B7?8MWNHoI1ukBI{B#+q36=O2J;QW`Ut#j%{E= z&_^*CmFal$(+vzL7#T51+%`JFmWqq|=DW<9QFa`P1cUPg;)9%6o&k0LfR zO;cLr`=?FqXJhs6@BS$JaOW(FHayeo&eFFhLq6#_t?S_u0|*lnA-0uLr``8SqPlFXiV&rO4!6?L|mwGp}hZO@mkOg0X zfE3#^DSn@%C+R)4Qoq}N^_=1Pj(r(SSUNK4=!Vb;W&&1z-CFXE5X8$HyJWtm{YMj} zh7s;Zw85v-=VRWpAC7TOb{mK6yC`iQzq@*ppBBfn7S}sE#pGvF`?K6)^`|fN*?du+ z9W$FwKdlf(378J43zGtNRnHcGhR~*62{~!WF`rv{Rbe&o?R|4%J~Ibafzdlq*=zEJ zP^?hm>)@UpjLFNu!hnI*gfAP0g`(;HokgRis-Lj^+71~mCarS;l?j@qX;n8WmFBvk zE&>8L8dM+xfN37VBEgK{y|;eju{A6W5+V|q(x#R-w=KdM_-1E%y%Humx5kSC>acB! zQ;b}(zI@Y&|9NlkNQCeDua#6S1pNq|+1;p)b|t z&*Ud(piyfZm1)*fQ}<7AMna7WRnP_Iext%bVzz`mkjU%NV2VfwAmTrE+H(AsE~RFD z_R#wzi&moRFJwD7YqB0=tT6$~95JY4O1u!Mrf zDb=>Y3Pz(7JaFQ2PfU{Vg*KC+Bk&^jUqNNVeh`ff(vNvLyjq9m(fD!s0sQ?dA@bSy zY%`AnY@(mChf!H@o_b{rEzMNF<@fk!&4#dm5LraCowP6<|B||{$1(nJS^X*g`n)wo z?osT(Y9QY)1#cN9wup3}*Xf^G=RcfnCfYAYOq%vYmdT<*dhf^N&b3~!U?22_!dc$V zd@@-|Yx84Y%naJ4ysHSr*YCx!#*GAzb1%qGmeR@9BP-X;*1yw%Bk<=)hK%9g4gMF_ zKhnM3V?T+=V0dl0iit;K?I-=31J2QN7Ub=?vCvg&H{6&l2M_(lK!u04Rv&v=Ff7Z| z&%C9Y0_6IS$qV#iM{{FfdiQ-dh7IDzqkD-==mi0=nH9##F`E*?8?r2g<5l~BVjy!1 zq61vzDSYK780A<3d!t^kQXFw4HtExEaSXlY%C0KG8;$QB8GB3dfvYdp;a7|inw3qd z@7i0@JPcSwhqPSHOzwcn`Ltj*P_FU`i$uIV^Si1xRh9^udT!vjs_%h;gqeV+rx&2Xgz*kenN2$IKkU zt0eZU{cSOrQz87KJ2su0W1I<_D}kShk|`d%caQRpA1Zx;qTsDjx^6EabLfJDj$@ zvJU|yq$aVB3f~FGHOaEMm%~?>(8Y)eg+IAJvS*q55}wD#v)tYC*u3UVl+9o4n|-&L z6W9ZTdo0j}?2_JCt*06tZ3E%4!HY`cqa{1%J+hA9`j7Cwr8u+I6JrrG{_9 z<7Q|IU6(N*-@}*Xib8GD4tuct=M~f4L@UK5G|F%>b z99*BHxmW|)G>gA!?BwF|x%uQ|6h{9f!@PX{slP`Nt>aM6dDO?9aqq1Lw_TysLT-Q2 zj5dRHK?(8=MBbE$f63bJ1?3#PFQoUnVoe-@V=$O0%TaOV_zM5OS;_;wI6 z!wo!D?(j{s5imO!dtb0wy9>0@UoC4tz>;UA#T7_^#_Zp>kpz;u+zGGY_vjRB#UV;4 zCq{?t8mi!9?s938gA5fOB$lPwqnRJ0UU=;^9EN!;+E|;~I-XI=fzY3P(}IbeMe!tT z<|3uKe-Qd2{gq0J*o@?37Rk9tvM+~{-2LaH_jF86LccWmmb}^3;)icd4lpAen$^!o z$uqK?2Q4b21M_}7+LT5ML~xAE0#hQI(H?pasNguD+Q2fN?MBXkeFPM7QVs#Z!EO7KHW&-H@gGS zo_>H{L!M~poTSS;Y3M?yI9&yzR9(O(1zG2poUxRHXUf_S*btP=hA&<)Y8W{Fp3$OU z30wL45oe^v=I8J>04d9@fB)RoU^!D&z=0_HJzaU1Sw5WPc!ZYooej85Jw=Wgt~!5$ zYCU*f>O=Ypw_g@`OrN6Q%~pi9kK?Q1k!-JZPUIz$J$~45vut+86KHJ`H?D47pGu>W zi;2OAPBxpviD4ny%8-?T0f&xkmT3S~yIVhzAcyWHlgoiOSC|jPUP+Esu;eDZ1)#ID zPe9M;yVSL(Oftu`uvg@U7licm^mJpqh#K7WC;?mki)FL=w4~P=!1>)~C$VQkm~3w} z6NvK}akfD?_sjwp0-P)hJTWZk zHmgX2AGo>20+d}>FwMNw=6+pnuD1!nP0#E6=}DsNqjStdOgA{L!e^C=k`?%p+|Z!% z4O!|WlYuSqM}@FCyb+OrD0Bo8b^s&>NC*r%^u<}&85=E*yfN70J+vpetDsY{h3Jg=s8;8Gsj40U=KJ% z%d3bK4_6$;WJ|TT#y(W%el$b>Jt_|lfWmc}(!I~{{q7QXg9K7^O3FirLFOX$Dl{u( z^{?jq%&1uMPGH{AgQY8eY%zK1*jxbUr$r>T;Llic;`0D&WS;V5B?tRW*H7$@&5(~l zg|@t7`0Vsyk|fcnO;;1r3pu0A?}}*FxIyf<_Nt}2&C;Necq=AX=LMkA1PuYrY=scsX>~NlIu>$#jx} zzJY*0R}xN_-$m#oH#)8x}Q);X02E}uw;iNW(eK{sDl zJE#rFO20#egpif3DuTl#)SslaOx~xDtn9A552+%}fBufu+TOkkE-S5uf^Wm%+n0!$ zEG2tc5IIO-iM>thi~Y_P-Z+4_fe*|_XP6NJWg6y(+?!T|_QnJ98C-oI!Lq1Qg;mYB zDxd8Pd@KbXbwT(CBIC(yl_-*GR+GU#_;i zGsfe$A4;z+4*R)ugl*fq@Y;^=!ds_N`S!C1V)wj3oYDroMe|K90lK=Mr29M*C0t zx9`G(^h>l?)~Rz0#5|9$m~{`^qE3d62CIo49`mWez}s&+%+!tDB+wW!RUkVJ0NWzjy|D{>)F~P~ z(Yc9}zkTNxrT?(yZJUkQ@fC%CZA@`#vw(Jr=1rLhq%1m5#U!jsYop19^GZg8D8TBL zU^T!3-P)i5%RnqmVpohg!wEblcLD=zCyJ7)#3!B`xhGsCw>=PWPJI_QR6_Eb{u#b) z6C(jt96nLXZKSB`3aTC#iTPP#jSR*4Zg6Aqiy{JpB=EY_Ehk)hl=KxQUJp}ca*hSK z#Hj&vu`P$1lZ^P{J5qLd>yyImD8aVhRm|c)L*9(fE{W6!=|SZqkxFwE_5(M4esa@i z>-M_FaGx}i|FqQEPUL=8)tOforu|NCIa&UP9hP>{ZQEL4&a3)zz@GW%Z=Y#pY~tcT zYKE$MDzFB6aX}mA?a)6o4?a>b0XtwPR7e1wM%9Mq6ck_F`eMh!Kw}awtPi_!EU?&G zyzupFCh?!FO9|E%U4@;ai=3$(w#i^2IR=1*RKB^i^KVAKRjW^;ta${b9R-Fe5?WC% zYvDCvS+!?9e>?k_W=lt;&9sJbz+6@}^5J-4y?;Q6!9ExFL)9b9SJ|}^R(gIgM)8ba zQTSgoJKS84n&(pIjAYZp&zvwL=l?7o)5M4Wsjx_!9F7*ifT%%37OgwQ^heTGV`?$^ zeQJ5q{qpIOUI*?9B~c`BMRxu)82`H9P~#G8vZ|y9LT_Hmt4Kt+fWr6#p*2^+f4_Oo z%m2lB9TcikA61>c_L?0oY~ejCtX363Vn2R6t@@)h$!~4FysDInYNJ2GcsbR5x^Br= z6Sn52B>GO6#;jkWEZ_j;z#xzWRkv1@kugy^yy@_o*OubcV&3Il`>Vb?a=f$V)c0Ib zS`bPJ3|HTUQi7ZUA1b6ffpg`f@Vg|z`To*r#nlifoh1ENR_avJ0!zK7>rEZ0%r8H| z*6N=A=8A!(gz|Ym^-U?0;FHHYt#O5vFE^&!|N3R(Scl;am)Epkb0h!8;)1vq(c=B% zDRJKIq(%QxnH3Q-YasuG0J=j$sI;l|CBEFR>waQ6SG|9^EE)lqf4KeUNz68Kg2(We z+2;ghX5u8_dEH4lw_~uaM6xywjpgH59a>ZN57##wm*w)4mX-ICCfYWL7zTTmgnkb1 zj*8{4=0N}SM|GI{4VaJ{|4T?{8gDBfYY2;lf@?i7P=5>fe>*>9Z8C@CS3hpbHdZ;z zmX|pqJ%A3v6z{!veeqM>`od9XHh_*rBg9}x8EvW`1%5hI=DYrz?|7hsp1M@kAMiR2 zEPFAwsIVMY^7x@jxmdAX40p&+ti%Bz8d7Y_GDB;%_BXJ1^rnad2!R4ffrqauM>bnT z*T}CdwTTGCVSXC!3Gn!GoH*9srQ~b~t(1r0r-N^7_q#5pbJt}?Z)?T-xV1TG_|Wmm zeYUu%mtv2!QRdmpc`pVe28u?^oGhmH^;EP7kGPoRi+m8gzn%$K;fo65D1B#2V zPUz{Sj7&6{%FVK@lr$Ecf!!0&@6*Vdc%lzFR(aF02p$AUrjSQ8f8pi@4$ww5z7nlobJPJMth$4&qh! zk^N8nW{-g?>wya}_WPpxIh6jHd+>Fl4sQ+p+ihOwjxaAtfQ$$q;B74aF%trWk!F+Z zZz^O})sOowZI9DrExoz==4j<0aoA>`IuZlXUo3cU#!EdN-h35H4$J%L-9?5BBYk2CWWG|VGa?=FvgK~B8TCR7b%zf%EHMIeYTuOpaiR~n!GGwZ8_p}PUA_ugLg z?p$LwpyBv38hRa#XWUsbq^c~du`ht|01vLx@rLy^GiUdbH7>Ba*vq{sfgXz|j(yyDlvfTlZ+zs-0k7Y8 zd_NxQuO`-XebB?OoaV9H_Wkq1*S+Jg2r5Gut+yJ6>wj2)Q8(KV7TftI!sEF~Qm|kt zmW64Va)3Ho(%``$wKimDUu~**%~4lOA`lM`#=RrG9T}{u#fy;ufDVeml=Qn%Jr5mn zBZ3qOz|Kuc((Tn?3H$nf=ox#l64?LTlMd2Ux!_tJMp)Kl$vlTKN6Z3ZdhQ+Bio#XW z$|-re*2XCe#REijLUgd;AUi2DMp9{jtodsCb-D>)AJd4~8gOR8c=ES{tF9o&98Ro` za%hM5?`2N)09)m5($`4g;SuYsqa|-0U0ol1=JUlG=g%WqtF0Qf0%Wrep!&-uOY%^p zCF(AH-9z3)a&30@ER}shmZq~5+XnpWt79J5{l)WN$F6e4er=3q=+Q*Hu|FXc`?gI7 zcV-i7T4eDCv)y~7B{I(I@l_DXY$o2 z2&T+ws+h$C-x1+S(8gifaDs$z)D^I%1!{?+_nE0K!e4B zPsM>ORcDry2%OtDO{sl3M;T^r1<>1;V_zc5uZAxMjxyO0g7glnEVb`3VtuY`?p^=} zW=aP)&5cYn8;I?5Y}a#r*Fj_-t1K|gll)n0?OeO)0dm^;M=_emRLfde>G>N9c2ig^ zoAReyK%945)z;R?axCKt!Vx97*>}kcN^W)MpC{KlwkWyx+X|NWTP0L8i*Di4x;w<7*JW z7A{XH9o%NZdlM_R^XD`kL9kRX9rxlC1Esn#FW#;m*zK_f^<30hcG| zy(WJ>PHY{Uj+vUymLx7*vdOHkHomHFjJW7-%r{GUN6pWPnI6}&=1rBAT;%_d(Qr+w zP?PWr;FIv~fNgr4?MeCHqufv8E*RIyDF!BvSr_t>)0+f|F~F zN6V$_IXbHXs-D!;Byq9dLA)_jy^U|{w2F)iehJK9n5xn=0uWWd-^^fM>V9JPRSKCK zUGr@mG7bE0zkGI< zfPogYt`vN$dTm7YUflh~I|%_hmhaY6G%trHhJ;OeH>{SPmFR!TIXAS?C)F-ShUge4 zQzkDgcBD(!2JHq8W^v>`h*&ArI=GN;oT@i)AOU4WV}9$Y#|K^K-4EX}<;fFa8@WN~ zBtAZVIWET`nqBD0U4{Sm)K|CJ{Wi#>2LVKJreNO1{H}FYEJ~YR_(mKFBK^h^?6nKC2pU*7S$(XMY({-oI(ux4rbnsX$styBQNke}DPko39cA;t2jXQ338EIbHUs+h|zl-6QE;}I0W zQXy{EP4O*NRMR@^8GY2PT9E0Ps$6GxZN|EF&kd4@a}+4%c_!k0K+tlsh-ce!*wo9- z9KyPR0HLq~zx732zEL*%sd;n$suUt7_s(k(s{vv&IpZVO@UT&A7m@)*>xFd<?gg@7hIhk?sH|Z4j97KqB}4 z6lAPknc+Fh1z0OtczqjVY=Gc9<&WLyjaa z<|k!!iJb#%2-fgpg2N4uwNFFv$Z}6p%RWkRs?BAGq{c=sY|J-Bghom_qJ zfZYzvU@F{$>lHcn9smvgr5pVVfUSxIF%JWf2bKZVMpC>NO-%5>IHAg^h>16(T)A2i zAs`IwP|$Z`g>oBhRK`O@2MIKgRl=5P2WPA70k`aUwdt)YY+0Hbo_>CkOzsOjrAl%guW7 z04tDN#;2D(Rn>{xBSyMgOJvTUP3Lc$tjh*sN+vcp%_}I-V70w3mX;Xqv+@?^-%cF2 z;$e==0YBr}wNo!RcgoEMq1MxN5Z)nm2ahtXA}S90fJ4qX$1yrk$;Un+l=-?&{U#C? zA3yXMY@95!kQZ<*gB*~J`4?9f{~AN_(Dsm*4H0uN_C8#FWkjpgpRJFq52ltb`LOb} z8m~DLGSIO$crC{$t<8$F!~5_Nk@zEupU*39$#+TV8~xGt4$@RBja*w#H4=Rp`$Fsj zRt3et=3L#+To>IHP$9xJqnDBM`j`{B+0h!D8tbcDgUPj>LwElLxC7XCiQ${$##-&N zr;9K_@pD1zi@hMmGExkeT(WUV1RwdiY~Em%eJpi-4;PC}$TZWyy~}iAO;|hyfeF5P zVLuy!*tMtxF-jSOO0=3)5-^(aL`yVYbP+!$$3l9lp8{Y@M+~z4b`Gy{{C@2i7CYycX`3a)NBWgmsMp2s zy%XmTytegQo+{t1w0IDCY1(RaOX^LU-t+bbc8hYZ9$gQ6pQQ!;`@BoZe@m~y|7>m^ zMDX{J!hIG1rq+PhpKj$s^52v$SdJ>?Qyii;r+mn;S?TvLw@^_vQ z|C3!8-=hd&ob)^rDQ&8Yu?3Hs%3?yisa?j*?q{(gVzx#eA|WP0@$Q$qK$6ru?W%^-=_Ly+t<&i*%@@N(x zVO^A##@(dX*y-(2>ozCYjW?ZwEX@>-aM(Ty=+vOlBB1>ie7bEjlt5 zO<`cR`u&_d<-dM2*v)XxIJRo4#a=A2Co~RR?a@-K&_yW`s@)Tbc8{M?i4rEtOCQPj zu?9iQk?wgYv8D^9nACh)#ON>DO`8af_2tW?)?9n-&}g?DId`5$xLhx3E&Tf}z7LR- zW``>y&(Dm~dbv>S4&0!GCku+_`v7VB>-uWX0-zhHMFIO#eic`w!5vZ?Uq^PBgZ!5$ ztlPH4_#ShiEwqkUa!;E|&J75eP4d?#@AD>TnB2&uTxzw$opyIptQ@^49+LuA3v z_X7JwLedk%&XAYp9$V^9$I>6uONK8z{Kxv|>vaFw=_gzcyN^Y2Em*h^2*=W^c zZ7oau8k_S+1XR$r9|dNws=2mx8j$dIO`~)I0s?;bzZ8z!6St4H(?6~PJAvlot1wQ@ z?ynY=p_&F=gD;h^-kSVn|M$_F*WR9KQI=Kxp6k(p$b~+_ub#W}#YHI1mk@ zgnO=U$mGm9bjFJKB$?yo`{+bx+^br?ZYd8Q^SyTa{>=`{maaawuu^C;Eu67%P#DQT&AQdQb>n^;A4p zMmDL8?YcO`qEtywulG^m70O>GcJW`sf7npr5P$b6h+KEZ2*cd+QpDbcwH%XwxOCrnu> z1XN9dM0B>)AKp!42ut*@5f@&ALX*F`sEuWgwx*Y^WiTzcI3T8aMk5;Q5Uv7jH>Q^= z84ahad}ZBE2I8!e1glrB)jv&Y2o=Dsbz<507a(jog1osU%J-02uNjfkVWCZs`n`!~ z9~O^W{Tj%f74Ljoq&h}bC4~!vkv?UA2rJe=|BQqtYO>h7)D=H|IOyx+fur>yGVnv7 zmFGdQ8W%yHYfLWc8&+)_z)B~D_*nFj*$8v`#0!)Cy)E5xCBv}lmf=ZkzK%?;ym*`H zpb^P7z9(Ssmf+C(B-zAC_m{&=%x76tUkEghj;+4{mbZQfmTFwGf}|C(O`Tc+`dg1~ ztRenxF7F?14@4hN?&+3GGa=qimiCTM(ND)AD{*D*a~5Ua0jRNLV>fnUsHux1~gQ>98?mx=Zw3-G72q>Uy&z z3<^IP0(h3mQ1wwIce|oFZ3?-3vH$G|Hf-r7-%vT4)0o*k10rq?`iPduwbj_s__!X=Lwr=eD&f%CJY9%c6xwt^jjz&A)>67~3k! zXRR;xzJS*G`B=AJTGJ@o*(CGrPgQnByt8|w-f~zR3zy%STBa%uRqG6#UudYXPKKMR zb0#g1{wbm&R21@F_;CHq{dhOx!IQOL-zvX6XfVbZR}W88bYfgP)(x#hB^F-i+Fvh76UDv;eL z|0%BM>!N3E^X&B5)$Y5&k5!M3bI@topgiYNa@b4r(Geysf`VVNGKx(6O=-Dh!FPVI z`fbJeXKgA=xm_0+y7w|NXCZg>#qWQlrMPGgsZ-sGGjM?c5NOkQ0ErHgx;i27I=kPQ zVS;1764hF-i`adb`! zUid!X;CG)L?U`*)sPVh*lVra7H!SNlQembq_|}=%Vkj*Dpu(B*+=YtuDztTf@LsnL z@aJEX03{BZ*XeU4zz$DgZysmAlbjrI12#>+gIL7k<9L2_u5!Ot{IFb6cE5=ALe$*d zLp!G;d9f`amufD&ovEWI-ZLNYSazf#qPB^2qDWp7t*j}K(;Q(6GfKY;N|G3{6Qi3l z_8n{h0u3TsH)$V8uRJ#t&{m?bc{y>Z8fCl-v*v(1tbf05^Vn++8p(cbdcLd1e^SwN z8|l7XlIshNaXd*C9WtG*Ys0SpANmhHT>W;TtAp5us?5cGgEX8$7}o2@Fy(UVc+MrU zw-PoP#9-Tfn_7^vGn|*qmGMX+4sPEu#_X*QW#-ku!X~G-l`FC!6wsSu8l&o68rL7m zUkd??5%3!vIJMoMNfCo0<4ow@oVESMTb*W1|zeCr!YAQOE zp+DW<3+O9MPDpO|=U2EiAMgE#6moS&wDZhW(2VVP?1*nMc6)bZ$5pLh@#{4EgJ>K6 zub^7IS=GK;lUU%Lx6bEWpe!${eBqrQ%kg7fc38omodfSaGU6NRnE;t6Btgn2m^cQ4 z69dWShXv>4D(QXB(F$QphU&C$QQW6mM{4ABz>k!M*!z+VJ85@yy)&sn#XBj0PEbPO zU{?>?PIRyNLFzR)asoO>Ah`B-Qu=C_=m7&J@4Dqk@g+Sz9c?$rc~Ogk+pFJeUp`w$`xDd#^tk;iHY4S$$6Mo%(roB$S;E<3oaU;0SqLnXpp1TCiY6w80_9GHJy4 zLK)p8iR-z-byp@H%BE?r$|Cn!sgGQq3S!Q~RqBdDLa3juK5N*xW{V^B_QPUZ+|`No z3o&Bfj)m}i*Ushm!dVhpUM{Pr^7^G8+{NTBzAqZEUg1A#VbRI3Nd_wu^{p_F_6NY& z&zV_(1lt3oJQnSqLgwh*(+>%47h32h4c@C1c-#>20aOgQ7k8^q=JM77$HSeUwZxyr zoI+it5}J1~1OC6rR-YB`$f5A%?y48f=O#33C9Yo2wmv8yH^ERW?*O2%n}oM(v(d^b z<*$tcZ17LJ=C6-@FFYYpe;JhoYjq6g??05hz?LDs*4X*3)wDR_Th@RTdY;tx%6HJ@ zW5=d+eeTy0fWDFa14dBn%$@2C(luvrsUzVojT~KJKba4T{xbGu*}cq32HH%*raX5FiVtgp z^);GHn~arxv}9%u>7CrzlnQj`3T)y4%pvRpm);Pr$z6aBc^N|``VUoWOp1InnuEXg zEy)k?gbBFgSR~{1qoGe74PEA(J_)@=D}HMMl}R8%SwMkQU#K+gx~CqRJp1>XyMIK^W|Z}uVm`=Hs!SQ3B^NqCdUK3B zHtgY_EOP(N=-m!lKv1!MIOrDiV*Auo`~7LQu=mt^5~FnE;M-qeSgoNie8MB(tHD-L zWxCSJk7GKWD!x^#=Qnbqcnyo0MrmOOuoW(Ls5C`71>U`ncdBo5phaU!Jr<9@5O`O- zitRfF3wv$Qn+;DqCl<<@k^|Fg>)TR8+PaQLL>O%MLl8jN#ib++>=EB;%Mr-pyuz+K zES}}TOu304BMRnolUVMhYF3~|hPKb`Z!`nhV>})4t>to)4#2#ATC86i$%BZYLT`CF zcNF33np2De5O&^qyl*%AkM3X&PJ5((sMqw>DIR179j(s+KruV?=*&R@~S zFvbf}8__c3#XD=t(vxg!Ryva%xEFaFi^@6pwvg9C9A`UG0VARh!dg-K6?UvJd7)70m#Q|%*qoqXN>UbxIL0e94l2!@R^V9}R(y=>A~8=wH}m-pEMfrcLQEp@dMe7%dXt321!C z%8`3QBmGcRm__sj)G)LNDTa*iKg&;$`o8`(sP3T=k{>bZ6m^?E%UG)-I=4TcTz(;L10hd#aIzG}2lF&6-U=Hz zhV}3x5+3BF4Jd6th{^W#eQpAhVpyR#V4TIeaW~ys>h{8=n@C=n1i3O5q`M2irgm0-0H3~5yrw2w>K!8XWD(Jb%svv_n-)n?oO6nDCm6NF1Ae5^6;4SZn$^lFCoPWE z4(P!GY3JBr2IhgtaFy&6VJBWb4Q`er+3Kv!D#h5l`Gc z6(q5@a)dj{^^?k*Z#rRYmEN*p@IE z4v(r&IgtJpPfH{y-i4Pkf>+ex3$4Ww9ml}Fi`D)ls!Y=0&xyitm{67FR0R>yk)_n! zW$=8V%QJck5vqTk?xl^#oa(++uqpAwKLUV4Vlopzm~X0hD@Q$B9*=rDLl2NDABNgz zA8)=_+_is$O_{b3Hn9sb2p~sjJwghB!}1knVtx>XTquf2z`txfbF!Wr;A=I=W$BF} z<=|{X6$n`7<^%jD1=i4@05<1y=|V4!_T~2H#18NO*b9mf*DL%{f3YI>bsZ=7x01-} z5Jg)_l7-yNEgD#O;ef3iz`}`&+M>)wUsdawRBOD!CcK^BjaBa&!@8x^plj6cCp6bX z9kfc}M5&C1$mT{Ovs%q|~J zUJYAYtVn8#_PswLu-?rWNAcAcZwqmh9DpscaK~;{+vip3ngRU8uwte7O4Wz`llRQ( z|Az(0JHX{hL&5)XgGJL2!Jf9wKGE?oLHvqqSa#Mz_r;uvv zCTkU?i3Jcs>w-fg_*D#xXQT7){qN#?{$$LR=A71%^FPaR{$C|JBJ~k9psPWtG~5tn znpM36e>%xPno=fW&jj~xn9mGm<;Xn-oZ?N`#1aAYC)iyf(WF22Zq=`wLl}F>!rMWH z(p5E&&Nk?I{K~OOLoS;lE>ekll;U0NOKpvrP*X`uGsHcoo4~?As)Di$3O^E0Do4{2 z>2zjKqFOnzZ0o{w1V5Vtya8+VLweH8BS5dtg|%Nz=)a@H4=4y%7K0kDqaKlU36B?O z-mRT=AlPj=w|&t>Y6u!Dc<)sJCc+|QDI?$JO`;?-YE`KULa&d8lqJR|0$kxC=P#ni z*l-0O$>SW)&Es?bdloU1)JjS!qN^uLQn>f;1kXCg6Zztiai%2~Q|SuDdrHjb0}%dZ zf?!t)3;a=kEK!-IBsnXcAt{J`t)8f)SceW~O(kOb2U69{>)*>&$|r%z;8g#^P`^6L zS~U!kjtQTuDM0xq9(%YRF3;G7r??%vK==#&szD}Pi(vy+uPNJOS}g`? zi}k9NIFe#+%dDwp`FL6-L~GwB!{q?rl44g1fDHREp`}fz*3ALuRvq^s@gP)2hgO)0 zG=)+FZq1Yw%9EWr<25b|e^%#@{srh(#`4_b~WeCTa1g@Uc${bM!j)U!{(8d-Q> z&j8JX5Yxr^AESa%22YWjOh1kcw_LtROFv0)rmN18n-T@*&f!F|z*XeALib`&fx>|r zXGt%6d&f(lvEvO+Zxs_TcC1gFGCm+h-9ccm)g=Do^@Bu!ejliYX-!l|_l?ropUzt7 zvEDpq`F{_)0Tt7HRAP=+!o+ip##_fy5F%r_%;PnKW;c5EUZ$DDC-R)5xT2soa}8R$ z861qQkbzihW4*F`!Uu^jV}8=d!)>_Wlsz8?fXah--JTpBEJ@y!>+ z*1L%SR0<&QHy8?ACWzA$B|F6EAS^nkU)S#rA#PvhQ&uvA=nn%8D{o_eL;b2$l$PIunI7w;js;R+7&Ge-3dr=HSJ@1E_ePsO3O!t3r0=kMmKe(rvCq34p zwP?A4o`dEX0|4k(z6x&g2|~(}#lQ zr0AuOtVN2op8y=`%=(hz)qT4#051Lt-XsLT<~6cN*UoOTgoU8lLM~tYhVAZsrv~^mEGIZw(E+YOi_yd?^~7LK=HX#4IY4& zS#AM9HU2FjdaY6F-h~hAfJ7SyYEu-2qi?F0;?$hm7oFQIp0rt2wp&!TExuSvk25?0hS|!|X_y)hUlgcY(*ien-^uOU$b?<5e5r;x zk1|F%=c3ynNza>Tco987AIBP@%Hi_g;s14mfIi5&8M_j|UV&#n0cSA`4Me5`#hl&{ z=tw{iK-8G?n>P11d1g=@#$ZzI8tLpBZ62reHFOrb(tg(1rTWisg-hR%3tZukfr!Hd zKz8ShJOKV!#t^{R_PZ0&o+_%Ap8=w=ecZfHSM{-p3s#Fgr*=N)XHp>^ts+;exSQ2Y)B$S>md<)e-_ z{B5hwcmobA90ZVFdQ(1Rt`>xesriQnY*=^4TUEDkortxyNz zU$yVnAbY*UGwBt|8zztObdD$AlhD*C`?4F5y&C?BT zQ0BX{e|jHaH8VyZpf>mCwR*3AYyNn)=iK}asdxNmpD%rRW6`gCe2*vgck&I(fbG+7 zZQadlXhhn?pCLapaISp2q3T!+ibSDFhncYfD!3Q8XMMS{9M0ml{+{ff+FG^sUVT1& zs?rSWo6~s)US9i~>R^VTfjfyEY(H+9FU?iaJ|zykSwSD~%Ymi>RV9d1NQX&pnz{iP zb2}~QAY!PkgP8*nuY{9dIqAw>^}5*|w!6cFb%fi#9%!ddc8%F)z1$}B$r-{0V7`t#KM z(=eCj2XHizr!dubYwgysW7E*;7BBIIuM2Wc_QUT*4MSAnN(2_=?*|3j{(HW^Xhc{KTImGBdy=QnOjJJZatWJTeiq>eR3DTU4!11HP`fC zru~;e2mU8JBjc9W`9Df0RR9Gg3c>-dA5_eVhtvD3N_Yph_d&mx23cE@_?#koN>aO|X0eaCBCn`p7Ee2O2Ct+km7DVDdfqFM>F}Q4%6-6oUOg z0nB2E?3NYpb>G1DmmCZJ-mU%$aefZX zw({>6-n2XgvS;mKsX}I-XVM15lkuF3=1j*+ctkC5`;=}WYrx)mgaEBkLyJO#;n@K+ zLN(sSr{X@0B-XCa-iM&M5B&Lk{wiy4eV#1;&V#@nxG2JS22%!*q6naRjotyBAYu8^ z3QEfwcM&{J84UFi$m}3(&SkjT0Gqrc@a0YD7~t6E#>J}~Z~>FmlNg~QDUvN=7GJ^& zjD{qzX~1sBB4B^ZChrKO={-VZB9)UogGz4pZv*CT1U3C>yfWhMe!^1BAbRFzW;#5~ zEE9lqFtS`q&aOZg^T&=?Ro|mHByWe#W!@%W2PBOV#C~J3^jo*Hf#{HZX<~n8oYR?K z$w#lG7->u<=ap2`JibR2v{=3SHRDS*yzIAyQ7Rg@D&4jJX%+}~+Syq=6IQ%!^=)1n z;MV6yj>A1t4mb&ZQvU5!rdBv^)X@2NmH-KMLd$6B=Jx*VRzvW^CHJ}_QP_;8mNBgM z2doL~pI{^*i?0WQIe%{j5S$rb|$qk|`$iSwNWbmDz}zF@Nf z_m&;J*-FEXW&LI!ddl@xqtq+HWV8TrOK3?iNkr)5qwT+-H0g7hkduTv>1d%2k2SSJ zF_Mm>Xgxedzs@MUZW7gZ-TBsjERP(EU_d=`oG(V1@KghM?ga{bfg;rxkO0jFMEaFmi?8ToBBJWtzy}d;^OM#&9{1M z-s@CX7|F^gWK`iIyGoa%bXL2iw?>9gJ=W{N>qQvh!tTpwt}ggqvUlUTQrVQ#y@NG- z$O&g^X!@~Rma`F^S|6)(*0p^za>mRl+Vg4ae&e6!CaHXQUuxyf!?5GnYtKe0ga-2f z8NNcnL&3{}R4p^(?9`2RvvzoDfw3yD^L5*B)J6iTH>)&yjiV z@lC}J!9LQ)vW{ZYdK#DV4@&*B4R7swq;n2a2ap;dHd|@+E*#`kR}6&ZT$yovPw&Z^ zeu0;rcy-v*6c>RilgRfRo7srum z*~j*}VfXYs6&XF#L_DOjaq(<$Kkl$8`}09#^H9x0g;K|{bGFX87ca>yjqh_UDL6Gh z5gbDkUXe;P9ax@g97%YfsZ5-Ia&KV}7&b>7&#!|4S$Eo^*dLsgeVLIGZg@Kk$eURh zhQuzaufrUS>Pa@lmJXJhZ_DFNRte{YZeP4t3}}T?zA3So#A_yIT*%%xE@QR9rmSk9 zyK=vn>m13+@B@jhal!{Y0cgpMZk90}si(kE3wc8ZP4cYVGT@`vSiR-M_Npv9;NWt8 zcq+1sMdCiN?WcYs^V8S#6^AV==0#RmCY#Bsh>x;{nzdZOIM0O^(-g(qoM$RA?)T)LiShK$9>%~d5lkZY+CFCVZX@Kh1DGD zTI;#`!QRR)$s(h29=}shg7riA*#eTnkheqd0(^U03ThS4l`EOiCa&)iIYo)*26Hj2 zlZ)QNO}CSma)=@@N5>^w}AF)2&J{>LX|ACt6J5$Eki-dwqxZ%sW@G+OLfpj5KfBAf# zX_bpay`^iu3pjeRd_9@Tdu(aEuB(W#6eL7)&$n1e85Hg>6g?KGL?0poz9epnx_HSKb}8(K}H#^WNZAb+JX zw0f;28XUOsQ}sX7-%XN$(ldw$#+$Xw);X34FaDj)*7YB*YG=n~z6^y!&L9d*%E>o% zPHu{SxtU6;r<==!q>c&I>iLu`+pA5aEg%U(Fn3Yfb zT2}&d;8=go>9FNTlJ&+Lr`^6eE3`Pty$961uKQsFE+K8UEC^I$L9o?$&^%eb|LSY! z&bcT!0^tQ*&q9|hrptQ(P)4XM@>=FmT+Iv@q!O9VXklL>-_CyvFFv%&ihjz`(P!0! ziyIFZjy`MDVTak5!lILS0eDQQsVWQ6Q@`#0+I8rSvhi!nSTK9l@ww|L^iNfSyjbtG zELuJJocB(psYYBuiG$Q+aO$!FOP|3Hz3O-724n*Of_l}_`Ug;e{DyXCT|3)z zO##LHoJo09>dFtVkqM6xz#p=P8jIvT(GS_-+3mJn*CV221&G*fa!1FzA>*hcVFMr)Qb|oZS>(g$QkF~4_DLaca&g;}z(u}zs;LgUWt@}B>09^$p^Qv8{;IaqazU~$cJ z#d~p>vFcNXq!fVoBD^#LOV>hK6TRR~V3kMlL&0XQttA2rW zRQ^6n%4~iOYwW&ZHCZ-E$kj}n3^F!;<~_9r{rZ=7>RT)Rg>8{HHL{~NnC|v$?<%$| zdKU*~e>(=MR23kfy|10PmcX#`K7Kny?ng67KMOMs9%>ya?XNKl?9_p=p*ElD3yK0h zEC9_1w>$X-B1gSdzccYLfA&m{6bm-i!lf~QJPEj^L$88Ax$tb#cmh#pzN`CXzkh@14G=9qiLzt zdmCTvza99S`|e@^i|)-8xLe&B0T*>+kv_CQRXxdY%|M+<=1d5Fo*W@gb6;rSOo$-< zj^4R(ZVmO3JbHs9oIH0@VY@u|_2bJwJU-rJ0-i_sEbu^Gx%S9yDYokFyTI?j$lq@9 zN}D8DrmC6(YlBt+K$I~u5zJvS9rw*O9Drgr?)jrPzQWX!k^O?fMv?EdUtm#uiW;HC zGg^Xr9^A2k;H3L&>{8&^>LpU<@V>4vYxCG~m{rw+6x~fFgCpp56BuFjbZzbZPFWaA z>nGU)OS2jN4wMIYujPXfMyXl`zLjcL(Q@d$ByQb8c9$w@P(c4$_WE|`Vpui<1{J}7LYW%@NRy3qEi_pI+sXS{__v*AV{oI{CIrsp3vT}Y30#?0Fw$Q-ypm- zL+XzKFyN&QY{h3XG=TgN1{hs&x=;CAJr&HQ@rfPwEQpQ;cSwz!H<8*U!ooB?f6z>$ zCpS5%z%7Pp)go+fTt#E-q3a;mUfM9+i# zkY$zQmpgvQF@XrxIg5?okI7x<)h#V40W&kUN97Q5^O{@=w#~Qrs6~pd~?>hC+&v5{!?D-Fw zSH3uT#zaq!22{unzt+c&)8Y$Mkebn?C#8Blh2+sYb@Fbm(wpWA>{)%ng^0UnRP8UM|R^jbh@lLT6imVG7TV;um9PB2LL3vD?;P1s zymtr#XJglW)|zCPK8Y(9I-T4v`QZk!#8`L~BXwLH3m=INhnz%nlPl;sZ_b zGue-~DNE~C=*%CqVeP@FVc=v!tLq$3Co zoMU6mdcfgS&&u?NhQ2;@gP}pZ`#eI8Kp%1VH{;c}E3KfaFSG0M{k-OluSoauE>M4$>@^#TPoUngDAv!ER+zx0PI=Y^S>XlR;G zP^jfmY6A9AQkf~P8#cP?B+q!pI2x(6lv@pZ$u6J4t(k}7^2&|XXIOO%1BLOkT^yyJ zf9UkC#*sp%MTx0CDDc8vsF^VKQc@dD(_p-k-@94Pl=@YYP;^E2Q+dH2JNfgd`(3qo zICL`iEjeQMe+WbqoG7P|iHN&O9A=k1xm44C2L6XI^b&SKiieh9KQeXkpKYHO76`ks zIi{N>(JZh`iNCZvA-QqHRw?{U9p6L$dN4k)M|xX$Q<}@rU3Mc&p#1B}c=>YZv&Rw^ ziE9ZuktG_flE{)~r}B3$WsnxcId7nM@f}xPM@1!E$CjW#|FwS?iUV>2cE1V9%@)p0 z#wOK8JWMUokboMCr|70*g?rg}Ma2u8%Fq2MM-VaSgxVHAgV6eFOf{oa4(_OKrk#!H z`29@WwgZyXO!0Dzp>Rx;Y8q(-OQ*5ySdyq}Jvv3e32j1?Zm*J|$;-r%){^Ry??;Q;B z1{xcbEKEf>O{ds1D66rosaMoye( z;Tz%!o>CKuN`vq{{$A~Ft2j?` zqM7DLwnszHDJUq&D1@5fOwzZDRY!j6;ByleAZv{RUrZ?Cv!RMmO1VR%hbgjv%yRRe zj?SMx*uOUr43PR8Y4`cX{zT#bdDD;qv{X`pqZyBr@}suRKi9;lJ_lYl61VQ9w;%QP z{(be&r71`KjDm@&mjAvC{z{Ml{e{ltw7CZt|KBw+ss+ry0+!|`E~&){bAj(ffzr@L Jl&aqe{y)L8CNcm3 diff --git a/etc/big-picture.xml b/etc/big-picture.xml index d43f4631d1..91844f1101 100644 --- a/etc/big-picture.xml +++ b/etc/big-picture.xml @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/player/Cargo.toml b/player/Cargo.toml index 8e05346e2c..63493a4ee2 100644 --- a/player/Cargo.toml +++ b/player/Cargo.toml @@ -33,7 +33,7 @@ features = ["replay"] [target.'cfg(not(target_arch = "wasm32"))'.dependencies.wgc] workspace = true -features = ["replay", "raw-window-handle", "strict_asserts", "wgsl", "metal", "dx11", "dx12", "vulkan", "gles"] +features = ["replay", "raw-window-handle", "strict_asserts", "wgsl", "metal", "dx12", "vulkan", "gles"] [dev-dependencies] serde.workspace = true diff --git a/player/README.md b/player/README.md index 101756c607..c816dd57e7 100644 --- a/player/README.md +++ b/player/README.md @@ -10,4 +10,4 @@ play When built with "winit" feature, it's able to replay the workloads that operate on a swapchain. It renders each frame sequentially and then waits for the user to close the window. When built without "winit", it launches in console mode and can replay any trace that doesn't use swapchains. -Note: replaying is currently restricted to the same backend as one used for recording a trace. It is straightforward, however, to just replace the backend in RON since it's serialized as plain text. Valid values are: Vulkan, Metal, Dx12, and Dx11. +Note: replaying is currently restricted to the same backend as one used for recording a trace. It is straightforward, however, to just replace the backend in RON since it's serialized as plain text. Valid values are: Vulkan, Metal, and Dx12. diff --git a/player/tests/test.rs b/player/tests/test.rs index 76983ec2fc..a622742b67 100644 --- a/player/tests/test.rs +++ b/player/tests/test.rs @@ -68,7 +68,6 @@ impl Test<'_> { wgt::Backend::Vulkan => "Vulkan", wgt::Backend::Metal => "Metal", wgt::Backend::Dx12 => "Dx12", - wgt::Backend::Dx11 => "Dx11", wgt::Backend::Gl => "Gl", _ => unreachable!(), }; @@ -170,7 +169,6 @@ const BACKENDS: &[wgt::Backend] = &[ wgt::Backend::Vulkan, wgt::Backend::Metal, wgt::Backend::Dx12, - wgt::Backend::Dx11, wgt::Backend::Gl, ]; diff --git a/tests/src/expectations.rs b/tests/src/expectations.rs index 369e0d69ea..ee48e83aa8 100644 --- a/tests/src/expectations.rs +++ b/tests/src/expectations.rs @@ -11,7 +11,7 @@ /// ``` /// # use wgpu_test::*; /// FailureCase { -/// backends: Some(wgpu::Backends::DX11 | wgpu::Backends::DX12), +/// backends: Some(wgpu::Backends::DX12), /// vendor: None, /// adapter: Some("RTX"), /// driver: None, diff --git a/wgpu-core/Cargo.toml b/wgpu-core/Cargo.toml index ecfb315d27..ee908124b7 100644 --- a/wgpu-core/Cargo.toml +++ b/wgpu-core/Cargo.toml @@ -38,7 +38,6 @@ resource_log_info = [] metal = ["hal/metal"] vulkan = ["hal/vulkan"] gles = ["hal/gles"] -dx11 = ["hal/dx11"] dx12 = ["hal/dx12"] # Use static linking for libraries. Disale to manually link. Enabled by default. diff --git a/wgpu-core/src/any_surface.rs b/wgpu-core/src/any_surface.rs index 757e5c152b..5ae3295dc1 100644 --- a/wgpu-core/src/any_surface.rs +++ b/wgpu-core/src/any_surface.rs @@ -35,10 +35,6 @@ impl AnySurface { if self.downcast_ref::().is_some() { return Backend::Dx12; } - #[cfg(all(feature = "dx11", windows))] - if self.downcast_ref::().is_some() { - return Backend::Dx11; - } #[cfg(feature = "gles")] if self.downcast_ref::().is_some() { return Backend::Gl; diff --git a/wgpu-core/src/device/global.rs b/wgpu-core/src/device/global.rs index 0f3cee9125..f375bef6b1 100644 --- a/wgpu-core/src/device/global.rs +++ b/wgpu-core/src/device/global.rs @@ -2178,11 +2178,6 @@ impl Global { all_queue_empty = self.poll_device::(force_wait, &mut closures)? && all_queue_empty; } - #[cfg(all(feature = "dx11", windows))] - { - all_queue_empty = - self.poll_device::(force_wait, &mut closures)? && all_queue_empty; - } #[cfg(feature = "gles")] { all_queue_empty = diff --git a/wgpu-core/src/global.rs b/wgpu-core/src/global.rs index 5de766f61f..e1c3d8c6d4 100644 --- a/wgpu-core/src/global.rs +++ b/wgpu-core/src/global.rs @@ -22,8 +22,6 @@ pub struct GlobalReport { pub metal: Option, #[cfg(all(feature = "dx12", windows))] pub dx12: Option, - #[cfg(all(feature = "dx11", windows))] - pub dx11: Option, #[cfg(feature = "gles")] pub gl: Option, } @@ -40,8 +38,6 @@ impl GlobalReport { Backend::Metal => self.metal.as_ref().unwrap(), #[cfg(all(feature = "dx12", windows))] Backend::Dx12 => self.dx12.as_ref().unwrap(), - #[cfg(all(feature = "dx11", windows))] - Backend::Dx11 => self.dx11.as_ref().unwrap(), #[cfg(feature = "gles")] Backend::Gl => self.gl.as_ref().unwrap(), _ => panic!("HubReport is not supported on this backend"), @@ -132,12 +128,6 @@ impl Global { } else { None }, - #[cfg(all(feature = "dx11", windows))] - dx11: if self.instance.dx11.is_some() { - Some(self.hubs.dx11.generate_report()) - } else { - None - }, #[cfg(feature = "gles")] gl: if self.instance.gl.is_some() { Some(self.hubs.gl.generate_report()) @@ -167,10 +157,6 @@ impl Drop for Global { { self.hubs.dx12.clear(&surfaces_locked, true); } - #[cfg(all(feature = "dx11", windows))] - { - self.hubs.dx11.clear(&surfaces_locked, true); - } #[cfg(feature = "gles")] { self.hubs.gl.clear(&surfaces_locked, true); diff --git a/wgpu-core/src/hal_api.rs b/wgpu-core/src/hal_api.rs index cb3e25b09e..a19b3c4bb7 100644 --- a/wgpu-core/src/hal_api.rs +++ b/wgpu-core/src/hal_api.rs @@ -94,27 +94,6 @@ impl HalApi for hal::api::Dx12 { } } -#[cfg(all(feature = "dx11", windows))] -impl HalApi for hal::api::Dx11 { - const VARIANT: Backend = Backend::Dx11; - fn create_instance_from_hal(name: &str, hal_instance: Self::Instance) -> Instance { - Instance { - name: name.to_owned(), - dx11: Some(hal_instance), - ..Default::default() - } - } - fn instance_as_hal(instance: &Instance) -> Option<&Self::Instance> { - instance.dx11.as_ref() - } - fn hub(global: &Global) -> &Hub { - &global.hubs.dx11 - } - fn get_surface(surface: &Surface) -> Option<&HalSurface> { - surface.raw.downcast_ref() - } -} - #[cfg(feature = "gles")] impl HalApi for hal::api::Gles { const VARIANT: Backend = Backend::Gl; diff --git a/wgpu-core/src/hub.rs b/wgpu-core/src/hub.rs index 6cb9ee64d1..a2f89f92df 100644 --- a/wgpu-core/src/hub.rs +++ b/wgpu-core/src/hub.rs @@ -308,15 +308,12 @@ pub struct Hubs { pub(crate) metal: Hub, #[cfg(all(feature = "dx12", windows))] pub(crate) dx12: Hub, - #[cfg(all(feature = "dx11", windows))] - pub(crate) dx11: Hub, #[cfg(feature = "gles")] pub(crate) gl: Hub, #[cfg(all( not(all(feature = "vulkan", not(target_arch = "wasm32"))), not(all(feature = "metal", any(target_os = "macos", target_os = "ios"))), not(all(feature = "dx12", windows)), - not(all(feature = "dx11", windows)), not(feature = "gles"), ))] pub(crate) empty: Hub, @@ -331,15 +328,12 @@ impl Hubs { metal: Hub::new(factory), #[cfg(all(feature = "dx12", windows))] dx12: Hub::new(factory), - #[cfg(all(feature = "dx11", windows))] - dx11: Hub::new(factory), #[cfg(feature = "gles")] gl: Hub::new(factory), #[cfg(all( not(all(feature = "vulkan", not(target_arch = "wasm32"))), not(all(feature = "metal", any(target_os = "macos", target_os = "ios"))), not(all(feature = "dx12", windows)), - not(all(feature = "dx11", windows)), not(feature = "gles"), ))] empty: Hub::new(factory), diff --git a/wgpu-core/src/id.rs b/wgpu-core/src/id.rs index 9daa0ef56c..1782172c2a 100644 --- a/wgpu-core/src/id.rs +++ b/wgpu-core/src/id.rs @@ -131,8 +131,7 @@ where 1 => Backend::Vulkan, 2 => Backend::Metal, 3 => Backend::Dx12, - 4 => Backend::Dx11, - 5 => Backend::Gl, + 4 => Backend::Gl, _ => unreachable!(), } } @@ -156,13 +155,12 @@ where fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { let (index, epoch, backend) = self.unzip(); let backend = match backend { + Backend::Empty => "_", Backend::Vulkan => "vk", Backend::Metal => "mtl", Backend::Dx12 => "d3d12", - Backend::Dx11 => "d3d11", Backend::Gl => "gl", Backend::BrowserWebGpu => "webgpu", - Backend::Empty => "_", }; write!(formatter, "Id({index},{epoch},{backend})")?; Ok(()) @@ -280,7 +278,6 @@ fn test_id_backend() { Backend::Vulkan, Backend::Metal, Backend::Dx12, - Backend::Dx11, Backend::Gl, ] { let id: Id<()> = Id::zip(1, 0, b); @@ -300,7 +297,6 @@ fn test_id() { Backend::Vulkan, Backend::Metal, Backend::Dx12, - Backend::Dx11, Backend::Gl, ]; for &i in &indexes { diff --git a/wgpu-core/src/instance.rs b/wgpu-core/src/instance.rs index b8340cd659..7a12d98a6d 100644 --- a/wgpu-core/src/instance.rs +++ b/wgpu-core/src/instance.rs @@ -68,8 +68,6 @@ pub struct Instance { pub metal: Option>, #[cfg(all(feature = "dx12", windows))] pub dx12: Option>, - #[cfg(all(feature = "dx11", windows))] - pub dx11: Option>, #[cfg(feature = "gles")] pub gl: Option>, pub flags: wgt::InstanceFlags, @@ -113,8 +111,6 @@ impl Instance { metal: init(hal::api::Metal, &instance_desc), #[cfg(all(feature = "dx12", windows))] dx12: init(hal::api::Dx12, &instance_desc), - #[cfg(all(feature = "dx11", windows))] - dx11: init(hal::api::Dx11, &instance_desc), #[cfg(feature = "gles")] gl: init(hal::api::Gles, &instance_desc), flags: instance_desc.flags, @@ -144,8 +140,6 @@ impl Instance { Backend::Metal => destroy(hal::api::Metal, &self.metal, surface.raw), #[cfg(all(feature = "dx12", windows))] Backend::Dx12 => destroy(hal::api::Dx12, &self.dx12, surface.raw), - #[cfg(all(feature = "dx11", windows))] - Backend::Dx11 => destroy(hal::api::Dx11, &self.dx11, surface.raw), #[cfg(feature = "gles")] Backend::Gl => destroy(hal::api::Gles, &self.gl, surface.raw), _ => unreachable!(), @@ -531,13 +525,6 @@ impl Global { display_handle, window_handle, ); - #[cfg(all(feature = "dx11", windows))] - init::( - &mut hal_surface, - &self.instance.dx11, - display_handle, - window_handle, - ); #[cfg(feature = "gles")] init::( &mut hal_surface, @@ -787,8 +774,6 @@ impl Global { unconfigure::<_, hal::api::Metal>(self, &surface.raw, &present); #[cfg(all(feature = "dx12", windows))] unconfigure::<_, hal::api::Dx12>(self, &surface.raw, &present); - #[cfg(all(feature = "dx11", windows))] - unconfigure::<_, hal::api::Dx11>(self, &surface.raw, &present); #[cfg(feature = "gles")] unconfigure::<_, hal::api::Gles>(self, &surface.raw, &present); } @@ -849,8 +834,6 @@ impl Global { ); #[cfg(all(feature = "dx12", windows))] self.enumerate(hal::api::Dx12, &self.instance.dx12, &inputs, &mut adapters); - #[cfg(all(feature = "dx11", windows))] - self.enumerate(hal::api::Dx11, &self.instance.dx11, &inputs, &mut adapters); #[cfg(feature = "gles")] self.enumerate(hal::api::Gles, &self.instance.gl, &inputs, &mut adapters); @@ -960,15 +943,6 @@ impl Global { desc.force_fallback_adapter, &mut device_types, ); - #[cfg(all(feature = "dx11", windows))] - let (id_dx11, adapters_dx11) = gather( - hal::api::Dx11, - self.instance.dx11.as_ref(), - &inputs, - compatible_surface, - desc.force_fallback_adapter, - &mut device_types, - ); #[cfg(feature = "gles")] let (id_gl, adapters_gl) = gather( hal::api::Gles, @@ -1042,10 +1016,6 @@ impl Global { if let Some(id) = self.select(&mut selected, id_dx12, adapters_dx12) { return Ok(id); } - #[cfg(all(feature = "dx11", windows))] - if let Some(id) = self.select(&mut selected, id_dx11, adapters_dx11) { - return Ok(id); - } #[cfg(feature = "gles")] if let Some(id) = self.select(&mut selected, id_gl, adapters_gl) { return Ok(id); @@ -1076,8 +1046,6 @@ impl Global { Backend::Metal => fid.assign(Adapter::new(hal_adapter)), #[cfg(all(feature = "dx12", windows))] Backend::Dx12 => fid.assign(Adapter::new(hal_adapter)), - #[cfg(all(feature = "dx11", windows))] - Backend::Dx11 => fid.assign(Adapter::new(hal_adapter)), #[cfg(feature = "gles")] Backend::Gl => fid.assign(Adapter::new(hal_adapter)), _ => unreachable!(), @@ -1283,7 +1251,6 @@ impl Global { /// Names: /// - vulkan = "vulkan" or "vk" /// - dx12 = "dx12" or "d3d12" -/// - dx11 = "dx11" or "d3d11" /// - metal = "metal" or "mtl" /// - gles = "opengl" or "gles" or "gl" /// - webgpu = "webgpu" @@ -1293,7 +1260,6 @@ pub fn parse_backends_from_comma_list(string: &str) -> Backends { backends |= match backend.trim() { "vulkan" | "vk" => Backends::VULKAN, "dx12" | "d3d12" => Backends::DX12, - "dx11" | "d3d11" => Backends::DX11, "metal" | "mtl" => Backends::METAL, "opengl" | "gles" | "gl" => Backends::GL, "webgpu" => Backends::BROWSER_WEBGPU, diff --git a/wgpu-core/src/lib.rs b/wgpu-core/src/lib.rs index 944d7eff46..4d5646d2b9 100644 --- a/wgpu-core/src/lib.rs +++ b/wgpu-core/src/lib.rs @@ -9,7 +9,6 @@ not(all(feature = "vulkan", not(target_arch = "wasm32"))), not(all(feature = "metal", any(target_os = "macos", target_os = "ios"))), not(all(feature = "dx12", windows)), - not(all(feature = "dx11", windows)), not(feature = "gles"), ), allow(unused, clippy::let_and_return) @@ -217,7 +216,6 @@ macro_rules! define_backend_caller { define_backend_caller! { gfx_if_vulkan, gfx_if_vulkan_hidden, "vulkan" if all(feature = "vulkan", not(target_arch = "wasm32")) } define_backend_caller! { gfx_if_metal, gfx_if_metal_hidden, "metal" if all(feature = "metal", any(target_os = "macos", target_os = "ios")) } define_backend_caller! { gfx_if_dx12, gfx_if_dx12_hidden, "dx12" if all(feature = "dx12", windows) } -define_backend_caller! { gfx_if_dx11, gfx_if_dx11_hidden, "dx11" if all(feature = "dx11", windows) } define_backend_caller! { gfx_if_gles, gfx_if_gles_hidden, "gles" if feature = "gles" } /// Dispatch on an [`Id`]'s backend to a backend-generic method. @@ -272,7 +270,6 @@ macro_rules! gfx_select { wgt::Backend::Vulkan => $crate::gfx_if_vulkan!($global.$method::<$crate::api::Vulkan>( $($param),* )), wgt::Backend::Metal => $crate::gfx_if_metal!($global.$method::<$crate::api::Metal>( $($param),* )), wgt::Backend::Dx12 => $crate::gfx_if_dx12!($global.$method::<$crate::api::Dx12>( $($param),* )), - wgt::Backend::Dx11 => $crate::gfx_if_dx11!($global.$method::<$crate::api::Dx11>( $($param),* )), wgt::Backend::Gl => $crate::gfx_if_gles!($global.$method::<$crate::api::Gles>( $($param),+ )), other => panic!("Unexpected backend {:?}", other), } diff --git a/wgpu-hal/Cargo.toml b/wgpu-hal/Cargo.toml index 78c68390e5..4bae3dc082 100644 --- a/wgpu-hal/Cargo.toml +++ b/wgpu-hal/Cargo.toml @@ -18,9 +18,9 @@ rust-version = "1.65" [package.metadata.docs.rs] # Ideally we would enable all the features. # -# However the metal features fails to be documented because the docs.rs runner cross compiling under +# However, the metal features fail to be documented because the docs.rs runner cross-compiling under # x86_64-unknown-linux-gnu and metal-rs cannot compile in that environment at the moment. The same applies -# with the dx11 and dx12 features. +# for the dx12 feature. features = ["vulkan", "gles", "renderdoc"] rustdoc-args = ["--cfg", "docsrs"] targets = [ @@ -44,17 +44,6 @@ vulkan = [ "smallvec", ] gles = ["naga/glsl-out", "glow", "glutin_wgl_sys", "khronos-egl", "libloading"] -dx11 = [ - "naga/hlsl-out", - "d3d12", - "libloading", - "winapi/d3d11", - "winapi/std", - "winapi/d3d11_1", - "winapi/d3d11_2", - "winapi/d3d11sdklayers", - "winapi/dxgi1_6", -] dx12 = [ "naga/hlsl-out", "d3d12", diff --git a/wgpu-hal/src/auxil/mod.rs b/wgpu-hal/src/auxil/mod.rs index f0aa6a4a89..5e45c1f2b6 100644 --- a/wgpu-hal/src/auxil/mod.rs +++ b/wgpu-hal/src/auxil/mod.rs @@ -1,4 +1,4 @@ -#[cfg(all(any(feature = "dx11", feature = "dx12"), windows))] +#[cfg(all(feature = "dx12", windows))] pub(super) mod dxgi; #[cfg(all(not(target_arch = "wasm32"), feature = "renderdoc"))] diff --git a/wgpu-hal/src/dx11/adapter.rs b/wgpu-hal/src/dx11/adapter.rs deleted file mode 100644 index 3d465ae21f..0000000000 --- a/wgpu-hal/src/dx11/adapter.rs +++ /dev/null @@ -1,303 +0,0 @@ -use std::num::NonZeroU64; - -use winapi::um::{d3d11, d3dcommon}; - -impl crate::Adapter for super::Adapter { - unsafe fn open( - &self, - features: wgt::Features, - limits: &wgt::Limits, - ) -> Result, crate::DeviceError> { - todo!() - } - - unsafe fn texture_format_capabilities( - &self, - format: wgt::TextureFormat, - ) -> crate::TextureFormatCapabilities { - todo!() - } - - unsafe fn surface_capabilities( - &self, - surface: &super::Surface, - ) -> Option { - todo!() - } - - unsafe fn get_presentation_timestamp(&self) -> wgt::PresentationTimestamp { - todo!() - } -} - -impl super::Adapter { - pub(super) fn expose( - instance: &super::library::D3D11Lib, - adapter: d3d12::DxgiAdapter, - ) -> Option> { - use d3dcommon::{ - D3D_FEATURE_LEVEL_10_0 as FL10_0, D3D_FEATURE_LEVEL_10_1 as FL10_1, - D3D_FEATURE_LEVEL_11_0 as FL11_0, D3D_FEATURE_LEVEL_11_1 as FL11_1, - D3D_FEATURE_LEVEL_9_1 as FL9_1, D3D_FEATURE_LEVEL_9_2 as FL9_2, - D3D_FEATURE_LEVEL_9_3 as FL9_3, - }; - - let (device, feature_level) = instance.create_device(adapter)?; - - // - // Query Features from d3d11 - // - - let d3d9_features = unsafe { - device.check_feature_support::( - d3d11::D3D11_FEATURE_D3D9_OPTIONS1, - ) - }; - - let d3d10_features = unsafe { - device.check_feature_support::( - d3d11::D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS, - ) - }; - - let d3d11_features = unsafe { - device.check_feature_support::( - d3d11::D3D11_FEATURE_D3D11_OPTIONS, - ) - }; - - let d3d11_features1 = unsafe { - device.check_feature_support::( - d3d11::D3D11_FEATURE_D3D11_OPTIONS1, - ) - }; - - let d3d11_features2 = unsafe { - device.check_feature_support::( - d3d11::D3D11_FEATURE_D3D11_OPTIONS2, - ) - }; - - let d3d11_features3 = unsafe { - device.check_feature_support::( - d3d11::D3D11_FEATURE_D3D11_OPTIONS3, - ) - }; - - // - // Fill out features and downlevel features - // - // TODO(cwfitzgerald): Needed downlevel features: 3D dispatch - - let mut features = wgt::Features::DEPTH_CLIP_CONTROL - | wgt::Features::PUSH_CONSTANTS - | wgt::Features::POLYGON_MODE_LINE - | wgt::Features::CLEAR_TEXTURE - | wgt::Features::TEXTURE_FORMAT_16BIT_NORM - | wgt::Features::ADDRESS_MODE_CLAMP_TO_ZERO - | wgt::Features::ADDRESS_MODE_CLAMP_TO_BORDER; - let mut downlevel = wgt::DownlevelFlags::BASE_VERTEX - | wgt::DownlevelFlags::READ_ONLY_DEPTH_STENCIL - | wgt::DownlevelFlags::UNRESTRICTED_INDEX_BUFFER - | wgt::DownlevelFlags::UNRESTRICTED_EXTERNAL_TEXTURE_COPIES; - - // Features from queries - downlevel.set( - wgt::DownlevelFlags::NON_POWER_OF_TWO_MIPMAPPED_TEXTURES, - d3d9_features.FullNonPow2TextureSupported == 1, - ); - downlevel.set( - wgt::DownlevelFlags::COMPUTE_SHADERS, - d3d10_features.ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x == 1, - ); - - // Features from feature level - if feature_level >= FL9_2 { - downlevel |= wgt::DownlevelFlags::INDEPENDENT_BLEND; - // formally FL9_1 supports aniso 2, but we don't support that level of distinction - downlevel |= wgt::DownlevelFlags::ANISOTROPIC_FILTERING; - // this is actually the first FL that supports u32 at all - downlevel |= wgt::DownlevelFlags::FULL_DRAW_INDEX_UINT32; - } - - if feature_level >= FL9_3 { - downlevel |= wgt::DownlevelFlags::COMPARISON_SAMPLERS; - } - - if feature_level >= FL10_0 { - downlevel |= wgt::DownlevelFlags::FRAGMENT_STORAGE; - downlevel |= wgt::DownlevelFlags::FRAGMENT_WRITABLE_STORAGE; - downlevel |= wgt::DownlevelFlags::DEPTH_BIAS_CLAMP; - downlevel |= wgt::DownlevelFlags::VERTEX_STORAGE; - features |= wgt::Features::DEPTH_CLIP_CONTROL; - features |= wgt::Features::TIMESTAMP_QUERY; - features |= wgt::Features::PIPELINE_STATISTICS_QUERY; - features |= wgt::Features::SHADER_PRIMITIVE_INDEX; - features |= wgt::Features::DEPTH32FLOAT_STENCIL8; - features |= wgt::Features::RG11B10UFLOAT_RENDERABLE; - } - - if feature_level >= FL10_1 { - downlevel |= wgt::DownlevelFlags::CUBE_ARRAY_TEXTURES; - downlevel |= wgt::DownlevelFlags::MULTISAMPLED_SHADING; - } - - if feature_level >= FL11_0 { - downlevel |= wgt::DownlevelFlags::INDIRECT_EXECUTION; - downlevel |= wgt::DownlevelFlags::WEBGPU_TEXTURE_FORMAT_SUPPORT; - features |= wgt::Features::TEXTURE_COMPRESSION_BC; - } - - if feature_level >= FL11_1 { - features |= wgt::Features::VERTEX_WRITABLE_STORAGE; - } - - // bgra8unorm-storage is never supported on dx11 according to: - // https://learn.microsoft.com/en-us/windows/win32/direct3ddxgi/format-support-for-direct3d-11-0-feature-level-hardware#dxgi_format_b8g8r8a8_unormfcs-87 - - // float32-filterable should always be available on dx11 - // https://learn.microsoft.com/en-us/windows/win32/direct3ddxgi/format-support-for-direct3d-11-0-feature-level-hardware#dxgi_format_r32g32b32a32_floatfcs-2 - features.set(wgt::Features::FLOAT32_FILTERABLE, true); - - // - // Fill out limits and alignments - // - - let max_texture_dimension_2d = match feature_level { - FL9_1 | FL9_2 => 2048, - FL9_3 => 4096, - FL10_0 | FL10_1 => 8192, - _ => d3d11::D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION, - }; - - let max_texture_dimension_3d = match feature_level { - FL9_1..=FL9_3 => 256, - _ => d3d11::D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION, - }; - let max_vertex_buffers = match feature_level { - FL9_1..=FL9_3 => 16, - _ => 32, - } - .min(crate::MAX_VERTEX_BUFFERS as u32); - let max_compute_workgroup_storage_size = match feature_level { - FL9_1..=FL9_3 => 0, - FL10_0 | FL10_1 => 4096 * 4, // This doesn't have an equiv SM4 constant :\ - _ => d3d11::D3D11_CS_TGSM_REGISTER_COUNT * 4, - }; - let max_workgroup_size_xy = match feature_level { - FL9_1..=FL9_3 => 0, - FL10_0 | FL10_1 => d3d11::D3D11_CS_4_X_THREAD_GROUP_MAX_X, - _ => d3d11::D3D11_CS_THREAD_GROUP_MAX_X, - }; - let max_workgroup_size_z = match feature_level { - FL9_1..=FL9_3 => 0, - FL10_0 | FL10_1 => 1, - _ => d3d11::D3D11_CS_THREAD_GROUP_MAX_Z, - }; - // let max_workgroup_count_z = match feature_level { - // FL9_1..=FL9_3 => 0, - // FL10_0 | FL10_1 => 1, - // _ => d3d11::D3D11_CS_THREAD_GROUP_MAX_Z, - // }; - - let max_sampled_textures = d3d11::D3D11_COMMONSHADER_INPUT_RESOURCE_REGISTER_COUNT; - let max_samplers = d3d11::D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT; - let max_constant_buffers = d3d11::D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - 1; - let max_uavs = if device.as_device1().is_some() { - d3d11::D3D11_1_UAV_SLOT_COUNT - } else { - d3d11::D3D11_PS_CS_UAV_REGISTER_COUNT - }; - let max_output_registers = d3d11::D3D11_VS_OUTPUT_REGISTER_COMPONENTS; - let max_compute_invocations_per_workgroup = - d3d11::D3D11_CS_THREAD_GROUP_MAX_THREADS_PER_GROUP; - let max_compute_workgroups_per_dimension = - d3d11::D3D11_CS_DISPATCH_MAX_THREAD_GROUPS_PER_DIMENSION; - - let limits = wgt::Limits { - max_texture_dimension_1d: max_texture_dimension_2d, - max_texture_dimension_2d, - max_texture_dimension_3d, - max_texture_array_layers: max_texture_dimension_3d, - max_bind_groups: u32::MAX, - max_bindings_per_bind_group: 65535, - max_dynamic_uniform_buffers_per_pipeline_layout: max_constant_buffers, - max_dynamic_storage_buffers_per_pipeline_layout: 0, - max_sampled_textures_per_shader_stage: max_sampled_textures, - max_samplers_per_shader_stage: max_samplers, - max_storage_buffers_per_shader_stage: max_uavs, - max_storage_textures_per_shader_stage: max_uavs, - max_uniform_buffers_per_shader_stage: max_constant_buffers, - max_uniform_buffer_binding_size: 1 << 16, - max_storage_buffer_binding_size: u32::MAX, - max_vertex_buffers, - max_vertex_attributes: max_vertex_buffers, - max_vertex_buffer_array_stride: u32::MAX, - max_push_constant_size: 1 << 16, - min_uniform_buffer_offset_alignment: 256, - min_storage_buffer_offset_alignment: 1, - max_inter_stage_shader_components: max_output_registers, - max_compute_workgroup_storage_size, - max_compute_invocations_per_workgroup, - max_compute_workgroup_size_x: max_workgroup_size_xy, - max_compute_workgroup_size_y: max_workgroup_size_xy, - max_compute_workgroup_size_z: max_workgroup_size_z, - max_compute_workgroups_per_dimension, - // D3D11_BUFFER_DESC represents the buffer size as a 32 bit int. - max_buffer_size: u32::MAX as u64, - max_non_sampler_bindings: u32::MAX, - }; - - // - // Other capabilities - // - - let shader_model = match feature_level { - FL9_1..=FL9_3 => wgt::ShaderModel::Sm2, - FL10_0 | FL10_1 => wgt::ShaderModel::Sm4, - _ => wgt::ShaderModel::Sm5, - }; - - let device_info = wgt::AdapterInfo { - name: String::new(), - vendor: 0, - device: 0, - device_type: match d3d11_features2.UnifiedMemoryArchitecture { - 0 => wgt::DeviceType::DiscreteGpu, - 1 => wgt::DeviceType::IntegratedGpu, - _ => unreachable!(), - }, - driver: String::new(), - driver_info: String::new(), - backend: wgt::Backend::Dx11, - }; - - // - // Build up the structs - // - - let api_adapter = super::Adapter { device }; - - let alignments = crate::Alignments { - buffer_copy_offset: NonZeroU64::new(1).unwrap(), // todo - buffer_copy_pitch: NonZeroU64::new(1).unwrap(), // todo - }; - - let capabilities = crate::Capabilities { - limits, - alignments, - downlevel: wgt::DownlevelCapabilities { - flags: downlevel, - limits: wgt::DownlevelLimits {}, - shader_model, - }, - }; - - Some(crate::ExposedAdapter { - adapter: api_adapter, - info: device_info, - features, - capabilities, - }) - } -} diff --git a/wgpu-hal/src/dx11/command.rs b/wgpu-hal/src/dx11/command.rs deleted file mode 100644 index e5cc92bff9..0000000000 --- a/wgpu-hal/src/dx11/command.rs +++ /dev/null @@ -1,271 +0,0 @@ -impl crate::CommandEncoder for super::CommandEncoder { - unsafe fn begin_encoding(&mut self, label: crate::Label) -> Result<(), crate::DeviceError> { - todo!() - } - - unsafe fn discard_encoding(&mut self) { - todo!() - } - - unsafe fn end_encoding(&mut self) -> Result { - todo!() - } - - unsafe fn reset_all(&mut self, command_buffers: I) - where - I: Iterator, - { - todo!() - } - - unsafe fn transition_buffers<'a, T>(&mut self, barriers: T) - where - T: Iterator>, - { - todo!() - } - - unsafe fn transition_textures<'a, T>(&mut self, barriers: T) - where - T: Iterator>, - { - todo!() - } - - unsafe fn clear_buffer(&mut self, buffer: &super::Buffer, range: crate::MemoryRange) { - todo!() - } - - unsafe fn copy_buffer_to_buffer( - &mut self, - src: &super::Buffer, - dst: &super::Buffer, - regions: T, - ) where - T: Iterator, - { - todo!() - } - - unsafe fn copy_texture_to_texture( - &mut self, - src: &super::Texture, - src_usage: crate::TextureUses, - dst: &super::Texture, - regions: T, - ) where - T: Iterator, - { - todo!() - } - - unsafe fn copy_buffer_to_texture( - &mut self, - src: &super::Buffer, - dst: &super::Texture, - regions: T, - ) where - T: Iterator, - { - todo!() - } - - unsafe fn copy_texture_to_buffer( - &mut self, - src: &super::Texture, - src_usage: crate::TextureUses, - dst: &super::Buffer, - regions: T, - ) where - T: Iterator, - { - todo!() - } - - unsafe fn set_bind_group( - &mut self, - layout: &super::PipelineLayout, - index: u32, - group: &super::BindGroup, - dynamic_offsets: &[wgt::DynamicOffset], - ) { - todo!() - } - - unsafe fn set_push_constants( - &mut self, - layout: &super::PipelineLayout, - stages: wgt::ShaderStages, - offset_bytes: u32, - data: &[u32], - ) { - todo!() - } - - unsafe fn insert_debug_marker(&mut self, label: &str) { - todo!() - } - - unsafe fn begin_debug_marker(&mut self, group_label: &str) { - todo!() - } - - unsafe fn end_debug_marker(&mut self) { - todo!() - } - - unsafe fn begin_query(&mut self, set: &super::QuerySet, index: u32) { - todo!() - } - - unsafe fn end_query(&mut self, set: &super::QuerySet, index: u32) { - todo!() - } - - unsafe fn write_timestamp(&mut self, set: &super::QuerySet, index: u32) { - todo!() - } - - unsafe fn reset_queries(&mut self, set: &super::QuerySet, range: std::ops::Range) { - todo!() - } - - unsafe fn copy_query_results( - &mut self, - set: &super::QuerySet, - range: std::ops::Range, - buffer: &super::Buffer, - offset: wgt::BufferAddress, - stride: wgt::BufferSize, - ) { - todo!() - } - - unsafe fn begin_render_pass(&mut self, desc: &crate::RenderPassDescriptor) { - todo!() - } - - unsafe fn end_render_pass(&mut self) { - todo!() - } - - unsafe fn set_render_pipeline(&mut self, pipeline: &super::RenderPipeline) { - todo!() - } - - unsafe fn set_index_buffer<'a>( - &mut self, - binding: crate::BufferBinding<'a, super::Api>, - format: wgt::IndexFormat, - ) { - todo!() - } - - unsafe fn set_vertex_buffer<'a>( - &mut self, - index: u32, - binding: crate::BufferBinding<'a, super::Api>, - ) { - todo!() - } - - unsafe fn set_viewport(&mut self, rect: &crate::Rect, depth_range: std::ops::Range) { - todo!() - } - - unsafe fn set_scissor_rect(&mut self, rect: &crate::Rect) { - todo!() - } - - unsafe fn set_stencil_reference(&mut self, value: u32) { - todo!() - } - - unsafe fn set_blend_constants(&mut self, color: &[f32; 4]) { - todo!() - } - - unsafe fn draw( - &mut self, - first_vertex: u32, - vertex_count: u32, - first_instance: u32, - instance_count: u32, - ) { - todo!() - } - - unsafe fn draw_indexed( - &mut self, - first_index: u32, - index_count: u32, - base_vertex: i32, - first_instance: u32, - instance_count: u32, - ) { - todo!() - } - - unsafe fn draw_indirect( - &mut self, - buffer: &super::Buffer, - offset: wgt::BufferAddress, - draw_count: u32, - ) { - todo!() - } - - unsafe fn draw_indexed_indirect( - &mut self, - buffer: &super::Buffer, - offset: wgt::BufferAddress, - draw_count: u32, - ) { - todo!() - } - - unsafe fn draw_indirect_count( - &mut self, - buffer: &super::Buffer, - offset: wgt::BufferAddress, - count_buffer: &super::Buffer, - count_offset: wgt::BufferAddress, - max_count: u32, - ) { - todo!() - } - - unsafe fn draw_indexed_indirect_count( - &mut self, - buffer: &super::Buffer, - offset: wgt::BufferAddress, - count_buffer: &super::Buffer, - count_offset: wgt::BufferAddress, - max_count: u32, - ) { - todo!() - } - - unsafe fn begin_compute_pass<'a>( - &mut self, - desc: &crate::ComputePassDescriptor<'a, super::Api>, - ) { - todo!() - } - - unsafe fn end_compute_pass(&mut self) { - todo!() - } - - unsafe fn set_compute_pipeline(&mut self, pipeline: &super::ComputePipeline) { - todo!() - } - - unsafe fn dispatch(&mut self, count: [u32; 3]) { - todo!() - } - - unsafe fn dispatch_indirect(&mut self, buffer: &super::Buffer, offset: wgt::BufferAddress) { - todo!() - } -} diff --git a/wgpu-hal/src/dx11/device.rs b/wgpu-hal/src/dx11/device.rs deleted file mode 100644 index ce33584e35..0000000000 --- a/wgpu-hal/src/dx11/device.rs +++ /dev/null @@ -1,242 +0,0 @@ -use std::{ffi::c_void, mem}; - -use winapi::um::d3d11; - -use crate::auxil::dxgi::result::HResult; - -impl crate::Device for super::Device { - unsafe fn exit(self, queue: super::Queue) { - todo!() - } - - unsafe fn create_buffer( - &self, - desc: &crate::BufferDescriptor, - ) -> Result { - todo!() - } - - unsafe fn destroy_buffer(&self, buffer: super::Buffer) { - todo!() - } - - unsafe fn map_buffer( - &self, - buffer: &super::Buffer, - range: crate::MemoryRange, - ) -> Result { - todo!() - } - - unsafe fn unmap_buffer(&self, buffer: &super::Buffer) -> Result<(), crate::DeviceError> { - todo!() - } - - unsafe fn flush_mapped_ranges(&self, buffer: &super::Buffer, ranges: I) - where - I: Iterator, - { - todo!() - } - - unsafe fn invalidate_mapped_ranges(&self, buffer: &super::Buffer, ranges: I) - where - I: Iterator, - { - todo!() - } - - unsafe fn create_texture( - &self, - desc: &crate::TextureDescriptor, - ) -> Result { - todo!() - } - - unsafe fn destroy_texture(&self, texture: super::Texture) { - todo!() - } - - unsafe fn create_texture_view( - &self, - texture: &super::Texture, - desc: &crate::TextureViewDescriptor, - ) -> Result { - todo!() - } - - unsafe fn destroy_texture_view(&self, view: super::TextureView) { - todo!() - } - - unsafe fn create_sampler( - &self, - desc: &crate::SamplerDescriptor, - ) -> Result { - todo!() - } - - unsafe fn destroy_sampler(&self, sampler: super::Sampler) { - todo!() - } - - unsafe fn create_command_encoder( - &self, - desc: &crate::CommandEncoderDescriptor, - ) -> Result { - todo!() - } - - unsafe fn destroy_command_encoder(&self, pool: super::CommandEncoder) { - todo!() - } - - unsafe fn create_bind_group_layout( - &self, - desc: &crate::BindGroupLayoutDescriptor, - ) -> Result { - todo!() - } - - unsafe fn destroy_bind_group_layout(&self, bg_layout: super::BindGroupLayout) { - todo!() - } - - unsafe fn create_pipeline_layout( - &self, - desc: &crate::PipelineLayoutDescriptor, - ) -> Result { - todo!() - } - - unsafe fn destroy_pipeline_layout(&self, pipeline_layout: super::PipelineLayout) { - todo!() - } - - unsafe fn create_bind_group( - &self, - desc: &crate::BindGroupDescriptor, - ) -> Result { - todo!() - } - - unsafe fn destroy_bind_group(&self, group: super::BindGroup) { - todo!() - } - - unsafe fn create_shader_module( - &self, - desc: &crate::ShaderModuleDescriptor, - shader: crate::ShaderInput, - ) -> Result { - todo!() - } - - unsafe fn destroy_shader_module(&self, module: super::ShaderModule) { - todo!() - } - - unsafe fn create_render_pipeline( - &self, - desc: &crate::RenderPipelineDescriptor, - ) -> Result { - todo!() - } - - unsafe fn destroy_render_pipeline(&self, pipeline: super::RenderPipeline) { - todo!() - } - - unsafe fn create_compute_pipeline( - &self, - desc: &crate::ComputePipelineDescriptor, - ) -> Result { - todo!() - } - - unsafe fn destroy_compute_pipeline(&self, pipeline: super::ComputePipeline) { - todo!() - } - - unsafe fn create_query_set( - &self, - desc: &wgt::QuerySetDescriptor, - ) -> Result { - todo!() - } - - unsafe fn destroy_query_set(&self, set: super::QuerySet) { - todo!() - } - - unsafe fn create_fence(&self) -> Result { - todo!() - } - - unsafe fn destroy_fence(&self, fence: super::Fence) { - todo!() - } - - unsafe fn get_fence_value( - &self, - fence: &super::Fence, - ) -> Result { - todo!() - } - - unsafe fn wait( - &self, - fence: &super::Fence, - value: crate::FenceValue, - timeout_ms: u32, - ) -> Result { - todo!() - } - - unsafe fn start_capture(&self) -> bool { - todo!() - } - - unsafe fn stop_capture(&self) { - todo!() - } -} - -impl crate::Queue for super::Queue { - unsafe fn submit( - &self, - command_buffers: &[&super::CommandBuffer], - signal_fence: Option<(&mut super::Fence, crate::FenceValue)>, - ) -> Result<(), crate::DeviceError> { - todo!() - } - - unsafe fn present( - &self, - surface: &super::Surface, - texture: super::SurfaceTexture, - ) -> Result<(), crate::SurfaceError> { - todo!() - } - - unsafe fn get_timestamp_period(&self) -> f32 { - todo!() - } -} - -impl super::D3D11Device { - #[allow(trivial_casts)] // come on - pub unsafe fn check_feature_support(&self, feature: d3d11::D3D11_FEATURE) -> T { - unsafe { - let mut value = mem::zeroed::(); - let ret = self.CheckFeatureSupport( - feature, - &mut value as *mut T as *mut c_void, - mem::size_of::() as u32, - ); - assert_eq!(ret.into_result(), Ok(())); - - value - } - } -} diff --git a/wgpu-hal/src/dx11/instance.rs b/wgpu-hal/src/dx11/instance.rs deleted file mode 100644 index 7df96ca6bd..0000000000 --- a/wgpu-hal/src/dx11/instance.rs +++ /dev/null @@ -1,53 +0,0 @@ -use crate::auxil; - -impl crate::Instance for super::Instance { - unsafe fn init(desc: &crate::InstanceDescriptor) -> Result { - profiling::scope!("Init DX11 Backend"); - - let enable_dx11 = match std::env::var("WGPU_UNSTABLE_DX11_BACKEND") { - Ok(string) => string == "1" || string == "true", - Err(_) => false, - }; - - if !enable_dx11 { - return Err(crate::InstanceError::new(String::from( - "DX11 support is unstable; set WGPU_UNSTABLE_DX11_BACKEND=1 to enable anyway", - ))); - } - - let lib_d3d11 = super::library::D3D11Lib::new() - .ok_or_else(|| crate::InstanceError::new(String::from("failed to load d3d11.dll")))?; - - let (lib_dxgi, factory) = auxil::dxgi::factory::create_factory( - auxil::dxgi::factory::DxgiFactoryType::Factory1, - desc.flags, - )?; - - Ok(super::Instance { - lib_d3d11, - lib_dxgi, - factory, - }) - } - - unsafe fn create_surface( - &self, - display_handle: raw_window_handle::RawDisplayHandle, - window_handle: raw_window_handle::RawWindowHandle, - ) -> Result { - todo!() - } - - unsafe fn destroy_surface(&self, surface: super::Surface) { - todo!() - } - - unsafe fn enumerate_adapters(&self) -> Vec> { - let adapters = auxil::dxgi::factory::enumerate_adapters(self.factory.clone()); - - adapters - .into_iter() - .filter_map(|adapter| super::Adapter::expose(&self.lib_d3d11, adapter)) - .collect() - } -} diff --git a/wgpu-hal/src/dx11/library.rs b/wgpu-hal/src/dx11/library.rs deleted file mode 100644 index 2b7b1b1c2a..0000000000 --- a/wgpu-hal/src/dx11/library.rs +++ /dev/null @@ -1,142 +0,0 @@ -use std::ptr; - -use winapi::{ - shared::{ - dxgi, - minwindef::{HMODULE, UINT}, - winerror, - }, - um::{d3d11, d3d11_1, d3d11_2, d3dcommon}, -}; - -use crate::auxil::dxgi::result::HResult; - -type D3D11CreateDeviceFun = unsafe extern "system" fn( - *mut dxgi::IDXGIAdapter, - d3dcommon::D3D_DRIVER_TYPE, - HMODULE, - UINT, - *const d3dcommon::D3D_FEATURE_LEVEL, - UINT, - UINT, - *mut *mut d3d11::ID3D11Device, - *mut d3dcommon::D3D_FEATURE_LEVEL, - *mut *mut d3d11::ID3D11DeviceContext, -) -> d3d12::HRESULT; - -pub(super) struct D3D11Lib { - // We use the os specific symbol to drop the lifetime parameter. - // - // SAFETY: we must ensure this outlives the Library. - d3d11_create_device: libloading::os::windows::Symbol, - - lib: libloading::Library, -} -impl D3D11Lib { - pub fn new() -> Option { - unsafe { - let lib = libloading::Library::new("d3d11.dll").ok()?; - - let d3d11_create_device = lib - .get::(b"D3D11CreateDevice") - .ok()? - .into_raw(); - - Some(Self { - lib, - d3d11_create_device, - }) - } - } - - pub fn create_device( - &self, - adapter: d3d12::DxgiAdapter, - ) -> Option<(super::D3D11Device, d3dcommon::D3D_FEATURE_LEVEL)> { - let feature_levels = [ - d3dcommon::D3D_FEATURE_LEVEL_11_1, - d3dcommon::D3D_FEATURE_LEVEL_11_0, - d3dcommon::D3D_FEATURE_LEVEL_10_1, - d3dcommon::D3D_FEATURE_LEVEL_10_0, - d3dcommon::D3D_FEATURE_LEVEL_9_3, - d3dcommon::D3D_FEATURE_LEVEL_9_2, - d3dcommon::D3D_FEATURE_LEVEL_9_1, - ]; - - let mut device = d3d12::ComPtr::::null(); - let mut feature_level: d3dcommon::D3D_FEATURE_LEVEL = 0; - - // We need to try this twice. If the first time fails due to E_INVALIDARG - // we are running on a machine without a D3D11.1 runtime, and need to - // retry without the feature level 11_1 feature level. - // - // Why they thought this was a good API, who knows. - - let mut hr = unsafe { - (self.d3d11_create_device)( - adapter.as_mut_ptr() as *mut _, - d3dcommon::D3D_DRIVER_TYPE_UNKNOWN, - ptr::null_mut(), // software implementation DLL??? - 0, // flags - feature_levels.as_ptr(), - feature_levels.len() as u32, - d3d11::D3D11_SDK_VERSION, - device.mut_self(), - &mut feature_level, - ptr::null_mut(), // device context - ) - }; - - // Try again without FL11_1 - if hr == winerror::E_INVALIDARG { - hr = unsafe { - (self.d3d11_create_device)( - adapter.as_mut_ptr() as *mut _, - d3dcommon::D3D_DRIVER_TYPE_UNKNOWN, - ptr::null_mut(), // software implementation DLL??? - 0, // flags - feature_levels[1..].as_ptr(), - feature_levels[1..].len() as u32, - d3d11::D3D11_SDK_VERSION, - device.mut_self(), - &mut feature_level, - ptr::null_mut(), // device context - ) - }; - } - - // Any errors here are real and we should complain about - if let Err(err) = hr.into_result() { - log::error!("Failed to make a D3D11 device: {}", err); - return None; - } - - // We always try to upcast in highest -> lowest order - - // Device -> Device2 - unsafe { - match device.cast::().into_result() { - Ok(device2) => { - return Some((super::D3D11Device::Device2(device2), feature_level)); - } - Err(hr) => { - log::warn!("Failed to cast device to ID3D11Device2: {}", hr) - } - } - } - - // Device -> Device1 - unsafe { - match device.cast::().into_result() { - Ok(device1) => { - return Some((super::D3D11Device::Device1(device1), feature_level)); - } - Err(hr) => { - log::warn!("Failed to cast device to ID3D11Device1: {}", hr) - } - } - } - - Some((super::D3D11Device::Device(device), feature_level)) - } -} diff --git a/wgpu-hal/src/dx11/mod.rs b/wgpu-hal/src/dx11/mod.rs deleted file mode 100644 index 203f37cac5..0000000000 --- a/wgpu-hal/src/dx11/mod.rs +++ /dev/null @@ -1,139 +0,0 @@ -#![allow(dead_code)] -#![allow(unused_variables)] - -use winapi::um::{d3d11, d3d11_1, d3d11_2}; - -mod adapter; -mod command; -mod device; -mod instance; -mod library; - -#[derive(Clone, Debug)] -pub struct Api; - -impl crate::Api for Api { - type Instance = Instance; - type Surface = Surface; - type Adapter = Adapter; - type Device = Device; - - type Queue = Queue; - type CommandEncoder = CommandEncoder; - type CommandBuffer = CommandBuffer; - - type Buffer = Buffer; - type Texture = Texture; - type SurfaceTexture = SurfaceTexture; - type TextureView = TextureView; - type Sampler = Sampler; - type QuerySet = QuerySet; - type Fence = Fence; - - type BindGroupLayout = BindGroupLayout; - type BindGroup = BindGroup; - type PipelineLayout = PipelineLayout; - type ShaderModule = ShaderModule; - type RenderPipeline = RenderPipeline; - type ComputePipeline = ComputePipeline; -} - -pub struct Instance { - lib_d3d11: library::D3D11Lib, - lib_dxgi: d3d12::DxgiLib, - factory: d3d12::DxgiFactory, -} - -unsafe impl Send for Instance {} -unsafe impl Sync for Instance {} - -pub struct Surface {} - -pub struct Adapter { - device: D3D11Device, -} - -unsafe impl Send for Adapter {} -unsafe impl Sync for Adapter {} - -d3d12::weak_com_inheritance_chain! { - #[derive(Debug, Clone, PartialEq)] - enum D3D11Device { - Device(d3d11::ID3D11Device), from_device, as_device, device; - Device1(d3d11_1::ID3D11Device1), from_device1, as_device1, unwrap_device1; - Device2(d3d11_2::ID3D11Device2), from_device2, as_device2, unwrap_device2; - } -} - -pub struct Device {} - -unsafe impl Send for Device {} -unsafe impl Sync for Device {} - -pub struct Queue {} - -#[derive(Debug)] -pub struct CommandEncoder {} - -#[derive(Debug)] -pub struct CommandBuffer {} - -#[derive(Debug)] -pub struct Buffer {} -#[derive(Debug)] -pub struct Texture {} -#[derive(Debug)] -pub struct SurfaceTexture {} - -impl std::borrow::Borrow for SurfaceTexture { - fn borrow(&self) -> &Texture { - todo!() - } -} - -#[derive(Debug)] -pub struct TextureView {} -#[derive(Debug)] -pub struct Sampler {} -#[derive(Debug)] -pub struct QuerySet {} -#[derive(Debug)] -pub struct Fence {} - -#[derive(Debug)] -pub struct BindGroupLayout {} -#[derive(Debug)] -pub struct BindGroup {} -#[derive(Debug)] -pub struct PipelineLayout {} -#[derive(Debug)] -pub struct ShaderModule {} -#[derive(Debug)] -pub struct RenderPipeline {} -#[derive(Debug)] -pub struct ComputePipeline {} - -impl crate::Surface for Surface { - unsafe fn configure( - &self, - device: &Device, - config: &crate::SurfaceConfiguration, - ) -> Result<(), crate::SurfaceError> { - todo!() - } - - unsafe fn unconfigure(&self, device: &Device) { - todo!() - } - - unsafe fn acquire_texture( - &self, - _timeout: Option, - ) -> Result>, crate::SurfaceError> { - todo!() - } - - unsafe fn discard_texture(&self, texture: SurfaceTexture) { - todo!() - } -} diff --git a/wgpu-hal/src/lib.rs b/wgpu-hal/src/lib.rs index 6a03b32a72..b2c4e240ef 100644 --- a/wgpu-hal/src/lib.rs +++ b/wgpu-hal/src/lib.rs @@ -11,7 +11,7 @@ * General design direction is to follow the majority by the following weights: * - wgpu-core: 1.5 * - primary backends (Vulkan/Metal/DX12): 1.0 each - * - secondary backends (DX11/GLES): 0.5 each + * - secondary backend (GLES): 0.5 */ #![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] @@ -51,9 +51,6 @@ clippy::pattern_type_mismatch, )] -/// DirectX11 API internals. -#[cfg(all(feature = "dx11", windows))] -pub mod dx11; /// DirectX12 API internals. #[cfg(all(feature = "dx12", windows))] pub mod dx12; @@ -71,8 +68,6 @@ pub mod vulkan; pub mod auxil; pub mod api { - #[cfg(all(feature = "dx11", windows))] - pub use super::dx11::Api as Dx11; #[cfg(all(feature = "dx12", windows))] pub use super::dx12::Api as Dx12; pub use super::empty::Api as Empty; diff --git a/wgpu-types/src/lib.rs b/wgpu-types/src/lib.rs index 07fa3276be..560a061355 100644 --- a/wgpu-types/src/lib.rs +++ b/wgpu-types/src/lib.rs @@ -102,12 +102,10 @@ pub enum Backend { Metal = 2, /// Direct3D-12 (Windows) Dx12 = 3, - /// Direct3D-11 (Windows) - Dx11 = 4, /// OpenGL ES-3 (Linux, Android) - Gl = 5, + Gl = 4, /// WebGPU in the browser - BrowserWebGpu = 6, + BrowserWebGpu = 5, } impl Backend { @@ -118,7 +116,6 @@ impl Backend { Backend::Vulkan => "vulkan", Backend::Metal => "metal", Backend::Dx12 => "dx12", - Backend::Dx11 => "dx11", Backend::Gl => "gl", Backend::BrowserWebGpu => "webgpu", } @@ -158,8 +155,6 @@ bitflags::bitflags! { const METAL = 1 << Backend::Metal as u32; /// Supported on Windows 10 const DX12 = 1 << Backend::Dx12 as u32; - /// Supported on Windows 7+ - const DX11 = 1 << Backend::Dx11 as u32; /// Supported when targeting the web through webassembly const BROWSER_WEBGPU = 1 << Backend::BrowserWebGpu as u32; /// All the apis that wgpu offers first tier of support for. @@ -172,8 +167,8 @@ bitflags::bitflags! { /// All the apis that wgpu offers second tier of support for. These may /// be unsupported/still experimental. /// - /// OpenGL + DX11 - const SECONDARY = Self::GL.bits() | Self::DX11.bits(); + /// OpenGL + const SECONDARY = Self::GL.bits(); } } @@ -665,7 +660,6 @@ bitflags::bitflags! { /// - DX12 /// - Vulkan /// - Metal - /// - DX11 (emulated with uniforms) /// - OpenGL (emulated with uniforms) /// /// This is a native only feature. @@ -681,7 +675,6 @@ bitflags::bitflags! { /// - DX12 /// - Vulkan /// - Metal - /// - DX11 /// - OpenGL /// /// This is a native only feature. @@ -693,7 +686,6 @@ bitflags::bitflags! { /// - DX12 /// - Vulkan /// - Metal (macOS 10.12+ only) - /// - DX11 /// - OpenGL /// /// This is a native only feature. @@ -820,7 +812,6 @@ bitflags::bitflags! { /// /// Supported platforms: /// - Vulkan - /// - DX11 (feature level 10+) /// - DX12 /// - Metal (some) /// - OpenGL (some) @@ -1076,7 +1067,7 @@ pub struct Limits { /// - Vulkan: 128-256 bytes /// - DX12: 256 bytes /// - Metal: 4096 bytes - /// - DX11 & OpenGL don't natively support push constants, and are emulated with uniforms, + /// - OpenGL doesn't natively support push constants, and are emulated with uniforms, /// so this number is less useful but likely 256. pub max_push_constant_size: u32, @@ -1421,13 +1412,13 @@ bitflags::bitflags! { pub struct DownlevelFlags: u32 { /// The device supports compiling and using compute shaders. /// - /// DX11 on FL10 level hardware, WebGL2, and GLES3.0 devices do not support compute. + /// WebGL2, and GLES3.0 devices do not support compute. const COMPUTE_SHADERS = 1 << 0; /// Supports binding storage buffers and textures to fragment shaders. const FRAGMENT_WRITABLE_STORAGE = 1 << 1; /// Supports indirect drawing and dispatching. /// - /// DX11 on FL10 level hardware, WebGL2, GLES 3.0, and Metal on Apple1/Apple2 GPUs do not support indirect. + /// WebGL2, GLES 3.0, and Metal on Apple1/Apple2 GPUs do not support indirect. const INDIRECT_EXECUTION = 1 << 2; /// Supports non-zero `base_vertex` parameter to direct indexed draw calls. /// @@ -4932,7 +4923,7 @@ pub enum PresentMode { /// /// No tearing will be observed. /// - /// Supported on DX11/12 on Windows 10, NVidia on Vulkan and Wayland on Vulkan. + /// Supported on DX12 on Windows 10, NVidia on Vulkan and Wayland on Vulkan. /// /// This is traditionally called "Fast Vsync" Mailbox = 5, diff --git a/wgpu/Cargo.toml b/wgpu/Cargo.toml index 210e4d87db..bebeeaf5ff 100644 --- a/wgpu/Cargo.toml +++ b/wgpu/Cargo.toml @@ -66,10 +66,10 @@ features = ["raw-window-handle"] workspace = true features = ["metal"] -# We want the wgpu-core Direct3D backends and OpenGL (via WGL) on Windows. +# We want the wgpu-core Direct3D backend and OpenGL (via WGL) on Windows. [target.'cfg(windows)'.dependencies.wgc] workspace = true -features = ["dx11", "dx12", "gles"] +features = ["dx12", "gles"] # We want the wgpu-core Vulkan backend on Unix (but not emscripten, macOS, iOS) and Windows. [target.'cfg(any(windows, all(unix, not(target_os = "emscripten"), not(target_os = "ios"), not(target_os = "macos"))))'.dependencies.wgc]