From 29133bc783f2034ed351f3a1d0327a840aba3a3d Mon Sep 17 00:00:00 2001 From: Nic Barker Date: Tue, 22 Oct 2024 20:41:35 +1300 Subject: [PATCH] Multi-type elements (#34) --- README.md | 1083 ++++---- bindings/odin/clay-odin/clay.odin | 154 +- bindings/odin/clay-odin/linux/clay.a | Bin 184332 -> 159628 bytes bindings/odin/clay-odin/macos-arm64/clay.a | Bin 134016 -> 116736 bytes bindings/odin/clay-odin/macos/clay.a | Bin 144160 -> 123600 bytes bindings/odin/clay-odin/wasm/clay.o | Bin 295982 -> 219784 bytes bindings/odin/clay-odin/windows/clay.lib | Bin 190952 -> 151229 bytes .../clay-official-website.odin | 250 +- clay.h | 2254 +++++++++-------- examples/clay-official-website/index.html | 12 +- examples/clay-official-website/main.c | 393 +-- examples/cpp-project-example/CMakeLists.txt | 2 +- examples/cpp-project-example/main.cpp | 5 + .../CMakeLists.txt | 2 +- .../raylib-sidebar-scrolling-container/main.c | 166 +- .../multi-compilation-unit.c | 2 +- generator/array_allocate.template.c | 3 + generator/array_define.template.c | 6 +- generator/array_define_slice.template.c | 5 + generator/array_get_slice.template.c | 3 + 20 files changed, 2296 insertions(+), 2044 deletions(-) create mode 100644 generator/array_allocate.template.c create mode 100644 generator/array_define_slice.template.c create mode 100644 generator/array_get_slice.template.c diff --git a/README.md b/README.md index 01df96e..159584d 100644 --- a/README.md +++ b/README.md @@ -83,8 +83,8 @@ Clay_LayoutConfig sidebarItemLayout = (Clay_LayoutConfig) { }; // Re-useable components are just normal functions -void SidebarItemComponent(int index) { - CLAY_RECTANGLE(CLAY_IDI("SidebarBlob", index), sidebarItemLayout, CLAY_RECTANGLE_CONFIG(.color = COLOR_ORANGE)) {} +void SidebarItemComponent() { + CLAY(CLAY_LAYOUT(sidebarItemLayout), CLAY_RECTANGLE({ .color = COLOR_ORANGE })) {} } // An example function to begin the "root" of your layout tree @@ -92,20 +92,23 @@ Clay_RenderCommandArray CreateLayout() { Clay_BeginLayout(); // An example of laying out a UI with a fixed width sidebar and flexible width main content - CLAY_RECTANGLE(CLAY_ID("OuterContainer"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_GROW()}, .padding = {16, 16}, .childGap = 16), CLAY_RECTANGLE_CONFIG(.color = {250,250,255,255})) { - CLAY_RECTANGLE(CLAY_ID("SideBar"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_FIXED(300), .height = CLAY_SIZING_GROW() }, .padding = {16, 16}, .childGap = 16), CLAY_RECTANGLE_CONFIG(.color = COLOR_LIGHT)) { - CLAY_RECTANGLE(CLAY_ID("ProfilePictureOuter"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW() }, .padding = {16, 16}, .childGap = 16, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER }), CLAY_RECTANGLE_CONFIG(.color = COLOR_RED)) { - CLAY_IMAGE(CLAY_ID("ProfilePicture"), CLAY_LAYOUT( .sizing = { .width = CLAY_SIZING_FIXED(60), .height = CLAY_SIZING_FIXED(60) }), CLAY_IMAGE_CONFIG(.imageData = &profilePicture, .height = 60, .width = 60)) {} - CLAY_TEXT(CLAY_ID("ProfileTitle"), CLAY_STRING("Clay - UI Library"), CLAY_TEXT_CONFIG(.fontSize = 24, .textColor = {255, 255, 255, 255})); + CLAY(CLAY_ID("OuterContainer"), CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_GROW()}, .padding = {16, 16}, .childGap = 16 }), CLAY_RECTANGLE({ .color = {250,250,255,255} })) { + CLAY(CLAY_ID("SideBar"), + CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_FIXED(300), .height = CLAY_SIZING_GROW() }, .padding = {16, 16}, .childGap = 16 }), + CLAY_RECTANGLE({ .color = COLOR_LIGHT }) + ) { + CLAY(CLAY_ID("ProfilePictureOuter"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW() }, .padding = {16, 16}, .childGap = 16, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER }), CLAY_RECTANGLE({ .color = COLOR_RED })) { + CLAY(CLAY_ID("ProfilePicture"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_FIXED(60), .height = CLAY_SIZING_FIXED(60) }}), CLAY_IMAGE({ .imageData = &profilePicture, .height = 60, .width = 60 })) {} + CLAY_TEXT(CLAY_ID("ProfileTitle"), CLAY_STRING("Clay - UI Library"), CLAY_TEXT_CONFIG({ .fontSize = 24, .textColor = {255, 255, 255, 255} })); } // Standard C code like loops etc work inside components for (int i = 0; i < 5; i++) { - SidebarItemComponent(i); + SidebarItemComponent(); } } - CLAY_RECTANGLE(CLAY_ID("MainContent"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_GROW() }), CLAY_RECTANGLE_CONFIG(.color = COLOR_LIGHT)) {} + CLAY(CLAY_ID("MainContent"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_GROW() }}), CLAY_RECTANGLE({ .color = COLOR_LIGHT })) {} } // ... }); @@ -149,16 +152,16 @@ For help starting out or to discuss clay, considering joining [the discord serve ## High Level Documentation ### Building UI Hierarchies -Clay UI hierarchies are built using C macros that allow _nested_ declarations, similar to other declarative UI systems like HTML. +Clay UIs are built using the C macro `CLAY()`. This macro creates a new empty element in the UI hierarchy, and supports modular customisation of layout, styling and functionality. The `CLAY()` macro can also be _nested_, similar to other declarative UI systems like HTML. -This means that child elements are declared _inside_ their parent elements. Clay element macros work by opening a block: `{}` after calling the element macro (exactly like you would with an `if` statement or `for` loop), and declaring child components inside the braces. +Child elements are added by opening a block: `{}` after calling the `CLAY()` macro (exactly like you would with an `if` statement or `for` loop), and declaring child components inside the braces. ```C -// Parent element -CLAY_CONTAINER(id, layout) { +// Parent element with 8px of padding +CLAY(CLAY_LAYOUT({ .padding = 8 })) { // Child element 1 - CLAY_TEXT(id, text, config); - // Child element 2 - CLAY_RECTANGLE(id, layout, config) { + CLAY_TEXT(CLAY_STRING("Hello World"), CLAY_TEXT_CONFIG({ .fontSize = 16 })); + // Child element 2 with red background + CLAY(CLAY_RECTANGLE({ .color = COLOR_RED })) { // etc } } @@ -168,20 +171,21 @@ However, unlike HTML and other declarative DSLs, these macros are just C. As a r ```C // Re-usable "components" are just functions that declare more UI void ButtonComponent(Clay_String buttonText) { - CLAY_RECTANGLE(id, layout, config) { - CLAY_TEXT(id, buttonText, config); + // Red box button with 8px of padding + CLAY(CLAY_LAYOUT({ .padding = { 8, 8 }}), CLAY_RECTANGLE({ .color = COLOR_RED })) { + CLAY_TEXT(buttonText, textConfig); } } // Parent element -CLAY_CONTAINER(id, layout, { +CLAY(CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM })) { // Render a bunch of text elements for (int i = 0; i < textArray.length; i++) { - CLAY_TEXT(id, textArray.elements[i], config); + CLAY_TEXT(textArray.elements[i], textConfig); } // Only render this element if we're on a mobile screen if (isMobileScreen) { - CLAY_CONTAINER(id, layout) { + CLAY() { // etc } } @@ -192,9 +196,9 @@ CLAY_CONTAINER(id, layout, { ``` ### Configuring Layout and Styling UI Elements -Many of the element macros in Clay take a `Clay_LayoutConfig` as the second argument. Clay provides a convenience macro, [CLAY_LAYOUT()](#clay_layout) for easy construction of element styles. +The layout of clay elements is configured with the `CLAY_LAYOUT()` macro. ```C -CLAY_CONTAINER(id, CLAY_LAYOUT(.padding = {.x = 8, .y = 8}, .backgroundColor = {120, 120, 120, 255})) { +CLAY(CLAY_LAYOUT({ .padding = {.x = 8, .y = 8}, .backgroundColor = {120, 120, 120, 255} })) { // ... } ``` @@ -202,84 +206,100 @@ This macro isn't magic - all it's doing is wrapping the standard designated init See the [Clay_LayoutConfig](#clay_layout) API for the full list of options. -A `Clay_LayoutConfig` struct can be defined in file scope or elsewhere, as long as the lifetime ends after `EndLayout` is called. +A `Clay_LayoutConfig` struct can be defined in file scope or elsewhere, and reused. ```C // Define a style in the global / file scope -Clay_LayoutConfig reusableStyle = (Clay_LayoutConfig) {.backgroundColor = {120, 120, 120, 255}}; +Clay_LayoutConfig reusableStyle = (Clay_LayoutConfig) { .backgroundColor = {120, 120, 120, 255} }; -CLAY_CONTAINER(id, &reusableStyle) { +CLAY(CLAY_LAYOUT(reusableStyle)) { // ... } ``` -Some of the other element macros, such as [CLAY_TEXT()](#clay_text) and [CLAY_RECTANGLE()](#clay_rectangle) take an element-specific config object as their 3rd argument. These config objects also have convenience macros for constructing them, generally of the form [CLAY_TEXT_CONFIG()](#clay_text_config) or [CLAY_RECTANGLE_CONFIG()](#clay_rectangle_config): - -```C -CLAY_TEXT(id, CLAY_STRING("button text"), CLAY_TEXT_CONFIG(.fontSize = 24, .fontId = FONT_ID_LATO, .textColor = {255, 255, 255, 255})); -``` - -See the [Full API](#api) for details on the specific config macros. - ### Element IDs -All element macros take a `Clay_ElementId` ID as their first argument. Clay provides the [CLAY_ID()](#clay_id) macro to generate these IDs as string hashes: +Clay elements can optionally be tagged with a unique identifier using [CLAY_ID()](#clay_id). + ```C // Will always produce the same ID from the same input string -CLAY_CONTAINER(CLAY_ID("OuterContainer"), style) {} -``` +CLAY(CLAY_ID("OuterContainer"), style) {} +``` -To avoid having to construct dynamic strings at runtime to differentiate ids, clay provides the [CLAY_IDI(string, index)](#clay_idi) macro to generate different ids from a single input string. Think of IDI as "**ID** + **I**ndex" +Element IDs have two main use cases. Firstly, tagging an element with an ID allows you to query information about the element later, such as its [mouseover state](#clay-pointerover) or dimensions. + +Secondly, IDs are visually useful when attempting to read and modify UI code, as well as when using the built-in [debug tools](#debug-tools). + +To avoid having to construct dynamic strings at runtime to differentiate ids in loops, clay provides the [CLAY_IDI(string, index)](#clay_idi) macro to generate different ids from a single input string. Think of IDI as "**ID** + **I**ndex" ```C // This is the equivalent of calling CLAY_ID("Item0"), CLAY_ID("Item1") etc for (int index = 0; index < items.length; index++) { - CLAY_CONTAINER(CLAY_IDI("Item", index), style) {} + CLAY(CLAY_IDI("Item", index)) {} } ``` -**_Generally, you should try to keep IDs unique if possible._** - -This ID is used for querying mouse / pointer events, and will be forwarded to the final `Clay_RenderCommandArray` for use in retained mode UIs. Using duplicate IDs may cause some functionality to misbehave (i.e. if you're trying to attach a floating container to a specific element with ID that is duplicated, it may not attach to the one you expect) +This ID (or, if not provided, an auto generated ID) will be forwarded to the final `Clay_RenderCommandArray` for use in retained mode UIs. Using duplicate IDs may cause some functionality to misbehave (i.e. if you're trying to attach a floating container to a specific element with ID that is duplicated, it may not attach to the one you expect) ### Mouse, Touch and Pointer Interactions -Clay provides a very simple unified API for handling mouse and pointer interactions, with specific handling left to user code. +Clay provides several functions for handling mouse and pointer interactions. All pointer interactions depend on the function `void Clay_SetPointerState(Clay_Vector2 position)` being called after each mouse position update and before any other clay functions. -The function `bool Clay_PointerOver(Clay_ElementId id)` takes an element id that was used during layout creation and returns a bool representing whether the current pointer position is within its bounding box. +**During UI declaration** + +The function `bool Clay_Hovered()` can be called during element construction or in the body of an element, and returns `true` if the mouse / pointer is over the currently open element. + +```C +// An orange button that turns blue when hovered +CLAY(CLAY_RECTANGLE(.color = Clay_Hovered() ? COLOR_BLUE : COLOR_ORANGE)) { + bool buttonHovered = Clay_Hovered(); + CLAY_TEXT(buttonHovered ? CLAY_STRING("Hovered") : CLAY_STRING("Hover me!"), headerTextConfig); +} +``` + +The function `void Clay_OnHover()` allows you to attach a function pointer to the currently open element, which will be called if the mouse / pointer is over the element. + +```C +void HandleButtonInteraction(Clay_ElementId elementId, Clay_PointerInfo pointerInfo, intptr_t userData) { + ButtonData *buttonData = (ButtonData *)userData; + // Pointer state allows you to detect mouse down / hold / release + if (pointerInfo.state == CLAY_POINTER_INFO_PRESSED_THIS_FRAME) { + // Do some click handling + NavigateTo(buttonData->link); + } +} + +ButtonData linkButton = (ButtonData) { .link = "https://github.com/nicbarker/clay" }; + +// HandleButtonInteraction will be called for each frame the mouse / pointer / touch is inside the button boundaries +CLAY(CLAY_LAYOUT({ .padding = { 8, 8 }}), Clay_OnHover(HandleButtonInteraction, &buttonData)) { + CLAY_TEXT(CLAY_STRING("Button"), &headerTextConfig); +} +``` + +**Before / After UI declaration** + +If you want to query mouse / pointer overlaps outside layout declarations, you can use the function `bool Clay_PointerOver(Clay_ElementId id)`, which takes an [element id](#element-ids) and returns a bool representing whether the current pointer position is within its bounding box. ```C // Reminder: Clay_SetPointerState must be called before functions that rely on pointer position otherwise it will have no effect Clay_Vector2 mousePosition = { x, y }; Clay_SetPointerState(mousePosition); // ... // If profile picture was clicked -if (mouseButtonDown(0) && Clay_PointerOver(CLAY_ID("ProfilePicture"))) { +if (mouseButtonDown(0) && Clay_PointerOver(Clay_GetElementId("ProfilePicture"))) { // Handle profile picture clicked } ``` -Querying `Clay_PointerOver` also works _during_ layout construction, and can be used as a convenient way for applying "hover" states, for example: - -```C -// Reminder: Clay_SetPointerState must be called before functions that rely on pointer position otherwise it will have no effect -Clay_Vector2 mousePosition = { x, y }; -Clay_SetPointerState(mousePosition); -// ... -Clay_ElementId buttonId = CLAY_ID("HeaderButton"); -// An orange button that turns blue when hovered -CLAY_CONTAINER(buttonId, CLAY_LAYOUT(.backgroundColor = Clay_PointerOver(buttonId) ? COLOR_BLUE : COLOR_ORANGE)) { - CLAY_TEXT(CLAY_IDI("Button", index), text, &headerTextConfig); -} -``` -Note that the bounding box queried by `Clay_PointerOver` is from the last frame. This shouldn't make a difference except in the case of animations that move at high speed. +Note that the bounding box queried by `Clay_PointerOver` is from the last frame. This generally shouldn't make a difference except in the case of animations that move at high speed. If this is an issue for you, performing layout twice per frame with the same data will give you the correct interaction the second time. -### Scrolling Containers +### Scrolling Elements -Scrolling containers are defined with the `CLAY_SCROLL_CONTAINER` element macro and function just like normal containers, however to make scroll containers respond to mouse wheel and scroll events, two functions need to be called: +Elements are configured as scrollable with the `CLAY_SCROLL` macro. To make scroll containers respond to mouse wheel and scroll events, two functions need to be called before `BeginLayout()`: ```C -// Reminder: Clay_SetPointerState must be called before Clay_UpdateScrollContainers otherwise it will have no effect Clay_Vector2 mousePosition = { x, y }; +// Reminder: Clay_SetPointerState must be called before Clay_UpdateScrollContainers otherwise it will have no effect Clay_SetPointerState(mousePosition); // Clay_UpdateScrollContainers needs to be called before Clay_BeginLayout for the position to avoid a 1 frame delay Clay_UpdateScrollContainers( @@ -290,33 +310,32 @@ Clay_UpdateScrollContainers( // ... ``` -More specific details can be found in the full [Scroll Container API](#clay_scroll_container). +More specific details can be found in the full [Scroll API](#clay_scroll). -### Floating Containers ("Absolute" Positioning) +### Floating Elements ("Absolute" Positioning) All standard elements in clay are laid out on top of, and _within_ their parent, positioned according to their parent's layout rules, and affect the positioning and sizing of siblings. -**"Floating"** elements are defined with the `CLAY_FLOATING_CONTAINER` element macro and don't affect the parent they are defined in, or the position of their siblings. +**"Floating"** is configured with the `CLAY_FLOATING()` macro. Floating elements don't affect the parent they are defined in, or the position of their siblings. They also have a **z-index**, and as a result can intersect and render over the top of other elements. -Aside from positioning, `CLAY_FLOATING_CONTAINER` elements function like standard `CLAY_CONTAINER` elements. A classic example use case for floating elements is tooltips and modals. ```C // The two text elements will be laid out top to bottom, and the floating container // will be attached to "Outer" -CLAY_CONTAINER(CLAY_ID("Outer"), CLAY_LAYOUT(.layoutDirection = TOP_TO_BOTTOM)) { +CLAY(CLAY_ID("Outer"), CLAY_LAYOUT({ .layoutDirection = TOP_TO_BOTTOM })) { CLAY_TEXT(CLAY_ID("Button"), text, &headerTextConfig); - CLAY_FLOATING(CLAY_ID("Tooltip"), &CLAY_LAYOUT_DEFAULT, CLAY_FLOATING_CONFIG) {} + CLAY(CLAY_ID("Tooltip"), CLAY_FLOATING()) {} CLAY_TEXT(CLAY_ID("Button"), text, &headerTextConfig); } ``` -More specific details can be found in the full [Floating Container API](#clay_floating_container). +More specific details can be found in the full [Floating API](#clay_floating). ### Laying Out Your Own Custom Elements -Clay only supports a simple set of UI element primitives, such as rectangles, text and images. Clay provides a simple, singular API for layout out custom elements: +Clay only supports a simple set of UI element primitives, such as rectangles, text and images. Clay provides a singular API for layout out custom elements: ```C // Extend CLAY_CUSTOM_ELEMENT_CONFIG with your custom data #define CLAY_EXTEND_CONFIG_CUSTOM struct t_CustomElementData customData; @@ -336,9 +355,9 @@ typedef struct t_CustomElementData { Model myModel = Load3DModel(filePath); CustomElement modelElement = (CustomElement) { .type = CUSTOM_ELEMENT_TYPE_MODEL, .model = myModel } // ... -CLAY_CONTAINER(id, style) { +CLAY() { // This config is type safe and contains the CustomElementData struct - CLAY_CUSTOM_ELEMENT(id, layout, CLAY_CUSTOM_ELEMENT_CONFIG(.customData = { .type = CUSTOM_ELEMENT_TYPE_MODEL, .model = myModel })) {} + CLAY(CLAY_CUSTOM_ELEMENT({ .customData = { .type = CUSTOM_ELEMENT_TYPE_MODEL, .model = myModel } })) {} } // Later during your rendering @@ -364,7 +383,7 @@ switch (renderCommand->commandType) { } ``` -More specific details can be found in the full [Custom Container API](#clay_custom_element). +More specific details can be found in the full [Custom Element API](#clay_custom_element). ### Retained Mode Rendering Clay was originally designed for [Immediate Mode](https://www.youtube.com/watch?v=Z1qyvQsjK5Y) rendering - where the entire UI is redrawn every frame. This may not be possible with your platform, renderer design or performance constraints. @@ -391,7 +410,7 @@ The supported directives are: - `CLAY_WASM` - Required when targeting Web Assembly. - `CLAY_OVERFLOW_TRAP` - By default, clay will continue to allow function calls without crashing even when it exhausts all its available pre-allocated memory. This can produce erroneous layout results that are difficult to interpret. If `CLAY_OVERFLOW_TRAP` is defined, clay will raise a `SIGTRAP` signal that will be caught by your debugger. Relies on `signal.h` being available in your environment. - `CLAY_DEBUG` - Used for debugging clay's internal implementation. Useful if you want to modify or debug clay, or learn how things work. It enables a number of debug features such as preserving source strings for hash IDs to make debugging easier. -- `CLAY_EXTEND_CONFIG_RECTANGLE` - Provide additional struct members to `CLAY_RECTANGLE_CONFIG` that will be passed through with output render commands. +- `CLAY_EXTEND_CONFIG_RECTANGLE` - Provide additional struct members to `CLAY_RECTANGLE` that will be passed through with output render commands. - `CLAY_EXTEND_CONFIG_TEXT` - Provide additional struct members to `CLAY_TEXT_CONFIG` that will be passed through with output render commands. - `CLAY_EXTEND_CONFIG_IMAGE` - Provide additional struct members to `CLAY_IMAGE_CONFIG` that will be passed through with output render commands. - `CLAY_EXTEND_CONFIG_CUSTOM` - Provide additional struct members to `CLAY_IMAGE_CONFIG` that will be passed through with output render commands. @@ -435,7 +454,7 @@ _The official Clay website with debug tooling visible_ `Clay_MinMemorySize` -> `Clay_CreateArenaWithCapacityAndMemory` -> `Clay_SetMeasureTextFunction` -> `Clay_Initialize` **Each Frame** -`Clay_SetLayoutDimensions` -> `Clay_SetPointerState` -> `Clay_UpdateScrollContainers` -> `Clay_BeginLayout` -> `CLAY_CONTAINER() etc...` -> `Clay_EndLayout` +`Clay_SetLayoutDimensions` -> `Clay_SetPointerState` -> `Clay_UpdateScrollContainers` -> `Clay_BeginLayout` -> `CLAY() etc...` -> `Clay_EndLayout` ### Clay_MinMemorySize @@ -499,6 +518,36 @@ Prepares clay to calculate a new layout. Called each frame / layout **before** a Ends declaration of element macros and calculates the results of the currrent layout. Renders a [Clay_RenderCommandArray](#clay_rendercommandarrray) containing the results of the layout calculation. +### Clay_Hovered + +`bool Clay_Hovered()` + +Called **during** layout declaration, and returns `true` if the pointer position previously set with `Clay_SetPointerState` is inside the bounding box of the currently open element. Note: this is based on the element's position from the **last** frame. + +### Clay_OnHover + +`void Clay_OnHover(void (*onHoverFunction)(Clay_ElementId elementId, Clay_PointerInfo pointerInfo, intptr_t userData), intptr_t userData)` + +Called **during** layout declaration, this function allows you to attach a function pointer to the currently open element that will be called once per layout if the pointer position previously set with `Clay_SetPointerState` is inside the bounding box of the currently open element. See [Clay_PointerInfo](#clay-pointer-info) for more information on the `pointerInfo` argument. + +```C +void HandleButtonInteraction(Clay_ElementId elementId, Clay_PointerInfo pointerInfo, intptr_t userData) { + ButtonData *buttonData = (ButtonData *)userData; + // Pointer state allows you to detect mouse down / hold / release + if (pointerInfo.state == CLAY_POINTER_INFO_PRESSED_THIS_FRAME) { + // Do some click handling + NavigateTo(buttonData->link); + } +} + +ButtonData linkButton = (ButtonData) { .link = "https://github.com/nicbarker/clay" }; + +// HandleButtonInteraction will be called for each frame the mouse / pointer / touch is inside the button boundaries +CLAY(CLAY_LAYOUT({ .padding = { 8, 8 }}), Clay_OnHover(HandleButtonInteraction, &buttonData)) { + CLAY_TEXT(CLAY_STRING("Button"), &headerTextConfig); +} +``` + ### Clay_PointerOver `bool Clay_PointerOver(Clay_ElementId id)` @@ -511,307 +560,104 @@ Returns `true` if the pointer position previously set with `Clay_SetPointerState Returns [Clay_ScrollContainerData](#clay_scrollcontainerdata) for the scroll container matching the provided ID. This function allows imperative manipulation of scroll position, allowing you to build things such as scroll bars, buttons that "jump" to somewhere in a scroll container, etc. +### Clay_GetElementId + +`Clay_ElementId Clay_GetElementId(Clay_String idString)` + +Returns a [Clay_ElementId](#clay-elementid) for the provided id string, used for querying element info such as mouseover state, scroll container data, etc. + ## Element Macros -### CLAY_CONTAINER +### CLAY() **Usage** -`CLAY_CONTAINER(Clay_ElementId id, Clay_LayoutConfig *layoutConfig);` +`CLAY(...configuration) { ...children }` **Lifecycle** -`Clay_BeginLayout()` -> `CLAY_CONTAINER()` -> `Clay_EndLayout()` +`Clay_BeginLayout()` -> `CLAY()` -> `Clay_EndLayout()` **Notes** -**CONTAINER** is a generic rectangular container that supports child elements. It uses a [Clay_LayoutConfig](#clay_layout) for styling and layout. +**CLAY** opens a generic empty container, that is configurable and supports nested children. **Examples** ```C -// Define a container with 16px of x and y padding -CLAY_CONTAINER(CLAY_ID("SideBar"), CLAY_LAYOUT(.padding = {16, 16})) { - // A nested child container - CLAY_CONTAINER(CLAY_ID("SideBar"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 16)) { - // Children laid out top to bottom +// Define an element with 16px of x and y padding +CLAY(CLAY_ID("Outer"), CLAY_LAYOUT({ .padding = {16, 16} })) { + // A nested child element + CLAY(CLAY_ID("SideBar"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 16 })) { + // Children laid out top to bottom with a 16 px gap between them + } + // A vertical scrolling container with a colored background + CLAY( + CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 16 }) + CLAY_RECTANGLE({ .color = { 200, 200, 100, 255 }, .cornerRadius = CLAY_CORNER_RADIUS(10) }) + CLAY_SCROLL({ .vertical = true }) + ) { + // child elements } } ``` -**Rendering** +### CLAY_ID -`CLAY_CONTAINER` elements will not generate any render commands. - -### CLAY_TEXT **Usage** -`CLAY_TEXT(Clay_ElementId id, Clay_String textContents, Clay_TextElementConfig *textConfig);` +`CLAY(CLAY_ID(char* idString)) {}` **Lifecycle** -`Clay_BeginLayout()` -> `CLAY_TEXT()` -> `Clay_EndLayout()` +`Clay_BeginLayout()` -> `CLAY(` -> `CLAY_ID()` -> `)` -> `Clay_EndLayout()` **Notes** -**TEXT** is a measured, auto-wrapped text element. It uses [Clay_TextElementConfig](#clay_text_config) to configure text specific options. +**CLAY_ID()** is used to generate and attach a [Clay_ElementId](#clay_elementid) to a layout element during declaration. -Note that `Clay_TextElementConfig` uses `uint32_t fontId`. Font ID to font asset mapping is managed in user code and passed to render commands. +To regenerate the same ID outside of layout declaration when using utility functions such as [Clay_PointerOver](#clay_pointerover), use the [Clay_GetElementId](#clay_getelementid) function. **Examples** ```C -// Define a font somewhere in your code -const uint32_t FONT_ID_LATO = 3; -// .. -CLAY_TEXT(CLAY_ID("Username"), CLAY_STRING("John Smith"), CLAY_TEXT_CONFIG(.fontId = FONT_ID_LATO, .fontSize = 24, .textColor = {255, 0, 0, 255})); -// Rendering example -Font fontToUse = LoadedFonts[renderCommand->elementConfig.textElementConfig->fontId]; -``` +// Tag a button with the Id "Button" +CLAY( + CLAY_ID("Button"), + CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_GROW() }, .padding = {16, 16}, .childGap = 16) }) +) { + // ...children +} -**Rendering** - -Element is subject to [culling](#visibility-culling). Otherwise, multiple `Clay_RenderCommand`s with `commandType = CLAY_RENDER_COMMAND_TYPE_TEXT` may be created, one for each wrapped line of text. - -`Clay_RenderCommand.textContent` will be populated with a `Clay_String` _slice_ of the original string passed in (i.e. wrapping doesn't reallocate, it just returns a `Clay_String` pointing to the start of the new line with a `length`) - -### CLAY_IMAGE -**Usage** - -`CLAY_IMAGE(Clay_ElementId id, Clay_LayoutConfig *layoutConfig, Clay_ImageElementConfig *imageConfig);` - -**Lifecycle** - -`Clay_BeginLayout()` -> `CLAY_IMAGE()` -> `Clay_EndLayout()` - -**Notes** - -**IMAGE_CONTAINER** is a used to layout images, and can optionally have children. It uses [Clay_LayoutConfig](#clay_layout) for styling and layout, and [Clay_ImageElementConfig](#clay_image_config) to configure image specific options. - -**Examples** - -```C -// Load an image somewhere in your code -Image profilePicture = LoadImage("profilePicture.png"); -// .. -CLAY_IMAGE(CLAY_ID("ProfilePicture"), &CLAY_LAYOUT_DEFAULT, CLAY_IMAGE_CONFIG(.imageData = &profilePicture, .height = 60, .width = 60)) {} -// Rendering example -Image *imageToRender = renderCommand->elementConfig.imageElementConfig->imageData; -``` - -**Rendering** - -Element is subject to [culling](#visibility-culling). Otherwise, a single `Clay_RenderCommand`s with `commandType = CLAY_RENDER_COMMAND_TYPE_IMAGE` will be created. The user will need to access `renderCommand->elementConfig.imageElementConfig->imageData` to retrieve image data referenced during layout creation. It's also up to the user to decide how / if they wish to blend `renderCommand->color` with the image. - -### CLAY_SCROLL_CONTAINER -**Usage** - -`CLAY_IMAGE(Clay_ElementId id, Clay_LayoutConfig *layoutConfig, Clay_ScrollElementConfig *scrollConfig);` - -**Lifecycle** - -`Clay_SetPointerState()` -> `Clay_UpdateScrollContainers()` -> `Clay_BeginLayout()` -> `CLAY_SCROLL_CONTAINER()` -> `Clay_EndLayout()` - -**Notes** - -**SCROLL_CONTAINER** creates a masked container that allows layout of children to extend beyond its boundaries. It uses [Clay_LayoutConfig](#clay_layout) for styling and layout, and [Clay_ScrollElementConfig](#clay_scroll_config) to configure scroll specific options. - -Note: In order to process scrolling based on pointer position and mouse wheel or touch interactions, you must call `Clay_SetPointerState()` and `Clay_UpdateScrollContainers()` _before_ calling `BeginLayout`. - -**Examples** - -```C -CLAY_SCROLL_CONTAINER(CLAY_ID("MainContent"), &CLAY_LAYOUT_DEFAULT, CLAY_SCROLL_CONFIG(.vertical = true)) { - // Create child content with a fixed height of 5000 - CLAY_CONTAINER(CLAY_ID("ScrollInner"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(5000) })) {} +// Later on outside of layout code +bool buttonIsHovered = Clay_IsPointerOver(Clay_GetElementId("Button")); +if (buttonIsHovered && leftMouseButtonPressed) { + // ... do some click handling } ``` -**Rendering** +### CLAY_IDI() -Scroll containers will result in two render commands: -- `commandType = CLAY_RENDER_COMMAND_TYPE_SCISSOR_START`, which should create a rectangle mask with its `boundingBox` and is **not** subject to [culling](#visibility-culling) -- `commandType = CLAY_RENDER_COMMAND_TYPE_SCISSOR_END`, which disables the previous rectangle mask and is **not** subject to [culling](#visibility-culling) +`Clay_ElementId CLAY_IDI(char *label, int index)` -### CLAY_BORDER_CONTAINER -**Usage** - -`CLAY_BORDER_CONTAINER(Clay_ElementId id, Clay_LayoutConfig *layoutConfig, Clay_BorderElementConfig *borderConfig);` - -**Lifecycle** - -`Clay_BeginLayout()` -> `CLAY_BORDER_CONTAINER()` -> `Clay_EndLayout()` - -**Notes** - -**BORDER_CONTAINER** is functionally identical to **CONTAINER** but also allows configuration of a border around the element. It uses [Clay_LayoutConfig](#clay_layout) for styling and layout, and [Clay_BorderElementConfig](#clay_border_config) to configure border specific options. - -**Examples** - -```C -// 300x300 container with a 1px red border around all the edges -CLAY_BORDER_CONTAINER(CLAY_ID("OuterBorder"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_FIXED(300), .height = CLAY_SIZING_FIXED(300)}), CLAY_BORDER_CONFIG_OUTSIDE(.color = COLOR_RED, .width = 1)) { - // ... -} - -// Container with a 3px yellow bottom border -CLAY_BORDER_CONTAINER(CLAY_ID("OuterBorder"), &CLAY_LAYOUT_DEFAULT, CLAY_BORDER_CONFIG(.bottom = { .color = COLOR_YELLOW, .width = 3 })) { - // ... -} - -// Container with a 5px curved border around the edges, and a 5px blue border between all children laid out top to bottom -CLAY_BORDER_CONTAINER(CLAY_ID("OuterBorder"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM), CLAY_BORDER_CONFIG_ALL_RADIUS({ .color = COLOR_BLUE, .width = 5 })) { - // Child - // -- border will be here -- - // Child -} -``` - -**Rendering** - -Element is subject to [culling](#visibility-culling). Otherwise, a single `Clay_RenderCommand` with `commandType = CLAY_RENDER_COMMAND_TYPE_BORDER` representing the container will be created. -Rendering of borders and rounded corners is left up to the user. See the provided [Raylib Renderer](https://github.com/nicbarker/clay/tree/main/renderers/raylib) for examples of how to draw borders using line and curve primitives. - -### CLAY_FLOATING_CONTAINER -**Usage** - -`CLAY_FLOATING_CONTAINER(Clay_ElementId id, Clay_LayoutConfig *layoutConfig, Clay_FloatingElementConfig *floatingConfig);` - -**Lifecycle** - -`Clay_BeginLayout()` -> `CLAY_FLOATING_CONTAINER()` -> `Clay_EndLayout()` - -**Notes** - -**FLOATING_CONTAINER** defines an element that "floats" above other content. Typical use-cases include tooltips and modals. - -Floating containers: - -- With the [default configuration](#clay_floating_config), attach to the top left corner of their "parent" -- Don't affect the width and height of their parent -- Don't affect the positioning of sibling elements -- Depending on their z-index can appear above or below other elements, partially or completely occluding them -- Apart from positioning, function just like standard `CLAY_CONTAINER` elements - including expanding to fit their children, etc. - -The easiest mental model to use when thinking about floating containers is that they are a completely separate UI hierarchy, attached to a specific x,y point on their "parent". - -Floating elements use [Clay_LayoutConfig](#clay_layout) for styling and layout, and [Clay_FloatingElementConfig](#clay_floating_config) to configure specific options. - -**Examples** - -```C -// Horizontal container with three option buttons -CLAY_CONTAINER(CLAY_ID("OptionsList"), CLAY_LAYOUT(.childGap = 16)) { - CLAY_RECTANGLE(CLAY_IDI("Option", 1), CLAY_LAYOUT(.padding = {16, 16}), CLAY_RECTANGLE_CONFIG(.color = COLOR_BLUE)) { - CLAY_TEXT(CLAY_IDI("OptionText", 1), CLAY_STRING("Option 1"), CLAY_TEXT_CONFIG()); - } - CLAY_RECTANGLE(CLAY_IDI("Option", 2), CLAY_LAYOUT(.padding = {16, 16}), CLAY_RECTANGLE_CONFIG(.color = COLOR_BLUE)) { - CLAY_TEXT(CLAY_IDI("OptionText", 2), CLAY_STRING("Option 2"), CLAY_TEXT_CONFIG()); - // Floating tooltip will attach above the "Option 2" container and not affect widths or positions of other elements - CLAY_FLOATING_CONTAINER(CLAY_ID("OptionTooltip"), &CLAY_LAYOUT_DEFAULT, CLAY_FLOATING_CONFIG(.zIndex = 1, .attachment = { .element = CLAY_ATTACH_POINT_CENTER_BOTTOM, .parent = CLAY_ATTACH_POINT_CENTER_TOP })) { - CLAY_TEXT(CLAY_IDI("OptionTooltipText", 1), CLAY_STRING("Most popular!"), CLAY_TEXT_CONFIG()); - } - } - CLAY_RECTANGLE(CLAY_IDI("Option", 3), CLAY_LAYOUT(.padding = {16, 16}), CLAY_RECTANGLE_CONFIG(.color = COLOR_BLUE)) { - CLAY_TEXT(CLAY_IDI("OptionText", 3), CLAY_STRING("Option 3"), CLAY_TEXT_CONFIG()); - } -} - -// Floating containers can also be declared elsewhere in a layout, to avoid branching or polluting other UI -for (int i = 0; i < 1000; i++) { - CLAY_CONTAINER(CLAY_IDI("Option", i + 1), &CLAY_LAYOUT_DEFAULT) { - // ... - } -} -// Note the use of "parentId". -// Floating tooltip will attach above the "Option 2" container and not affect widths or positions of other elements -CLAY_FLOATING_CONTAINER(CLAY_ID("OptionTooltip"), &CLAY_LAYOUT_DEFAULT, CLAY_FLOATING_CONFIG(.parentId = CLAY_IDI("Option", 2).id, .zIndex = 1, .attachment = { .element = CLAY_ATTACH_POINT_CENTER_BOTTOM, .parent = CLAY_ATTACH_POINT_TOP_CENTER })) { - CLAY_TEXT(CLAY_IDI("OptionTooltipText", 1), CLAY_STRING("Most popular!"), CLAY_TEXT_CONFIG()); -} -``` - -When using `.parentId`, the floating container can be declared anywhere after `BeginLayout` and before `EndLayout`. The target element matching the `.parentId` doesn't need to exist when `CLAY_FLOATING_CONTAINER` is called. - -**Rendering** - -`CLAY_FLOATING_CONTAINER` elements will not generate any render commands. - -### CLAY_CUSTOM_ELEMENT -**Usage** - -`CLAY_CUSTOM_ELEMENT(Clay_ElementId id, Clay_LayoutConfig *layoutConfig, Clay_CustomElementConfig *customConfig);` - -**Lifecycle** - -`Clay_BeginLayout()` -> `CLAY_CUSTOM_ELEMENT()` -> `Clay_EndLayout()` - -**Notes** - -**CUSTOM_ELEMENT** uses [Clay_LayoutConfig](#clay_layout) for styling and layout, and allows the user to pass custom data to the renderer. - -**Examples** -```C -// Extend CLAY_CUSTOM_ELEMENT_CONFIG with your custom data -#define CLAY_EXTEND_CONFIG_CUSTOM struct t_CustomElementData customData; -// Extensions need to happen _before_ the clay include -#include "clay.h" - -// A rough example of how you could handle laying out 3d models in your UI -typedef struct t_CustomElementData { - CustomElementType type; - union { - Model model; - Video video; - // ... - }; -} CustomElementData; - -Model myModel = Load3DModel(filePath); -CustomElement modelElement = (CustomElement) { .type = CUSTOM_ELEMENT_TYPE_MODEL, .model = myModel } -// ... -CLAY_CONTAINER(id, style) { - // This config is type safe and contains the CustomElementData struct - CLAY_CUSTOM_ELEMENT(id, style, CLAY_CUSTOM_ELEMENT_CONFIG(.customData = { .type = CUSTOM_ELEMENT_TYPE_MODEL, .model = myModel })) {} -} - -// Later during your rendering -switch (renderCommand->commandType) { - // ... - case CLAY_RENDER_COMMAND_TYPE_CUSTOM: { - // Your extended struct is passed through - CustomElementData *data = renderCommand->elementConfig.customElementConfig->customData; - if (!customElement) continue; - switch (customElement->type) { - case CUSTOM_ELEMENT_TYPE_MODEL: { - // Render your 3d model here - break; - } - case CUSTOM_ELEMENT_TYPE_VIDEO: { - // Render your video here - break; - } - // ... - } - break; - } -} -``` - -**Rendering** - -Element is subject to [culling](#visibility-culling). Otherwise, a single `Clay_RenderCommand` with `commandType = CLAY_RENDER_COMMAND_TYPE_CUSTOM` will be created. -The user will need to access [Clay_CustomElementConfig](#clay_custom_element_config) to retrieve custom data referenced during layout creation. - -## Config Macros - -A number of clay element macros take element-specific **config** structs. +An offset version of [CLAY_ID](#clay_id). Generates a [Clay_ElementId](#clay_elementid) string id from the provided `char *label`, combined with the `int index`. Used for generating ids for sequential elements (such as in a `for` loop) without having to construct dynamic strings at runtime. ### CLAY_LAYOUT -**CLAY_LAYOUT()** is used for configuring layout for most clay elements. +**Usage** + +`CLAY(CLAY_LAYOUT(...layout config)) {}` + +**Lifecycle** + +`Clay_BeginLayout()` -> `CLAY(` -> `CLAY_LAYOUT()` -> `)` -> `Clay_EndLayout()` + +**Notes** + +**CLAY_LAYOUT()** is used for configuring _layout_ options (i.e. options that affect the final position and size of an element, its parents, siblings, and children) **Struct API (Pseudocode)** ```C -// CLAY_LAYOUT(.member = value) supports these options +// CLAY_LAYOUT({ .member = value }) supports these options Clay_LayoutConfig { Clay_LayoutDirection layoutDirection = CLAY_LEFT_TO_RIGHT (default) | CLAY_TOP_TO_BOTTOM; Clay_Padding padding { @@ -834,7 +680,7 @@ As with all config macros, `CLAY_LAYOUT()` accepts designated initializer syntax **`.layoutDirection`** - `Clay_LayoutDirection` -`CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM)` +`CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM })` Controls the axis / direction in which child elements are laid out. Available options are `CLAY_LEFT_TO_RIGHT` (default) and `CLAY_TOP_TO_BOTTOM`. @@ -846,7 +692,7 @@ _Did you know that "left to right" and "top to bottom" both have 13 letters?_ **`.padding`** - `Clay_Padding` -`CLAY_LAYOUT(.padding = { .x = 16, .y = 16 })` +`CLAY_LAYOUT({ .padding = { .x = 16, .y = 16 } })` Controls horizontal and vertical white-space "padding" around the **outside** of child elements. @@ -856,7 +702,7 @@ Controls horizontal and vertical white-space "padding" around the **outside** of **`.childGap`** - `uint16_t` -`CLAY_LAYOUT(.childGap = 16)` +`CLAY_LAYOUT({ .childGap = 16 })` Controls the white-space **between** child elements as they are laid out. When `.layoutDirection` is `CLAY_LEFT_TO_RIGHT` (default), this will be horizontal space, whereas for `CLAY_TOP_TO_BOTTOM` it will be vertical space. @@ -866,7 +712,7 @@ Controls the white-space **between** child elements as they are laid out. When ` **`.childAlignment`** - `Clay_ChildAlignment` -`CLAY_LAYOUT(.childAlignment = { .x = CLAY_ALIGN_X_LEFT, .y = CLAY_ALIGN_Y_CENTER })` +`CLAY_LAYOUT({ .childAlignment = { .x = CLAY_ALIGN_X_LEFT, .y = CLAY_ALIGN_Y_CENTER } })` Controls the alignment of children relative to the height and width of the parent container. Available options are: ```C @@ -880,7 +726,7 @@ Controls the alignment of children relative to the height and width of the paren **`.sizing`** - `Clay_Sizing` -`CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_FIXED(300), .height = CLAY_SIZING_PERCENT(0.5) })` +`CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_FIXED(300), .height = CLAY_SIZING_PERCENT(0.5) } })` Controls how final width and height of element are calculated. The same configurations are available for both the `.width` and `.height` axis. There are several options: @@ -900,20 +746,29 @@ Controls how final width and height of element are calculated. The same configur **Example Usage** ```C -CLAY_CONTAINER(CLAY_ID("Button"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_GROW() }, .padding = {16, 16}, .childGap = 16)) { +CLAY(CLAY_ID("Button"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_GROW() }, .padding = {16, 16}, .childGap = 16) }) { // Children will be laid out vertically with 16px of padding around and between } ``` -### CLAY_RECTANGLE_CONFIG +### CLAY_RECTANGLE +**Usage** -**CLAY_RECTANGLE_CONFIG()** is used for configuring rendering for [CLAY_RECTANGLE()](#clay_rectangle) elements. The config will be passed through to render commands as `Clay_RenderCommand.config.rectangleElementConfig` +`CLAY(CLAY_RECTANGLE(...rectangle config)) {}` + +**Lifecycle** + +`Clay_BeginLayout()` -> `CLAY(` -> `CLAY_RECTANGLE()` -> `)` -> `Clay_EndLayout()` + +**Notes** + +**RECTANGLE** configures a clay element to background-fill its bounding box with a color. It uses [Clay_RectangleElementConfig](#clay_rectangleelementconfig) for rectangle specific options. **Struct API (Pseudocode)** ```C -// CLAY_RECTANGLE_CONFIG(.member = value) supports these options -Clay_RectangleConfig { +// CLAY_RECTANGLE({ .member = value }) supports these options +Clay_RectangleElementConfig { Clay_Color color { float r; float g; float b; float a; }; @@ -925,7 +780,7 @@ Clay_RectangleConfig { } ``` -As with all config macros, `CLAY_RECTANGLE_CONFIG()` accepts designated initializer syntax and provides default values for any unspecified struct members. +As with all config macros, `CLAY_RECTANGLE()` accepts designated initializer syntax and provides default values for any unspecified struct members. **Extension** @@ -939,7 +794,7 @@ The underlying `Clay_RectangleElementConfig` can be extended with new members by **`.color`** - `Clay_Color` -`CLAY_RECTANGLE_CONFIG(.color = {120, 120, 120, 255})` +`CLAY_RECTANGLE({ .color = {120, 120, 120, 255} })` Conventionally accepts `rgba` float values between 0 and 255, but interpretation is left up to the renderer and does not affect layout. @@ -947,20 +802,55 @@ Conventionally accepts `rgba` float values between 0 and 255, but interpretation **`.cornerRadius`** - `float` -`CLAY_RECTANGLE_CONFIG(.cornerRadius = 16)` +`CLAY_RECTANGLE({ .cornerRadius = { .topLeft = 16, .topRight = 16, .bottomLeft = 16, .bottomRight = 16 })` Defines the radius in pixels for the arc of rectangle corners (`0` is square, `rectangle.width / 2` is circular). -Note that the `CLAY_CORNER_RADIUS(radius)` function-like macro is available to provide short hand for setting all four corner radii to the same value. e.g. `CLAY_BORDER_CONFIG(.cornerRadius = CLAY_CORNER_RADIUS(10))` +Note that the `CLAY_CORNER_RADIUS(radius)` function-like macro is available to provide short hand for setting all four corner radii to the same value. e.g. `CLAY_BORDER({ .cornerRadius = CLAY_CORNER_RADIUS(10) })` -### CLAY_TEXT_CONFIG +**Rendering** -**CLAY_TEXT_CONFIG()** is a macro used to create and store `Clay_TextElementConfig` structs, which are for configuring [CLAY_TEXT](#clay_text) elements. The config used in declaration will be passed both as an argument to the user-provided `Clay_MeasureText(Clay_String *text, Clay_TextElementConfig *config)` function as well as the in the final output as `Clay_RenderCommand.config.textElementConfig`. +Element is subject to [culling](#visibility-culling). Otherwise, a single `Clay_RenderCommand`s with `commandType = CLAY_RENDER_COMMAND_TYPE_RECTANGLE` will be created, with `renderCommand->elementConfig.rectangleElementConfig` containing a pointer to the element's Clay_RectangleElementConfig. + +**Examples** + +```C +// Declare a reusable rectangle config, with a purple color and 10px rounded corners +Clay_RectangleElementConfig rectangleConfig = (Clay_RectangleElementConfig) { .color = { 200, 200, 100, 255 }, .cornerRadius = CLAY_CORNER_RADIUS(10) }; +// Declare a rectangle element using a reusable config +CLAY(CLAY_RECTANGLE(rectangleConfig)) {} +// Declare a retangle element using an inline config +CLAY(CLAY_RECTANGLE({ .color = { 200, 200, 100, 255 }, .cornerRadius = CLAY_CORNER_RADIUS(10) })) { + // child elements +} +// Declare a scrolling container with a colored background +CLAY( + CLAY_RECTANGLE({ .color = { 200, 200, 100, 255 }, .cornerRadius = CLAY_CORNER_RADIUS(10) }) + CLAY_SCROLL({ .vertical = true }) +) { + // child elements +} +``` + +### CLAY_TEXT +**Usage** + +`CLAY_TEXT(Clay_String textContents, Clay_TextElementConfig *textConfig);` + +**Lifecycle** + +`Clay_BeginLayout()` -> `CLAY_TEXT()` -> `Clay_EndLayout()` + +**Notes** + +**TEXT** is a measured, auto-wrapped text element. It uses `Clay_TextElementConfig` to configure text specific options. + +Note that `Clay_TextElementConfig` uses `uint32_t fontId`. Font ID to font asset mapping is managed in user code and passed to render commands. **Struct API (Pseudocode)** ```C -// CLAY_TEXT_CONFIG(.member = value) supports these options +// CLAY_TEXT(text, CLAY_TEXT_CONFIG({ .member = value })) supports these options Clay_TextElementConfig { Clay_Color textColor { float r; float g; float b; float a; @@ -970,7 +860,7 @@ Clay_TextElementConfig { uint16_t letterSpacing; uint16_t lineHeight; Clay_TextElementConfigWrapMode wrapMode { - CLAY_TEXT_WRAP_WORDS (default), + CLAY_TEXT_WRAP_WORDS (default), CLAY_TEXT_WRAP_NEWLINES, CLAY_TEXT_WRAP_NONE, }; @@ -1044,17 +934,37 @@ Available options are: - `CLAY_TEXT_WRAP_NEWLINES` - will only wrap when encountering newline characters. - `CLAY_TEXT_WRAP_NONE` - Text will never wrap even if its container is compressed beyond the text measured width. ----**** +--- + +**Examples** -**Example Usage** ```C -// A 24px, red text element that says "John Smith" -CLAY_TEXT(CLAY_ID("Username"), CLAY_STRING("John Smith"), CLAY_TEXT_CONFIG(.fontSize = 24, .fontId = 2, .textColor = {255, 0, 0, 255})); +// Define a font somewhere in your code +const uint32_t FONT_ID_LATO = 3; +// .. +CLAY_TEXT(CLAY_STRING("John Smith"), CLAY_TEXT_CONFIG({ .fontId = FONT_ID_LATO, .fontSize = 24, .textColor = {255, 0, 0, 255} })); +// Rendering example +Font fontToUse = LoadedFonts[renderCommand->elementConfig.textElementConfig->fontId]; ``` -### CLAY_IMAGE_CONFIG +**Rendering** -**CLAY_IMAGE_CONFIG()** is a macro used to create and store `Clay_ImageElementConfig` structs, which are for configuring [CLAY_IMAGE](#clay_image) elements. The config will be passed through to render commands as `Clay_RenderCommand.config.imageElementConfig` +Element is subject to [culling](#visibility-culling). Otherwise, multiple `Clay_RenderCommand`s with `commandType = CLAY_RENDER_COMMAND_TYPE_TEXT` may be created, one for each wrapped line of text. + +`Clay_RenderCommand.textContent` will be populated with a `Clay_String` _slice_ of the original string passed in (i.e. wrapping doesn't reallocate, it just returns a `Clay_String` pointing to the start of the new line with a `length`) + +### CLAY_IMAGE +**Usage** + +`CLAY(CLAY_IMAGE(...image config)) {}` + +**Lifecycle** + +`Clay_BeginLayout()` -> `CLAY(` -> `CLAY_IMAGE()` -> `)` -> `Clay_EndLayout()` + +**Notes** + +**IMAGE** configures a clay element to render an image as its background. It uses Clay_ImageElementConfig for image specific options. **Struct API (Pseudocode)** @@ -1102,7 +1012,7 @@ Used to perform **aspect ratio scaling** on the image element. As of this versio // Load an image somewhere in your code Image profilePicture = LoadImage("profilePicture.png"); // Note that when rendering, .imageData will be void* type. -CLAY_IMAGE(CLAY_ID("ProfilePicture"), &CLAY_LAYOUT_DEFAULT, CLAY_IMAGE_CONFIG(.imageData = &profilePicture, .sourceDimensions = { 60, 60 })) {} +CLAY(CLAY_IMAGE({ .imageData = &profilePicture, .sourceDimensions = { 60, 60 } })) {} // OR ---------------- @@ -1117,19 +1027,234 @@ typedef struct t_Image { // ... etc } Image; -// You can now use CLAY_IMAGE_CONFIG with your custom type and still have type safety & code completion -CLAY_IMAGE(CLAY_ID("ProfilePicture"), &CLAY_LAYOUT_DEFAULT, CLAY_IMAGE_CONFIG(.image = { .format = IMAGE_FORMAT_RGBA, .internalData = &imageData }, .sourceDimensions = { 60, 60 })) {} +// You can now use CLAY_IMAGE with your custom type and still have type safety & code completion +CLAY(CLAY_IMAGE({ .image = { .format = IMAGE_FORMAT_RGBA, .internalData = &imageData }, .sourceDimensions = { 60, 60 } })) {} ``` -### CLAY_FLOATING_CONFIG +**Examples** -**CLAY_FLOATING_CONFIG()** is a macro used to create and store `Clay_FloatingElementConfig` structs, which are for configuring [CLAY_FLOATING_CONTAINER](#clay_floating_container) elements. +```C +// Load an image somewhere in your code +Image profilePicture = LoadImage("profilePicture.png"); +// Declare a reusable image config +Clay_ImageElementConfig imageConfig = (Clay_ImageElementConfig) { .imageData = &profilePicture, .height = 60, .width = 60 }; +// Declare an image element using a reusable config +CLAY(CLAY_IMAGE(imageConfig)) {} +// Declare an image element using an inline config +CLAY(CLAY_IMAGE({ .imageData = &profilePicture, .height = 60, .width = 60 })) {} +// Rendering example +Image *imageToRender = renderCommand->elementConfig.imageElementConfig->imageData; +``` + +**Rendering** + +Element is subject to [culling](#visibility-culling). Otherwise, a single `Clay_RenderCommand`s with `commandType = CLAY_RENDER_COMMAND_TYPE_IMAGE` will be created. The user will need to access `renderCommand->elementConfig.imageElementConfig->imageData` to retrieve image data referenced during layout creation. It's also up to the user to decide how / if they wish to blend `rectangleElementConfig->color` with the image. + +### CLAY_SCROLL +**Usage** + +`CLAY(CLAY_SCROLL(...scroll config)) {}` + +**Lifecycle** + +`Clay_SetPointerState()` -> `Clay_UpdateScrollContainers()` -> `Clay_BeginLayout()` -> `CLAY(` -> `CLAY_SCROLL()` -> `)` -> `Clay_EndLayout()` + +**Notes** + +**SCROLL** configures the element as a scrolling container, enabling masking of children that extend beyond its boundaries. It uses [Clay_ScrollElementConfig](#clay_scrollelementconfig) to configure scroll specific options. + +Note: In order to process scrolling based on pointer position and mouse wheel or touch interactions, you must call `Clay_SetPointerState()` and `Clay_UpdateScrollContainers()` _before_ calling `BeginLayout`. + +**Struct Definition (Pseudocode)** + +```C +Clay_ScrollElementConfig { + bool horizontal; + bool vertical; +}; +``` + +As with all config macros, `CLAY_SCROLL()` accepts designated initializer syntax and provides default values for any unspecified struct members. + +**Fields** + +**`.horizontal`** - `bool` + +`CLAY_SCROLL(.horizontal = true)` + +Enables or disables horizontal scrolling for this container element. + +--- + +**`.vertical`** - `bool` + +`CLAY_SCROLL(.vertical = true)` + +Enables or disables vertical scrolling for this container element. + +--- + +**Rendering** + +Enabling scroll for an element will result in two additional render commands: +- `commandType = CLAY_RENDER_COMMAND_TYPE_SCISSOR_START`, which should create a rectangle mask with its `boundingBox` and is **not** subject to [culling](#visibility-culling) +- `commandType = CLAY_RENDER_COMMAND_TYPE_SCISSOR_END`, which disables the previous rectangle mask and is **not** subject to [culling](#visibility-culling) + +**Examples** + +```C +CLAY(CLAY_SCROLL(.vertical = true)) { + // Create child content with a fixed height of 5000 + CLAY(CLAY_ID("ScrollInner"), CLAY_LAYOUT({ .sizing = { .height = CLAY_SIZING_FIXED(5000) } })) {} +} +``` + +### CLAY_BORDER +**Usage** + +`CLAY(CLAY_BORDER(...border config)) {}` + +**Lifecycle** + +`Clay_BeginLayout()` -> `CLAY(` -> `CLAY_BORDER()` -> `)` -> `Clay_EndLayout()` + +**Notes** + +**BORDER** adds borders to the edges or between the children of elements. It uses Clay_BorderElementConfig to configure border specific options. + +**Struct Definition (Pseudocode)** + +```C +typedef struct Clay_BorderElementConfig +{ + Clay_Border left { + float width; + Clay_Color color { + float r; float g; float b; float a; + }; + }; + Clay_Border right // Exactly the same as left + Clay_Border top // Exactly the same as left + Clay_Border bottom // Exactly the same as left + Clay_Border betweenChildren // Exactly the same as left + Clay_CornerRadius cornerRadius { + float topLeft; + float topRight; + float bottomLeft; + float bottomRight; + }; +} Clay_BorderElementConfig; +``` + +**Usage** + +As with all config macros, `CLAY_BORDER()` accepts designated initializer syntax and provides default values for any unspecified struct members. + +**Fields** + +**`.left, .right, .top, .bottom`** - `Clay_Border` + +`CLAY_BORDER({ .left = { 2, COLOR_RED }, .right = { 4, COLOR_YELLOW } /* etc */ })` + +Indicates to the renderer that a border of `.color` should be draw at the specified edges of the bounding box, **overlapping the box contents by `.width`**. + +This means that border configuration does not affect layout, as the width of the border doesn't contribute to the total container width or layout position. Border containers with zero padding will be drawn over the top of child elements. + +--- + +**`.betweenChildren`** - `Clay_Border` + +`CLAY_BORDER({ .betweenChildren = { 2, COLOR_RED } })` + +Configures the width and color of borders to be drawn between children. These borders will be vertical lines if the parent uses `.layoutDirection = CLAY_LEFT_TO_RIGHT` and horizontal lines if the parent uses `CLAY_TOP_TO_BOTTOM`. Unlike `.left, .top` etc, this option **will generate additional rectangle render commands representing the borders between children.** As a result, the renderer does not need to specifically implement rendering for these border elements. + +--- + +**`.cornerRadius`** - `float` + +`CLAY_BORDER({ .cornerRadius = 16 })` + +Defines the radius in pixels for the arc of border corners (`0` is square, `rectangle.width / 2` is circular). It is up to the renderer to decide how to interpolate between differing border widths and colors across shared corners. + +Note that the `CLAY_CORNER_RADIUS(radius)` function-like macro is available to provide short hand for setting all four corner radii to the same value. e.g. `CLAY_BORDER(.cornerRadius = CLAY_CORNER_RADIUS(10))` + +**Convenience Macros** + +There are some common cases for border configuration that are repetitive, i.e. specifying the same border around all four edges. Some convenience macros are provided for these cases: + +- `CLAY_BORDER_CONFIG_OUTSIDE({ .width = 2, .color = COLOR_RED })` - Shorthand for configuring all 4 outside borders at once.` +- `CLAY_BORDER_CONFIG_OUTSIDE_RADIUS(width, color, radius)` - Shorthand for configuring all 4 outside borders at once, with the provided `.cornerRadius`. Note this is a function-like macro and does not take `.member = value` syntax. +- `CLAY_BORDER_CONFIG_ALL({ .width = 2, .color = COLOR_RED })` - Shorthand for configuring all 4 outside borders and `.betweenChildren` at once. +- `CLAY_BORDER_CONFIG_ALL_RADIUS(width, color, radius)` - Shorthand for configuring all 4 outside borders and `.betweenChildren` at once, with the provided `cornerRadius`. Note this is a function-like macro and does not take `.member = value` syntax. + +**Examples** + +```C +// 300x300 container with a 1px red border around all the edges +CLAY( + CLAY_ID("OuterBorder"), + CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_FIXED(300), .height = CLAY_SIZING_FIXED(300)}), + CLAY_BORDER_CONFIG_OUTSIDE({ .color = COLOR_RED, .width = 1 }) +) { + // ... +} + +// Container with a 3px yellow bottom border +CLAY( + CLAY_ID("OuterBorder"), + CLAY_BORDER({ .bottom = { .color = COLOR_YELLOW, .width = 3 } }) +) { + // ... +} + +// Container with a 5px curved border around the edges, and a 5px blue border between all children laid out top to bottom +CLAY( + CLAY_ID("OuterBorder"), + CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM }), + CLAY_BORDER_CONFIG_ALL_RADIUS(5, COLOR_BLUE, 5) +) { + // Child + // -- 5px blue border will be here -- + // Child + // -- 5px blue border will be here -- + // Child +} +``` + +**Rendering** + +Element is subject to [culling](#visibility-culling). Otherwise, a single `Clay_RenderCommand` with `commandType = CLAY_RENDER_COMMAND_TYPE_BORDER` representing the container will be created. +Rendering of borders and rounded corners is left up to the user. See the provided [Raylib Renderer](https://github.com/nicbarker/clay/tree/main/renderers/raylib) for examples of how to draw borders using line and curve primitives. + +### CLAY_FLOATING +**Usage** + +`CLAY_FLOATING(Clay_ElementId id, Clay_LayoutConfig *layoutConfig, Clay_FloatingElementConfig *floatingConfig);` + +**Lifecycle** + +`Clay_BeginLayout()` -> `CLAY_FLOATING()` -> `Clay_EndLayout()` + +**Notes** + +**FLOATING** defines an element that "floats" above other content. Typical use-cases include tooltips and modals. + +Floating containers: + +- With the [default configuration](#clay_floating_config), attach to the top left corner of their "parent" +- Don't affect the width and height of their parent +- Don't affect the positioning of sibling elements +- Depending on their z-index can appear above or below other elements, partially or completely occluding them +- Apart from positioning, function just like standard `CLAY` elements - including expanding to fit their children, etc. + +The easiest mental model to use when thinking about floating containers is that they are a completely separate UI hierarchy, attached to a specific x,y point on their "parent". + +Floating elements uses `Clay_FloatingElementConfig` to configure specific options. **Struct Definition (Pseudocode)** ```C -typedef struct -{ +Clay_FloatingElementConfig { Clay_Vector2 offset { float x, float y }; @@ -1142,16 +1267,16 @@ typedef struct .element = CLAY_ATTACH_POINT_LEFT_TOP (default) | CLAY_ATTACH_POINT_LEFT_CENTER | CLAY_ATTACH_POINT_LEFT_BOTTOM | CLAY_ATTACH_POINT_CENTER_TOP | CLAY_ATTACH_POINT_CENTER_CENTER | CLAY_ATTACH_POINT_CENTER_BOTTOM | CLAY_ATTACH_POINT_RIGHT_TOP | CLAY_ATTACH_POINT_RIGHT_CENTER | CLAY_ATTACH_POINT_RIGHT_BOTTOM .parent = CLAY_ATTACH_POINT_LEFT_TOP (default) | CLAY_ATTACH_POINT_LEFT_CENTER | CLAY_ATTACH_POINT_LEFT_BOTTOM | CLAY_ATTACH_POINT_CENTER_TOP | CLAY_ATTACH_POINT_CENTER_CENTER | CLAY_ATTACH_POINT_CENTER_BOTTOM | CLAY_ATTACH_POINT_RIGHT_TOP | CLAY_ATTACH_POINT_RIGHT_CENTER | CLAY_ATTACH_POINT_RIGHT_BOTTOM }; -} Clay_FloatingElementConfig; +}; ``` -As with all config macros, `CLAY_FLOATING_CONFIG()` accepts designated initializer syntax and provides default values for any unspecified struct members. +As with all config macros, `CLAY_FLOATING()` accepts designated initializer syntax and provides default values for any unspecified struct members. **Fields** **`.offset`** - `Clay_Vector2` -`CLAY_FLOATING_CONFIG(.offset = { -24, -24 })` +`CLAY_FLOATING({ .offset = { -24, -24 } })` Used to apply a position offset to the floating container _after_ all other layout has been calculated. @@ -1159,7 +1284,7 @@ Used to apply a position offset to the floating container _after_ all other layo **`.expand`** - `Clay_Dimensions` -`CLAY_FLOATING_CONFIG(.expand = { 16, 16 })` +`CLAY_FLOATING({ .expand = { 16, 16 } })` Used to expand the width and height of the floating container _before_ laying out child elements. @@ -1167,7 +1292,7 @@ Used to expand the width and height of the floating container _before_ laying ou **`.zIndex`** - `float` -`CLAY_FLOATING_CONFIG(.zIndex = 1)` +`CLAY_FLOATING({ .zIndex = 1 })` All floating elements (as well as their entire child hierarchies) will be sorted by `.zIndex` order before being converted to render commands. If render commands are drawn in order, elements with higher `.zIndex` values will be drawn on top. @@ -1175,41 +1300,41 @@ All floating elements (as well as their entire child hierarchies) will be sorted **`.parentId`** - `uint32_t` -`CLAY_FLOATING_CONFIG(.parentId = CLAY_ID("HeaderButton").id)` +`CLAY_FLOATING({ .parentId = Clay_GetElementId("HeaderButton").id })` By default, floating containers will "attach" to the parent element that they are declared inside. However, there are cases where this limitation could cause significant performance or ergonomics problems. `.parentId` allows you to specify a `CLAY_ID().id` to attach the floating container to. The parent element with the matching id can be declared anywhere in the hierarchy, it doesn't need to be declared before or after the floating container in particular. Consider the following case: ```C // Load an image somewhere in your code -CLAY_CONTAINER(CLAY_IDI("SidebarButton", 1), &CLAY_LAYOUT_DEFAULT) { +CLAY(CLAY_IDI("SidebarButton", 1), &CLAY_LAYOUT_DEFAULT) { // .. some button contents if (tooltip.attachedButtonIndex == 1) { - CLAY_FLOATING_CONTAINER(/* floating config... */) + CLAY_FLOATING(/* floating config... */) } } -CLAY_CONTAINER(CLAY_IDI("SidebarButton", 2), &CLAY_LAYOUT_DEFAULT) { +CLAY(CLAY_IDI("SidebarButton", 2), &CLAY_LAYOUT_DEFAULT) { // .. some button contents if (tooltip.attachedButtonIndex == 2) { - CLAY_FLOATING_CONTAINER(/* floating config... */) + CLAY_FLOATING(/* floating config... */) } } -CLAY_CONTAINER(CLAY_IDI("SidebarButton", 3), &CLAY_LAYOUT_DEFAULT) { +CLAY(CLAY_IDI("SidebarButton", 3), &CLAY_LAYOUT_DEFAULT) { // .. some button contents if (tooltip.attachedButtonIndex == 3) { - CLAY_FLOATING_CONTAINER(/* floating config... */) + CLAY_FLOATING(/* floating config... */) } } -CLAY_CONTAINER(CLAY_IDI("SidebarButton", 4), &CLAY_LAYOUT_DEFAULT) { +CLAY(CLAY_IDI("SidebarButton", 4), &CLAY_LAYOUT_DEFAULT) { // .. some button contents if (tooltip.attachedButtonIndex == 4) { - CLAY_FLOATING_CONTAINER(/* floating config... */) + CLAY_FLOATING(/* floating config... */) } } -CLAY_CONTAINER(CLAY_IDI("SidebarButton", 5), &CLAY_LAYOUT_DEFAULT) { +CLAY(CLAY_IDI("SidebarButton", 5), &CLAY_LAYOUT_DEFAULT) { // .. some button contents if (tooltip.attachedButtonIndex == 5) { - CLAY_FLOATING_CONTAINER(/* floating config... */) + CLAY_FLOATING(/* floating config... */) } } ``` @@ -1218,24 +1343,24 @@ The definition of the above UI is significantly polluted by the need to conditio ```C // Load an image somewhere in your code -CLAY_CONTAINER(CLAY_IDI("SidebarButton", 1), &CLAY_LAYOUT_DEFAULT) { +CLAY(CLAY_IDI("SidebarButton", 1), &CLAY_LAYOUT_DEFAULT) { // .. some button contents } -CLAY_CONTAINER(CLAY_IDI("SidebarButton", 2), &CLAY_LAYOUT_DEFAULT) { +CLAY(CLAY_IDI("SidebarButton", 2), &CLAY_LAYOUT_DEFAULT) { // .. some button contents } -CLAY_CONTAINER(CLAY_IDI("SidebarButton", 3), &CLAY_LAYOUT_DEFAULT) { +CLAY(CLAY_IDI("SidebarButton", 3), &CLAY_LAYOUT_DEFAULT) { // .. some button contents } -CLAY_CONTAINER(CLAY_IDI("SidebarButton", 4), &CLAY_LAYOUT_DEFAULT) { +CLAY(CLAY_IDI("SidebarButton", 4), &CLAY_LAYOUT_DEFAULT) { // .. some button contents } -CLAY_CONTAINER(CLAY_IDI("SidebarButton", 5), &CLAY_LAYOUT_DEFAULT) { +CLAY(CLAY_IDI("SidebarButton", 5), &CLAY_LAYOUT_DEFAULT) { // .. some button contents } // Any other point in the hierarchy -CLAY_FLOATING_CONTAINER(CLAY_ID("OptionTooltip"), &CLAY_LAYOUT_DEFAULT, CLAY_FLOATING_CONFIG(.parentId = CLAY_IDI("SidebarButton", tooltip.attachedButtonIndex).id)) { +CLAY_FLOATING(CLAY_ID("OptionTooltip"), &CLAY_LAYOUT_DEFAULT, CLAY_FLOATING(.parentId = CLAY_IDI("SidebarButton", tooltip.attachedButtonIndex).id)) { // Tooltip contents... } ``` @@ -1244,7 +1369,7 @@ CLAY_FLOATING_CONTAINER(CLAY_ID("OptionTooltip"), &CLAY_LAYOUT_DEFAULT, CLAY_FLO **`.attachment`** - `Clay_FloatingAttachPoints` -`CLAY_FLOATING_CONFIG(.attachment = { .element = CLAY_ATTACH_POINT_LEFT_CENTER, .parent = CLAY_ATTACH_POINT_RIGHT_TOP });` +`CLAY_FLOATING(.attachment = { .element = CLAY_ATTACH_POINT_LEFT_CENTER, .parent = CLAY_ATTACH_POINT_RIGHT_TOP });` In terms of positioning the floating container, `.attachment` specifies @@ -1259,145 +1384,61 @@ For example: "Attach the LEFT_CENTER of the floating container to the RIGHT_TOP of the parent" -`CLAY_FLOATING_CONFIG(.attachment = { .element = CLAY_ATTACH_POINT_LEFT_CENTER, .parent = CLAY_ATTACH_POINT_RIGHT_TOP });` +`CLAY_FLOATING(.attachment = { .element = CLAY_ATTACH_POINT_LEFT_CENTER, .parent = CLAY_ATTACH_POINT_RIGHT_TOP });` ![Screenshot 2024-08-23 at 11 53 24 AM](https://github.com/user-attachments/assets/ebe75e0d-1904-46b0-982d-418f929d1516) - -### CLAY_SCROLL_CONFIG - -**CLAY_SCROLL_CONFIG()** is a macro used to create and store `Clay_ScrollElementConfig` structs, which are for configuring [CLAY_SCROLL_CONTAINER](#clay_scroll_container) elements. - -**Struct Definition (Pseudocode)** - -```C -typedef struct -{ - bool horizontal; - bool vertical; -} Clay_ScrollElementConfig; -``` - -As with all config macros, `CLAY_SCROLL_CONFIG()` accepts designated initializer syntax and provides default values for any unspecified struct members. - -**Fields** - -**`.horizontal`** - `bool` - -`CLAY_SCROLL_CONFIG(.horizontal = true)` - -Enables or disables horizontal scrolling for this container element. - ---- - -**`.vertical`** - `bool` - -`CLAY_SCROLL_CONFIG(.vertical = true)` - -Enables or disables vertical scrolling for this container element. - **Examples** ```C -CLAY_SCROLL_CONTAINER(CLAY_ID("MainContent"), &CLAY_LAYOUT_DEFAULT, CLAY_SCROLL_CONFIG(.vertical = true)) { - // Create child content with a fixed height of 5000 - CLAY_CONTAINER(CLAY_ID("ScrollInner"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(5000) })) {} +// Horizontal container with three option buttons +CLAY(CLAY_ID("OptionsList"), CLAY_LAYOUT(.childGap = 16)) { + CLAY_RECTANGLE(CLAY_IDI("Option", 1), CLAY_LAYOUT(.padding = {16, 16}), CLAY_RECTANGLE(.color = COLOR_BLUE)) { + CLAY_TEXT(CLAY_IDI("OptionText", 1), CLAY_STRING("Option 1"), CLAY_TEXT_CONFIG()); + } + CLAY_RECTANGLE(CLAY_IDI("Option", 2), CLAY_LAYOUT(.padding = {16, 16}), CLAY_RECTANGLE(.color = COLOR_BLUE)) { + CLAY_TEXT(CLAY_IDI("OptionText", 2), CLAY_STRING("Option 2"), CLAY_TEXT_CONFIG()); + // Floating tooltip will attach above the "Option 2" container and not affect widths or positions of other elements + CLAY_FLOATING(CLAY_ID("OptionTooltip"), &CLAY_LAYOUT_DEFAULT, CLAY_FLOATING(.zIndex = 1, .attachment = { .element = CLAY_ATTACH_POINT_CENTER_BOTTOM, .parent = CLAY_ATTACH_POINT_CENTER_TOP })) { + CLAY_TEXT(CLAY_IDI("OptionTooltipText", 1), CLAY_STRING("Most popular!"), CLAY_TEXT_CONFIG()); + } + } + CLAY_RECTANGLE(CLAY_IDI("Option", 3), CLAY_LAYOUT(.padding = {16, 16}), CLAY_RECTANGLE(.color = COLOR_BLUE)) { + CLAY_TEXT(CLAY_IDI("OptionText", 3), CLAY_STRING("Option 3"), CLAY_TEXT_CONFIG()); + } +} + +// Floating containers can also be declared elsewhere in a layout, to avoid branching or polluting other UI +for (int i = 0; i < 1000; i++) { + CLAY(CLAY_IDI("Option", i + 1), &CLAY_LAYOUT_DEFAULT) { + // ... + } +} +// Note the use of "parentId". +// Floating tooltip will attach above the "Option 2" container and not affect widths or positions of other elements +CLAY_FLOATING(CLAY_ID("OptionTooltip"), &CLAY_LAYOUT_DEFAULT, CLAY_FLOATING(.parentId = CLAY_IDI("Option", 2).id, .zIndex = 1, .attachment = { .element = CLAY_ATTACH_POINT_CENTER_BOTTOM, .parent = CLAY_ATTACH_POINT_TOP_CENTER })) { + CLAY_TEXT(CLAY_IDI("OptionTooltipText", 1), CLAY_STRING("Most popular!"), CLAY_TEXT_CONFIG()); } ``` -### CLAY_BORDER_CONFIG +When using `.parentId`, the floating container can be declared anywhere after `BeginLayout` and before `EndLayout`. The target element matching the `.parentId` doesn't need to exist when `CLAY_FLOATING` is called. -**CLAY_BORDER_CONFIG()** is a macro used to create and store `Clay_BorderElementConfig` structs, which are for configuring [CLAY_BORDER_CONTAINER](#clay_border_container) elements. +**Rendering** -**Struct Definition (Pseudocode)** - -```C -typedef struct -{ - Clay_Border left { - float width; - Clay_Color color { - float r; float g; float b; float a; - }; - }; - Clay_Border right { - float width; - Clay_Color color { - float r; float g; float b; float a; - }; - } - Clay_Border top { - float width; - Clay_Color color { - float r; float g; float b; float a; - }; - }; - Clay_Border bottom { - float width; - Clay_Color color { - float r; float g; float b; float a; - }; - }; - Clay_Border betweenChildren { - float width; - Clay_Color color { - float r; float g; float b; float a; - }; - }; - Clay_CornerRadius cornerRadius { - float topLeft; - float topRight; - float bottomLeft; - float bottomRight; - }; -} Clay_BorderElementConfig; -``` +`CLAY_FLOATING` elements will not generate any render commands. +### CLAY_CUSTOM_ELEMENT **Usage** -As with all config macros, `CLAY_BORDER_CONFIG()` accepts designated initializer syntax and provides default values for any unspecified struct members. +`CLAY_CUSTOM_ELEMENT(Clay_ElementId id, Clay_LayoutConfig *layoutConfig, Clay_CustomElementConfig *customConfig);` +**Lifecycle** -**Fields** +`Clay_BeginLayout()` -> `CLAY_CUSTOM_ELEMENT()` -> `Clay_EndLayout()` -**`.left, .right, .top, .bottom`** - `Clay_Border` +**Notes** -`CLAY_BORDER_CONFIG(.left = { 2, COLOR_RED }, .right = { 4, COLOR_YELLOW } /* etc */)` - -Indicates to the renderer that a border of `.color` should be draw at the specified edges of the bounding box, **overlapping the box contents by `.width`**. - -This means that border configuration does not affect layout, as the width of the border doesn't contribute to the total container width or layout position. Border containers with zero padding will be drawn over the top of child elements. - ---- - -**`.betweenChildren`** - `Clay_Border` - -`CLAY_BORDER_CONFIG(.betweenChildren = { 2, COLOR_RED })` - -Configures the width and color of borders to be drawn between children. These borders will be vertical lines if the parent uses `.layoutDirection = CLAY_LEFT_TO_RIGHT` and horizontal lines if the parent uses `CLAY_TOP_TO_BOTTOM`. Unlike `.left, .top` etc, this option **will generate additional rectangle render commands representing the borders between children.** As a result, the renderer does not need to specifically implement rendering for these border elements. - ---- - -**`.cornerRadius`** - `float` - -`CLAY_BORDER_CONFIG(.cornerRadius = 16)` - -Defines the radius in pixels for the arc of border corners (`0` is square, `rectangle.width / 2` is circular). It is up to the renderer to decide how to interpolate between differing border widths and colors across shared corners. - -Note that the `CLAY_CORNER_RADIUS(radius)` function-like macro is available to provide short hand for setting all four corner radii to the same value. e.g. `CLAY_BORDER_CONFIG(.cornerRadius = CLAY_CORNER_RADIUS(10))` - -**Convenience Macros** - -There are some common cases for border configuration that are repetitive, i.e. specifying the same border around all four edges. Some convenience macros are provided for these cases: - -- `CLAY_BORDER_CONFIG_OUTSIDE(.width = 2, .color = COLOR_RED)` - Shorthand for configuring all 4 outside borders at once.` -- `CLAY_BORDER_CONFIG_OUTSIDE_RADIUS(width, color, radius)` - Shorthand for configuring all 4 outside borders at once, with the provided `.cornerRadius`. Note this is a function-like macro and does not take `.member = value` syntax. -- `CLAY_BORDER_CONFIG_ALL(.width = 2, .color = COLOR_RED)` - Shorthand for configuring all 4 outside borders and `.betweenChildren` at once. -- `CLAY_BORDER_CONFIG_ALL_RADIUS(width, color, radius)` - Shorthand for configuring all 4 outside borders and `.betweenChildren` at once, with the provided `cornerRadius`. Note this is a function-like macro and does not take `.member = value` syntax. - -### CLAY_CUSTOM_ELEMENT_CONFIG - -**CLAY_CUSTOM_ELEMENT_CONFIG()** is a macro used to create and store `Clay_CustomElementConfig` structs, which are for configuring [CLAY_CUSTOM_ELEMENT]() elements. +**CUSTOM_ELEMENT** uses [Clay_LayoutConfig](#clay_layout) for styling and layout, and allows the user to pass custom data to the renderer. **Struct Definition (Pseudocode)** @@ -1430,6 +1471,7 @@ The underlying `Clay_ImageCustomConfig` can be extended with new members by usin `.customData` is a generic void pointer that can be used to pass through custom data to the renderer. **Note:** this field is generally not recommended for usage due to the lack of type safety, see `#define CLAY_EXTEND_CONFIG_CUSTOM` in [Preprocessor Directives]() for an alternative. +**Examples** ```C // Extend CLAY_CUSTOM_ELEMENT_CONFIG with your custom data #define CLAY_EXTEND_CONFIG_CUSTOM struct t_CustomElementData customData; @@ -1449,7 +1491,7 @@ typedef struct t_CustomElementData { Model myModel = Load3DModel(filePath); CustomElement modelElement = (CustomElement) { .type = CUSTOM_ELEMENT_TYPE_MODEL, .model = myModel } // ... -CLAY_CONTAINER(id, style) { +CLAY(id, style) { // This config is type safe and contains the CustomElementData struct CLAY_CUSTOM_ELEMENT(id, layout, CLAY_CUSTOM_ELEMENT_CONFIG(.customData = { .type = CUSTOM_ELEMENT_TYPE_MODEL, .model = myModel })) {} } @@ -1477,19 +1519,10 @@ switch (renderCommand->commandType) { } ``` -## Misc Macros +**Rendering** -### CLAY_ID - -`Clay_ElementId CLAY_ID(char *label)` - -Generates a [Clay_ElementId](#clay_elementid) from the provided `char *label`. Used both to generate ids when defining element macros, as well as for referencing ids later when using utility functions such as [Clay_PointerOver](#clay-pointerover) - -### CLAY_IDI() - -`Clay_ElementId CLAY_IDI(char *label, int index)` - -Generates a [Clay_ElementId](#clay_elementid) string id from the provided `char *label`, combined with the `int index`. Used for generating ids for sequential elements (such as in a `for` loop) without having to construct dynamic strings at runtime. +Element is subject to [culling](#visibility-culling). Otherwise, a single `Clay_RenderCommand` with `commandType = CLAY_RENDER_COMMAND_TYPE_CUSTOM` will be created. +The user will need to access [Clay_CustomElementConfig](#clay_custom_element_config) to retrieve custom data referenced during layout creation. ## Data Structures & Definitions @@ -1609,11 +1642,11 @@ A rectangle representing the bounding box of this render command, with `.x` and A C union containing various pointers to config data, with the type dependent on `.commandType`. Possible values include: -- `config.rectangleElementConfig` - Used when `.commandType == CLAY_RENDER_COMMAND_TYPE_RECTANGLE`. See [CLAY_RECTANGLE_CONFIG](#clay_rectangle_config) for details. -- `config.textElementConfig` - Used when `.commandType == CLAY_RENDER_COMMAND_TYPE_TEXT`. See [CLAY_TEXT_CONFIG](#clay_text_config) for details. -- `config.imageElementConfig` - Used when `.commandType == CLAY_RENDER_COMMAND_TYPE_IMAGE`. See [CLAY_IMAGE_CONFIG](#clay_image_config) for details. -- `config.borderElementConfig` - Used when `.commandType == CLAY_RENDER_COMMAND_TYPE_BORDER`. See [CLAY_BORDER_CONFIG](#clay_border_config) for details. -- `config.customElementConfig` - Used when `.commandType == CLAY_RENDER_COMMAND_TYPE_CUSTOM`. See [CLAY_CUSTOM_CONFIG](#clay_custom_config) for details. +- `config.rectangleElementConfig` - Used when `.commandType == CLAY_RENDER_COMMAND_TYPE_RECTANGLE`. See [CLAY_RECTANGLE](#clay_rectangle) for details. +- `config.textElementConfig` - Used when `.commandType == CLAY_RENDER_COMMAND_TYPE_TEXT`. See [CLAY_TEXT](#clay_text) for details. +- `config.imageElementConfig` - Used when `.commandType == CLAY_RENDER_COMMAND_TYPE_IMAGE`. See [CLAY_IMAGE](#clay_image) for details. +- `config.borderElementConfig` - Used when `.commandType == CLAY_RENDER_COMMAND_TYPE_BORDER`. See [CLAY_BORDER](#clay_border) for details. +- `config.customElementConfig` - Used when `.commandType == CLAY_RENDER_COMMAND_TYPE_CUSTOM`. See [CLAY_CUSTOM](#clay_custom_element) for details. - `config.floatingElementConfig` - Not used and will always be NULL. - `config.scrollElementConfig` - Not used and will always be NULL. diff --git a/bindings/odin/clay-odin/clay.odin b/bindings/odin/clay-odin/clay.odin index 925dcc0..7d114c3 100644 --- a/bindings/odin/clay-odin/clay.odin +++ b/bindings/odin/clay-odin/clay.odin @@ -70,6 +70,19 @@ when ODIN_OS == .Windows { EnumBackingType :: u8 } +ElementConfigType :: enum EnumBackingType { + Rectangle = 1, + Border = 2, + Floating = 4, + Scroll = 8, + Image = 16, + Text = 32, + Custom = 64, + // Odin specific enum types + Id = 65, + Layout = 66, +} + RenderCommandType :: enum EnumBackingType { None, Rectangle, @@ -245,17 +258,24 @@ ClayArray :: struct($type: typeid) { internalArray: [^]type, } +TypedConfig :: struct { + type: ElementConfigType, + config: rawptr, + id: ElementId, +} + @(link_prefix = "Clay_", default_calling_convention = "c") foreign Clay { MinMemorySize :: proc() -> u32 --- CreateArenaWithCapacityAndMemory :: proc(capacity: u32, offset: [^]u8) -> Arena --- SetPointerState :: proc(position: Vector2, pointerDown: bool) --- Initialize :: proc(arena: Arena, layoutDimensions: Dimensions) --- - UpdateScrollContainers :: proc(isPointerActive: bool, scrollDelta: Vector2, deltaTime: c.float) --- + UpdateScrollContainers :: proc(enableDragScrolling: bool, scrollDelta: Vector2, deltaTime: c.float) --- SetLayoutDimensions :: proc(dimensions: Dimensions) --- BeginLayout :: proc() --- EndLayout :: proc() -> ClayArray(RenderCommand) --- PointerOver :: proc(id: ElementId) -> bool --- + GetElementId :: proc(id: String) -> ElementId --- GetScrollContainerData :: proc(id: ElementId) -> ScrollContainerData --- SetMeasureTextFunction :: proc(measureTextFunction: proc "c" (text: ^String, config: ^TextElementConfig) -> Dimensions) --- RenderCommandArray_Get :: proc(array: ^ClayArray(RenderCommand), index: i32) -> ^RenderCommand --- @@ -264,17 +284,13 @@ foreign Clay { @(link_prefix = "Clay_", default_calling_convention = "c", private) foreign Clay { - _OpenContainerElement :: proc(id: ElementId, layoutConfig: ^LayoutConfig) --- - _OpenRectangleElement :: proc(id: ElementId, layoutConfig: ^LayoutConfig, rectangleConfig: ^RectangleElementConfig) --- - _OpenTextElement :: proc(id: ElementId, text: String, textConfig: ^TextElementConfig) --- - _OpenImageElement :: proc(id: ElementId, layoutConfig: ^LayoutConfig, imageConfig: ^ImageElementConfig) --- - _OpenScrollElement :: proc(id: ElementId, layoutConfig: ^LayoutConfig, imageConfig: ^ScrollElementConfig) --- - _OpenFloatingElement :: proc(id: ElementId, layoutConfig: ^LayoutConfig, imageConfig: ^FloatingElementConfig) --- - _OpenBorderElement :: proc(id: ElementId, layoutConfig: ^LayoutConfig, imageConfig: ^BorderElementConfig) --- - _OpenCustomElement :: proc(id: ElementId, layoutConfig: ^LayoutConfig, imageConfig: ^CustomElementConfig) --- - _CloseElementWithChildren :: proc() --- - _CloseScrollElement :: proc() --- - _CloseFloatingElement :: proc() --- + _OpenElement :: proc() --- + _CloseElement :: proc() --- + _ElementPostConfiguration :: proc() --- + _OpenTextElement :: proc(text: String, textConfig: ^TextElementConfig) --- + _AttachId :: proc(id: ElementId) --- + _AttachLayoutConfig :: proc(layoutConfig: ^LayoutConfig) --- + _AttachElementConfig :: proc(config: rawptr, type: ElementConfigType) --- _StoreLayoutConfig :: proc(config: LayoutConfig) -> ^LayoutConfig --- _StoreRectangleElementConfig :: proc(config: RectangleElementConfig) -> ^RectangleElementConfig --- _StoreTextElementConfig :: proc(config: TextElementConfig) -> ^TextElementConfig --- @@ -287,103 +303,77 @@ foreign Clay { _GetOpenLayoutElementId :: proc() -> u32 --- } -@(require_results, deferred_none = _CloseElementWithChildren) -Container :: proc(id: ElementId, layoutConfig: ^LayoutConfig) -> bool { - _OpenContainerElement(id, layoutConfig) +@(require_results, deferred_none = _CloseElement) +UI :: proc(configs: ..TypedConfig) -> bool { + _OpenElement() + for config in configs { + #partial switch (config.type) { + case ElementConfigType.Id: + _AttachId(config.id) + case ElementConfigType.Layout: + _AttachLayoutConfig(cast(^LayoutConfig)config.config) + case: + _AttachElementConfig(config.config, config.type) + } + } + _ElementPostConfiguration() return true } -@(require_results, deferred_none = _CloseElementWithChildren) -Rectangle :: proc(id: ElementId, layoutConfig: ^LayoutConfig, rectangleConfig: ^RectangleElementConfig) -> bool { - _OpenRectangleElement(id, layoutConfig, rectangleConfig) - return true +Layout :: proc(config: LayoutConfig) -> TypedConfig { + return {type = ElementConfigType.Layout, config = _StoreLayoutConfig(config) } } -Text :: proc(id: ElementId, text: string, textConfig: ^TextElementConfig) -> bool { - _OpenTextElement(id, MakeString(text), textConfig) - return true +Rectangle :: proc(config: RectangleElementConfig) -> TypedConfig { + return {type = ElementConfigType.Rectangle, config = _StoreRectangleElementConfig(config)} } -@(require_results, deferred_none = _CloseElementWithChildren) -Image :: proc(id: ElementId, layoutConfig: ^LayoutConfig, imageConfig: ^ImageElementConfig) -> bool { - _OpenImageElement(id, layoutConfig, imageConfig) - return true -} - -@(require_results, deferred_none = _CloseScrollElement) -Scroll :: proc(id: ElementId, layoutConfig: ^LayoutConfig, scrollConfig: ^ScrollElementConfig) -> bool { - _OpenScrollElement(id, layoutConfig, scrollConfig) - return true -} - -@(require_results, deferred_none = _CloseFloatingElement) -Floating :: proc(id: ElementId, layoutConfig: ^LayoutConfig, floatingConfig: ^FloatingElementConfig) -> bool { - _OpenFloatingElement(id, layoutConfig, floatingConfig) - return true -} - -@(require_results, deferred_none = _CloseElementWithChildren) -Border :: proc(id: ElementId, layoutConfig: ^LayoutConfig, borderConfig: ^BorderElementConfig) -> bool { - _OpenBorderElement(id, layoutConfig, borderConfig) - return true -} - -@(require_results, deferred_none = _CloseElementWithChildren) -Custom :: proc(id: ElementId, layoutConfig: ^LayoutConfig, customConfig: ^CustomElementConfig) -> bool { - _OpenCustomElement(id, layoutConfig, customConfig) - return true -} - -Layout :: proc(config: LayoutConfig) -> ^LayoutConfig { - return _StoreLayoutConfig(config) -} - -RectangleConfig :: proc(config: RectangleElementConfig) -> ^RectangleElementConfig { - return _StoreRectangleElementConfig(config) +Text :: proc(text: string, config: ^TextElementConfig) { + _OpenTextElement(MakeString(text), config) } TextConfig :: proc(config: TextElementConfig) -> ^TextElementConfig { return _StoreTextElementConfig(config) } -ImageConfig :: proc(config: ImageElementConfig) -> ^ImageElementConfig { - return _StoreImageElementConfig(config) +Image :: proc(config: ImageElementConfig) -> TypedConfig { + return {type = ElementConfigType.Image, config = _StoreImageElementConfig(config)} } -FloatingConfig :: proc(config: FloatingElementConfig) -> ^FloatingElementConfig { - return _StoreFloatingElementConfig(config) +Floating :: proc(config: FloatingElementConfig) -> TypedConfig { + return {type = ElementConfigType.Floating, config = _StoreFloatingElementConfig(config)} } -CustomConfig :: proc(config: CustomElementConfig) -> ^CustomElementConfig { - return _StoreCustomElementConfig(config) +Custom :: proc(config: CustomElementConfig) -> TypedConfig { + return {type = ElementConfigType.Custom, config = _StoreCustomElementConfig(config)} } -ScrollConfig :: proc(config: ScrollElementConfig) -> ^ScrollElementConfig { - return _StoreScrollElementConfig(config) +Scroll :: proc(config: ScrollElementConfig) -> TypedConfig { + return {type = ElementConfigType.Scroll, config = _StoreScrollElementConfig(config)} } -BorderConfig :: proc(config: BorderElementConfig) -> ^BorderElementConfig { - return _StoreBorderElementConfig(config) +Border :: proc(config: BorderElementConfig) -> TypedConfig { + return {type = ElementConfigType.Border, config = _StoreBorderElementConfig(config)} } -BorderConfigOutside :: proc(outsideBorders: BorderData) -> ^BorderElementConfig { - return _StoreBorderElementConfig((BorderElementConfig){left = outsideBorders, right = outsideBorders, top = outsideBorders, bottom = outsideBorders}) +BorderOutside :: proc(outsideBorders: BorderData) -> TypedConfig { + return { type = ElementConfigType.Border, config = _StoreBorderElementConfig((BorderElementConfig){left = outsideBorders, right = outsideBorders, top = outsideBorders, bottom = outsideBorders}) } } -BorderConfigOutsideRadius :: proc(outsideBorders: BorderData, radius: f32) -> ^BorderElementConfig { - return _StoreBorderElementConfig( +BorderOutsideRadius :: proc(outsideBorders: BorderData, radius: f32) -> TypedConfig { + return { type = ElementConfigType.Border, config = _StoreBorderElementConfig( (BorderElementConfig){left = outsideBorders, right = outsideBorders, top = outsideBorders, bottom = outsideBorders, cornerRadius = {radius, radius, radius, radius}}, - ) + ) } } -BorderConfigAll :: proc(allBorders: BorderData) -> ^BorderElementConfig { - return _StoreBorderElementConfig((BorderElementConfig){left = allBorders, right = allBorders, top = allBorders, bottom = allBorders, betweenChildren = allBorders}) +BorderAll :: proc(allBorders: BorderData) -> TypedConfig { + return { type = ElementConfigType.Border, config = _StoreBorderElementConfig((BorderElementConfig){left = allBorders, right = allBorders, top = allBorders, bottom = allBorders, betweenChildren = allBorders}) } } -BorderConfigAllRadius :: proc(allBorders: BorderData, radius: f32) -> ^BorderElementConfig { - return _StoreBorderElementConfig( +BorderAllRadius :: proc(allBorders: BorderData, radius: f32) -> TypedConfig { + return { type = ElementConfigType.Border, config = _StoreBorderElementConfig( (BorderElementConfig){left = allBorders, right = allBorders, top = allBorders, bottom = allBorders, cornerRadius = {radius, radius, radius, radius}}, - ) + ) } } CornerRadiusAll :: proc(radius: f32) -> CornerRadius { @@ -410,10 +400,6 @@ MakeString :: proc(label: string) -> String { return String{chars = raw_data(label), length = cast(c.int)len(label)} } -ID :: proc(label: string, index: u32 = 0) -> ElementId { - return _HashString(MakeString(label), index, 0) -} - -IDLocal :: proc(label: string, index: u32 = 0) -> ElementId { - return _HashString(MakeString(label), index, _GetOpenLayoutElementId()) +ID :: proc(label: string, index: u32 = 0) -> TypedConfig { + return { type = ElementConfigType.Id, id = _HashString(MakeString(label), index, 0) } } diff --git a/bindings/odin/clay-odin/linux/clay.a b/bindings/odin/clay-odin/linux/clay.a index ef77c5db45567f0936a9cd227e98909f124cf481..0789fdf611100498f175b2f7b00304b93ee88e47 100644 GIT binary patch literal 159628 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

`XixSRd-xmR8n@x`r2bA5 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�s+twi_^v$UXaFv;w^U9!mO=LU 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 A+W-In diff --git a/bindings/odin/clay-odin/macos-arm64/clay.a b/bindings/odin/clay-odin/macos-arm64/clay.a index c71881e9c4d27fd321eef6fc01768a05074f881a..0c6d92dcc713a080eebb7b571ce7229626388c8f 100644 GIT binary patch literal 116736 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 literal 134016 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 HbHDGz^gFkj)1oJgZlzTD3UU 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 literal 144160 zcmd?S4SZZzaW}lOr9>nSy8;6O0uf-q;UmZ)fWe`xV{cfuRw5jmC?!;OY&mk{*s8q> z3Rs|2zEqo=1+|T+N}Z=F%~MQCL2V=AP%DvBBPrBv1T{fC^{)tOiiBLy)0jlGZv6iL zGjqT8Ltgty-}Zf8Lw4?&GjqJ`Y)>=pI(@4n`my1Mtg_r1vBzs;94H(zzrEe&f^*Vo;2RiWj)!QgcUf6ZW*!Ot5!V(>=>7cWx& zcNo0c;HM1!iNU`!c*@|C#mcwJ;Ch3%8FUQ(iNRrmPZ@mH;6;@tzrkw^e#qe620v%; zPYoV6_&tLaRa(w#4X!k}!QgI#j=?V&JY?{=!FhuT*ogLdhrt^S?lt%YgQEt2XmHWR z%J*`E?>4x>;7)_R1|K&#WpGKg^1t2SEe7v4c);M-4E}?`pBsGji^!QwHxac);Kj z27hX>;xeUwlfe%g{Di>)gO3{gw!xnoy!ge+|0;v;F}T6tuN(Zd!9O(kHG@wXeAeLd zxR&>BgEtu5Yw&jre#zjd!50+K=Id^}aeX0f!`jq_<~29ouyOUe8}O7` zpK3_mu#uSS*L^Ube9fktHs0894x+WG>o$Gx!|PHvqmcDCZfIWN36P(0b*YSZmdd!M zRK`t^dkyB;<_$OATu8I-hP7a}av-SEM}Y?RoXPObZ3+E=8s z!&k!E)f-pm>&esNy0!T^*RQ{E^+wd=vlmzNx`x#sOr3+qtnAg5XYIV)^y-_^%?+y? zo7ZhjHRKDGN4s%DD%E_$jcZfo&~3Q!#sW`kNUgqU(}q;@##9qLY4w_Ps%W(vV6xRW zd~p4_8oD6``_V}o8dl#>pwXMwY`Ag#`j89fDWV|XQ&@4$-_*EzO=?Yg^#;!qZrZqk z_R1?&nznFB5t3qFa`Wm9H$;oxx#jNW>soH#v1|R7yLY!|AObOK_Oxutw5;CKvTMuD zJ2I_nwzO^8x+8P<>RsC!TJGGv=WZiQ?b;S$`(R7vrmcH+@7%d&_pZ#A9lKigtlg5? zV#Moq?a1udvUA7BTMVJBshur%w(QER-m?ewuHLq7fy|vdcW;GQ%_3K6I!Ixe4Lf$J zyf+24HtycBE7P*)#=Bbf7}bWBUE5mrtl53%om+No%a@~AW-&R6&;@eb)RI}-a$EcD z4ZF9sq;_q&ZD)(uOysB<*6x57_U_odYp+R#oQ9Syd)xQ4Y;5VsT;INHYX-SNrnTdy z3^ZccO>Ntd$g_Y~9(9}EvbVKiOWV3k%bmsoU5eg|HOcbU?b^CWOyqgNn%0)BcSQL& zY}s{tOBA2UY}wlC`@x#l9Xq$dojkVdcJJP~P}SG%-UFMMZ=jUzJ8sXnOmk_PqOG}Z zcl)kwJ9gcE-R=(h^adtdwtaZZ&h{2xM{Bn1+}geqO1yr@t}QzwzTLd0b<3WGL|(IV z_udwh*lT7OCmktI4U&KT&fQxw5Ud!l8Z$qqeQ##>oeL{xO-Y)f$`SXp64_@9lwE@0 zJPHfCL$eh2;TYu5Jhkxr=!S95zR3~1R8ZrE~XOJ4qty_r2bZfl3*qm!?`bN8;> z^PSDwwXUFZH|OURZB8Chs2zEhE8(XLQ5CHaH5BQoz~0!_V&k+glcy#!+yq7Jx;>1c z%Ea%a2YET`?%Z;_=cy%RE=f{U;9zJ^wY6fb*t2D4WS(da2pU`V?1jZJ;^$LjHtvo# zAnXkV{#YclsAx)O>I!MKM1ds%{$F{WH zwj~(PBa&|1)6#MS=B$N9&7(TEtWkzi!jfvk?%f5EL34qKA*%8!4;V^Tes^2T#@&%g zeIrm_4+_o9MNn%n^R;k1E6`hrFQ2HWOt1hQjy_En71PId*!ZSU9ifl*xKH80N_) zy=L9sb%?ySwXjgHp!^C-43i6z6}9MwmR5|^K{ZTKEjP5^d7B@RHml>w)EDvgz3VY{ z2F#3GLqwPWL*sv_49>4bxQJHMm&jbRd*^O1N)F3J#x=Y5Aim$QW!sK+KYYro(v+>b zOSf!+v|dGdK`KLzbqvc9brp1)bJG^p^f}o=UFe*&#Rp4ei!`%@^u=h3ON}7L?{#}u z??gDWx?_j0;hQqM_q0U1t7_NREAxxQev$mV4p*dvaK9^(tv*>Kqj-OaR9-}9k^E3E z&98vbO`(1z=rMFrl@^p(P(~?=a}`%KQVtas$}hjDkXzooWzVi+ZI0rL7Jc)c9f*iU zHyd|z>2h8B_U%Fc;~>0cL(5*ol-sxC*E7Lwh3hWg_qK)ye6@|Aw~fnNb8@!YD^Ku+ z%iduP}^_ z9ljKWS=VjZ+rn@#k3=;VZo&5G>MXC_x3^#r#OlponK$n!2(Eo4g|jSP3-Wel-g$L% zVX%YEiV(i2sUsvI?}^|;p#bnU(8342_V1MKpS;#7vS4eXS@EXn{MA;`%&7N8NY-sr zrTeOg&&&0*z!jbii5J8b1t zYH_h;TPk8Wp7;OdH_0z=W%2SxKB@)b$Wi_+zpWw`F2kB{xs-1k=N127b2B%%{bX#y z%1fJkD^VWH*gUN;pwy@4=B;~mzr;&(_dKAgZPtQbjI%)g>)L7sYckSyqEH@okTDO~ zzkK;TJ5Glh7H)5}bS-Zef_?8_zCD)jRSq0k%fH@_MeX77d9bBC*8Dg;sp()A+!ZNR}_RKyOV)3e_;;y?c5n85%32LDaqzlh*Sm-BB^I{Tw+ z=c#nIeacOpN*|f3OlMP*c+95e#!{zQM0zYWFVIa*rQKvA?KVuM7q6}Z;Y8Zyf14)K z-9NneQC#PUrLX)}x?&tz6 z!lyr?ZWq`Vb0hM0#Bo8|K_~mEAKH z*(cLSegH-haP~3?l%v*TDsKvMZQp)X{EGd=seJdG>cV5T^K`a-F1rcJZGdu5$G@7I z%Z`9cTUShz+0+14e*{8IxSLL8pI-6p^mET5HE`Z~jp`9a(00C_XYY8n>MZ_MWSYiO z2R{O7(Wpx?_CdVCbguJYx_d0K;@Pj$C8zNpvfr;DbujHhaZ8rLwt(xGL4#>%aQ!l< zFbNf|T~;d`&{NOR$&?VQiHpLSF8t5T=;F6r)^kL|l?Gw_2%8SO5r_N(Y|Q*mBheTs?%E=P6u6UdiJuQV@*r9pY}yAEI)q?=)f3&p`bpf z=l_Ml;L<>1vpBKJ;|DUn%<^MVM-Lmjx zcgMFcFFDy^t}8Xw-SH&Y7P5HJ@q5AXgOkYlk00&R+v6{V^JY6SbET$S>EKi04&F$- z3?%NRDfgEvvwzn;T9MsTDHC=jTft}`D;|xh9nd4kd>l;eLWyy5wz!9%e|!IbZf`O5 z`OZHGKxyh}*l1c!Jsmdnb;O&gr=zBJH-T~KctFrF9Ww6Xg`K&#obiiswM?q#F+Ok4 z&TY@8o?W0xs{@HQMVqwU-Sq7C?9y~V5Ngu5ez0(h#9a&Gs|EWf*M8?c|CBqw-|^%U z75Kd7_j>rliD%+9sgqE`3B-D*+|NNC;unxhoj0O{77rB9WbCHRtiG&t{=(JvdF%59n9nnu&sq6G^ErqX8r{q358R45@A3Qv zXx~br_LXVbum6}nnnkh(++@z z?+umNr)=T-q>Yc384B-?{J{>qS${5M zugB{Di~PNw{?5u5@^=uu!2WI}zF_|TSkr%z{+g&iR=$w_K=cCZ&q_Q${h>d=UlIRg z+vl^JPP;|c%~VIhr~@s1HxJQ`^)GO_aWGsn%)U&j z$h`|Xi$zNER^opDU1&Y~e?z>qz<5`yYP9_eFCJUa+~*gMr7xtvls})P)#DcwxM2UH zV9&L1zvZ0!4XAkR>ulUY{n4Z=8i8T^s+{;l)|=YS4izUG1@~uH3tX z)EHs1sl&4`0=|2s0*`LPVd62V&u$Iv>WW-ATtBVc9?xSrN zvfnA8`+2Tk6AO$NOVMZyyEsdM-9YG5)}(!M3^@EOf@LINFu7+IjI<9=e|Y z{-^j$wLi}nJAx{RFSxY*@8B*HUt~McEjuSd~#2zPR{~AmaQ2#jWlHGI?$GwX; zos@@@M}Bxo@cfgD-WlK*d-$m%Kg2T_r`$~^kNo6Pk7i1qJ^T;jA$mL;o@YQcJYW7$ zB`TK_A@~nFE6&1k(hgV~8E@au*(#Qar(HSuc9Zql)S20fSBwzA8_$rsiyBe=&8Kq> ziER5BoUvy&&AXep4l|-na%N@*&OegO|a+eD^ODQ=1P`&GX&Q5PfX!G(-hwG)Z&0<`qB_S?&GBgMEw=9qJ(njBk@O) zFL@^ZmJ#k%o*GMek*&`6vQ@#e|7r9sxDXyh5_ph2QxZPYecae$d0v2ql_eIY!tH@` z5kLeq+7|(h_MWHEXnTf_(xiU;(1`v3_dq9gdFP^iS{j;7F-~0Z?dN2{2w${rk#?)t z{c#p8;m%}t=VUCi+HIe-TLh{lyFP+3YgOuGJM75r5KCjYnE73DrzW%5`sHSCatSU? z%sz@@>0+J;XD1l6Leuy!n;L;6xOFm?I!2m*jVDqgkQ2eA+*^G~%}S{}JbvqAF*RB%le(Y_&3}ncruN4vTh(M~ID9m!n(O7IIheEt%#ICfqcFbvm zbZ=nsxyzn;Uj^JL*THtRCDLwVZCJ8wstYqtkD<~z;Vg4;;Z=KSAWy|C9Fs!AeZPhJ z-P8fx<{?TNd0^&y&r@wYkeotGk}&f@*!xgCv1vS>_~>N3rl~$&(^wa;Nhjhp-hCVE zDNZZeFzRf_Z*0`LoxtRdKQctD(c$8dkg|gA&VjR;D+6zLHiFJ=9|-Hf%@LVRuPo;C z4{{;lm1q6zo}=_U42fa?Ps{l~F7KQU9A(b;kU8;?Q{A1X&Su`_wx0^u4{c3BMN@Q( z)amw1_)HDXa?J!RyyMjDHwt&A^WwRCPW3|L$(~a(1q3xItaoTS=`a{>8YbNs zWWP7{T#qc2AvLX9533Hssw1%KL`iGfC?n$7clDlCc~_U9rGrIW8@iW9-gA_C z;RF_)zq(H)lRYv=i=tAhC}rC2Hdb#(NU$AucwA%*f2_|_s&m;BUqru+UU-&rzy68lR-^IW;Ik%C*@p1Pd6!*e!IFP(9AM$)$+r z(9*f?j-|2oZF~|_NU(rD$gxj?he_P?l!06LT`mT^FbXyvFKIurdACEM;JMjPu@1Lm zsW)z5+plvZ*8ZzwseuL&xN74&IfY|b%ykZw-V+=sStVixj80yqv)q>)0j?fp>bYcB zXmIF<3-&+G+vR1J7fi0H9+W&Ss<;n2zy{n1H0Ch$;Pz?zFLl44<;L!MP0^t->tsMV zdkGd)`V?~oX2tf3rwh$OGAYy*j}pg}RY5j&KNN0kXH&uQ?BWrujGoYYa5hB#UhoYP{Va{Yl zMSI%kNF*;e5igI3csWHp8i=TAig?uLtw~;_4G`ygpVpebc*#0tno=t2~@Kz zX-0HaKEjb|1jETZEOUAMtB7HAje3$bqL=4sI3KI6p7}SJ6Rk1hBXIw*7=H?`g7T-* z8mgbu_)}q1W3X_e%dWJo1R;cPBO0Gp3?albQWG$KBBELP2+kR3{0SDJX|@Q*4c5-U zi9F*Mn2^>Ne%Q~~4y{Cks@_ZZP1yMG6cMpDA|ln9IuwYgX^MEruMA$6rx$2g_KK#; zHU7hD{D*1$hl?2h7;8i%>o-p|oR8H;bF9&3KZ3IznM1D}&kFRGz}|Y4@rlx6Y_;)3 zoTj>aeo=h?QO}ER#?m)gxd*CG&7;z)HE)sGkgsom{1NuGw~YAWCDO1YL-Qs^;2Z^n zi&sLd0kAa|$#;1<$x5pE^sHxERH4prnk_snm0T6O>w{$$G*?*A91Fq^_IhwzUFDJa z94mG#+kL@I+9FLt6N4tvS*VCelWGf_G#!xyMbyYhsT)V}QcWsS(8PKAvMp9?g=;aoJ}jm4-mxiq2yI6+P7 zL_~19ZR!N&J3)Rp)sn!f=O}5iu%t+?n z>HAKIdlI@!i0~4}6}n)aL`*UnPsHHmSTIic+Z(d%c^qFLw%Y&_P-1^E*EuKQAUD+} zC@Hl8UqqKOV`z$&fOm5Ds+vPx+Aeqtku=+X;@TY%eY!RjuN?;aL>k+MfQJDea#KgM z95mY>BHzQ|8B4>{$O}x7^^@ewkKRwPYDUiLXlXgvGO_V8pC0jfFMAW?avMgo{MK%a zvFYQnx+3M$gJ-YXR*fXrUmkUp(5WFzvRG>Y*LH!zb$=j~2=)UhW~# zQfq)7?MNxwgPI_1-p$0x`VeAUXAP(Dq0e1a^&H_wna+ZR(lO?iBREWtOe zd~*^pJDT$N1X+S_Qu(HoPg5SBAWQI#E8m3jY0BdhWC^}Q$~U5Xn)3JrS%UAN@(n7V zraV4DDxVG|7O~}xBu>AUF`#8=$}2;VCF<@`zFy_il*cE?5_}!X*QI=#^7sU4eAu$Y zP*|{k(Z$hF#z%~Z_TH<9`C5$-BrcRtqs z3hcW=`Pitdddur&-(`NL0tie>)j+$K$?lw7S@BN#pjcetyyox=5U5CI)`F6(Zsj&NjG(j zFFL=$Z9nEmJZTpjnVl079Uxzpe#d6NGm8ZV&JJ--c=MBpA$wAvZLj?JqS;HjJCDcW zzlZa|&)%E*EMBawn)x2Kn1mLpc_tly3j)1glf#SgvD8rrj8);$RjK3g?k|JTZ9nSQ zrpK;_o=yF%BJ&Dp@Q^IyxbNQZ5RPXN7tPWrhE6Y0JhlrT78b6&4`Ig(9+v8wP57zq z5q?Yn6EFV5S(wmb!yd#YWl91fOG)4 zF{B<6HM~X|tg5+-H+Q`3!S+i({vz+f zV*!DO290D>VRtp0tDrX8qp%>NS&+gSXD7)nWAzA@HOXwEQO|++r-z{ObJf*aye^_y z7-4xrZ!2C9(JV+|jkB3#fzV7cTVaiJtDk*Im)| zT=pBUs)%i;VXgwBpvQr(y3IqsqNufJUkd656e9NnZk7HzExv#Y3P)$wojH4U=HLHa zgyEuJtGdW5bD8n|s#NvdD@}sS&|%n$CcjZ&)g%}+Q1!QldBH2Pp5b``ToB_M$2Bxx zCu-TE^~STg06U3C&JXD0m=^r|X)>C|yWfoc;jz>yNOJ(jc89>-2NL(u#bg~4KVg}9*Si)B8z>k9)hs9kgN`T*o3NRXGcU|!G;iXpbUL5 z5^QONNVv2VlBMjanlMJ8$A$}s5|HTrk~5B|MvkndN}yxZHnDil5t5v|WT~W&@IJK` z;AL?iCtB>$qQw%6VjP7v&Iqa4XM+k@JJBQ~)Vi$66hT_3ZNb)wUn}=joWlj>aVtd7 zV9hZ*T$${^eMoCqxZp#@3nrR^Dy(rHE+9*=exgZ6=(T6*Sn45htkgrRQl~JlA>6-G?Jkj2B;mWkAbvIO@b255JeFbqWcRQ zbt&a>TPW*1L_V3PM8DYoQk*L}-ZuPw+Cfu22KS@fs+BL}&e<)g`_SH0mlRIB_Q$`L zt{bfA{za_E`7%n+T(x3^nLW;*BGu0NLBi9SiunB_ioI9zl>T1fLRWS^h2g-zq6MZ$ zl9+PkTtKG1F_|euq4I=nlL2pU|J68S)`rH?TXURnc&$Tb1b2w@LR8B#d`k=Jyd^X> z&X6Lt#k3=4k*ZZ)hH13*c!w8q>pxVOn8Rs)ugSN*>#hLGzx7S1rr+$tB2#B~}$<__^U&vnv3`L4r+bXIYlYso{`S&Ij8ogiOa zM+x9MB#=VrBtj(dslzoYgV_KlQL5m9Wp+C2)Poy}XCd6|b~wsF3!Kz%O+kmZIIIZt zB!rq`X6?*cAICYsvq1MSbyBWzlA$uhJ{Sb7BAr<7i<*c@nn7%M5)7 z*co_^iqQA0M%#))=$omU;it-G`JpAs%2KgoiO^xw)QTsURd|<&=yK5-?|OX^mPg@I zv4Csl`$&7m>RKTF=_i5f?z}%1{|xW@c)2tRy3Sh~5Wvae$XO0i#++sNMVZhWpH`(# z#JfKYHg||gzf;RX$>GkI@1U{`=8tVlkR=Yf6c6H{LB2Ss62L)802d?R!0jwTZN9?_ zlR9h{jZKI3aq6(d11liwa62rYyB3bjjg~NXEtY9mlnEZ(%tmS+01C=c6~I~&i>xDe z;iVTZT@4cIPGi*ld8(0-2y1ERRn5DQrcn=K7E)T3l%M^Gj!TV;XJnaAL? zW6o(L)lPg8JN+>-+#x3O>@*FOZzm>#f#d{IVyBaM5IY6=Vkaelok-woR*2LtZDgcf ze4J{Qcwhx&oeAS^XCEe|cAF}!)+f~~7w&{L&M_%3=x^IZm?Hh{SNtx>{`P(1DLDUi56!ImIWhiivYBuG zD+Ta0s%%#rQ2L*9Fx+--h-n|aX zPTuW|2KZQ-;(k&7q7vtkJTK>-7G|9!Ade4;N-oFq1fNHf*KlqFuB{GZ$-&^`XmWr! zl}*<{Y`wN!?3y;NOz~(gU1tT?jV9}Gr;i2d^(uL<0H2}6^{Q_{kbYcB9^iD^fJ3ip z#!O%a#I|Hd?V`+E$qJ3iQgsfe+?8>MN{Qdg`OnA@VSd?Ch-qJrE}OxqggYomc)|U~ ze}l6jWEHz7(Vc1>qENI!>@gvC5>r7F##}s3;gLHd9#18CT7jT}F~sYp4|AbEPAF|8 z&J8mj!Y#-p7&F9jJ~`thKaoUYRHCcJ#)G?kwcz6hv+!*nbJl|ht<*A+|61f@q}TjW zr;*uijsVBXVi^tF5;+!c=gd+V#OolL7(%Sw#b>vpo*@26TeXm7Q$3@p`!0eRdi>km zq7MuWYqb%A@sh=Mygad;Z$lTm0zJbmcvd==T#BY(K4Y+>Pn-$$iSr(x z(ql5|%cJeVxa||>?eg}E!*GITR9GY7ge#Nks?=osv$a|sw!w2Ol&`0C&(~$%4iTcb zOXTi7-LB%UxEBLW#+|>0MKtN=C@O9MNjP8y5GC)hN&w;!vLz&xnNe#ZN(tv=v}7}e znXlH4zf=ZYwuE601`A6!NsH)jiciSA#PsDt=h5FPbkr=$xNPx7Tu3+JMGCw^^Lry) z`hFjEJuAQHF!u!A2NxRoMPP8{7>WfFNR%VBnm#oy-OuSzF>e(N4 z6L?ya=@BW7cM>_BOPbD6cUEe0EMv zlo?w?vv-CfFWS|sf~NDH%cyRBL3PBiI>Mm3kD9(he%W3Z5<#owZ&o70nKxn%4dpK+ zqHNm92v~GDO#33L6V*7xP(+0_vbP4)F%X8adeo4#8B)DS1#VI!C#g&y6@0K__Ov}< z^j=*Lvb5arW`Mkr(l27Cv3NzcAwBA3@XPU%oJGdVeL%~2Y595MWf!yE9DzSxk`j*3 z;`7GKgCs+5(%DgVyqGK)GG*6pR5k}OaOMta>6pdvCXDC}#rI1seJrxX*y*WHy(75z z868o*J#Chw+uMxrU?vH`vf5XRjk>coq6LeJ@6iJgea%ZWHb3*_=VS{5#c{C3+8Ix) zYy`oTOq1&?>n_=ByRRmn`Bi|0XWG6$h(~F}Z^9h-G3< zQZ$CcRqq7}JFs9lLPZP`03 zks5QZ!7rPR3CW(&bP|-y*L9q21ZF%MwzAN-V9Wpfm47t8o@RENzQ_`j;^mx1Nz22`2haqpc~J(9+$&@vHXbQ^dZV8?9>HRAzpmZ4U~ULx2kSIzf|^ z%vP`lS85Q6S-|Y?S((yb_5BJC&orT-5QtGH@}7=7p-&P*Hu2B!yB5*9s4>=w@`Tbi zGm#W%dA_p6%*28YM!c>*eTh{X!_yc1OU2kOz~B)20}5@V?2F&SoOUoF)La z4g6$64X?~PmqR1n(~I}K9zlgBM*f58WkLGinEs{NjnpZNqRm;>>~#SK>rBZ>yzITd zU}yL>+cq)E+JLgjQA*7TWWfPsZCDmbs4TD?Hj$Y*BC=dHo1VQMCFa;tz^ZS|OPv_; zu%{(BT?2`fI4JZf3vz?{p^K%c0+(rau{u6uft1-BB=A1SeNbP3Se#iCBq}rMAW@ZR z2@)4&E)NnHXI>X1sxzk6Z6Y-8ZUCxU6_d#A)F!^{htEaTDwLvDrEGGPQp*UM1+^x$ zS-;MD`OIcD2Z=?QeL=#Sq-2$ul|fEbW>b)`CMns)nVKM{I^$a>qoP;6Sw$D?P;A?W z*T#x~biiAE3LV8vTbMu_5q*NiU*k zBw6<`0cajj8bQk0U7eJ|jW=gGA9KTk(Ldi&4QegNM{_@jm*5qxy%p<^$Nbx$2)|Jd zHj41eVTgkj9^t3;0{W5w^2$NcuPShns6#;3sV1eX4TY&S)hhs3NbJQV_So8jEP1_! zS(h_Q!^$+mRUup`T(zJLU$XE+)VJY}2$c*`wdR-r2~p38%<}>ye467Uwp9S4BV>N8 zs&VZ9g3=?A<5}LbWDv_r=o46wBybvnDG){CxslrlP5Qbn-p_C*fdOqY0%_Abv2e#pVo3d7kI8Y}Dp>G^_(II)eXrN6OJOHtmh>gg_m!^cm+8nwLA7 z$ICQ^@(}NDmwO9_iKPc2_SYafh+YP)z4IJSdfLTYv_E}W$AgYdkCm8=P-WF zb;%0X9T3nr2vFK}$DI3+Ptjd@@@Cj4i5X&E-n`mH6b=go#L}y@y-v3_UeH-lhfkE# z)^j&n%`0EA^GlFTbEiX#C6FtR#tpM2SJFoGMBpT!hf)lPSs4kgCBZ2qW?#;6k3vf% z#)p|V%F+$gDut5<5~(SItkbBec>ywgH}NqyEM&Tq93DAH$XBzSwt$hw#s>iOFFDD5 zgiMeLTj{8S^*piN!vwJmUhGnYo0F=zXP*;ku;EK*rMQC?@v9^%>T%+jCqCB140@zw zaEIG6K7b5SGhAA93<4gsAF=!^n6IwfBrdGEyz?t1-z&e|-24DazgK>ronZQxkj5XLu`aV!ze)`$#@p$ENa$PF3?$tz$G;cnG^vo_ zUWdP&M4m$Cv+|3HJ8#=gt}j?K?TBCmH%U9MiDG9VIM+1 zq9pwCVO;BP;otR^jsqL#97N4-15)^?9pNqw znnJ_Y0^2<-CFL6yK{6&-$Y;h(kr1VF*m0;x^~#urvtPZc3d!G*a<%7 zh6Ph-SS2jiu=83L#a_s;Y;9oJ1X5$pQv8}>$qvJ^Fc`KP84DVg8WbN6I;C&e%ljVzx+q5ila8x1nj0Ht#UXS&E#?9=%3F!EV4bdyH^*17oMNL84Nr!k~s zE|v{6K6CF%Hl;Md_uHp_}hHFzUp6n4)xpwz6tC+sO&t2b#s!)Em@b& zRgS~U#AUL%9&LofnmAzfTABqieLtW_?XJUimG@ao+)XIRqJzmCazL|KxZFLEv@Y~K21+#NSi|}|3*M2oLWZqX~$dz-mJe}5uIOy9p?^<7uaA>5*RVq7_bYVWs zd<;58j5l_Qt@bx1Gutt~H6cGQz~d%fUVzsHsxfCjel5Tw8?4$Ypsxd<^jJiBcyJ-| z@L}c^KL-6hM|op0`2HkrA2uZ158+UADvJecq9UGHhtIkee%e*OTABa;9locU=HDaG zdyVOWlh)#MuKdj|@9(3O!|#T_$ESa}*86@YCiTuaeu8BlxAb{W6A$5Ami7lL{O?1T zCGR=vV^u|JDf<2S#P;kw{=VY#CRF^9_UARE7s2xN>3yGuCTSCsw8ayvH)8P_0wz6EB|ZeJ-BQ2srxv>~;PJL@VSQ~i-rxVm2WR>BK-0OZ$sYpX6V+}zhQv+d zxL`VwS~0RVdqgB3OZC29>Hb#f`rY&4EA|ACd0k$cCNNoc^yk6N_mF*xf?hx@{V*+f001>t}AWS72m8}C9yxK*2 zw~q<1bpb@!l0dv#YkQxvrGasWhzA=JU~2@3uqA+av$9>GY_-6+L&SrP39!`xMA)V< zTD(cw63RBs!D)ziurUF)Ie-Y;AP}!pwwSUV0>&L89&Aj2Z3G~~)&+#I&HjLnC#M_k z5b@zjnRQSL_FAJ!IT@0<+E|^{|06ILuDHmHsZm?1ZtZA2-Sw84zN%WgF@zA zfI6hq+;_&@5x%)x_4q$9Y``>%Jk0A=U$yiBq(_|r{PI2?Ig8xKI|%ee*i-#eK!7g; zEE;tlV#*uXbFx<-+%iX3pAYXujyXLf$3M(h_JpMhp78OAc?TaAx%JMY5-ztZhoD-S50Wq>2^9%GW(ZjOK> zId9}UQX7u_fQ#N^9K%T*g)DOl9jgMZ=)3#j_0s;!0iQ&;%(m-rOb12 zVM<{xy_EpoiZVQ=)LnV`yFnM z%Td&V-gOWKWz(2ook8Gqj&)?iMy6Ta!qE>KvoZu;n+5c>33#AOxFR3JH;)|_8MC7> zDwTYpM(xBFp|*uVoD2$5!R+^o<7a+`@yEX_${U5!<>H_IeM|!G5EFW%(C=JX*^zOF z)}twT9WqIjcVALiXDYH!@<2AT1|5~zc5ET9DofgXRavAAesFz>Rr9hSA7-|}WAQ@9 zs?>b@mEG^Z7$%d~lBG-@f9de2b;xlT2bV%w>!cNYL#Dhf0;?f7L#vfG zI|@)nu38Xsq?EuTI)Xz~Xp{4ca3bC0T;gS50}m%>lJNm>NFm(BWC_70r{rJ3d@?eh zn+~B(P7>TJ#c-4JVq}_MV@yF})$028i(qX0-59u;HeEg+P-g3k3?YB~Dt4Z*Y2*7B zqct8*%^TnUGu=oC6hFn4NX{-_m!*3SDKGwx4k@-Ut9t&prVpdEQD+3di%IrlLvu~V z^mi>iE@a0@hLMGZ6d8Gr1I_corvWjkeOJLGv2KpQA8=RzjKNa#2AqBvVoWYKM@N^n zWcNpx^+@66a{NZAnj%!2g^CNfDAmpgRYs`x6;N?O7}VIq6ary_?y*J;hD+gj((S0H zNB&;b`5^L{{-UK1TKe}at*i4y)o)pvdkk()b{b@u?DdDq0p!>)$u+pHMjQ&I3lh;0 zbl6BtqHnW+2ihdR=rBpmre&C%0?~y#?k!NJIjM~VEH0<-9G5v5bPu!J$M`Or4FJjH zv%CxNsxi4nCHBfyy>k*(>D{&2+DOi;gB;k1gBs{~pcGh)Cus;AVvtTEh(&lvFqEkD zFc-hsh5jiWOM6ZghRI^XG!wD3CFFe!|U|5h;30`b#;mvFBlk>$UnwigIX)tqj zes`Z>qt3g#Ux7b1!x;4-xap5^OFxA4s56LP>F)CrO7^gkOF!5? zW_KS2M0X!kFixzSBk;RB3xKP#)M$5SBqj|k&u@whqcKEc5pV2a#pmUX)X!OLx>8@8 z!Oir~EWHisQKuEZqOVCq?=-S;OScJGhGfte3n`+neLzE4KR+)p>tZ%u#UZm7!m=bN zj>Sh6=k%~Q`<|a9lRrA9kzyl0W70KR`jeL4Xz5*+ZnE^RS^8F_p+YUREPqbB!y=Fj zFJgfUH0XIpVb356lRJCC1X-uzPszHwJn?hG^Yaqna*->8I>w2Ypqxq$7)$Z61djd+ zz(sDZmgRdEA|EVN4P4YhbZwF30yPoOZGQ>8#YW2b{uYF8;n6aNHx_5|2a8EagL>zn zlrjf+xZ_}9)5n35_18D?un1l`!GgUulL2iWA<)fBQ5iyK zIopi#B1^Yg`d|M>W!`D&f3$QP(m032uUFE9<#ZV3VN36`^g&B^S^9oU??)P%r=p5Q z6FZFTfU(_T=>bcxv-E?Oey^nuBJJk*3tPb)9ey;?51d64J^F~fO^0GzG(k~d)3kuT zCIJt$N`BF3f|k~3ViH7UI$M$Pdl^(28NX{;9J)^Vy%!TWc$P2*$W>Kh21CmeB9s>x zOyfnqV0fHE3cY$BKmvn*!-E6{XFSaF@_^U@rC4B~MU)s#3IYQPgupj%JuC^kIc9Rf;v{nzopUO&Quy zo8O0g4o%ODX}Z_a|77X=E&cbF?nm0q@mG6UtKZ9dfU{oKp^xlk6v}!TMS%`i3g}A< zc%Vu0i}o^VR(shvh+e>6R?XthvzN_3d-m*$w3mGuBPM!TOoZ}!*(CAf-cf8P4G6I2atl!4g!eI{uB?Qvxhv)SL9*L85Afw(;~{! znbQO*@F`xs-wXpvn&U6U!)7JZ?n->M+0pRH2KF^JlE1fRpU+J_lKiJ4X zsf{eGd-~$|Zw={&h9Gj6J&(=O^w!FI@X3d>Q<##$X#UjlP4TBzEs7Z^hUKGRLE@YO zDfZH#quNUwE&WH9-e~EZrJF4MI!oV*G)f~I$~K`%gj5H>%!?|yr<=s13H85laUPjz z(x81xYC;Jz5NfGaQV${u8ME{?mOk~@D)dTA-)HG-Stu^$68J)q$P+4qv3|^{0|wG@ ze!EeHTCR-D0I3Nj$Uvx%SS1M%QK+q!UTWzZEnREr=blg@FK3~6or%B~ibS4J-S?QF4qrN=P)}I;w57jd>3K`vX6Z9XLnyML>^7~5 zL`ZcYHS^1hsHrJns#U0Z6>3@;nGpyj$UvxfStS!7qEN51^l_wZhknwszI{ZMbb{sK zVk3bs4~aZ^_&zIMCIN=`3DUW$FJbyX=D0F411VFIAOm?Guu29&M0v87e%R9OmOf7VxAbvK z_gng)r4O)Byi-Ns3q>MNsNNWb>H@}u%HjM8nLWzLj6f(s210$rDro}|h5DeSGnRg* zr8_MBQcLe+q4*vffiDz^Oep558*f%hst`T)ZAe4nIs}-FOilQl%sn= zW6t<#FLLrKJq8R!uu6|3HRhZspqh$MO$*gr0oCaU)fu6xgp_avj{MflYHf(sn2=Ts zQ?O!@)02;B>)!@4YU5E$*IW8amcGW)zi;W4NV_@yYUGs0M4^X5%Yn1Vsa78uIZ-H! zoG1z=qe%gMY->F6z&t_pFC6rB_Cc(;pqS|Fsi z>PxAhV40|+|4~;0LuR)|#M)6_b& z5R^gq9pD)hqzikvFC!a+rR~o#m2_~xZwnM63FTKIi>yeMo{NZ;o z^cuN00%ef8h`P4{P1o}B^LE}_neFBXe7&0DJWhG_V29c8lVCyf^)NP%^lps}-oly|8Fy$mUt)N@sB%AHVZb^>>p+1!&N$T?&! z*DB%ZZ<=2u#i5N{5-8C}qpo7&cduOj$=8lKli**@CTgJ|MIp`dc z8mmsZ2b5anWH!_-xST`QGSxliw1W7xTJkslO5|!2_CPLDKrTV&hC7f7f99w8qrpnngh>w9QOc|k{WSrm zytrvOP}S(I^(@Z|mq>@+T1QaOTczgn@)4aX=KeP&P7RbV?l?HY;*L7gz(806UszH> z*hzwjuuh#0>5a%iF&VgkOgCc=F&eLXn{69`3Fg^bk-~N@akBAWi-PR76>t_<59lKU z>t21ty=EyI(rhLs(bp#6fiB4}x+N(x%5*UYqH=W;9zyELmveYIxLkI81`bS|7q0&c zofo|HyDhy0`J+w(zs2SSQWu#QmI2La_)UNnqt2U|#HB<6H%H*xj0HeTwFD8HaXOF& zmFHjuac}AAzl^4<=P*R+9_DXsAO0+}414+#6>;(sRl${2 zH|JlQ<0~ny7Q$O_8RR9D^@5Ij ze0_2P?;d@VACLVsZv6WB9=&8><46kNZk_is=~s-HI1)=9OW_|)2>$r2b4Z%a-`KuS zxI=u%yCyhD6!v!jFmJAs&uq5iPmU=j_}0}yrBjeh-kYvKhX$F4==woLPr5=su_3im zPkfl!2M6O@aNWal$2h+KT8!gkP6zVpAT8#)n}-0faYY%1h{rs{1V-x~0L(+)y9>5+ z)(EUUZp7oL(}Z7s(}Kssw+5M;C371yQ5Lz1^w^z1Qw%RZFOq9xwwojH{afnC00&&u zznz2*xAn+DH(?|o!!6b+Nuba^xoC~Q8p7hx%?V2Ng~+-DH-lKTjFMDJNv>$5R4_Qi zbAJVg#5p9&xKh>si@y~0R|A8S4=KBk2~L&(h3cP#B&O^WcpP=6@aw7nWRN*6nWvbE zvdC3L{ilHz^;>?P`sbOAZ(xww8(v6>;f2NLslS?J+PmOThcs2qX5y&H_4b_~$3#0Z%9=bEMD0U^eKg3*Wa!=@eR zS&wNjQ>FzsO}d>BlV1n7PqvrEs1jCWE;A*>o$E0427)wE5NH^vvdSBizYZjl=c@i< zkXm#aQ3n5%xjUSery)V$^#VziRV=0iytW~K#k2k5k5|q7EoumaTuvdya^(tH3l1|# zT!pL?VJIZ?5c~@QYd}erC1fDbJly&*PGMzg?V0%7I#0{EYM*}3_RYy@D&?7$ry)V) z>=W{3$wQ^h)e+I$Z;Mo(pN&&cQAD|#I|L5#hg{V^VAAF=$*&5p81Q2*{Uhkd5s|R7z0hJwueNjm@gIcAeA6Wec8JBJHGzdI*B4Kv~!NL z`fT5XNWso22)vs~1g>TX{yfcg5KQN1wtjG!f;N9y6f__eQy}I+L4wH12Ykyk8zx{* zr3HUKd;mzi(TwSHKD%iOe|lwlEH(HhdReaO8#+Inih;bui{O9Q5KSRFr7w z&x@c`AshxcShdP;<(IcxKyb;kkg)nUzT$HKY*2~|{c(XS1AHOKg><7C|U~V51XyyPw zw3+a3;LQ4=$DP2A%HLWmc(;^2g2fg7VWIs%v%y||v@^9D1Gqx_ zQ`~Yjkbju6U}r(O<`bX&6H!(Y7<3k?ua5~dA`S2;E$9tbflt&5q308INU<9Lh)=u) z58@O2V+n$}N*-_!3TQr|MU?9kbNU4b`?DA&xS}gzb>QfWm^0tUb`35RViK^yV)g%& z_Rj(14iS&Rf(f*L9w5?w^O6zZ?eQocM;%UbGF%V)$`jP#j8m-x z=8wK05^)*}Bw{}L0+DbQ&RHfA!}K|!!xeevX8US|mI4U^M~uQH6JEKRlRwL4?fj?; zG>y?B5NHZ12t*_V;^g3~h_jKgE?3q`A*MvkgNg)ko^#3oSYbU3=vCkSBT>;oU;>Gl z4~d9`M1ue!6?yB`UglY^9Wr{Jgoi zmf3iTkMekPF-yW+Tn${o{NYgKatFfm3FO96DG!)nk9`k_;&`bdP#p82IJs$o4SA$| z-%3>d4bF~uelh?wHTYMSeh}$V=OBLNebomI&F{;Q?0!r0n-rt+eFz3METo7c4+AZV zwER3pjxZaC&Sdr!NlGY^#YYwC9K=Ndgqg^wV4M9F%G=29hd0+CrQdpqQY9l)X`yPw zZmV{=9f)45bEM$$WSvkx*MTK*%fK^}DLA2@p|RZ?rVOV>9YZ;#a)##fIjG zY)JO}?|#4Aq$EnaE)d0sikYOU~LmB{)z?@r!xltH_G&Tf1D-(#M_d{Pk4+l!dvxMTI-EuMc5rcRCLO~`r?Qg+S) z7iYZBIaK0c`C?u$hXQx0_Kro$`hvytcHs8N?@6coZxGMh+;o)+G>t$mP|=ixbtU6@ z({6>bP71L^V)Ass@qD#v{t-k6=%oiE5)G(CL}Kh11n|eD;QXnVxi4TmA6J3ip#rs{ z^gu=Di05Cdtd+_t;k&Fb8Yv=Hg#;H6&s(s181p<-v^*lwe@Q%_(00CC1)9ca6R2oP zBCC?|ylHodvQ7%|3lPs+|NRDLYI;#bq5+kNNO}=K$cz4y0D=jbWi6I?CIcMg6-+_V^8N`bkgRY&cubzkMZ1x(F$C# z#XxR-W%zG4iR$!VKRCb*m zD1;9Ea$W%;$OIv(3x%-Oq}@(_RXACRpY#%G8E$EV%hWXeSrKp0t6UVsdWYa=~G3!$OG(f*zZJ#2<>+!-U44sO)S?j@PLSr zn&d?mTp5AuPle92yl?aU%2?_c=y93ynEnB;z3*|`k3}y6%H^FAH?}G@)xKo33i>=7 zn`vp2zuuHO#%=S|vDwEM)^W!vn>y@0U`v&%geFqG{;Dh0zkMtZASgbXQVH% zM;ALw468?K@&9xPJ6BNU2sa=O1BLGg;#Zb-+K?LioAqA9YUIMqsB?^D)=7&j?erKj z$j@8aO@bRsI|6ThkbVojjRO}RT+!2Ozbp1;HxFO##K+Ho!Da712e=p^775C8Zj7lc zQ`TrQ43_E=(X*@~=L%onDRU5NekE)JhyC7tVv#mr+@V&HsE-Ngq5~jg5nBG~Ze1@Y zk;U|=rPm@oD#vV#&6n2$V~>rJxe>p--$~XY7Pu8?3gqSISzt4>-5h~$0hR;{u=qR+ zB&aQKyb1qFcvxpSi_ouOLk#{waR!Pq;=?9&%q>s5SUF2QVioGDOuhoElwLXG3nduc zm#U@Kxnik#VDLd|3A6f`Kx1O4J!C1<`#3V~kw=So%MZWa{aYR@S|;P$QHKYKv=6z8 z*ykkBVjs)Tv(GfS@wN$>z0D6&!agiMY9C%wpvV`huy}5A2i>?ICEH7DtM3)%Fp9<@ z34Sr|N=S`w2qIOe90s)3e*T@>QTgM^avb~9F7@$!K-0(n(b8Q)wjaN|z0m_Gw>R#^ zgG?*;$-}7g8NyNLvjDig(aV%8H)wsuNZpAX3ydnpsg5{qBMAJtQvOaZ>?6oR$5q-A zQ&x0Xfa6L%;<(h#h1+2T_73oo5R`#$%5pgQZjabuIWWaOwjQ}ffjI(X?0sN-R2geU zoK1u1Tky=b#IgLg+w@+KU(b6X@-DK&*mgX4%G)G0j`~_d_{UamG7~5}Ky2H}>{1cYuAK^o{#IJ;Z z+YIgPkZ-g!cgPX`k&L|&uvl*eniub$2E>^CT?LcGqLTsyofHX1eFV|FGxJZYlm7k3 zRo;G(Q2xg)eZbORw)B9dzi8-7eU3OeTSu9#)apmz9#3k|E<>&?2u|OGi zNp2_NJ$PLkFo+hVZ23$+1n)p9WIF6q0Kr~_!TqDkwpkb?uty;)HC0U#{9R+DFs-Hm zWH$X}Jjf!AA2Soo4f251mOz$kMULRrVB8_%(HWS4Mr#2=8nu~;pU}3)lX%37zW9~E z<-Hy1d8dG&=Ur*(IUzfZUv>fc1b5*j#52gIPQCoR2`dI!&=&~&z95p|?~sBsuP@Be z|NQuS1O!1CGtLyQvk?^fxzd(p6@)QTkBn5*)rI=`Li1xU#57BFeM&6V4-77dQhZzx zCBQK@K%u2tfi+9*jTt$Yc{XmO-EI-daJQ8If0 z1t~FBvG_duOv65-&UR#AIeI%m{E=ZMr_mX4L_SOc9YEN$3sr19H;Uek`=9t_wlEdo_Avp$#{mkh*bA&# z@qRpxI{oE9FWWhnTfKY6wx%>Uy>_2trVGXTV=vcqKucSraytW51LK`gFgc%W%n@w z?KA=uYMP%2H%(uT$5HtbxToo5LFRJFd>ei%Fzwa@%4+s%JjiT&jXaEcDS0KZ z=qd!hlBMcIjwMHx%moaky->Y$zSr$M><(Ry9Yr0WaD`NgQ=k`0i%rtH6Aewq@+NN= zlQ&*7LLoNdCF?O`>fb|O0xZrJFi~HjHnuIz@R9H zrEr%rKm9QBN1a3XEq1Yt)I~i07|`PJmY-*g31q_<1impy36CEkhy`QUr#lV=t)8*;q>!D!FRd=$;4Tc>Pa<2aZuxmupJp~T zWdVGvlM+^E@p)Ds5vzM$?;x4{+mVAzVJnrO(CSKCuGOU;u{w42!dqScR9-B;|2yk2 z?!2GlkvD7bL-J!z8-6Vuy{BCa*#QjxI44_&Kh8;j4`%`t8Zr&68FD=y@jW>FiXk8W zbu}bE7f(Ze)zVEu#?QvnkmN7Yefd54i@5r-{5(UpA{&Mz@C`{y7?Q>38S)SeIqFAw60F3ULw7G7W1RAZdkr!%#cy4!^abW^w*b=ERBkHUL2A_MAviq1o!|DJE)j9pF zuTFlPeN?{4?nNu7gUor!JcD1xh2$!t#7a~ly}|PHlvs^yjDZBc5~Y6p)pynunI)aU zr>PmQH;l7Jzc)-Ug-%IO*c+6#+}Bdyrf?zx;M+m!#)$}UQ9CeNp|}^Wn58%v){m>dP8IXB-w?&5Q7S@eDZ7se zD5eo0?}(xvD7%k1sf;Uyg+~<3!-kR|5aCLyEW6{oIv{?d%JW$*wi+0`f-i;iF#&lJ z01AK1Zfu|o_(mdr;nhq)F^2#mFJ2;O8IV4;smJZ8!=Dyd z4jD;Rri{kl-LVvt2|vGpJ0#$Ki%RlZm81(8e2q#OeRfb#qxVmi`I)eZf62-vo4iOJqF#(CH0Ulip!6B9ifwyZxVB5t% z!09d+=Y)mwFb^6M1invEzC0xYy6&hRDbKoI zFR=D_KOV86fnOOc|ME5+EDr#|!SatSJs@Nc;+Js%`HS?(hk!=g{rtQhImm2mZIIdP zks=AUHh_!vNax_w)S5SiwUNo6!aA73wN8S|Msx1%vsCG4`r8dEgF2{`7ia@J_jWB)5+Vv|}D1Z$Oy@ zYKb~;lQK>T3%d*R&|L(9ZyQOfJfk=VLHt%N_QhK4ATSterI0=*AkQIysHVGs32Pc3 zl_#m^q|AmMdkG5k$kHxck4ZQ<4uw$0+f?q~yhHTZ1Prd=N!fi&K<>=|d3sC&#V(T0 zRo$hGX<^~~&OGQ*5coE|q{`G|0>mcIzhWT(yVe3@-$2F(g;^GYVt`^(7B1d-w`*gh z%=T3ixD-kdI4Y77>?_S>3N?X`)S6HqRiP$i?Nvr2sH(eH#Uy|WlFkP8OMc% z@-Pod5=2fur(CWronEk-Jb$Z0em^icT#+LCn1DP30FNSw^XCeizn~=h?j*hmNz!az zk1$dyLEsvL6ydOlvZZPSu}SqFm8uCCxRMmo#{^vo;8E%%n8A`jy+~cj7}LTct|U)G zf`BVYs!XdTKy31Su~l6O7`T!Y(pO6WR|0qx`}Dp%AuUzgJRc(|d`TF^m*imZt0jPw0Yt_tEM$PPD_l2g3#)~N^APheGzbFjC8@FmHLKvb zq#pm(!I<-NlyV%uSE`i%u2N0_gTV*Ca5^R+Ykh>osZ{Y0! zik%v>Q=`h$B`nk~^B|8PaG6+AWoZ|;EI@4X#I)E(U@+53A$|W3Yi9$W^}PT8YblDd zMF>q7LTFiTLv(esT9l^3B5Z2aoZYpyRB|jew&psDMhJ7C`?-k_EjN`TPC0Hmj+-G) z{e(H3%n|*cug~Xwt!>w?+41;)AGPQAee-#L-k+QA=li|B*UeV~`J{u!{mA&EX?m6q z$u)A8mzlGCvJiEaSG2ZvSoGD>k?!SJ9Y4xy*MWJyAM4TZ!azUP$}L!dTd>p=Im-_% zFTIb;V7CDB!9X0e8qu9&eR=&jtRG(4=uY=*u?eM$K~oZxbklFG4CPih5qS_E1#B|z z?StvZVJntPPcrV8V)>i{Qsifenb!5L7mBMZQahH1mpMGT83sIx1Xn%Zkk8-2ioftN{3whB*w*=AfvoJ1pr3CWs4I*n0qg%CW zbUR|v+Ro^{?aL>)l3FumV|1mUn-znm^p`SfbQO{J|GsT_9lO8>t3|{6fBdBrC6LS( z(BkNJD-UmQo}tdPV;#F1UU5OG4Aic&3~xPXk>GlI>R?b|+u$MZ&`hM()hFfqhcBKUJP5_a` z#8#0yo?FzxH+aaUZUE}h_*FzU`q3%4A?8B0u^($FYWd{)eAc1igyTY1N+6#NATs@3 zKDMaDKR2_xlesx2&+^I@uAC;nQ*d9yMJQE-w)S0V3C@<(Cg0XFG@Nx@kV*+8wGcEr za}}VnPU>}u>!g{ki1Lw*PI3yK8RVokc2Wpu%O}<6lZu8r0WL_T1oBA(O(y@YPCCds zDOsN7mHk~gCFK;{Idc(86`{?Y6u{Y%dfK zv6meyY{ zb_G|sB3e3RV>F$D$MZO;O^Nd4MVx#4u+=_n85(An3sNaTvkNp{I_!GxxtTp|EDPjU zUOCg1audw$Eq4kgn3LL=QV3`3q7N^0Elowk1amEbakyq)3CbAtaFeM zwYn-=TPJ_?rCO)TILExeuHwMlOnGV4w+ZquJ~l`@}sq@?z#RjDe-$kKP(G*heYwQDoQ^#VIWc{nj6&_1pV?{)NymcU;*@3G`bk zXm%D*|MNDY$v{v07^P0h4OWzm z$BQU#yw>fCveZY};G@W}D~eNE6vk@_M(ejDZMvf2YRr|btP;2y1IK~uja@Q)Z zx?GVq^$)WPXRG&d-|Yox_yCd%QYnFYXM$!+c{(btf3%brpXr$@3O>r17`acRb+3^g_3z~ej+`*ge!0V^zKiOBC`sw2zN<19x3wl?yawS zn}2K1-5}^q*)*4|i^#jZ2>zq0T{gM%YB&{*y$Q(AIy+ydb7v54f1n|(I;F;+h`X!6 za_L#EB+#2d&~%mE!c#OFud=+s5Wva3uh1^C)86f@DeVaL0R+&n4l4lbaJ>+<4y(RD zz79`tFRE4$Imx$dZ{M;q^)esc#lTsczcf$+4O|Bz%Q3I57Vmm(wG4|L0N>^3$Vkn?rTJU!!F(@fsS*u3YU&^|ixf#bUSBeV8 z!+r$bUIlLPv%#B++{HI>{P`}o0_U&XWFt2z$W0~b?IlvSmRl%6$@%N)7N_p7sBO~eG8+(g_bveV7&@I&R0i6}HoLmrmYLRv%LY_*vlg%qeZi0`qE3>HPI3yK596dZc2Y;2 zt&=YBVH41BRp5eDN+6%^ph-TvIw`?Ash&p<(MbVU&RrTv!KHzVP^t)R?xb}TwN9!S z<7W~YW|9k8xj|qifo7K~D^Ts_JLx4~u*MZ}Gs*2OcM4{bliJuxWjI?W9q+>~M8iyS zK`JF^CV?jTG;~sEe|=ws`_eOU;o@0?c(e~xg68YQ2G5!MN9LSjGUo*MuAqw2ole2c zU?;UP{ZyQ-I|uj+f;2SDITxf-g614(as|VjL$$Y0_iA4-ovehfw7p!qb+?;cJ%bkKb=cG1u(yq(nWv)=<^0?YbZh@LN zv%7mOvjmmRsh>x?-mLOYGH|-`0ZN^cTSq9r9%5Zd2zOyzhO(m{=NEm5g+7D~yFxgn zgChM%$$_$e#kUcI}ciH9E}+gp-f_)$B8~<`*|DUO&|8!|4C*!FWVnKP0#c?fM~r(9LyymvJt$a7Q!^*AFst{UDt+ zWdjdRx6d^7_f6S^hPP$i1Jx@f&;hle>Gi`hG|jFbYEZfBhgTvyuelwbTmZR#5E`x@ z6o8&tAw*rss=l@!YSA|o4(GKUiz6}Y-GOUHxrtnYhHFC?yHWxzD+5i=*Su0f)zwem zJYTTD718L*#^^c)AH8!@n~p$MKb-9a*wH?02n{dPU64u%k**)NpyAU({N)glK;CtrSwC(-Wh>cHLtVj5 zu83Av+2}{7;KwSQ)W&|S!a2zg&t5*CWoWp`fYTrn@4_ zM>cxNDfoV&liJuzL7Xk0FVAved!u1pazQF3kWVsbeo~C|Qsm85HQa67VStMb}AaCmkUxULDLH~T|D}uv5%cRUm6`LYbT(1zK5v*fwf=Cf zN5dx$_{$8JK+gpz&~%{IVQ9R{b7QC$l{=q)9@*LKcK8Jc$oW)g=wbz+i#G|)x|ko& za(T9Gu0@|uA8_Y^B}C>1hF)wO>swZZhUv^-S|)*(Ed$NY17)Z>`hwkk!G*4f4hh*f zB%Fd9noeq4nx*MD+x6mKhmjU{QqZtkx*(Mj$Y&~Ok`Du}5#An(i!0(KR4R76+^zOe z($MImJ+jyxtlM{4{B@>mq%BuwuIgy(%q{JXvvuR<6qj}o4a=zuQYnG7dxK^xOGi|8 zqUh@LNpMBfjk1xCQ}D1S9(!Zw6PakT)0Q^j^)-5xNwU;q-$JgJEW@-4)BNc zyY8|iyaG+bAuTh9v~+ezm#}N+f-bH=X_*Qvm!2MyKo2bhO%LgGG|dj_0#xphE{yCH zxgEYc1v#XJhC^BbIHacvQHQkZYh!msEtm1(cbG}M`XR+#p2tqoV!se*DobjSGokuOh!6?D}yD8kRK|yHWyqSAk~z zSc1xqj-$_T1TwZD6`{>ZCE#pHtsmst+8qsxmJ3oTfuw?<*%fjCm37jd16;w5 zu88uHjZSh3J~8T~Hcqw;pEl$(z~{3G4a*UKnQRisrxrB7Lbgt7_%L~mT+1uhxq`~d zDY)0;LX;{*n|o;?&els0g#1)O!&GuXDwhaMCD7~&xdauHQK#p(PjUszToE^w+}?7h zU@AGOO}*6OLc7ylA*T_=){grJy86=5Fvnc zb!4M2tNhFB6-2fH-^b@&gN8TS_{%huK;G*>v$bOxs!qPa>rQk7Q0cDY$v!LX;{* zTRX3`KhBobHos7Y&~Wp_1*w!kR;i%b;?WzGT{V4tifc}?E24a4qnDh5Pd_-RjlER= zaYH^6d_Dn+^Ep2BjG6@U=?G#i9+8*VTU3Gv&AWoi$|-okAO+uD{9m$KK^g0%HGZY6 zLBm{f!7C+bE`er?$1+s5cr5DY=aMVp=91f6UM(<}oYbaXYH{)KFRy13#TJjLr~65U zhDqk4SC$A&GSF-|r=r@!Px`LDg$1sN77y7NPN(4BoRiv=DEH=Yw#DNWpHB!4)5`^^ zl%VMa8ZRDx%Ja@%DyB0il~cZql=t^xz+Z3?C_3!1(+9GwS?j`?fkWld){Zc0u3vV ztEf@}S=NB29jDUnML@&%tmV_j<)Fohbtqr*-MWeEgy_rvWiGT`{x3nWSMqz;fvs2njTCCTQG5es~8>pVakM{}GEQ|mZ zu4Sbq`piZ7YU`H(`n`PVk-l_CS5EUxHs+ZWya}QRG$dKds5e2DIoD#o;E+%ruKTAv z1Mx?f*0RU5(fI57BO$)GQ^j`;tm0!T{s&rk7e^^E3voNfr}9>R*N_z|zFc~SNP=b| z*p+@2QfFW0HD6|#^H%z@k-ik9uX1|%AZ07*_bLxBbe^GZt zFT`Ru%TMsREK%|0(v!ag@~;BB@-IO;z~`Uj%al293P7 z8A>Dn40bD=q9K2&l)qjJHJv}nSU7F#+W+~J-Td#b;>)Ece+lFt0=x1LB3b{B^QZjY z&RhA*M*dQezsiw+nv^l}ckf|_Ch0>^IWDypm*}g0;hs=`Tc25e2xu$uNiOSfcQg$v zvCOQ*(z%c^?&Kc(JVAMU49#!;qkZ$Ai9IKi%*yYWEXP zW^eY>4Vy4?8(nZSAjn9_laWyPCWir^DPkR5Q~E3hexUU^fuC@a=(;YI&lurgzwnIq zkDoaTJ2Jm~Z*vh)=3+%YO|TG&v)mHke$MAMcHB=gFO6vKbUSNHtDwK$v=A{aikkdt zCZ9c^7-v!b9?WPn+fVW@d@|5*}`%wdS8AHxE zR7PT{R0|_G61CEZ*qe=Dno3uMg@zGy_46eqbj?PvKm*j!u?Z^F@Z%fZCGnwsA^OKR zyl;#iZ2AkLOaxbt`|%C+&>x=&=Wvb5akXjZPA0v^;`QSJpPfd-am8O9R|3ZsXfzgR zR-obHNGD)7Lv{2#kZ4B}Hpw@eybhUPWaqDbHEIKNzZ&%pJ8qi2%Z`4J<9#XkF?PVO zMs1SB@dFxqU$yG^5u&cBl;j`pj)!RppAjSmAJR~FeBc+=g=jbvxY(5vX#5h;s5|(m z0t${R6?@4SEAa(1;W>7lu-xhRtd^77G~6w&iX(RFAW9`l&{sLuSDA)}YX%p+QUaN# zgGQO!krPB~yS><5Q`(!qZbAGP$EDs^?1Mr>_<_mE&h140YC%-_77nKYsMQA%d$YqS zBy&YrXc$nJ30Icrnht2`R1PO)kZBnNaFKkj$?Z)ZWO7H7lT7Z6Oe!kY!Xf9>ZF{eh zLr%H)wO9T5N9S1V-@CC#rj_paKqFhvUj~++vee$`P8%Pd&vF}CP$q_DNnQO}ht#-r zE}ifuDfo^tA2_b{yF4i|yv6N?x^r09vCEfq_NhM)Y>-{rD$&`U+v ztpLm&e*y}>RD#(2h=1llKV7cJrop+-soJ*-(+L%O)D=&N2ft!Ku$5iVHx%Kj2V_vG=|8q>!+@EBMQPIIS$1Hd1O|)X} zYkIJuo^$x~TRV6D#{aE+hx`9{1NZ>mD_G0nc-;mbh{C;t_@481)CA5;E&nog-nQh_ z@Ku|buf0+EDZGMpQ`^<4_DY z54vvV(8Nyr3PNS|&aGEmS;|k1f~|ESl>^I#LwO3R*)?9umbED#Nn4Tfk$=)){Jd*< zLB2L+v(pxT)a>z(8wkCjLcLjQ4Rw*$aIt>X=0NP=~65BmeQz|6(^Q8G$gvI^z=&C5i7rb{p(J<0>AW|oB1gp z>G(?dXzQPlx2OCRSJWr+c+Spi-NPDnyX5QryfUt6Pp?GBA@#NSwktMYy|j<`?iTUY zg}M$vCSk$FuiEiJ?-VEadFFe*(UH=4C>rgrP5DvPR;2uRx|>+j`JB3+Ruf14xVC+n z4lazYJwJZEX>CfKcdv_fufyGp&bSnDJS>?vg!PvyR90}CWio*Eu-rC z)u;>0O8-u079~~3S+A9qz9U6~^=$m&8n0R4^xl1eE2N|8yR|8NJAq+en^LPJqmP*9 zxP@KO@}aUllonTfaK(8XM=#A(kT5S-ZC-DkMmbuyVNEE_v0~;(o8a!5z^U`xBj5v( z^4*)4*VEUwr+gO|Upmqqb}1XSht7?QpMR!FoP$HWK2O=egFQn*UC4DKgwD)o?Gp&Z z_jTeG`=N*!x*X~Zt7q`LJ1W+=ylJ}Zg9|^Sp2}~kU$WXOyXtFr-hY7KnGouw`Vy?Z z54*bhB>MWy(B(;IXjI>>@{#)P!6mA`6J=c!I@k4^UA%TAy6tvmmzxdJq?V`lma|y` zyPVp4CuwjB?s5vHTHTRmrHA^{nn+(JblBIYq=yF3bh;^}zM5B^Z}1eS}c zA1L(>uZ*v(iN9@i$93Mgz_~EBN_XPgP!;}N9^h=DN2%^(+77omMJV}-PTQS#Tv6vn zc{cRA(sR!^jYQ*AqeoTKaT7ubK8YDUTQsVq9%A}+7waJ>P%yy-gzg!qljHxqPE)sJ za(v!8rMPb-nydRYMVK5>{cp9`G_KtVu6FHFYfYrq8fB__l#)okBocq^9*w8Fob+Va zKbFc0N;Y(a6I?0^s9L4@osM`$5&mFDR5z~O39feSMRkPg(HMDlEq%0cStq!%+Vfqp zYx?qCTX(RgyT=2E?1)R~aK_&5KntBnA4Yr#;Uh_!T(58HAp9OI57VHArgtYQFlT zB5}oCePJ%hT{$jud6D7b`IjtseSH_IhD)r|>UlK8Ras;6li}z&RmJ@Z{*8K@>v1)gP{fJ#lHGck~ekFIk>P{=0T&2F7gQTu^I9z_5*HU{oZm+I$ zlr@9U-<_Lw1(`#ThJ(im0Ya5(Pleb|)d`E838`EIH#^S_j2(DpB?h5sro@7)p0fvn)a4kU*2sfpPm)mtt|0YMsi%L%Sg+Vi0jQnhxu-s;v`Z#55`(>SmbTwv{~X;Wox=&eW< zAyv_|x8$ha5`7}fc1ulXvVIn2Dq z$?HJxCEE7Gx;s2aR=_935z@d=}<;uFrRj_;Zlv;vKL zIMv@wORaD(xEovi{dL{FDNU!cwWSmIOJDGYPe#MuB-`UQs+_ptDqG_)yy=3*I{bp} z>hRJuG`#8J3rJ{OAk{yNC^ek2DYcDnHq3oZ6Nl;4^nS;@ZT=%_ktwn78aFrmX!`v) zcPGInQ~c3x(P7~^uioyVG?|~oBP-q_NU2+!Qm?Myo{L?D^{FVXZ`z7cbrk`ww{~BX zvNP`MuDYVCcXw^-zkUN%U_r{xUVQybcWUB$?z;b4e$^&-&(zn$ea9WXo*j|MBAbsdO~E^d7fS=dI@QqN8@1or4mXouLM)n&36i$UP`tA+O@5^3{GnFc7XX{lGmxID9}LP&Wu4{s#ubP#|#i5cZMx zh5h*dKKh0HPe!*LKFj}2{C|f3L$Md~{~h*c!-M#L2LJz!JOz&7|9{zE!T)jm5AlC@ zbkq4C2>HB9$VoW_`Cmf))zIaH{$~7?Pb&YbkY&G?7|LP1bg;^meQW*tm-v6iZMPoC z$BKii1A%pePB>xuz$?2wKK!%U^H&)M#!<1h2)kbz+4K5?n#qlQwcn2ax{TS4|D19E zKW-(Ai~jp<;FM)e!gnHo! zv#>C8Rxmq{ovggfKEcb1i~Mdddpcf)S(%e&1v86+6Eh1kCuSG1pEoIZMSgM4q+tGx ztis7T`B(G}401s-Cr-?oK0TOEg#5|D%kqo!CQZlIwBAXRT=lL%(NqGrTn*)lNpr-| zz|i7?oNSlsh@rtrSw&eBi?SvKC+8OivvRU>v+{~g3kHVd(1r^#3-f5*X~7}NF7K$K z;N)y_El|VAKR>T1GdnM<&{bbllsR!~kmNI6hcq_!4J5mGmtHzF>$2i0=VxbKacPRL zX>@T>R$;5g!TE)gV!MpUqyAXs(=sPbBK^^mCr{5RisdwxL1-a_ODr{e%G4bGM;9KF zpOceWFg_O z;{2klz+o-gQ*v^$3#MmJ5A^NZw?&5`Ir-DGd;}eSEgUYfC!~#GgTt=Y4IeZ5g21p5 z;{s_ZV}_)hGmicAl%av%f!ypo4)i|3KyKztc8+eIlZB*rCTC9>!BQ9Lf~L7exuvqe zMITX3+{R@Wsoz@(Yl1+1>L!mJsrPuA3klsWNFQwp{EGFJ*&amHj$$}XNB z7?)o#GHY_t$jr;Ka>%X7i&S6+ag5dv@6ksdPWCQtmx;ylk-IAni8pA}f(F5Mn*{W( zk(k~$5?1S`AH2W?*^`Qv}^PE!N#&9lR;yOT zg1vv=dqm!(tf+BrTxotm%N^Rt$2W6u{-jy0)aRXCj;sN!Lb~D{oZnjAk+|OZfAJlf zS(M3IrZYmH;4JqyvS9QHPR-J4hSJ9m4$Us)ESepC^%K>^U7q7cr(HU3^reGGj~h37 zRA6MvuyGQ{j2NCeE-*HGHf?LAE4)LC^SV)$-pjQll6&kKw9C0|VN+cn1RA=cEs?E^ zU68iYzTfxoJ#T)li9@Dl^U`5>WsgP%KJ`D4MKi-VDqF_&O}px$9z{P}R&3o;v`*2YFN zt04_JyOdoiUQ~_bl~B;eSueB#BeQs!Rv6S7Msxat!pwr;sQgJ;feS{D89Fv_&ggSe z0_UV$Fml8>DP!G*C!MA19C!KI_J%n3-|0N(;~P0PzqoK>76&flKAi(M>eSe%v98!3 z@pRMDuAN$$TP}XY&7Wb~-fr*zI}P_vzUAj<6&CTTH|O^fiuk!k6cutQIXN?DdR8Dc zzc72YUMb`>yf$ciwvks8K9!bVkv8i2i2MKO=u%FZS-=g2R$3Ve{y#dp;Ioss0nqAM zFB1Jie|mJM)7BQ4h`%}dGiKX6*8Bg?H1JNk+VuUeJx-u4-B@Te2;RY6P5WYQx2@&4 zhV-S_X=@pO{qBqT{kE2LD?1l1k+N!9aBx=96}&(SMvSe@3E$SnFK&D!JI`CM#8}Sl z2F3K)7l{#%maY)Z7W?WjQrKq{k(xIqqNlrC9@$3q#3<{o+?$=wt&~hdXXRz)W>2)j zWAgLe-3fOGjQfFy@SnHw1O5)7zekD~SUu6-U)4QRZSgr?-pz}FLrr#ft#A{ z9`id*mFTL?p)!U&%}VGke730aCAx{pcB4m>J!lDDAH!a4_CYc1?j|v|p)u@f)*<6! z*sINcUkrPOby%$U)n;E9qkM?Zm1v7qexcc8)gQ9E(=p4N{T^RURR4zThIY*IW{)*K z$@*;)wpis$%pR-$WKCAKSmRe>_N%>HRQ>^dH=Qk3{b^>O>)oQt*ZxlVWPNvyE!O;4 zX!bk3TU7jH_ojdB{7TFoYknl~fjVum+LvMWSmo=?9xMN}cpra|M^ye*W}g$o9!&6t z(J|}=W}hF!9^fOh+G4dY&Frz-S8MiI?F;d#

X$I3srzYiR%{nciV6+fUa$Fs$XpJDb`>qme$ z$hCdu5!HWnW*-#89^w-X+RpZfD!}e~y@02ewdv|{w7*)P%fUo!>Z;7%8&h+-aG3?0$z5SgS{gYq^ZmGY{h>Blzt}nmY zBg(#Tj5nlgfIVe ztnz1h`z`)DII8{)>0UJ~M*N^1n8RblFEIPXG3*=6{zeRYl^(~&W|tvR`E~Q<0&%m) z1mb2U#3gjzqoY1^)C+wN{%@JXCr#NNGrz!~y%Vl&H>8WbY;=BF0t&A3ewD5Geb%w`d0k3_G~b}L9O_8rrq`Cr#88*h5Sy$FIeL1 zwd;Zw+o7&cH^2K@i8mj=TJvkI-beB4IM>%}*F!DV`!0S3=GR)h9r!IVzt-~W#oP_* zn;~qi#T$uVs`=g1N_&g&+t7x1OYy5Wzt-l#YxouD%P+r^-!}Y~nBP6Eix~HwR%s)FT?y=t9Jr^>)KH7e4R`d`26fXM~nUUD1K$;*IIt>;#X~ctsO@@@ataT z>$UqIE!NwMYo|2xYpvdq_{}uG*5+Rke%0pJTK_G@ue-kO_&e*`YxsrCueEx&DL?aT zZ9VPAJ=r?*`>d7uHvqpCVV_@X$I&GGYR%8C<67+J>+$RO7awnAEA>8uU$XhV*^1vs z_-!)3*2b-UCxYDI>s{JPygvBNG{4sRc^rP#=GR)ibMV__ev4YE_dfj67W({Jt9Lzq zW#-q~c>JjR%g~b3@$QR!y{)xlD1IUHYi&O3`=ZOt&+gZ>I1d)%x9~<^@6oN~ zw-Uc4=GWT#ycxeb^J}gDI`bN+_f5XuZLQRMB7Sw|XZLklY{vxrwk-DX{?tmm`S>MQ zdOy3*(_*|w@mr!t0JF_#CEmOE)tR5&_h~WS4*cqu_;{tQ#Ou|W_5N1x*V_4QBz|S) zcYZ7Jitwv3zwB20mg3j(HeYXR@m|9()CRw8_{}swyI<5|zjWhX#)jK{y>{QIMZW>~ zt+>Pc+5Mvy{U+g8d$;$q`$#SNU9Wied%u6T(l5{8x9|b)m(YseNBGS&KfAxwV!iEo z?OM==czy6oH$S`I)MC7G_@zDK^Rt(yE&9#Duk2CpXZN34^t%tgg^zhZyARc(-+KH~ zpYncoKdME)AMvYR<^49d(tkbT>AxE9XZNRCj5id&gstAs?o+ksmxEt#^9!|7?_&Hy z=4bbvT8y_6zjX8K(@MO}_+_*qUS}rLO!GUem3SxOS7LrgwBk1bzcTZi*oxnL{5F`M z-REkty^rFzDbX!|JMDf~i+=ComvDslv-@5x`t86ky^r^^`(G{k_3BFU{k@;v2W!!9 zBz~LD@P2kbtVO>f{5J5dIBj-ctVO@2_^o)-`wecT|6aqd*8I+H#cvya9iQ^??0#8` z^>*8bAm(TH&06#ufM31U8)|12w{X8?5`GEK_? z#0t1E5J>6-%V2xB4*icToZ=nu9P~@zYsl9d&xLD{&w{KGNkidVfk5t=kk>p({Y^d& zQcv#D@Kp4jAZt|8Cl|&AR#W~1$UVEHci?l#&p}=;?)LzkjQ(!;0{SfYBD@q{ivB|Q z3i4Q}I3tZIus8M)lz$hv2>Gk=zMXFv3yc|XEcRhg^&SBqpj;2Ayt~3@klP#Uxu5!A zAQ1jHd<6Yg;}`G(;(P+1LjU^tae-IiLy)Pt-wnoVjM>Hs#!=^a|DNMKpC9Wv399^w z#$(3#@i+o%Ja#ueINJN&Y`oGKKg#QW8|it!aUbJ%XM6qo#(Ruc8z&o&g5|XDFsOME zfafCri~G;ge-5R86_z2tZ1UsAJgEM-)Oa9NzwQZF!Ed?G{WAR0xC(NAHSt;F15o{Y zH&p-L2Gfx%P5ukqfIQ#iOQ7mI&p5&uG9GU{+L&nUX55$>7g$gEzrx2A7mkD%L-l(K zoQ>QQsvqLvF>p_)c^3z(k-y^pzT&JgK4p9aD((_E72X6j&*vDY!e@~$HjaU+cO+E1 zf>8apllLDkhp#{#$Md23=}M^nnPmEIa4>Q_WJ}!L_;X5}-aAkF5la8H@gq0{{Rbw$ zZCnlIztZHVjSEd*Ve&P`*>D#A{h^Mtc&Ov-KSRC#X(;^yD19Mh%bn^Oz6?&o-VZK< z>xcOHy3+UzRJ-qniZc@`PG9&o?df3rb+FI79;%(+88>_8e&`u~7hXY}rSL|W2Ni!b z)Nwe_c$~4PF##&SF9v!4SB-Z-l?xlELghIaD$hPp{dp8rUWXXFL-pI=Lf-FXsB%k8 zE`e;hGd#lua2oc3PIOS0FPlJjx#WS1<)&8TQ+W!kbs;F`w zLte%v{>``=s-DGWFESnu75~>WeEcurV&wU-Gv#L(r$W_xiDx(+&crVWZ-P4q`1tQY z)&G?7dZ>2IF<=|>yF#|aj>cb3_x-#bO8<@VOIV8k>rmw%fP;|lHv1Ce zjc`8tnNZ_01j_$-sQTkg{^_*1z%|G#p#0`R`4vL>jW+odD8Kqsz2B=)eosO9-C*(+ zP=5WP;_YVofA{x(e}gLb9F*To=<+lD@zCXG@=vFDzvrR+=0laA4&^t@wR^h3bz>jpL!p z?F(HTsB$0jf?4t#Q1+{!+LHriA8Pg!%>GT1_x}jW{*1}@LY2P&s{C-X_cZ(7W?$FG zmwyhb{0$~w0o5P5p5ZA_{c$o>ezqJuoQWK$?c)~b?4E(U$-0Upz41Zs@y{3bf|b|n|vCS-;ce$ z-xpB!7fpT`%09{Dvy6S9{MwuR!%^PvF{t{MLfMN9^(4>Wx@llL+PJae}n;rzpOa0ca9K-F6T)z5!2jx!zr zmB;tJd>*w>{cxMfm%vR?$p!?VnOnAy9U z{msLC`4^zd-)Qn&sPZR4mG5Qt9fx}Vuc7Sso4gpRe2&TEAY1NPp5dWTCMXXLv_XANNhDxbvX;y#OliSx|9Lg&OYzP5$f< z->)A*w#2_1--7e-dj=|xtD(y0LB$(kazC^0X8Ly%z2BY2i;O43_QdaPJQOPKKYMup zze2^m$K*v&_7pfCo@DkeX5VqJw?7M&*ZolCuQEBu>_MpVdzk*KgS_9%P~{$js%MJH z=bOE+$%$s)c%YB78mgXKp~{y*l^<+!KeKl-xxTx%KMIw{QmFDpP~|6@J<;UOX5V~( zx37m9=T|(#E1~931=KhXfg0yzsJMGV#r=7IKhFPvlJACturGxg=bMaSsOzHXQ0+Jq z%0CGzUfq6v9((|0zX!^`2+Dqu$wQ#>Jk>LN0#u&upz?g7o6qw>sB&|m;uOGA;lUEp@g32ogD&9p<@lP=MFtdNLkJrBllN38vr6^zS8j{~L@`U_0WDH;#cS*V*j9#QV5^hsx_ksD6CXGyDit zKhB2g$8m5Y90Zlm!BFM)go^vx-d=th%3fjeY$$tQI36Bi_WCZ~|6fq{yG>pQReq|; zW8fgW@yw-Czm&XFK|MH$la_5-Q#>lTR}H?k0b`htG4fXZRDSJRgI~^E$W@ z7D45C4piL!PVpxQeH zvL#+(OouAB4^%#JQ04y7&dckd>~r9F_$Mg)5VId|_HA+A|DRCyr%k>Gs{Hv-+`qd@@w|o@W1PC%?2tzF$Gvt4zKDs{9m_&o}#?Q04#oo43CM zRem*8`72Gn-0Xu*J_fSo20gv_infdj)#gn3@UCADsC63aqI}$5_kUM`J-p<|9OTtL*37K6zYD)pP}Mq zK;C{%9Ag{`Ro?+-|LMQpZzE*=-EXyVDO4Uapz_Fo%HtxaJjNK$f@*hrD8CnN`>yd`sQP9=`JZp>0G0oz|MK;% zg{to*&+v0l$KTcPCU^-{oPJPox*BV~@^Nm1%KJK~{=EjWCC)PDdFD>?3||7(o+F{! zQ~#xp`yt$ma_fyRL)E*;?9+^AL(SLIjr&8jr*5;)<3p%C-h;|xy>XT4UoiPe<9(*T z%jBDl3!&E4F>o>b{)>RSU;c&hJ=lRfUW2OtPLr>NY`Jqh!!w}TdnQzS6QKI>`_Fwl zJ~M7Kt~Nde)&4vv|5VfWHyYU~7+#}}XZyxxS$W3^}aMOc7+v9~AAgJI+YU_08e zhw-OcFaOK-*gJj`0=aQ^qQ&_RWUs z_bG4?@@0@MalG*y&)lJ&;WObh{JOwJu=W#ckMSX6F;x7~Q1Q=%8vpu_z5FjI`zn(k zglxHYc!qC*8s|%)#YsLyE%E0MJ-_wL-Rv3u1S;w6f=ejil1rSMfaA1coRlaGXDlsgoz!@iI4%lCb}RZ#gq40ZgE zgzAqojVGA?U+?*K;UnWa@J0OIfG@zu;k~r~R(K9^7Q@%jml=zp^2>*6$9Yio_JJC| zqaa)2A;#`-7W#MI^?s|N%H0dcz*|gzEu4p(1Lc2;>5qi+Zx7{P|92nfUr>IJ!twA< zI2O)<@+*MK>ryDcB$IorBc)x8>e(yrI+`oE;UxU-|yBTVni{VC?1yw!`j)B9W z%6Ecle|yN5_zTYBf1v7r0?O}BsPZLH<%>)|5z6lXsP=S$^80Rs_xl2>{5w#7*PDDL zl;6cr@y<1U2+HrrzxjCo2j#aO%C810-V;!M*(Rq$`JD#k*VpukP<|WV_VLz2`8@>X zcL!9w>!JLHnS2tI-vLm5dzt>fZ+XAR;du1-LHS(^Ea~*+xR7vzSiUqjBlBK zoyn_=&v@oO>>0ifUP1XBcq2R+>bO4AxW93C<7a>M`91@c?_y&fRJlux!;PmHkArGg zSEzP%fNIw_Z}@)s!ZZ9aEWmz048v2Q;vQ{0(Adcs2bIScEIOT;&+i#uGCpCv#aM2f zW}Ij|8)_U5fr|IrTF*^T^{+ENX}sHbD^$C#glbnlRJ$fXjmrg)E%6-V5YOCGJ;Nu! zY528+s{g$;zTV}=JB?RE<&kg9fU0*eRJ|ud)q4cgeEjrvFTV}tR}JNNpXqOc@*55{ zzt4d3>j~wzFYG|Pc2IsRS!5+Y0_7Km@|$b=0w}*;Q1K3e^4q~;EWbLa@}ENa-D+|f zl;7o0ewUbj6qH{aRJ@;F@qYh+@_P#^-byIH875~z#TyRgce?41f%5xgwU75Ml;5*Z zeh)*%yA{fBtjU9+{CYw8bvJzgvgK~CaSYc%jpHj&<9IjR2p2(>p958XI#fLa;UMJG zAX{QTd`aySjYQ=#(h z4Aq`(D?Q&c-VGIh7F7JHQ28W7PCsZE0LFMu03g7NhD7gq;h5aDj7LF@>tQAzXx!T~ zx4mchw`xDGYv7IeFM%83Y>W+79}1NJ_m6r$4%Z_;2&p-wG+l>pL@+p9dJH+HCKNrg03o8GfQ2Fm~On{o7YajIe|18val$$&g%6^>5hnW3)I#=Vh0m_~V zRZl0AYnV*3KLHi*8k6&(^0*u-k4)qFp1C7E!^7Y-{Pu%t&zAdqd)67BG~Ni+pVt_t zL*Vr}3@5@X(0_TapZCu}_0Jtp@yDBd0#v-ijR%{)BUId{?g<3WBJX?PV&p+^ zFXR)9aZv5sakr~K@dx8qQ2NhI-ei2!^lMCh$yjarM@+uQxD=|tFM+B*06SCv_A1ZM zq4L>ed>Sh6T*#I?(KCE8RDT=+wGMoDmv8r{#=jX?85cwK(*&q~8vzw}H^`Rz^PP_2 zAE4&(df0(HUWA&@qhUMxb)fM$V^8A&P;sZ;;o}|(<^PYRo^KeRH$G(iGo+sVhMIh$ zv6r!%aqI0iAEDyjWxT<7wQ(F&yn{^Md7JnD&iERXeSyidjh7oQG#&@#_n%vR`7e#{ z8DBTv2IZGwa+)z@Og46a@_TcMkN2YS5##N~0w}+O;Vk;|vs?Up-3T>b3ZUl4WyUk% zbI7Majpuha`+53*kS*~u<3FL|-2oM6092g5#voL^@lbKzsC4CXS9yk?hng32q2|MW zP~*_S_#c8w{?hm{)O=V4RnL>gTa6XQ>BcPMDC0omQBd>tyPJHxkD&4^hlAjJsCHgy zEQV_5DUhN`?{jdd{&mI|pxXHmRGf*BEqAuejQ1HA8)q9YH(qEw%h(T6Mbgilv^T=9pxXCmsP+|k zhV$Sw^k+c%|MnN}|235V{ZRc{1=$jBF@{ZFX7bg>BG25*J;RgW6_oD->B6M#bfWt2 zE93jdHOA+l#^)j9?NE8;LAB!?V{fQ9-Hma^@2~gztx);j3)ymS^$gzx)!xgX;vNDO zx4y!c+hW{kTy1 z@(g!?1?b-@_wy|is-5Q=2O0YrkA}*BFSr-^{95MurSSvfD&v#JTa6XQ=}`S~98|nc zQ1$+No#*GqcZ`39%6|e>{$o7DBjGgkN5B!}(*bg-PJH-Uf1S6;criQ|zjL7C>;~84 zx2@Fs{{y~?{2Ww&KV^K(cmkg3p!)A>tW+yG}njmKEiC&6~a zNi^=$7{7w5w+5=-CrmCkd8Wx@Ode$N!6xr%^5(03`M*QOd(7meCeJWA z%jAJ3_cghr$v^$sm){7LPmRg9nOtu2M3cvu+{fgDP5uv)PUSa4<@2)1kC}Xv$)zU$ z$>fva>G=19RrJ%FbNI;`7^pbCOfH@7pDn^N!P#^kh6?~;2Px9;q}>e5mbFCQ1yjO-UF(>+HtW6Xw6puY&NLZ4eCN`uYK$U&4#ge*o8^UvGRKUWdK{s$EwZGa*e(8VlE=Pca@175`vZgT9OL`_sMt z3%DNr$HotgZx|ngr&0bcxCXyP#$wnP{S>JF9&bDYvScM42X$N@YV2V8p9rS;z18>@ zybb?VQ1jzSV)>+qvy2x*wP!SZ0sSE35pW9n1EAKOPR4Ie4Fo2k{}eulexq?Y zyczw2unPUH#;YJ*l#~y3J(6imfhp)ufp4Hc+SmnFpx@cwU$6XV{3lF9{}y}{|5uDp zK$fDUyWwBa-)x)*m!L0(ucN=*cmbS)egxF|ai;NDcoF(U_%`}|j5|*W1nxlpJ$w=U zSH{1?qtU+(b=bdiy=)+ngluYk}icc*v~hf1?86l<#&Y1 zL3k_j!BFG<-N`b4;8!tDGf$dly4mbJ76MVV98y_()Fith584ooEjGK=4 z<)1TF8n1$?=WLVv!Dngz(Z-&p?`+)O&&R1TK4x43wJzTTms5Ve=`S&+8v7f28xJu4 zn(X6#WBkncqVay?Vq*!^`hO+Ve9ME?$k|Z&kB1u9F(!vhjyL{%oVUMftTx^b)sCB? z+HsxfGmU2(Pct54JkS_0*0D&b{>{dhjmwO;80SH?XUCJ!~}3Z7r6+IhG)Zv@jDYL-`|e)d=p-aeGSz4WDeAP%Qv0}6?Z$GPzJw;^83>G z7JMB2I;gy#h0~Eo8n>~yNWKAH3Kzh~@S6vf#~icwFuvZ~`%i(2dl^(er$e>>9H{np zfhxc0D9??s68(Dk9QqgFNys;uy$q`UdGHnNb4*`s%!7nX%7&_^2UI`IJ~9xv1bs2o zd3XX`3C9@sGwx;f{~qD}{{!X!xp5sFMx2%K9`sdk0`l!2E!}TnOdg7s|i(;D8=!llTIZ-vW~lgYx_2An$h;I$G5vSlynHuQxl5q@f>81H zhjdY5CzIdb*X!?r$|D2HewxX9oBY*2-tQ@>xOvdUg>-4+e@Q~+--ePOfU2($%D*p^ z|AGYXcbf6#cyGTF%AO2qO5&c-^~>H~eika;HBj-+g!2EbOCYcZ{_jKC?}4t}Q1%}1 zQ0%Kadwl_vd=^yvy`lV8?S+zm)1b>2O8?EC{FWQ~JE8O!LFp49U6XiEC#w%SJ)~J zhl+PBlwU6>zs^v8zr=aJQ{Z9PIR{9;dkJKG_YRuOG;n%ycI<8JZlv3sK7;u{sNF-x zpfO;qWj@GWW2`ck7&D9^W6&5d)-q3Ad1IBa#F$|W8H2`vv6gw{${VYUCB_V6$QU#R zjJ3=+SKe4ROF<`9a_;clrRmKuyhB0Ie8Uw~!jyqT0 zSY<3RW*9@ppfO;qrLZe+tTL7uGmIf)&=@e*a-6cedyTQmSYpgDhKxZYaOKjU3pDsGZ@SpGN7p@)x0w8< zmG5l+LoNO!lb=PHhiH>PzzSSzK(mc;^3q^n>IQ^44}b7e|sK&rL04?nZ%)YnvcM0b=ZI?&#F?ooM ze+lEDt)2Bpxn^)}!(2Z+v#x@$;4C7kQ3bCyQT=kG7{G<8AVO z7C+78^CS7v@7mTy@-?}WjYsH6Z=YoGgF!FvuKZ|!HoKEcDhJfE=Y&&YEdrS+uN&6)=emFcbFV`&g8)+N1jW$!{pjyz5hh3Kl0qj z;U;ge_-~khhQ;r1a_D4VzQE>h$uMw_1C3J+AHS$a+20%U9a*8F>!j?IxGZ@%De3 z95Pw257eH>a}$S}J@TB!Urkv{ zpS0<9zx;K*t?h7IZz9jh{=kl}TI$huob`7yd274L;#GSw@T%2kVqlbwN0qJj^ECe$ z!;W@5tx^9WSKmewY@eH4W%6^%2m4g>KSjq6@(#P+xW?=Ov;P;H*6XEq{Dw82$V*I~ zP8}*=Z{?pf`%JTMvv}zi?;yqF{}z*HvW`k_Z}J6ZFR^@U)j#M~nEiD--XqU7o^I<; z2!^Z%>KGfh6$>g#WEh0b4;Pc^x#*%M68Hha+IJ=OpCuQPcx z)45Z}xz^-kt-S&Bf5q&ZEdFoSKMN!6 zH@U#%Dw`kOP3~m#vCd@OFHn9P?E1DW63?z*-?8i4RIC3_jJcorZukRNGX9O_z@4?1SqU_9^?AcjqS%uTHrx#`A6^+Wu%`co4?U7P2H7hr(Ff*r#!;r$P%%ZG8 zg;{x-7i1Sr9gXoL*d*H7;vrk*Nk}P07w1nK>)JIHI|9NM_E&;v6y=mYtWG z)5MmNH>rtyX`_0)!IGIik`9Q}I=Ub$&-7|nS|%-QVpKln5Gj*SnI;h<1_c|EpI4Nb zotIVEtdMMj^9yNt3x*a{LyD&t<>$6w7(1~rKPRV|VMtE?^sE*ws&`mUer8d2-jtRK zwPtJPuTW#MCKhGpP07h>!8Rf{bIL9~^I>{cLszO_Gsk41`G193+j5&o5X~34D#`x9 z2(UyI7Z)Had78okS=1s>0gAJKzde_Rxq%+yl)F#&%=Gj*(~{H6MX@*C^z#Ru$S^>k z<_liw2CqC{>u{=X7D&5nnCG>a7P@Jy^jS=unQ=xV$eL zRkE$0MgfWIoBPKvr!r*ALZff5%ub&46|j>PamgqM;Ptm#*;S^K$_or_kJ9pN6ILXr zt_*hqc)h|g?8c_5S;rtj6iPDcd;I`J$;zsEj0kBt-(_~ZQ@3}vHcI2kyF%abUV&N| zr9~$di}?*`)Y$YL+My4{)mk2!gNDvmG?KROKFQw(17*UwwD~ju?a=#G4xRF=1Vgq< zGh^tq=#Am|P}RfmomI6ke4{EDhVP;)gW(+vvKwx-?1pRCKe`Iey6gWkS-ryjy;wu&>rB0^hP*UdhwsoH+PZmRH=IW(Ww7XD3MzqnBy+kW4P9LyR+thXeO$ zIAynq8#vS@6m>yfL6z7IB#+z2V!thKt&}Z{(6&DsPI)(Bcj+Y_n4)Og>!UkQz#~ld zSp&V{%V!W-TnzW&Ss$8@2iy*jl-z)tW(v?oMW!*3 zRF!INDWzu+gXu*KPfEFkDnNQ@?U#}N7nL7%i<#`YqJkqrD*)El1PR3ryYs-OCmgoC zYkmF~6A4TPZ*i^Jdw8V9Hf5=DDC!)=yk6VfT|O;JQbVo+qvD@B|0?evN-jfG87J`| zTVXRLPfayl@iBPqc#!zVk36aePojReFYTa1;cdv_HT)BKOnCaUFRoPv> zd=2G2hRF!`JIP7uy%|BoD>UQ79CS?jXEX0q7OvZ2!~EQ~hbmggr`9=@ej0631@)2p z&_IGhi&LLe6}uLt(RK~Q?o*po6`*+nMh9yvPnoYI6pXV{oWv|-*~Mu@7gBO1q5oil2A940i(H zX=R@ewM~ZD*_2Z$uUi->>uTNw@^4yZUX~lpJV;qn+F>O}1I|I>iwDtmYPM$nECruL z5v^?(KW)gewQYX}L8AOi4;i50H*f}9U8!`1(~0ZEvsrU%No{X7$DKJh= z4mr_U%Ndg73UH~D3uk^g;qDscA{9w;=39|3C)U}9&n6A{a`m(O{d6GVuwNi15&2E2 zAMB3%_b@n7FOAZS=0OyAMc~scJxL7U(qjS0S8|LB43t)Y$3ariA`1eDNuS}2EV-AZ zQ3Puz1qqWNd$P)bQV=tgH}iauRRnK$=x=%m!u?_H==_a%fp;Jo zw)n!05H<`=ehU5K@Qp?!FDPq81mc#Vxx*wZ!ZZO);m!Uf5fBOb;*Iz|Tn&aVZo$ES g)*L_A96!L(vcIyx5BO7s99T3p{Js|ZUHskVe~9E2&;S4c diff --git a/bindings/odin/clay-odin/wasm/clay.o b/bindings/odin/clay-odin/wasm/clay.o index 8b8e2b7aee326a8f963c63fd74204f0d36333868..8cb648ea774eaa83d6bdf61cb11673cff06fd49c 100644 GIT binary patch literal 219784 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 zр64oW5;n!6Xx+dO^^eRi}CJFpJbW2!wB=qnSddFSQgz?<7ETLDzdU*-GC80MG zdLrRX{_FZAG%fc{Sf7OTP4Kxsp(!#E7ACfSB&W6A-G=Uw4C2VNIhLOKk`G+TrU-jWoM^$A-~v3!qD7$P>5yURx9--xy~@#2Y?+ob3w_%|nP zGfPgQeiGc8FrK$2!k?IJKDG_E?Yu95X;Q8oM0X~PAi}PM?cz@Rh})g8?FrlMb5g(_ zvF?FkZ^HH_+`a@a7yA>oFJb#hJOGuSA?CIOKXr!^b}(UwNI#sg!(RI%34`Yd`bMPg zQAs-r!?A=NV}+UEt@lL2jwkE{i6^x@K9#VO2|K0oO9nliu+s=@>l&210a=f=%s->p z8Dd&D`IXmMEgsG#>|ElFXhT=65Y8v;Y{Jeb@Y}66yQu$MO4x;jU83PGC+uRvU18kV zWj|`(U{&R=O3Jl_T|>%wFXei|t|sg{Qf^4VP5tLq!fqt&7E*2}?53pH?UD=(dIwct#os-rnX`PdQ?Ybn5Al9y8?FuWe1z`(!OIo+2X1eZ4BXq`ta*t&3 zH(k%9^+;OJWYbmVnufyvL&?1xsfb78@pvWw^uMa`Pvd`s#;2eE5R0d&L@(*n3(pHr zV;K^-4_FDk!-SZAt@|jUk53@hSFyfce{SVwKct@$`i1;eX*#QR-mQO_P$>ZelrW%q zl?Nu_8fy_rH{pYw*NgJ88QJ8Nq*$UsvY@?Fg9s* zP{;9chdw(lSz3Z4YJAehdr=cYQG6kpkhF;~PfFUP|K$xmB~-ss-!_$MfU$TGNMYELxu|AzA!%vQ}(ssY-8OIi`knq`X1R-1?;PygoV5 z>0796fT@2BrEB21L&5CYDpDjrPIk7d#jJhppTa&hp z#O+XhmjY_S^A2nmQLdfJwG)P2N!yilyOYeEdy=+0X?sZA3-xuX&xJ2}F(g-44N!k_Pq*s%6F=7dN+W2r2&0LP zNf|+eu_+tN9nuk3mol(%b*Zq=jPruVi+?;^6H-PP$J0bFXp#t%h)zx!L4+wOo8kpc zP1(ehP4$9U!FoZ{#XlXc87U)7<7uWBG)sh8L}#arAi|uK&GCYO)`NtfD?#cr=s!=~ z^GImG-?0XqoA1RhQ2GM$E=<|{lr2n^`iyS^e%KeO2^ObpQOXw61WVKeOVk9ubyGT2$~KX0GugVh*f`%`ux#obmZgLDuR9ZK0D&w4mj z0-+yC8R2lMgfu!TWsjmPpLEcVuR6z4c8t--LKo5-(c6LJWE$Z(!}FxLPcnvOlQ*LG z19!@+K(^Bbs>Ruqok`hQYH=>K(mAzgDfju5olm(7?Na=pr;d#8=(-X!&r=st)(U+(dJ)7CfrW~8<2r{!z^ zwDn6{|8&!;nRu=;60KlfWi6Vv0q8tXQU-b{rBA@;12;$~SR(Jb!D$=B#VqL|Ziv{1 zglv8mX2K8LP*VLq{;;$Sqf!}Hn>NBwYCc>^Hk>S((3&G8Vg&c=H#82khQN*VB53_l zX&Z$Vs@&+bA82E^ayo5e(jZc~#2{^B)9qZH*6HKYR+qMM5XN)Kbh>GvO-S2>w5IQg zUM9jP$qtj#HYshB(|}RAHkGAlnvH<8P4%qP(xrhm9n>i>t8{6g&5*J)P?it2VVlnM zLQe#47APyHcoB+u?)3!71cF7(T zu{&+M6-(Q$wA+KuegfZ{w!H{z<@Vv@CvE!}X#3N)pH6$AY>II0YvazSgPl#=8SY_eKG4oI8))b7^MlUkCFQ)AQW|JS0(YS_&@M7>a)mSl?UL9o zg>0pP2H#~;{Xo0IOE;A&xT|R+T&CvNlw{Y)Qt(`znMq~T8)>_qwj1g1yPLB8t+d@t z+bx>nHtlA&%dH0coir=`yJ@?Vw!3tidx-JV*nKaL8R|jW9$>f@?qS%hkJ9!qZI6)k zSfW2m+hd&mFv6as?Fn`LJZV;EWAH(9nzx%2@x54b3!t zl_KvjjO7jcjk}C*oaK|tJKJh4bRxf%!h82^c|hCQ5hRe zF=H||rhJm0oMSVkuTpgxBaF?IzDkW#IpZj2rMJz>z>Uw?c*Jwh3nV|3CuWT2iJ1@F zB$Y8aW0NvAnKGuxCR1b+ac<$Jtc*>~XxnC*7^i1!TE?csI75sx%8V2;Gh;I|`aU#E z<akr5RgBQOh&7BxB3VU15bJt<2bpjID&a zN{Xy1D}s#G8C#9X_{Nm6HJS1^CY4uDc}u-zmj-UFy2HARt4nHGg66+Q*Z6RT5xhrqY6zc-FP3hanvOQzlGj4|}wbNH> zSH^Z`Y!_^Ak2xq*FPQm|s z?xL73lJHp9O{l{IxWv=d3@>!oJoUP$*GapPF~T*TZf4%&+-JsaX6%;c z61!S@DAu$76#s3w?qrN0{<~s*y)xqNWsK*0(nqZK#d;rx2N@%%;D;H6iS<#&cz#r7 zeJs|;FnpFVf-3h!l@sgd8RPkLUrXWJs@zj?KP92QLghSD^ch*6XY6^VaNd6}dZEM@ zwCpI~vP|DKS*yuv`tFdm4%r2+V-}8%Sr!?fTKx}Nr>u2?qowPdwa##K5l0s|1fumE zU9;9TtGB6cSxunbv(_zZ-Lt&dXZ>QQN7lbh^;E{5c&NQz)%Z5WU4x|hNu_tzdQ(o7 z>w^^Drut^BPuBV(reD_J>X&Wj`e*4d1G3gXYXcw*%-Xhj#k>)n8Mw)wX=cJr$r{g7V45nXsW5Hvx-hP$Wo;Vj|BjoUwdu6U3~|hW z0}Og-&6!!7nboR$mPoT8fkB5fis@7-v#HvFs^W$!H%HMq*ko?j=4RczEI;`3vogWOjH# zJH@{fu3cFp?BHp)7qmx&Jw*3rjUd9ltnKrH_GfK(*7kcr?0tGc2gQF7u0vTP9N_7& z7j#5~BSep8jUd9YtR3@$j%V#~){aY%)-xF5gt$+T(5|#4bJ9ycrQ}m&J)O0aSv#F= z+LB>2pvpC5t$_{!SQJJ-Y|m!xECa5UJD0U{bfWXw@XhW**3M_`LUxF|m^HXB(giP( z$@k{VStDE`>52-xLdObc3P#9P4T)=6yPCCYC~{p4*J+gNResB^!mm7)c!R|H#z~+a zgcPZM61bJMTYeI_9ZmvwvUWRbcNk!Ivj*2)CV_h@=6=@hW$iwM2U&a2Y!Y~wwTHe_ zJn}LT{#cX1XIXokwa=IYo@5Qu6BPVBYoB}8r{ziDS=I6o()IqR6?_SGDdK&M>OB+xl0voYekte51-kym!ue=hUKoMCt>HlSrt^{LnXN zeRG;0`sJ)&Zh`ABj{a~=^c+kA1C%lVAK_f-%rU5eiVn=N6`Hd_IX5`RBrqgrgL5{7 z#GyGRfnhltnzLcKrb(bSXSI~l)(t1OH_wP1lfcNFjmX(Z@{P(Fq*1xjBrsZqjHb+m zngqruHip>JW|P3!oE*2*iByMxaXBN5CdV<@ShgZ_f7QY%gPH zpT^EUjh$luDz{&`_LKcUjsbTtX9se2&^ImT3J-~R2;yP&%Og2EoU7i?M~^&t*(-umRNFVuc{dS1VL_|8f%=%2U#c`ZZ-AclqLz`PB}+dw!6QKAP(56&B5 z5K0V@5<|Qabkw1W4JCHHvT=!9>4y1iNUqIWt(QDJlsqDD!}B%*$s_Xy*T_8gSxdRm zc^j3t(GbSuZA`vti90rLWAmEr>b%VBm2O;~U$^mj8<)57`A^)0yg{0PW)t%^(X&p< zmzKDb^G2AIFD-GWNZBbUd)fDYUIwP-ZE9W%`DxyO)AKehZ`09Y1}4HtGn$MvGjB7I z-onkw+brtT(#_7>?EC^Z$1BFyo4I)-%*o3icsRV~SF4BB#4VL3%`kUN~tR^)93RcPZ@$}X$& zwlZ(4^3C?SSLXdbcj)Mz+3b9!Tb&Q5yft}SowqglA+Ek$iM4rKOPK|?E^mbT{6M!} zNw!|~^4-ph*ig=}F>f1vhD~`RY#_sCCD~?WDDUyo7q;YWi?_knyluq>E!?)eZNmoJ z%c6GVjj)}3ytVoHX=mPcB0S-C=|KkEowwaS^ParzA@kn6`M~Y}d4p>oM%wQMV!#7= zJK(b)%o~XZp&f!|hbV$m^PvF`=j|{CZ0(N7fJgIoByUHX8}P_a8L)xx@+AWv&)c!Q z9mjwt%9S{ox095aai{V|IDtJ*E6Gl)UL^w}qM@AOOy17;3}^F3XduHmCD}P;2zP1d zUFY+59=0lXA$-WVi+SVuBK((-Cx-h4QGs%hzN-tOe>ZvL;`y}S`_GXn1` z&wU2i0iUNXWgzu^&fYNe@j3e{XJ4ZI3Pup2f5G|}^s6zTV0{WUz?T_u z0}D0~fqVQn=s{!yq*Cby7mVk@WE&!H%R>t`q+mk}r86Wck}X9=_VFzqUW1b7CyOPlfCdM1)GBKsRe^J6#>)A!lxH( zI++S?M!^Wvpv_d0%|v*(pHJ_b<=v_jY*xW$V~9EAwmI1QdZpjgZ2Yv7baM+f7aJzr zJSuPV3R-F{<+3Q{m`~OPvf;vlEhyMR-(YjO`9#D;5EmET;~Z4M78h(uK`Y~_OvoZG zg}AI>gfP9X(k)l|a?)26jNsEr(cfC%`#6TSvS2Gwrmb65V5zmbV5WM9_Y}zeYTPV(rx^*J0qonl(Bdq0VL!ns9MJXa|B)X|!1Q9kDY_so^ zTMD+JU|W0@@h0E}Z4>`CxV9IJu$8ABUeHbvb`srHFoFoX3%1*L(LDv*QLsJU90j-6 z3)(0CeQ@nB7-26@2fUzzA{-=os9*#U4j1gO7j&dx2MTt?3re`7UeGb|AA{?7!3alr zI^hMK6yYS%Qw1Z4aJpcpy`YAIohVp?1o;<*N_R%wXGoY^M*W=i;?F7l9C^}Ed6gkJwU7kNAf$zOiL2qpDF60|udaGe^}}TT>Zd3sO+r->=M_$Piw( zmwmm$TD}7964r>_h$;r5?l96a; z<8F!;7(z|W;WnDOEbvf8rHtNa>?q1GaTqt)R9RK2ajFcDxosN7Rmr?9j9WWeAd%yT zt*~+hy(S*^nwSCeYh_hh8>XzvQg25J6rScWw7JU`tFUx7w6t%#0=>si6PH6nanD5o z(^uIq$hlT6 zW`jeWMW+JeSdB9zT-~j4!l=;A-rD&{(YoMh7#V6-eJaVq%66CT?1rEr;lD5x7!MI+ z05cB68rGyd1Vs1}H*vqD(U+hLMeOfY({;Wq))u7r4pZ$~(mNo$YOh+0#(~y~5?jee zz5-m*ouI!|TI*`p#$K~Fg#mt`7`@4n?5Z8ta+jLb^670A@gyeFnEStJyiuc1hB!0S?zgUNGbmPa~5^58l z$v1puVVKt;<@V}rlC`^Q7oVSi;7g!Nc>s3#TrR!X_0S5BD4~H>z#^RnCOCH zu4xVnm}p1)l5|uh2`9+fl%+}~CGzRNt;jT$R8#RYRVdc_qKfw^h{>AY590y@{eJNK zSU|KUanHj9mtg|%KZO3?{=!6Ga;k{frXQ20j_@p~`2BL(Uz}5o%WIh&HERMdh`wuq zhc&27Kdp4{L$MexVw`>}UGn9<2Gpy&IGq=ul5L|aeKgH%hXg^3eTE+s^$0GxkgTD!HgEQ<64LJVz@ota!~@*=zsVwPx07W38=CwKEZ0FbDDH759r| z{i^+!hz0jLn!I7J z+Z*lNFCp%m_DlB7_U=vU@@ACpd^2hgckI{fJ0H8ZAiVXRCpS+g zz0+R)0ZO)Lfr|i`GI$60b^DEK90UC3oAhZcY45%riHp|46+=1iS<&9BcJJH!V)inh2liX`LACq7ec!(4ZS!U%?%IVcABNdKvJdT}YWD;Cfwe1{FXMiQQvcX~X#cp{ z{S(UkC#8xd+;8(1{X6#C_B+*F_+MqeOU24|eTBRKBkrHsKPz{z-?QJde_GAW{}J~u z>|fYF=L?NGo{D|N{k}!)_nGrUUH&Dpe@UNB=hGcyg(TidqK*Hecp-^4i&y=)v{H>S zcAFL)T4?08a>z5*f5K1<{Cb7cM}BqDw7H~_<3~?C_iiNcXO7C}jdTX7`Tr`KM}E$; z&K)J0KO$PTM2bEA`13#Q)P?P;zkZ()9x>2U31YGLSv9i!<)xF@yYDgHBF3k=0Srfh1cXBOy~i9Jv0n&<{?qpvixGP%6#D1yv&@Ou z%Z)-`A@+)d`U6g1BK9Q-9qcvr%Y{(r-S@%;XDIa7-)E#otVJla<@+onBKDO=q0F$> zQbIW-m0$!%>{SUJ;f1y$+A0+Kx9>BYBlcP-6uny$YmHEPL>p@}-x+ah6zhmNiLFfY zLivlteoSe6nf-6ri6&S5ei-Wp8F+YzZ436_#SgaL{39WP4y=V&4vh_J5B#Bx3&{6nf}A_bbGHrBUcVB=!#x${3iuucD7% zk%Vt(QSaAB9&e)lU-Z-0`1=apg-9#;=&AU$6=`L!H}bwCI{7_aBdB#V`b*IMl(=8L zc@CDk{%_f{Q2DQX6-kn$>u=fH4W5S@OT+sUo^hJ~g-hqEAGakf^o`^-fj=C}&GX8? z&QEKXBwy8!!@8)H=%;NdO@5)u^{ev!i{#TO{8uiq)lZeE7nJ7t{w_^_I$xH2xn{Ct zds!f~mr83cRaB*YQD<3B{F3$a{+4w%%8{?B=9c?QoLc8dde67zV7oh^*Q>g z=WE{Y#OC(QDw2AO}NbaSQ`?h6;z;A(up=q|6Ck> zqzzMzf6+YQ7n$+mo;Lg*1f@L+t&>9; z*6@B&RL!C&5-y4~mBg4<1AFzIih9+c70<2Sj;w3LX8&tEzxH-yz0zCr-1_av25S3y z6rGi3{IAVh(eu6e*(h#k!@4Oby}RiR;j2)YMmuY!Dz0q9L>k!F{NhP(j9-WP^|zu= zecpv_SV0B$jcR7iwxYfc_4T)+_dRuH8|KTv-l%4x{3TJp3H6(AMX!tcUc~t+Quc~4 zKL(l~>!jVccxG}O)y6M}xHW848>UG9o@m45_-*?K?O0hgIb1TFEme^1*U0v3T&+z- zeU|T(E*X8x@VZpk?ibYGh3C7R+4nrPZRCSVHGaFer40+Lz}~6$4w!zO71i5?^~!?a z->}~(Z&?2((Rb}PwZMv$iYb!hmscOT_tENm_P%|uz5A``yY^cw6bmQ4kk{M?NdJKI zZLNz-{V%}xiGQEd_hoI{6+5@V>r!AJRy#Z`wNz_8ZOxJ^uphA7DzwTE#qy6y(2A>A zn{~g<^KVzP*7_&*JJ!yASlH(aE4be+)@9v4h04;3#g_eUwfj9~{^un9^J>4+BI)<- z_f`3S$r6lpm3r+TDBr(=>0ed5e{KKT{-E0Z8|C{$lK!w7KT1DR(!aHTtH%5zyej>X zHVV)bo6fSt3j~GwE zE4Ft3-Ts^X_iFb)VEbG9ANIHJRH)_uCrtnI?a1TSMRWhFxHRj2Ou~<=ah~+4{jX~G z6A7xRAgx9oIx37na!1^Ac$XiYD(ok?N|IJBT;~c2=pybeaCenQB^!c*2z6NMhz5to zJ*nd>aBPG_SwCJTRL~=tZ3&ZDLPqhk8CndouM`?I&Q*0Y= zRCTSx-?HsW*baGODPe~ac91Z&H9v1V7265_%+|%))^3-gyC{Emh3)2IWjVyzE4N3s zm&ASQ7W?JwD0FB<3_nL)&ROwJ#X_I|prQw1Jyd~vBODtsijP#_+X#n705FyRn0H%r zj4T?=I5Fb>P0C-Y;fy1rwsK^|eVnj+KSp+fCtMhzT!RP=M9);#B^?Av;AodHeU#u{~d7dtLIhRGaO!SJ}6?wwd3S1Rw3|*_ROBHra?L%{1mz*17 zzXAKr3L{+S>6VvsTZG$0?^NKA$P?~X*j+E@o_Aq%&&x^Rn+Q1%#Qp&GhZRPUtD;9< z&SMcC6a7qXi9F#+g+1|dKCi%a5x#~>V;Uhb^;hh!X zw&;t~;8-~=Do=xTQAXZ4FqItbiMDg&6`jCIb9pCf?5Z9ZDDzA}mQfrTfv!~M+2GCrqyKE?@Kf0w zWxGG0pM;m+_Aqcld^MPGPf8g+F#F?IwN2B%*k4B4C70uN! zFA){TL`$N!l&_Al6u+BHkDp6Na>L`}OO!%+i%&3H) z^1h60b=eb8y*TUPtbGlY*2<4jdBL|1l2-tqMqC?L@@e$3+!;X%{TbP&=$jGwG=c+9 zMw?5qayHy9dcuYqax0i^Rb%G(q#uxyCef2M!V$0 zh(qR*u_xLnVlUp{ynCp9hyl=s3!{DVVZ;@2GUh=!Fv5A!M-JCTOo;%3kN2vQ; z|G~AnWOCt_P z>OcME&B6u`n+bvyMC$_@15hYC^t)W%%fnO(1RLVqB&htj?2kxXw zo8(KHTv@!_O5TnFn^MU%DrZN2!PwABE{|AVR&q2=JD1Zv=M1IIfOBSL@i7N@6rDwM zwtOJTtI_02ydX6$8Rt|MYqD;xxaPuznB2qLViv{jYr)~n?N31>!cg$sMCi<2Xk zm?YF>rCz zNVd7Mo!g@5)=Jw_iHoE5Zks$Gm3|DE7`9gy4Zla4NpX4v4sItryW|uJS4Smi@NP)} z_lEnUJy7@37w8RpeMj}Jy06mqc~?98LsvUM`*3`80A3s(9aOI=b&@vtJ)+KsP=7FlhaC~$;>?9jn$q^Fw!eh(+daXF= zIZr9=6r86kb?tD2q76jPcppdn7q3bun>xwaN?p8%1Ej#t!FArdK03?O1uqQ;NP%4> zdP%O2aFzrzT|SP~Nv_C8l3givlB-_OHSst4KeDUv;{b^Y+!Wy^QT!eeM7S+~N9rW_ zJGvn^N2N{z_g!({C4svjQ4jA&0p5?8F6Hki>?H3;A~i)hKw@QzU!=NLVZuWtJS1Ua zE8Yv;a}LQSl3GakpkQ!fohj$B>W@s zPVrnGl5mU!qFsHlrV0;9Rs&*1KT;h4n^*@v0k3SuQmvz69jo4stX8a(Vx5Ss(InJa zvChQmThaNtR29J$c2!zezzN-|aF2xdBv!6f(xZn6J&5*{qa;u0RfUTrwL))sRKi!1 z6lj6JBnj#({=V?{t1?0#o;ZzwAY3Kk{(>mZkO(4p7fEV`!QP?LU_7(v{b7g~G*tXU z;Tl$jizFMuQ>_;?T!i67N60mjCwSjT62v(qjxde#f&fc;L3l>O5eNJ@L?Vplsm==; zC&D%S#p?!6C@^5IlGx72T8a_;>BDZc)UZT z@~gmnxkj@2Rd4YsFb^HWSAhjS#{#9Q#D$W+ko=3}5((c(AbOX02T4mvgcl?ho>G7_W%xl_NpzJI@UD-_3apVkB)lIz*G^gfRG@6|?#2i&(r4xJp??W)q7;~gd5LFG~YM`RS!s8a5dvLnd^bg!z2 zU&i}NyN_ht8WHYQ6~6f9_)yh#~%8i@>@oLl@=g%4R21Bzd~Y#gX0&D)4MXjk*K!t9!LL-~XKUP)ZL{CcdiArCi;i zgq|VGLeJ7mDZM;Py4d+u*IV)4;A#4>4azymfM)NLtlk9RI#DNY84x%*f3%v6suLN z7Trd@%9K7lC|-`c5lS0@DkJ6b2uDb~`Ug^cv9>KKKwKu{_Q6f@X;@i|FhCr$wGHhn-F@XfE@v+!mFlbo8Gm?s+6!j;o$HFp>)+K<9E^ zRJh__y%&=BI?d}AiMj~p?ulaeguEEZj}boJ<-y1n28C1N$AnAe%c$H{m#OP4XTp^; zBPLljCYP8HR$v;xhHTodpu>ay=Os`Fbf~trFz)=(hORDYg#&`z?zNE!}!W*Q3)0_D;FjBcQ!E$<+~#jR2-g(JkK3 z(H7r^5w}$tw$f3awq!(aQ*0a3o-4LpvF*fOv?SjS#dZ*@d6fmm&Y)Nyms=y|WhCzo zaB76lBOG@G(qpd(dx_%7h#$E%=d0$2iUeFm48a)?z!a0_x zUeI|~w1J)Xf)eh67j#kl7ZG%c*_X{zo-TVqS46l%^lD%P5w0=QdO_Fa<4B&2!nYF) zaYNiUNT`pio;MY}NtRpQq0wdE8*j698Wb+-x$(2Z9W~Wm`6lwtjherg++*q5*cI=q zD?af4jUEK;@N7i%f75m*;8h$~zUN-ud$j=K-YXlhlQ`9hlh`rFkW3uMOeQpr9g@j5 zNhWbJ#@S~QWs;aoCX-n*7Q5Jm*~DrA0>okvyUb>>n8jca27}CEi^U+bSq98*c)$PY zzLLP?P3HUF^VddQr%s)&?yg&1efm`WE-+vf*ocLZ7@N|mg`XX0Z!LTQju@cQepaeM zA-F8TWdzk~P*;??!fjq3W?z-yD%qPt0aPO#tq8VC|C&6&B{V`~bO~5vSgT!#v42@I9IFjQNj!hX85-^QyxGL_E zn;1?em}G_~OMfz20FBrtu~%k>rYK_y$*H0fS;n*kC?gxLCSV=GGYUFMfJU6!4C&86 zf2IMArn6UJhM*bIHIkeyIuT?e`q2a^BN>`2)p<%b(v8A# zFN+3OCW2<^m)`iXh&qMA-OgI?g%_mNIcSYS)Xv#;vNMZ$ctuZgY-9`wJ`zZ2nG^k zSTnR)8JkJIlz?hv8Cw!=i(TNY2?$7_i-J4#vKiVY{cY$2HDY_2y&5yLLm4|rz9OWN zW$aA2on~m4utzYB!aGI%K^M^k!2_Q!hkdnu4=yDF|7QUW0}#(~-!VjX3kes#hV z9Za~o1eBxhFpfwbPJlTAV$>715mY0(9BjQQx>2UoQK=nEKsj>9s6)LD_ErL}5sahv zJu}HWE^bk#@Cg+@nE-bL>Ie^j3ZFL0(W&s;0Xm{HRf&r#5jtKH#967s0T48b{~8zl+mh)o%QjYb+mHq zNTafY-xMq(YBWarW6&BaiV-X$x=}L($%t;0RbutBIqjt zv9Z97=yMSiD|CFGQuDAlMA=xJFTs4WOC-Qzr394-MuirE9?=6MC=D$xlwcu(iLwaz zh#@W(%R-9)kQl>~T^?Elf5d1PK}BeBsRT|KzO8;p+$&Dbk+!}LyJ(7=&TW}zr(*sZ>{7iZjZr{AS3BTx>|fBSB-Q{Houg$ zAq$CT1aBGZEVYiz^P5gjRfk%pAS;Fl_&yhHu-$vZ?$VhD_6rI0_UZ zsei83>BCB5tEFV~A>m%Jlro*=KFvmhqy$-Me|Gm9Axb?3QFwtBbYH05- z9VWN&K}ilGIoICb)m|_qFrU=ua5f|*?}$ie8Fmt}1gg(5fs-bO#;l{!t;PPXTv4_2u( z>NQB#h*bio#A0~asyJ*V2FWBrE3qk~Ia=vVwy~Aey1*)72(A(%Wwb6CJm~^^m(37d zB}T&}0V%O51HRIG)~|q9x-7hsdb%7COEOfXxXdEvRQ58W(slHE=cq<~l+lL_xJqow zFr<G*rwLuMjl2FaN@pqbz~F`5>gN$&&Tm_RtqvZ}X- z)FeYtn&{-wnro1z+3dk)!q7Zrgls18Ovt&B$g zl4Vrq09}%yH6e#7Y;b6=mG)XJ7sX|Dos#RYwLV8grrn!K$&WDLMjs# z0LHYB%Mnyyzc@|6nbdVj8dLy46D1C0D)73jzm7R0HGyfu4}LHQQWJP4{Jg5bVW}LZ z0(Gjukr2y-pH~$)YDA`^=pNIL11wX0V+G(U9m|1bqzXtHQ~(?k45#Cn3P5Y3yQDm% zrjt3MH2pP{CIOmGBYayGXpl++6*#8~z+?j8^bVP4Q~_X2fSS&dJf{l0D>hT+3IJt- z+H~G3AZbv63s&MnrUDmb{UYUIH(g?_Cg$BT>uLi=ZqN^pl_;g7Q!R z%ZY(6f{ONfd=JRg+P1|K7ITDwxoWk8lpI77&=NQ&{vD8;d3>V{ZHdm4?4h|Zmcqw3 zj3vgwRC#WDJ-+9*7i0-PE|Q4}x}1_+e_}#dB?iS5g`&h(lAFBo^=hQ1E*e@1$kL6E zZ#YY%!Nk-K)iZdEctB89RRJw@akF9XA))68$Hs8JZY5Q>mGxDwL{Fs)E#PrQj|xfTn75HCteIu3sG$ zaEacO`T<#Do6X*HxvDs{C3;hmK$h5)QJD)~N!{{-T!2illhlCdP0bKgC3;h|penH~ zWDlwmhQKP(o02rDl4Vp0sARpVA(x&H0XWOe5GW;jQ}n?qu`OqBl^Fu5L~lwGq!ODl zs&m08S#K)p68xmFH|4NvrM(tGbyVjGM2X&%A~2NJ=Z25(7ZKjetrIngeiY@ps9zTq zH3G#4ak@X4|Atddz)7zyA?V^6g?Np|?ow!OZgjISq7p~G* z;3`p-TEUedEA<4V#Gv3c+9)s9HfY$Z{C&CLlwczDgr8&|XZB0OKiO6oCH%A;5kS)G zxloj7rFFT0lz=D^WuRjn5;`fkb)C_@7!edJk%o3Y2 zE{e0H#sy{x64NC$F0RXEGX!6WK`B~5l-Mq__nsMotAwY3yd2GB`;^TJkYSS7E&p-48_7b!?e16Uw0kA?2@L{^I5 zOTz%HMB#zhs^#Nj45SjtLD(8BrV{9-pb@JXf>)x46+EVGCf2gPt@ui`Ekb98<+)+Z z?*5>#N(hJNeHpA0?Po+DWF`1WEXAA$Nr@gXEHE<9{~$0WVU7#6@PO~?~fiRc}uO5^gtDzQ3V zo)}7#^O6lVn5F=DB|eK$pezrzk~c-`sz6nmk{4o?NCHcOtyGQG#@ma|%_{H1wx^KE(fEmLY4so8CPC)!d;mT*hB39tZdiLHvg6=byaz$oDi zAPHHCO&P26U@Yk;17!&e(+gJh_8yQW46Tv=8no8tfmnjLg!9%6fmPxI7fEPJY{~$w zw85_1#yk*AfR%JQNythvv|0L_(K3<}q$Sp0GDDD*_^L(n2>7xx!36HI= zC_zL6OMwaaD*q7pqO zT37R+C;?fb$23FNlyQxu@sup1s3kNd>oHpbUIM8U-ZkpqoA+RVO8g?Tbe?^b?8EXC zeIbIh41MvCl^B%*yBT5~&5*W2EHNw<#V3o7Y(Pt&_4I%&F)F2~F_zqbmPs2d`sZ#F zZi&8=tiggTc|#O#0A-0N0!*B{jX^zxr6GbW;h1fyuB$}3B_xfe1Wbu`05Rzqagz## zPa0+CGulv0qgw_IWsIf9pfFYn(2{Vy zI1-~v)et-qy&*L$zMUGDiJ1f-iBYE2aH?{rlAIO9*I;13bUkOd$R>dQVr(_lLQ+ntRV;_dO=i;i{#B~$(tD*B;ZK%5mu^(3#77u z8ctLV7YdRD4T;{*YPeXri%Bjq5YkfBa9K+rNN|sM1sCZ^hXr}GNZ_NOhLDd)Ek|L6 z6l@Rd(MnTYW&ER6nHqvSVg!jQkfRq`detp?bz9RC-VvB1`Zv{ZomAFQ!%Ec<;?Y_W zkLcs9h8vW-f#k-PZevStlWMqGq$A))^lJhfsfJsOjI<@JA*>@fNn25Xb%c)gwh3?~ zRe(oGw`XctqXX2SV8|nQM|!v0DdZ8jBNmry*^LN(agLxJ>HL$z9g*5i<{mxTYsESO zVHCXE!8s!HH8Kr!6ch@25qL*@iDE^G+S>yGw~X5Q`4hJD0GezJiaz1cE+w>v7~QL0?e zgk}Z~w~Kv5pN9l!K@{eZzbodwCD~gPJstv&f}d;S*ZLDWeK<#KCn#yd?{JdfDbbJa z3E%B*U?6pefy7;hchn&25ev_Ye57|fe$!`l#IqdnoG3=HkNn!(03RVdkMM%HM_`Y_ z5%wk7fqDc2=`wb%FpGsT_!YsGXe7{&(7Z~q_f$1ie`1uD7Dc`-p{<30&$cK9cKeq!LLd+Ay)7mFOp_4%)vJHSgaF&+cus z8>mRQH%T4WYCDjR=nF}mRBE7714*4$3Pci}Axrx-+{WW&FeD)yoRSTpE<=S!f||q} z(^k4X!<8|dWQjqJlrf?eOeBpio@oU^2{2MHAcu~GA*e`%Q=v6lcqGtB%rP}XW0f(M zBq$^{WsDQ-NI#nKq9;K?`m7DeCzv6)N4$5V1p|p~0(+Cq(6h>TmSmZskCZW`70e?U znkq^Xydw2>aKO7NA|< zHk^&MP%xy-5fp#P>Jl7vk3HS`LH$oi`-FZFd8*z?B^y~u;Sb`p=ttm^)KLX*s34LWB!M&6N|+=fs5r}-+cID6 zq0C8mhGRoaI@=0RQa5~|tzad=Nz(1f5h#h&c~maw_Ffb#2|yATiw72~WB^IxyFaTS zO}s4-fJh>U3PIUz3Zhc#3Xrz)+x(K-1WY0j0Arw%-fIOXiCYIC30~55gv?uMAt+Lj zxJbGkEyPA*pxL@hWUlUcAEo-Vez?WF+jt`NRjMzk`O1Tl#Bh^T(UjJ( zkHVgo3jyv3za@gwJXxKoI>{pvh1ka!VC3-l4&0`?ZS z_Uj8g*hhS?C%M!ZN6J_x?vYNaN|+=7NWo=(-VDJ$;%huwD_R3Rf{BD9(+sUrMic8u z8DNZFFhkWs9KkyZF7p~Q1n-D060LQD9YI0DcWH)T9T81RGGHAkW1~n$s?jDPj^G`I zmznx+miA@@yv=i-z>oOePLVAlABFErTP55|vl~Khd=LM6V37FWj^v0OKigXSNAlnx zA=^&Tn%01jpd%%3bgu8vZ^)QP0FrJTfbA3=Df4uKj|4_ekGt5;>Dcf8Yaox*P35@i*6z#(NVJO+4_P&a6p0s2sRb)^M{bcV3i-` z)&f4WgGt&aOcK4Pn$E%2;E|vm1sx4&BvOaSJgieVB0v&QB>f6GJb)zpm}J67I@%gG z5^bhlP$bYu^qeXI0_iP*kb;imgbJLXO;nU`R~chbC3vT~Njak{1nmqzvFkm#jO1 zeFPurvQ?`+{398X}VmrzG)RlW1!BEdWg+Ib%s zAh}-OeDwRW95JvXwm$6j&sU9r8qxESEEe6!G6srkBtrm>AR-M4DIKj1kl*=uR468^#JbQ!2I*w4)na?KlCAGOZTa5i|5d*b(3kB|#ib%!hG=Yce0W zkzN~Ez(k~?OsO)dP00su1lq{BMu0W*ff_+Cdf!+N)pAw4oUD}v{>%0~X}ToSkyNt` z6f@50IFa0of;UrHGdbn@T)#fot5C8De>5XM7=EhMF8WS!j`Wb3lh1qk+ePoH#E;ZUZreSa`Z|&I(Fb8Ex-Iqs23%l~6D*;vd3T!3p?-pGNq*70iN?f%)x@uu}TUsE(5^hlr z{+fycRf4g!mxDuUDiBu*uK}6+^Sd!Q)!<48I7wnH3q1Hqbh%`{A&?SqCCQ5lygJG2 zkRQwkq7=xHDF33Cp+2PiL-}1ICF<}F=lhi{MN?w*N|`qel_bE@(R}}6S~Mj_uO#aQ zQ!?@rG^Mw!i5$-dxC9_67(bmbL!gxCe$hW=s3ZZFPMaZ6O2q$@Y!FPz$Vsq!|Na;#ZJn+myHrz37is7 zUXupzWuvXcXi4Q+8q>zFZ7Glv16Hh*S}n&ZIgTV8rBZQ}KrdxHOK8JX;!8Z)6Gc-B zJxh}$oJ2Lxv83KT{42r|flNq@k^5{Le`_nzl?Yy<=oAAhJ=-SPY+w^!vHdAwml)on zHciMSuUr@$W-CvZc)D0IsX#D8f*AXIQ3}2iJus=ODLDb!_%*G(=Oud{%gfuqT!O{K zh_;RDu~Hc;Nv;xW$ud?8rKD#IOeK&^FIWZmeq@H$NPi9bYeT3KBU&>AMTzf6WWY;e zt7Z>|(gthpP?Xk*q7?i9H<=;ONpzuTy(DxJJS7IPW@xK2wvserl4Srx+Gd78CT$Tl zDfj`_m?4-+yv?HzHHoc;y`5%gmoj#dd{w+8%K(|Q+YCWU+9_BPhSbAzA!?;vi=d{J zF4${IzDD7_;v$7VKp08;ZukLmwfE~*9WX4?ey&t=MO7<>gASJP#WA8#6zbYkU5;0FCArrAF<8m8-NosVEl3*)c z2^-y2GxVPH-$TpDNKljbx@3lml4KM?JLn}Kl4bN35lMY)pCs@kph!WZ>zh=K`bobZ z`u)W^a(&qwkW`J}AmK438E}x4VH_kG8XR(vf<`yQ41qV|^ATELkk~{&8g7PQAo1mh zBn%`rWf=cRhTt7RN*ZZ|7aARh1%kx57C~`KRSyCZ^G_)P4QWg=Y;?v!YToO&Y#A)d z0~e_Yi$q77#634&$P0Cj3?n8axf2r&o&*jF{Lv)fN$`*+2#J*3ZXfZVm5nlykpLjE zeoB%N#1w&*Fu{b6sanl+n(>jQCBNjAOB>V?NTlg#&ye;Ev4}!-;~{Cn2SlWbq^1PV zQVFm}fRScX0u<7mWb0sjNew|F%>|^y{C;Z5;zsjA6cPhhl>>SN5~(uzE2u|Ym<62M z;#4NYVQ~uj5w(MO1O;hP^6TJ_C02(K?<`jSchVTOjsRjH1TXqs%(X zSFKZRU=^(sv53{9lCX|Ksu8sYXaw45qv5WC+H6X)9Mfj8jSN%-)QC5GJ7f8TTiSB! zXtFTs7Fh;f1nX!kwSscQ%RQPCKOB0GVI6IwLi_t$T#|0mc5bQvVGrmLZctQ9Q{k#6 zJ0#hm!YTEGr6~^x67Eo%Bo7WgRwezi6ci+6yExXXwDC5gAQ2Ku5(pA#B>pvEQn0EG z`=5;NvO|MLQlichuPJd)v}AxP1t4iJ;4EV!K}Z@29tngJ{G%tm13Ej{NT8Bl=PtgX z>c3&Us}^2e5~)E-P=j` z4#z(u6K9j|Owygj#JQw97n*oC>E7is92u<3a9(N`lJ0!cU7(Fz)OEec%^20#%15QV zOFGVF=xa%LnO1&9Wv(XO6}mf2zn66HVcJ?b%GZ*9oteH)@0WDflF32#J1^q)x}p@w zQ+BuuDX&+`^-2ji(Ay*xDX&k;vEL{4nAcZ5dcTzGn{xe9J-z-^$MsKzzjMkCNVx%& zg?gNF#i?*1t${kkKn^j)3=T=J1po zZki=J@`#ipX9P!nCgrH`GpUDLL|CcadYP0rQbtCl+{lz0mBJ;UqnbbQK(-Yzrrs`Ot)Yj?`A z?P70_8LCxAEy>qXj!hYRQ*N)_t9>cAC*}6(Ug7fJZ-x#?{{ULArySdU_TDfVD&9Zfm5BkUbBL-oq2C;3*&u_@zt${jaD zCsOWM%ALrx9xlX5X`e*UfafpYJEi0)ikwcl)2VRq@^;F-oeBmoes$7okWK?S@8~9+ zNx64Y?u=cns-$;TnP|9Mbw#)3jm+~u!s#nG}lGjs?O&LXLSCrOI zuvgl>M|YXlPcZ5APRmdqE$iMVO{h}ZvGr!JUs{IxE2BTj0cppkjN-H_PHO}>Fzx!K z-N2B`HOLGNmi}P0hNKb@?Mlqhh_oA;b|Yj+&utF-jI^IY z!231T8>!?-ii}FTQR(CfdkTz}a5SgEAcIS^iH}K=j6t%v4R8Kq)BfT%Ua4fI6djj# zY-7{OW-rj(w()8HnUHpD<0;wvjb~!oP2`FNZ#~q#RPm^RCl9Hr9D(RIgSx&vCr``0lba7DZs0nu^Cz-{UvBEO*^*5>@71xRm!L$`Fz^3 zDPwusEw>xGBJGx?-HOZ&0dnJN;z7w_fRw=oPBCFGGb-J;0ej)8%NH6rNm0JyE zpkAZ4HEFj7;aUmTB0QH&c(7((a|SwA?B@8z>YVqa{i1xY zRtNck zy}{lgGjv!Phe;kuJ2qv!nRaj5y*iq9htlq-?iJm^F*8&z{d%>W2lCzNr5 zK{ z7C5%S><#0)TpMq=GKP~ZDR6Ac7*XIxP+2}N6}Vvq?wNw%evLFkqoh9ytH(B46jJFA%PrBGU`p^n&oi?hFZM6z~}re+cgo zZM>P1%tT^e8Y&9>t@++8$!1Y>c7bE7D7dNno>Rb$3W?cbR=plA*xL)ZJh*?;oB;s1!-vZL7<~$f_tfv>u(#f@NT1GJ?v^V0oTQTP08xH2(!8}9swUuotIXUZHL zGhY-5ID9gXFNx*iCPu(~#qK2ybtWbjXji{lSlO7nBcOz~3%}x7RX(7qe9(QseXytZ zA@0~+a6#{S49rZ#12W@WPtUW@j$Z2)LES&10*2@7>D}$_#sP%t$FTmf2cv)VtE`G2 zC;9OQqyH7w=M%aRfAoyf_t~t6{D-`IQMk9z`=tA%`$VQTpXAqlA2*#)$f-`(f# zf5PjC?FSq*zMftu-T*uC0_exR5YzXRzub=YDU5yU!RYV9qkUROdn%yy1#91b28GWQ zLhF0beY*M4K+6pF9#V+HHv&{&5AR|3@S|QAJL4{#@n;8oIWlq|VeLcOu<)r^sCmr>^O4+YI82yo7Z72OTl3#l;`m^v@ zApGu){>b|V(rJ-i>eA3f^**e>ypxx_sxyq~zAct35r#6NRC^M2aW{nY!pPl)wD zV)-8nJ$N(VW`5y*e#0gHr7H4GuMnNW&t_@qgI}@xt3vOe-9NiuhNsO5{u=48AB=YQ zH{0p_hU9M^jB-is_wrj=>Fzy+^r?W?+>_m&h2HPn@7!-QR_HeV1@XTWLZbP7rgs{0 z_umV|CNNik!lHjN*jZa78Jv|g{@=mGJ_InUIY^FLTJ(U3xke~^*^-&9L(c|P_$z1 z1FQ?9wcS9cilQ}2Cfaucq!kmIury5GMG`h43pr*1CycodKir}$?&o=qeaD<#nS?>= zJZ9`_|0C>wgo#|*|0w$(eYnN!I6uX^*}wbY7IP%Go)0KWoS)ps{Y_Di&dzCdY@CdhcWeVq1VNAkqG3d%6;B_&V63xa=gD$ zxi6sfg+h9;uA-0nD%TBBH^Yod^hNhYm3x%VG|R7&?!!Fd77hsP`ojUn->E z>K=|lzwEvoj6oZNc)r3l5_t40H;zue>b{y8n|zJ?_I39)_x0|eMzbf>;@4g?18e&0b z6>zbng#v%-wfrr;ntOr?ue!B8*zdt~SKZDhh41|#f*%&D({fK1dO!B-V{})skd7r0 zy_Ig~&)tvR&x70fk1F?1DE(8Rby@UYzf?Kvr3&exex(kL9!i(@*Y20@*Q#~W`;E%c z7a0@FJ>`B===D^&-y!;4A)U{^NJQtOa{uajx_?!<9PbY*_irfuTOlB~tZk|Or~$_!w^*f`;8@BS6cHRNs~H?C zGs{lHCa_lzF~Ni%aZy)qs02e1)P{m#5)4DIKNJAPib2NWvwnfh5hyHlcvy7-U!3=@S zV%cpnCPhGHS%%TFWC&CijIC$Q5UUE9p()azg8o#2v0NE@P_d{{xiZR0PB$QyGG>U2 zB||d}nKe^}^aDh@LfRDwD$MFEC1+7&wh&g~%f%cC=P;r@64N8@NKACB7VE=1mX zj!86xmPs~`qM)(Zo{J=p>G|Mq&4Q6dRwY>rB2cotg(|d2vPCkHg?kA$*1|{#$I`Q6 zsdAT6Vp#+-7GNye!ShDPdLH3&5wUbWD~zPIB5Wvtv6e(KWGr;V$XYG#l~jRat%^X$ zQk$Ym)jB{m3Tq;6O~hLpVV2#xh+7*0iA6}5YWSj5UZjR~s^NwRd@Q$t%#B>;xVK5U zn@DbsK*554MGdz^Kw!Bo2)9PuRy*v=5x`l1u7ak#%~B!f3LWj$2y>+x?hyJ4-c?w` zS9E|^P}nKz6~HT^;$Drwyb3v2)Nqef_E5ufsv*3q-Hp5}YPeUqdoi#t;`Xsfm1=lE z_^Kwzl@1HO>a~b_BdlSar9#-%>k-3V9TMzHs)r-)pkP;F4Ugym!dtx=fp_H{jWEmZ zm@%)8A*|Omd`l{CQN!XGH9Q`1^#We8h^t-0lgbs>>Qn^K6`U(-__o2W-bUCEaSe9Z zcLc_QbQN5~GnP7o!dWT6y~6JydX;MUZp0ydH&es&I>31pE=0gtc^4xZ0$z#$y#jbe zWI?1GQ3XO?iF8H7NQ!br>MEJ(5>`}a-?2S z)^ZDbk=_#YMzA;(^pT(sf~rse^(yB2B3KzyEL6X!U&9*N684YM*G1J#pKIfkBtwy`kMd9&27@XpE*8BUmO){$ z4ZE2^1riJQNE99x*sB|#wj;&E$~`Cq-dh0llILz_^+$%vGURrbMI1f0&hh~g4uy@ z1zdpS>L@5H%P_8$>{J^HtJ)w$^!i-&HPT*#KHo21hqOMt`#5FRQ{M?RzR!*H#P{X zn5(DebF+Nsy%qIqnQ0)|arA*$vAxCK$*8QKQpPEgK&;r5@pb^OBIH1fEBIBaR(tOq zGjvA!XV5w;A{96*dP_6(t}@;wc|PjclyO1aDz%u40$aI@*7B0xB{Otc`j^qVLdO>c zVTCu?41uMB7eMk_6fl)#0IRxghKfM1&{YZ!Lrd$GrBmyjg?{fWMt!1H0er#(Y!|Md zGWwD1FE*8B3=phJH7d?>eZ{K6ki9x&304(@QuW!a$7OVoQiCWvSdgml{lU0Z$)g&E zG`>L$RRbDk)T*I3F^GnXV3ldZ)}}@XZRJK}b@!ghqKS{#iU2 zW+*j-dKRnyo0)}+sY0R(YBDPeo|S>FW@oA1bCeO#tQ`2NnW#LM1j1_jkSb;I60`OHWREKrST!-d2HFQ|7)OwEcqHt9LTxFJf+#p(2 zrWI_=q7`fsyb5L&BSc;5mqe|CUll$|o3#SmCtGB93##C&wr1UJj+HhohurhH@aN63 z>iMKI{^|H%xGxO*&E6a^?&eo&j#~e7sC$s>rYoGhj)^_|-+`CvMu5F*@(C3sZs`+( zd7W{&EV62?~d8{#;{V}@Jr)&l2Ht^n&T{QBmep+LlSYmFu|nett} ziAbRg%OL8tVV{uG3wrY=@G0u05b)tX?b31;75KIBz!hHT-R^FesI6?ROQUk zQ;3h}V-kJbeO%=};Xdj<5w!4oRIZsX`yNo~D%Sy19SU*r-0u)|bRAXh0bJS-P)@xe zI-Stzlv&oyJlcggd_EO+g!p`J>IVOcYyKJc8TVH=4()JiXBzQmX~PdeOMj?4ZlDNW zpwGF7d&&!>ZZD1>DCYi}nZ9vBfnzAMpn6x7x|)OA z{Y~)Gkq=qO^lpQ_M;J-tI{%`Bncf3O(W8%gkC|WhG5osSDsT^d$?M+a*Tp&Hb#Ljq zdtdQ4#c>M7+}{@B*8ZyZHM~DxY4Yn*7jtK$^bM5oXY(3xQJ$fjJ=&a=`Gpuc$Ne34 zR^LYH+l-qtXZ0PORdwhn!qE}+i=q(JWA3{~Pft@vbXMThy(e3`C%qr}RdMgfSpIRLXC7_$Q}?4A&gy5X3rasn z>F2}=NB!bxGyk^xS=c$naT~?lFPPdD_xIRY;pcY0B(NiMR=AQF7RCc_H{X7uen}LM zQp_Oh?$@rc>8x@fuK#AR_uJsCo^ro+PxbJ6x}J}Ezq7OY9cT5M3VD~j-#4Arzq)_* ze&5pl9_La;yqR;!`*-|Df4JeSa5E9K635RJbN`uHllQ+!z*7H{`;+^R#Khr12P!y0 zd`~!|`bT=;dvXIJkK%l?(=3i~o_!+~-oOZecKlCG=Q=pz220Wsmz41ArExFxIq^X{ zf~N^IyTI#1A~&3OiPaY65vtw@d1Rt~MN|%_7%nGff15X{B&;o6Tpd>C|6c9M9R`R+K#TiAi3Fkg0v>J}ZPsZe)VqC&uaXd|k0CeYi z@L3Aa6#O@QV<%&Q03TJ%O-9fV!wrt33PM~2Ku(M?cv%F8mU*V8M7l97iQuooSEWHp z4$dm2rg4OFjiPW?mCIkHo|nVpv0^Af=1j5N@lr7$!8e7sDsWCw0)N^O)^DtO4? zvBMBZ^t!Dp3u2JMp%35OLPto;#IS633J z6ke>?BLslUZ50f{>*T4*lsYK2L*}bGL}d=^VEC%o#A&yKH4VRlCQoCo^ySBb5JzL) zq}Gk#s02q5Y*p(%rqnUoNKKfHGm95Dvdy`Se(3I!a~XZyUA)7gzdz=0isADjd4dYz z_Bt8C=S7=7EyovhcV6ODOWaxbzZ$|e{f-K}Ljyfx<g3Ohk9y;z;81Vp9h0uItvO zi+~YFaCim7qFy+vc#G3pUvs28Z*hFZiQ&g0qaUw>{f*$>i#dpM`4 z5#A}fMUrF8FQtsJa!;vESW({K_ONNDYvzpW{BF3 zhl*a(q=ADAN7Yo}+SPY*#L!d4Yniz1c&YGSh5+ImQN603THh{yL#E@;&3A+8`eluVcCbxAIP9Zo$h2WPjNzu(h!Q z+svP}EmHx!OW-jvXC5jXRBD1artnm~f^?_6PPn9Yio&isC*_hN6}Y50=RKiINg`3b3VZ5uaDu* zLUI(z$p}M|V^N=;E%av*@MzfeV>i2&fwMF7(EM7*DcQXD$9;9O(T#XYcky({YVVGl zizF^C++7X0mfw-jir&9@2Oc`RK&)g19r#&Q?<^OhGK&rwpH>XV7J%R|JM@8ZB|`y@ zFg_UQN=pBNQWwy#&hqDG$ty;G$|boZFPFIOEVf~&_A3Z+hOr#GulN@qJMZoL_wKBx(LG%fQK1Vs17Z zUPI;ZqC2F;f^4TpMRTMT#OcMiPLk&GvWziub*Ud6E4n*AFBQze?}cV5n&YhCjZQAh zz`-@q3gYa-J2puL)d5pK{96nu13}o~nhPvxjy$cuh7*j=74!JLrew+AWxg6bUF=RX zFBt0qTdEwb>Ez?{;yb7y>#FTcLELd#@xu&$Fcq>`0Z6)34S`?KED2^Im>3FXOE4Qj zSttlSV62EQZyB!Jd*lJ5&*eaPz}V)phxdyL-{k&M288y7Ru?>A^RsY)1($rW>@1O; zB`7Tw#@#Ju5APRtZgPJqW4RdZIww3}%d&8R1$Th1g?mgcFS{Web-m22N1#stFDmgOmdxXoJR;|+SnYJRG&fzxd-zx0FFubV z`6@qJ9AI0`0~W&v#`ge&vv1By+6UssK_QKtW!1%R#|L&}x3Ent_ssBadln{ZLYRAZ zVD2R0x92yYfO4nsA<@{~!CMr@adueOu94?{ zcjygV+Ug^>@&-1=r2Zv-!RAq0e=crye`exEZRD07I=)ig%0ss)(kyl>@X%F9ZtbC~ z(z7D;(CvxPwK18t#rr&TRgu5ILr1xrJ#>`&pFMPx^SH`hGY=i*{$~#z#m@gFJtn{g#@2|#bUO) zH~Bj_JkgT)c_Mi0h&&BGMB=7%UoXT<_YL>e(96>*aMR)CiTG#iH2w~yzr)LuISo8^ zIC&zTdFq1bQJi${JB0*u{k{8ElW!-6pYFSZz3&BQ^tk(;d%TB2x*qj@U}y9L&gi=p z^3ZutG@X&$b5FE%PY}LU+B|&A`?346d-8@e`iW|S(oZ@3PlNDLTy*Ydg?Q+G?tT)U zQGVc}!)p`quiF_}Y!^P8%o*XW!(|ik%uDy#EG~WXSg&6+ol%aWz6N{04$kN|IO=}W zgNU!+KI%PXXY>?j^v@OY&UwFUIwQH}e%I3d&ilPz93k*4=Ki(N`-A%fZn=MRzrW#( z{-~Ou^zSJBd(iziivs&&ct&jq2E#pPG3CQb^f>qv=|2TA<<`{j)ZH5`3M0aTk1j== ztt;XsvsVPyocr&lvuY&=U2lAFeImh$^;K{f&bA(k3+smuu7AW%ufKe7z45^fkZTUl zT+=xQUb$j?aMXSf?p})wi{Y5#TFfVRjBhJ4PYHf|qH89I?4^P>q2WPZY4{;n zfN!Cf*R2IlhCHXW-F@1%*5_m;&elZsnuuGZ^^o!lc_g$k5h-$t^pw!Nca}nUHo~tU zMX0|fA~EHtfUh)s&AH8|Rk4<|yWPIuNYu`?yN6Lsdv}{_uX?oi?w}Y`0^OZ_zHuMW zw1p3<*oP2($Ufgl^kMg54St;apmVBc((@?x5p+Jn*BkdyJt^*1v5z78n0>vG=o9V} zDt3>%+ufsLIo`b#`y@J_Zmj(`c*4aUEX!==w~wKWIfGdB*En1zsOKo8M=K1U$$=em0jv)jcz?7H++ z0I!BexrFe>^~L6o{$%^n{td~$(JYHN12{bv;`%9cMcOs!o_%)xLY@VhnGm?l%{%mn z-_U}uHgWgG!r*z}G#}w@4GcqDUy`k-2<(l!?m-v*Wp;x{gZon0`g3_m#NFRM82yD` zVHNr+Nv0_Lb7l6P(7kxh3CW zYC`Zl&_(|)E$Mrd{9d6x&?rN3z2DVs_?Gg2KpxW&)b0KQyWup1Zzs>`glLgH5cbf_ ziNNRnB*`Z=b0Rq24^_(_c|St>qoAkzF}pvuZ#eFUjX(6Cx}Rq5($BaxKX*TKKQHwD zkz2~l1ow~cA5-#s`~`-7LGZ8p<=x?suxlid`QoZC{Y^hu{Xkne?oN)Eh<0@erhM>; zmH%@Hw$En1hlQ z{NMT}9n4yY{x?01%^o1n{x<)-)9W&^Gn&vsA!((d>#LeHYQ%}dR z)AYZ}#!2%H8+r6k`c|#FXJa=D`OUWPK;C@TL+fVsYF_7C)$5~X^Ut3r=Vj-3t80*N zW#50U1=Lm7lJoqtWz~ywAMBjC-Z$tqKVRJoolh3m;pXcmJ>56Wd(&U;t^JKZoon_o z^G%vx1L*|US5Jth>-v$f4!YjW^>1~}?*3osYNpAbYbR=JYLB;S6Yayg={l*tt@yuP zC{sI7S*{D$xapngFWJ{zK($5LRQXI=_O-9;qkEUhlb+<6znT5u*g>9Tx(CwHJyN>4 z>_eng-<#{NV@Y4-be`J3m0sqUnZIfinfhdosq*?iQ;&>o)l=uA-_Na%pE=h*ckOh{ zKX;G3Ti9gAk=0FqZ*?xgb-VRF)3N@i{LD3w{r}s!>3-^Z>N=<%|C{~Hy}0>zeDiOk zfa|L3-~4xUJF-k)q-(D08{DHC`$*ME=b(J*7XDsu{O#SUuj998=OUYb&bH>j>e{r; zJWpEq4V}FRezVB0yr_!?PaNDoHr16dkIw!=dq~F|PE8(Ho&Eit87f9Cp2sEbbokA8 zbtbGQ>R|TP-l1oYRB{pIGA8tE?_f|Ebu9}S59Ya6JeP99RTo-lXqZ`}D&L0s`St*7 zgFcJD)pWLnzHk%QbjEWa#{ny>1j{B7+~d+;_B2`eHin3|^;C2Z!yOlBw+)v-Vvy+C zhU*`-$0{Smt(~Q_wKML7J2Zgg45&kAhKzT*4?M<@Q6t6=x)1gA?&67hm*zDR^uzy- z|Cst^kJMH%&dKWKq5l!*1*6BP`>3jIYYjv@&_CChJnd!QzGhzaQSbR)R zW`>nf_X)i0o&EC83@)RJ`?=TM>wS{Z%zeyqy-%Y`P5Qb&^Ub0oL&=Vxjkb^^_+s+_ zdJiB$uM-wJb%`wQ%pif&be+3Img#Bk;`|l+1O~0_%;@ml1^{Mnud3Q@O9Y?(VA^ zxzXCt`5HR-5=!onjjxjkya{1Q^EVNElh~fle&5av6QjW}@mov+(-4tKV7Lsp5O@hP z!Is~{gYZ3FR3t&5<>Tl*9$eJ#W8wQ9e;{t;4%zrO62ZK%@S^@Zf`7+7)7ig^ z8DdfQAD~J)`TMMI_)pUR$(Nx{enTgG1ko^r$NGl)PD~byYO+|3`i7^af=?hC`UL!% zJLCq4@_ui#!+Mzy;A!`CV;|91E`fz|2{0#uPw+=NVWz)Q{dqgC>y+su>N?>cAgefn zF9008{p|1$;4~N*`Ldh?5s#3aL5kYx88`>R{(_Q2BYwRVz%#%$G?HAPw*WZ^_!7-= z_Vd%Co9N`>B`CpscXVZtF(P+32Ce|y1EV;`=m;IiXaW~#wpJE@z?jG< zSqu$l0NY?E*arEs%4!ea3W0LYL!@L_nan+ zEmEWo;(1hfzQTH#L)L?k9nO70#8oO*hm|FCm#mOaXjiXa|rK|p$*axCYmX5=SB24nW4?f*i6zwdn{v%0(;aGZjCS*jc}c?Gvp** zmNpa5vTEAN>NX|AnP=N0$v5q7w!K#q@k=@>*oQCIShiRni~k|mhpozLhQ=;w>_USW zA2yxDZkunWOO9KolP04@iS&Vgqo5wE9pOD}ra_+mmUQw9yuH%gi{;`@{-6S?J4kvs<-or7D%y3srXV&P#G$=PVxig@|9? z&buhtMT%ZhR1d*H$z!_rT(Qg#@Uo`0EmA~~rnIqO-viAuuWB~jB83O>U0b0}5Ab39 zno`%eUbPSKqq(j)q0CB`MT{0*5ns^vE2~%3^-_Oizxv+F(v-M5+32HGA3m-hdBCrE zfZ!pLefc;}{7}Cr!9zSIi5u##&>@ydi(+h`LWkVI@Z&mhLs90wK{B)QgOwbNDse$W zqD*t-N=~aOd9KYcK-w{0IH?&jakYa}vIHa&31rv=X zSmFUi4k>mh3>>lyB8N(8Y0U4?%r_>s1>VN-W{7AZ#S5`Wxk803fM}8#B1A|*LWP>- z#-_-kvM7N<`VCLf6gZ-U^n*$&QivK&lm0Zc$}KKvDtpt-&RBVuHL?94xL<=lB3IP{_ zP$2~i5zyUERu?I`h$4$MS1t5aE}_%Sghw&4ajC975kj>c6(W?05K=hMGR=9*EI>~- zAw$uo*=?HH_SZK?3c(zc$_rfUQ4i3<6R%LJH5)d}@ zawbrQU?I(61 zs;DDE0)`GCd|krV5mt4?$Qw$%!7pTG$6y3eCqW(A)uG^^1P2kU@5nFukWz=x-_+61 zQvi|XzjcXh)d7wub%fM5rHCWaY`89w8l{LK(tNmwTfEYdOLI)AW2AN}k65Cp)7-dS z9r=}NZd_Z7dx?scw(Nz+- zKwQwRCdc_D9f=J>XDB*^2Mx<2Hi+L7VL`+Ql^`6UhzG)fo*_h}uf-`6?L)B8NSlZz z=~Y`>m=GaKjIt0Mj1nkB=ScZ6iW4G8h<=UOps|_`r{JJ&EE#F>KjXuo9cIB14K#sF z3lL&voL;utGbPS1YNyB`I!`h!9>`|Mm4S5bs5l@xPBNxi(2u6hO;aS0`ml0Mmm~Zq z=vAkiAp(KuJkcT$$YO!$Jk8K7Wy~Uja38km>=EZP#|$yetwKRPGL%ECk7`7e51l7k zgz&H__J>F_YP3KZ3rJd=k7W?(v&alB&SEMYQ9T&aAQWu^e&{n16t$DprAjWP@G`~p zB#+oT2eCi&okWaOc2t*A*->-g7^WgAYsas3d6r+sSXHtW6bvgL3}7(m0>1Vu6o~L2R*_V#i1;BI z=yfYWsHFl=7-=P#wLd?0w{>`q5PX!?nst`y)@hn+Cp^OtGPi8qbWt_@#r?{0M9J1W;EO*+f)!uvC3^ho< z0j+nk9NXLMoiRgam2sBjxh%(~jCZr#yVhpUXSp+3?z}brq<6s#U6lSsv@T^iwhQcC zHbYmGafRenrvC;R?`667%+R$gcR9;lGebGvbu&~XFJe)QV1SroyH3g8F`Zf;W%MDV zFDoSk8U2We#N;v6BP`#JYPWN{%2lfay9h79=NB zGKT8_TO)}AXe>2KYNH99BnF+zjM2fyG8cysfXu;eo{d0(QdPbbg_9k4_J02nZ=3|< zVobD=U}-mRyaeMBoRgq`H*bOj6A)aK;OR%ai4sgiaJ2&#Cn+@vi$(Vb7AH$Ene4t2 zVDVWAo<&eB0T#<7C_^wr0xV9EUxuL~b63jwS8Cskz!E6MJLyL1Hn1i6|e*a_# zZ?2Max$w^snn@shOmW)tS*a%G<|D0)(HAUWZgR{mi0N6A^cGrbA(@MGuNE^eDCQPZ zDRuixEOQB&OIe^MEX2hr>gp}ik(P1b8r1|rl>}7?c7=lHC3qe|Z75hS!Eyxq@7EF_ zD`HGXUMbm14zMbw`ma`UHOUtUSeySQJEX5*e10l1e+w-gkWn2 zMtYl-+8kphOql(W1TT@jD->*zU<-m;>2FnPEBgC8_?tR-FDv;nhu#)*+hX2!t+P}^ zG(9tq5bn@be}&~9SpLSYIx~+{U}ub(FdeA>E~R#1?Wj_(D)lO8+aC7zGNY!0w@(@SNbVq=hdI7M++6!&_?xj?<+ zu2o|jzF_`2KRtOF&oU*;C_E+Zro_YH;ZzBy#`$Q}K|lKS9lU9hOhdvD-k!(6eXRur_%LvDVAHCnphL|(81Yrfs2D3zZJbCGchvY2f&1SK5RuIN!^M~Y| zxSK=tOYo3n=|UzS#ob(1OpkZ><|#QJo*8J~cu%jA<tEw!()Wi<{d>c3} zlw={2vJQSx2XB#*i>T{j=w@+mNt_0-l;zXmnIT-J`c$!KI@c_iH}pKX2}ovYDkcp+ zgDtlb%dG*?!^-B0I0V8Dw6&E=tt9n~x{g&!ts*r_sntrYCN)N>7nFK|s+D%2uc}s6 z)=0F5nyh6dbyiqsZ(UsVUaySxBwu9x^dMsc@JOx@4u-f}#{%jYQfIJ9b~a0WGwLrv z^tn@646!$B5SkGq2?AJSbs9CvJoxG2_ynnpw9 z9RUv6Solp9J_?{B?v7IUmdS5^K!fRgaeDAIz|H5ItV@vq*;!|r=p4$=O}M!U@3{n5Y+k}WmvHkC&QI|4 zt4z5030G+)a=ZnWT0rK)gkuZj?Y%__zp|~jSmqX!xg_D(7O}T9q2nx5#xjys3CE_4 z=M(OEyE@AgZfU|T5AW9sGqh6rE74k&aBM5sTWyA3P{s=+s}qh*8EX=5jTu^-aH|t; zZFs-dnW6R4Uys&{3CFgMy$xn)qcS#<+>~%^%GjK6o6XQm3AZ8PUdr4r>c2(WTM$&X z)p>4Jaw|n%PPms7;nQ!MgxhGpwfE`iS9_ngU6SoccD3b~U6b&4we@yLwu7RtBph2! zB6#{Wz6kErjog)RY&&IZXw!?}s|oiiKb7Daw>yE!Jqfov;r1l(xGMQt!qq0+YY9BA z3AZ<)XB@uPgxl9xYQNMDB;5XlJ3t*?*TLRMIJVa_2W#s3!rm+C)g}Du+r5LT`9Vq@ zN;tMU_6{fX&HRWmj*xsa;n-mECwT~D~8YV>ro@Y{#aI5!r4;wtC=avfZ$3_l#Am zy*JVfjgtN-v_@w;wvp_OF+*dOF_vU$wqsMqxNJ8rTRrgj|HIbXf5)`7S;Nkk`u<2& zrM|;l4)@_aqeplD@;+nq{f_bU?q_t5^Ni~Q5);GHh)bmdlH?jS|k#XK+6 zQLmR*Pj3;=_J1U1b_?0fgEAxT%!r!?xeZj@~lFKakF38epYRAfws@}-5PN~li;8Wv;(a9^%`-=g+n};qiaO7iyb}eLbD5p zU4NJ(a*w)j#D$}-KTV4ZEiSGRW1Ey?E*x|5cX`zMaThlnzq6SWE}S6PDzKH{!0!|} zDeoi)KPbv67fz9KTHt9?h6J{`&_?i#z%vAgRqw34v#dAryVL)>IVblV$Jy>eyUUz+ z@l?6s!g&`i5WJ{ScDQiSg$_F>`FL7YxWp8f{14Udl-o(_Wfv~HOqWiTD=u`oaE0Ji z)xYM#RTr+=Q-!a>RiT^hm+Dlx&iVASxgqQZ`8QplU1zDsCG}eh+@gEi1)2hPT)1OT zm0lNmT{MR4<6(w$d zz=kij-C*5Wq|J8oXwGqCjywPEPpKQT-6(ZygClhG-JiL(#$2KLsF2&tv%ow`%$G!& z8)YO9*|&-oxG~?21y(}nfJGPD8ViN`91dm?JB>vYD0icrzc}vZqPE11#cnJixYW%} zQiU5!-KbC%Ho44t%NShl25l5iniX!R{%2Duxk?6Cxat_6j=m|`Rrk3;Yjl6N0Pfe3 zY;uFPpEbW;01vovz@1+J4{B~5a^s*IhunXdX1RymXm;Z;r`i!Wj<~f+N}8i;@F=Bf ze|L5-=9bH}2x%cw_q$X7yE!KJ7<+WwjpJ_n@xj{P%?Y6=IN~upR`a|9=jmQ>gQmbm zH!gCVTp`_PccX(n)zrIWg*wIWBsw?E&sROxJ~emz&iv>wfy(W z>vi)1SEAf?<1Q)p1l}X1T;P2-?i1`2*hjEJ^&ZH3zw|3IhEQ(_F%I| zC)gGbHhQqdb|Y+RtF)CvmTr!cuwFsf-Tc1(k`#v^DpCCMLF-mc~UM2yg*8uz>6MSB-kOagJ8Sr zU6OZ+^*W|GUehVB)ARQqx>Vt^yvy{i%IlKXMX!6B(>%>wk$Z(1x$41HkGbaIa?$O< zH4nN8UiYxZ4G*q+aD!FGv89`;aFZ?dOyhFV<8f+#G`ED^BLB7rv>ul3c%QJ@!*M_Fi$;r z%#u6Xi&m_{wFin>oiU?^XOupms?0L=6g+<7c_F_dc!ZZcIhl6ZGmVD`1s!r zeGy=x7YoN)U!>;By;$T$IdvAR(@VUdEzWoPuNyCnE%jpQSmg>;UgkxG7t2_Axhk*l zg0}p>R#wM(?XL8q(wqD3^Oat#q}XJ$%8OOr-}#N))#~YLFW&^4mfM4rO*2&jtJuIA zFV=X?TDrfJVAcs=M{?P;98xW$nn?LH=O?pX-g+;edOwYyaoOMnYi^*-MlaXt8ZS0_ zQR5xm8E>-QCI&Za5L>+1?8O!if=|7lW@;r=%ivZowtCGrFBk6ZUTpJXJHa~D*x^N; z7dvbXKIK~#c6#~L`)R7bOYSaG>%FM=n%!QWsSRH2_M(B{9@TI3VviS%tfDh@uPW?i z&+Bxi?(;g;Kbif)_LJY_1#KTo2fR{0sK7zGhrFOE(CkGs6U+B)yg1;+VcV^wIbwy5 zihq=>7B6T=SUP5fjw^7S?g=kw3bcCB>eYq)q!-7$IBB0Z9X6+|&}s2clhx)0?G#IA ztk78n&eA>S1x^rTQT&T!b$CI$z|tiv)Tuxx-OFCk6zKAz z%L-lb;*u9vB&2E1L|hg7DuL>sl(1`ZudzzE7v0|6h5fo0*S(_`_OUbdh7Q0@FK9RN z^EUSxmmV*A#-{r%P50Yg-16c!&(u3|d%d{hMK90PyI$PYnM$pDUfdh2bzihTFYbHM z$Id)ZV-LNcJ;*oq%^CJc-G0PS>9qX!bV{e0exm&H+&`JeUa;>(ul@Mw4h{r=2;<1@#l{q7epzEG~QOfQ6red_jfN?|&` zDLKOjTCtv*VM%qCG*jW31c#^Q+bppKE}^r0V0o7BKg?_&+nnRWY#-+M{xqdNwpr@4 zUqbr*$Kk1Fu8(hdRsSzD&xg5ubg{3(%$M$bA8#K`)zULE)s*Ep3w$W^VF5V{#aT$s zh~==ei*lTD9~SvgPR?R+7L!vv%{O+xYl#m_d<|x)VoMq8n#!?P_)tM`nZRWPyQi|x z%jGTi@rpi`J>>V8RtQ+ZaBmK%6i`W^Zz@;BmGV}S-#^vqnrc?bUB%?B_F=WpRQb5B zt?{AChcyJ(>M*bKVXY7Ae51F7t5u=e_xB$LZTbU^$AWF7Q@*2K~wE7Yt&Gu^{J&=ff0!x1ZV)Q3Yp9JNAj(_)2=iGPf&<37+@ zSUO>aS`}!ed(sD*0;ha9Wra@raKeYvb|Q0KV`?#xr4OK3wwQimk~8u8Mk$}jq1%V+1aJ8MjVr1TH+;C6Ypch4 zJq+IRfi{Zs*JIf7kLHf#?l9Qv1MN0TcYO}qxu?KAy7zscDbVLbpUu<*AMX0_Ab0E@ zTA@ecKO(E&2iilH9$TR&3Ou3v)CZaZ13nB`p=Ulk_TgFX*gdyGFT{UA)}Rlx=PbRn zLa!8fMfbH2GzEry7_vfde0b@@oBXk3|KE!JmcTHdGy0=>C-)tz4Er$b%iVi=FYrC* zat9X*F7i{&2O%Gb@HbC>FduzR)lX(b*a)kB@`3iz_uUJi&pO?{_(1#2nqR*FD)yt; zpWkmz_fv9)AJhGq;s3+Tlw0D*Og~Eef0|i-%<_+3#b*04d#u(R(MtW8<3}kUP&C)i z#^(7!o9oXt_SaQRqu}a3Uvn!kd01L=2otFD{=0ZOfj~cRA`B6^x zVzscu58C4Y+5%%s{a89yxk8nf`BCA=GFD!$$}9Y!E&s2T#}?X3KPvqVW~Dl|($9UQ z7TQ&QtRlEt;A(>9T4<}}Rr$G<)Vj(~Kdce3hT+N_uvWlY0##aQ*U4K)e)UwRY^tf2 zTg{HG_hUV`qJA#48~xbe$3}uR>g^^!YW-s(!XSrs<>xq-Cxx5(W>YONo&ezVoj zg?5`CTm9HZaJ%Z)`LW%PI#yBr9jdT{?bm6c-RXA*V`i7IUF6sMLEFjFZohihpg;rN zJ$}#>X!N6z$sK3*`mx)Oy|!CPv(F0c7k@ulO@7e!v2?%+9aP{T-9vuR6lnIN*{_B6 zupbBfILu$?)_ZS9tk6;MkCN5m2ki(;$E?tC1&-4_;Rj8DRzF&;&`Cdz`Ek+;xy>mn zbXxq=WVQK0JH^r&D|A+Yvvkk-K~tdJk9I3`-j6eWoR^T@Ku$Fm#J)gaFs6iElzWj? zI{fJH=N8&aeq8eB7TW&bOs6=Vj!NVPnvsvr?Sx8m)v~@`~0BYW9flk?L1WAA>BuQ&=lzRqu*xdu^$ioc$_<4 zPpr^W@t=}4;0NsqOV6y(a|NE$ec=a9fk8h8txK951{KWw*9*ZprU`ZhNVtc8ExRiQ*zl|+` z6~Zb4|1$3OZ|uP`dCTbC`Au&f-~P=k7qUF?_a9z`oL3>ULhcIourh$kK<=&Ml>%2% zx0ki1@~>GXWEGL25YL9y0cR*=s)SXs>Y4y(s{^A6W{1}Xur|lW?MzA`7 zYJ%$pt|!>6{%w%Af&FXwjf?Q||7|u3*vN2e4yX}OL!j+9F2bASZ6d$@H>c@0vsvzD zc412ZTLPvwz(sg#0JQ;ZCAdvV-yXoW0JgL1N@blY)N%A(w*C&eJ4oFbz|Mf#72qOV zAHc2v>Iv>v{e}Q`2hhMODd0xe?&ByBWZZ0B#cO(UG|oz%4d7`il2<06hWR z4rmb;I{Fg#j;(P=s6)|SiT1Mo-2mtnrs{_4FVh-E>n2x{U89ld&2+8UKY^-YzPL8mQjR;i6u zR9S6%T_v}Q?wTN02f@E9gJIsHEgqK^d#%E28D1B}x?uRZ0;XDEHM?1EvsV6_SubQg zk>&z^yJJJpX)Z7ug>7WjnjmN!a#%D-_bKExvwGR?x8nYhD2&MreivC+f}mYy>8cgFroc72-9gY4xE{oHD|91>t3lk5kd|U5;-=U) z3ABZjupYTRta2-eTfy8?d^?ES!LWU&bZpAq(Uj{Af_CS-DR(!ByJJ)Cp61y7AnpZm zpHr?+?t>uuf_T6w_b`ZunsQFSJW|V#C^b06Icq-#(J!Q*$j}t+I`~D}$3*x8mQ&0V zg`Tk2)xS9Wg|nw}pR(5jLC_utM?ZX@o5<}`%rg<5k?=f-=RxyAogWNhkQ4c(LN7Tn z+cmpi1@VgDYk{u`c4&4F$s6L#>YBng8Qui(B8WE>dmH2h;$0ALgLr3G2Dcfu-Y|pj z)y9V)-Uso)P9=8Zql7*(I19$5WWOa%;&smdoo?me48Hn z`w#t79M+#9cSeZc4GLjq$drV*J((3kNeHtD&JMB0oDgP*Fo#uCzf=`U`9qKcQ+Q6y z4e96S<_Vie{`?SVb6F}2NqvC=3+OHkfu_Ks5Eg}WPLzjG7DBo0R?;lCLQBM7Le|m{ zXp32@utLieSVnhw2s8y&gs>u{bD}bYiV!M8qvym*E3``dRb;IWfwq#RDl4=`fi-m3 zhCowbT?p%}P<04ZAyiu-w^?t6Hi*B0tc@Yi*0WS&g*GX$iSFhQXbNlzVT%>24WTB4 zS_x@(F%etE-b$eM7bR?)+-|!EE zUqRG|v}A@*AHwd?AErU>o)8*B*c1BGG=|U^8hr(^H-x=owf2d&KZJcD>}O}1)YyR# zXifRX{(1$W6Q=Jsb1;O16v&!GA>QvkL|Kl}Mw&xhk`9N^9KvC$9SLz}9}VG12uJC* zaL7~nR5Nodgch5n<4VGD=A`l${iNRsxhKeM4S{wnG`t#gtQT9vu8NlJ41vY=$c~ADs-0Z74u6x{DoM#=h$9*2(&Zbws$^+ z^R~SUA*XqYxhV2Qk~>1^2$@SE&@P0+FGk-lwFB$44Uv3Vj|M}>>%ILLB1Wrtq^XLen$tnHw4-pwqvKyUk5q2zSU1Lccp)q74E6R{SfYj zaGw?Ukftf7Pr*J0AB4DGJq+PN2oKq{aZdFV^GLx*4EBdW8^tT9n8(5&6Mqr{&EiD# zZ}}8nv!5#dl*>%*6mF;nQlJ1aCS{xDhZL!iB5>4O#esK7_M zBO%Zf_!Pn?JC{F)@F9fHHU(kx#R?UN$uH*b;7$*N_J#ZzVfARH0y7yX34^A7mFJ`M6-%6?CDNeub_%qI=u;V+!pl#1}Jh!~<3S(FJcOL)xFzUne&F(Naz5JPwhA?)A(GdPmvnPx_ z;eR)cVSC@EG0bJRK3r?|hOswn_J#j?kl_9>_6y;AReWnI>tX2x<|vHHRt;6{9;-ZY2nxhCp*t=HjW87 zMr3HR#zocRM7X`0Y)&Y2f~x$wV(%}eRcj16_}QEe<219;mdnPO zFxtX6!)%-l<1DjrZZsR`l#SEOMtd0TVRQbgY+MNAf)Ku;6*d>cPXA=np|(5N_N6c` zg-vG|w2R+n$KE^H8M4{v7Sc_m zFQ1L;MEC)>$>xSaH>f)Ji!=C(xheN1ReQpqUH>*4x5Bu^Y`D$sFm5v&cXHY24dYH2 zz0AhlFzzxN_eQgEPuaN5Y}^mye%SPVm5m2sJP^Y7!oucZ*y)~Z9;xj|Y`Z^X7v z7-lx!k7nb&vhjx5_z=d2u=)5^Hb%l25yH2{!sZiyF=?{-thPV1?Jr!H!=|_Zv`^n= zV|s!5P4WyDFr$Fid48F4yqPI?CVw!aqyV((1-b9*{%B??GOOVK`LShk?l%r*3z@u6@WG;ugc$FDZqR_rg?M&SXRJAYe50Z3b26W zg#}#t78QWDkga@omFGUKT(ad1HBENrF45Lwv5>_?nr)Z3b6P@#H`gYcr3x)&m-_jA z3zw;oTftVA6@a!R*QMN2w!8q#*{#WDMFCc@kTjLzS5mprDmP9xD+{o);2*}ptSWH6 z{9slWU{wKD7yN0eG>kO`s4Bpkg8wjU<*qBh+5)U&w7S49e$@rq{RPZ=>8_`4-DGE# z9m5788;I0T)`A!?8wG3}rPNwVjgT5k;aj72k=jIvzmqrFY*uVD$JxygCXA=`-5=Cik*2){@_+0-diN7Y`J)9W%j+QyP_Mx#DkfHMU+OY%A8uDt-XbNSqT zztR0J-RD*1LIG&!^Hp-`zF2^ZV=Z;4rAr0qD8MDAyHoDv0(2JOGSl5vfG(SEzNe?2 zU!hdRWap$!_f;WRiB#s(eT@k36iznX3UzbT_57~ycynFubq?f40ch90P4~?LZlrn& zaI*kCaxF@T35b3-E;Gr%L5O0ccP2sr)PZoQcmQ z`;4Ko$<76vn&(2E6DiN1LNAE$cIjj@sL-HN<8ta<=B3=1Y~@t}XfM7wg&bpEEB=~F zgTFdgt@eW!3H*()l;B5ik7TE8<4E}1~34N!5>$`Tt1!BGz_MXfSOrXnr zl>3qHNC7?+fPaT&V-GI=RN%C@%xAGall7$lv`;J*N2E4A!oc(hUkF4%Q($HUGb1`b zN+KwZpd_M~Sp2G3L_)L0pH2Rp2xzldDz!p$6_`tRUIa7+=0`9;qO+$gg3<`eBDtME zn_VFG0s<{AsV4@{d0x&AN#5<;zc|I)Zf(RI~Z@5vTW8 zvq7~tu=d6XHbzWM1hn;$Z??UgY|A8X7I`yU?ilZMj5k~4ZeiWp2xyyfEpt3u71^rP z{F>YLZWFSNNKbw|+lfpg!PF^KN7e4}PB))OAa@5d2x!fDRes?t zf|jwla!ixscm&5HI8O2jO|jMpXeX4%1$xoeqb1#b!pCDyO77fj*gugrat9hi*BX+#p<&?WjzubOy{BZ=dhxv4jGfyIT!j-DhX5y)6PnAR~$kTct zf`Q0CjGJJd@fh)DPXx~*c+QT!i13!*U<5BB7>xXfd8ux{ir{4guNZwDv75u!?D{xo zycv@25Ib7=t5a=TdL!fwkt(*t=6^MBg}k+GbGxXuh|Rx?;GJ!L*f#$@g5e0>vw;t4 z?_&fXBKXMWN92BrV1(;9qo3J4KHJ8BF<&J7g-wTI!%7e|Q{N4XQQjhFLUAY^(} z1NY^3qBDq1BVcAKIFrF*ms9LAC2~umyiXJbZALWr(&860Tanq+EzPe+bA-$xQkFkL zr9^lyjAEs2ewA&0brh?jSj`5i)ZUsXs-jrK=GV$y z7sc8r)-hVm=24w%e7%I%v#G&JPO}~61|b`W4B5s9Cz*{xHrmF=j!+G;Y0QM#q~In7 z2l=p%@n*B!&CKPNC}=hLT>fZk6{)3e|D@ddx>d+lA_Hv6?%K8y;q`Bl*{;xbst%8L zhR2&axph?C5e02qUX||&M6olPzZUP(KW-H&Xuj9;~DE5q1 zZdB#HQ8Y%emzDRa^8P4j`~KU?P3ltb~ey_3x8C{A;R@C8B?r#O+b=8VW^nApmYQyDU6<({SZ zxhQCD(eP_&swb@89!0yYem=^d#kdf~`6w=sd@<_$FVhjl#V9(W|2M7K{Pq8d2mf{4 zFRq_mF4s@|PyhRI^q;Z6Ka7?B`@(paT?^QWOHo{6I({~t>T4&**)u73d%k;;xh(K9 z`_!f5btQ_fD6Wt*&gqzBt}1wy!E4cf<8N|DaV?5&j(wcdHpyI9@H&GxqM(i9EtAYm z;Wvr*L_xDS5&hdViMQu(DSj);CyYeRZ;Jz@8#em@G@U6%TyPSYgwK!FEzA4Wk_;87HhIC4ITEQ-D;`t7jzrD!YkMEoaY zJ&l6)n56+L^h|+gbe~5-Q{Y7uFL?C%#%vS=Q4HD?gw0DU^h*3!WWA1p_L8L`EA&Qz zH+0`dK~vye6z{Cia1=vP3|k?$d2fY2i2s4Ck5SOxvovCbJ}K~t?&m0I3Vey;ixn!4 zVI+#;SZI+-R=2VF;0NlG0{N9ZpS* zH_|r6P!q!@ayFA}N4G_ztBrv`E%B`}Y_(n97IP}yX1g@E6R(SbCdQ5!Xxr@QHe2dW zk#-WObgRxTxx2`$kAb!&7Jg$##|Q1kuzTzfH|Ut|iJ>8eJtQ}3X6%iD*2vL*cOCGL z&#yH5V%SHGpUr+Xv!B$O{7O?j$utRUqTB(=9gN{X3qmFIOUVf5e1Jhcr*suC|)|rv#fj+OVy!gC6+a&1FMerlIU(-^y;bsB z<+akQ(n@nu-pLq0Ft3&7RLp7enA5^eQ@t$)+9{UKa9T|=XB9Y0_goA#1=?e1=g9fR z>ln_&aNZ7!PwlZn7sbCwR!0o93oKo-LY)e9(!Cr5O@Xc$y6l0w62qk!uGkcW%~dOO zP5f(Qb;m%v%F=Z!bVGp~bZ^E$Q=lh?9xHS!hU+ohvO-*LtvE(!7k}rCn(}=9OB0MX6!q zT(hU2wHirWyfbK6schEyN&bMj%S&WWkh=N z<5^CGw>pejq0kDd)_a_KkExVfN!68wpe_G)JgW+^isOl!)uZF7D#YqSRB=3O3bm!e znnJ#c``N6O%38M9VVpOki?@(&zU5IKcw|-P^Lm}1|Vguzi7CIfq)TmMo zJF}?}n+nb5LeMtm(vyGjwS^?UA7xCf*tHzVpxYUAo2_!Uvhub<(6;3B6Excu+0MSS z8RvuTU7e6RBJKJ7>>$EhC&uhlXeU*N-OezVbh*2zT3-m-j&Jj`yAZoMpqObG9nhXa zG!$YF2h>>Tv>3BjwfD02zC!FPH2VudYy9?jH`$g+J|OY|wp{FSiaq9_+=Hxps1UTK z{CGU3S&?S;zR5UqE40TxEaWhe=KOe$5aF9b#vE1XC{;^6PN~PV$ZetOu|m*}3M z$3h%0L{b0Kk?2NHQe{9z$z zVmvAYt&i=DVsFn|avziVq!6^bg}J>KFBXM(%4FM}hZ#_YpA}-D5YI?{ zUdXG-i$c(zb9mqHPJYSnP6i7xNR6M(OEvS7)C!Y(9rUYtCF~WkVK|3vzFrG?O=JX4 zu`xq(huGYkLcA%oclw86-U@xI0qA@6?+V2n7B)=gdnUqbKFIw*_hTX67lMD^$;R&V zj}$unUh_$;Ph@>A1Z{++FIKHM&OmXTAO4AhrofCiX2iAGm>I{HLd=Yh-s$I)5-BuG z{8{ABj)PXh(ww-uRjNQK-MMkl6qpysytt0T{5a;sF+ZNav>Q_zN+W|8nk#LMFx|Kd2x<5+C_(+{&m!6ghXjsF`z_!Gy{I4abJ(+jgq!DS3C zkApUfcf+g@zJhpV95jm)(Z3zwo^GY$E93mwDLDOB$y-J5iM-YFR?`~*XGoR2syLs< z2=3|DFbO`hR@hpquZx4WhNbGb(*d(yf%SAZ#6eSFV;mc8nrq^yj-$p7D`_@aq0QoN zCTmL^v`sA4TA{59Y^A#`4w?enR2-+{f10*9+TwckSYXbm4X%o4ihw*PNGop1r;h2kl&ZbPtp}+ozd}ieIEs9h}!z zyF*9^k$O0dFqh)gavwiG+y#XEQXK~O5*q5&l^z%5Lj~(b2Io{K9 z1MM+GYHf&8HE`CJYqRi1$QvTH_CUA%vw2H|pMijRr_ek0wAbVGdd#rgVfOTW9JIH& z1Fh*%Va$g(KE(C$ua9wjjL$bC@zD>%ed0PA$EWyzn$K~3j{m#)68}+q#V>Jw#OGtY z))Xhe-};)K;MLyY>*M18&&)_*h7cd7C(O)*Qw39!VA~}L-b+tlR>I6qfHpJn%~p91 zIoz?pl!{!M;CkwD`aNc@+_|hfF9F(|MD9Mk*UVRBeu5V#0r0Sr@8T6P%au-pxJOSE*oN6u`ixXI!(8s@)B(Nkg-z-gxW}_m3r3q9d{?jZ= zU|Hhd&GLlJ#_|NSu_RGzRwS?@VJg4M#>xa%3h|*bVOAxaGMLqBdo|mxN}wuX)+9h% z^=&rR+J2L~PULm$_prwq_Lyq9)vUWd0ovMpHuxPQMK*BkCCJ_L-Y8@vkH1!JAvrDC3r<9LglDnI&G$cUV zmFrUeZtO&}M}$2jG$zoPFniUReF^MKG?@Jg?N9L0D-&}Ev?+lm9#B5lPN4$~^-Sbg z4$3>2_?L0L6Zz4OLka9n;1DI76TAu^PM|q~!-@ZC7m*{@JHp^mwbYWp(F9sJl5tM= zL~~3+#~3`G!107Rk>FQCS`#>tKr6wMs&OiTlL?%%HTV-6s&G2-_aBBPs(zc?Hd4Zaq}!7K zO@Uhp+)8L;bUT3?3EbuZ)Yqi$SfO6=d&#<+0PPM-_pH!;1@6=BOMs@pg9IK}p@#|F zOW>gua+^n1s9*ekvK}Wud&JTcEA&)>r*sDrpegVyfoE3ec>+%ocrGE$F(%@L*e?i_ zdzG+3xr40oGJ%(g+!gy(0==+NXQV8MlZ+uCgC)C&0Aq_ zDfTV_+M7i9k?t3cT?~eG5Z@<28)nU~F9shH_%L>oebh-dlEB9VMiPIRPjWve@F{`M zi9gMk1imD6)#rDNk|<8*PtEB`(q<$vJ&74f-oQ?hP?7{~X7azDn&Zr@Bxa3Oo~_Dr zl9-*u99Aw><+(}FO8;wR|IhhX3Gl0&S~MBmNHI>OB7tf;L;>$qj>#9Qz5*9__8Eu7AK;A zYbSEQyIk?*$-n>5GLcvP74lZlJ1(zMUM0O&o%bu{txWPaUUl}YN;+*mvs&0{s#hgJ zTgB3vq*FW5tW{tw-E~RO6sS(3nj;@))+ezhiS>3^NwdKUZ4`eaSv5(}Hn6nG3T;+k zGu6lhAK$qF4vVs8=$B&4&4i8v_s zK>}?)CG3#gL#)!AL~}BC_8d;)aPqtT?h#FZqe;+?c0#|HP63^xls%SmS;%Ee$>09!BE;JY6U`OHuCSB! zd~%V`T$Ov3oxGL=tt;0_&hc(Vx+zjV(K%pcuM4?Oq#{4`8$|f+lZoc0LN}?}aQ3YCjrPS)ZSXp2}{Vuh9}u#|2^3N!_l zrLfEjEl*)d3d^k!*KI3QDSjncD^sAYU}=>VTCKopx>YIA6j+nO8Y{Fmg;go6m5?SE z6R}S0bp!_a^dY~gmRrp#>r+^t$}L$NQrM9CZpqr1;smHkfwqyE`ubwMDTPf;q=n4p z6c5do6gH=@CH04?mAf^C+7z~?{xsWC*p||gHQsDj%iAS2!D+SUZJm%hB0Uqd_;AVE zL4@0s31+84JK5`gK5EBrcFEnvUe~8U+mRYwvck9Q{^Hy3U+q@M8&aU{{;uPDQrI)r z@kaG@Zwiem>}ALI$=#pAz7+Pe<4q|v*^d8W4yf@1lE7YuX`HQbVk=4c8>Q~Lf@OA0Ni`Q}(^^hMV36pp2E zJoTUEL<%QT|881ScJXaZ@kLfks@9xL;bh93O8xbc^K=TQh49IIDbtp6+9sGYYWob^ zKAXbXlsT6Itu6Jwta~v9T6?bFT-7@i>EPH~CgeVd zdP&G7BCYvsbQ0mGBqx~53SFjZvEM1?6Q|^MQT0j+w9ap{aW#dj%*M~=S_;>gjqY4F zuBXtQ!gXfjMhZ8Wjhmy{xT$PhV>WtH=t-GdUuENV3b%#u>3u14C*?FvFuiKKmu=ro z;cm*@OM!Oh+icvo{U*6j%g)SodKHwEOvN{AeC2@`z)vpOAaW*)OD@ zNMk-5kBRV83lq!}g`QBg-0zh8%~QEgsXCAX?Qvd}H%wA^Ha1V6Yhu1g;du%#NFLPm zewhMokga^T&htEbCD~UD)lP8E+4JnRkk>@&^5@wQ5pHNEm^TW&VV8RSPOsm*mHU>h zyi0*LlHjqI(wLY2cQfC9x(f5toLO_ywWchM zvb0%{{_8wjn8rdOd~9mkEJ{0-6HK|gkzEwiyMmyPN))}>L+Y^+aXJ+rZ4G#eX~jkV0i#xypj zP0d%?*p$X5A$*8x+H6icr4!5+wY`OH*QQaMHe1u6ZT>bJ+ibr{-Y)WX_PgHi)cZ}H z+&b3Xkp^vBJ{v!por>(_*o*V$*)Acwh?L~BQBQ=QG?-v^E3})cO@61zZyMw_P<2ll zwEDa%A7q_IV>*8!+neUZ+?U4QH1?6aKh5dglm=}-TlxMxbD0B@J;2a#k<)3{5&0Y4MxGau2hWBWchMeS3h8rg1c_x7}OP_HFlLX|$wq zEd8fBo^}R{%n8*#!P>29w5H9;G-$`aP4Ow)GRdb!KFyZf{7#$Sw8?E_-7{&>PUVv^ z-keqBEPLNyCk%9bp+KKRE1V!e&Lg%U4;deUx=7QV{RK1u6t^M2abfnS2 zG{?-PG%lrck9g};l}?KHS@FIib2-gTR9708)99kql{9ZiT}|Uk8dvFFBj3K0*qz3; zw02+DrEr~n==M9^ese?a4Ki=0LF>+sj1MMAqi5_e-_l{eoyM&+Zj*dRhq*Tm+8uW0 zyTk1NF~4oTo5o#g{A}*2nR}%67L6{8&SZ06*nMKHMb2HDx;`O&MB0j+_9F8@?gKXW zFpY<4I(#%lk$EKak&>tfru3)9d@SrSnNQMAN6Q7UVnW^AR21_#k#+x-6lw>d~qn&nrk(sUFYzF6KKpVwt zi%hBTQsQ$npjn)V{;e+JqB>9Ud6~ce&{V`R&zCo!-a&a~^2+En7jcFxkhdVi=l2!y z#m2&nGZ-|Bge{_ac?PtFEG^DB)kS8B0!!#F&48vrMFtfarFmHfi!)eehm|zTtU>n`-8PF7{%b?B* z?Z{wj20J9A8O=oO6niIu!JrbhOYSaKsn4K3lY6nTJA>Vs?_O*)XaelXfY!iF*|RXW zmuSqOk%_dB*_+WCox$D=_GSJs`{g!eus?&Q%%A2!1_v^FvEefZ)$&0~RTeq3m+QX! zAt8r|ROJ`5W+J@xP-G4(beO%a3^}XEHcrQ+n3cJg1uHh_`1z z6XSdaw6iwXEtYygqzeS9^+e8#wql2{4$?1Wa4`e^J(dZ-)r%yqrJV|PvhDIBXNk?p zWg(Y|ROEBgMT9$wB6CHdD^zddV-W-9s@$s-zLo*4>)V`kXPlV1o82p9p(G`qK;^XTZNV^C|M00R;!xc4?8b z&Zg*@kY_~7@+o>wgtu*q%nOBHP`x|gbO+3!+(8Pz%z*a%+Z4UZI8)8*3|?jMnw%k$ zZHnGxoS&4Uw;2$7%h0MUxnM0%`pQ2JC+=&&LxeCpt`Y@lm88GwY&ZF@BENG?KZ_cc;tn>ex z1zD73v4EU~B-<1%$~r$QMdeu#D`#kN7K^i5T$f~>;-Fb7*`>rQvY?5vEDPEac1jnw z<+kQ>;w!RPk=1HiX=|=j&6UJgWkC~Tbr!Tr_IVte6SYdDDgwnp-uPT&E3Or`mh^R5 ztjU6Z7iDuNTEbK-Sk1PFvrdyu(Rv~4iHxvd?{sWnfjh&j*{IM)s#gY`%Al!{TSMVZ zSOPV75vUIG9>IQF zu}N4H=?Ajdp9TMJ&F3g!4k~z%Z4YL1pN~HzR(_vgWWthpFBabee+Z zh}~!{ERKZ<6U$y~|m2W^tMIy3|@1YxGUZJ(K=Q7FWhvxhnRx zEUsp8jqGlr;D@8PS=}4ZmL$+>B*WNxjodpmBpS+OPwqXs_p`X01^?cWjqP6hcrL}v1F;^E^)L%s zA4`v{TE7DQbRTCyQ{YJ!PwcFIn#H3mp0bZR!3V6+Gx491^*jsO081~d(4Yc?bYEsc zQ{Yt=uk0axoyChRUfYArfpNH+e;6WA%ul(;%p19HSmkXNZ?n1GD?h%M#k*{S8CG;S z%O8PKzTao@p5O<89|$(;n0%D?G5as$nzFp@z(+xA5x@w;%{kzcfKLQCcYiXU<$Wf< zHS5%8%@?^}*nV*lxTH=m;yvpbMVMZM8AW`Xvxv=d;hkB8k|HHzyqU#i7_*B0{zJR1 zKU?l>Qs)$54!6ifd}DoX5lV|Nm*70rpI?M|MVQYj4i>${-Hsf?M0 z!WNRhs0g$LEO8gX-Yr&OG2JCapeeAl2uq8!I&)W1UW5wUt)y9Ig_euIoU9c^pe0Y$HfyZVTJhJCwXO)XH7s$9Poeb+tf#x7 z2s8yY7Ga|mswqNs5o)ZE+ibEzo5kNu)|MjBHnCJ|g|;fNmF~78&=lBSgzZ+St_Zb7 zsFRRR2R6Gy>>UIuV@lXgxjR{9R}pp<<+i@{MW`+ zXud6L_6XU-gK|9P9FLhsxs6oZTZFwuxd)o>6S$8Vu4ApK{A>0L*-xZZ-v{FBoYt5* zAnX9E9xMW_sVHpUn0HF}JVk{LG1OdyW^RS`O6W)t4j17F!K0cTEk$VIphq7^eXIya zi*T&yfAYZ{LPzFnbA8;_`2UG}5Adjp?hklw+1Jf^h7^(?Lb(5JwzB@Nfj-;E10h=qE+!NCX{>pd)sfIjRU9WBg;lIvznd zj^gQOMd%lf_yxfe5rl&yPDap4Md;TE`Zv@`kr;+4L1f7Yn zKSzC*foGAQ+%qVRtNe{2zX5WIUvW7X;k#5+o@dy3B)t$pIL_HQoVE4hB4^~K2*Pm@ zDFX*szemvTsIFF1^#_lAFGtWH5p+4Cmb}8js}Xc1g04oimDeKZS_BWUPM4I|nd5bE zyb(b+BIKW3aBfD>pAmEuz+24kb_Csq=97AH5xEmVw<73{DmV-srJ#3Jio2>92zifb z-b0DMQ4%GFXVK_BLN|GI_!o!%LI~YrAs=w)0YY~%#E=g;^bmU8FA3+E>GAa|BHLqH zklK5&9_S$)nRx2xVZnL6kUAmQ*+V!uqKk*Rc-Uig^-xC-b@i|#4VT>%q3(>|9aud) zgrggtdMZM_IHDJVy*-43Bl>u#kB2>0Uk~;4P+t#wtT5S65$ezQ{ed;WLpb{3X`mv+ z^SLw#!NDHF!4X3|G(-^^>Y;%i8p?#&(LnxTj6Dp1ennW%;T#-}BqKaD!V`X;2YYfP z14lxQ%u;qUPjVE)Mgg{^r0<$)=0`JRG$1=l`u3ERV>mbll*W2!tVcETTT04t3>^n{ zbGexx?_tad44VMVi5}nFB9dq4X%d2yJv7lnxQ^!|tC^qT@hvSPr!v-5U`_K7jwyKh zUQwIQ5z`Tz;UOFxfrW~hDnn*@=z9;%QW+8^XDdQ;7=I41=6VRnY&^|VgywU^d;}MG z2nR=C5oV#X<022u^Uxx{9ihZx#$F7-QoJ@>L@wdr5+qsbp`{+XnV(crE@SvIz?XYy zxkvusf%977p&vZ7!o%(^Os-U+l|WhLfr(aoXqAUnv&d-f@jqv4n8F$lx(FpLz*+{Z z1z;fte{vm%)_Kr9D2W-W^&DF7!7LOP^9>x@fY7RvV6>4#8xdN=aho`_3F+2x71+$7 z%?PdMxGfyof)HjRNN$C7ipXsY+XgAOdkDu?JniuKpy5uA*oojS58>d5-5%Pl?7zoD zJ3O>U*}u5_Q4!k9_T#9zj^34Md+M|PJ8H_zeKX2hTH^XoSHbuEG2IN0xw!p-sY&=ka`Wi z0#!)f;ou!eeb+-cZh5RRHYB{~p?g`fs2vr5dFZ}}{sQs?R^g$Ca6Is<5T5mMoGc%b zi48WC>4je@=^Ld4YtNAOfOIP9>sC^B;9v(Ye65!{dX*2!gv(`UCoe{a{Hd7EUdHUg zur9#t>h+B)EW2^A8-m@v)YVJ4cIG3?hxG9JrWKYw8LKC-dU**)4?Oi&)cSBl9|Ze) z2?s~?^HM)AJN5ov>g}cekdbTa07YmZ;|~NDwhZAIfTzKV&=8Iog5Xdu;oyj2UK-|Q zr#{?EgS|8ydMIBEB}Opz2mq!PX7NUHa3qq9^3o`8)=*)zmqvT%%P|}~#*2-&yyh_0 zOJe~X$G~v_p5S$f@f;fOttw9QnjHSRYXSo%Ao`pQn8<*M09+~o-@$vmXcF)--G8iv zoXo+=;6KGnQ@nDj7p>tmFHQB*GyuQ%g6(uKeeb2|${6?$8BQ?6i$+zYpUJ_QK%M2K zSzbBYi=o0CFU|JS902EX`gvZO>!o=}!h3M%bAtKcf4>C$%mS}(O<}o^VGDu3$V)gD z;Ayd!rCY)gOAuV@B^(^F%uCBu9xeCMVlORMVilJ^C_*b3e+95sdI`r5cv__ht>%c; z2(IxG4vtvsrL`)L)_G}_m)3C}!OyH$gf=k#24HRU5{~tF+N20==7`M*Zt)Thj@as@ zt%}e#FKzPDHbp2*ZdZhMF#Zl;?er3k?ReUy2<_&G-3adS5)O{|(MvxnLVLZm%S(Ix zr3QxB$JqM-ScA{46_)!sxF1Olc{)bkJ-08I*)taqC%V=L*ZyOzt!y&v*&PDLkF^GN0c#;x`1(c?kzc zocGdsWsD16I_sqicJ^FUgf21uC1CyTB^(#=^oJsJnIkSEc*RRNIO3|8t|~&;y!3~c zuG!ghT@kv$_&0#{rxDij0oI<-2PMLh zN#SbTmDO-`B-Ei!L^wK9aKq7=s5AK+jxGd}U5UC7b){Oe8wa}+;iZP|)K>N&>OtIa zU?5M_Gb>duM(a(~i>Nnb=)=tV65;6MXO`{a5!a8X9}-VfJ;?qndVk<8WM?&iLjw?+ zi!A}ho2>HO5^^A*_;^(bIfw|)gCN>q<~f9DFwqc*Hk4?nE!r@mVW2)!Q6H{Sg2V{I zlLf;*1i-iwb^`_v$*{>#q*DpsO4Wc(VaOCfuoJ{mYbx@tgygr0Xc`EAPxL*h zmaJ0=Ih~=?LGv(wX>x|boXN16z??C!Uh) z8NMFy4MZDAZlr4Hh!Sli+C-Mq*sMaEfr3}@gxpHBg=i~_45x(N@HVEfjnIJc_AUUn zGhjOa*x6*r9UR(0_}AU1&>P;#p`C>G=_%0K#i3mY-F*t`@8-~Mgzj_P9uDn6x(838 zH~b@qenjXY$L;0NUW78amD)$X+lAzQhV6%x2Z(U&!_z_7^C@|VBMu>Wm1Rdg7moM^!4pI{IN~JHNoD_EiGC*fmF*8F zd`b~I&G@H*b%qGXDLkE3gnr|Q-w-@Ugo7i_6P;ItE)bn1x}XS!$%~56CC0x5tlx=n zT*T8KiqK__xQyTxA{-oXmFTJ>bdBf_qHF#V0YhA8?CSvVCrJy*8yviWB!3e9Np>rB zljtVp=ndcEY`;x};}$Fx*c-k>bO(mCdc$|wRoo-GOLPyO120bF!*)dXiT;A;ctG?( zc@EU}hs^pRSZ7Mgl(N0#ii$392TAQEJB5ybP)CW5dm-PRLb4MFJ4uZ2CE@5GvzM8$ zBdLpod|f4VkVRO)Y156PR{!MP_>>Iq7{B=y4gE+oobA4$C> z^#QQ2Uyy#1`YJ*CGk$*vvZau3OCdRcg9Cs$P!f)Qwjgc@Fi6rM={Ln-mSKpb!IFjm zdnijdOcIWv(zal>r?$P+a85Hq(r`&5kY*&a8VT&VCG5okytzLri^FKf9wTYAq%puA z%N)i@!Z9{C2bOQVr14p)CvfVCk|s!+h}4rf^<+snCgo1;yHZh3VQHoSb*iMP@>%%& zOi|FiQq#h}dqxGMj&g4R$@pBFWLg+xl8Dyx;ig6FVd1+tm2@EJh}MC`yKkK2EUlN8 zE@YA`zp!9o6c&Djaotup59MK;yp%WmCq)8q;(y=f=zJ3N*_Y<0{DlA2EX|=XS-=7o zq=JP1I4TR_!jTAHWG_U8{Nf+c+~#-Mw|b7#@T(-?Tr?7-eJ*vLS5i~Z7cbt@0dzZoQl(v;oDV_ ze+n4bl-rUqTFMfnc6?!{kC3GhgTijW@iP|5K1oB%|>AAM@d3xRw>IHhipI%j}4EZ9k%Fv5c=5zTHm8O@HWmziA z@7I(=M0qMl<=e`a^*8Bdcv}`ULsr0t4=Yjys+cS*LC#9hk+-p9QSs$_WljXnY zUmVkb8c;oU1n)3HL&PRaN2Fhr}8_f zlc~{nl&N92jOIJR^?^55bkL~1MjZg{s8L6a744*f978&5grgHYBzMcZD9kQ^ch#t? z#(H#POonvV2uC-KHEge

+^23WjgPmOSx;b08TR`Khl`LGbH@mFvAXw+MyK3ZGZ zSEF7U_0__6Gp6jPAt(E5)K8=Sh#jCIHwS20HEW=Tsx?TXff@~hAcL9hU`U+7Z-%Kd zK18D-+RK_Lhk_BlYd%b)p&AVXt>H|1ghs*9>!$)!yyQR?@jnZhe zR#%SU6k|0SqtRFp7^l%Vh=O!nnZ|20UKwzL0(>MVYUr|0(rBVale7#uStG}~f3MN^cnx1898m)i89=vu*i1z{L(XDRW@|J{quCICjz)-? z10r)- zu=d5RHynuS>m+k0hY|81G7tLtDl**a@g$?Gc%cYd6RsSmy1eKNh+0rUO)-LYOM#Q*^ABqPrq{E%_j+z zB=-Q4<=K z(UPSMl|l7XST8Z3Fj*F|l%uj#E(0Bcm#BQQd>Pa#(92Z8mL*J91f@z;kt!vl8(>mp zFjul@G7`8^=mSJzki=9;xzuPtV|@pnq@i5ik8(aIBUyc6ZmXlEAIb24TmZvTvDvkqN`j6T_vk!V?URFDw)5W{8Rj_ zk*4A6rw5G9tTIjPtsLa6D*9rCNjmG5%f%qY+sIX$q^RNx2@YVJZgNPf#&>q9$C=ld_1L zim>yMXa?Pq-}Ng&PZ3^SDhZiNRux@!_?l99#?HM=9cd%*%sV&OuY2%})yLa#_{N(& zaJ;QaFW_)QrS(f{kR!=UG9F_Q%^HiemCw?%+_kW<@ehd#4WklzE_|Nq8NC3iFJN1# z!nwg-sdPC}J9~7}R=%X#-Ip*5v8a^wP14|&98@kDZmB$cl0{YdB`O;}pXqXE0O%lC z5h5xFRaMlsL2A5GOGZ+pJz$6ewJ0p#Dj~*U=z=tGQ55r5_PC|3tO^TP%@X4k?&!aY zgs&!J=<=F;-4^2wdL5&eR|3Q+2fNBQVG|5s$k$d@1D$FX9mt2#OF2P@dxn65`2xmY-#(x=oURxj%(jKND8 zJr;u(E4nE)Eu#|#FrQJgff&FzC^1%tzGd`Uvbm*F3u;a+K9(&ZY7(`iq_#3ysg!J~ zR7-wtsnm)-r&gcH*1$`_uqLG~k7WW>YC~<9b6cA;hBeGNo!V0RK#XTBdD>AsR_Q;M zN?%}1^Ti;HXENx^!5GU}IRB;p(pRy11;0vPqrm)+zNY_G6?JTsZ+y>UEb|S0n=HRW zY^H`$%Y2MlpkI3}R(}()4m@U=&tnz`MlG>=b#lC@zsWn%3%D65sRho01d+xE)5u=;OMUn;Nc3OgOD!LM#8XVuu3*Wi>q8Y z{SAy&FlfOzWe^Wn5IYRWWeF%)t!D{F@Q`Ib4_PpH8L6p(3jVA^L-t{8g3-ztbTBbc z8LeTEf=V+M{cBEcVw8g97>7(i@`)NoEEt}A#G@3rhH)stsKb+)48|xJuuK7&sce*~ z7)r$0(qgy{Q?0_umC4DI-$`?2=J>Vz^?%UoYLr&;&R&0<%~vW6qmCaokbMB2Br~W ze*>3u8lBVRdD{jTG`awG7d5)bKsTMo*I_ie1RMOW(eJE|8>1-s2g`O@qsu_PqR}53 zT|t4m%CcS4=&DB7Alr3Iw(9}1q4~U_jPs{owwoH=RMOt^LvCwyTSk!3I$OR2dNZoI?TED= zEC68w2CF=X!r#_m&k?q~>jPyM>?zV^SKTTX=m2%o;lZ$flYwqRE7=2YAnCniPi(Nl zOpE@B?4?75-q^{B_dWHtvX3P~p8yfipXv)fk+L7&^Vem6rf$nJ0P8zSx`BS_24O3w zl5Q|w>{rqa!A>LWDS~uEb=Y7Sc5gzc;dlcS8#f`q2o_)@_7PzL2Lg<;1Q-<{z-VmK zR9wdRxs1hYpNh*k>>g5F#$#_0*2KYO0(K1Pa-wa6Nmv61yUAGgW}urU>T(JeXJCV= z*pJETxT(J`r(v~Qm*3l|rel>Gsb*kz5Ch%xy)I|^na|P*$4vAv{eF2iR=goa1v$r$ zGZ$Yn1SD3@!!kFvYw82!d`^v$zPMJ@eUET z5$PYxHJp4cmcOy&jpXaF9aGQprt3L!0~Wopg$R)wu>%uSvkJf_&eF};MFeYY!G26^ zyJVUD)6nDAIr2Kdx)@v4VeyDCFVeYwg>UHrs8tQ&*d;S3n?x?VUv*Jas=z#*dGKg zN3kzRm&fe9KaRbZVD~fL?qQ&tj_L9jEM=p_oWRmOUhshkCs~AFbvlWSmk{BUCBmry z5l&+@8+>Br8EnDS<=KE*^BdN)m2~I)(w)b~OC{X}Y`Ij@UBs(Dc=a99U1A&jjyHQC z)E`*c#;fiS;4%wv1?$;(vj+lPwFI~tAiyScT)do$lY2K6?m5BT=A`1TFp+s~kWic5b# zmjMP1P+SHYG*EFFWDsHpfy-cn1{-pSVR_S`1`P$fVFnFjpqqvma=1amjb3tuK~Q7_ zL>S2;j527XL8BnTXiJ3A0V0esXbkwo%CQEGHRL#^ZrfnILF1Kl6a3OmG-#rdZjwQh zlys8~LhNKnH-&95)u5>mYMMb)44MW3zGnfZ8}z+F(;>hNOMn>x0?agMrs6Wo&thpw*C3 zEjh|H2CXt^jS(-`vbyUGT5HfcsJq^v^-$H{Aa5{egHmjxK^yTGaLh$!VhY%xtt!PfgMhous42HIiya1SH)sb~?1V*Wr{A6x2mhFgNw)>hq%BDMJ&{2bq8E?tsjQ+Dh z#|`=!=)V~BO91i-gH9;jPcrM1U|p6AW?A{GfsxiJ2A+aorwux7$TJ4kdd?a?tjYXl z&{>0i1Hp3!oiXTFgU%V@d)S_w{#kjRlb#2?(i|==FBo*eC?_;|k;S{jLj7*gMT33^ zjXw;!WXQ{`$sYm2T`}m2Dz#TZjD@;p&^1+7uNwr|b(H-Z2HoJKZn|v9Kbh=JgZ?z= zCdl4m8EzR>#WR)+w+*@t8Sr8b%W#*G?-_K*pnE{RZ_r&s{>3uf50K%3K@Y&PsC;P4 zkZDq;$vv?4CIQyo{6u!ZnwW{CZu$%Flbayh$)t`Zbu!z^&e+O9oz1G^X`YyRMt0%o zu2>o~sVkzpnc&yWw7n#9ue(XzK|WUYFs(sZPcu&N#6mBVdYaVB93*?2grkQ!K=uJ~ z%!g~TuSq!in5a-FTIB@(E{yr~H>saV{lRAd^BEApXP`*~!6#A0mvBS z7R#XBQr2!Mv?~fxmYK8+u;mO}4jA^0aL)a}1Xh^zgGno()=D<$$^e6|GHI2{xz(I- zH4g;Vi2qtNEyL_HX&)%Syqo|I@SeD}^9W&`TWck^W<>vrdelh76CCdp`=A=m{A;PaFoiOQF zD07MloHpr{NvA>Jj78u~0D-e6omB*WGwC-|p0kxXZ_;^Cx?s`;2D<5-DKDCI(Ug}M z!_KDPP5NDF^@m@p%O+h`T3s;-z$?(|s!3O&)isl@acVbRGUatY{tc6GTo1^eKTY~m z33L-UY@b^u;qewI-3Eki1GlKEviPTUR`0G!cTBnq_3lAEx)-3_eUt8kR;>JsQ~rgN zYNHbh!2^>XAO>F|WxHiMC=gWF(ro?ILAQQ$w3d{4IKky zXFpaK2jS@Kum?t<-PJ)|kuFwt<3-5sn16H3mpvTR%|SgJAIqK&2;B=aa1QF_Xe)a= zRAuk&$o8Cl9Mne<=JLf-95jG|ZtCZd1N~wQa?l{8!JFEC$Pfn& z0VG@wbr66lvcAH1mJ9FHOE17pw(Ol&E?c?n(mPE{P^=7 zgkxSn_AGGF0wvHw;BfP|$U%5q1WJnmp~b)rhX7n#mpH7^>QVYyzS+6we-4%%j+t1`UZLEE88b-BY4 zH)8lxugjed+Toy`;IoSp?ndtq-904S{-%8am5MA9m0|2OV}~H+DZc&>kIe&`%CJf+R=%8Fb8n_UO2S zjydQ!;6FR)XHda6DI5fxUzma_4`r|-CQtZNokSN;>Gi9FaGXGmJjEb7#ZsznDfdxM zvyNvRblO2@pyOHO7M%^y@;3+l1~Reo9BXhM{XD39!9nL7bOE-#$jL7`=%RxzA^GoC zX8#^Q;137=p$J@d&}E0bVwdi#4!R0T*Bo?>fo{6ukk|dP-*C_kq$w`{RFJarrh{$* z09WTAz;2-=-iD(?nZDy7B)fy$y33;6bI@G}-GeCiEm7_Vi1HUaoD$^$>+%qu3KC>G z>4AeXogd5gP7vter1nng;A|^9I+fe$=*)IIot)Ik$;RmHq|Q#+#c8>nu1@OeoG-gM zsT%{`)Ws>gJE^-<_FxRVMD%o0Pb4lbdtn`ud$_%w)Ej_&vX7Gh>*E|K`#PzwvzP4W zq<);(O+B2lze0!C9N;7z{hiqzzkw|AASVrU(jZ7Y7!uRq0C|TvX$Uw(%Avf`bC{Ec zLCoP!8tSCsPLaCjqt+O09Cz zDk!zuNvk=ro0d7{8oyQ6Itj-bWL_lpnP8fA9b#ym6Q5Oc(t78!nfPH3dDlEo=Cc>` zoz}wsw}sWtWnFD=@L)k6+ca?M--hGN+G~u@25M3x5xhIw+G>N%$5~r#)IRe`UBL_c ze>BN5Km@gbPGRK2XBapR2F`;M`+g}8-X*d@Sn)1nZAr%NAD!~W>eG1A8{2@(=%>3d z$pQcuh}CB@7~8YUiEfIMway-{*4a@)3!_2-0UNYS>-`i0*4r0g`!A-frfFDh$9nrf zthVcfe{q?nx$U=`c->tm{=~fI>(QUt@z;E@3%H-=8^r7II^i3PC8?x(nW>kCWq6(V zyEot!!5IAJFx~~mMqoT(gK*X>OZ+aD1WfG)dYbSi#xsonEI`jDOYHq&5SH9a!|A?2 z&+uwH?}RLk^F`pin2c?}WvFzre2J5l1*mK?*4N812x3Ciyh9EQ6dqHjMZED4D1NfDXOYy!!a{?ldw+FvDhqa z1!EA5iPgUZVk{nGtBU{m&IxP{(y2&7={0(t6%yDqtkWB> zXq_}p@g@RqCQBcNqt$#K8AsJ9E*XpLLaIgfS2Rvh6G%0yif)>ZQ3hw88u>(bj)mzfrq^^mMSaO_>d^{^|LlQjgWVX|yQjR+vD ztFsl~!+zoSI7h=}V_dP)OqL&E_b)&n)5n}lt)_FbFxdpj zJ_XLF$r6j`)FfGc#>tuj)HGQ(qh<_Bw6^Cq$9j5mJI`9m7C>ncV-N@+Q|t}F_IpCf zlpKDRGtYkYafK??pTj_EJw0m&XKN&E9j(8Qh!i}gVBaMkQ}LLJ&DMBCrcxVh%eJ<> zmw>=+eOm-}59^d>?Hu?oPzGp34wSjk(=_hWzWiUoeH^tJ)fyw;jt$(v8R$NQz46AVJgg% zZ$+pO6{#ut+d0LkDB)jMpMX^OdpXVv{;MIpMM3!259K_oih}lEXPB}C;!0w}B)+4l zJSU{J_eAnnay;;u_=*F&PP`9a5HIVL69pw9MiP;1E1!m~oyED=HK=-W8Uj}df zf>ki(SWxo!t|F)u;gdohSjCHUc)uEEvaRAN=)P{`dD3p@9bCp~6(8tt^U?gnt=Vn`pyiF$_!8*0^Le)`IvC#w;?} zAIII=rvQ8^R#$Z+45q?I*~3x71eL@rgD)RSnXq2fQM^6AqOcS;=_*UHHROmTkArH0T?0^ntn!o9Giw{@JXK$+pxb?C z9IDbLZhqYwu9{mXsA9UqG$90^_!zD`jPL5_E9wsSKWE*2&tfNk;LlgV{gE#tBe8Xx zjHHwnl#xmaty-lvO~^>3gtWATuP7-64~Z!WW$Cka8P+2ur2{K1F`?O4l#oG96WSy+ zP0GM?N;CQ*wOy-bl=`2!CRJ5_F?NXYhGX}bP zu{mUD)=Y__l4Z06lh7h5Pb?%~7lzVqV*KKo(9 zHwjCjS)oTg_%`V7QjdyMaNh|%r_C=tHcdCfZCa^&8Ezdx%{Q8 zn@d%mURi*CcUI8?F#Qbho!=`Dety&>4 z9f4}8Y0VPT5SWKRT)Xs))Yb?r&F}VbWoXi*dg5p8TD+H(_(hW%=%akqAoYuS?J`t? z!}{x#HQ;)(1u|M;>BXUJs_1;fwKmj-9M2Ult32o97YgnitG{1mbe+l=6xR=9y zaRGP!K-U7$`U38}^_n+NZ<>~vn1b+5pgxWJ?gDPJe0i>u`wF;aPF6OHT1hQhw!+D^ z>P7)~na808+I&nwx8tn_^%^7Tq=N1+?mdiQ*YBHI&~4U?Z-l40fY-0lAg)GT4lOO{ z)=T5QyrA3JIw?hYz%>QkMp*)IJp&WIRKTr3d=aqifPGDA3iczO%MyGP;D^-nXX^R5 zdQMQ!r$CIp0m9jW?tEXvUA3v5*xd58*9yAxmt{x;)>dIZEa)zXK4xkL3P2WKpKy1$ zADE3gCfuF(Yx*LoSw>5hbQ;2C;TT(`TEfi_cfXj!bd6Hm)IxtXF)glDYI(mWf$b?_Stl$YxYMDGgOPDV0m@h{Emy zjq25J(x_gOYV{g5s#gcFX@J$PQL_;P8^pg=i_6gB!l=zj|Ain3tSsyf%VxE)uscrx zqg{xspU{kD2I|4W?x%BD)2;&XDa})}@opD(=Z$Nbgb~GC32l(BLlNYH3j0t`Qn=*? zbU+cegC)b`up(B`ACQNO{1$kRVIp z^+*68kjl zWo^X&2{9AUJHzAMBJP5<6EW;cqlP?qQby@s)Sb6+T0$GDliG~w4J_(*Hm=v8dP6*q zD(Vh%K+GcS&V7@Lx*c`v)vbZY?~A(g)UDCDc6{9$j5oii+s(}~ij5`s%A)RPA8l#n zq^qSi`wB@<7IhbHnA$F_X(Clmf@RZD6j;scMRPf#fV@%^g78NdLr$k9{s%4_sV5h6 z=XozNEd#wT_V}}lxg8m4?O449#oW&339Zukd08>HyH;vi(to)IG2Vt^ZWp`JM9$ys z2-Ntp4ThHp>;?J%mP3aqkqiD2MAcUvBLq$sb3gZJU9E=3R<_F%$Q^hi)E~R~8SsQV zzj86zps`QDn5k{D0n?vw7pSH@R5ons6Yk;`5vrD$@ddm-sS=9L8bsRjM6QBvckj}J z+{?8may1GzUOdL;mg@q!fls>g_|qde>d8l?N{8H8s;zv|T{4GV0*Hgo;U{zV*B)BG ztTD3abUiauxLPHpe2(I(hn?Ai;2vF=dR~im-PF`J!Zhr*&1Rqm{!M)LltL39&m`#R zY?$T~R;pmUX3aFSSX^!22ThtZ_BE&*U-zvh)oaxBy<5AHi7txiC}AZEMU@k(4#O8# z_c^^rO2TKY5>aF{O%E$yyL@^^TKS4j@sVccSBQQ*hsY;Pr!9^}xdA#diE%9xn|_|1 zw317d5~j;`TNYk?3YvL#LUHyKNRBj>!$hnw!|a|+HM9YtBo}6$XDreE^{QEDw7kVb zqP>-vp_#=ktJSDoqYfNillba>!{rr4h3O8R($}n+F!Q|-MAd3F5~iSCd~8bu2-6S)xWp!4Bh2vUEitTyD*z`)K@(;nyWEGs zKW)m-HvfTAY=G{|Bs}v~%u} z_{{rhi+6k--&>DTyC7G`;xAjw{R4-8!2c<`nftpWEW&e^2sLZh^EG1s659CTY=RQy zEGeu}$v=>xr0pFZoq#2H#*!fJ-G=B`J%WEBVG6U9&EIM%{sI38oByK|F#mEE|Aui5 z>ea5@1ck1V550#5kC3D=Mun!wE>{gR(%}3ZdNC-_|+HN!?vT{FOi&0R?uI_8(^H=R6oT*R$9U0|=p0UktwV(gM?9bX}e{=%) z*>I6%`D*CY!QPLvd{F^k_nhVHEC*)G652k`TfQz7Cg+0fn{8+3FZFioT1=D`<_nJ` zpuBGB@>XpKVo*OdDFwaQ&=S39H*0^Bf*YVRk401bUwSP628pe)@X+v!gf^cgH2qwd zWi8t^NJM8bEiScnYxE#POIprSJrrhu?HbgmYvo&=I=;GD4eS%#V3dC(0VVs(QI_qj ziisA>n!@A49?$kmNq9uhpn^RI@c4u*r{@th+s@@DMSWpb{HGL^;FbQV;5ltyIdJmA zF1L@a+mV3-@Z8v}8(F$luTkyYY^NPqyNk1NkmRRHKgHBRwTv6=v)|BCT9g6}#tCCov(t zU0PzZ#u&YXmba=^Ae-dIR5F&dWUN!e*YMp2HL5q^ai(9W65L~a#rF8Q(g*azUVS7F zCG2ZgFq{JQN49-Tr7Z#Ut#@J*DzkMqUVsu5({lI-o@cq~OF>YI;6 zYsei>pWVlS&#PRiNk(YPSF?u_K}f3P#f6Gd{HuqGQ7mhOVwtnD)wH`yL4~ssW+3Zg zCLy$xZ`s|Yze~c^&hD({D9nu-)Tq&X1^|0r>J5-qg2Z$FB3 zK$6FZ+n`>(tWJIek0#%FJWVBTZM(-1*D~P|4P703dbx30QbwZH|7n!U=+)XaZ;rWY zv#vdG1-*K05>tYV&P{VGp6O1_8PgDpJD-=q9&dD^6b3Gs614qe`itCCu4k7V8wihN zjfaF;-*$yHF;`;8T2YOYGFmqJs!gIW|7A~UvLCD4uJvauYJ&inrHU{c=Ck-WNNfpA zVK%avT4AQ=PyMbv&}52S;W^GP(0fl>RC3mClrlS2Ys;;1LM8x*{1R(#yQ18&{%^R>M+LUJ#~cmbQ34I&Do;~5o#{CiQk*DfG;!k zf_8&j-xpUSu9mNXF2WqVdTKVdbyfYN`1E+prZr3Ck)bf(w=)wJ-&T?xqGsC8G&qlK zj0!A+?V~~>_$^Tph*`58QI*8AnrTbY?5mW7)=5pREajHCGSjp(vKcS3@U){nY4Qvv zO@iVA+T=(sb|2VEpg;#GAR1KwSq6@-D(Ys@3sQ!iFT1AnR|4pzt936h%I^K8zY1l;VQiaa z60e%s{OrDU`fF^Dj|y8wQ>|av2%*c2fA;Zp=4`hfL9+P~ER(#!)IYY%H#;YrxG+Dl z2XqYN67T1lrGCtt!jU!YmXVF2`gu&YiS2^oQ<5^05?W!JyhfXrm@rFAXjKP&^|Y_D z3Ypqs)F2V_z1FO6X%UuH8_|&3J!DKCRuhyJVQFP&TpX)w`(a+lP-~I4$TmuKMzLK@ zfVg&S4UV;oPGC0J(KR{R&Lt}&gNeTt5Z_cSV+P093W)zqO*#k1$8)@09lyXTK%2y7 zY;;~iNPnB-LSCR(!xJ?XVM#?HZ&j3ZUn?N_zD!CNW>Y&0;u2alZPyCh)X=;ow5qKd z#w`0;1tWV^!poBl&20V+Gg8x(E6!a)gqc{ts%F@ZhOTNnMyJi~0%JieMpls!W(&Kx zSaCu5Da@9(<5m2E(2_yCvSNBG>%2}K~}jF&K5*&bBkgqV>M zX6rx>{s200nVk>yM zM1S`#z8PjB0+_@!6A=Ny*hKiwY!Rw77kYNEQiT=>K1!m9V#_s727{xv!sQ*Qi`Yz*@c5^vdOHH)+xoE1ntUEj=EASw3AYcdH_sibg71 zme@8yl2&OO7+bkQTA;#}E2ak)>dKWegpp0Ea^-eGv627bYLsqwWdj6bBL&qad!f+G zu)SmsTxE{{K2cu;@rnL2C>ZlqP%!qtLBT3t3qzRgY^R!w5igZnE9KezA}jn4B{<7s zkrlrQEJl%)z7+)nVk>{g8TTK%TbzS|<%V8#nG>un59XJ4>zIR20Eg%fns_lF9Me$~-hgmyCoQm&L{{mniK36JQI-A`h#Xa+ zizYDV|CKe+s+UrWcTi^&kE+;J`mYxbi?P(7Q)R4$=baSaj52EwF8fjvf*mA2U=FPY3Xe9Tp^Cbd}*M2cQ2N zSHMN6JbJP%Qr;gKL_DVAs375DDvegg_-DjE7#mD1a$GR6sPRFTjftKRWSN+li9wpg z#7+vPS7ovmSo2~lOwrJF&&r9|ic__~x))n%nxa?wahBkYDi0f{2eFHdoDobuYGzQz z#755wDhRPLv$enmH8ysRCJG0LS7ojSKc6LTl?wBM_*JPmKZt&nN(+McSE;-($b3~I z7X|UJ616zU+*P8N1czgm2J?$u793w?xh9^|^t@SJmI^;8duIbGu25Ac8&GMb5+NH< zd6ml2Y(V5{O%x9#8ns3h-)xNNwHmjE*?^dJ$`09p*!4Lus%+3iNn!ri8co(oO0oLw z+}+mnoMkmAx_tA5&oP&XA=pNZSEj$Vmb>Hd8c2o(S93k~MhIU@GmEk?|7Uq{%w`5m z{M2lhVmsb%to}8ktqxXpuU(kmTB8ZX*<)c0!80&#^<6>LMrV&hgqf*XY~F3t3@BF5 z4IK}A03pownl(REEwM$CJ^z+9+Owxd?3PrGdY*AALB8mN)d%#ux*9W|@Jo867& zF+wNJ^4rR5W6O!z+2&@8&BGvJcCkf7+8pxnfLWMbwJcMp<|<%5M$?^E*;1`QVXNC% ztzNy_{`uEDfxBEHiAT?N%N#$6g66 zUe@1yt2e6EIH*??lM?86Vk(RXs;DuQ$7q4*v6a6^ z#dY+Uj;%(Uw36kKwF!3j%)fibp0E<4K>4&(6>k|zXvJ)F)x~a@Jwx|Y`OnhR%UfDC z3|f=cMTvm892<~yQP_&)Uap_JF2aM^maizZoS;g%L6wE}WB{wcoD?D=AjUtM$llL` z_uoRq2X7tG#Zv*w+jIB!BA_l_3P}IBO(?o}J^(vtWj!a$7XlFfZi9y|$^>9OW*>$w zN(UhS?Uo5$R0=@-hr1hucs3wWkbZ${i@~)2;re}WPUToZ$;yqu+zh?Itczy?WXz>l z7NzF`upYfkDnx~VvVpOw+Wh1%XCYT9b-XH>U1vhB83t$SV^-#Zi(n23axE=A9y@Sl zM;A{9x`}|%vo1889H}lm0i;792J=<})d24<{8d^> zrebrA?AbR3xIcxIHAdzV5-KuyAgqgG0a9kKlLQNwb0*e+FHxBvU^f4}NmdD0aiQ0* zbiY4SIJwthbYYj>Huz_+1!k?Cu;FAq z6lYEH1~Uk~KB5b60E18~B)Qd&7I@z}TdE+*vldE%38#lxDhb92oT9h8S?Pb1fBq@v ztOhN2{`pb-#>m-@#|X{tAE>keD+pHZ1eUj?z%>gas3=&`9)=)bH41Mric<6-Zf}t0l3x-xd7YuGYum|SvE1}~RG{dipTq)uCa>3w6 za>1Z%E?5X{D^utMb!R;V1p3Y9}xp>l}atQuM265KGK3zHA@qn0p+{s0J)%PB5fwrYY)8pevZ6xh5fws@s1SNYh0r4^gdR~L z^oRE6hz_AgbO=47L+B9$J<9)sni(*cox3u| zgit&tgyJz!{Qt)6gAmL@SSlujrD8%@Dkg-bVnSFdCWNJ8L*#gD2*qPVC>{&NEBsR{ z`{&7Xs~#Id_1F-q$A(ZnHiYW2AykhIp?Z}Ns#gi2dX*5WR|!$rtAx;_N(eowgwUf( z2tBHV(4z|UD4cC_>y5q&P$V}Hn&bvTmE1t+k{bwRas#1FZXndj4TL_qflw$n5E?zI z_B>+t9WN{Y_8aCy^QI-@J5A-|unE_3pb)+U=2~Xx<_`{2xVk!Z*J!71jLzc}=K4I? z0dXr2Hoz>&i!Z>e&uh3Y<<(ss-MVX-TQ`R01I~(kSSr1e4>)u417}5k!*w^m?&@Da zcTFjv8yyP*XIeq*;W<_iIHSUWGcDY3oekGrf8y*>NEbgAa=3mkq`U6o>|0nDM+!S! zHw%ML5%4LZi;YF{n08?vS+n3PA>=JJCXh{GcmegH+O6jhNrF5~UR339g1b|B; zbk}B_$0Bqw)#Grj_vo$@IREtMVuIIg?v_sp*LA78Iy|krhCZ!}U!Qik9^iT8GrDW; zGrBnbjN82MTq)t|^E^z6bN=(X`0IIxYxoOz#<}?gUEFxVZMHAt6|Tu;bk{2+?RCMTAT-8(nZIzZgWq$r-kcAIT)inj8R?}r^-8A5Bd3J-8JiF80%%X`CG;3 zgsW#I-8BN|91J9GR&uxoRMuT%aW2Hb;ap|6IXJ4ca4n0{U0ZM-kJ81oXoqVGuyJp~A^O`Pxe=U!>MZ~bp>bVH*_)o4Y#@42jD56?z)Dv zYc-Is2J+Q(*L|G*<8-kq&Ml@?k20@Tj~1@MHFVb`oXcwHqEk(WYg|p(2Is+=u+3Yr zO?(yDCLXqV8}@h`1?6oNly?A}^^WdZf%C_AbTO>9!?mzBQsO*VTNgd*xLt?pLS>xy z>cR~5^0)@phcY;q)Yrx7`gvUE8|bdvID0qL#o>ky*Nuh{uMx^wBZ%C{ZDuz13D=~? zx@!T>Esb^YXX8BPYJ8&8b^Lu4G@R|xRPFr0;X40;?z)My=f8Ea^xtkV?!zea;)gYa ztM5m;YYff>AL-)6M|sQ{9|O4cW8HNa=kFiuV#FtTME539;#!j^^L`V&uiy96DA%M< zb=N$cn?BV={{)9?R)X$Yj&nC=cI&DE7RY&=-CF8mQA@YE?sEXoevZS9VxoFlaj|=p94$v-o|ZCO#^Uy zn(jJ+^Ku%1=?>Syblr6d=k0V|OwPz-Ue0JNT)o@ru4y<|w$sIhc5d_57XXg@Qg^Mw zx$jHe*z`60%B8R2pT_+Ue&r%AqQf_aYuGosYckH|-{_+Kw+`3nZ=o{I)!*vk(zkhB zhrUD3 zaS=BXMaB}QMhjR1F&mZ-T(mC@Z|t5V$?v;SvnBGjkp+{hiJ*BISf}JCJoU(G-nRcJ{Mx?5Ur|f%Mf7A z9m=S_bhb7G6 z=2E6IbQw5IS;mixmVw|tJetNC2AJcP^L5Y)j-0)iF;0#F2fD@b%mgF37!)YMEFTU3XN&o+k5< zx`{JKwU*|^qg=R`9OJ^h>zHO3$B$_pfV2HL$eHU-GSOd7YW2(>ziQa6WR6!ivHDjn z-WYHSe)0#jv=njoJpLbk1KIqZRY zUi?6-Zti@b@tY*a9%!!`Qy;R*#wK-h{rnJ?+R;JRUBBWY&UMg}#LA9(E77r&-rD%N zlgjPlAp?ouq^Ii0T5Mq2+-0;bpuKI`O`mQ>xv%9Na)!f+&NZ{B@|HxR- zUt!+mn-JXx0CU0s#+)|*m_vps%*n$Tb0lLLd(}-0ovybs)=bx7o5Q$5)9Lyr;`Ves z$(TEXp?zj5ilb-hAGsFKgbs)J@;ff(iCJJ^?wG@D4$skJjk9<(%{z0LPUpEuFnlg> zPxIw2E~48!XufP7zN;=)WX}CTN6|7jtD89egI>&Bwn9gt z+`od=xrD0__g3hixCX6+T)kJ}G7%SJ=_(!D$&9V5^bsgD*H`KPHhQdP$&6`y3ln=+ z>oLap)zH@Hx<>yzOw3)QYsTg^dYCZI;2I|SuGOD3rmWSm)6Ceww=nU?TD`E*d7X}; zZ%pJ{nAo`vpwsJEOryhk+``1n^?C_o{dyf+(u|XQ3llvz=n=+*4LWwE8Eg0!CNALL zKaKVqb?mt?#_}ypY~83oW1QHi^TxjidT}M4K?(+?%*#Yxy+rg#IxXiaOF>xnAD|f>D#;>@B zi6Oi6myNl*IO~i9dcXH4f?n6bS-v5Q59+mz$p`iCgz^6r^<5#BW!aS{ z;+*&HGlQxHQd3AEG%zqQO$iB9A1V;^S4*D*!+doyYE`RB6qBixx~pW61mR7F_cp^v zhWC--z02@E!+UQtyw8Z3wf6g%pS|wcZtb)0x#r!t@m@D1ikU%TzgcgbZ?hmBs(;q| zf9sW5?;p_&NQcUsgGbYx_rEAT3+YhLR3yxMr z1@GU{Lksv#1zuAC4i&iQ{nt8e(HoZq-9T{Y4~tx}*8U>uja`N)gwUhQoUlG3DAl{- z{Y$mJfeFqSi=Qudhu8?o*2I3w< z$KCP}&{YKNnp^BYy#uLq!X0+FG5rLkrtiGJGZ%LxdA42`eO7;6%wnzHkV2C@lS?NRTeA} z*|3b{YP@e0l24gffTWoP^eQia*J-K#KPtQe%7h9k^D3ZRuSV!%4Mbh7erdHgYj5kI z6T+uUd#j`_UF@Y>x^xmIv`J9vq)Y#)&hOS(`nr~2%w;$8`Sc)PTMw$(>(Re8+kLPp zb1$HR-s9`VBm4FLGBpFD9}rM$1NsY-KO(AD0ktrqztHhxIvSaK325S&{!5iJu3zfR zNsR+c_Yjm0nbK@^BLQFTI;FqUn^PLg-)u~?q_b(1v@oN8r4DBGH#%#MHhm$W#^?15 zowq3Nqf2yOUV?kyivE@9T<3Uv9sA;OkDKB9Fin1BJN7^7JX|iaPlS7ofUcbA?{J-_ zYtAWLXHPZuYs48E>vN8l%zfhc>Pi2TNq9!QGLyarpiX_w&(&yv`4ujE2GyzgK=X}m z2;#Pm2o}{$hv6yOp zszcuxyt=B#2uAf5n13*b1!Ojb#Zo|DvH7`9DxukAmWpMmTrBtHDDA4kyfC{}1{1rk zGGCeT25zo4;5P$jJ5Wq#CyIIOlw!)eq?pz&6tmF-V^S|GYU)Gfse`7>%e)(Abk8uN zQ&K?uR@=- zhFX(17+cEyYL9s*K z1$1Wa*5J}-js;Y}o%ww$`3@fMCoVi8$P{KOhcFj9~-Ww=0rdR`P%-6mF5d$5k)(M>GieY zN~$(|ZC{#w&$f@B?a!@5KX~Lrn0Y@NUP9LAel}caw68zF=#5~3djYE}gnpqmyo+qg zU)yjGWcv8f2R;iY2}5Mjfs#%4ak)`8Q1S3D@@AoNwd4c9dtmjJ*m zNusR_;GYEeW1UU-T(=W`qL&E{)0=GL(L9lC`%VR<*uK^=DK;LI11Yw6FSD3p>xQ*1 z)%HparrGey_gJP4FLEzt+VHyfdZsPdOW$VNdO#AEMNkb{j2q6f;f-U}n2orz9L8lA zFs`hCaWe(BC@)=CXzN3%!vx&+7umj4c}2E*FSSu*!@J{qMNIx&B*|lo1^PX3B%scV zZ82UtutZEn0;-|}I@MZg`=yyHwc)VXEwz26{mNucXJxh*YPOsn%OW=^^+1K~Jqo$0 zu=Qgexs@K@N?U-JKB%(sTvAyLFgmW59%`+YQ@pIT4PbEe4pS_w#}rL@JvypXQ$6R{ zQP1*c>!r8@0oB|9{=h~?r!?9I;TzM0=#geNXuF*aI%`L;?(C4(%o3FD>XgwO0k<4o zGMXpg7PDJM3j|#0d(p&|UN$kkk4?oAv((9P&U0>@3@78_>o+036%+JY{y?w& z51df?jFeeTP%3!dR_3L8=UL&^)rw{4@CdDM>7luy9t_&v_Nbe}VC-WT^( z0kyqPuIK}D9UqhH?wE5L_$cwK1f>U0WVA*=S5IZMPEdOIOhy|7rA97L=jc71s-L9ZVq zX#EjE=Hk&d4!_DL#H!+F+fUWqvkm_N;p1!Pt_rYYTKfTZv@kBjj-4|RVn<~~QT8uY zSCk#4`b1L^6m3VTZ=&ry;wwGS8Dr;hJWEhIAlA9qa}w;RxGF)SJ_xAA z1Uo8@OB7wbfND*IP8}xNU+BbSNm@$4JzpBqn1nPt=TMu*l9w`B@?IuO?#^M!zPYS0 zIF}V>}7^)E6?MwUA!Zh2pjAfj31m>J(7#i%^SMEwWF5GP@WPQ1c~_ zCco4^3Ds^X2cJsC-d4s5j+9A)GXZr|#>tG7lRCYc)P>cgF0Tf)s;!p3SKDzSEU%Hd z_7E`FTJ$`UN4b!l&&YkmGzBIm&04<7k07 zZWoY4mn_<6Fr`icF6b* z+3_%c9ijw6cdXmza3;N3x6cD+HtY-V%-rO{xZAWZVo zw?o6yj(r)1=v@v5ckL?}JaM3w_UIM7PeaPSeHDfg4y=uRuqPctltHM?LpzS*(If8S z^Apbh(+PX%cgk5NoXYgx3aEiodUapWYwUtvch~Go{SEsP^@Md-_{4R$^F+nb6I1v< zONvAf1o~J!y3+_s9s5~0y3_nEEdFADi|2$<0X6M!#dxU|e+z`wAr=VRLM#yWgjmSA z7$UwOJ&+eFqkaK38j46A_}bz*C5-@{aN&s%o(K<*fSQhgw{;p}VUI*XbV8`HDAG2^ zlD0RNv_r9^U5S;@69JPEXKf(&OdPVR+IS1?-iXJxxs10qVJJmPA8jG7VYD);0`l9H_YzF{ILvlWOh2u*HEoNM%{|nJlY2lVuHLvaGdCDeJ-m zMOiW$5l~ZE?BjA4BVXq;GBF>KdM97@!zY5$yKiOmNWjB_0vSCKl-@6t(KA7*gJSDT zW8cF!vC`{2! z1k>JR?QuFyY;1osJAT>Bjt8|^`!KY$(2&|nLtiTmbFJ0^43TX#9JSGq+)hJryLAY| z76)pngNCS18ge>i=dE*~PdkM^zKftzyI6T$7m7Zl@a;zBN!_gcu~*vG$I2u6Sb0{T zgjNZd)jsPO8RFiPuJ%3YR=I6X-&-GH$m^#eaKKu}lk@?pU~qsH%nnGJ3juXEzzSjp zLH-6pPYhaq_#kjR1BL&rm*m=uFkBbqiWi_RthH$b!a;SPFn*SdtJXb+m0 z1FIJ2sROJzJ%7M3eeHp_hsb4gr+_LtVZ+~@u;D8w7Otmlr&8=R0i8a>k}o~ul0P`( z0zN(CUI{*zb|wp`-gEA|v1_JUyhbV=d1GC%X9PaT;sMZl&-m_p#xLAU{IP&3e6X(J zcJRQRcly9&y*>^koA7a;0<$LzG2SFOb4#qA9I=cK9>{h$aB=;);^E9 z0`i$FEnkw93#i3>#-$W9BEOimgqJwDt8xftp8T zK4zZmlPudFNP91%b^+Dpt^bl~zwolIGeR>5QIHJ7t?t#?wNWjJ95Xa+(LmrQD zM|4U#Vquj>Qc<^nIz1xc{V7R;&e+EAGkWEoiC3L~IXiQFLdKeN9DSTe`u&;vfVGRhNB#kcHY{vG1Y)ScrI$rA3FtpDDDOUV zi4XlmP*I;4pYn;!u|7^PXZSe5oaf^NbF+^VPI^?pg!($45HjTJME(h1Cqia@@sk_N zzVyBH72jY#g6Z;eKEpS_pT0o>PSny8fNe7#;Pk;y6vYP85FbRtU=R%}K~7&7vVv*I z387&wgodLKrymUEp)^#!reWtb4fn5|JK$&u!$1#(3H^zHx(ajR(^^Eh(;tyz;q;z} za0YlQa~a_bgswi4x}ivC5C#!Z7^t`?&L|}cGs=wOjOwB!<$!<*h;|0Uw=bH$?J>?- zFFhI~4(9^uHU^x^FP2$C_}e9svCNVmD^3jp<|5V^f-LXin58wIS%%}q;Z#6f$FuUt z1ZODR#uMl^lYo@wAi?>Xszm226`t(GIVm=o`HPYzyhXs=Bun2LQyBP|!e-T^V%xk= zmA;3j(J+!mgMT^=N$JwXc@Femx+DvKLr}4ASWEF6XBdc&-Y~K$`{frX+g5>OR|+&67S&Y!B- zV&@v};7eF;RRvdkYXw()cLl3nsF1K@0aIA%j0NREC0NvEl@s@1H&xC!s2Z!O>a20@ zdg<{RiMbR|_cf%-sb&7O2IenlVE(cO=I?0`-&p|@+vto(vgt-9OKxIoN1L#1HXvch zYo=kZnTCuO8me2Ii7;HsptjYSgh6l{?QLzePqsOep^9&3;9NTmksUPTbU0IB*y2E6 zbU0Jd*pW_W8lb7mnGREQH~sRuoo_JM;XtkSV9NSqkJKF7OHj$ZoL@&T*W`4sGXu^| zeOQy%@3|&VhB)JgAL`2~T)0dAhN!N%oi>gs1*&1V#gE0pB zj!R&?fEgQi9)mq*f`M_9oY=r53tpa-(?jMI4cXH)%udsAI4w)0>;ne6<%1+!6Hq%J zFbDJW!I=%>ju}Sw&2WchFS7iyMV5cI=)}4GW|6f-E=hQ{2WCC+AfSAgkxa)gi${Zi zYNJl=EHmfoI&&VbOU`v>3)v9gGyyy(aOR+ln_-h`yIc;v0NSFkQ!|~y-suC<5+8&i#Oa;1YD>yT)2HY z%78_kXK>!3nZldyf$K~cKYoN~0dP9capB{~RSp?Lb6r(nJjn%PNj@1{i^w=oM8>fq z=GrNeTz3Mdw%ApTi0fiZ5`Xy-Q;`7v^24b#mN4;1iK_-~HKj;=QpUvj)l6Jf&BQ(L zSg>Cm3l6CxNoJj7s`kL12g2*ARI&AJTRvXIH`>3!g;#v;8^{sa=&A+BV4epRkcOBd{eqF3Rwo5E^0;;8p9G4zla<_PAbW>L?13lx>Em3FP zcH@5m0(&4*Ayj#f>wC4(;|jzntjC2HXzP1nnxi;|(D%KrI`7YQQXk+ax|V=vy#$>0 z`&ua4ein7fEK65gP^}wWnbv%a|M$SXzLg>bMS1M*SL-<@@5PqVg7XS{ENWh)z z0(xiOdIpsXXrZ23aN!-GJ4lCKU3B5)p1>v74-UP!}fsGh|(FMsISuI&^yje~WmhJX7G1+d;CoS8JDHLYA@e*r~$k}Xn zo43+i*=|0&c_0`ao8#sqqnaEypXAKtxN$5Ts{FM#Pug0c>aF$` zLckqfsrxf4yc~XM6qOMAL%Dc75O9-K0gs$Y7&|FuAoN3}n>#1F3V>((RqkJ?#2WWY zE2S15`4D=gmbI&QKL7upefX6$cFXp8ueY+@*#AP=+8yt)S^9g!kOhA*0y*~wqma*k zIEEv#f}zfT#Q$~w_-lMouh)OUCVzqb+rRtbn}75Aoxgtd^4o8I^XxJ w{F>k|{{F?QZ}1C#Kl|)A-{NcTzx{__fBVG`_&(R){><@Pd_&$B`2NrT2dB4)#{d8T literal 295982 zcmeF43A|NR+5gYp`<%nYdyykv@d~KV64VQVpb{WX97Mp`%F;{_%SsPuUM1fK5mZ#1 z6>*+WQPIE@ah{cO$kfWz%F#XC^bJ6#1=h-Q$a!g?O(prNDKfn}q`3 zx;+D$8BSp4*u!^2TlLdA=ym7U54n32Y;iGiDs>R_Br67{SG+fOJAJ6&zHY;&=;p4@YRF% znZEBArhO?nxKI#<$PfL}bjaUQhKCoDG@(xXz2kqsq{RZt9l*S11&V#X?iL!2M!NQ}=Gg?kz{D2)CxIoOIWz6y>t4XSbQj z5k>!NIwGA}K7wXDqQqZ1GvjxE$Y&KoR<%&H%!*S($x4=tNc-`Xj!4_A)SmVWX5x;tm&BB`2+txffw2du>wQMbG zn-Tih8rJ9V(3cc_M`ne{x1aSB-?eS+#bF(#E`)V$U0Y{HFzC$bbTjB#C9G$`);m1( zkBJA^0Nq^Q`rG<@h7GDo*w8kx4Ld@6Iwl=s?c4Rpa~Ws@mCK-*!A7>xm0_?Avca`5 zggOuLIxClrV=hB&V;g#S7#4Hc#5S>ERIw##ZtmHk<+o&MZu7L%4h$MkHzsI;brvxabSX37xOU$HT)GlsNUu?K%8o|WpYS*$)*pyi5I zno7%+2l$|;&1lw%d@Y)1q)OT9jWiXwkB* z=XAQ+U(bfoiv4ZC;S6st`UbXv2K$D#zHPW?Xs3S$TDuMG2!nj|4ASUvmK(*?gKZ-l zd^iK#Q*X?W9-?{bS3_;63PPhOI|lfbVN)Aso7Tc+6lAjz=}zj}LKtqthZMa1!zaja zgnhzBbcB(#{7AB^{=5)IK|g9lTB$Deaj-d;n~z9anGmD-Il30Mur0!t48*N$OWUdz zwjNsu+t}8&jfUq!rRl>%_2igZsFG|fKgZU>wzjSAjI(hXu-jSHwv#L<4@@gzJS5|} zis{1yn_%V2(auYS)*zWk73lf)bf>VrhSLt*+o2YAv>o%|w0+O!ld@9ZeC&0vkG-@y ztjkQ!X?;ewGawmy12n+fH9XtX0SwQQmA4PwXd54Q9ih8-M)!Oww}(|IP_wOK&AWsa zsCrn7_2`gnRr@8Kle&XRU9{Ck7ly``?`6H}Ex$T+tqiBuj<5zTzlKuwWfT^zw_5tN zBef>1$>o}?0M%9|dC}Tx8k9k8+t>P7-&*KL!>?`q7>!*UejRAnsWHV{8HPo(nh!|s ztY_<~;rlc1`>WxL1Jl+(`X!EOu%5t^yd!b}EBB7*ZG-22zDVHqZujgpFw7 z!8~=@J0x%6je0i!J}veB2z!G9tiqpnMF(P_Xf2Jl?qNOZZM`ZqJ&~?GJ3@uFuBfd? z#;#FYFY>nTMe1I$tykx#%UxsxZQYwCPSTdPZbKZjE!Wm-LAzFsK53P#^**6LxWnS7 zwqA#hTBp(0>q4?_XImTpb#3cFL47goppTHfoozjUC+ph)Tfc)9aTxNVXdBi-yS3+S zy+P0Bqm!huc4f@D&do$lh_jQitNlSA#cy_BC<8^ML9lDc!_l~fN%Ys!H zLvdAXwq~^yoP2d>9IVQ+z3MbZT#NOru>@7ZYMTBp=EJO4SgqMs3#(J?R*vDej+gSn%Fs_kXkN2dt#) zZ6#gb_WoT@2d%@<(3-{2;ER6O&oW09K5A~k?Tiv80x_D>tykQ&IKXdCB4XFjm45QcJRXy?!wM#(ne)+RN!Qk&*O zXV^zIbnL?qozvpbsSlfv;m|3q1kJR)d+4ZZ>u81!cwec((0JdW69)quAB_nXRedpf zG&I&nsBge-XM?F>!)l2Ev!S(5M^f~UlA>sX@}aTJhsH*XgN-_e#$ZY|gj+t0HqM8} z;E!r(^!xBb*|1IJFezW`}9~K`__qU zr&Fi7G5}GO`c12jS5U}Cr;#b)}ht$;7buGj=1#FF&3-r|PpLu^pQ>1!>P>OLr( z`%Ddet0~B#ul1V_a#+*WuCe~3?#P$wh2C2Zvpbh+V;lvDT*`gvttC6wCPRZZ{LRmr=$Dj8bHbwhQcfmH)<;v93*rhKW#-q{`P;rXNek~=(f2d2uWWy# zt*GxPF-T|+xoW)XX+5=vtgtIv%__E9Ee>&++EaAd6O;3S@Zid>H#m6B}vlEA(u2 zX0)@)%F}GCHinD$ZWCq}#|x{`rS8ch?+JQV-V?2YlxxrzYpkqi(+D!AW1(0xH{~hq z+OgbSO%pgzkdyS(VLH0$b)#;&zpb5TQ3!5U%~6Ro)#wm9hr$LRk`>wTJ{q;ce@qh5 zOJ+IM!pCHxdOwrIQ~xIxssZn{P{rb}RFZr&TWZ`xKJ*Ulit(q4oh6tegK`3l>#)594|)|4PT&lWDR+ebxG4?g>qD2a-pG>%@vUM&Rd{dj+i6 zsP5FRXeovstXf{;T3lnbYWZ{byli4W!c|k~C2ywHt(UDnjrD3Z--+l}Z!5_6q>i0D z<(jsplDJoB6N)j&Tr)O}MXN0?T26=miRf^@RO#_f(<*8r_f=~etJXTcYU$Phd{%Hv z%QKR719ft4(O*z8MJX*u_k|ESX5N9*~&ph|oA7$KSuID7wXh$e|s;oaNK zSp1bv-j8N;H2lM_6aTgr9R6P7?=c?$D{a9yvL0Pc!XINb#PD~nd+$&~412fNz;e60 z_LX=I*!z18RNLO);RG4D0eY1LxoD*0UbKQwn_nZhsc-O^_^9&#T5@IKHPBJeSD zrT7@c3&b}3fI9RWirrgtH@CI;?$$L-Aj7$J1&*tz5(b<5ueNJH(;hcvgO@W@zE|*t z)3@NU?QYt;gs$Ge?h7oAgV~C$rdil4@?Rb8uDfSXXSdzU)~F$GQq5qGfQd7_ji3N` z$xii!^MRiC#Y)*%Gu*Q!gh#x6FIGh4^s{xg$1gi!3x*p)M+ojr8stpsgzl$Q#0jB) z7{D$pGHLiJN!n}}1~l6MvdwKPxj&Z%5}L3zBwG`&ko)*=1D`S6QjmacgOwJ& zJ~o2pW(L7n?#GCM0WQQoD*xsWXrYg2$*0z0~_N!4Ip4 zUd`z36sO_pE)Ck=vH7gEXY)fz()+`ey#$E~;taS}{VpVHl(sin0 zTL3{HS`{n2;b9SqcUrSP82*)&Hb!4V4)MHmf;)5>w(|DXsN5YgOVL`W}5 zlGS52t>_8e!(lqrSUrYqt*Jn-TtqmK8?3+%HFO^^T%YZ6a>y;`9bs)35o0Cr8o?}2mMBpP^7ZDqhhx`xgr>liwhzLUIY?I|g#HP?H@Q7r?`8m9X82NAIc8+-5nY+>WRYlR`Ni+n78z%A^*Z7jYgiiyQv=~(<|tim5M zNbKe`S-*49?i#5kW1+U{9)d|+RyrnQgDBC`%~I`mJRoyo9+wuwthMJz^i<|wr}d4# zM}rN)XU${XTNH;SKCW?l8 z1s>wFXo;qRN4-vbR{(ONr}*EBkw$%fw!mtd3cY}7Zf20f1Mv2140*`3!6wL68|<>; zjVtkHTXhwNe4DK`oo%U;G0tP)UfKFJ$kwiwLAD$!a2U8>FiIPjQyz;Z6hH=t>)Y+ zVH9MWgLF5a4$6hB5(t17*yWT0+cK|WYuKvV48+~awmvLu6S4u&2XL*C2=1+^px?AWJ z#hk}96Su3IFtu(qrcX)JCy!@dh0){lW_ssZ!D^wkq9mV^oUA9K$7jxAalMdQ2(OYu zwO-ij4YF2-MFZM-rXbXKB1g&E8f0tH-)^EijD^C#P=%8HI39fU7IE+Ta$+F+B6E4>)JGViTq5M+__2dx5#kC z-@40M&dJCyAk5vziE31&UC>q~cW%nb)+a*`q&!ScO(Me_VjCXHkR$3kZvq|EGiYd1 zAq@BJx3h+FGSd4&CN(6sN8jdbhmpH$7N#S$o$Y3ZUJ|V&WW#f|70xgzqgCJxlf#hO zP9~+~$U~zYBqwV{aQm}{;4VhN?Kig~Cl}n)5!`;q1-I0aMG5Y_Kx4_NA-J8aA-Ib+ zzCkvD5!?{mPSz0IMG5Yl+fIyN7u<&-xSh-e_n`>xVieqd^OKBV7u?ek+fMDEY1kRgTOwx=swiW0 zsE(`0Mlql{a;oxx?|P6x8qp|p+SB2oJ7b*T+@79uoVG*=ZEHSQVpVf~7!UnW1{C-F zbo2Opr}ORjFuXBSMmOG=)8n4aPoC1Y#?PJ_!A^Kgee>V0VXi$s*|vw?)dkMSMQ!DJ zFBm#B$y?WW4L}~CO4DHjUQ9nJWqjyI`?w(J2YouEe4tFAcHSlI2== z&Zg4t1*MnHgmJ}u3&X!8;oGjA3)S*K;%mJ)>x*tnrU750mK^4|c z@+gU!3xfd?wKR-=~UL+#vYk2R-4&S+pM8d zbFG_HYO%GXeJfS`I3I79!BmX~wh?hn9%&=n(}iA-Ub+2juT9fWT?5mO%ZIt%t+#7C7K2Ci%Bti}|VSRER>Vm$oI>cGq z%UbC}Sg*lzx0m6&$58^!-?)geJ4LU$|dwRRmab`$+dN8}A zlsTD){cn&T5F)mDxaa=45Q2FBFc@w_Y_JWPfciUOt>QSj4yNKTi6*DmqT-z`qx7j(2fmhYWShXXJ^$9)}ZcuXaR(l#L$3fx~u*L-Re00_p z%hzCC(K!?2U1p$8+@b+ha+Wa7-W}n!lkI3bp&yBJe`njdZc*3;&Oi^_wIl3CMRrrx z{lh0I{wGJIyH_9f#`zSNpBj773bQf7^dZ;WbA*2TwWo2C{!kmm>4fp!orhT6y*^Q&WFkvqSb~w`-g+MbMT0CT72GN9qRZ)xOvEk zbbnuMd}#H-GI}T=emYO4*TUEAYj$WY9H!~}U)=hyTKKwsUAMkr-_SVzrX6PA)U<35 z-y+%J&>UV1Gi-)^s}_z>vYFhPSqrlgbun|C9vsKzoW%I(!SRV5?`%#;?AXLka6WC}MDaOE8e)`E`-=xmXV_=5l^weDvUw#4d3@mnL>m zVwZ}K2G8_xnTRjrx-FLi3&i_!-MyTIS0skax+1Au=VIYX-MG)y<9g=-~puS@LO#I8#wge3{X^ZLY=BzAq$5tb${G?pe&YTS_64Iu1g zK5=gp=}n2x!}7kF+Mkwb9)pNwqQvhkO2Yk#mdFS6-~rM+nAn3!zD(YqfcVm+e;wr|40G39Ol3*Ua-vK~xXm)b zJl|hv4-=Of-)0=lHX{=hj)1SJUi$7zB5PtA_Zd<*u+Q+L(ljquB^Bz1O1{28TnRnt z7++>5gw<#q-)nSeebxHn6s>tnJL=1uxi_3RF|b7xEwYe{RbFCO-i_yMx`c(5^8!0U zKO|H?NhqgYo3!X3`bi4;4Yw_~v&LqMTdL%{T;md`+|P;naTu4e9nPZ0x_{nKz~?*5 zYv_<$P6VC7!L~Ch@7T5U;#v-eqUly|^kQ{Z(nTklGvheW(S?}+575Zh85p^4R0^$b zTO_-W)lLR4?2+l7QYC#|*m`Kvrp?UtG&lciTUWN0QR$RO0Ja{Q^brcVKJ?tSP$-Ov zEj^FTOxac&#q#Wo{D@EluDqT(Ahh!kz; zY<)%-rdQ|8VO{D&YxQLzk*c?!p9&}+?RAs`+EQEB&$`mBU_mRAdu2=LwuSyA8vxCK zT97>e#pwo0wjsARbdN*bYG`#fK&wMC;p-;QbvZZHOEtQ&k`3k7P|WoM4;9GcuzzZs@_C38h+^z-2smU$%`jgoYZ9_+nF`&VSsQlxyYSp?XaBOv+TFXxe9b36nDf&RcNuhO$?Wo##E98Jd zoiLHb5Y4Dmq5{|;2~GmlmPOUs3DTWv0PLMr;9Vfy71CX$7Trw`K8Y@L7gfQxx1ZwK zr#Md*vQP8#)4nIM?JD1o1!)0n7wj{&@Y(8o?^OG&xb6Yz9wW1f@n+bw`al64Y1uwk zW2>^K?Nzz2UXRb)=j-*@TSI;lRB?Zj5Ba@&Hb0Y=>T{&hIX{NI$MjHlGCkUTdT?4t zRH&l#9GVn?=Ca6P9;-1Qnyh(?1W2SKJDC>RSj7E(!B$mR0vo*sZ_A^l#romV0)ut9 z?MIZh1mmY4QMxWhgdP?uKk)J5hv%~Wq=G1&*u47qXqj^1}pLo#oYI>k{?%8NHKXX*A#wy*85`=>x)oKL$kg)Fm z#KyRB4(yr;B+QW&Keb)^LdQ`$T(NH)Q$3sizJdzBhm(|7*wsJiC3e#(-Sconxy}b=Uahr!PM|DUQKSMF99 ze?!=#bvdT@+1ya)Zytz)goa~YJdMs(tISibdwp8EHH5=cNnI>FmaIT7JS$bw2NVp@ z;*ha2$uLE^J|=yei-x_cMcRR+YjW+f;c1;0i7txN*eS5_FZIZrVtP-TT`M#)lz@KF)QwjXT27bc_wv zem&B;-d6?GHMQA9-w!KZ1cei#H^1Br25!|JUEsWQNGQ!GxaayN*|u@rR@L189yyGn zYOeL25Jp3Zaoe`&2wRf~Z)(%S_Dx8wJAqYHN@vB~-8ro>- z4IJ7F=(kKHF)}JWqGx`8DEAt#FUYEQztRlr_JmHC^g}=?CMa+C!jLc4p)57X|%^k^=_0^mY80yJBY4CFE@79Hd=ihzYuCvusm0TW032>J>=M&4-v8R2^XOyyyx z@okMTKi+KYR8)ljZ}&OV=OJo9=}t-Wn; z?XV|7GigM+ly|47zPBf6TH|QmhbQ|8wO7IvHi1#$s($`L)zG$rL z{Aw*6To%*e)P9?#$NjSoL_XyXw&$O9{UGG?Wv>>(W zENNDE3`a@e9i56311oGSJUW z+(Lhb)U7B_JEUkWp=d?0S8qN(A9ZIYGys~^66(}iK;z2iOnza~p`lQ>mQc9X0_s*i zdT_oJsOsJeTq%2jYfc%3`%CRwLh&jMg0q+QwJD%{E!CB;XjOMP$*8mm8um){V&YCB3+?d82NSujM%Zv0G5H-vIrc#^%aPn|axn{B zNt6J4T-Zt?(o2I$PB*u)ZNgT~wpAEInyz{-{Qky_a$xT!xyT7M*O0;hRth?`dM+BR&)6QL(uxELZX|W0&)MfxzP(hw&)Z)1`HrAX_$1rg zCQS&F$!{M7>^>b~ikEMSmv3L&x1Jtro67e^`{Iy7683}sORNE3>cG7AWy(ipU$L*$ ziLtE>Vr@MjwkIoquBKvPn>sm6Bk6%Q%?|7c2YFTp#a{WUeYKwaU^`d|FrkG*8oh$R z*Ujm??dp(bJ0yIKEDy88>S+-5_BFh=yblM2uUD7(^uvf|U(Yp5bZ&e2CfR?>z9~D| z;f%q z-K=&j#K$FGx#RLh0h`(!7KJ!gT=*-46QY-U<5>pgO1g9R z5>i$24jdc>y@cCklr#wo5=?Cv)H*P*QRyoZY-||U#)m6)i9PMg1cO=!#x!Q`Re3XF zLQ65BVbG~dz_x%D&5dY_8UML6Ro-7E_H1Im;_0trd4HX_OnWY|=NcTJPwaUv`h^z~djZx-_>I#3 zHnHC%_FK}vnAnR+E`KZGcZvOuI<$u0tJr@?><u$rCP(W%W&JHjz(I)+(!Od3V^v8f$P$|&59OYJyM zJtws}X*fR31wbX7klG3U+@2Z*Wi6-YGh7X1gK{3%x4_hpSS%3SRxf z)sfe?k$$Ot8(xc2gJ@AYEi6uLak?a2qk3OMqqRs*w}kJg0@tQ?ZKGhn$CjM>@uOFnwb(K#2Sud(sIwtuFz3 z;2^k9=moty@^^$*=vy1~Yi#@W+cRfIi~6Xv=+o3)7i7fe!2jzx)l7$)@dDE*6)Ry^w$@z14(m4;9aUdj$2S%#I^aWPFcJporD8&qwMy6@Jko#Ca*A3PK`3kUDqurY za#XcpV4P9ljXD>!v*H5I2m_mKAWneZT7V6CpAJP+J9KgwMs3|$y(4Vu%r|W?cbHKO z!zmjWqt2B;BXJ!G+!#5D2&3HVwj+%80F8RWPur)JaCeODyHCQ$FNr>W9bpfzPYTPs@iAWAkz8x@Be2Q}M4XqyfR zhc-F@z@Z}Irxy-wwnOpMlcOGbrPzCN);p}eQnkowZ%CmPl)?OSn9&gqXa3Ew!)?X{ z-1T^^2R?Z-JHjkha!^I1f=3Ehs4^&*3gKwMiX}o9;EmbIJ}W{Oxa&1i&q?Bh1X+MI zj@Q0BpOdaxlIP5cLKxQzVX)i^Ues&gAVVt#x+QSON$gx4X@D~33TE*9bnP5tkIfa{ zP&vUH1)+_34MqTtGkMe^ya5I|E13l3pvLF8X6YQZAm_&I%ekEeKTq&N?9P{N3A7P= z2Yu3o4Zar%Y=|$A;$qP>gGU55ylXEJ&d}3K9erHNeieYRJihS3ba`j4fQ>6WSFncr z?k#L&c2xq{5Idj-2;^!i0l-MYB1aC3sKnw}iN&4lu9175Dgn^=P6Eh?l>k~?*WkNE zI756LX+YBq42f7H+)&>ow?wERGKU#FX$Di^s7EmY8n-mq-RhotH+S|6IO8^8iDQo2 z>1O~3i><&$y`O;^cToai4EgNcLGRv^gN(WO=1Se1TVzbp#?O}V2}tez!nXu z0>bz$WGxY3@T3{U0luJ^zZZI_7t=8Ypd-f+;E9)bc8+W8URHTuak%jcp!3xvcffLN z0oJH2kg83}@;?e*)RX;5$$%Gs63Cbe*2t3qG5EZmR4#K39iZc{q$z+o;NVch{ssVb zvB%~Fype)9YT+Nk8}+T(%f((Tx$%wf`j!kM9ow-Zy7Q!ozb+=ZXIB`>#13$8sqpt^ zKf{Zh<$1nhzn#(t_uF}w(XC;O@QBddd1ZI}c1qE2C%#Q`4FbmA&xvJ?x)V#?PK`lE z1@9-aogLnb9TR-*;YIhXjD2;cA{}8T-!ZLiN0hPR5zV8?9@}E zjgHVU3}~IPNgO0rBq}K$Bql~XvH!`>5_?PvHd(Jm;F{jWROe@jjY7-%jg5YG}j-^Xv|NqtorDQ=io)e2R0m> z(^$rL`7JL>W0?nLryWN%b5}Md#mMYMHNR{Ui&D1x^Ha9_S?=70XVG&VsiGYRp;qQ{>*y0Pa!r3vG=fP zTdi_YojpXoVee6WBhxuzP`x0PCv*PVbBzEGq8gE&)`flFDtdx`P(|xCp0&@*6hRoZ z^{w!N##nf0a%i9+zlFM8JuPLv)ZLiHeE@T50Pry;^0ryO`lj9yn#EH%HpI11h3CvY z8))lSPOP(sXb^=5C@8dg)(K)iJ7un9xfib3Z_HE9-kYPRdD{%FzLqdyvd)wD#NMZj z4XvD9XAe;h9&Gr?^dx8hhTJ(aowVn%dj%qhK4GJfuwB@1UVT1cDrNbxeAu_eekvw@FdT(Io z7W+@)zWYf$JkF@Ihv-wV2WjBJo4OA|72V+OB#hQ?vB$V!pB<4t-(}$JQN26C#*xK? z4S*fa-mM$9N9F7~dx-XiJ=nwc9+_V2rN^CSG6^RWS!DZ&{S=-~!9$=+>G!Q-LjD3& zU#Q9Mfzd;yce97>TRF4N9-=S99xP&C9+}?m>~Bv1C7JDC!v=DI*w=Vk!)vGu`>EB1 zNtg!Jv|0ov&i<aNk%1qrs1EDtkM>5t&) z5kw?*Y5SSg(-J@oWV6@<94Yi7=%PH1&Mo6MvvO-a8;ECXA90KuNM48;{d`yH;2u}(_Jcbd{UjAU@{@g6QFiHBRHch0W?4t{yjda+)>XHYJ!pq z!ZmzOAy2nWS5I=wd4@414^C1Q!8H)gCC|IN2v$JO8;)`^a84ej1ibM)&-O4R{yih< z6tQ3LVpYL@GBRBzZq-?d%;*_dC%2+2OH3>0%Cv$vSeGoZue{_2mJHNW%Q4UVnB^sj z%@^DO991rbT$xnPt!Fs}I7F6IJwlGJcggY51g$CfDFZ>(gq?nvgdfEm!A)Q& z{(Us5u$hRf>M((*fh} z0H*l-44OB)6bfK9K)@=)SX0ATgPkTk6ASgMAQfN=OHSt`8USp9nd2(Z6O+jMdT@A7 zJf4Hc^U-co5U_&m1u}fNOIKsWX_FBr17y{5hy}J%yMwNNCx8Xq>ddeWTMijIy27S2 zGM();wD7WcybKRu)+^o$uewp^RWdwDH2E&zwWQi2l$C+AY5`>RCqXRF@b%o5gT1G6 zcfHwLWY{Ulu*2ssWa#0r)mFe3JpKj`2V81)a27OwC&M?i1=L;<#Fc@$YFKzM?$r0f ze=n^ja8=)4zVo}pv&K2AKH*m!Dz~?)v^Sx0jPnxtl=9&7>MBv8OtkL8dNpsmW_e73%1=ar^op$wrS|*me4g9heG|@RS^mX3;(iCg!?C?>z4;S1= za_x~Z7_dqaJZP>KP&JEpU2Ujf&fhN9+J`8o%!*F>SW`jG6Z5%D{?k_s3^&Ds2 z&R#R~bDkBKF7@=L_6at5ovcSNtVTjJ(nG*F=UJs5ZJXmCJfcFcL_yFRwt%&t4>2-5 z&4+(K_L*7qq~vS}?Jl=e=+`;*albd7F-@TgO|{16a%|YvS-a1qjj1fEvu>&@t!=xJ z>6>2aN|->h3HSxuM6uqU9q0BV(%GGZ1U0oz*4dFlp}MvmabES5&lb>OXSOr0l(tKK z=)YA;_Nb$&l$Pvr)DQE9qkd%KEx9_Ugb`Ry@B|vkaq$9GCWZuY1XI-Kxc8P%w)*gH zPhVH&jBE}_QM8O7ilj5&cw@3gH^Dy2g16OqOlZ7{))WqJo48ywXgWsmpoAPNMee?3 zty5!!kYY5`G1-{-bWL(_C$1f^r{u3s?ofCTo(hqoAJfv$MENSPX;?%}8o@AcV+8Zn z8rCBz+Jrc4i^4~(hCf#fNwm?0yeJ#MiqqO`!vh(-Mfq>_bMJC^RPf;{pitn(qFq$0d?(Mc^-WF|)R)|{ADsX&TO;~71p%7?E8#B7VaaU@QYUDH4s`<&} zA{iH-Z5NZf^Hx03WSqCnkV3b3o`MW3UJUo-%0m_N=EHfNLe-so$#WM4^g8vfXdv8| zOA(8HjzUwtU0dt8r#`@RE)d7NeTLSNI~QjI`M?vSRy@1>G&k?AHgFFIx-n)sV{J*> zu9EzO>$<`%+AGr;YjRJA2d(C|&}a{hcFdF$vLdbQqFej(Os8g%zLYEWwjhmF7DzdGwBtxwH-O(|N*k57!V*YeB(cKs0@sWzYesI#&sF(Ji1u(FN5mBlXVpQM%zGq_ zS-JgkvogkLI}sXiYt6Nw?pmpU$x*B|oUG_h_$)9)OXlHO3RoQ8>0GH$B|lnmxH_4M zTppB8tgkjpn4oLhx_bxLWH4aXW35?Fj+G${NXJ-z$p!dr$=Z^yEITqMHw^KG0VHs} zMMoF}@gOG_cRxjOOX>BlXA$A`BxjY^KlgFiE^%#S8B&raOq~CwcZsn8H%!{uJd# z?_i(q2)lc^cW;!t>wzY=N7%DbjL(s&AEAhoJqpsjIm2Y{nj1IwY_>hoER=1s#GYrc z4;f71kdi4KVPDT+-$n*FRmz;;%7q4Voa$viz|0x;YqtGRER^jl81!JXKR@>$UFaDH z)d7qVd@Gkk&&o;f@~rgC2t;p-xFw&C)`WHMih`L&q6bP+4(L_k&DM$G(J9eS+B& zB>|9s0=7>s&y)cavu6id0p{dcdA?^W-?No(bE99+k<+|tbFT9}&(Z&Rq~rvXqLcyW zOBpaBpa4kZV0od;o*gIvym%Mm@)gGux_~5Hl0;2F2jHK4FIB#Aid-g$udT%bc~@$E zyIcvb$o(rj@UH~Rt5YJog?b9)UntbyA+zVzNt6NYSUy4i;MSYD!`fH&6 zjtri$f5G`>Oq!}P|A}|ccRN{nRj&7{NX7v8M`7b6;SHdf8|7x1BmAXx>s1s+7(iz> zJS}Si_+`iUgY(vHmCNOA7}Ol#mjU=PsQ9S716mD#w}pxTl+S}|KG5%d0SpuYQ5~M^ z69Mx-2zPe?$i0A@f_O?7N z?QOWtO18eW!Pe7BdSxre1nJUCpOA}r>sDDzWJagtYMz_*gm#c5@Mz$V95 zh!8i+nGH8fl%Gm+IVR;OEL4FjyowW}&n5nrX9RpH%eIgzPDFHx$yKTbzLr|=rPE&^}-Ev5!G4TsLow-#Ka}@8kzzZOuRwlX^9tRN4PGIfa~gwF)_F! z=52Uk)*Eu0uvG4tcv*fCFHBP7XNfoFjih$>%eboHe|a+=pYC=UZmoCp#DJgWZ7DaJ z@xTnXr_$iup>p3r1>Em4-*Mlb_H4dk+=YoigDjn!uyq$`h>nz<4wTWEGTyH{P}W1U z;oAPAm*zsP;%C4Qo#JPwlD$g7Qe%0Ggmcu-{o zMfzQWXMEm>yH8|+e3u$6cWD@1I5lMp;;&zFYicN0nVx>ylpjCh8VDKHV`KmaPN7E2 zW+{$gVOlYWbt>c4UVBF;}ULNMAy1fjiLRy+p7v_x-hK zw@dkslC5IBwnwp+;ODTqwRR|WjJ*I<`6*P$o0xLVJdzJ@PFu5bm*!VgtfAsgMDwB) z5;%BrfJGj&;Adjz0So!TRICG$)X$|t#a5k_2BS9S$0Y%Pc=LMh%?;u6Nx<_#o1_8S zd%42{G5G|Bx@KZL*4uYupqS1B@cRh_X|*3>L-MfRjmZp~EsGX(tXo5=tE(p_biSvt zBW#wAvCSlzBat8SH~?i@CS@86W6T4GPr(n&wQ{l@r6PL7JszKw%T*HNG0`T`K-&?v zhU?Zj*QXPyB%-Hh*AQ@+g#%n)lRe)$)xe$&McR%E@1G8)b^uZ`Q9_W)q=+hB) zfcp-e+;R4lL(xt-Hv-CRCp<{B8H@Z;m?`^R^Gi^XDnopkr2eOfHv80MLd#@#{j}}g z5kBMV)o1by=ovH;O20=P3PrB?dy36owwKu8@);Zhxf+>7SY7pavQ3uY-N*K}eI|t| zOtZwGXQny0UIrYF!? z>GAjs2Wn-Fr98+E5}O7FIyfBIj5BB>#4J*IP_d3?#O1T-E}tH1h85L^ree(S^~BM_ zFLC`;gMTBx1Q;m`$3!h)qHoyYlfw*3dW6leBRaxNFX_zAlFmv%N8)f~ZawWR?$Pr9 z6t~%O{}jzJvWbG2*Z@S6sTToAB$H_yhzKyGeHf_dSfQdx??y$Qzayi(#Gs>-ojF)2 zRta2ms`EQds7Lt%e|UO2yQAgck0Oel-#p(P#nfkZaR5DwO@Qyo;v)w?D(Ja_Jz@<0 zIZrgr;3ObW!}~KY$%WAav`t7z-k%kK(DL4&k?|#N51r3`U#=~eQW3zAjyp-mL?Otg z_cE{E>{O75-wTrM-wP8da}t1w5L1An3`|sum?(lFU{W5r1tiJb*wF_Q`?Wk97->9Tqzw<{9> z(Cu;x?EolwCUiU4@fEoAaI!>J&kUe6Dy6J$`h0|&kLu>5 z+`O3|gP_Ooxox3P7$dtUZT-V!o*+|(*>hA%BgQ8Ev18==>>3D0$?HiL(G~;`uKMRD`h~X z(FF#J2c>0zB^1Zp_6z|}FVXz{WXyayxn8Es49GMpbsPSxx{^6_A?1uS29J~1JTYSk z;Pgil7qMx2hl8MiQ-7wo@Q3PkLMh)BqXv4SX_P%2-iSeJZph>g%>N+`49E!-_0MFw zBGf=kZ!*uoPH!>HJU%T0H;qV{u%uZa9F@u-mcHBBiXJHt%ku1N}n=EY1<5v zI!a)Q!x>T^&9i;e4X^nL(Q7~|4a{Rx^mu?Nz}0bVk>@C2P1zrx%DDv`g{KMkJzUKx z97zGSv;{lX-z5v2$_QQ4(JJ}KCj-Y;%76`Ei|`cK>NFS;sn)c7q}myt-#pI`2$g}L zI04sV(iF=EjN&uT^E=)1J4Zz4cz*SvcdjZ-m>S6HJSu#Ctnm3=Dtv+B)+8ecV7o9S zc&)Rj9=RqNF+T-X@u(TdC2*AiuSTUOdHYi(2U^;f0j`)63-TZ~f_GCKWWiIQtSiz9 zASwz2m?D~OA%(e$!T_Q2H4i=@s;fOZ?A!1`fPkNXR*N8AoHBar*lCA%Ve9zY^rLC@HKd=K<1w1!hpGKA4L?ea&!cH>r||Z;J_$coUXQ2t@{=xAe!>g;WNJ^O_9P@vsl|Sp+Ec0hG#wv)CI&xG?Psa|oTt3tXAH%CS_~uu zQ~L$j^p~mqG7Znfkv52N6rN4(S=~Wvl!jkX)IkXI@axq0{0a@nb1MCFj5(GeW-?9x zyqDvJ)Sgf61#W?Y4`crCuOzlqug8o?vUQg}M zsl86Fe^IV~spq(CyW#IngyY~pQseV?i2f;}e?r8G zJU%_W4sX`Ey_Fij-%2Nkf2ja(r}i(TAO)C}dGpW8eAIcOBaw(%I4aB8P?n=JJ6dnucj_%Ci&YZ?7F((PfbJu13 z2?)wetHgB4+O$?_fk5e-{C9_j`a2o!1l-c`%RpRu_PKOtM zc+L~%XJm}Jd6}Jo>s>ZIoS7Mq&ZKl_Wp_lg{Uu07 z&;HV^`WkL`VtpC+7vO3aDK5{9&!uEnAdyT?SBU6}Y-DzDE_va9WoB18|AiTg#8tT7 zvDt*r)ynSMnO&XPx4B%zCeyQ9?Acu-PSMo7dUD~C(Hz?a1GrJ+P8)1J_W;bQw<~WADJ#G=ft(o1D*{u-VmQ{=4 zc6O3@({Xu6W_O65EoK((RQ`8TAiP_L6uutrVpJsI?#%AW>~6BZM_qewX7}JkmyHki zsc_3OyDzh4JpC?(v+vf&^D;E(up7j@2>0Vhm)ZT<8Q}rHb#QnvGk!jp%?l54M~9<- zpUq=t4>7#ia1CKk6do4)AK*R54iff{#JWFHuluy{D7#29D1^tHEA!=tnellnn;U+_ zE&GvA7V&3X{y3`^!sD6!IJ3vI9l}q<{fW$eg0~#ppH$(WtQVfC{#2dkPc!556g+<> zoXEWpXv)SbED;4C|nf)rW zUsI6hVl|)ZtmgBXJ@1KM$n1qI{HBY1_$`idxVQiBPRxIw+3(nC z(%XL!$sg$8IW8dbhJHyzFK6}=GL{m&;w7LtUa2<+efg>v{BCxb$l2_q@JBr6^qCv} zlo_8_`Ss^|->=i(e^G{ip-gyH4@&nBe^n>^4NtjjNq8f(zan3=N#XA*z&|qk zJKk{=;GeMx{#kDV#LSzSy~(H;5Z>}3`LE30VxtM|+ZxWZiuN}C%*FBH$ReDMD%z1n zJF3_bjxJJ-ql+$LeUmv`&yV3%3Pn4H=g0Eg#qhC_#)aZ>yilR2ReMg+<`jn%*jFmm z2}L`;XeW^B#G;*8?1T^}>FLS5R-tGo^YoOWox;;x!k)@o6`a{=MLP{E!yct zn+y3FMLUDcSv<<>H8177Vr;E5i%i|KirB@^=8m0RT7A4QJff>{niTa|VUX+l8i+O_s?^vJ=^L4)dCCcYg5nKwB z%ZfI?XlL?Tg`!FAtbeW%-)qSAJ4NHOm|xd=?XJ^<>$qG}G(LK8ebKJ>+AS^G zwMARnrFJ)n`UYy(L;-Fr8X4V40d7(jH|yEWq`#$TH}TqrqVeO#ykdRoEBF54R#oY? zqTNQ7ZZF!cMZ3K?IozQt-C49digqU)?^2cSst=h55RpoCPtoo!+C9Y`!o4EDuW0uc z?LNqt6>V80R<*xNNd~cz3EwLkzrRUg`ca@pDxTaF)MxU!rHk_!;g$TQokR_*K#P{L;Jg=S3~P zzZTK2>CWBq#dq)UT+yC$_RkktdtWHp^F@1s#J^E)zb)EtiuPMBUo6^-p4;y{x8IA= z@45enqVW;MOGV@JJJ0Pmp4-bJdRe*oEZj4^Qq)*CAI-;4G}(f&@E{!z4l z6vID@joQAc=WiA5&7!@<^M4f)b#E8#Ur0MHXO(PL3G!z9XE7WpkKZFX)DA7OXMR+P z%#SYFQ6)RN1ez|nn47KlfNCJ@9gZmxnt5!=jw#u(CAN+wJFXPwlp2{IujeO}?D&$M z!1EJJWPVb~PAu6;T%KIAlSPiYw2AC4gEx7>H z?ei$o`6WBQ6fP(kpL0uf!(yCQ7nZOrUc^a> zoPAfR`d63is*+tzIlisL-}c0ixOtLkzDRc$ad%vOnvV;MohQ@$nv(JRn$q^+JK}Y1 z$-YyvYiY{sN_HI$>C=2%SmJGSy*OP@MoUY!v=nYA8J{Jke45`_vKvcUCvFniO=LJG zA3QgU^(`g4xn#G%`qnsjZmsvzm~dOkZX+o{>m`Qh9VNTHWOtCyoh7@|S>9E`sr7F0 zy_?(jl#GuE?kyRgyU43R8qMdnNmB$-YP8`<2-P zCA+_54{-Tl$sY8~9#UrC7oYEQ`{9!D5y1~i#^)i=?0(Pe5fMG2%<4<+qpIp-C401F zk5Sbh#;X3Xv#LK*ravy(k4pAqcs^dT$4lWS^?5QTJfY`Lmh6d=J<0Q@G*5n7vZqS+ zQ!am2vY&~(*?v+AKUeNQr#OT2c79r!|Dt41m+Tj0&MT{h$bVUib9792rex2QwCj1c zBw6&Ul093pUqSin5`I+AmF(9gd#*G-JTE>kl7?+xlKBURjgs;CEd%}!D%~F#t?e4C?73bl*-M`L%bxoyC40GKufYFR)$z5G zy;`!@$o-GX{ZA$PW6A!+(?4rY|2a0Gi=x-{{4XVYy<~sk`Cnr#|5|Tia{61z{zgys z3vZO{4YEY%s5Jj5+22d{57PXzWdAI6?zrC6)3-|YX35^->Ay<$FP`Sbe!FCEJF{73 zn}s)15{@iGepK0xEZb3KHicz7y39=R>DnG<`f=gT3 zPJ!d8k>jc5$Z%LVjTG`;IK6DAu_Z&+jZsfVTmrUFWZu`UC+~{l*g9VtJWTF@CpnMH{!xpwi~IyO-gWc*={P^ z%_O)bR^XP-B)8(aRt~q-%RM~Yj=!32G}~?Ea7SL$JIluB4iz=G;EoG-iS^xOyQ^$> zml21M+C79ZjFXlot_@G2jTF^=WxKa*_d&HxRLh`xD#vQ>7w}yXeXnfaE!+1Xx?e>1 zL-bPA_~6#?fNnj&vj@xeV0pkS{=>EJ#?pGxBSPL3^8S!VhP)|0%ylxOzq1S48~6zi zQ*n#vCg<-KzEFbc=qk`2uc$UQt-P;ADr#=(D-StZ5ES4w4@~lUB`WuH=b%X&%)P)V`8`ige zw*K6}s|HRC8^-eZD=a7B-aT-;Fv!a@i1KW(Pyy*dj!SuY@M{Qzn{6---Wx9oLn+Tt zZzkERhp9ZpdWg^xoVqu$%_fK8u{@uMuoSqx#~*Fw8cei$C}16T=p< zJnqRo2|tFdwv!hFgMMquGkT$X7{Zv&^5DY|#x&cQfb+r=1k zEy06fJDV^$OpN8(K9*+(%CniL}T;PCQ+o>;M6ytO{75)k*hFxQMJb+@7oE5eU zpYrm2it_BTP(kBi_s;Tg7H-(R*>;z+!jc#$56i9Y(BF)yyVN2&Ct6#N`4%j z!XS7-0l$kg*5=Rst~>|%E6IOq<++f9&pDON=i3o$<#*(pq}eDQYxrM!#Hac0Ls>V1 zrpz;?P+oDi#u;1pZPK&I-Cvy!ZS;>?mG9O0>#Gtwjrc@fE23BX>JKf6gr$Dqx7V3xYW-E=8~gE{9F!vO zHT=d@-*~Nl*E8iB+ppe^@(7Eq6TdYg>UpWf61>miizQ+i)xvAOqea%rd8G72y*G4V z`SPun%~%ngdQBsxjlX(3)X&bTmqTr$-|tmsz3@V{RxRVpFk)E=|7oPtC{s`BTfCI7 zT0`j+ELzW7_tlg2>o`KoGy3Fpu8-CalXgS$Q@VI`qP*zxk-%tD-QMe&!jbgXoYQ$b z_^46M;vtW5Jl20J;Hhg%HeM4(06lS# zB2FF0bHUP-8ZXdVq!&zc2(sRvzOaX5Dr|8Jd+<6Cz8Cd~$GmSJx*oEqBNh`qhHTaR zm>Z6GC(QLc47 z+;&d=HtUymz-`>-b?Wo#x8re)Yw4|q1C$pG{6)=e98~0oo%E^lN*&gvwf(pv!MSy- z3zNVB?YXO-p18LjmENT7ncN~g#6VYx8?WQ%BGhUBgQ;ZVPuUWzRiQp4F`^3mh z4m&5PK}RUTNN#$xE2~@OByYXV^GdVE+2(p5Xlw%xW)%Evxa^HCP+@PK{5TanD0~cz zq3>DiK=OV$76Zn%HrBSC&MG&?#wlP@wN22uO|YKV zgJ42pUI`|Iher~Q4?8jj{guoeVP`FFEVnzeyv33<-1fL+h}2JM#9!}|pIz;jKNoVX*ES(20>7C1s;H6Z-OLNo|4AQVaO~Y$Io^7G452!xd zLI6{0wfK4vUKTP<*-=RjYSdQdAe&|fvEQn`)Pn0?>Td9%uv#P}sWs)R$t=TIIW zT9fOZjz#%e&W8iy2g1jrnCJk;?bk*84T$4QKy&WW&0weurQt*c`3jd~_Jf z$$t3B%+UqCyy6r+KZU#Q&F9Zg({oK~-1+!@I<7UMoGZ$?P@bWXCS^ZQ*$>PLjld?& z%3%aILD>105UO>KswF}k`uKgW-UR~Tc_M6_a-#RYT)<1HMTbKlKlP3fYBrFTlxJUx zZ(n?8C*FNH@>7)giSeS4=X};)!uzc45*0R|3zsH%_es88Ci2U8@@9)Vbb&4#C!Khe zui%!?S560*sUF9!lUL4!{ z8j-6;`1SGoJ6`jqaIGk>r2_c$@u4l3PG?P<^1FkA!YP+q=^4inJWomN5KQ9&6;a zw4dk((8vv-(MS!T2RSryBWIwI8#x1w+{lfba|77lzwUcLGkmi5+g-BIbL*T_r*gfz z_x^AFWe0+f%auhtAPRs~u=6lJwd9&|`;qKG@Nv0Tc4|qg4`hNPmJyT)T-S?!WrL&} z@Bn-dc;CkIfX4NU#dc{aH(~jz+@^AthRx-+Nk~3_rU|Mo@Koz<#8#d0SUN6ln=H5M z6DSaUp9s&l)h~xU|0L`v50E$P#*10(EXTvHaz2CdxW1kG_9*~r?orwH(B#Vm+uWb*4vEo-z-~hn{=8#pF`9GS=qyyat(1n6ECQHBS%}K%jaL$r-Lf}8pe!mCwkLrW` zJE;$)K)wj+S6p%%Q=tEpV17~vK(5bH5D00sm}tyAK<^g1oKyj^W77$Kd^ouIX)Ng(7wAu_k9Ysk1Xzc1Z2>jp!^=t%H06@ zVfd){fz<3czv|JCsf_j7E@$>`@DL0|gmp`~8=6w8wCb@4N)Ph7Q5 z{H_LpGl+%HSGW%n*qoAl{RGkvTwia&`-JY}=hhqHiO&`=qTBixKbiUjbRR|oFsd$j z0_qnS4HDqb2H|P2j0EVb@kab|4yhz2UFi5g>;<>H&&9d zNM?8mp2n4u0sG^+p<nV1Af=UhzZl zeDog}ze)N?>QjOIDuDTYv+N0d)|0;={VcQL)eWQ{AU_R5 zUlAaGTu{c@9_&~AhDxZvphmtk=J>+Wb-@0(o?G!!nk0ta@f*E&ho;d_}MHB=CEpdf-;!HT1G zgCrY}%=Z#{Y@<+v>aiA7zU?+uaN0d*-v1B?AvN5hv+e;9@~XGOH_O&ivygh5z=KK+ zig0@c2tvQidN%+GTO~<=Cj?7a93bEcJ*1H5F~t>`d9qvi?5O}<2&9l#8!F`9t`*rQ z$-b@?*)Pfdt`#{@0nAWEIf%-a0H7h)hp5Qk1}_W-?lA!imHN2gg|4kjMNSA|h$I2l z5S(GLB47;(C+UEwf5DC$y8N_PQza0GT%VyfX9YUca(k|Vb+Ekxq#>BY&xAH4v{(Ek zaKnNLX?URms39*r)Ebw&01R0Nuaw#x*H@(nUkK>11OM0564&0e4P*7XB-ef0B!g4% zNp(Z1JmL`CVQ+yBD*zpK87#LYx&6iu!{?49cf21zq?vbjD*z&D&kX=kJM$6*kvAj3 z;CN6fD8>L1A9~|Qf$`%CK#714d0i|RA|ROxds+eRusCRDBm?Lnk_7NWp${uO`mjTj zg$d$1CFx|cv?SO{ysRj+B!C_wdqtIi9}-@2Rn1X5egptI zpEu}82zJP|aEIEngE+(?kVBSetUw$R`g1j?L%jhND1i)R z&<&uW90D$6g~n=xP=??Rdjm8qG$e#CWHBaM?{S1GIsikC_A3Gm+555A0A$FT3~;W2 zX6R8tsmDq(mO{)ZNyd494U#wDZ@fnus^owS3FCZ$D*+f{FtPHRW%CotzfsXftUj+a zf(qsVhF}~0?w0?4t9%)G_=^<@hAFs15>8RVH@HLagfQj_T!`H_+3f=)oGy#E2t-+U z_@TD@01vsIr95OhTc)!yX!3AFm12%yj_*~Lfjb0#2b2_08U#;kBlCKdg(Kio>#9*OWCupKJ{_Az2oi4yc zt~XR>gN;9MM2t83)(N{7xoV+RFC|2x2{@6Z8PA)AQuLm;$X>N7ffdzOm~NBlHcUY$ z64b0aR0El|3a|)Bv1qzeraLj%C6JdPC*8Q4f z@(NOs>jR}`r6CT=`XGWoDn2_pRH>qYQe;nz6A+7sgjjrY58#J4sKw%&z z>3*O#0i2O)+z~<%w$wqo{Q$yvTPVig1;vO<(2MtkVPt_8Zn1b{K+1=eMOJrEjD&}k zMc~9^0T(q(pD4p8WH^Xc0c4sGrtvANcY!pbdWNdTt7;O$H$JDQqQDzvjKqT)^|<6^ zZ%IWEZQ;}2}Y@27)NlAS`S75v+`%h3i8Nq8mQINIO)M4vUpw^) zQO=ZdmWMyiQcVl(aiJkuuu(Qu@$)pN2!`~FDWJ&TtZa)bkGpZukzgY=mgZFz=l^_< zPMlX&e0;n>o)+M@EnavU7gUnnHIBhaE~@$>zsMjZflz>yWRHz}iAPE{bG5Xp&=z;V zBw444f{r9e0W@-j&l4adaLSdw(1J+H5wJ)WW~_id5(JrC>m7lHWbaILy~jaH0U~mP z2hVL3U=l=R@M}R)K}2HRg5Urr@y6XIMK_TIXe60zQFIGYpplz}j?Avr&AorZL8om~ zmu@e@BUzJWy@OIdjBBQs#sxjps;1v5&?IQd?}L^k-R>#?lfWcD6*h7YGp4-QoqMGP z6bVvtU)3idBvmlbk!*@7$w2`i-JvRAk-#Ri>r@`WBUy#X`H1hYBk=$#ss1`D)lpOj zG=M-#9(yx@Kt~1xs7*PZ5LOb5m7T8w8u^I;k*F@>5=10h;vyoFA*v!Ah=Ys-6e$SNRS#zb8F^LU z$WI;6$gsOE3?$IVkAOy!97yC10V6rCC0KB7QIw)1P>{E)^jmxfM{H|>L4u9Ei!GSQ zd!>bm9PbMgsTKkp`M_U1EDh~P9t`=gG_=7+KK5mM;>!jM@`=EZpMr^`Y``JGMn0!( zFH|-_kS_#=x`6891!{#bR;DhB#0z<$4}j0!6GRE&W8vdSz0-UdY=@j zwhK@aqv1kJf{@h8(Ha*%lIIYh!|FmP0Y}ye9I2I~B@RLoWj)GKAy$sj!byUV3|0>P zca*}C?q@F5C}<`P7DD4<9=nj`x;Sj`m>5}2g0ka9F%iuptrgoJaHVxi!U?@@Sw zj`IX}EG{xwH_N&i0bkZKmw`aC29gByBbk7HWW!1n^y3l%AiFFwwAOOpJSaL6J_6aEoHu7Wl zGmuCV9MZ3%3_Ea;hkU<+iNq()kEkw3g^L8__!)pmfRex=Ie}V`NDVtck--P{03!)) zrC|p;lIH^ycD`@0`EfxcPXPc!EB;Edhl0($eTl$$<+L!wFmmJ~KJ$fcj4kvg*hASA*XU~&BgI0Fa?I&uK8xPf6m+6H=9 zTu{bArPLl3Dd$7NhHyyuhrl994IC19WG$(O1*wO1New7+co;zB+mQ}BvCfy#gCSAD zn;aG(vOWwP@~s^}$kD#AfFj38l>jFRE>d-2ppFw9(#8VB^S40^)CLu1yugv*AXyc$ z1Q)5PqHV=n#~>sp`hx@kNHW#BA|!DDC~}f;kskq4Bsw(=P!Uul2l`Pt(2&I;L}O1E zGExHuOyrF4QqYlX(96CJHWG-W%?gipU?SNjQp6eBL^LVZM1iKfnY&Zs;3A6^nk$&3 z=I%U-#rOjp30QJIIfISFYC-s8fg;OYS4<>u$hUJBbmU^t5!~H-pEzF{X6`N%L=tf1 zXF^4yT2AADi(KJNfkg&$ca?CFpd*Vv8LL&;)fBeT&)vqj^Y}=0|5{W%s8Rrs1RPl} zbR>^ieMMCpa^9el0*C}Gxsm)@WYFU4uFfb{c~cmiq^b-yQdQnkL`SkjDmfrXP?Foi zpMZ#@{QyIPjNB3a9vDcpJHx;rfk1xhb_K(3SE+9p9lOJ}+k4&x8qY#ZNhr%R5{gzb!<3TMNH@GLXxoQl^TwsT=? zCxi1r)y|h@6s>+CY!|}rVwah6DQuU#o6BLlELFlThTWA?E?2{L)la03up#VV)?ZUD z*TZ%#Y}d)2huxDdc2C3h)ED+y*q%w1uqSL5eQD^|7hxkj*Q{qs zGm_}EP8H{6*gC`ZlH$Ay+pBQ4y_yX^%GVk>)e$4SX87G55{UZt}M~btuPD$!WQWyUY zTT8`8MtE^ja!?RV8lj6iYIN2mf2_$)p)Zy_LdPF6VYA6SWiehE@ERNHja8U zM8HCfk61&*#z#JK6I9EI5t|UPiD(-mtbmQw)BlLp#NFp=p-B<@JYtg~-*uB^J|$w4 zBQ^!|sS%r6GA7e$5t~NYzzC>3(2PFER*T-h%JlQa!gl5Y(<0{ zhQD?zy~#>UR>@>_#8yRYH708!wkDFQNb)hS9%0AaS`}n%YhT&~A*>yB4Kv2~z4UuXneplyY;#xZaH27TIm_c7DaBu3ICv zmAZCw+f=&k5!)8A?UZiE+q&)u>e}jctyE;EOm{_WXT)}4x;tXKgSzhVCVMd1E0cW@ z+Z(ZcnCy?({-CbKnmvuV1H}p*jM#yQ9i&2se2Lp*?r_8iha#ig5taBz*P4;?Xvywa z#0W>RJ1)E9KT)%`h_(4%Jn^|DgosU50ZyO*^iJ0G$0N*i()yzBz9ixIo1v|)G2%Pt|i9I?wv8*x{>>b+h~13XEgJB4#L(WR zr|&4`ogif}B1n0+l=5E0xW0$oec9djcBK*VAYu>vhCJC`gZH*W&M!VM6D+3XHs!=b;ex(XfRy{M6G|+21I!t3M8}# zE$IeDjW94e$_*Auba2$SZ_rAl98$6y8a2WY>}q9K>+MRdG%RYvqCHqlhI?}c?TDxm zhDTxLm3bZJZ&s9%Q5%VMm8&l~9~Cu1J=UXTJ=#0hn-@Hdkz`C%%ec>uAA+$_8ygj~ z!ni0)?zm`i$wku;wFa*lAGPt(;tD@O9wvZ)J?+=D(=j(O%F5grwTV${jB<9hKAD~r zwa=qADazT^@;X^w3#(#oic(LB_I6XFHZ|&|5$%pAH$7_8ImsWss;D8H5&cbni$BxH zW@0}}2BxdoQJd{eo1%ua$(!POj$F^dU~bgra(qUVXASeCHZN-P5iU?67e;MC)D}{B zUzkNou?S^z)S9DiaTJ!6B~e=(wIv9bMp?m^MQv%+mMIUFl%JO6QCm)sr*VMfITTdbH41BFQQ2KUDl-$hemZg|Xw$237kNHqdgqgOS?TwToSP<3-7 zr5cH_)NyvqW_w96ypha_*&HNbu40Ain45>C%_Ecf zF`FNA3t~pVAs$FFHT^0u6wE%{jyvlZ0;UAI!XucYM}Ph`=_+o2eHlhrX>6|>cpYE8`6 z#I*LWmE~G`g?XTzY1FMl(xZYZtdALCU2K%wAfpYjZy+riZS)s|Vy-1-TyKm)Y92E} z3s;+Ez8P}{8Ll2i-4=gQ6LVW*M%aSSZ8F-1QBBEcyT7Q7xg9a%dOMz4V@BA))lQl3 z#Jo19d%|6c?xKQB@1PBL$85K6!#%zY_r`2b%=Xes`(o_!_Qz~r%=XiU2h@fKV|E~B z2hko<8y->{7FzjGTy783K1X79gq*7W~Y4n@{8RTv(r8$8Jv;n84S+G>}<@Pi?L?4$Lw6p+7X`D%(xJ<^D(i6%quaw9J4D3uWDv>#O!L!I+RDTF|Nhz8Uw-H^%y^xH)3`@W;bHR zAIzKbcoYAZqWoaqQtTG7j_BJT%-gZTAYK(ob%$K;#*A>At9vmu(|sxK6MYaff)o#9 z_K+OQ+@qM?i`gSz{BG{Ccl1Q|Pq5;)kMNkQXWr3sDV`I35i^1moiXe5E%!2J&tmqH zp{XCtSKiTU*}uk$TT8+#uKL7PqQ2Z}THiRhr??TM;BL5v^Sa?aja#3%^^eO@)D4KM zY6E3I5PNQ|2?Mwq>>Uk}VhGWpaU)1k8@F2TXjt3^$8DG#X&C_zvE$-4Hg4nM+{4GMAzoa~NjW}V@C<-%Lfi=BbBGm(7Q%8*A()bXUR z5%+u&fXc5slj6qpr1(c}vhtV`x5;svLLO6jPGVEZ#SbXbPLsE3cnjtmlId}#)r`1J zkJ}6?IuipwRc6JF>sj$&s?7GW*%&m%HC5)w&m5w2<3^BTUfkyS=H)E{562uSr&-2sM{#nMwBgaYvIj0QQvNxuNokzfvnOu5m$2$=e|e4#({Ire)SZsoskoh{sn1Z)z8bh^ zss78;&zP^TvumbFLgHNH{xo6n{soL{BOnWR@~i= z+ilgS#I0{4@WGVq=ZnNoIZ!9AYZCRYzkXr|By2!pi5r-( z{s|kH_<z<_IKSoXhd3gw^vJ2*(1d+33VK%ebuuTRbZ2#w2)=J2qis5;ivR7j7H} zmnsB;ImO(RSk#>8i5I3h1UN&_pGi=o9kTPJP`d zNn--IXu>{ExJd~{`(%#hP1t0FQ_%Y1HZ@^W6Z&bHmN10V5^sNbrzdQBLOfyuu6pB{ z37d%|>1HJi;jF|TyVZOQmiGqE@1>I)+cOz zLO(bgU`9#U22p4L8Q$m}waC5&t4#?bY~*UQceF){Ekw6+Jb9qlmauKUy|*W9Gqg^L zU{A2aJ8G4EEA~4RM%cmCF7If!6uXJ;Nf<$jy$Rdv9qmilu7vILj-qbAcXUAZ2e3NG z>!F10=jxDmbXbbRM2{qlAjMHm1oDoKCG1ebj>(Z0a>mecSszExUKuo=YxC|;NPdE} zCxO`~>|~;J6I~qNr_=?fIcYp$r|E(->Vh-s0@C@rkh2Lp>znf&XZa?yhPEfPhMrGY zd&16>=0bu8l@}9sffq!H?>YdrV2ToUDPfnPZSuY~t;Q}br~QxkO$e180LJmf{XFVdr+NRJctC}EFr!>2P?JxP4*o~l~U z6801bJ&NZEdrqawi_`4|tBG%=PVW=vFBANryh_;1guP09=3XZZ)oZH62TIjRjn6*G zLhzEbZ_)^TlEv3C{do0k{gS^?QSED49d$KHt4Zokus8KQCe{1nlD_vFk~S`B4U}cPl21t5_@qrpe&QzT1Hi_lO-x#2@_X)cX(uJ^^Q29} zcydti$w9&WipQ5#Q@rP?f#+#So0_y~7*AK)8A+R-v>AAwnY5X#i>e`6%ud>D#aJVg zuE{qY<7!UQ=HTpIH#cbr=O%yT<|S=ja*5LiKE4YUB#khiE?B6VE-ZF|FUz8&E%F@} zd?19w#YtO?!)|U#(v~Ebx}{0;q2BRT5mw8Rqulb6>lI1kdIh4Da=jAQJnjxgJRc>m zO7<-KvRj>GfUQZ|>ZGknzWuo&o~|sbDEG_m+N7qb!F|Tl zh}-5}FwwRrZM*NI9YG(pCT&O3TIr*mNyBPq@?*D4y|p`OyOOpW#h#??p_fY&ZEw={ z`q{J3`^5QvwZnm=?N8c)fq*V($0D} z=aP0#s)U_Mx_0H;PNN0O7KWX>9=Ldo3he>;ow1*f!QrgE!dz7@tcz%+!CrS6TI5eIm z?U`aMp#YL7vtPhpB<%&x-gTWxL)ghgdzrMC4BA(vrg)t+!Yi7hnu7(bI#p^4YS|}c zeNtND`uejkm}vb{)-R=pw>2rNNiB8#Q|1G#dMU$dKx&j5h;gt~ri|-Bhz85`U|j3{ zmM__mlnqJsEc=QZnqq*}rfg`+YExY%+R)V7i8d@{!%|D!aCsT-y%ZwjQwa>TC=pBR_2 zu_+su`mSq8(e~q0#@Qg_Q=hsCDc1D~97y8tYB8UfVprLivWY2cOtIA@Gai{o-K3Op zJt?KTgc6*IhMkr)MO^w zS!7Gbvy^e6BjRSOrnAYfNu`~WvZj>Hfv~x(&>nGfrJRd$UWy<0`6-*1viT|Pvf3hU zfs_kSE=(CAkROP+MUpQ<-kdUmmm|@CTYcA2_{Aw(oYI}(l2n0jkW#iJWlK}V2T{x9 zU>Rk&6k*@8T(RZEIwEg3ohwoW2q#ubwUV4xrHrtGtJSGOYs9UQVhz!?DI-X+E@kV; z5emMPtxnl`U&U^2gLkx1_8YNkNf}`SSDU<}%~EV8x+P@iVLMkly`x=H>>|25Wdteqq->9Ov^QltQ?}PTin@K?(SF(Q$Lc`J z2>ZA?=p7xB;tnjNP8k> z$5VD9RorwI_Z0Nd$&{V+!|RkEUZ+!bDrKh`KxZ`B&Zg{4%FZ&p&S`kHr|ewH+R>iZ zs6JmB)l*{bLdq^MRjS-YvhPLS9!=cEwAsmLwf1>p+rp*HVR55qDk1 zy-sm&r0hn@-Aow)hj<{#wN&Y;d5;Q=Z)qUkPT6f71h>$4Qg$n4cTzuecU9VZ`g1>J zcT;wsB0oskJwDk~!5^f8+uwB&_efqIr|dCa_V`=qCn=XuJWrtCRh zUZm`qyx5DP4@%NWv3pdsMBK}ias85I;+5RKPT6bLqUyB0N?CRK2d{nFMa zZT-@m?VGl~X*sM(zbRDzv>a}YxB+S7dO(`pWg3Tr(l#i)#0^f{z_bm<;gGZqQDU~u zDK}J(YtuF~ZM8Tah7%i>{$?4Nm5QGHb;D&aB5lLdHUfjXG)+;LF0M@M_D80<#ja1= z$h6g`fw0TLD45)V;#ZY+=%dp%I;}@>W27B}7FbPf#En&SEUCt&ZCu(l5apd>#EnlI z*W=TyYCL_N;A0aoo0wLIH!4*l(a+OHkYZBWCZ#p+CZ}y;+9vyyWH3dhQ!tpCwy9}1 zEzNVS>1msmw&@6Gpbc)f(>&LjmA08_n}vLK+GbN+(3xq&rit>Fskn3GZ4L%=(>6El z=A~Ja=cjF6+U6r%kp2#DuG6+4Z3~ru(f6XXEy9_(W~FY%S5t&ZvRJXj#O8Ndxt37B zO1D(1rFdMHHo_9FmZz2f3Mp0)U70q56syv<$`^HY+LotnwJ&Nnx5hhKEBm!rtxFqW z4Oi>EqYYAQAi6Pa1Swk5*5X@mQ`*+2ZBsh9UEb^+ZIS&JthT0&u$ilE-qCg`wiDfv zHi8tbX>0Y4cBXAx+ID(JQMb!G+AaItSnWw0VHa0>y`z0n>?68AZ3HO}r0sxrbTDmu z({@mfG(KpEL$W@EU{&dM`LK6?MDin~J({+|X*-%Ou3YMhW){4(9iy@Sz#Z4TXiMAi zw6&$b?@nllpG@0{w4G##pVAONRT|=?JDs-E=^hn-;?5}D*|eQyKAlV3nY5it|IoE7 z`T4Z9r|mq+FQn~4DKR^mi)p)<)~&;(v|UOsb(dAf%W2+Wm9{EZ(sl)lFS@H~yNX4J zEIP0lRI<31wrgqKCtpwN=ln+6uBYt=dEKO_6!s>o042Mngtr(1)o-@%)e(0asUPKc z(sqY@IL8+++`8XO+ugL?!_ED)VRb+Kv3sDpJWShzv^_-eC~c3ZOKJQ5IBk#pXnW#) z;{0ivvHUD;Pt*1+{h527HdN2)ffs3e;Y~Z!#rx!!X(M!|i}%T|RM=M(7KkS0!`ExI zZgs|9r>#2kJ=Z5gQTk@APsaLYIKnqWMf+v^!sD0nnvB-FnuzP4F|PY(*drpc0hw=9 zfV@S=NXu~9@vXKZvvYtxvFk!DOL zSk=b**jNn4$-s2gkg*1DIzD4a$9q$9o}ip3U@$Rb6Em(c!!q`H#u_vBIl@U97M{r& zo0PH1Mdwp|YzoS$86yO8xE?ZvrV2M*?xv%hkukzFu4ZOb!&y?yB04)`1Sy&_*5r#c zCu1`+HYXFT3v<1rd9t5})%=VR=5n>bJ6b5kLZXW@Mv$U8W6j>t;*2fG*kbP}>Xvv% zOJ% zlB~d?;A*F2!~cdm4Vb zY2BSEa4yImsrKMtZ^j6_x!RXeG51TcpXh;%5u`Ynv4a!>fO^LEW$X|R^`!K$cXUMd zN3c4YF~VW4j(JDNr8rKsEn@^JPGszaZ_tw&JC?DN#V$VO9i5i_X{^pD}Lw{1$0%XY6LiZfD*;DFw?Ac6Ty%he;iEcQN#L zi1#vfFQa?c`x(2>Lhv9H+~_^b*n^Bc%#3l5GKTdd7M8~(@@vhLj1e9qda4YcvN#0m zIP2FlEm+Sp_AF!1DaZ>Myr5UABf7Bz5B*ojbwQwL92mWAC*q<)Ehm9bZp3C@R% zU!tqC_BvzLSw08P8diO>AG^L;vgwz#zFF&sq9$uK*|$q{|E%@TYE%s1yh^@Q2)lt< zmgqrQ8<@30+0WeItf3m5?d^tSZHPA=nk_ETwOJz!%@&vFVLI}17-wEK`=t?I!^KfO zB5T95HX{2ySEr(k%vxR6MpBgeEK77fg<+ofC3=(`jLLGyUs{hxBjNd5#Er=s*JHBv zZmf*PV#G&4K`V^Q+PJLxszIs-RDAb?iq(63*2YujKX4PWHX*yzO_aq%EcnppCR7lL zHd43Gv-Ww`O(N=(P0nhGo|3i6S(}1-YL+E>TGpm!Z5q+(S(~2K5W{t3zt7Tc$aJdxAiLS^RL5h`GTj`6mDr?KK zwkjJe(W||qHL_oW)!M8PR&%w^J6bQrdZHV$Mv!7-);4-aEm>QawHEIv>Na^tn`OTl zt1Ve0Y~pIGceG84ZA79L=&sAIsX&tQ{lW@vNabo-HoXZOWvLJe#ycpHS=svH4w==#$w(U8OrE z)hQgD&Klt)S7)*+=2(L|^cZF3SEQR+q9yxWLtA z@92sYSBPHC8bOMVtabPXy_U7hS-V#3;_Keg4cXto>Sopm*SWgo9o?4VHqkp-BS>*K zYj?e)ds(}cwR^=bzV979ko^O!9%hYjpQ}gS(PJqd6Md33f)r1)_S8FimbFJ&dsgaV z8sfREpCjNnpPTx&#=Y?FJ0UxRXV?%1v&lLA9!&8*aXvN2@4>X3P0iV~+-Gij&QMLKk~4BP!<){`6@L$A<%}>hSNuJg zt-{Wxu$TNNs@&W(<*bP&FgM3H!Q7n9$=O^=F^@`8&3QTf7Wk^n&)IyucXJDJwtzZ) z(Jjo`LOOMkFBngQnsY{2M1T4I*OS1UEzW5~EYXD$FU{FfpLki$mXUaQ&U~nMD{_X_ ziX3lUyu(W&w<>3=eDc*fL%15<8dYHpS+tj`ur_CFslr#>I#p`nZ zL2+dO+37(_x1l%=H|A_Z&Nea*TS}GKl(S9bnRT0UMrdIeZjs2gs9t{Xco$ns3AW{I zn@_MkXN0XJ*ddYaPy%fmiVfJBvsT{*J9D;^Ht6Pd(|~(( zwio9-IMjt2aDUGB`@{!wc7VhObLIo|i8;gS5RG)$JEQ@Rlk8}1U_apZ-XQ-Z%=9#ykvz{yQa}uv3aSzJvUP$tSBD8o(TgY`v(uriN z&wx}fbN12?j8{2(%W7fIMf%q;u-e!2anI-45@;1vmpPjeaIB&`ux+WaVDLJ2;x49%@_n9}s9CY&~viUd<-aIk- z7UcQ8SeUm3d0R+BEF!fnqP;sp{x`7n5|ZzVn)B978-fj@^0qjypR83Ow?rwHkaVfq za9Q4#=53kpux9qBQZ7fiBG0~TW!_fgZDn3N(k2#UDOaIfoi{=tpAvFwBwvGkZQcl8 zjzs@$@S~4ULDuDM9fje9xIAx#Hso!6-ZtcmySI&Uu#qw>3-Qz2qF4*DRiU>x*qic& zWwRuNTcfvb5Df^RHoyr^G1XriMqcc*RA$m4%1S!tt?VNYi zp10F^YnLNUT^i!Ntj{B8F2R#8c=s12zew6kdApFeOZl$5w}!a8tYLK}Z|P)=W*tu3X#(5kXB;}oQjg|u*lSuP+VGQK>GT2zXd#f;Cpwd0Os3b-<19)G0+?NgZY z&M0kZDa7-T3~rmUn6gLBSx$>e9@AgI^cQ+VL-co~fXl&(?f#3H{$g*@5XrO~roV*g zFZC7ykrc2tSU0t7ne^|XdsoMP`wF-(Vg6-AU+(R`VqdbaWNXzP&Zx3O?0P#G9D*vF zWfJ?!V`?HbkN!al^5d$v&165@OtnEXb?eehDutM$Xq$*dEF4rgN-g-1h}M!mj-D7T zWkv9N5?)6l$mGAR zE)73h7vJSw>Y{$m()0h{)x~F8tV`YBT9>}%m64z9kL=I($Bdv3(JuY*bLtQbm8d#F zz2g)4fn1rb_hk?=8-_Upik7rwu|4De58Ly!z83f*^Wvwb(EqRP=`$_1=jgw+J^!%$ z4HHZ`)&1!efKrzI23uSXT}-;F!a6mqRspNZj`e=SBzn6P6x%4AN&H!P{Oy$aS-*v5 z-$ho|tE`NcVV-=eJRJyKsF3zkhhs}3#zoNk@t`Rhu~_zVpEJn!@}D~pYSvcF ztI}}P^!k7MFIa9W;Pla|47Zm5SMlR71-?Buk!;@OpYnt^3r?eoAB*D%d#@J@)t7%t z{{?LRlz(CX@=JiXWP$Vl{b`n`U&gWr|EfHnRR!!uZ*xl`hjHl5zuTi_8m-yF> ze*tTiN>)ipf4(1;TK1(px|TR5Ih{`nb2iVWHw|XbVKe3f{ZL9aY#D9rvwYk{Rx{ea%sxe&Zk5X?_ zZgE=u*nUbE@P<{w9aiCay0WyLxXix5e>G;%m>AP~G$?rQqN1jC{U(%KG{OLLK zD?cZl{QXvO)YEsx+3}PAeUCDf=9;*<#240e^r|NUPPAZdig)a9v)5=>d#P?++v^ug zD_Uh?%GZPS@e?h(#Z@n4uz)mvoyC!((Hp*Ac$eiYr2SXthlO?QZN$yR!pZB9uNP{* z&XN`??mE6`9QD`vAq!|oTaMN*a8r?xNfLoJ9);E~uulsaZTB{<_f-^M<@xi6h4I7G zTz{AN-{lGPhlS=3-LDb(HP6@OGimzJbw|>j4+fOUdot;Pphs`_wL<$B-1}U=FUqd3 z8KhnIUNMs|xeri$z)8Lz7B=`ydJ*r%(Lo;;Mt|r&B=TWz_jUWa&!qN4_xF+feGbV{ zCjUStzmDM7d%J&F==g&B4X%HqHw<3?(0&uXuYXX?+kh;-?!hj@7s6nyTwf2b-#z=_qdPjRhYzfw#@xL@!#hOORqvp zFZWM~{FC19pV~k5nXKyN{s74zfT!z5CjX;M{uzRQ*4zE_LUlLyFSz~}yWdAm-{0kf7BZ`u>Zwp(%1_|u#o+)d_mT-Z|I&V7|I%O!D`xWd+@GNM6DD7;!f~I;zasvxK==15 z4C>|nHIaYa+x;8+H$Ica#u_V4Y_ z3>L9sCcox-qv*}#`=IdJXYvX0Pk6HMLE+{H?ngv^)Z0N9<}uL9 zO(s7^@na_62ZdIj$$udZ(O2^ag=HVO>T+V$kooi}w?5@Qqxm1WzLNHZ{HRG;^(&WU zjbt@g_Af6qb#nt09YA!TCmQ2#KZRnhUv-0|AH+IZ_d(&h&v&pSgOQB>pwRGv8=|O4 z#D-i!4_vLJwdCBaoQIXma=2sxu~?zGo2yf_j)Wu2ZG=e0;20wmbN-5}m%g5S z9`-DZ;BJR!W|E9T^0a56v!}?$IFuF#W6Etzkn_Wy;u_<`S#n;boX3^RvO%&2EXS7@ zR&^807)Q|(oharpah^iW1LJ| zZj*zY+j@$6j6-M1xkWioEtlmq$);gBy}Z!U&CO7B2GN=2Hoe^VJ5`~W^RK#D($6BF zbv+AhKIhqz%tq4Ev#_o>~29c zWFctCcyZn{5WqUd$+cqE>dA+Y@R4zFEzD|De15Q!afmI>TFN0JbDP9nwYl6jl~~Bg zVXJt^;2+bCc-U=If^G1UHT6WdU9s(Wo7;CNe$II8Y9!nH|7W zvo~t&DKfGU^kRHuQV!9Wj1GIF!x%MrqtQLZOvVAX7#$TSnT(EkqhlCNk7%;~`Z|PiV>Xw5svzZ>Y&WhMJ5AXONIVQFaD` zFBr+rLhq$cgOV&{=Wwx%rt!(!87qUy+MO>qLVJ1f*uV?2ynto3x2*07Ss6TKYNJc# zh31~_vJ5U$nJZ!|b63laaH&WFM^+soC@VcKzoyKui?0l>GCdm)GKaCO%-t+9mVM9N zQn_!J+bvO*eF|e)#kcJaB`+&{$=y|UcPY=M_Y0kVYTc9M9+D3BCcZBB%L_N(cMl|g zK*1i0xh(i)cwaPToR+KM{tkIQ_Lfg1dxGUtYV?kS!Hn~9i9Rof+06KRzuX>|=2*-7 z@R?!o0)x(S>*O#e9`kLpr!SiZ6_K9CP4|up4Qb0hq*gJxMY@rCqaHQph^20wCvZV-Cy`y@>z!3ZWRBWMULk@i%%$ zEwXRHev@d#pceyP=p8{N7J^BPHxYb%7bv#zF2WZd0M2 zTS>eVSdA#tvitr01jpTIz`z|w*hN7aN3w2cB|-|R*dEI1MQ(2e!+oEq#o!X-C~!p& zh(!$IuunxBb`bI^E%*?JaS%AJX1rgRB5x3gAvuhssWhpNR21gF?~Y1-ltLZjU2%n< z)HB`}hZv`WQ*s^g*5(Z%5o3|W@MHz;1alZ?ffG9|3NbN-9RZV5@#bd}_OLTdRH(x^ z5S)oxtw{uL*g1sl61F3((d<31*m-8gp!b7cw+j+nKwVoDKrF_Q;Rx#9=jZN{VwbQV z{eGePebJ1uT2hcJ0C6frE!NF-@H(SJEk?GmiCyEf6W_yS(1?-X2Gg?9r-x81RN@o6 zRpD-HCf^Z_7`$O%aMUsPL>XrHiZdC)Fpdo;|0$Zu4>bCq2@63K1_a0RgFWEtafJ%^ zM2aUwJx`cP@eJM>KklB3NX(x5QgwqV3_qPR@5Jb(Sim3-ofl>@4I>@ttNikStVDd8r z9-2z1z~m|VK@>VEf)pbw;Q^DM`bwC>tX_UJi^+AA ztVbab&<m9+{#Ws>CTwMeyAnw}WJFP_7 zRqQmfZIN{goz}$d5Zg#a-_mxCt%R8@dq|a_{kEv%wpJQp3uWoLe8J(hjiLt2*LHQx z4o~K_qw-@oyol};ix<>g90M-uu3$H{Ta;a;RC{E$R}5Z7+AcDKrHinylv(zKO5$H$ zdJ?Y#ZxSC=;zN~Cc)`=fi(8cx&Mv~?pG|CKYSg1ja!h1h5Owh)x6;@*s)-Y&&Ec}1 zuz2AJb}rbwPE>y1{RDFt6t<%6qAJ=xVSGj&A?||0>nx00=PI?$Ygdc5lfn5)h`QVb zQFKA(m0jsa2IO3`5HyKDxR*==CA{m zFTgbw;CdyrUC?uVB9<;xH^}>DB^+Hn%lIBe7SL|p68RQ8#L5bGh*TliP<~CMTz4`2 zsyMj-TiowL%Ec|jLosu~!1Z1CNPZrBLaxX7c_Kegy7=)7Ttdk`!w)DqXt&_vdXDJ} zwJ4lh@L_dUeh<yfy7xMYHsU0BBiH z0g-5jhOdi^%Xe{26{K8NQ}vPSUqv~$fRvBR^**%oC&#&fdZdjEK^G3r}8u4-s>gkWl2}rpD#7iAI z-%BG^mij8FxuE6xL_A!mMp2j1QjDpBh70bk(kB0F&~DjS?|ocV;cgGtpgbBdhiYrQ z=boBSRcLrelv^y8$Qwnl1q&DZ#40_sg=CAnb)ueM%PXdcQ%jRzs^{aHN{O|yK(K|Q z>9U`W{fsJ@wP4#~pXeRUl42Io*;TM=c|}u|HF@qS$hBrxc~UL^b3nFpWjz<}sfKq{ z?0JgLBk_En34~g#lSCI*+59TFv|ts>Zr7YpE77Kl#H^);Zx&rv@hqstO0}5M-sI70 zcm6`OMY)%HwymXjgJ)}*FVAw=vU-SP3tk!ID@Cvc%@*IPh)oL)E-iseyeV8;tfUCq zaN47SWNXydP-(4&+O5?Oi*=rcYhBe3;oYK>Hs}v@Taa*VWH_~mfeUsmhE9tgIz1{* z_YlbzYi1P;TcuA@w-$M}epuqx!pja%u(bm(tyQ*NUf|Kv@be{sRf~)E9*}Cmtp%l4 zJ9n&w{H`TqW8eA}z0gL+hF!)Yrwf1)o+hsBd^jH)Vel`&(5;xWUzJ z@92&ccZl856P1?sIQPZ21&>zo=aNzUK-LcsRKHX3PeI&6?;cJq?vC;DSZrDb zxmIb<535$0dn!gPc(s1=M-yVLXB0U2(R{APfm;j0trt}vL$pN{j;&77Y{8aLWv^%{ z|4YNYHFX4i%S{rekfW(9**V)64x~ydWRWdgr;RMuZBj zNw~C-*CB^biy(Tf`jDROkCI{((a|E(@`^ECsI%(Dk`?q9{8=~xWX39o{dkdQ**LBy zct;bZm`JqIlV?c*Z`S8*LE$(M!xofT#r`5&sIx?##goCLiakZqDI}TdGnuC7G@{c( z5Ne4at2PuYLfoQM7euJVeKJfyjXeUvObKQpn9_q=lv#?+f=_HlQ9WCN*{GX}f+h)? z5X_hT9L45f-`u0n*h8#aERf_rPn24aZgESqfZJ)-MT85*O14O>Taaz3Wq3xZ1kIsu zm9Of-Gdp;;SPSvCMzJM|Eg`m6Q*x%1fAv_z=Iw$c-6t>bE=chn+93(-yNA=!g+ zwOMRh>Y6QL+_Ej|8YcHv?`WIsw_&xNN0A|@wgC8fN3Bw{65SbsMawI8i5N?cc5|yO z`Ybt$ia?91?Unsr?DvT~%l2@!-#Y@d8?pmL5Atv^P#h9-mK+@p*?y5^6$c9qaYWWf z5VR-d^{AppNqkI1TE$zKr{YiERP|(hVr@!a6?2|Fk!J5Q~_>@HLFyB+pLTsyX^}g zX;6SWKE<6<0q)BCUDDqZuNJgg+>1RBu@Go)8L&*k4Rq)}QDAkQ9gMEs@ zlBx^f(_&2|{ZKJ!!KYO?PzINl@g?0bq{GAC;X^#}XhD>vBw5GjbHwUUj#QTQVS`Mo zp7Lqvj`GS;DEX9*;1g+?`L=^fi?tE$yPhqKlEk2_baCrLdCHQZX0!^K#iFn+qC;5x!jNpiqg9-)Si_^m0*HX~Jt!WOS*(C0 zS?YQMlV3 zW-a0uslp{OZn?{v{a3`f1+NxsrOMwChG6TxiZ=hy2YRimVMw+#`z1Z#rPqCm>wYTp zI8i=tguhi@{T>~AQ?Z-G`o4#=TZ-KxR-@Q$#cmTDpx7P7?ohTt@A30~H(a=zfQbv) zJ&NM_w;<=@1a1`F-9srJ67}p`Uh!DeTN)5g!Z2|`vZVo$bx*w`$hTNIv41YIEf~4@ z#MwLQl%kU;d|L!5UWso@1LC#k=6bCGLAz8(RH8lt0`&o>-8TZkmQ`~FtrjJ!k)noZ ze-UbV1zcJKJYmy7PqQ@;jwX8gy$Y-c$$AiiyYxfC4OVn8iHCSPt;x+)@~ zEGbrtFH7SI#;g@0%__Dd*+QAco>A?XP_fr3x{f64eI`(4u}l($DGSal{x(H|1t!>I zw@5GAtX16u!6pedAz0U)P4s5PHb=f$)>2e&kwElWTZ@9N5^P1#D*J7UZNq*~_rj{~ z;?iQXN$xu$wj<(NBh1R35o?XWo5jMaj@cc7KnwCLwG4OKO0XyLt@0z?*=FxmY%ku9 zDYj3seZ-D;$8x`7`-!!6XVZNkQfN-NgOVM@Gb~z!16&=3XRf;_wAgDBJu0d!uQ(>& zEOpIsPqcO17oeMK^Nvo){si_X#gGMu79W*(N2jGYP1N&ac?JAfXMNY46O9%OS(@ru z*X|vim;HI{FGP&c&ecWl=#mtdh+Y;kmRDSf*cI>Ss`#^@#*!m(W2tJ_WPc6&>k-(n ztb?l?-qB4dZW6sE{wuGzE&eMFmOGvc>rQE~&=4FC$i5OmGhd{zHY$3L#P=gGU}Z1* zHRFNSjE9jz8(-f^{|NnKQC-15#rD!qj;B&QCHgF41Sy`2pHy(o_LPVWek zE4GtZd5$ZnuX?-J-VukyhOC+oF8V}`AVuFO^j0cdxoMjNHWuBGE31}M4_vK#fram(Kic3 zS-~|)-voP5wI)0Q=&M*45!7hH!(qklGRlj_q8b`2Zm?0;76tPqn2(@N_Rw0f>BN3? z_d<1d5nXZ9P40`L5L~(DC<_F%R`6UcMz}=12(1-dS4(}%c%Ca3%_uJ#efs4}zZ_G@ ztyV-~x#C452i&jxzbShU_^7h#z&`&|CAxd<@B4n=uiq~2 z8_s*rIrrXE=bn32PiL#cxK`!Ybp~w(pDOpt06Z&3OZH!>VPiw*Y!mDO*)|dn(+b(Z z*5=NtUA-Ljs9Qv{@{X+{ROx_i^Vq9xzFG;OR!Rh`iqVhwot+_Cfw^Mf^NAYdXg~#M zg~+i-gen~{cvfJq_UeFf-8K3|u&NmNh=OT_G_rNTCjw~I5u_Ej*rHi^#~~4_ln9>H zfzAM}a>K?EpXjLKj}i~l3OT~oai6G3jwV!qR)`!YJA<)OB4|~|#jGNczM1KW(~3Tg zp(&tto{@TnB4;}Tu*we`=Q?Mb-xIKk2_&xb0#-q*%61m3>OyB=RZJ0eKs=wS{a)~j zs8x2wbIUHX_uRc8$SO))l~pI*`|g_3UgIRX_g>C$U54uzTJnY)GTgw>nm53+Vh)L+ z?LAJaTeLa|&5~m_^P{rrfM&|K!q2IX$7o`8*UY@5y}dv)xRm+{y1xK z7bsWyR$0;|+xQ+dE84!4(g3Y$yJ*_EtV_1OtAJMAaARNLQC7>?63^``0IhJWLR~G8 z71S$M8oR);(jZkQ<`wv=+#y@*6RlJHI-;OhAp%=%@QF6cu@Mz=6(WbHROyh_cY$dI zrz(HQ*zFcYZ^2OCRn^`qbt^@-`JHT+x*Zi_)wV7mt6+8IzE!df?>RtKObhYuQV)4p z704=8vi?0mtGMsRxks2L2vvIosba_3y7ye8oQ*j5iBpxg*S-g@3j2QSFsl$Bk467h zzsKqn;3~$=F5d`jeJ|TxBrE2LXxraoUU^8`Ay{U+-s3CbaF=XTSD~z!Fp}@6$5x4M zb*xLa`aNN+c!vkIsf!p@azL^=;d}d}Xjj0j)Q|);DozEz7>O}PXxV+ zdvDa{E?}&@g@~STtTx^qj@&t6J1jLCE_o8j+Nk6S9~HURxCcELbO8U@FXiG zx*^~d94jSaRnjNArTAM!-R=Uy3c?kmp-%+4ikoND9Jxvkpj7vLjUEVC1-&YN{OJe~ zRxCzhXzHqVwn%NE$RlyA@?QyntP0(eE?IuZp;i7?{NSk&ajl;D^BsZ}i;<{pVpw^{ z3lXez`o8P}=L#-W?(}`-6P0u&zN9PTVpkEW#I+jW&%l9l48-9XR^BnVs}1%nnIXVi zy27Q(SD*70mK6_UFqCvt^}tziFHK=sRmkHmuV<3OMT-Gyg$xIa^XcJcWLFqh?brS& zkz+=8g>(hm>N^gk6~BnnRUoS}NHk-`v&zpTS)>`Kq>!rMT8;1eZ5UPr!>)p5HG$xX zU3pYD(KB^&k6qzdO=3r1&0(zcW&r>zXaij#SHZ91$8c0)YI_OpW%Jl7bJM$K%inV_ ztGJb>d7!FhcGaL#*)`kR8DtgqS=eWH1ylvaisi21M*2sSt0+qJQtb%k>16 zisvj{zY!?aFany2$s*ct4I^8+X8Adlt+H(;!#3fkU{&#sW7q7xcij#-K0#B-;n7s; z-*z;Ws?P1QPXv~VM>0h1^-wC2sv3QweRAwW-QQJIDmma&9q|1No~p4cgeo>IYd3%RS+sU08^dwiQrP5?h2PGf5h4Cc}1VczEo|w`I7EVOl=p9U1Oms8mMiR*axztjcEu zaK*F|cXd7^L@RE%G1TNUg1h3e4u;x%MzB|ms~A=)V~eyFGS=lYLce0-iF-pn<6{{f zW2nz(gnh-M91Pp@8Czv&#nA9>wym%5SS(}G#n7>yb%i9Q2PfM_9<0E@LVJai!LozMSS8&cW96>@0We~O#$pZAqp*A-`m^MHv9Xwx!cl5gO)$X3 zVp@vfQr-YAi@yiLa4l~DoW-z=;nur)uu|GByRr-TER4h0!|-luzzC@$P)7=GtL_Rgi}=YzO%X8*m=;fde4=S`yar-<2QaJ|{--wpV@(wpD}M#B z+e$@OVqhdC>ny3W$TeGxEWm8=zg|CBnWO%%@<^;X)aBD(MxL0}{$(^zOZR}Xpl8ho z{!=Y=fw)-^vp#g5l=aE7#v;+NGy$#Ymc7>3Emj23OS7+740;ve7_OBS<##6x4NLJT`x6<#?nrL~2(1}3ZhF1FE= zu^K(nOxE08>^@&&pR5#sp2ZZk8%vvg>C*$!4xkqIvIS~?adh1>$6rDIX( zAZL*XbQaT7qRxPJ5k`w)+b23F$2rvIZUSY=abCPEKRp#w3tm?4>)@hKbV>1-hytC3 zTx9EtPXsTEQ5h9V79z)W@v{8%v>RwGKw0^NO8svt`X+{hK~?XT)LRs}-3@S7VeXm6 z9bL-+vs#1hp8WUl-|q%13wRbQnf@e(dc`P;+9EcVcRUgmOZ@;I>w)lCxpVS~PXrc= zF_QSF;$uO~VtDk4AY(B-MFoF_$N>`Tg|9w%tY^Yw<*Uz0_)5{QFz{+RD<{o;h09{P z%1`U?(mNIIFSS2^)IFfPe*JTx)PbmjJVT4mJKbJC(-^ z6HQV46r!MFA(Ppf<`aR%;>iyxh%7{oncZz>cbz1aB51+J%J(w6ou%km7;0G>@9Snu zolOxyS=6>lY8C2SkIdq8bocy~U)|TulXo88`RYN~So1~5QY9<<3Y*0&7U#n5{rJm9 zfwO>S=`^qCD{>YyS)7YKIV)!`>nnT~OPJV~ikg*+$0C1eU&f7E`D?p>BT(6wSt1}U zrnG3Y`!Y*h-aQM41dd4?qy=A#0Tkv_U$bqOL@82yRptZ#}lV5H0iMAlm)% zLSVTjT>&7kc$z~`m4A+<02o+Mu}%_lO2313y1Shc_=+J=XT(_{uiA(8bKT)xLB7(X zYFTr`db2OlEUWf-UfIu6{(^v4?qYY|6}sf{SC=qeRt11vF;%4k)vCZ%kG{H!^O`Df zy*s2U;8r}^Q3b$S-F#hvTS8uexl#pW%~jyGFLArQ0(X@C4(0C(djl`0@>t^$y*U}QaO zufTIhP>!K3 zZiAXoS+DLzY(E67*O9(!nLoFm5^RQOhi9CJmw(f~5g zL$Ky~)Kh0S-zTb8d^J&^t`L#07WzbsjB^jxE0K4ajQO=(t@~J=LuTt0Xlt7cq^WXQvvW+8++)B4YCzKWewSiDJ1s# z9-ksxF}H+l#q1Hsw$GBS)Nea_*cOqka_0(UD-!Ke{J$Yvk!X(`|KDUQO%{mWuju{s zTUkie26M$6ky;$|JAq!sv=9}_71S#}*Z0VOv2_vfiXo9owZ4R1m4>8i79@_eft>58M^saEY59zZMbSEu}icar0ryYNo?5~uxD)B)NR zInVU?M&Q;v^eNaYUb;lP^A5>CUNM10yCF30gKm& zsGlcbfyH9%?4gRozhdx21!jfF;Q?4W7S}!H>bgG`g@CY>2nrTcNTP0e5SGALw|ye0 zSB#UW5U&t9fLz`4=kR?G!Md+=n0|TS6FpS?L!!V;ArIJk^Yq9H!!lh<^* zF|+o6sR9~nGHo`fSlNbmAY!q*sqAiAPmox;w5RvXR=gn~7Av0EXNraeCX0vVJ+oC` z5eSRPBPt9mM2Io|g;#IC2=lVoYv6wItHD6FH2wBBYv6KiH7L!F(55w{f zKv;`>H`WN61r#ekBoYl2i@RzJ70h7X5hjaCBZZgxoq)z-ghYjkwX`Q#ETCTbOPhCx zM7sKXuv))aC^i=Tz+bMd?8(z~h*vAcz4}L?v2f+tSRMWBzfS!N7OPHJtPeqA`F91^ z3C)zPdB*|AVzS6SA!BXmDKJ)N2Nw(WRSt~B(Wvj~nOM0Or?+@i7F;a8iABoF4G3F( ziLIVD#zS%C+}86OfejiEwoBWNwn-N~EG%xZ(dwlE&SD~owpH3LX}jq6?HUjodS+WY zIq+FL2cmv^gu{ZV#o}jARlHG-MpU3!h#dQS!p_nW1f2z9>wrIkg%Grq=wroyOcc~C zY!^4E7ug1ZsVRLYd&Ga84whvwmXYM=+xi{BwphG`#8deWGrfQK zK&&lBT!=WWZ)526flyn_OEI*`@P0oBa*LHr3?(YUiZt*o#$rKq-r@2a(MzoyDceW@ zI-`0)+XBVKQf9Ag>)QfuG4P_6^%81J4xn3OJtzp)7F4cr9u%Zu`fUNYn5tqZd#C#w zYE!uk<+R}5+u5_eO%r69fTiVawdvm54k#Cs)%G_1MnAE+cxQuyN7Pu-Is%Sye+u3WrO>p;^(?S^*VmP8UE%I%uk*$Ub zFZMvMMQkkr#q_qAUrc{dYlZysd@z__%Y2)b_W}zB#;g5;dE0^h;_g4!rjFgR9fbhn z6(?Fy|91AaZ__GSR$oPnDML)!z~#e_j91kc-)5Jo(zl=kj(gk!qDPq6BIMXzT2|pDQ0&BGGn&h zD|^j}TE@2%s;8EDhsT!b{DW2o-Rxm|n}}{vbW5&H0ksK|8IR3qL9@#a_ich`#v~rg zCEuoI=bp&&q`ggF&5Cfw7Z(*gs2Z2`bAZkG>cVhDhGYE%J7aE-p()=cm}h*OVK}We zwfQ!^knIIk_i!`dXMBG_OmwcK5JyQN6Z}F$kuXb<(!Z%~q4_2&^-tqJ9F(RI6-VO7t#tC}HQ#7)UD};EadH482u@TB;FUJnw z3>nYX#6tZN;3PRFp~5sn)Z4w6AOL*#&H z_OY)FbTiOro^GbffHq^TgMcGKn7N~ctT%p|Yer?76e5~giz)-n?06wKGiL7Cea}EK zWBXLTGN-+EngCE{R0fn8OBtx=JjzUt=0Z?rI!x#DD6@ReTu`VGWfu#9nZYvC+9QZE zh-R0uUMcLy?}rqEGXrI&B86g^pgOS@J$iGxl_w zYjT<{QVihDSkS;wnK!^VE71V`a`6CwJ_AKI19!%9aBp3+gXI{EI>dv`fCXG8-xW8lNUp95A7P-Tbv^nlDdLNjBnLqs#6XW-jjFG7y$&4Cy# zoSBE5efqgNNV75UfpSY0WkQXO?G5A%w%K<;oS}{vCpA)QP@$MD637gATYki>NKf|CSiT2#7PLxxK#;sIY9%!8v1& zi#Elw2J0-_#IPvadNRN@L)Njiv3It_fSBRfgbKwBk)vL~GTk6=5d#fsnX1k&efmV( z6u*rq&}GP0ws!bLP|KLOqV5v3%sV`*O#KV1Y=>}VYGxt8GSz6W;`b8Y=y_#(*xKh4 z?U!Res)v-pHe)mtrA&!{lGhK-p0N%JP>C9RY!i*(L^lc!aE{q@JSiY0<~>PuI@$&Nja#BpKr(u5-eX2|>na zTJPNX-eAW-j^&1S4WTO6!g^gu@e$rvoz(;d;sV3aYD^i2Rl z#*l~#d<>BT64?XaHBiW)mOacLtQMaL$`~_8q5zK}Eo?pUi6D?MJ46Nag~$Pc?3qvW zT#z!zW4VLX<`V%LV>~44r9fjq$e0HDL?!x__L4qK1H~8fjsXIU>8KCv1B(pCSpHyf z2w;sd4a88=QSBTobufj8h$GhirhgyKwbDM>%8nw8F&yIefH4mp8_`GCHDobX8F0W1 zLqsD3E;icpo*;{j5ML}eJeT=I(8ZYW5#_;RAjeqY^@%`=G2=spB!jV;Od+ftthh8Rn`L@nzB zK@89smZ!6@VBb$ErS%!*tkTh5;E{-QI8P7LXYC_ZX@RRBb?F40{w=>vsY_ zjENvB@G!Vyd{*_zkIJ=x9p&AC7h>4PK0=4(7Kk^iqw4#>4FeYTq1)2OFA#6>n6u6z zg%O!Ug>f7JfNiI4xwT+mVcYsZ3*)Nw*4$b!*f2`$lvV4NodpoXu!}u6=uqw!4eSf~ zKLdv!23Bm3Pa*3;zsdypvK+;C5GcNDmXDj4sc>u z{iy*&3;@}+_EUrC>x#aP;aW)5yCL-kMQ--7n|<=@$+t8j-0qVtD{yz@zk~m7A46`l zb?ay;x~5B-_l(#P)gv6lRq{m3VJtoX-7J?Ue}Beq(7qNj2^MSa%C z5ILUrvFE<}ZGEhjF|NJ(oXRg0{Q^T-fxb;DS>~1HC6>|xRrrX>5kLL&BUHL&Js)3ICf1O!!K}R{FZ| zFclsiwqao#PT>(MJTh#^h<~^6sIZNCU3jz#j|to8u#KT`nF@~$8&dY~79JP2ajy%H zSK;!ojSpKng(s-+#IPX~{%zs>-T9=jO$uwRyCSTgsG1zMim*)%gKZ46`Y|%5P-5fSVj{30G(>7+6VcQtCE#cg>V5?8GP4U}^+8#D!D_c8!qMdT= zMBNoOM2?2AHTXok!?q)AyOoG*CP@AFD0&YDZc%9GUa5O2(ipbJaDEWj7q)$2w?F*J zL!|>@J0MFp+aGoZRpubAta&ScR(%|{kLdw(hr-#mH{D?c946_JupJ5OyYgr_TT$qa z$$kv`@vtFB*=h=lM{q)p6R0P{hRAU$Y^Qvuo(@}6*iQRS?d;C@L}wL$mZ)=KL(Z_( z>=T`r<2>qxupx3>4BJKD7nj1;9JWjCeZg)oEBZ2qib7TUiqtCtVYZ zHa-u9^WT+CZ@L@u-oSe^Y&XO1R=6L(IKmJUw%h)6?CkD%?G7P#bvoY*+ug9;Q#+Wi z0v5Qh4EMu4AbB%qcp$?A4A4^P9^8n&mtr}!x+6?n!u-ts2C=hB{&?eUx3{mRYf5uN`qJR(XoRPjTJ zFO3*7gsovd(QrA2qmGCeBFD&xjg0909~H4-5gP@6NEgy*pJS-9kuD@UVuqq;V5lurJ7-FrNs-EkRYvkRL$e~;gKxUoa?QpyC&Ecm6|p%H ztMXN9c+<_5b1u$#5kqqJ`ZwKt+2>=gju_(YSoCk*oAmAis?1WOq81XhC}PM0wrV2T zx;NcoIToWXi5Mcs(ughfZK;h|O~h(_4fv~3pJ=(_mlL%jV#qSKR{BJ%k&ibxDl}%zTa*}>}ter=KJlI zPjp-Hw~4wFG2|9ocYUIJa@<3`A2CFZ2N8SV`|V-G?ndlkd%v;U7DcyUsPCm}Ka%>0 zB9Hw}o=AOy+8VLP5##fGBtIgTyy>3G`xNi9h&_wA=MhHL4*gu4%xw`KqG_1L@IrRe=#vexc$`l^-c} zB%!0CHY(~yM+LQr+UTf_!C0p9W206UwXqb@bZ49jjEnLM6&kk3N3%`6T)AxJ#7~GC zGM=r8QDvVb$0XE>s3CGpj@sm?hV3a)n;5kzzFI&ne4=TJpGMU5s3B9?n&A`8lw&4p zWz-NkW<_mQRKxb{sLhDl>}YP-p5qf$DZYxRxlu#rur<#onlHzE)as}qax9420-tDM z)aFHPp-;q9bf2h3@ijy(jvBIvttCFuQaP5Q)F{XVkVvZD)J+ z+3hYx@4`@0sOmLHZJ@~Rs3EJPg$K0m&e^d?C(PccA$zFEr$?2>s5Mg0+^DiI$}qA& zYWt$LKMK@B>cOZTh}yv@zf~NykE4t#-u?y8(uNp~%3$Q8D(``zA<;|A)@s3CIPirOuI2HcL?^{Cw@ zr3Q{WKG9vp-zDl^)Q~%D-S>$e$ngO6Vbl;gTB6qC&wxi!yC1bj?Pmb}@>tQ2F_iJR zm>)YTa!+J=f~Azl$h};v)K-!_jb=-Gxo1+Jp+1k=)2Q)zIhwl-&i8v;)Y^Q%zldfV zirh=Zza;)u)LupPRZ$YlR`+uK1%T`i0dhdhkP@~A#)R}5B*!4s!7)SR7!tD~F%2z4 zV>U2mLu0vqDD{bkDSjAH!()b&vNggd8Y#y})KM`*7zV`4TUW@BRc3z^-P zDY^_pHSf|Cxv^5mQe>Rp$#|*bQOjdCE@phbh~~a3@~xf_vkAV66JtE0oD{Q(F`E?o zuB(V~W>1b;Ma(A0xGj$P8{a80-M4<;O;y^dG^f7(teqCKY2+zz)8(3uYkScrKNUA4 zW;1;KXUaR1+SV8O7gRaNDr5BRtXTG1Pd8iM+0=GU%#c}ZRmIe*xpK@!ofk7ij`=a0 z?<-y%v#OX?=lgbnPqa|+3yE43Gh_i9!r&}d;73%7kt&AC;m9fv9V{2lz##g#d zy}dSObun8@Z?98tuaDWfn60O`H_+R*!S{8>ZB){YG_R^CyUbswn`GI9rMkWMH^*!< zdCk?wvNc6+ivqS#kF7D=8q48yirh9?w^4UqbY*?gNA8eq2a!8t*}9%?m(*RT4Kdpp zGd}BMwmp^y>V({G`FFGDX+_!nzAk%Y*@LCBeazUaJI^cJE zP>zGBAIA)l<50{F`K~z}vjZ_ZOiGOzM|`5Aia$!!v6vx8*gEbLHObM0dLm|s94BLT z(jU)LF*_c!Q|-r-emSk^(-<0bJZXeGBg+{q^}M>-)18%imL%t5+4`QYS!y%t`Iw!H z8J~Oe$Fm!=k_+-)pq?c~*+afFF3NHd%b@lHb17z*{DHX~%a#_oD+;(m!mBa6nmaHh zMedrc*Qi994$O5Qc|*1vMBa>L%X+$7Qg5N&j@iwa@p(CB*V_*a&g3sp7;aP8nc#| zwUSZ?=BZEgO!3c%dLA?6DO+tm(F-|VpuUV5BFC$kz48a9ByMdCkn#K=M!)or6Wt#J zuak3NS~G5dECaAq^i+ihN*x&ICOe+3=;;Pa9gI38ZiC{+=e_)ap#z7;ZD_pxd%ZNy zl{GAGrEwcZ{BYr1N5l;o9?wq)KKX|JWWX93w~=xE^8Bc{CxncS+o-sWj(_OJC_`D? z#>A~G{#`d#`Nzd=Y~04-9Ute)9Us^7VD6!IdECmWjJXN%?4^vGsESXdB9r1aDXwpo zig>oPkDDy}Wb9MohE%XMH7-c+G&!cBPLCTR$BekmAY}(PGj3DkHj{SffK>WKvlKsz zsM&EtD%qOj6IIDkg*rEGh#d3cHZQJkmHBa-6Sw*82ZY^LE4ms3PsOPA0;vlqve55j zk<>+~HE~-QH$ErCbKff2=8Rh`?_#`5)KyF4wj^##eI=VRu2#-koXg_GHR{Ub|%ka_o=W zexK+--1f%pfKSxffuW{pA1nT2q7KCkImp&wpXi7jM^KN(4Uywm+>ZG~$K!T5ZpW2K zmlz$OYz5LEIkr z%kW`5+uX;s$likeQQVM+Y(0*P`u#+XC#bD)L*#fGx2L|1&*JttZqM>#FT*}IVTiY5(Z8h`_AyTWafz>YsMcjTK9Ozh-Man8=o9+$1?Bp;jaekz;bgCMW!zc)}(oY>KZecj7+LG{sLNYI?$uscg;g ziDt?%6SXp7h#a#LHp}4+7IUV(v!fppkPsVgb6Dq*Vjox-I%b(ME+H|eF;XK{fTT@#2t|T0RDpsL-w=vaYEO@Avq4A9!?k{$B~2` z@#oIbgngW_qyF6K?2h?F#}$8^sHTJ=$JjdI6P=XfBbX)m@k4I_iytA#&VI*iGNeTM4_Cuv__N-u8*^DEDzd>odv(xeT;I9w%0ByD)oM)(pup;m#B$!`Q&Q(PjWq>V~`y~DEOB0mdxXlhLo{2KB;>r*qZ7SO_O69>hz=`a?D8DjHJFUW+rWF(q<+#YV!kiKG7`2 z&mwAe(vV8F=J-Taa#W$tO&TJ{yrj+ZiRLG5PSWQ4L_B`>i54h+0Z|K+hE%h)$S10i zqXuo(b zTEwlAe--}KNkdk$wI->PuuhIT)U`=N^AsB8x_Bis7*;j zHn6qXC#sjD9(7C75IMFcZL6>Twxn%N+P3!Uv)k>8-j3l~MAh3Nbq7UuCJkAUe7(%L zOQ%*t(vV$LY1b=a-2=tS>NO5l6ER-=kh(?>=T_= z{CT1-Bn@e1>!MF|NsddXmy?FbaV2S2e2-sE+Qp<@ZSQe*dri^TFx2)|wXaLPPLUga zCpV?uM7@=?8%g8yXfi+e)Ti8Sd2i#rqYk>8v^z<=>nmB8a`)uChx5J$l?O??pR@`6e~OjHlp!T-4NNJ~ zAUOu14o(>&$B>i_Noi0RnzDf@8=A@u3Z*{LFvSleYIw?!Qnp6;L?h)Gi8?A}h#aF+ zHrgi|ld=&h8{-r4>%~6NSjCSeYFx^YGPcJ1MCEdnqfST}BFDs(P4tN-rEGl4CMl5y z1?pd+=n4!C9OK?@ved~GnUb<8sr;ZYRj25*RQ6tPH(mbe_-CXHna0*ks*`e+a#W(u zN*N-@?3B$;X_TFlvY9EHlhPMMXIJGD%~kwdqUNOxsbXusPgE^OHR^(tA#yBC*+O6a zMJbz~vPJFHXSX$quEB7xx2m^T>SBs4Nf|OVl^YcJ1APC2&{CZzwJBSgvRZV{F#xJ8FH()}?HH>f3IEqBo{&L&`Q1y-CrVQu$?xTVHgWQ?{9Y`l_o>Sv|WC zxGgHNHDy~;wv`gwQnoGCBhdaU0^3uzJ*D-K9n=zH>dutyNZC#Tcd1-M%66r!A@u{d zTfMQH_Dy4#q4(9uX(_iywcDGrJt^Cp`krf4nSCj1OxZqC>`&Q#>eh}8IFPaf{umx4 zmoNTtikCGGrR?LB9ZLP9JDf6Hhw05DDLdjrkETSkJ*J%>!+tzv$5XB;WysM~VVx#r z)Zj$QP7q$=U!6SZvjfIGrP`cM*{PJBrUhqGhU*Mj&Z^euQg$|F=Tdp%DUD&u@{v2A zvgVYXC+dQBdcn6??B8zs@W=K`?xHeZO4-GfT_Ws1}3 zs~l4HdM#zwQeO;i7(&I}^_-Gpecq7r`CzN}+)UZc)CzYiWteZJ#=F}oBl>pg58NH? z`)m=?ozI{gmB*o&AAY`7mVA#8vS+E~?s>|drtCR2V4?&hGG%QkdqLrsDSMeO{3>OyUKcJ& zQ@DTH`ls7Lqyy4clC}Zq@4JC%QVdGlz_blYf9M9MZE!l*gdu4glKyE~hTuLUb!pMw=CH(dJ}k+$J!8up*(l#<}qewkEZKFx;&q0F6 zq_br{by?bwG3ml#I)~g?r5;Oajd<)n<;JCL92J3>hU@deOJ8y2X=A%Q{Vg{^`j{vo0ita zIz7!PI3sP-(>5dh4{oO4HIbERtMrkxwCCAr!!w&b&q>>?w9QF>y+fdT(4U>Ou}Vqi zrmZS%bJGlp+V4EyYyLd;VWnSk^HuBlzT5c|KLu42)RN5J_iNq@WLbcPZ@;#rTPSrQ z=@zAJQJNNfflyZ?YfYMUj2H)Daaxf}WLrYy(sZ^t=4z$ZqAp9@(zNlpSdxGAz*1q_ zmZz7y6$)FC=5I{(9ltVdD>1H;aTUfRnkcQ7wwks!DP&FB)(}!BV;v!9LFxu7v@vZP({59mdx_0y+myD=80&R5ZAn{w+P2VmT~%9E zU~8IR_wnVoN!>>1_OxwJyB%pB8SG5kjxJ%_5(zYvY4HQxN-72t~{ohM6nb?!g zUW>WCvh5|lF>S~mw)Uk}yZv(PM?H`>M2>@LJIKN3PhZluFKr+DY9-tupXjjS4-<7H zZO9?Ej`~E$^O=)XNYcg>nZAa5~g5#z;jFUdmDaD^6>U7$WlWd*wiO$M# z7WG`(5ILID*6b6VPurQao%e}=T=+y66@QVaOKC$cuyxrdx+2FF)T?PjH>KXB$gQ;9O6MmNx6|2%q`M>69b9+S_xI9vH*NQP zC)Fq2eL3&re30(PaG16SX?y7FTbFb#a<<@nls3fMvFP90r2jsAtcb@PNZnuXdoy2h zPh@#Q`t7<2ZDl-(yQi`}CC{_8A+2mZPiJeBu1$_M)E8+(ogFK7BpRmp zVMGnj7*fjC2%l)A93xRjWekyHbjC*eL}M~GB4cBeNC$!4mMOXnLs?u|$4VVbk#QLt zmnppJ$F=bp&Y^OW$K3?^C*Yr$F{GTWNg0g^6>?OdPR^+}nz2b4o0`eZ z=%)EZ(-l9Rs2LeUrm;2CC#saA5_ML_5IJUNY__ldoQ%!P*qrw2v)d{~S7E5-QAym* zl{%Lq^D>6qW<1Xn9?j1o=4++1I%CLu>hkG3y#*OtKvi>hdJ8iQDT^|;Fk_1{-*Gik z7iX*{V~aB%x+NJ~lF^;s7u-_qZ7HeBli6|O^(9j)OD&d)WOiE8Et9&8>MYOL@{Au+ z%ad+}tShKMZ`@M^3=Hf3xRA)95~Oh}uI^%<+jxJAY-7)vyyZk4u` zaxB)|OSo-Pw^5<(8QY$5J2G4uJ2SQ;V>>bKQqMMIY*)q_{845|RDs=@Zv;mA@_VH2 zA#`uX_GVmTh9Pxd#u_uW595B7KajEg89P7`4XFoJ;2`@i(~$acCR-A7hh#fM{Naot zAG38NquL#n<0$H}j3IIy&)9K)@-=1bNXD9cwG!@xPjpi8Cy6?hG2{eWr+uO`a-2au zn=wR=a~V75Prl}ioz7UZPChP&^FGl9#a|%mV#bj3Y+dq+F3WKl^-9JNIj&~xs!wz+ zW0x{^%_rhVF@2&NioZeB&5R+}*}CNu-In7v>Ya=sa@@_>U7zS)#%^Woo)YP5rX%hv z`aTBUc%j1{NPR$&hZ%dA$q%V5ne4%YdnDH*T#qyMIOCq^VO(p*o@A^Q<5L}wXBm6O zeg+NInf*LtPc!yBqorh7+x+yAC)AW^lT}GyDCrBzzs%UnjC-YVqol}QF`N~#CRoJy zJfO(>7ukTK{F+c%P`e$jXYW z+$ZYnCip}X6+e-vNkxWCV5`C>nk>g;)G0-V$T79ZruszFimal@rYVvC=1aKgik^<4 znpb^dZidtu6q#9MGmG-?23Ho*d9#YL4KX)c{@M8F6d5v$E#4?$)R-&BT-13*hR89$ z$mSPm(B%!2sv@f{$_=^;e4>SlUr5xVB10CiRpS#amSZvMk|IOoSXyLDef4XLtft6n z+pDi(P0`CRH1LW?%q^F?oFXfV3~9+&Wl`b5{GhwCh%;$bks&Lo%clq3)kU_Ns^$jW zHAM_Mbw#$O$m)s!9B{_m3izbpTS_&@ql=!c2?cARbE{x!h=Jw9dYncwdC zQRrWjJ|_4Xf5Ate)&KAKc0ESf_HFH}eY-txyRNuSAHCx%??T!7H(Y^*tl$R@4tB0d zG&0B!=!#j{$zZ!~_up;e8VaZQh6TRVp|k6(HIFXV*+5LeWZ_PuD|e_N$IXZFgX7h2 zWE*`k{bDXZ$6G`3FJN{0(MNtFvi1$Vvf(rJRHk0m(|UdA3Ry1bZH3nRTTXwn8MZza z{?J8yeqIjmz|WiM?LJ;htb8MT(Cu7;{R`f~qDgul3b6_-?kYz`aMnd&Tba_IY`}U|+CzbJye-iTz@+`w#XX zG;aNfV!uS}mx|q&?aT6f#lB)cqEVxR0=|mxtGohMK(&8Vd;T#DKUVDiqYC~w+dp3H ze!~8v{e=B!;ZB{In$B)`!+niv{iOcd{ilfesbcq^>_6F07Q3%2#Wyg0quBjt`_D4{ zwEeVd{WJD;`l%Fql-_0H@aKFIzFBH39wC~z4+Sl@L-T5=) zmvrF1XTN0M`_TO|&HfepW&4$HxnE`T*X&pA*FJQ=t}}y!_v_r5`y#)gBLBsH!~V;M z?lSqIDB>*RimUHn$D`)&Je9i-o(&mY(y z*ze_f;17xY!(#VG_D5>sA1n4xi2ajd_ow!!^88o(ulC2U57M9E`!gCHlX>>p(MNBc*$=%4IE`=?y>|GUcl4}$(jvHNHH zXZ!EP?tiM>zhL^8V)wu7f64T}?SHFv|7!o!{xyF9iTNQhKV+5~)RlX!llut$qxPTo zFJZmKN&9T>3w0ps&;+7ILx$vh~)STZYfiwBS!`ALea@9*F6z91A#%(Q*nHm&)d8ytSarU&3w)x5ieE_7 zqJSX_*sAe~7R#|1bxFVwIhF=&sqdEBfYk)7*0-KxPE(gDdKrdNe-<=$a?52|js^ZA z6<#5A1xZ#0gkxMKbrtIBfUOJ|pOt~!iIA=9ijWXt3$IE%esKA^Nm>_ z5EpTSA~#^)7%)T;n*xTc&$n{33U0<+AFz5~`7OTSRu$ZeeOtf~MQjfkvc0XxWpz<~ZBRo}e-><$I&kSyKo(iF(n2i*yUpCJ5Xz>p@kPWiT+mg6+) znSdd3oDJAn-@WGob}C@!^1ayX6P;K5d7>@^3~6TTqEB>5j!USQ1BS?PC16*4cV7+I z#eiM)y~?>l7hY5JH4OFsT%keNWx0+8a19l{A@v4HZjv43iPT%Dw*z)FV0<3WpDXHP z{(L|1!K+svedO*2>`uV$GGN@(fN?)y_X2jG0po!Nj0b+enAXWXRJw2xh6;K-mTcxyuP^|AVCtMjaBgK|$klKrlaG1l>?M zhcf>v@07jb2Mk?$R*I#feZUwNX@J*a+C$F zEU0mFY|uspZ7eCZo;1!U8n5{AM3n~(8OPQHpJ<{S6HzAx4UwZFXca+?qmzR+A!w6n zt-rOQsZ$g^1p{Y1r$sq`k}u0tEL>Ssc$(B{B$*z}HU!)ZsWVV#25oxK_#76@4H!I& z@uxv$Fn1cv3R-2*W(9xW%?@%J%n91;pv?*Lm-#_XgQ}puH%dCWxk@;fg!6(nFR1U0 z`9Y56d@R*LtM=_*!0E`J=PPm{_C-NM6j2j2WI?`T7OUW5%u9l{#J6{;FIcOBwb+*h z4N=7Mpdm|rNBGlVg<@8qzt6M4l|j{Pl}xJ$UhT82k-7%8E@-QR#^=iRv!J6}E9YA3 z(b_S4-Jb>PWLbx$jd{BN+E}l%U_&t5+`(;>b0fJn1r6E2)@Hv?U5ZwZx+Q3c99x67 z)%U`-pluG?wtQo^`$Rhwzk{fqK|{8)waX`JkfQ;0chC?y_5^K@@0Gnl+ZD9EzVRG$ zn%b!7Mht(Xlc2Su+b6?548N`F?w7Wo6bFLYCf0hS9z^{(Xa|DE=lc9PkiFE=9g_DD z-orsV><{P>9hW0mjt1?hZ_2S?wv}J9R^)N)O+iBxaUy8Qv3wg(s^Ce?r-F9MSN*gv zct!=!U_To)L=oqLhMe|o@&~k8G0o`z%st5YplWtOrV9jL^jR)Ry@Yx>XcvRV=lT2r z&7H_sf_5c1!d(r1;J-7j1?_6kt_8pEt_SUU@SE-i=W+0TyAk9&;|jlHcQa@=86|_C zd}rJa+HG07*{z_v6U?6O=?yp3@JB&I z9j~8L0HNHs_ka2M`Ion zGDHDoAwx!ma)aVnl^ctBT*$`x%8ysMa+NE`JRxL=0w#tG8SfkA&y-1unS|b1RjQCy zLEL1OpCWAv+SHIu4jG?gLxuisjUjECoYSa4eaGxwf6-5uWjdDa?HB!w5RIA{;%|^D z<*OvstdJoy*_s{F9_Pq02em3>h#Yf6HrF?PUdU#LY+k;R^OdJs;nf5!2pKY;t%W|% zA~_bJ)`Sd^V{yn9`_5PrvV|dA;v3CzW3NjUy%fXebs+0Ix>^}(F&H~pCS@5JmWQ(D zR!CccwlZYPL&oQfP;SuIxn9%Jtx~`$0#=7?wLgw)bUfBzsS8=1Z^~Luh>%;S$aUD) zhYV4~hL9m^^KIOyf*Ub!3fU%K_szawy$aT2-x4xJ5nDrsZ1#=vM{=8DwxO4WxS!h| zQq^|Iwu9)MKFuzvyHFcKwlidWZvW(f?v`^m6{+f&zqi{X%N{J%?FV$P4rpU2TN`rw zmM?f)1#e@&6EZ{*cSDBU@~!g6^qykwp~LhjaQ8Wg z9o+-j9uWP|r)iPeg8C?A4@1W1{roZ2Kn@BZWRF85+>=mlAa4!XlaRHBzVDuf>}lwm z?peqWE&T6&Ug| z^qGNtKmq5qnb+}cKAIlfZvKY%fHv9x`i4Nz|f^21htCh2sT+0d!S<2ROzt0tNtUz5^V2B*6 z3T&0{fz<`JyueoH8@k3Ps#AO&QELkfS;N*kpJ=@t>rpop7$V2U0^8_&WK)5yE3i$z z;T$}gx>?biG0>A(ZWXwCS?aM=`2B2=x`iZL3$hgjZkyC?sM`x{Yk~2(B!4)&X@z-* z+&ggZEU=vgpVJ*M3+LN^?62Nn@tgnsqIiIX?l*Hfwjhh?!PkrGxwzmD`(O(b)9F)X zVxKA_zZSZ?^KZo4RVMVq&TO+N@AspHdGkK)`;(kq|F1Gyr2qe0x8Cgw>%lBb(IE?3 z=m)OA@=eaZ%OX2n!FyzHWbgZL_)h4Zz7{NfBRld9_Xf%v#jdk;P8kP=Mbs`>AkUYE zSU>B^6rr2Kx?==4*CSgRay{7w4${kdSTE~lT?@CXZ;39n!sRTb7Z|@5+T004AM3N6 z1@!{c4>oloSA^}z*E?M6#4uL!v#hHZSd<^J&#N)i7*CcvvFsIRJO1?!Ei7SmatRdv zOdx4V7Sj{C#q?qp(>vrA(>1nqaBmXy<~IUuzQkK7ZxuT;bB^b}Z=3Tg=7fFD-m%Z+ z9{BbpsPET1l)Sv{@xc#`sFxJWKCm6uE2EV3qKS>aa;6G(QWnW{J zT;;xw>FdR;l7B-cR>@WFr&&M$X_f2jen#bfmLL|v-?#VeXILdyxqg`X6}u1Y1DRMQ zSGjLm*1o9$lOs#aw}@f2oS6kVzK!zjVwT9ilYdD2^ZK3W?_&LKG3(>M;C_+4{SwRL zzf|nLN5B2D{c`)?`231}&wk}6gB@ha{e91`68EcEl;YP&@oUBI*X`HcZ_rS`Fkb9_ zvtI|6#DCL%OHrL!7XMBA?P8Y2e2xZlmzh1~B^_VQXTSF_Gk82 zxsEJWxgQYpgJSpB_SaTi?EXgO{uUGK+J9$%Cld?bD)*uNjeVH!NMin;n7?O@AH z+YkMEH$?{oFz4612YUM;Eo-ZKg9BOtAM96zIMf6WQScB9O(A6*Ds?DpM=X6KKX3o^ z`f2Gft& z-d<{)!dL@mJ$yX7XA!)EV+|ZBZ{OLco|e9=WpTcoaaDE7R+OtZSsO24ft=}Ur)*6p z$4whw-K3hVHE%y=Rr%#{zO`v?eUKfnMouJay$!l(5ZevK8I=|K&A(%RCE?e_K$Q^#p&o(5;IZXn9@T|&EeI}g(y$@d@! zC8zCXYoEKd_DirI@_+zjCuk@H^wz@+M82;OjNE^o4>?1JrGFTGU~<|awvIYOVB}#? za=vB+kUK$RA)vR;!wH9^pU4lNJNl%wPr_&k$pLms9-{qoz`P^MzA>; z`um^hvjWibPiM29P7w3vLLl=_faQ=E3c<_m0?#yH`9+ZK!kj0#JPcY+DWXVjwR^~)bW za6KM~ONWvWHcLX30f=zHyNT)sbtrLpmSjM{tn{mAOsylAn1JNpzkB- z1K1ku3=NTB2;@+~;Xvtl7DHg?x>116f!T)(H{`s4pkoLGop}_kQ4T>L!B)95G+Khu zkf7!?2|&xoIz!;(Zvb*8NXTgd$em!i&~Kdv5b{caip>0?R;s^hw-oGo+#jQ=0WIx(oTTO!@%Xtg*;6J42kri za!_#t9jk4TXNF#)3bp^)lb=c3N zQyCH9a6n`mS`JdqtN9@Zm-`4g{f`JH2L$)u(2uIaQAS=B;b-ocgMq=w!vN(3jE4Zn z0nY({@C!R^oaqtrlmo*hXbORj>n?N1IQY2#Gk3-rIx9nG(E=8yonh;oGjv{p^N<$= zhdaT=5cs$5GVpM)^GmwRxbFeP0gM5}nf%aqfH+V%d4tZ-RSB*_UK70S1fb#9ogtub zVDlT!5X*!+L${>=5D~vg&)d$>9SQD0-WBc*G>)Gz1QxCl0fhsb-AYxtnv0|ZG2!)Ld^-vB)@>UeSE z?NQ_~x(qJ@1_#z}`I5JTIkpH) z95DQCLEz(x{8v}7@9}NDfW2AxKsd3(vn#Z-Ne=g}$nUJ(tE&eR&NwF{x)=_ABd3Tn z1x|~DLjcBkZ{$E6H16gIKn~z>-W7HD*asaCfsPCLnIZlRv;n9IguIslS0B^JF{ z*eIB2k*GybC&S3V$C)3YnnW!TwFK%+m=P}(wUh&G4l^UvXei6XTE<8~%V{-itte9H z6*xI)5F{u$O#%m#>!w=m0QJ=v(!*6JJ8PuA2BozQDHnRa&e^G#pdJ!*oF)Na_Cf5ODuLkbZAAd#POx2Axb96*?k&Q)gL{+F z@09jV7;$WZi-!Tn17tk-J=~)Q3rzeA9*}tWgOE6v7Dzn&I7nQlAP;~+cc7!d!Z|nemhx6d~314us2)tWEKjrZ7Q~9Bz-6ZWM7+>&%`%a5K4gD1RI3wZ= zme0yR(=4hP>Rb_^xM1)-c~qSxwS;o#AFT^TJR}zdi34~OR-xMt7@T&AtLUD{b`Qy~ z2^(jsM6@UzpizM1VZiZcLqr+Y3LS^Mf++ysjU z&agql0nZ20MUO7fc^K&Yg@WoZzmyzTBWr1iHv}VK=d{6W4RhAP$;05}xD>I`j@{x-C>^SR9I$kq;LXr}}_A$KwH z`GVbH+wBbP;ai%|<=`^yb%ypye;@k$c?}HPUbYT6Lk$u%KpqSmO@c#VJLC)<<{gpG z<@{yhJROnt5g2?`ahyj*9;M4MKAyuJeAMl@P9DEoRUz+$ovwTbQI_U2ExW^9}hR#X<9Qx;ZA7n;k>w+_MQG$z*m-sC91(*38 zcEf)+Y!{g0^22A6!u!G$2cs$^t5-x`q4QN<4*9+1Z8qEn$6eE%be*qb<~zpH{+;GV z*lsXXKY8J%CaGJ@eY`M+J9(`lZ!`CW?RNNW?+$N^VgH@xE;C(QuX|FvAGUkUbPV7< z?d$>58dF_0HzW`6;d|V&AJT8qQ{Nun+)aI}G#fN^D zlC<}zpM}!|7;;ZbOzV{4Z)r^B`iv+kQ9?sl{+6axhj$!49LqJQaJYmm-UVk%!u`fI zro1GaB)@R_j7v$S&F9h(dDQ0;3*G}8QaD}0#yXH%67Xm26Xq5X+L`jbE?vA&GKKt{ zebQ75Ikz$8ITuS8yeq%pv+7dqoGXrnIh1Qs{KPUc`_u~s2U7f^kaivMehCJtR=;e& zY$Tn2I#-h-cOma+5z8}AFEO97Pupko2Gh~|tonTprO&w(1^a9lj}(PedshoAQWP{n zKW)EePy4?YzoCA=Nx$Fhg1hDavfm&@LH*jfT44RQ{kHmjk>rIhs$ZPc1p0l6el9hE zU|YS z`{V>J)z@Hst$lKW&cZj0k|JFESHDy$7217{fS2P zEwU266^sgwJ9&S@=6CFG>^pDE`=U9bh_r;T{T-cCxk2uZb#55)UGjJA-{&e*Br1gMyDm|| z-Ld0R_+-NN|GHVN!26z5z7OO3UA)ekmTeNbe{jw-n4)8 z&+|X2-`gm?-32Gjf3<%iPeJ|uJFNfSg)D{tPpp5of7W^a7cvgj z8w^i*KZO1vfhZx_{1JrwHo58$sS9EIA6@X;{G0vQUJoJ&;^Z!b?SB$InaquL$K|{@ zObN;0u`emim83lUG`uH*b#^brnd8o6Ytri>ZV!Ocox)H`ohD8l-WJj9MGz}Nx*`J? zPA})hDJ{f5s3SE%M07Z!RDXhYW zL%ssJ3=e}u1}mKbP70?E84bCXq=)B*w?~FCOfDQeICyTzbO?e({7W`MnE6Ovp+b3g z4RB*2ZW>%U^3>?S$HXaE2yIe z3Bp;!N?PP(6vfGg6;}Rg&1eas2Gqg_n z>(H;4pT_xa-f@Q3OCX2LhC)0vPJoAIqq`iN3?OW?0jc!4g*)}*&Z{kNb} zLQGN-=?#!uF}ID2U6l9O@ct=J4$d0#GJ?yIl-q{4QHEKa%*}P@VwX6(;4I2t4m>$E zN$>rh9CtaYlQ?tG-p8&h^x3-KX&w;o0Q+wsDWgc<99~c%56QoSgGTugyW2f=tmvxr zhJLtq{HKoWha>XbeAiEa_&Tl~_tYKNQ+JrBu2Bvi??k(&4!_PxaZ+}Il@B2`EYnqg~WqHlK{`nWp|nJ z*<4VPga6dEI75NQhIdnWU~uJtT{=VUTsHF2NN`gr4tnZ*hs~}0WoEan+HETgASf;~ z2XtGU+i*a)81NmDcQA67!zC9rdp3WW!yeuo-cK23|732NyUciUcxi<* zIDeT-Lb>6|ycdVbRrw9>GWTb475>=+I20g=$<=B06t5>RYA?JZ_{T-|hAeZr5&Xr? zQ<4YZ+x$2L(Ij)L+z{~Q@MR93T$X?8`pFT}pXl-;oH+>Pqrsm;>(AC8w_E%)d~QSH z&!I_xH)p7WsE4_viD3?+ChFH28X7YMDSZziAyE%h}*|qj^>0nUE0$bOp7iDpG0WR5KrEmnUFU^ew!1?J#`fcWmYi%GMGADjyp~hPZHn&`@ctaP*{#6U;#+{NB2TXo51aKv)xn2 zQePn)N&U#P@SnPFMasA6Mi_E;xre@vE6F`|JrsugfTs?3QfU$1q=#>qy_7@&Cx!b6 zzf!I|;ptTXuM$DSawz$E6!@Fo_lDU|sCs_~*bk8U0MrK-;Zq{RLKzi0@WB!chQy^r zlK@xJQ0K0~i8M$V6aH`AaA#2kTww?t`}Gh9G+vzXa5jeJ@t7cT0!GN8*cet41(Pe}BsrFpN6{}2u16j^ zk?zHFr~S!Q>T)8LPZZ{!3^lv<%laA^^4CX>fV-|RSyFtkjDKHxFpNT1{}(j=Jo7zLLD z?K+vM;|u_WaXGHHxsdq532Q$%lJKQ7O#DbKVNxt013wZ@BV0-I@|Pnjj}kAp46`Ag zyX?*dt|b6dI7i~aZyj$HjgR`5+~sJ9<6=U43xmP)j;q~i;$#9`W&hhJPQn6m!Tlf z;)YT!c#U<2Zb@(pvQ>E%PH3myrBIk7QL~2>+1WLm$YhkfFZLchpygbd#fv zXGrcLer_YOimxc|D#A+?AXp?>bih%RtBc?uLN15U5P67P&c#q1D-@=bU>E{?L^LI1 zI46;w+L6wUG!mp(!yn}gl}ld^q0#aXx%7%L&JeyIKQ{s&5lwj)&Pk-<<0Hb8G$B8H zc8jyf_Z8JeG`tFtaso|~y9g&&8`d>h^V$?|OEhy} z0DqI5PK38==D-0Z{}bV@@!a*8S0}QL@vM=%Nx2u4W@7@C|A`k?U55ag_@S4;0V;X6J_540DV6Z$O#CmF)w#LFh+Dd$j< z0Jl?paX-lcrCec*;)9Y4ifK`fr{M9w63&&x?MCF#eoUQUO;aI|{u8ZYdOZh;{yK*<-U*d-Zhf_Y#@}BE)&-pCbBmSnmy9qZF z{-)d~*8qCR*JM5LI+aEkK+lMkMyw}fFa3)4CfAJopaxfQ zw~T6SR4RyQ0OI`uB@iKjy|r?kR5o8E7ou0CQl30SuDLAO=vS z0SqQlmlBl-hiCvpDcHtZHITzJfZ^nrwGChdDQF~_xdDjl4`8J0F)}}ZQL;XY{^jK5 zM!eCH+*iCYWSfzf3v;XnFitAt7yvb}!rpkw7m$UEaDoOfk$f`>xIk8D0Fxp%scit0 zBUTZy$!-AR`U9BadQ8a=piT){4UB3rs$nz-jQL{B zhjB4rED&P>jFy-dhglfOjVtsPiMfb9ERN_BE)lr|aw$o=)G#1HEz-6)3{~7Du0gzv z5(bfAahT-_>|GJb4W_n>1_<~I&;&MR>yv!u(*dAe4K$1A&ufuv5ulhh;-aLF6uZ`BdNNi=aSJ&3UH+T zZ`KK^oZy<*Mg8BPlVY5NQ6J?u=#;2akrxU!2I3|$nh&~h)(zcwH^sV%`YnnaQ1_CpR^Dx* z-fanPL*8NW8((lYVt3swN1=^YY8<#xQQJ~>-jn)!s6SxJq|_x_C2o-2q6oT00Xw5c zlb}b`dPH@{l}4>3YNb*C7prF!JH4dd3-#VnqxED9mm=foBS9a?zEPt|&@XEJoSptr zD~noxXD99rkez{2ABfVRsL=+nMV1S8hDb03a%j|O5)6ylFlT3Y)CNawxa{bC73~qy z9s#2RHb;sWNrzEU8x;+HuF9jiil{eQqS1)PL~RU}U7~*Q+PJ8(IWDRhKJJZo)OfTe zAUADHjM_xE>x!tstdOQZAx)CSNzvy+)w-3Kp(cwl8OEZ3F-43iFlquur5KekYNOmq zQ=_@(y=h`iV@K1YMw`l3l^gI331&dfj2caXSy7wi#xgrK`xIP zO@b9sTjA`~My)1lwfW1!>0T-Al`x*i<|+}Z=&(9!tD`}jO`UFnHBl8&Su6QkFsMSYpW7Pj8+2jmumi}h6wnUA#iLI^9&^8IS zL2i#4O@bX!+u;UJEwimr+nFCcyWJ)2T`<0*(d`zsn;v_jMx&BZU9>IChIxV)#Hi8s zGL-g{>i($hXQck5dO!(Z4N*G~wT5UX@1V#-Q9Bs5L(#Xr!%;gN^*rtaMJ+||isGVu+ zd{&*CqjolG&2&De&gY{>JNKB*#Ian^S-OBKwf`HyoO(bw(y!!`pNi3`F{hS$*Vqr+?H_h@(x{XR0h2Av?h2H!U}o)BJx%k|Ol z8ZOn>IGV40Xm}0%9u2Rd-$#bmpc91GR20eG`~OFHO*$W5!>iI{cgF_dHI0$rW$W)% z+3At+nj?{Xc#Yn&z9)_Ea~8g@=$iPGf@@OVtLVH+d_p8Q&+Y0p=+}TRd1$ErKy6Sa z?;r3R_GoMk=07^NrsD@fYv}fop*83Pp*5uOQ{gd^kF4pyIDW+VTwG0u$A{I#@?kYK zk=zP*L_t_hZT{pDR#O*wTv$y_iHs=?6XgK9AJF@kE)ZVRg6S!GFw$itYL=X30(eMrso9~M!Qc^FYM zJd#`Iu5VjJO?mzb6HzmcVoy3{ZQ0H4TVyyXe&Q;k<~v+r0%}lfA5g<> zFrcP?B)7|rpe>*V7{GsO@&Pr?tau=E9|)*nw;wB@21Dy)=mP;Y82T6iHE3^^na!Ml zALvr_k9ckIG~dgym-gW_jeJW=dpmI!9}K5qy=Vy)PJ^H1m^%|~;WXF7!Bj;!4K9?& zgwxkWhR^k&7R@~;WSm0%oF*wNAfV$+J2&ZAUA1j;&Lyr%q!O+JDr$Kw1#-nf=%@owC2d@)HdD7JcOSuZ8`9x_I zU;U79n&iW98WLN2jpFTF+0%S}axP})F9+c?)#1m5(^Q2YhSTiSNBvb<2Wq8bab8A5O#Je5`O93_U)a216esoCfX9I&BK4A!3iq%mKB9 z(=@nrq4wc44TT>TPSYWuI!y#wI5)&y=3O$caGJ9GWhR`aKa;EY?+>RbWpWi);WVvo za&?*q#0$b{TA5r$J~5o8_+dEBy`tP?H-xrunv(oemk*~Y3q2v6h5>%8a2gCfKAZ+a z=QZGu&a-wuY~hFDG(_idIjCY6aGIu~ z;J1!&n&zU%h0`<^Jq)L*(Dx+aG-$RDr>O}2$Ar@md{`#W^oNDh@YLnQX{tkHXrumt za2gJ0umnGCI1PqINdE)jG#DzE;HL|xLAx!ShCn_pGY8ZbPNT^!^uBPKs?bjvPE%X- zXgEz>{xVk<N5g4qu;jkV z^5HZMp(ljXFu;!$PJ^Mxhtpu_V}#S7-4;$mfF74)QBgi4+vO^-pZ4K2J5{liv-9|H zngWH>tZz#l-cSTowNYu>gu9TMs7R2_E;(D}OC9{y4kQB;3W90C1{EWdhpM*ztoLD1 zm6pR%{+X7!X`hFtJThf?DKD)JdLk^W$O{{X@cyM~3JAAXtxUb26ahg+*#>f&U6fnp z=8hP2j4<^4Ek)o<5vg4fOLPHuO1f3pW(VukxOapCFD(_fFijUPtCxgg)Qh`-H)UCi zCT;N`9;>Q|ih2?IL>CsPDFAk2aT+0~U=^Q){mCxg&%IOt?DTW?^TPVeRXC5eXu6Qq z)zN1SE~0K;#8^N2Q>;NFEhzq1rX*^uB*+?)(~ELOIX&K7wAv7h4SkvfE)u(cy=`o+C3soygge}>d961Yh8 zdQSb?tu+Jd1$#mLUbN?w(&b9Uqw^KIeMRqWvhlkRzuSeiXMV54DZ!p(cXjZ-n&Sl` zha|_kGxm}ay}qVP^#`#2z^ywY);H`MItzbjU$Z~-f$UD|mtSIr1TGT2{z(1)n0|lk zQoF?ZmVHa3`cwNOrF6Mbq4RBYzOB~`+4wVvKkGsjy+60#Z;N{Q3$8usT=p05hpPX| z{wfbt|1}SjtFPC|`wp9bYu~ZIeH-NI?*vaLDXbUK@-i1gxh?LFb&JpNr56f*>%N=2 z9-`Dh|AY{Wn*3Pb@OKbYlORoUeZlPAocZ6&hSjswdhM0)~nx!z+%#AF}zw zF5Zv0pZ<-_f760AKeGQ}ueIg+{22C+dEN;OcSq!wrePk)pRu1PDXWAM;^r?&W8KK+ zVn6&ObQiZf-{enm-g>y~tx~Z{`S9*pNbo@~QN5sgt7@O|w@0D<#6Owlax=;Rt3pcX zqP94CeU-}P^;11QE6Znr_-B^7d{mDr#9c!=7jX+{4^mA&s`TNRb2}d*!4ODbCz=Gq zl+2|QO)?iBl`6)kXA8{fdDY-!^#znhxs_=~uvPBtkfTM=0wk~#O@gtip{FxH&ZT>e z}7X+KQ05MaA4gt5D57^3~eX ze5Ob^g%MVUa%bGNs1&CXPF4PDOr@M!NVpU+4Vam(b!yz@sB{@##4E7hZ*w`w@L9AwZlkv|RcR>+NYtnp$UQ zr35P>L7iw4tX3YEu0);7^s38W367S0u83(d8Xo6g=NP=TVyuPXmPS}7%15H)HzQ+< z*aj@FcbQ)NtY19kfH*zxG=U2eUK-bG=QFH zTiy8lG%`XoYuoLkNob-}VkXpT0oV{>L^Ebji zveiQ5a>3t^4e+M}{*6!)BBcv%1N-6WQlUO+9uiLl`B=xMjFsI*2J6_6*mYEu{74ZC z?u3wXx`=6DhpmOd+uU(+w73m9O#T^Z)SYm`m0mh2;YqBYa!c1}!J8(xThh8BBz6Uh z+n5Ar{mOhS=kCh+HDgkD!Z~N?y!6kbb-^WVDb?$uGjvIUOOTh{k~I>%tE4Vnf)*9< zBULMSCOKO0C}J33l(WGq8HLL8B9Z|PQ$@Mz^FjJ6+6Y%7(~AfNY~C!SULWaRq^V-(PWR{rjE~DuF+#-;>U-mh^m5pP%O3KFMzTYx3y5n!lIx_vJ@bGyg^I9W6te z*Z)*-KZ{mn^Cyk}Nn_JJC40IbAH8Su`;gp!rr&?<^YU1*#HsF&|6QJrK{itS-)nbl zvi(ux`1#Q8Bcq>aX!=ydQQ={=JXq-`igM`&ZAQ=9rHKWA-biO~657i>N{&Im=Xa!dIrWdl1{}#sw zt_$A+4(OV@>pqvl26_k_&^34QQUMWMd^B|dMT>sQNM&y7>c!y1Koq~sTVvemB;W`= z%kBKKmts5Bg@CQ3fU!1ctN{Eh^Hiw5m#~|xOFYf8AYTDcTF8niz|>WVK}ObfV^>yr zE&xdT#8aW+{iOagfNVeWP48!UY5k=AtbOurswDj!P)VTu^SQxJO?8rfzC#~}4t2z8 zNAmunY(TcBLjB9c{ygl@6YkSBw}|ul6qJv+c~A4@ z@Ei8D$|n6LU8tax&zShn_M7&f35FHN&lUJB^nOc$v|8{vWM6o(uwLu`{x;jc{bJ#I z?edFkfAPh_joSVlwtwfv!p&X555L6rmjFe&f&)I2EBi8lTuAFyJO}IsJomgC)|cUZ z*&%Y`v9g6u+gDig;w$>X>EQjYI{qF?EL`#X_WQ!*zUn&W;N^T64jxNe=%eNj?5p+% zf~4Z!*VXYGD1D;~P~0Ed*ICZOb^Ip0Z&G3j91b3fS*YV5TPOQteF|~QE$T|KrI7sz zpMqbOk#9kKs|&c?p9WPtzYXKtlvL@O8_tRSGbkUE^ZtVUg2UNgcJcm-lfin=`HFvk zLwzN!ZXu3e?e9D2eaAnse~X2`r3|u8?BB8dcP|!B)5-iVZ2y-R3#+vK_iX?Di-j|F zV!zAwcR`qSV*j69)t3nd3k8cp3!?kJ8&+p{0U8JI6?;V|_Er17kT;#!*VOTKl)%+k z07J`Ryx}@_fyd$&Z&El39;;vI{B#AA>*}A_e^AGNL)l-TxGfL=6{3!H_Ci; z&0W7(03a9g%Pjra%@So@2?Yyjb?A+nC4S;`N_b!c{4KZf%L3jg{K4mEk3!%$2dcHf zYCLY&-y#SMjZ(fy2kVT3z4a_~%R^K4gXJ1p-hv4lM-_KeF20qYKQ6xIImiG!t`A?l zd)>1KCRZj{?wejeef#!z;9P&|<_{3W7R)8|WTlLquEQV)%MC2-Fw@N^z-|<7XFttv zX)b7fi-Jp_bWepk38#ZIxT|0~wucpd1DuY1jBv%5MzD{Og`uy4(Xjw&(AQygPlulO z__7aKxjUFNwJos27)Gl%kR1qKP=bk?@9q#a*Kp9lcjH)Stj^7)Aa|jsIT=Fi*q%^0 z%$r#FwSt0{9B7?^+*K5g5M(!rvNw|@pxD$DhuTe{>`kSLF@4>e$_N?bRF%D%R9Gc! zZdxJ0+{01;RfV8(a8h7(!sUJcAtceJi)l-JpPV6b6A)$0ehp!&^e_C=x=Cisw0tpmz1#xxjW5{opoSQJAZE z9>@-|782BMMX!xVK1q z0mq{#NZ|_w6}oZPY5D1=LtEVmsh6l8#Y&05^xkO`f#|W)Dxxac0MVni2sUQFl`CiP z;CNIRVYHisy@Bj818osN!wvtI9EHmT@swgb!COCK2^Zj6fYjG*SNoT&^`)$_vbLO~fO5IYCuf!Aq#0CtoL z!4mKsO(5S9m0Z%?=fibJ-M~76)yWe09P6s0)hO`FEw&+S4oiS@p?2V$mf>g;^rkrt zeC~uQFKIsPK=~zE0-$64RI~u-XlK|GIEN+BxllWFPLhkl-el>L*46-_^Jmt}&JqY+ z2#hXRErW7QlmPK9U6tf2G(a3p5^%Tc&Jti8_}vXz(%o17mQXn=bik;3UIV-(@)lhH z;ac<%&tE>ZH>A#?ZKi7G>SU()+X-z(%Xc%Zd2jD<2d_!6WgyxLg_ zg+aQ7SR=z1z>z}hn><|ICGSp^{=sjtP;C!UJ)nlX#jR5s%I$n!@nQbz7rk74rBZD5 zCJg)nb&n+}gC-`7CJC`%eVMijw9qt>Wc~2E>LO5D2}{I+`O9BWSBVysR+1%x!L$&@ z2Wl(nBIIi;`4@rON?0No%wPY4!b-HDwvsFn4aO9TB`Pb?o>*Loi_rR}qQU${Gj={N zvxI_aS!q&{Lade1;jEkMCo0ORf|5SZtE7^@0>)&wnzX7cO$oVaqf(Me=&2#2Nit3A zW$08)cPna4cc&umRXIyUd1>Kj6-`o=q$;*%`Iab{q^e2yGeQ(Ua+0|Z*OS)D)Bdv2 z96KZZEFmQ@0)jX#tFfEqhiYl#jb(QKuRu`1B z;YW*_-tS1|9hS+cdDCYQAf`pAN%VSCQ=_O2+{txsvKLo)X@R#%%uT4&i@8}VX)I7+ zm=?}>KD1HK194$mQR9Vzt#9UP7}z$^{+b$;Tha>D9Tg8oy(NDIYV7QGYf$fY*SA0+ zU|Le+#lpS50SYVmYfBRawh!-y*3CHJswD-{UwAWI38jOOAo2A5OtNb_Ou%xg_E@Obbdt*Nlt|9guC%hy5*@)x`B0MWer(sl716f zr`?j%r`S5L2Al5PBA|%7*oHD=>)ben6M*C zBC&!H^l+6pqC8Tt!nDrINYzbZjcNZ{Q56YGgmEz|qBYu8MH2 zCJ8ZH<6Z3(iXTxsX@avvBD=FxA^o5N(j!5T=`-(*UbPR?&HeR+aA1K`p|Rb=8SZGcXnKc zaT6fLqz9+u&0Hxr#WvA?nIq~NxrzH8&R=o0phnBH3}I)HQ{5$|zm7((XU2+ZQ3n+R7eVh?B7E$%cJE0m# zCxfC#_;z(=nzX{SHM!e_*GF|YO+lmUz5%KoG5cZQtjZp#>d~j$svc3aQwA;+QS^uc zMtUc9OKLDNGJ@7FOyHL&koBzA)nMYo2t|)*m)L5ddL!ebPC71@43oI_jLdAOx<^u zC}%{aIJ78xM7z&cN!VHHCd{u}nDq286_1>x2YCa;5Hc->twcqSWQqD7)IoXH>m~hO z==WCDBezUOnQy6&ByDS9I7vU%I+7*o9F?iiQSeMPxHYADL4?uztjrEn=Yg0Vq+&+F z1kUmp9jJVit9VXJV^Dw-`7pQcg;vWL9(H%-2ub|aqqSVLB%@TvNGG-26-O#}rDfuj zK9Z#|(jSA?Shw(nmdhCDTcYj}uY}OlJ)%iMy`zcl04iK{q>B6jl)kBwN4y}ysCZ6h zCySg+mnkF#sAf}JP*|nPu~6TLR>?@5k3Elb=_>J371TcJMC~I;svc1T zX=eCsmd&8rk!FNnR^cNiNKDms$#oyi3!fIz;0+Q^U6))vHyX8&c#mW-6h4|q6(fE# zYne60)hZfgdZ_1zohk*7D7lF$>t~cbt4c>qnUIU!iU<6iujYRQ(`$)}9xb5g5o${* zMO3bbvqq(l7HDA&-W*|$)5E!3)N<+*RdnH{4NPK%7%F#E88E1L#5@Y4sta#%lsn=L z68+g-a!J)X3Q_Cm#lmXsfLceqM?x(SRVS(rYLTclqSnxFNf!XQwW8KSEtPDYsC7^^ zdOYh{dE{ADLE>eSBcuQlt)8t7RQTeoZIt9O%WvpT+7c|k@vQsJCM5?;R6t_tr2lqR zG|Df(AxqRg;-wJ@g^g%hn1c#PA6$Qf6^NXrebWEH`Wv!D@gpWm`cv76_M`6<5})%A@S}AV=yZq zKkHEuiHVXfXQ~4JA)F%)Ml!9rL8+s2WDBSm(FGC)R1QhCkhl)iLAu0_Y8+U9 zS=EtL11VJCxYdqJDI|KZ90w;@R;h@@8zly)vT}u@o0JBnlwi za9voMtz9`JRYLOl9jS|yt9e#yZZKie^NyC>aAlJ2`opIR60eR(sDDIL0j2k}&W6ql zwT~#B^g!o@-IqjUshiv)-SCTaCwMU8Y9sZCxFMHHQi`Of${;yOFX9IY;BnQEdZ-|h zKb4j_OMRr@2mQVg${tZ2NtKVBrT&uihaRBXM@}+OwT@(IkcuNw11Y#xt#7Cd67P;M zYFI+yS!y9c4x#f<6+;T%uc(OBfr?1EhG#uWAu(YhA4&M2Y9ujXM%-LbE=f5w6_03= zQ2uBP;ZnRjMyQNLwIe+Mampac(s=3n)sIy8XdLrRs$W^%6v|5~MIE`=Qnz$9` zi=NMT77#8-c^zicBX3au2<}1#P3S4#+Okg#Bu8f5HP&6D}|9zT**lfQ4k5?D$K2pP!WkTNnN}; zf4^%aSp&UR<&d0Yok|?(^3}V#N%h#&<$K3jS}*Nn5{WuVs*2=}V3Q=9pf{@? zl9OzSPzXtvZ>uYuv^9VEn%+<~B<4X~KEAZb9DjpaNN~2p*-3e9zNAI&z}!v>T7|q_ zB6mUVR$U~jAW`xuh*tYF^^g$mVVpH@fFV4fsi5auZ{Pr)pIgX`ZUs)_PKsJ~sCuN!qj6l2r3*+es`wFgk9d=%+R>#*Q0|B>Evk7$ zts`~e)lwaz8xd+Bxe7-&wa;4->K;+^$VYdnXB48S z(F+BO-r%S5HuF$Om5%@;G2#jzxnfB7BF_AMNmR;+vPU$PNqV5VN4nKYqEtq*5)v=; zdD|^2OWmXBcaH|8k6byV(x|i4Q<9!YdPOOFj-fM!kH+SUB#l!w zp7BxTgG`Wo0&-XS$Q41Vh`PIVk|dLmOpa3L$VsL|DR88dTB+Jd)Hd>;->J^hH0gh! zwviqYiW>nrVrk}w7B|uX)V<-&k@g%8prS|voGbESsiSexwl`TS9x)q6DR)F&qxa9f zuKH1a?p+w=VW9XCg^(6SJ9!j7DpcX4#Zf9Bz3o>%^1p4VYE;AF`R~8Wq_#Xt5hMyA zsrnH+qw*1LMSf@P5{;fx4J2L|5w-px2wzww&MG+fevm8SG*AzT*G6pBsi=^fxLbcf zQ6#u)I9x)(RUFBwt`l<|s`XK2`A`{&mqf_*QI$dB?^?CsHMme^l7Jl9Q|S+Qx&7O( zsaz88j+CA%6JyCs-X<|N!RRkWua~^dVr+&nSd5>1O+}RWHit3%2OKyxlK3viVtHVZ zno7*7h{pvMDXhe#3Zo*hNQot;RT!0lMM^F4+6kjd7AdpDG>gUAfki4UQMVm&bzqTl zOU$(}76lgfim?|)O<<9_OU$(}YGrZ1sQp;13oITG;{f9Nz#=7>cwL3DF|bGlCT3t5 zTLX)S#5e?F=MQqF%`BuT`Y>nORc7)i$wZ+4v350?UUD^=jz_K0RS_d(TjiN3#Kiln zZjn<#2`2x^XmY|Pgnlh1*NO98@>TDQ_H>3lH)|*`&Wdps#>Id^K_=d0VYCE{b7Gu> zas3A>d3ZjWt7YYNG5u0Z?g%c4zQi6ct2C4G_k6TN3I7#*O6u=Q{4U~_sI^3cnuk|3 zA6(^D3whThzlQvJ)M!`Py5ZlGHzm0VeJg4-Nm`@U>gI#nQM(bf+guC%n%r@g?n?hI zTKAZNqjra_`@W_3BzX_|LDXoHl*FtgrU|WE%7htLU!p z%N{X}v{d}k81J_+qxFc{m1tY}!(K72Memr=dXZz-{=KX$W@WMbQ{E@Wjnp@0ePY%( z*2(K9vVY9_#jJk}pM1;)#56ZNl zLt^gnZhqYxD(+B5uf^<##hm7F@rI*0BBq7xM~WN?IVxr&V#eQLYW~yBy-|_#%B4~s zna}^RYTc)R-8qgFrl1jIoG!28?lHjDxXP`r}27N5A3qTs=ddAbJ8L zm>9E(F|Q)VFXg0|Rm5x(%*i^JQ(`tbW>Yv^{k~VKLuHI5e_!V-cdDqVm^&$Iny6_| zr(Q>Mx~S<;O|SDqPMuVqry1hS!1BzP(W=;*6>|fbEy--?IWeP2GB;*(xm>Kn8M9e2 zo99N*(W`cr=1YG*S_@)Et7dDVZ)uSvi=Y?Bj3&vFm@RSl*wUCSjM-A%W8C*O&eAgJ zFGFj2%xE=it?(_?N>U5GGG;VMR>f?Uv$Q&9D`K|VS&Dmg&e9s`uR&{V%xHCNt@AC_ zOHvR0PRwYMtdH4xXK6#s*2QdtEa`W!{&jDov^T=|w$9lmQJd(oIcA$<9sJb8Eivu} zru(fDZsqD$>T)yPZxdr1j4Cmh?zfAv9mZ^TL%ihe5Mu|7>eq9X+yXmA@5KJDnC+rM za*Q*xCuX~2wg=|k*h{?W#%yoQ_Qm{H#{G`kkMKauXgm*U(U{RBITo{H?j#(K+2NQS4=zljvvflGC(t?>Gg>2Cr+iCIk~Be|ju}mo zGch~kES-(nshFJ&E=;qtbWZx`&^jM8S~FW0d`lN4xd?qJW;97I$LzAR^lr>9#O&St zg{geqYms&f43~IxMbs5~T#eb)Snz#&O{edAOt~>PB)@_DX3S{U*}COV1Fe#@Lf?)V zO_Dn?yW?*5yD_^Jv%BtQk9+r=rTfyqkJfuJqupccfp4iKj-({s#p@O~nk3!h);+EX zwMX0@FgwPB8>{7YuT`CWdaieXC*|k{P_ib<05i5%ut#|zW^Jt&A z^@-=_(Y|pe&VF(08@GP(PF{bJ1LD>{ZUf?PdjsP(Fs^y@^WGrsZ4jo)Ue665quG40 zID_Hze?2#tJ8_8UA&h5e+=j;8JX-d;H%#1NItm6vjc;j=5N`yUBjZM6PL0#r-ik(v zH44KeujgvruFAzJhg14`uIWsHH(K;)42+4}n7B7q%X5#5+t|2`gE?NuJ|S)sIFEka z=!tO~AGe8dVMXHlk&qRxM}@d_m?WE%;(++dUY#szGSto2kWCRa1*%n4rKn1%JEEqF zn#$Pjy~gZ2O+%S3)^tWv6*t;6wr0fLz-LM_6M9zMXp+p1+iWfe=xf|&#BC0iG`r1} zp?OlDhf;OiXmi<`?;Bbm$pYwwaidAHC~k|~owGP@^W(PIo%6W2M2411eJM&caic9^ zYng9oxg^V>SHz7bNp0L}ouQR+TNbyK`CG8*HE)%)SHY0c)go5Yp)PK9@gU-Fjq+{R z#>w(rC-FMO^>L%EW$PXP`mdK{J@kgS(InXzw~g*BY>L}Eaogn10-1&~v_QjN48(_+4?^7Pnpb!4H1j+b!+gFo=8ob#5+ij~IJkXifCJ zBKBfoU!2#5{i60m9f;e$xbb&Qye$>3A#M$APtZXueZV9h@0?eaF z!n!A{2h7q0U3w<0G+{jxKIYL&9eO2RD5!spSEb>-7sPnRsRB_emJ7H(PxZZhZYD z=?C3EVKhkwBy2!JQ^3H4^-b8oga(F7-&qPqTSI+I!z397Jv?DFNk$}W zL_)tFBNH|>VIvd%tI{ZEsa*QyXpK%7Z4_H$d`n{`84EowVKhm`Cv3d4G$CPQ5;nnE z!lmylRY<=Atw{-^O=N4bZ)u7oQ=lsoMw4V}!lpV)(-Jm0Vbf$u4`AhM-gIeChf(#6 zPFj`7D!R-_*o;K*t~4`|E9J7zl57^T*$JDS@a80#faWG_PQvEGoTsZ&ov>t#;qrvhe11o7MIyKJ8Lw96Y7wqX7;ObxtNh`wmSid%||-uT|-5-X3Z1fwA)$9qL|@d+D+- zVfzxn>(hRnzXOR}%QIesymqaA1Kq;KhzB&VR85=N8cbiz)%12~hglL!0nK0Uo{Lb3_WPIAYrJ>$J z)ck4?JKri!E1Zk3=2}iO>50CLtvd<3!y4l}Ud^w1cg4NS5jT8^J>27LqIzG<`>4K` z$TfV)dm!=wWJ%KAOBjFeC1`CEcekW+Ivr_4mv|gz67PB`hJH=%6%rcmL#Owoeuln^B)t7z^ujc9*U_a6Ql1z|E>!0)n zB$)~aCT&2{2ErVa#LnQP4NBVJq(6ZVQHLQ(K5BgfLq!iocUaPfCB5NECh!qS8=kZg zFh|P3sHBZd+9>+y7oc1n${9h^t4!ddlexw(d1J&IgZ|j0(MGd1F6qWMUXt<96Ou-g zWMa}LCN+UqByC*MD%`;M6nB;;OMfz2Q<6rT#8#zmX{sbsp{FH{Cdu@qO;2h9uS!~F z(yCY@UT=dloTZu4pNZD2q|s)uHQTo|N0K?vbCX7sWM0zdIZM?^o1L_3XDRN@ca|1N ze*szxlSZ4*)*|21Vo4T5FG(6rlBG#o>MYeHZBf!{WXXN&zUnQL_A(faU(!iiE^;|t zRwQjjGMKqgqTkyQq;;iO+^m-=O>lv?3WF3aqByCNy z!#TlV-r6K*VqG#<_Ka6Ac|G!Xl15v{*7~Hoy*Eg*0eWN7Xp(G7+9r2(HYaU;(l)!R z!>Sz4(pKqjMQdBqXj|CY?pxX+$qr~%TBb>|D`~sjnb@7Q?Md66KNBsldV8e32Syp0 zQB02__tIrw(rC3wTbt~#SBJsA>?G-*eZnq7X`JEpxI!&K#~xufpQ?zlL|;Z(hvo6SSjD7umHoJiUU zN>u6h_f_wtxF;F(&L|@~m2|32Vm6_AnsmIVcShtH$g@d1oizTQQfr$anv>SdGks2K z=Xj<|^q`+l+Ig54#Jm8rR9F3?sEb_nGO1ij+9gyji+LH9{$jqHw0B{)h}i;ju=-sQ zb%lPzU(JaIosMk$-irq+5 z?4B}O30plnjm_otVhavr~Eg(GH0oe^!uRSH)XUkw)**& z`b*LudO*r(k_=4Qz?3G4K`HCU!tE)4f*9;94Uzs3w1%dPHkhqpzNO)k42K?(GMXeK zQ#R6B8kMqPDI4W1#l3Q8X|(i5qctXFv~sq_`j*B?G7frt%4m{INZABuX=2L8rfi}t z=?*J-)vJ(p1&jukeu#RLL{6g1AeVH{ESC zboHu89ZFdh8Z%Pd7Bf>eBV{vF1U02XNxD}4O*!5T} zu75O3bTmt_ury^$Q(jGqxocUYte%mP2$ZrlDSIclN7g$_8>GJht&J(8 zt!HbKZ)vk6o1wR)j3&v}lx=mEwxw)S%C-gf$aZIGhxB)#wKHY3?QHGxE$xU5=nj- z`H_^-4zYDK7PQYDP^>iY@PNk zosr}W^x2frBxz1rvpaxuDLb9AbNK_9{i=6f+UH@^L^Z$*A}`S8V#;V!Qg$%a_GWoW zH`L{n(JnEV_H+NcDSMZ(`g4DaZt*KAYf0IaR44DM$ZILPnzC!$@z+y!J*ByynNNGW zfvNgea(CU_e^Z>Ba5lb@+scD=OY|+q)0(o@l$-nOU-52>dz(R5M;OtalvBMc=3P|p zrE(N{zc2DW^Tf-0$$rmYl}o?`YyWww~T($))RZ!vqrtX97=QDyX7^h&ORW9cKhPnx+hZGF>T zzcgo{f7<$`tv}2GY3vM4+kmtUO#3f~gVbSA`o+Rp-@stegV7z5wjpV6XqvfySlWiB zZ5YhqGB6@-!_zi`KKij9sSYC%I^p~t0- zCdv4;jZbUtpOCgOX`A2%*3p~jELBLq0ZBTQhx2vm}`XJv(hQN#>+&j#Vg)YX)lFQL!4T~s}Wg4 zmt|>NmJa6r<>_2Gmvx0?E0ERd0<271ZQ5446Ezs=DoIx%U7cpytV`SKwAHyGmmysv z=^CVK(?)XwIQoCdE8HII(z(WnS1+x4wBAV@Z5>g3Y1`#a&+fEsPup%c>bSSZ zS=uZ8y=d)A8*L9;`+Z9XBsl=xkT#km2h(=YSvr)q{b@TSOYTSZ74NXL55s7T=unS{ zJVKYFX*-(kaMry%A4@ZV9>;prYm~eZ`H8gAjPAlAMBWN*hg*(`h^HPQ{tD zolM&qcPirES!bzP`psyaOB?MhTjzaC7bLj=eKBn`NiL=Bk~@IQX*-{`%lQM?`il3i zwBLnMf}=U=wTNt?%aydzmZ$Alx-BQ|s_u|$X`@|bFzqMM>uI~rSp5m~Mw;p4X4-C~ z?Pj`@cS~ez+HR$-HT|}CJ8ieqnm~WnyQ96`!Bo@Bx#45=p>bE7yKtIc&Rsmkm$T@5 zjOTvZ?x)=Z+Vrybp1AKZ=o$s|KS(>(k_^m}4B%lVS5xG57ug-MN5;BkjK2@kw6+Pf zG-IV1CPJz8%sd~edl^%`GS&-bZ!vqrtbbV(p{TM9Yvf6#PsaM7(pSvBsB9IpU&i{u z>@Q}2m^;;PfT#iV+xs%{&;vyc%)D6GpbmpX4T3r(YOtumP)A*{@ds}O6aK> zqe(I?W79I4DW_*_O2(#V{F$=KS(+jJ8EDPS7_Ew}S-z#&lFWvllQEhkb2B#AS(=xz zSs9z>EXBQQXKB9l=cBbCW3+0v7W$SJNwNrfamHwpEXmjsXK8817G`XzEa?HRd)cdz zb`6ZWBAv8lBA3x+dB&D!f|+tfh6lJdqtfFmC0~hrRmNzwY^~0?+pkWNI_NbSqe-$h zV{6?>U6--d8C&O0YTT=Lmfn&6J7}%X7_FYI4Zfv~l5B+Dlrfqln=`iA9l(~1ZOGV` z`~h5i+1o1ZtuUHN`6}|ZiQGn)?HQx3$aL5deEROtZL>3Dv>lA3{nNWEW4jor|Mc$8 za6|3M*zSz&$#nAeirkm6y&2n=dE48cvHcmIUVS0(VQ_%mJr!zt%WL4F{!N*W2aH0K9Mn6 zV}8`_5IW*GGj_7A^C@+1%GjxlHPQLBI-kiH?Q~n`!y1RGF=*t>fM+vyHq&9No2r{L z){L>wdFL{AF7tFK?w!|2&+|wxdO7zi-UU$?Fjf9?uF6eV7sa_K<1gnbI02VLUt-^v zGj=)SCam(8y?4cZR~Jda^eq{udPU4Ds9xoU2z%E=UW2@zv8x&5Z;M(mVO>8-xV$uO zpm8%}H#6QX$fp^X*D8K1W4zuu;M^AHHk{VZ_-XEly2I>nuQO4tcQZ!MyO_C`c?nQ5 zWA`$4KjVK2z2~U+5I)ekE6Lh}jFn_H8)yXGvRLYt<;y#3-LqbgEI;z4S?iItQkXrn zbm^6~o>}YVy71Ah4!yIiQT?(rP$s$z-9B0CllA&$nc4bft#8))!R#*s1G3gXYXj(0 zz{MP>4g<3w5SrNrWpgd8Mk3x|^oL}PHi)gES!aHjB*UPGXN@Mwh^&psYGxamwV_!X z=?2!(8|5sOOTQeg(OIL7Vrz_VX{;n;p~q#7Cdv4$jn8Ukn~=3JS(}jcXSRvXQib#@ z(3+Gr+C;V{`6Xsyf| zZ3SDad`qh(Sq)v6HJT)AvbM$@z}l>>%G%oe0aU!~t&{dT808TSuwG<6UEawWZ9%qe zW?Qe@W<%C!>lsP=nQdd%HZo9uX4{nIhT5F9OBu zq0&aywzu`#A+?=Z+mW@M?0uJZwmWOIUHP58Z$jFmaqdCX(m7w&rlqsD7cMjATi(8` zvAr+*O>e&pAIRGNtQ}zg4Owf@{-sBUgOVP~+QFIvo5!@@V~p^4)@VoFnUq$w(`uBs5oTj&AuUX*Sv!HW%1KZ9HcmhIs}SRl45t&Ss76v)ONW%^LZ+tTkut93wx^$n88wrcb&HS-XI_ zW@qlAztc;ydWoH0&Km8a+o`k~oz}Y&zx%$Owz!@0t8*o5Y+qrgSGCh?S-YCGYwYy8 zc6wbq)r{EK*}IX&rCotbJ8L(xb~8KNyCu7~vd<%xPE%*EHPE@8wbrcNM(2)n?x54; zbecPRcLSY!S-YFHd+6Mk&V6*6JEw9#=e;NLJuZKJ=iEm36Y)Tt2XHoG#9iBx;@noQ zSU1&A>sHKcT5R2meRQC+*F)SM#k`U0x1!Wn?I~tYRC^WYO2S@mk-Z_yimg|%@wcSd zN{icGZu=BlpJHB8rPj9?bf7b)`W0J0nEl1<53{l}r)+?z0mYyLojE}y`3)3fAmZ5p zV~`kwU{ve3WU#2g=r8J=tKb-hh#ta7h8EkCRG>^sCUCQEas7Y|Zp7&5~pm^z34zNiwI{<`nA}VQ#U_EVj8^G`WoCIZM^juSRQr zvC-zSwZONuP?Ckvi;9gV$>L&L>?|!Qwgttu#91PE$XTk9ehpg7ijB6Et>wO@6_Tug zt}Qm2BrA(;rL(lE*p?UDDp}GmLPck9wX|2mAm5jhRwuIVf06aB-!*M(_V7NZs@{Fy zS@&z!N+0WzU+q(8pYx%ry&vBC@|)*v^=qfK_e1Ub-M-X+u>XS~2!bF8f`}jpB7z_Y zg1AKx5kv$*5ClOGyuFXPV((qmJZ&2N>3uw7%<;@I=3H~F%*iTy^RPEBcShL9bS^ zA2Db0^eV0{h3g`DHV?EjEOop4a!$-S;`4c+iMf!63wDrt^3a`!o?PNC+DN_9_fmB! z544Lc^|_HQi@8jEB@Z+)SMzYyM(WQ)Ump5%iMwVaU6=kkRX6fLyT;Oh8|kK)o5Z*B zKofI254UZk!8{D)VQ?&QMgL{)NPUNn`hV1}-W9ydD);hmFE4kSc1YuQKhNplpIVB4 zK>lGKX!ltfc9)SyVjdAc&I3)%lRP}Jvtc9;!+997v*9iC)JA$H{WGeb=YjT=rBOH1 z3o$Q@(=2aeE*&QhIV3aG8CwJr>`!6%zL-lw%I{r}|oFF*C!_Vd((DvnFDDU-c z+G0IHa*_wMV$bi-=94{`>=`?oPw{XuDDhy52PK}ro2i1+JecaiG|w+)x(Cxe?%BN5 zgVNWvW=J;EgBc#oWCv!cu`&;6v&I_x^=zJ7u4k*x91muDFo$*Ks`qoL9{R7`L*2?f zD1Y6;JgMh&lB%d9eqJJXp-im8!hN16t+l%IC*E z!0>M$m#QyIN%jBi^xCt{GI^HKGw`!Bc$wde3s*7Lau1e!+&d^gn`(KhnUJA>WeY1j zR$3!x4W%nR&d|S_Rf4MsS9`G118!HyUY}%YJ*f3Gm^G5E@$e4H&kVKJgSB+7lXD%N ztv_>z>V)b%yo2(y`@^#Ja;ztPEa%uD#|An&e&$JLqtHg`JAZasxDWNh_3X(e4>oyB zgI;L6*@FfTHq+UtLE7R$qX%2K-#W=`RfVk{-cWG^Y!lu_ZIcI0{5HtLlgthewtKLH z&YcR-?7>bCnpsBycB#TH_Mq=)o@91=oRNPud*s_geTxUQ-7M|(*#7MkvyXVc2Q)FQ z9<(y6{36JMy&fE}9gCQQHqs&K4^h?T0qr15huug=#2g_$>H$s6F%OP;bdovl!C?=M zYg%!tx7$c3q(4DbhX=HFmQK2nPKh~1eA)w=m`)EmZKN|Eob=#~jr5l3vXRb8f0n9l z4`^L1opU3d7jvHYf(JA)Js$MfNEbag=fOoq(n+S}XVWWnFC8QQszJLXc!^c|Jm~Y} zPBNE0PSs_8bQgDp+*J>*dQ88E-^E??px=XQbY53hZg_Bm4Yk=T!2u7hdobYP$;WzI ztoNp^aZ_F!^_HUEVu0Ho-1eA34+rax2ZJ8mq4TbX=aqXN-1Xp|t@4%`vS^6peGh1^ zKVlxRm;YuSD%?Yo!yeEcu=L37{$nwZiJy2t6Eot$h#i-w9z62kX)agKY^3MXKc{Mx z>!SzHSbE_`dMV~5@hcB#Vv4*d@+#}&y?Eilc(1a~#~yjrr-@$bC-PNQ#a_@Rur!GT zhjg--$;4Bcu24rYe%XAo$r#lX@B*RsW{2(*>uqN~ss6-rRX*hL__v z)9bYSo0%nk7WpzSXfs)w?X@e%95Hi<=XyaCQ|?7Mp90M9biA1D#XPTO=38dIjkG}e z1yogdL7UIgLO0SPF^h;7dqERZ=|!d8fhArn^kT`_4h;TmmP);pj+TE@2bT#hW0fi| zXqUOndtaYdmV0?TReM2O&d&VyQ{oCQRvhj7YrI(Vy4G6B)_Jkki*@Wkof=#31+8wZv0u+C#p}kul*K% zBLi#ksrRD(HMhx&P2Sw?sRr#|gW~{&{`q^xgcN+(7;4f^f$!n$C<=jr`4zDxt7qe4vCt<(AoDB$7HY2UN3*)^%K|r`TwukC&xb013AZjIrh^r z_!HOuR-snvhkkN;`nY}yA7D=odU4Qe4tcruw|Q~Mi#9qBYn+dGaoCF^-0wFWzP(Nr zj(YhQ18#t0!pEpR?!|GhY4>vNKjB5Y7bocKP=J$Oba-)+bu|2^RN)kRF!~eM{?lG( z=r5*IzE0}TctJbOQkU2E@2r@!#NA%d#GLcu9P`HqA$if|#d+JYh`C@R^+?}C)kQC8 z7g*|bBV7`6iMY=TnwZNxi0z?&#fx4quISL`bi8UK^-JGR)ip0@S6RC5M!F&92JwIw zG%+{5xM?HZ^5VJ|w`?Rn=EFuBlzxz^J6_Okvvk*ubWhAZ;vp|+V(xo!-$r`i#a%BR zD3aEbo}bJ^sUOlY^cM}z3$c*># zBeoATF%x~5=u>uzeJJvw*yk=xlYELaS^CM;Pw{~^iKP-Z(o`{1iKqEM6Eoe1={~K| zr9PDSQ0mK#M9I%)hSW3YsQ9bG&J>)xev>H z;C6}Z^}F}5tHO5n zph*kF4jvy|Fy-4xeX|d=9W3qQ5yk%P7PFgpj}J64Ek3l^LvXJTyL{MdI~FnfY^43t z@29HO2iiWC4!DsHiaAJp$OoF3HXqvTA$Zt_13nzqA;@WQ#6~(Q{ZXop`9M3u(s4IZ zyO?(36F$(ybokI=Bc1f&xDO|7q_@l|8|k$4r>W}nfp&_eGj60VFR~7KnuP7^5eYnbo+`FLtK3wsk-=~X1dEL97*KCbz^4h4^74Z@$XLkPo!GEZujz z|3J(G;)g!a#0>i|Y{%u15BGg|l*`p)8|jJkPpBI4f%cfCr*5QYVxAE{_kkv6)Q3?U z>4gtZxvJ%I_0mRqCH*U^iu|CxWNEzL?)(HlnF)R_fqu}$6#G%^*Ah0#kMVv?^5=3j z@}rq7^<+Bg|Ds);A~=PWOZ+JD=PnMX`Z<2n{7%PT%yjY7$(Q;;o5s=%zgp7F^6Km447J`Y_f1`r>ejpU2ZuKWIzXncuF#%lufz zzPf90m0o1A+>a_hmizy1ss&g0QSHYH|1YM-j~c($;EY+R)>bl9&yUVly9Te4XB9nt zKRW$9z*h^eW`An^sP)@5xaUW+M&32-bkj%d(OSQiu9I^erFDL%=_9jVa6RD$KkEG8 zcCGC78obeujs6BxFIl~x&w}`op*H!kiOvQ&8|ZBQkzL;`wAs&lsXy}KjCX$<G;9;v=KuFUbf|$Qp(dhJLfeJ56Lkvh5Zb|dT|e^A z-FFJ@BswduS*V$)`$w*(yZlbeM`pKtySayZ{Gjb(sfD}FQQIqKFY!J_M)AOm|Ge4gC@r={+xgXE%^fYEvO^qtl zkIn@KbtB-!juhPG`8%0BF-#n&GxPQ_M`_Spm?*lm$>0u&ZkTGXj{+nEL2F$3~hf{amWb z1E9@eX`UNtzL@#M3j&~tsR*DVpwq*`0Okd-kUMSYA!M~2?;aL8oSuD?D zdTQTNmn#J;8DvSoseQ{V6m8p5>!)CR!q zssL7wrK7W#f8{8}Ix6Y{s0*0&0S4R&l^2I@Fy0V16UuxW(I2v@QPwf0F41`3Fsn(e-&=gR+8J)MpFRW0%)>1Qa`pU z(sr^t0@x8SI|IC&Z4O{(0L^snQkC5S>;s<0>U?|&Hj!BKz~;TCH52Cz3^ z_62x3yFY+^0qm!Fx2)_H^Ipeh_>--mzT0(>aobi8HS217~fdZt1(JIu`)#EKBFzNEgIhAnpl(Cgx%Q7j2~80L}-{Ya{XR z8f~OL>HDa<902VSOIO@TSH)Z9Y{Rc;1wGmu+=Z)p;OO_8i5h$%so1o_*bAO+KcpiK?t8vD)7vjQ_c z$bL>I)%1h2$u1YA@|4ok{DafNNiair24l?(VrI}T7fnByS@O;ba(DH7p0XgXMP>)B zevX(q)Xxn%BX62=!E(ZRLCg(;+u1>s1>MzKt8?YgW`2-~T@b|lAQn(r5#+>Q7(_)7 z3ker7!awuvOJ=cTl|iTEEwe;Xmylc<1g(;#Wp49TVycLj2SF249Yi$;h+obGu`Gxc z+&8TrH8#>p=~q&TwPI?C*91Wmvo?seK`r9zf><5II_|$cfLnerbyC;S zQNpKrSj~EQ*3(n;mb$z_a07#E3_3;p?WJHn;ie!q2Epy(pu33Y2Bjg02KG8&HV63w zjLl5;8_u6hqpCG3l|MKqZN9e1vxT0jADkNIYpd{92HqCLHaB0DKbR(Yo75TQYrBq; z9YL$#DP|}2&Ft5kW|!bD!rehM2f^)*Ahzf7#Vqd;zlY70|KN<;4z$SALQlmHxkT+% zqV@%yvNz3sk^330H3-^1mJYb>9u#ws_)riuF>OJ#*+d-<;y@6G8B>WmVj~@u{wP() zf}kB?>9`xIT}(Uii6CfVI)do1NjMqA@gPo)C938Jb4uz{bm);;Jlp}Eel#yPL-Xq=Ph96h7soFb;ho&`I7zY9G9CcujF|}Pxm;dhvQWgA}$K?bA1ToLw0fN9A_rTJ0ZlAk+L%}#E)ym zA*-JxW)k(2Lr%w=W{Thx!jcdshrn%d2opoOOVdA?sp6-G_-K-G&b_(17@H=~GiECxkg6t!i^am=(fY#?)jf zw~^*aKaZ;UA<)WMTHr>i5K}?CFa(;IMIkH-X;oVs!h#SMbI0wf)-%pjN?l1upH0WH zab}4;OX%UFw%FyRf=d}>S;*<;!`lR_2$zSjECg<+hul?7zmuyDp_*N`r#!PF#5JfU zgcTvwu)@j^1*<}!t>ms)&2P?BX|r0PSCgtA=d4<)v8!P-@Im3g*_p@kI@a#BHTjl z-VpYN%)XGWSwq+t!hSki72rS!tsxv>9ed5H3J2MPx^cQ@Wg7o%+T?4a{%{DiLo6K$ z+5R0BbCmd42sAOrLpW{^#P$%5gwSp~#%op^sYCh>s!oPLJHgT^H_~Y_r-?g5pouvX z!WnxYc7<>%gf1P3oE&Fuq;BcEsX7+|?JP^@-AEV2Tp;cVfhOi+2p4Un-Vn}*&}$>{ zn$(*G7G)s1F%nIE3Mld8C!(aR`q>cueP$(BJr1;~_i=VZ>J9 zPmwHoO7d9w(8SCRW44VnCybe4%uyueYVdnASL(TR6n&%)mJ61%%Dgb< zg>$!H=Z86d3&Kv-N2Wr21^Ic0Xb?gwgQ2)@I2X!`K`~BRjA~jcpBswq>lb-z?l2vrS#yMylg` z=ZIano8)Ptr}KNKo3mrP@OH-95yp(oTe#a8d#@CGso1A}?hj*M82j1u8%_(^R{c4u)|cjDs3= zr-|$#v4_aEg+X(PdJ>04942uj44NhA(f_sIb7~(Ie>BXeaS0t0I!3fl=(x~vqSo&@ zj_pG2Vg8=$d#=7G!cN(rO^19PjD9i<+6k6Ug`HZqds@tC;?6K=V$Otd#vXiKVVnx1 z%kEmloVAg#!w8?y%_iv|jNdzU4vFSWD!UJkr1XClJ7UAQB1xq8C9zkh@j}wkyMnuy&Yi6pc znG99>y>rjb$XW8tqNnV8rgv=^n;h#V?Oo{X8-A zsGlEkh5}}R-~z&m22-e!%t&3oF1nb6fSN^@Jle&%$-m>B0Sp2B|qKL@^Zs_kfOmS;0PgWowr7x+dE z;YL>962TTX9RuH)t@3VVle}T_hS|oEr?g4VCQ7$QoQj~?A-IEZX9U|L;C7oVmx(@B zXqKXxid{O)c1N%)g57q|y2;kXfDx4qE$pI zi31VPEJ2U{Z~2Z3-NA@c6*PyWIz&}l1hj)J9ga9Htbatz5#pl}(8L^z;F!(p@dyq_ zaNKq=V%lw_6Vjicsv`ngJ4+|sNT-8cjmg(*XgJVYS3;7-e8r12nHg#h3=*%%dLph7BsiT z-zGm80qqt`cicncu9&;T_adN)8H!-Y4(j~~?nH3k4(eOxfsOP~`iE2vM?ibP(jzz0 zV=<43pF}_tGZMjw-GQeOJc{7y*bWSRXP!y@jE=UTI`~}hIjf9DK)V@vz0keT5%`h| zWdtwSlix0MuOfK$dZ8Rh%Y-&=J zkCgh(X}2?LvOJUNsr}BWkVD zZf?}6dfSwXEN8fRQPAeHG~aD^ftUrv6;aT{ER14dR14jrDCS48h%vR$Ew+&=rLUxF zNffljEG=~-EfcehxGD;onB`F{kLn~<9mUcps=4F#;H&%2tdM#I9eP^khujTQBTo%I z6>qD{D+O0F$f~GQ@wQnlxSFswid9i?J13f3=>BZhh+M;d7LBE2tvqY#DgMqWVLH|c zuVeMPDC*pF6n$sb%e$UUHYpt&qPz{cF>3YoV(O{i6m^>3HVuLegqx$-6a}{%qu7v3 zhlZOsn;WBOjQ)u`yCsS((dlMulpoajHu!B(Y>i@Dbew65qAB_xW_#5BlyrNPfBCj0 zT5EPhv4gMwjsE&J_~s~@<>7OVqGngr89C1dR9)E3F6@b7Pt>$TLE9Dm^$r{}zE>IF z7j@d+Hv1*tPkCz;w0$fcaChyXn1jTJqM(Usi=xeD{BRTpqBxw(_z@fFsPspvIu-@( z2usJ^NbO?UiBCj96Vnkzht2rOD2_*QaxCK|-Ig{T#3J!sl82LKGL= zjQ4zNdgSe4lYPqg#VGHT^hT}zl9)@>_eGt)x6Nh2%Y;{==!=5e-Y72qIsvbWzslx1 zzjek}=}Mzto_>0|zs*g+Yf8uUs5A7oxgqif!wp11yUx;0x7}M}ZV}&(f+l7#ib0!> zJ5k(>;tpeK0^YTe?n!@-s-Y-ocUijcMtUIT0rA5qXkvz=7`Ewn6vh209*w1=|6B7| z>c@2OiJVMF=eOpGJWuEucw1c_5gcKVr%`9%ZSzd<8R7FNo<_m#wO`XQDsq(lY#K|) z3wd79)BLT|!gRb8e#z>uqIl(|qv=~y#Dx(>F@6-&W97!j9RA@^%<3nKnHb}D^)aX9 z9WzOA65-?+ieun*LJZ?$?s}M;fKy_a68qC1|Iw7hP!gMNrpDX}I4y>$F-(h%Gt*<3 z9{Ued8nY9yG{y;7600>cVwe##Gh@F_z*#ZOl829ziRQ_nq^tuD-F7v{t;CuZix zKr4&=ZUUCanDKcrr{WzmU-J2sFNlFQkEIHC*A|LdNW3TpnwZ5gERJc(t&E`}hRT?m z@g+9WQt6jcwJZkO5|*mmNXx}6C$5fxCT2wpD`Hx5YhtL1p@w7Yp6|akE2UmZho0!k zU*COeR>`x9p0an;<<)|#8KgGml)Yot2(BSq8$)dj+?K~)FS+YPu46yT$1+|gPaQoK z-#V2Xul2&~S$#tc8)5|fPUKs&QQnPgvR)alk2(KjHpQ&IK}-Ynn>pU^m`1@y!Ywgu zj)B`vG1TWW?!0Zbir>oSO22ic*a^5zo^AA$eVdzrO-jdhj@3J6hsYfaw=)LXc9xpm zc6W){MZ7x(nwUK??6K)+iJ>`$7RJ;B+-oE4lYSpn`(vQ(WvSJTbU@4j;)5~J#2kv@ zkWEKh46QM=jisaVTXR_I!*u9zp1kk(tvMpk5qg^5QJ0Sj9%YbYF{kMrb6oH^VS5b6 zV&Jyv*L0i^d4l~M`X;v?cF5B~&+s?S$T|LiUic)dpNip>n~tGx%xQT~v&n9yqcg@I z=bwpLeV3Rn>d(fU?srVLU^n5p7|zDP?U@)le?I}w$8eq#@GWy8h6|j4J-G>ZF@~NP zE^-3)#?Z?Nc*&iBmoxz{a02$l&=)h8e=`BE#BfC(K9nwIuEv}J?m@r0(9bShi{V<# zT#tcv_4gC-hB7`t{X6ES2gz7qpY%-tC7+Kk_e;dTu7av2}8 zk?u=>pQ;Bj(1uug=tdeAGfey_2AY`1F+8>ze-gvP7@mw}eB>K5BJ~Izd@3k2KJbls zD$i4T`rc8Op9wx=kmoU{?;SHLI7;{;hUYPGd*j!PzZChB{X907@mKP^qNn2F!jyJ#JKaODUMtHBr%hypB#6J-ZfJMrx2FJF*y!y zi{qFW&s~DPW2TCq8s}fpf8)%y6L6Y5)97jYCN}}6$C-}OxKsA7nIUop!_AC?R?5;W zx7{)^WyG`Npoy6i$DFv z$LcuuvNmq@Ys9Rfer?>Teb=lLTt`?J$J#i!t&L-KE*-fu;QBb$$N%)l_soVkHpHi! zjdAx3SRcp6IO^l$%%(Ut#s9-J#O)cdAI ziP;;+UYqfKaqNy`UoPYOZKPJ|Td6t_2W>w~2i-`A#2g}Si-RWSa2$ti#*f5tFpeW* z8L$7w9F_Vg9emIzGhX$LIVR6Bdg}Si%XiIj!Q%|l&hYP=6M`oQJK|`MgWDayX8fec zlk8{lSjJDubBdmlZ=6z&*J3G+i7d%gRA&zr#aCl{%wS1qDjX<^D%2(MrhHTkH?x97j6ugyw% zSF&3JO4%xAhtkz@uBNn>`yMcB1lJI*%|~rMxLqat_0vY@*JfQl*5!Zn225SP^NO!M z&PQE7*5~uJ$N4<=Hs)hPJ~rn6A5$;5DIfLu*hID=-(7k0^|Pz@&1SW@$A&$$y)Uji!93$#1rc-OkSM$Oo;7rJe3x zHj8N{-jxrUnBDo>QmdF&;sg1hi8+{$ zgZ9`sl#l)SI5c)_w0v#aq;8`_e}BLa9$%Zo@*Jk8oQ zHa1l+C>=fdPM_ag6nT;1dh-DfZh^KmI3R~b|3=(mxs zNq>#1>-nJdvvk9aG$3Yx_+~z6Vs7Q*mQBa)eB8*#?Xh%Jer*P&9;Bnsrla(0b4Q*# z^zd&S*yX!|cNyefzSHeDLxMwu_w#WtAKYH}H60H`K43qGzH*+~(Re7&Lwbh4az@U+ zVTOf=S^ZHy9=Yil`pP_(_c5CsQ97RFTj_|LBa}WR=CelypAkOK$J2ap`$U$z0v%xN zQ7J~Lc#+R2FZ1ytA202o^^tug_7&Np#NT*#A%UU<#wWODIo)I@B*;!k@K3E0pt(c` ziDD7OBqk+5vjjc*zwIl2$1pkJ6a~x_sisg>k^pToOH&h08|zOKGmUt90yHtD36v(Z z1kXrdY63G7$}3;oVI$3weil__3D9P;G~10dN6Z}Jxe3t3lqXQ0&=Nc^f!PVnv%BLl z^KGOB(l4N@A_3ZbmKM5^7KvFzyf^`xn92kyZKNd$EKFdDjl@3!u#uKYzl^G?1ZYcH zTJA=w7E?{UA_1D1ngnWWq?HLQPhh1YX`;7%WmZYOijE?FdlfLN1y{35Z34B4+;ZSzNC$Py5>RYD4M%pa> zW~v$!pf#|x#f`L8%vR!U3DCqeCD3GdV0!{v64*Yr10!FV9a8V0gMXyJ4(=4($tukW z(AFegf5)&Z!6R^Y0<>N1$#1`7*pt8>cGSHzX-V*Wus4C01okHWZuSZ8PhejH`xC#I z)&yD;`i>!E4ydUE3|04)Q?*=|cL(J;NKgG&P9qPrL&AsHnYIMl67~dF_mw#;?_u_M zMAw%`6#r<#>W_&zM*VS)#Ji?lu$}Nk0>=~J_Gkh}61nO1rs)vh!RBhdat_!IoRsGz zJ+)uuKH!~F?oKD1lJ`uf$WDeklK|~BOI>ceXT_W)?oNOv=3D~jZ0^n{(3QY>#?(T0 z!A9zlzK5!d3D7RE)aypNB<2!vUjj5SmlL>bb9W_y-UP0U<*xB7b5-iAbd>O6#C)a4 zSEgT{etL@DQOFH`@IK*#1cnme z_O9%A*BcM1v0v*9YseoZoTm58W7T`idQTFdJz{CZZQ!Yxr^L?^pow{&z;ip~qX~>8 zFq#|k7dFyM>0eUyDgoLHmWqeF#3UvrwFVU@QIte+GB@ALzA}@f zo{PnT#q!_@Mb>+hLT z!BWsZjyrXBxrNl z+JFBXP-x~U@;p+5Uph~0lIP1apPr#Fo#8HC`3f&!tcoNml6KAwerXoUyO90mUn}!_ zv!sXN9pU5uDbHd2H14ODGTg0_jJMmN$H zF*_Y<9 z)Q9O9@@deH2p(aTqe&c1=FVovlANB$lTL--w2N;ieWg$#_|?H)!CqFmlmzWq^7YxQPecaS~q(DHdF$xqmKlU9FE%suLdl1>NLP{I3z50V&4g4?@E+!>o*{HrYS57}JJ zm(J2^olb}48K$T9%iPlXNV$8Qbo$;iPeeXpxRE4ik6C)^w);%XGven-(8P=;F=})7 zB8jJ5(->1{vzIo~E9qZRRa5}lOP0nL*gcp~KxRS#7t{jK#1t2xxIio5qymgDz@&oQ z!PoeunJo2WI`oDDp3S~AQ{ed zDlw~wR~LXLrnUgJHUn!4u(AMa#xhX$rCBTWS~~bL0QOkwbp=>w+pQ~birzQtrC3k@ zh62!}*jNBsojSxyN^QMF^$b(=zV>sI;3g^?Y>3T*n+Y2W&`R160?^u6I_kE2Ow2Lj z;{~9JX)i##O~i=;94){J#?%4OVI!TC{v=hW3P9^%>9iZEQ%ooEnF7$nbQPe>=ILw! zP8Z zkehDFdcoueXM@D0GHi#w0&W&$a{rNR@n!v6j*7$ zoc)wuD{!iO=DOf@!W#v+Rse3V%5v8lEsQ-N#Q+sIb=cf0z|8{OvV+z{_O{sDWCsg) zt#PLSg9W&wfpF@{-W7Y7?7afeT%wl5kcc4?_X|L?1U>q{>I+_LJScE#edeK552+e1 z0PO)wkJxM0e=O!P@sk43#EcYR#OC!W*RKLRwOx#uXExGv>7P?IS^(NJmR`7#UW$21 z{Hg#nF-1TTH2=l}FSxowyW=qvpgv6m^%KDb7@$pHX%cLoCX1O&JO!YMDFI4sq^ZCp zV5*JumYHTFO_zQ;RiyxJ8cQ?WNHfLEB%TG(#FPPLHqvZh1~6NZbYxY1Vdh9ZhmKmG zIyhHwE~}IS<;Y!Y%ma5|KAaApSs;D^`3itGpQVK)IH-%nEFxYE(8N>%mC$Or1Xu_x zfje22+DOZ!Uq)3GKwHYvayL@7m}=q`08LB{P-AysC9oV=Ikp2GUzk-=ucD*Frw*^-2du~6%?81Zzy@F=elhhx zJ#?+{FJ_aP+Qd-BUpS+7W;MvuKu^gRPASJ^v+!nirV(g_J-HQsVYbM-MMM5Rd$d*Y zx54V0#57UAojHEr>=4{RxD(h8aJvoIirn=2C(|sxnaz!Up8Iv)E_rs*Q)Cx9-m%@S z-0gwW^uB2k*}`yp0oopx_POou7qg$Z6`+YZ035KnI|%Fp4l|Gqgbc$%;iI0bOK8@YwmT+W7Ur2Ep}r|JPf8)E698);a~F!3XRCgw5l z*yijB@DO-1ma~D+&4|<^boAMrb$@Q2%JY;SzWIe+ekS;gL7sDu-#4Rzql7Pj=Uftj z8^7l4rO21;XY*LjUdi){o|ey@R*qMZAuck!m^B!0>=bJL+)R*ng5kA-ayHTME_<=D z`blCYQ9s!@BYe1u;1t3VgUJTm78^`7ucy#d@ly@I2Kn3>Z|^HllV=(|O`qp37N;Ag zqtrMhAD9^;XE5AM16nCdv)p#e#FP=wHlT@_V=%{P`I~Dn%U~{JY6_LxNb{thN7Z}- zS~*J#+(;E-Du@>v(8Me?64NaKV&rPM&m2~KRDj#w;%o2H)&{On* zy1Z0yDT6FCPSFRZO0bG>xxq36Zl{~qQ>a>GHTzjHmW~zjte~gzbEk^ws1dGV^_2!I z-E>rZZdS>=icMC1z;vuOymYHIR=-Bf8tT^)e_+-Lt|P27SZly-t-R`t0#AoT${^d^=M|5*09IVjITdTKvVmk$XZVvsiD)P7(N3mzss zV$f#5ZR4*wJ1X)h`#JnsZrM8~&oO#N=sC@&MGGHi^>%}HH)q42nG^D!V3TdiS%={- z?Ay6aN2;|lLj4QQ|OPTOMDlb8~iNy`+&3ZoTX>zv)mNw zRyxiZr~3nQUgUX(yI?>&$5M~m?nN;diF*xbVlEk6vgznE=rQPHOiiK7HqsU8uTXW> zfOeUsemBxJG1rK%8_>kuFt}mUF<{VdFff*m(a+3Hsc+K3_pUG9=n$kLx$(}`vyY>_o;tiIMNRdXb-q2 z|MR2Mup$qW>i8`8(dm&qkLc9}7QbtS1If++22iW=7;4VSk%EY~iVL`HVwE z{c|zTsUI~?6CaW)_=51I!KeYZ&kUZ9W-5r=~C|g{h3GTu!r* zrb|Das?ro_(^#6}Mw%&RCh@EkXkyAzC`)NMoSnjq6lSM#%VGCtW{%Wz=-|WDnaj4% z%v^cq($nHmm&*mq8Dw6{Y2j6^;C#XbDa=cO+wrN~a`?}tLSzN|S@)UKU`J!2JPYZm z|IBIR@GcTw#OjMvSe&wFr@GHfrM#7FvQOz)lCsjJaxSHGS<312m@2_4!sRI}OM%-Z zGEb}SFXvXm>J+L|fBi$gS&_0UVND7vQm9G&VpgV{8aBU5K~^!y>J(O|Ol=CZm8svY zglm+pwJB%FW7bK&j`F$`Xlq$o?{;p3m<_}mQ=o~dPodtXYf}pAQ`nSCSA&hTS^CXX zHKssoU}=jRX{(s6#M@G!iD^oq$);<23R_axK9;V=&&&>~chJEnuQOdWpP8NV?4)Oa zZyw;g_5_<5WLL@=@R;3#y9xKCuqy>_*NmkrYg$CMu%9JkvuCe7d+90t%qin|?GxU| z>ibjJ@20EdGt(+>E1N9wGF=B!{PO)^%IXh^IYfP1$|>=h!-9tikEGC+0=EZKIFQSk zlV^^KKg#BcK65VEt<$LJ{@n?1*sj`oyO;WZ~jo?y6+6lm=%opjqhCFT_I=@e*U zI#cMh={S?Z$rR2ore;rM?(>~Z=S`>qssskoP7l%W*vr7&a%t()w9vG>V7Nd1jVataSp zc&LGJI>-)-9VYuI1)58=k$5cPF^MNB&@4fZ{%`q|Hy%b(PLtO>mFg)~&r+a`u=JdZ z4eO7J86|#^0!_@z6kgiAzDnVF3a@MzBc>>=NaNGgk5BVUu{3B!EKN+?NX24`i6^B& z6EiuD$!V>MQ_`52#+0;nhri^qk)}#Nm8xlJ&`MaE?nWvVQ%XD|4VsvlY0R{dW~DJb zjafDlf5~Md&6a*PRddpym9aF}jZ`kCoOoUuG%@qjm~SI3NMmjq3lvF5R?DZRLh1@S z_}F>w>O#SVtg})YwQXrC&+asx)XdEUk7U)rzSlUXun*%-S^8+8tPz#_BZIjqSkT zr>0KoIy(Bi>fn08^{lcX4cg-L>l+Un(>wy})1Yl+PkwvjVN)8L*irXtp&`wyh0SR+ zq_H{uche}iC5^^3wxoYCThrK@){Tb`%{Dc)jiGABW>%9tP4v`$>eTT-+b+DFo!ODb zjH;p}MaJwsw=5%g){gc@z zexLT`)7*`R{qpRmr|Q$(C10y@cOdOldCWnP2N~{A8ngo}wYlvc7IT>RNE$RTN7FcJ zb9XF_wlt10rWU&6Hd4Fv?NpsegLa&y4mZ+CF(-*nr9l&OI*rpdcb#c;q|rH+ySh)! z8L7|Ep?Bi&&jLR+UGj9%Q^6N;@R==wXBnhB?Nsp6Rq!0)`82xI;I=iLyG(e)Tu9>r z+o`P4^-_5WFRDF^!AqkKRa{-n7GC@LfuyH;qfoXkVJQ8ZM{Nm&WDv|1npT zkE>~1N#iQn{`4RJ_aFZ^`k8aR%ix;gUgKbteCpKLmafZlot{#*^dbG`hCDZH+x$&m z?jm9!jRD*IP22pfG;XGGiw)dXdxL4*PGgYG-x0i<#+@|olD)^~anCmXPi9DghuBon zr_MUt_~SI{+XC()IaBXlV?T+M+sk~@jMM~pQbUAJ4kZ} z;Y%HauhLFOo+-*uUX7<8TTNZ zl2N1*=}V}engMMJOViv))5T0DF3o@@W<~}xGFp{qW-u*-nVH-QIQWT~CG{*i_^va) zQ?2Y%QzlOtJ#BpFR-TzHIGaJ{WSlm>QBQC#VR;5~GT`>**g^QAnJ01{``I=&-1Fs` zPtUPWoDL4(0^tR$UXejX#;yr%pO}U6E@YDf8tz3I-bq=^y`;WUOeOV8GR{DrSt_`c za9IXRGT?S`28%MU*MutZRcx;1liZz@CirGk9p8-wG zrVKXObTnkJA%ljobaZ@THcP#k4!-_Or>IX%qdblD@QrHh@)p4@46-%j4CR?^g4+n2 zGT52{x7C@~Yr^&nwzHikJ6U!}xr1?<>_Bi$*qOo3%tvn&nC6Vugk2dlXRs^ti`kvw z@xCX6-5Ko3{2$Yj;iTM~K}!aE$?nV8HDO=IT@&^z?tTtN{U^CKp;ew%dK%dhe**i7 zIUvsg+xD+(!ods<+U5`0=G!tjltCLCIIQ-LWN=B33}>mCDf`4J=RtQ`_%sK# zGlNd|AT9mGoRRm85}|t)T^ZhAI-9ZjZZX}|pJPsVb3yPt;e`y&Wx(y(47zd$Y3?BG z(Ls1I;}qqYUdekYzmx&(B1?U4+{nToal;F?Z#; zOV7v$>he9odkiwfgZ~3_U+_NRgA9f;;I?P%AmkD(@*(><^zqmdEYC1K!yh{%9bAHi zAF=x53?93~J@m18BJUG6Sz(vp3~whqWoy(w6Z4Gv=NYGhOR(T5;foBOXTa^#3`WM* zgg=^>;$O140d~Ot>BuX2UePo7aV{N2S*Bxr)~U@i6S5>HWO{i7GG6Vo4TD zS$UZ%S7kw4_CG6YocY{<gB1Yr-M(!3zvV+7X2H#bjaf8g(U|qz(H#}%f0->}wlH?f$4;MZZL2(6 z>1qAgY2(qoO?VsYHf7P2wP(ndkIi;@x3j&z5Qlk3)=GEExs%f7tkV}Vy99R;?#`k) z3vPGFawo?o#@-{v9x7Utti4&ZWU-e`^Q&&M`^4@eyFdFkK7A&O{aLiK$v2!@vIoQ- zAbT(inoCrXI3(f_iMA|gmY_%fSA5L1>9F|2*?<2-z0eV%BSZ~CM}>|OHGZr`Ug%hs zFS7ZVpJR__oq>>Pm#>}CPh>$m&QeF#sbIS&#hfHQl?6@A=`2q3NZ=p$X3>#Fr`@aY}wvl?J@1^Qe7PN~j z^|_HQi@8jEB@3FEt65yNk@~af%c9>#;)-n}U6=kkRX4JrU1Mp$jdWAYP2yWw(8S!% z;$E^i29^R6Wmv_LQYjH_{6+FNj}e zK@;;Ti&u6BiV88xRjDwy18pCh@r6{6r=yI|Hw&8yf)fh42p57jlzsgx>A_33GbJTvGi`q(Mvfi_ckCOb2$5VH#Hj2!(>Qzma2d)%i7N6l9JIfYg~SIk`M z%L|>ppqVE)k8pk=$_v5moI=ble0|NjK>PwWH~gQ@RC|7^kf(y4k^j`X$=lrv3z@q` zh0ajWEEc(#;VKJ3Tg1{5x80>;mJ%;31Wim;A*whe{Ha(WmK0(+W9o9D+D2L-{R*mT z3PG!8X{8%!m6%n;s|!IBQ(K7ILY<%16k=r|){Nz@_+ztH>a}zX+2?o-|EF0e&pLYe zgk*NPPOy$a))zVhe5{w?2EvVnSYHTk7Z$qbC+%%N7gq}GFXT2Ava=0^pre8M&4t)( z`_NeEl!VL{#o0pt|4-Jtzt@zlTcg(6m#_9-YoDjSbM{$vT~)2uCG&pCyeFAeYSdNT z|APG|d_UB0=f@xjf*=TjAP9mW2!bF8f*=TjAP9mW2!hjEA2Vvz-p}(sBfYiu_P6)Z z-`@Keb0isaa~^2&*pdfYgY8_sb#0VWBZ<<#sm@lxt@PZM2ip3)H}Be=Ib^m=+0Fs# z9G(YFVw%Ww{pxfd^x}CLt7r&8B_D%xQ%o|{wL^lG7q%lEOoe% zPDwdMd^!&_DQEI<#tv*}9y;>SX@{DdQ1`Fqth~>X&^v{FJPmVB%sDdEe^Zyw3!Z0? zt~{suZ{~vF1;UGY=*k0+t$&;cmvpw>dAO8^Zn|BjznvCWG%c>?fy7nvJ$dM{UAmU% zH2=+9SJ><1Z{&d{kKR1cuGzj`wyrnjbdyB$-&E(8;4OOI&I9dA-kbOAv>0Lf^3eBs zQ@Nv6em4(y@^F{V_p}%Fb9>6eJ&x#qyI=b2zYgE2+|R>(#`wfM$io8`-Zu}`-b2=D zvzg_c%7D)GQ62{J@Q9%w=kZSENgf{O;R)ejp7Z~hr>gXnm0EsvTI>XQCgvHL)?YDb z&+ECE=R7aHe}TW7|J4kM86v~?I}E;SUI@Nm$d}v$-ZifTUlA62@G=j@p4WFOqdinc zd-&0cv)|sSj1e=2Ox>?eJ?HmW;jtdxAA3;ZvF+9VYQ~8j=Slxl@p~Md@gD0sLF5Fw zmU^7x_sm4WiG-6pDD{BH@v_{OSk2gzD;sq1i<9 zgysm%A*%Y7bD&bF(o;C1`d8km%=I{>@0oex<}vzw4`_2)s^ZzQ-33w>5HIwACS{Qa zi#*zxt39alpxU0=+h(ziv_$?(=(W@X+G3V!+(^r$EF)g-0ZqyZ4_0`zG1q!f<3X(* z2Hy1ANUP+(ie9Tdpsi%7&W*H2${OOe9?+z$^I)BgRPRBZ2lY168)m(Yv_bwG=(W)U z+Ip56+(?_GY$D$50Zqyl54PAyjUF_3(5Oh7j>W&4t@7SVqLlBMc+YGT+{P-~J=pGf z^Qu;zY4UI_?BL9K&+L@Gllm?XXggSHcBj;CDZ7dHctDe~*Mq%wP+L4`_MpWM>KkUC zjkI6>`{{MS1KK{8THQzor5q$al!ATD~JfqAh!P6d` z^5C@RH*>~=GalWk1Wl)!>SU;%Uz|?6{?CdzOQ!c1r|&5LZcO+bJ9FNH^X`i5`NedJ z?P8Cs-(im~DE>u{^}i(L68*b9PW3zHvfyRHD;{)vz~e;^E(|Zre=}F5UuAP$zc}NT zD^opUddPJDlDkv6rrcfUz`kQ{NW8&ty&ll6vvkvK_m-4f#J4@5N$K;T&*tuq2RA*q z!4B67#1B27Ng429z~=6e2lqXAG@QG>U(929KUVJe zhAw`N`^7vF^Mp+8JL>YF;2?uM^*FWfm}i2|2%mfK)B_%`d2*km17=9#5c}Eui!;rR z#tSho$h7?8v@#tpg1h7N6nn`Qd-;4-=@{*0I>vad|5zzwz1&cV-!bC^ z#}SVAqQnax$9OT?>+X^o?zUge1TQ9dBY*n8O{v%Zc7CE4rCv<*{$?h5oksRyvVu%z zkTNgIyk?3Qv`OAS{C0k-mpPl}bvoZM<#I2l`*bg8(^#6}c5bGWnZy-d(4@@rVwP8% z*laImcrn}S=4_6QR4M;Tdd>BMHixBoZlw8A<`Y+WL6fq;iv?b7Vhg>P=fy&fj@>X? ze=&>Xy@-TfgU5%NznE$<)nwY=QI{7BE@qG=UZ?#Xvs7>?VT~6{yx?)FHt83Oj{a-B zPX9Y*t>9Y1bzZFTg2&Zftjgt#Pde(Q*R#2bU!3iB(ySM=o=oNN65612Z1g(C@0tdQ z4Gg!*3))7OHoNU^k+Oxj(F>ZCtzK-k>DcDQW-qoerk2ol8>vbDP4wE~1#LS^JKadT zr0gPY_JSs5w->u@I`(+6(~CXB>8Sa|?3MRk62*3GDt<97Vp_-yzN0Sh6Wqrj`@PQK zJLZ7k0m4=<_IttOhT(Js%t46<+0VhBb4%!um_uZSes+qPj>E!-S-s7RHa8uEKbs?B zkFd$gcbSf(O2;vtCH>o_wA25%*QtEhoDe)gc+!jGUhsI#i=%&BLLFXoa0$I>PPt3y zv=^tmIL#$=hABNV!gMM~Cxe{z;;h%4^MZEfk4xyha@OT_YTq>%%vpq+Idhip|+oFD`j;HJ7s<8|j+-uhHwe7qlLhZn%+prSuZt^nxbkmKV2d z&Te~g!;9O)IV=9f^vS!A1mA4OCDi}3xg+Kd8NOVPUA`-LmqG4%o$7Z@zhFP%eJ}2L z!Q=VioCVDTi4WM%j-PW^p@(7~lIi@}>Ed_|2oJFOBQGAgIqUe@JQn+yO*SiMPrUpc z&!E@(Kb7*7{?EKl^SkD`;B&$uFP?e9+2$ln{^efhJ|V5958>(I)sX)`tl`cL|l+ zNE78hkzSL0pp~*T*^N{trHpur4>T!LeVFRgjyBDQ$v#Z;<#x2LpG~>E%Sq_9b$n0R z&t|%q>10~pRhMT7&R~$4KBx6vQz2MEILn8bKJfTzI2{2qTjFf?vwnC9%@H$)OvBGk zBhyhST*>NleVFUBP1gTx=82uhCiwz6KJ@i59aTQ-zd*_Y`Y-f3z3-Yuf{O^NeOTxN zk5xX*_x<52wAhEmzQ~{cW|sKuRcNUXOMF=B<5$r7>@SOIeEj|KKbvKWwTxY>{nH}>HOWWK?+ofzLZt{U9Wrq(t>>SwX!!{pw4$pzcpUp0L?;=so7di7) z{6Cv!G0kL3-&U7*3+`r+JwB)OZL?Q!FJX%hdwk$=t?%_!ZJ)$_>}T2VlH4z5Kbi8M zoeB=v0pSCz-s(fEI|s^sHV4HXWRtaTa}FHxF++!a*1t_k8~u-P!1;b~!J~x7d^q9* zkB5CYl$!(2|7F^xx3jsDpPdey*W+T2lPMiuk|&golN_tJO^3t|hCAg0?IcU5-FDAN zIYZp(15L_VAI{ozob%zd59b(D={RpAb;-YrUKf0zooDHy8|jjiOT^ti(4<`U;j&G~ z6(278aAi0h6+fG+^1ez!Z+_>i=zlgnVtUBbzpXA`6THSC*L_a?+vbMg4Z>a@uKU2_ ziQ#kv%uR_m+0Wjea#yumVs4S?`^o8VNC%Lpgqa0q1=O(=gQd-{ogh(?0qzJSd&{p4J=OK72(g=Ct4%3akK z`I(Mtzf;PaUWtntZiyeXYL=F|?bb-CAztPOP0DgVmfLi!@MEbTD;QHtsMbbWDgTx9 zTIC0=mZjBhq&g{e#B2PZNm=X1TAPk_eysLm-EcbEelqp)t|w7y@6(%pGV8^xCsWK< zXuo4N2yS4Ijee*29n&D#K)A_|jehXB$e-KM`2T2rY-T$Hb|ALMa|`3t+kxN(qS22= zp3vK7tDm=i+x*z-$2R}BX1kvsrkecN?njgVH?zZUFFrf``b&j>Hait(Cr`fiCuhh; z-X&%inL0-1F8q^e7Sn9o`u%#e+mGG0xjl-%*N;7Z>}7K;g8Tev@navG+t22(-!{ho zQB$A;3|;+`GkS$SE4PYiB~xP?tNzIx6m!rv#=lGmm_x#c=utAfaU2$Nm`v$UP8la* zn{XQk?T8;o+(}sSlQ}B(DC5+=#YuQfld#=y{f|pIPX7~rr}iy#Qt%{UhaV^W;IZA0 zW4TF~Tl1$h$xi#7#<$EFxu2nXrysP_ES+`Zo|AHp_`Dx9DP4Ya*-3W6kF$PUV5c?7 zF4{HJGw44vfSI-r6#-}PEi+4TW|5yA z08Jiq0-#mc&Xrr&N;y@M7<@~0<_gZG=ez)D(*wER{P5;CfcYFM_i0>JfNOd|0964j zp!322Q@khu+CmQDe}BaPFMm;g`S`v%fNIA0#4HYAF$?dTC2DU8>va8?^H~~TDr*8* z8bA$0FAMMy|MCEq1+biOMZoz_Q>#j~tkm(NGt171m10(s>HHBZ?0Kycvr6a1mu>K6 z_CK1{Vpfyk+d&3DFm-};47r9m{lKghTuZnvfHeWE3%u$6F~Y~DUP?VyL!gnCXa3O*sd{d3SfHxO>CNfZa{U1)E!iJ2EODUE(EYMfL&~Igi}qm zS!y%Y-2u>Cp_0NL3418)4S;3^GWuEmBd1i0^p*g>=}~B(&_1G7Li>gG6V?65IdDMe zK%j6${f~Ua-x_dAKQsr$9c1)F0nl1mIvjAy*>0PZHsT`z(4-s<;HX`J#{xJUz%hGj zZ<}@->A3ul)9XY4w04$Gx{*4hbP%5kfF|X10H*`+)yM<$MPRdue^Inl=6iXADWwjH(BLY0Jj3UNBp<77Wx8C{fFj` z^gGn=20-g$>7F~K`la*}-w%K$v0zXkZgIcisAshCnSgFiS!hqws~PYm+TIEYC>yCMgEFq6ej4su0)z#f$;{*<8g zpDJZ4{ig+;;tx!@U^(IRAf^SuXaW(td{)02FRyT2V zV(Q3r{NQvl9czTwu=?5{*1G9v|G}&iyN*rPDjoIwW>dPZ7rCCU8-h;l2WF$-M#6?5 zHUzVK|{M+euJP6t`mQJ{lPD(jR+z|v#%Bdhu*+{2@I1$8Y8|e*m#zyLtedxM}!xf#SwJE*sUxE{nUJE(7%+cr|4 z{QKy2CkWbYmhQTd?n${v+#du@%Kaej+Y@*Y#N8ks44**f59Xn~AClk;*4V)T!2woz z6a?)`@byObSTpcR5VXha$vpyF~rYWKRBo7XlYLpGl@*8 z-RSt*lF1?Ft}NtqzGtRLoWgKZL!gzhG|g?dTuM3d^blxLW`r;!q>XN72-8BC$(Y*c zDr}@#@}EVo*&)y>SeoNTs+3YmJU0ZIlzAb{3u&X9AHtjv=JUkuRLQ%Fgx;jj zM^-(cUs{ZR$msvGB+K)-<#!Pm$S)!rDH{ipT=uL)_H5*E31Ll0-)XcqgtZ}lqeJMc5&BZG`ViKIP#@wqI)t!3#BX#6 z+0XSGLjN&>j{HW45H^NPLx`W)9bTD>|39-SgiT`jjSeBRIplQn47R8XTiAuh5E?^f zYY4Q>p+Ed4bel51J>(R>Z<^%ZME4yb(6+O*(>=9aQg#tHhd`6EJA~af<9kBb8N!}i z#`oGtE%I-n*S-*Fds*7=Mmiwn0C8&wG${u|IA}9|D1`kX92(Ae|M%vwybqJ$>-3rN z?(a>Tm^Lzl@2Sg21dlMt(U3Fvo;fCXjIcd~qapCP?e~lymw250Y#Gk@2{9+gw0`fj zalB3npJerp5IWq9w|s9-i9N+8E8l0vPlxz>gEJxP-zlY&{%1o@<@@HG;5owcA)F0? z$1@?E9$tX|Zn~s*vAL%2b6=@)LCgg*&EIQAZ~ zuS&T}+!F##%C!)#*>qeF;YtYC8B+`JhK#oK7%|6Io14|FTsa|10g&J zfyax#r{j^tN9{D%cNCCrRZ4Lj}cn`v^NM)&eCXj5659=4}8L&^-|nPJeRRD@9x z)|NXfjOk&_3cDGfZ6nQ*{~UT%hC!Rn(p)#vJSp>t=Z8U)QWZv3SX=IbFy@A_AUu4% z|K2Q=_d*hS>puVP`g^lT%px+ae4YOLrdqI?K^BLdRz3m{Ttc`sjKyK_I3@gg%dL@E z!+s8p%5AyJ#4ICI{Jm4c@memtoYhx^u_A1*fJ389t=L*N*{h7N4D(^%s<8E6EoC+R z>%va&`(};c8p5?<)P=$0sxVfDb63DWn|0FHvAKa!x&Mo)7gJAWa8zyqu2(uXgq^|n z%|?kE8LlA=+6I<3x$SP2vYB{G7&Ix3VKmxwYz<>m7+V=r3vio_v|aw&>D3elZ5vBF z+(?Gb522DzH7|k{vyTjNK#_r*ClzeaY$a@b7y-J@Ci$|HgV)l~h=R5V^H!XrK z46-lm^uKTR3+^X85XQbRcw9f64nCa?qm?~&9|9c=^S~= zOr&r`z4?!OT}uZ?`k|9*&|B!Y2~w9UhKi^fx&5MfKD5lo1nG@>M_Hxm_U zBGpL|Op2Jv5&p|lSp<_KC?h#VRi;KTC4#B83jba~6{bb_6l|0YP%d0f-{}!dkC+(| z=L0h{f*BFaBw3*Vvm&U7U>56)AeyZTv)T9hQT#kPC*m~!-BgOJr2pIqXmePa7qQ{z zOPNnx6#-4kf(RBww3jc8U|s|ZZO7g=i)^H7`B&3xaRjtQEG=;(EtRsAxF!Oclw}bt zi)b%j9>J0bmPhpQ_)W9IMyi#6ExlGoKwH7mDmT(A0nB3Nr9 zyPB>24v z9JEHkMpoGx!PZFb^W-*?_HKE5glEzeaeDu5cF1uD9d|}RYhr0v#7^F3Db2*YBcMsy z6Tu!kx_cwo6~SIRx_mHdBkhy_K6>qsfY!p&0XI^slvd({5zwR@ir|nvlfw}lh~V(> znKX?uZSrm-(ffCG@QC0MRyi60jpwjE^5*f}L$qU>LhTXIj!HEb?Mn;(q!BY`*L~ttdn>ii9>4+Yp@ePX+oOxZVQ*LJ?=#1bjJ8({oosWQa zZn&{G&#EVX9l_th@zn_tbiJ;8L6t8?a3O+=tb9q8yCa}o`k$5m`p-K)zb)oA2f81cL?zre#q??D;q=4Y5xm2YcbQtMtggn26Xl<-*ugAwrfSeDx~yBYhrJf72INMrmWf+6mCY??3pr}|Rr zORBH5{}o5^irZ#Xi@BZZ=qT0EQU2LM6f{?8r7%{)SPCUk(5yg4KbybfC2XAZanYhb zbqb9a8c%diXoAoLqOR{a2TFxXqlF{7zvG@ZG3pc>GfCVeMxPu7Z6Zr$QKy;hPLVQ& zcxn_hDbu2u7S*0s9z|Icp1lx4)rqo7Gy5yc7{sWyt5C~6f+)3NzGvr^tGNfa9m+A6_S ztgjae&wE%kL#(AKb2AGK3zy_EID8={~|*%-w}JE#p&)JM@^ z2lWlJ$wt~N|IPH;5(RA&OO0-%tx~oUZ;OH^WqTCc?FlqR(HKS3@Co#PXLiVY2MNAR zk{#SBxRX_OMM0~JzJ5m59Oca29R;nKJ^9CdY)=$>*im;M+Z*MCYKdZR6fMzFW}o2x zDE39MKl+ff z107;I$W(u)y^eR4rC<9Q_KpnI};^iH1h}$qXva(ENVZIKjYNVpSnC(sORk2;J40_ zRl0Nxi5Vg@^sPRn|BHDc;)Uz7!n(W^^U}K5D_Q&hF|U-};(Vw7Lo+&`>gas#viYDD zvoto}o<@n365?_Bph+2@kMa51?k418Y(6IByV)(ZktWK2BE2T%gI3DYWH(ZolrrKe z`JhRenvbdZ+U}<1V{$&G<>$7R((g>Uyvs@GRqQ^Vs+lfkI+@-N)#Vw2GZL{Z_b=)#v78ZoXY?UEi8{ zV&}2RQe}63K0m@$Dc2>U=EB2ai?xn4h0pZ2xW+OJB_9I=*$* z*nBJzvxH3Nx4Ff(G@t3H$#*JYmPuU3aLe;St6^z{+itCtTH=-Yph;Pkk5x7utMjoU zAFCNti>=N^S|k58^jez_S{+O4+(`9O>WSCqgC=D|J~r5NY|O{Hd~6&}N6)vWLEa4{ zD(zzH_||L^vx!VO)aA{Bn;B$FzEcjm*-igF`A$8|UctSDE&14! z4<4KIu`8F3++y38kA3-}5&SZ;d@i;F`PiS21Npz1)_l9zTJzn-c2J=XvS;)_F*xJOjS(o9(c0}1dn(wrKXpTue#@@B(gLagqUR`Fzl%bmgPVX7@rq&gSF7 zaCV!&H5cW5kwm*)Z1vxoOJXjOY30{4d}z7_yBXwizSH`lxgvOl@M=CT=Yz*1!`bD( zjpd_UgRX zVqfw(LJSjPD2?eRyPxVrsS~MAih~s)PFl z_p{1@7-$W#*EiX%nz;vKptZ6m|9F#qD27AqsJp2gj&VY@#c()=w%90hMDS<~M`Ab{ z`^_AS;aE&J*&frbrrH^*v;JqKoS}awQ<-PZ3Z5lA7ei+ZJf4o>R4lhF|J9tAexA)Wed7$;4s?m> zBGdd$?z(?Lxw{y1`t!^siI*6zI|kZCmM**PUXgNz_-YI^DLpat*xX%<;c^Vu7*kh< z>o(F2`QM;dZw$2SEZuY?-I8*P_;w65DSa{Y+1%ZU;bshXhI7~UjkzoDyCnD;1Ww1M zZ_GV0_sI0}9Rqo$U$CD+?sL-TnFoRo2p`69KL#Ez#B$etuNjayzobwh==wb7lzPmN;1J=97@o(# z<5O8K6P1kpQXVhq@k-OIIF47`O5+-|a;l@_R7c0T!N$2kj*VkX9Ao3!AWNy1NG+i{ zE)JS26jK;4VLXKianP(lMn4C?=0;ZDvQkEvioxv9VHJ6k!;wf>^ zq)d%tYFr!Lv^XZmG0k?7|KVUGO_%?4dd-M~R?gB)H&TU^3gTID(4@?cV|H8{-JCdP z#xcj9&YPyvMw%=Cx%8SB2d$E&`EH~tDOJP^;-E=c7{@{zX;B>W<5*-PyPD)OQbW8f4w{tZaV)oyR>ZM1junbzZ}7i1weqedQSQ;8trT3zDy!mH z70+#StK(cOb#bTBW7bGtLw#)=v^tj7#qHFnmr_r>J`S3c4RLI+gSs(}b#ZL8gZhSP zu#q;&e-phn$3bggX^R`FQA#86);MTVw#Bi{p1}4vw#2c0_ylUdF-`JrBGKqk2X_eW zV3nP5&{oG^Z*;rjoPo`8&~~vW|G3fZj$=1F>TYy<;@o-m#<3@kz41||MQ~pnEphCN z^IsC;*dNzM7c>Xd)B%R-`r4^ot&fDQVp_>`f9>>eq8$`I$j%&!<51lFfb+FEEcP&a z+-%sRHpM>@xBf?^9HsxUxYKM*yI?!v@i>mf!Q+uQ+Tyw8^)Kdx^b>5ZiaYJboR)Z+;m*WCJH=9`+wNH@XNk|nL6dSmj`KEmU2$~A(Z!hB z=q}hu7v+DEUYFvaU0|u(jdWScW#TJw(4<_A}TU}I{L))k!kwc zX=Xa^2;X7#yK&rg)6w{~xhM7>o9tCO`s4h7bDzUc{|8bY(EnlF={06RaDebp91r8* z@qQfrxpZi_>%KLQ<9HnRbM-%o<4Jt78H~HX@P8V|U>r~5|7D)V@htw0c^|jU+^MsUd5ey_NX|)E)*yDCtL}PPM9$X&|by=@C*O3 z31++`;S3rxPVVFAK0X0j2}=_a_S8zHloC%&fF@;90+SNj0w*UhA%V#WH{)eC(iHhm zq1V&|Xk{!-b0d{YDJPzu08Pq_1ZE_(16~h^yFJ?ZO%CDU&j#rg% z6{{~uU_rtzz>2TULa__kWcf$T_@V^=;-)%b{TEAFO#dYbr~D(cRB$O_O#(|2;ITS^ zMTyr7aGCUFY_9BUXLPl8faPMAlPMowfGd=a+Jsa6ky$BmCBv;sfL6=WYPa1wDRsna z5}-+0o4{I|j&%vFPGB8lY5~^UNbBXlo?aUgpw+Xq(T&s~rGa=;0yHU`6WDCiu_b|x z32YfoN7dJ+QQnOt^t}~6o`%^fW-FP>kJRODg4-Bmd%~&w$TSHy5$;G}djdSJ_&psv zCGKQD`@hQVhr7h=A~W!nGq{(#uW&P~?@nO1n~wgk%pS3O*kq&9u{Xh|Z7rO1^xr3C zAN}_yoW_sL0l@==tqJT;fX9{u_U6)&TYv`>IGE6{e-9;aC^6X_PPhxOErG)cv?cz_ z97*6v;u~``VHe=h1Q+0;M6EfNz_EmBPyD_Bk0)?k%wN!+FeegDFMD)ST{y`ubR^J` zFsBlrok;v)0iIUI&m^4Ik4&fBJL!Hl0ooas&bg;{Udnmmt^{aOE+lZlX8d9T=MuP> z%lIW5sayWt^tzk??Gj5@+(=iYTqW*FfF|Wy0@rNDuP1ONf$PH=ANPGWRY`{9@*UUH*Nx(je@QjtoM^e;*B-ZTl?SeC{o?HNpvGJ&`>37V9N zNlZ*?Kb(}r_#`GJbNgY(S7x%jCzIe;SuhFjaUbnQellDw~&nZ%4FX41bR$&sFw1g(N+Vtsyp2*i(V zvlV$ZrP{A@AKT`LnM0=TE2o~htQ4+fthq_dP1?=0_A4__>^z-;eb;T$;p5t*^mWrnZ#ubw>$}24NEKBc59{760b~xCS_F;t86Y;C$S=l)r_glw9ZCaBmXt@TAKu| zj-_>OqG0?dz09m1dqF9xl9x@c8fe(=&?`J zW`7d70~v#OITsN$E5)4%9!q&l{3HpQl))qh?VvtQ;!zS$?V!G4p4mvx<^P;sLrKt{vGl@?^is-8 z;#Wz~q!g!6oYKZOI)xY9PE)xPDErEcNzr=@3BG`n9ULn-HpK_2DbVgGUw>>Hm*NZ@ zp8{=M>W?4WCZsSSHN4-IrnuitOrbP|iK$U$lHlYNCZ#Yr^_wY6p)BQoY@4E{rZ7~? zm(I94ZIx5SOeNF$rPIcVHcfaMJ5!!QdCGl0^`)6Eb~<}psxN+-q4+aX*1tkZ1^s8G zoYIfYY{A)tb5fX<0*^COn32jYuYWU@(kt0q)0eq_l$a}KE}7;pa~G|7Ddui|%BlR= zR7tF2xCJTD=CicWZFiBBMa0!9(4;I*VKIkfgjtfp!W5P;rZ&2zHd2lJYv{Es1=>=U zmb;NwNLfK#n*vSB$`n@G+^tGsc?zqBbJzBzSuO9?B=luJd_MK1sS{I2ru<`dd5z#2 z23ebO%0D*i1lJMPr?55!9_OWA-^8z%xSsv29!|#wF&oI#eCgCO9UFx=vU)=b4Q@KB zzcib~Zeo-5O2_6DuRB{(*1u6oBmK9gocfQ=Hoxp^ds5hwGJ8|M-!-j+u-p&Ry)6aWA(oD~ zr*>4zQQ~7M(4@4d&~7t+JcT1E9M5I^gpG7k{wL|xkpk@mOQ+mOr=^@GK9d4XN@oh4 zHsfbgIF-WL;f&XQY0k;}90`4e5dTj5OLJb#c`}V3tIJ)2T?}#|)u+@ODN%IW;r+!VY?cq@h86nMOz!nNTA`0wVn^xJH1z{&liM4y;GGJ{TT0p3wM z?xvjHkIg-a_ZY4}1=?Mf?z`()B=2LBR!G-6M7A% zKzq#6Q#aBxDbI+Xr$Cc3l){ir$BPu6a{nAoN6DAwrMzE~=(Xt>aLg+)ugG+NtS%R) z35(ObiA_7*ADc0PV+hBlF**$%@BE&Q5{V^gJ~J9l$2c+L$aFbQ_ipaK!sA(eLK+j& zc0cTNOsUw?G;eo4VLB$J`LS&hTciJEDU<16mUfCiF;fJm5Kc{_EDatfr7?uWSr zI4zB7Y5$-9YRc0nPfs?})9wPCk;e2iW~Bei%uHiu`WsV`whOQ#%>`JVt~ImLn3XoO z)4wmkIcdxh^B2rco65A)&K}KG7v{1H^U|1?HuKY_=2=k{)t&A_l0y{ zlm=}9OV#eFEtayFcu5*GDNEB>n%0(ElSXwKH5@l(e3^~3T>i`HwIU7LGL~xHNGqkR zBwm#UP0H#tR;P8jtV^RdjXI94d%bte8hNiFQO2{sY#NMm~%JZ?>+F_&>})H|i`WOH>+?ql07 zF}ujr4==!GrDJ#6Y5c_Ok+_H9_NGDG%~Ffo?mj8|i1(*KlX4)912!G4X|$x#%9u*W zK^y6i{14IVa2m9OEVa3jjz~E|d^8Q3lw)Zev*~D0qb-g0;dC@P=D56%li=3_F&%Y| zIU(i*nfg!E<&%OZ8Kfia)PG`537#T6okm9*JT?!fgMVF{#u@h5{n*x-=6%K4G&<8b zOaF6ej`aC7XyW2Qped~Z>M_2 z^pYvFx#Y*To66-a&ihZyZHc!Tt}hMREtc-M?cSAgm-t>9G%5XQ^xItC=Z=-eea2KS zAJ|9_<^Pag18LA6u=L1{^jOMc;wNd)qztApXmj~AjYnxb9nNK?W1h+T8HsM2%TmWY z7xSD<=O^m&kl+x5yhuBppO}||F9~0z@gfZ#Zw}|uYl<@zi!=NS-!GhPb~Hwd8BM1D z3umC2PZNa4WVjb+Fg9a1)4nfEiP(}1KPf65<1*HDyvXr%ose+`KQX0(rGyhRn2-UF z<79u>M<-=4DWg|!PR`i(29{+oIfJsyZ)Qry>0$Fz6=W)dOv_+e#*}A3o09p%PB=Zo zbj`>(rJtIaa-T`}iVSEoSeoT_Znl)!#B(yBNvX`BGNYYvZU(b5n9Gw^y5`wP^W{IE zUR4>;=CQQEjkHk8LgGak(4o9zO?)kzj z6|pPJ=@%L!Lxuq*=}r)P3Ip~uuptYtr2zsRkgm10(sX(Pk& zS|z-S)mLY*+D%vM7p6{Z9h*!yfajHKx>jl>nZpffM10L6A zuqKx?=U>f6=^NQx^B2xlJ6{^aG>~ceLf1yFo=r-}=8RMSso5fN3&S;LK-`C^lRaxs`f9QHjvfme3 z(--Ef5^^qsvl*PD=lKl(2&yZC^BHszUSI_Ge{JPO( z%2nc?3}{lWWpK^r?Ro}RGPs`0+YKA3SN^^9x|sp(21~cxNVlcjChp6CCgn~BcWmD7 zW^gNmyTf^_{leUn_dOE)E}je4r(aAznf6cB<@;6uWJ3?5{_zVP{qyi&pFPXq8Do56o@el! zh4;;nnjBIcyAt@9OFEe<-Gz|0VwK{&Gj(+j}kG?_aSo&J%gLJk#lm{q_avkNe*0JGWh2&Z?X znImxy#ma&&xgi&zvH)}0;0ULCq?spi9>w_upt*eKNK+-giu{5C&@4|zKifxg>sTm# zVL{QKdW9AVEh4%lR4r6Z)Hjm(Uo5n^pm0S0NC##~fzuc;OT{f^^qKg%W(AENMD!^77 zi2s0V18tZ8c6v1xfVPdL9X8NT2|EdQ6@Vt8xd6>J(Cz~4D8Oz7viI~O%^rF0A<-Dn zfbA9B%PK7eXer1&)!SFVHL$deDu?q0IM0r{n@LvzC)0%j zbQR!2!6GBd-35B8=QEep)MbWh80j3fEAfh$D`Xl+I!zDr4BD3a#PpG=ADO#^-%--;a;kXEJ&E@iuD<}ZyDZ(e%|4Lufbd}fXc7hrFko}` zr~vm1@Q5LG1%GSUxj9>ejQ*%D{7?edXM$y!}I=7^a?redU1Inq=LRD6qfbfmM+w!B!(VlrjJb7)B+ z$8u?*Gw3xn5^ET4Ss`dkSz2zJT_IrwVQnF35>^&sr5*ECg;-vQRSc;)wAu!$lYbq( z))a!anx(Zi&^ih02+QI1D8$-AY_KEE5#ZTwl=nswe6Kv2(vhY?OaqyI zerJK#Y!ckWAe#%Fey`agxP`E>5St6ZHo9%6znxM|h0dQf zrFIm8+zv`R3$fFl-mXHY+-I5nyHl#~b8}qmakf+I5x;>!3ol*}Aoqy7l8Yl$00ZNYw@yMRuV{REf^F)!K zkRL1rO&(7RL3^A#?`O8=GxE<1@!X!zkgfSbHD8c_SqPduUKN5iWKZ;gbuBKUQ*jY@ zDSczW=pr>aM%TaCQ-B66O?P zPLZw*l|`s1LM20LO3k%_=E;8^z2+BzHkYL;8)$)q1%wNWK$Ebj2#bnzp{OoGRS~Lr z!tUMG=Vr0I7n9J7+I>6;vqa1iGW|Yvc&Xr02B|4>`h8}Z;4;GHMW`tPkL5*w*riq! zIayO%gcU`orQ1sS+bOlG$oXeYsntawx0+I25$f#ettoQK{bsEquO+{(2sC-r7lF1W zci!u5&GqCr6k&rspN+O=gK9RA-&6#eJT@1Bw$YyGO6$5sPFqNn`}ts^(N^3lZY$ll z6``>RJgzFrUHJG-jS{!B?V8V>RW`9rVw%X*e(uzLZgvRnVC|hn*y&EGn$OKHvAfs~ z-+RtK?kbY!ZgIQmxu?jf^_#tddkI^Lu%`$-Hp_BT>MgTR`aZT(^|{k&Ti!2bKbh*` zDRn?osH`LBG6h{I&7P5lh8(ZqzE(#M~iUOj`^`794^8!hSZd5w}Fn! z|2Vx)6oJ;x(n%YrLqZ4PsUpxMoG!v?JFaJnaIy$z>_~G0@oYQg-ASU6?~C^FB+OYc zXUWv_HQj!5PVgLqoG)_f{iaK>i||4b&KH5l1Am-S7dfv-m`g>tScFUT>t+Qzr!E&c z|Dri{r3mD%P`X-#tM>eQSjTU!DfBh+*NZ@t$BiP;dU7Y;YistBzgdKv_JnTPnzvQ+ zHu=6H(ByHa2((-FOuMb?T{+z)(XN-F-?J6_#r4zuei7~!fyc|kb1L6FkobUY7jv7k znSChcA(@iTozl9@QXOJ0Lr{8a83eF^~ z$YMqoJih$noSKz&diZ=Gi&BM> zWU(}h8agk_GS$nope^Hw{`W^je;R&7v?9x-)n>6Gi&|D&ndRf3RavaeVin=)EFb^W zsRMNk(*K#Wq+XY(HDcC~8TbsVZJ*bQS<622CBq!x{?E)hG3&?-2AtxcsTZtg$o0%? zz-$oQK)5lB^;vApx{rVKZj**A8eX5(CY{yhEH-7anciD;R*hNEw*1etqP8`Qt*td~jx1P*) zM@ck)#`~XRLdWRe@|jcrnQ0enXGe}_aXf2IWch}VlUba|;v~rq4brJBI8DlUbhhYEZMOay!83I2%%U@E&Sv?lrE^)F&Eg!%^QzyK#rZ6{SY-s!1y#7f_S-+> zbE}J4r#@~jiMvGq?ks2*S-MQ&Gjm146~e1o&?NL^(PKA=Ygt^*;+pN&+vd6rbVL3( z=+&DA?K(?0ZJ=8cZV}$jf+nFai#|JB?__Z^i#yDhUbJ-A2D&Hzd-Uqhf_C@+C+^MT zq$rX<(5mX{W}pxT5D!F+R8&NcxeuU^8V;FV1Qu}JLuE%9l@S?WhE;c0UBKPXlF=`W_yxsZn-eZZ zTxw32B%|M&)6dQ6H)h212Zs2asecDx6<$-o%L-h)j4FMD)Hi7FTlM4N&>#Mn`UjgT zE4Va(O9N0^iJK;XiGd6m7;L6~oNj)cE(URNP!PGbK^h!P{zje!3<<&xLxbl2bn!gn zp9g+ekZ=vf-EcYbM=)XpiZ28S7b8XnX=IRH_oyHZ57MZh<+?{pMq`+M45-Ei3D;=c zjgySVGh#f76M}?`5fg(nG03iaQjo?4X;RR(1E$errk)G{-m8IlQ@A(cK`}oF@4g^N^MkYiz=ho2q984T?E8naXIvblg+W>z#J8SF z=w1n3B5N#RC@L&vo=edo)7k3FxU>u<2nEl|rR69=CPl2^(h8L31o3FhJxVK~*SsL6 zEd0alG_jgtt0BsoAmLhtyR|_Ud>td!p}0OsxEQe^NE>8tZ4A=dAZ?Vrl`J+%Mw^*_ zGpM!%3D+jvZIz6+F=88vF9it~Ben-=yX>u(gS0hBFLQ6fE^s!G=oO}a1yrvF3D*wX z?UammF=7{ruLTJgBVG^E>yptMLE0IlH=J&V{JWWYHvqHKnCqKdd=pjP3esD_J~nuKOK^yaUL2tU1layIg!1Jl+e^dqL^C&omc%8M+q@ z;gw(s@4g+|Efkyy5#PvSo(r2i5 zw7I#bxj4$jqY&uxAbk#>$>ZV6Abk;}F9AHpL+5yqjs@ws>|<=ga)qxjkWR?@Uvu$m zke&$AiJumhJ~e{D9)QAmL&J;)L^Z==~U^vqAb%iglg1AQ}C{^gn^>VvulMz}?T1 z(Jzen1;t;3go_cEf^X888eQY zB=9tdT&xgH577(&XNL0do>quvhG>?oktFbRh|+8zUknj03x1uLgQtx&F_+oR1#(`9 zaLvKpd@1|_Ml3*aVTf=sVo`_|Nuw+d(fklCmex%cOC+PEOurOV%R+=}3GS9lMk^Sx z0>zaf!o`SHAzCFFtq#%h5UsYmX^mvGmg(1mYF&tMt-;-T$!G&3HlVmMM7S8SDMXtj zqs<{&AEM1pH^EL@n0gBUXYj^(n%K(4t*EjsMB75i$E2%yiH)~CWR6Z3FEjpS;CF-w z*LK{!5@N6MDkEM+ac78dF#=mSyF$D`z80caLiAe5S|DGSjNV}SH$b&JM7UnZ-J6op zTa0)M#kWI*ixGQ5v`32nPKe$N(L0X#?ADn2T>$vS>U8lQ7vDpby&=LiCPXiVlK0vR zLvDvXn%+o zND`lNYoCJE=;r1H>2wb;g632Nwe-)zRA^OT5 z&tJ>Z*C08;dVdq56CwJB`v7tC8B=`A9KH?ZXcwDVfRhY33BaXhh?`Gw=~M{c^wHd` zB2IJZbf}p+kiGPGT>1{B!Th}UJ(s>mX(;2)aOn){;Yn2!XSsA1rQwYGflEK2G=d%J zxsZ7@Rh(zoc}V$Vh;W_5-Gz_|4S!<9Pbgjt5iUmj9HO7)fchmw7ee$4D+A~Mt7LSE z=`Vrmw-Dj_6?eZ&Mwc0J8O6R~!o`SwVd@uV|JOfEzlW%QnEhX}7!YQO2I72#28Qu$ z9wuA^a5p&25)EO*5EO@o2^S-t57YCK(XcQL4%0BnC`k;LjQF61Mu6&tFyR`GyOEO7 zC`ODzaden)F=9-Z#z;nE!!$BXW0?^4+h z!sgI4F`4m`fu9m4T$6A&6=zM&#WY4tLvebTa4}*=m}Z1|hRzJr)G*BqTQhW)WHg)U zXM^g+FyWeoyE&54Tt>`AabB2kF=Bq0=1cJxglSHg7C7Rg*@aBK5P+fhhKDqMF* zWpS8rO$KJM3#mL*AfWgo}SCXv8&um>vS2keUGW% z1AxDq7JL28#9oH%1!NPxO}B}7pNsE<$p>L`Qxowa7e7RCUzk1!6aL>GPTp^O-H*cb zQMB(q=Fa*gOdp5o6VUJHF8?%4xb{O4*}uuLuX-hMfH@xkYFRV$C27cm3^@qMDwwvJ zIK;(6V0Ac5hpjGL)=V5>=n;r}hQILfvoKR0W!O|(sB?l#C&EpY(d7^VvV{>1e!hUup;T|^ar0{fXO z{EYS&HG>!a1vv&O;#Y?K3i?Z7!u1R8euEQeCVpqc?VMj2;pMH=m?FLjK)Ohg$Rw2jPToplF>M(9|x-O5yCYV zcM~L|iHw+t;-m=SVgwSpCQC+BA~YdFQ@YeBUxLb%r8ZoOo* zfe{-}+!!HTjMx;RO_I^(2(6FMX1iCmNJd+kek-W9MF`gx+`S|jZD+)G6km=IE=KH# z&<@Gyl?c5Qp;w$RU+V(v&4Z!rE1;CDv| z*Xy`@Gs4c{Ek?YB;@c6z#fUu-+9QYgI}v&_Lhs07j`SwU=sl)?4^(?2gzH`0y)PMk zz=#h}{4hee7_l!x`=t0EMdYw|&qXi;&PV86gwCV*V}yQ`2ETxe>!#u-mggtHFGdI# zQ~VquTo+_doRg%#Fwrjn>}_h+5x;WjSE#VAsd+>$JC_)82@s@~SPK0XF}F1pzcc)I zu)G|h%MlqutZORz;ynfGYhp({1qSJdS74fo{tWAH;xXJb7o~`STpWnvAd?1|g#Uj- zHmPZ^Kckz9!Avk11Vc<3f|sMrJUB{|hMM%eY0ddzvNQ}N!%Z}Umm`LoG{S^ChEG9+ z{{nM(!OYR7vy%Z}Bm+hQFdHcfVicD~nN5{>O%dUb=F(^rzq-kNIEG7OP+HOyrX9z+Xkt8<#-p^7aTB;S0i{(0-nuxn8rU?zF zGGZ!<(@es}i0LLxH+gNDVbT9 zc_z&>d2N|*(u*d|M_+J+zd$lt$n*NixIm`+AYO@)1=o- zdeadfBl|6;ehYy8DJ-{E2Uu1UDwfgo-d_MS=aK~Bqs?KR;T z-ZyElN$;C�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 diff --git a/bindings/odin/clay-odin/windows/clay.lib b/bindings/odin/clay-odin/windows/clay.lib index ee327c9e68c9241e5f3163451a56649424dfd2b5..9f8a31df67c9f1922b3f740887fc89db8de5fb3f 100644 GIT binary patch literal 151229 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

4lNN6=g_4(C}mUVgEYG#4}? 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 no7KVJr clay.Color { LOREM_IPSUM_TEXT := "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." HighPerformancePage :: proc(lerpValue: f32, titleTextConfig: clay.TextElementConfig, widthSizing: clay.SizingAxis) { - if clay.Container(clay.ID("PerformanceLeftText"), clay.Layout({sizing = {width = widthSizing}, layoutDirection = .TOP_TO_BOTTOM, childGap = 8})) { - clay.Text(clay.ID("PerformanceTextTitle"), "High Performance", clay.TextConfig(titleTextConfig)) - if clay.Container(clay.ID("SyntaxSpacer"), clay.Layout({sizing = {width = clay.SizingGrow({max = 16})}})) {} + if clay.UI(clay.ID("PerformanceLeftText"), clay.Layout({sizing = {width = widthSizing}, layoutDirection = .TOP_TO_BOTTOM, childGap = 8})) { + clay.Text("High Performance", clay.TextConfig(titleTextConfig)) + if clay.UI(clay.ID("SyntaxSpacer"), clay.Layout({sizing = {width = clay.SizingGrow({max = 16})}})) {} clay.Text( - clay.ID("PerformanceTextSubTitle", 1), "Fast enough to recompute your entire UI every frame.", clay.TextConfig({fontSize = 28, fontId = FONT_ID_BODY_36, textColor = COLOR_LIGHT}), ) clay.Text( - clay.ID("PerformanceTextSubTitle", 2), "Small memory footprint (3.5mb default) with static allocation & reuse. No malloc / free.", clay.TextConfig({fontSize = 28, fontId = FONT_ID_BODY_36, textColor = COLOR_LIGHT}), ) clay.Text( - clay.ID("PerformanceTextSubTitle", 3), "Simplify animations and reactive UI design by avoiding the standard performance hacks.", clay.TextConfig({fontSize = 28, fontId = FONT_ID_BODY_36, textColor = COLOR_LIGHT}), ) } - if clay.Container(clay.ID("PerformanceRightImageOuter"), clay.Layout({sizing = {width = widthSizing}, childAlignment = {x = .CENTER}})) { - if clay.Border( + if clay.UI(clay.ID("PerformanceRightImageOuter"), clay.Layout({sizing = {width = widthSizing}, childAlignment = {x = .CENTER}})) { + if clay.UI( clay.ID("PerformanceRightBorder"), clay.Layout({sizing = {clay.SizingGrow({}), clay.SizingFixed(400)}}), - clay.BorderConfigAll({width = 2, color = COLOR_LIGHT}), + clay.BorderAll({width = 2, color = COLOR_LIGHT}), ) { - if clay.Rectangle( + if clay.UI( clay.ID("AnimationDemoContainerLeft"), clay.Layout({sizing = {clay.SizingPercent(0.35 + 0.3 * lerpValue), clay.SizingGrow({})}, childAlignment = {y = .CENTER}, padding = {16, 16}}), - clay.RectangleConfig({color = ColorLerp(COLOR_RED, COLOR_ORANGE, lerpValue)}), + clay.Rectangle({color = ColorLerp(COLOR_RED, COLOR_ORANGE, lerpValue)}), ) { - clay.Text(clay.ID("AnimationDemoTextLeft"), LOREM_IPSUM_TEXT, clay.TextConfig({fontSize = 16, fontId = FONT_ID_BODY_16, textColor = COLOR_LIGHT})) + clay.Text(LOREM_IPSUM_TEXT, clay.TextConfig({fontSize = 16, fontId = FONT_ID_BODY_16, textColor = COLOR_LIGHT})) } - if clay.Rectangle( + if clay.UI( clay.ID("AnimationDemoContainerRight"), clay.Layout({sizing = {clay.SizingGrow({}), clay.SizingGrow({})}, childAlignment = {y = .CENTER}, padding = {16, 16}}), - clay.RectangleConfig({color = ColorLerp(COLOR_ORANGE, COLOR_RED, lerpValue)}), + clay.Rectangle({color = ColorLerp(COLOR_ORANGE, COLOR_RED, lerpValue)}), ) { - clay.Text(clay.ID("AnimationDemoTextRight"), LOREM_IPSUM_TEXT, clay.TextConfig({fontSize = 16, fontId = FONT_ID_BODY_16, textColor = COLOR_LIGHT})) + clay.Text(LOREM_IPSUM_TEXT, clay.TextConfig({fontSize = 16, fontId = FONT_ID_BODY_16, textColor = COLOR_LIGHT})) } } } } HighPerformancePageDesktop :: proc(lerpValue: f32) { - if clay.Rectangle( + if clay.UI( clay.ID("PerformanceDesktop"), clay.Layout( {sizing = {clay.SizingGrow({}), clay.SizingFit({min = cast(f32)windowHeight - 50})}, childAlignment = {y = .CENTER}, padding = {x = 82, y = 32}, childGap = 64}, ), - clay.RectangleConfig({color = COLOR_RED}), + clay.Rectangle({color = COLOR_RED}), ) { HighPerformancePage(lerpValue, {fontSize = 52, fontId = FONT_ID_TITLE_52, textColor = COLOR_LIGHT}, clay.SizingPercent(0.5)) } } HighPerformancePageMobile :: proc(lerpValue: f32) { - if clay.Rectangle( + if clay.UI( clay.ID("PerformanceMobile"), clay.Layout( { @@ -327,73 +317,69 @@ HighPerformancePageMobile :: proc(lerpValue: f32) { childGap = 32, }, ), - clay.RectangleConfig({color = COLOR_RED}), + clay.Rectangle({color = COLOR_RED}), ) { HighPerformancePage(lerpValue, {fontSize = 48, fontId = FONT_ID_TITLE_48, textColor = COLOR_LIGHT}, clay.SizingGrow({})) } } -RendererButtonActive :: proc(id: clay.ElementId, index: i32, text: string) { - if clay.Rectangle( - id, +RendererButtonActive :: proc(index: i32, text: string) { + if clay.UI( clay.Layout({sizing = {width = clay.SizingFixed(300)}, padding = {16, 16}}), - clay.RectangleConfig({color = clay.PointerOver(id) ? COLOR_RED_HOVER : COLOR_RED, cornerRadius = clay.CornerRadiusAll(10)}), + clay.Rectangle({color = COLOR_RED, cornerRadius = clay.CornerRadiusAll(10)}), ) { - clay.Text(clay.ID("RendererButtonActiveText"), text, clay.TextConfig({fontSize = 28, fontId = FONT_ID_BODY_28, textColor = COLOR_LIGHT})) + clay.Text(text, clay.TextConfig({fontSize = 28, fontId = FONT_ID_BODY_28, textColor = COLOR_LIGHT})) } } -RendererButtonInactive :: proc(id: clay.ElementId, index: u32, text: string) { - if clay.Border(id, clay.Layout({}), clay.BorderConfigOutsideRadius({2, COLOR_RED}, 10)) { - if clay.Rectangle( +RendererButtonInactive :: proc(index: u32, text: string) { + if clay.UI(clay.Layout({}), clay.BorderOutsideRadius({2, COLOR_RED}, 10)) { + if clay.UI( clay.ID("RendererButtonInactiveInner", index), clay.Layout({sizing = {width = clay.SizingFixed(300)}, padding = {16, 16}}), - clay.RectangleConfig({color = clay.PointerOver(id) ? COLOR_LIGHT_HOVER : COLOR_LIGHT, cornerRadius = clay.CornerRadiusAll(10)}), + clay.Rectangle({color = COLOR_LIGHT, cornerRadius = clay.CornerRadiusAll(10)}), ) { - clay.Text(clay.ID("RendererButtonInactiveText", index), text, clay.TextConfig({fontSize = 28, fontId = FONT_ID_BODY_28, textColor = COLOR_RED})) + clay.Text(text, clay.TextConfig({fontSize = 28, fontId = FONT_ID_BODY_28, textColor = COLOR_RED})) } } } RendererPage :: proc(titleTextConfig: clay.TextElementConfig, widthSizing: clay.SizingAxis) { - if clay.Container(clay.ID("RendererLeftText"), clay.Layout({sizing = {width = widthSizing}, layoutDirection = .TOP_TO_BOTTOM, childGap = 8})) { - clay.Text(clay.ID("RendererTextTitle"), "Renderer & Platform Agnostic", clay.TextConfig(titleTextConfig)) - if clay.Container(clay.ID("Spacer"), clay.Layout({sizing = {width = clay.SizingGrow({max = 16})}})) {} + if clay.UI(clay.ID("RendererLeftText"), clay.Layout({sizing = {width = widthSizing}, layoutDirection = .TOP_TO_BOTTOM, childGap = 8})) { + clay.Text("Renderer & Platform Agnostic", clay.TextConfig(titleTextConfig)) + if clay.UI(clay.ID("Spacer"), clay.Layout({sizing = {width = clay.SizingGrow({max = 16})}})) {} clay.Text( - clay.ID("RendererTextSubTitle", 1), "Clay outputs a sorted array of primitive render commands, such as RECTANGLE, TEXT or IMAGE.", clay.TextConfig({fontSize = 28, fontId = FONT_ID_BODY_36, textColor = COLOR_RED}), ) clay.Text( - clay.ID("RendererTextSubTitle", 2), "Write your own renderer in a few hundred lines of code, or use the provided examples for Raylib, WebGL canvas and more.", clay.TextConfig({fontSize = 28, fontId = FONT_ID_BODY_36, textColor = COLOR_RED}), ) clay.Text( - clay.ID("RendererTextSubTitle", 3), "There's even an HTML renderer - you're looking at it right now!", clay.TextConfig({fontSize = 28, fontId = FONT_ID_BODY_36, textColor = COLOR_RED}), ) } - if clay.Container( + if clay.UI( clay.ID("RendererRightText"), clay.Layout({sizing = {width = widthSizing}, childAlignment = {x = .CENTER}, layoutDirection = .TOP_TO_BOTTOM, childGap = 16}), ) { - clay.Text(clay.ID("RendererTextRightTitle"), "Try changing renderer!", clay.TextConfig({fontSize = 36, fontId = FONT_ID_BODY_36, textColor = COLOR_ORANGE})) - if clay.Container(clay.ID("Spacer"), clay.Layout({sizing = {width = clay.SizingGrow({max = 32})}})) {} - RendererButtonActive(clay.ID("RendererSelectButtonActive", 0), 0, "Raylib Renderer") + clay.Text("Try changing renderer!", clay.TextConfig({fontSize = 36, fontId = FONT_ID_BODY_36, textColor = COLOR_ORANGE})) + if clay.UI(clay.ID("Spacer"), clay.Layout({sizing = {width = clay.SizingGrow({max = 32})}})) {} + RendererButtonActive(0, "Raylib Renderer") } } RendererPageDesktop :: proc() { - if clay.Container( + if clay.UI( clay.ID("RendererPageDesktop"), clay.Layout({sizing = {clay.SizingGrow({}), clay.SizingFit({min = cast(f32)windowHeight - 50})}, childAlignment = {y = .CENTER}, padding = {x = 50}}), ) { - if clay.Border( + if clay.UI( clay.ID("RendererPage"), clay.Layout({sizing = {clay.SizingGrow({}), clay.SizingGrow({})}, childAlignment = {y = .CENTER}, padding = {32, 32}, childGap = 32}), - clay.BorderConfig({left = {2, COLOR_RED}, right = {2, COLOR_RED}}), + clay.Border({left = {2, COLOR_RED}, right = {2, COLOR_RED}}), ) { RendererPage({fontSize = 52, fontId = FONT_ID_TITLE_52, textColor = COLOR_RED}, clay.SizingPercent(0.5)) } @@ -401,7 +387,7 @@ RendererPageDesktop :: proc() { } RendererPageMobile :: proc() { - if clay.Rectangle( + if clay.UI( clay.ID("RendererMobile"), clay.Layout( { @@ -412,7 +398,7 @@ RendererPageMobile :: proc() { childGap = 32, }, ), - clay.RectangleConfig({color = COLOR_LIGHT}), + clay.Rectangle({color = COLOR_LIGHT}), ) { RendererPage({fontSize = 48, fontId = FONT_ID_TITLE_48, textColor = COLOR_RED}, clay.SizingGrow({})) } @@ -430,67 +416,59 @@ animationLerpValue: f32 = -1.0 createLayout :: proc(lerpValue: f32) -> clay.ClayArray(clay.RenderCommand) { mobileScreen := windowWidth < 750 clay.BeginLayout() - if clay.Rectangle( + if clay.UI( clay.ID("OuterContainer"), clay.Layout({layoutDirection = .TOP_TO_BOTTOM, sizing = {clay.SizingGrow({}), clay.SizingGrow({})}}), - clay.RectangleConfig({color = COLOR_LIGHT}), + clay.Rectangle({color = COLOR_LIGHT}), ) { - if clay.Container( + if clay.UI( clay.ID("Header"), clay.Layout({sizing = {clay.SizingGrow({}), clay.SizingFixed(50)}, childAlignment = {y = .CENTER}, childGap = 24, padding = {x = 32}}), ) { - clay.Text(clay.ID("Logo"), "Clay", &headerTextConfig) - if clay.Container(clay.ID("Spacer"), clay.Layout({sizing = {width = clay.SizingGrow({})}})) {} + clay.Text("Clay", &headerTextConfig) + if clay.UI(clay.ID("Spacer"), clay.Layout({sizing = {width = clay.SizingGrow({})}})) {} if (!mobileScreen) { - if clay.Rectangle(clay.ID("LinkExamplesOuter"), clay.Layout({}), clay.RectangleConfig({color = {0, 0, 0, 0}})) { - clay.Text(clay.ID("LinkExamplesText"), "Examples", clay.TextConfig({fontId = FONT_ID_BODY_24, fontSize = 24, textColor = {61, 26, 5, 255}})) + if clay.UI(clay.ID("LinkExamplesOuter"), clay.Layout({}), clay.Rectangle({color = {0, 0, 0, 0}})) { + clay.Text("Examples", clay.TextConfig({fontId = FONT_ID_BODY_24, fontSize = 24, textColor = {61, 26, 5, 255}})) } - if clay.Rectangle(clay.ID("LinkDocsOuter"), clay.Layout({}), clay.RectangleConfig({color = {0, 0, 0, 0}})) { - clay.Text(clay.ID("LinkDocsText"), "Docs", clay.TextConfig({fontId = FONT_ID_BODY_24, fontSize = 24, textColor = {61, 26, 5, 255}})) + if clay.UI(clay.ID("LinkDocsOuter"), clay.Layout({}), clay.Rectangle({color = {0, 0, 0, 0}})) { + clay.Text("Docs", clay.TextConfig({fontId = FONT_ID_BODY_24, fontSize = 24, textColor = {61, 26, 5, 255}})) } } - githubButtonId: clay.ElementId = clay.ID("HeaderButtonGithub") - if clay.Border(clay.ID("LinkGithubOuter"), clay.Layout({}), clay.BorderConfigOutsideRadius({2, COLOR_RED}, 10)) { - if clay.Rectangle( - githubButtonId, - clay.Layout({padding = {16, 6}}), - clay.RectangleConfig({cornerRadius = clay.CornerRadiusAll(10), color = clay.PointerOver(githubButtonId) ? COLOR_LIGHT_HOVER : COLOR_LIGHT}), - ) { - clay.Text(clay.ID("LinkGithubText"), "Github", clay.TextConfig({fontId = FONT_ID_BODY_24, fontSize = 24, textColor = {61, 26, 5, 255}})) - } + if clay.UI( + clay.ID("LinkGithubOuter"), + clay.Layout({padding = {16, 6}}), + clay.BorderOutsideRadius({2, COLOR_RED}, 10), + clay.Rectangle({cornerRadius = clay.CornerRadiusAll(10), color = clay.PointerOver(clay.GetElementId(clay.MakeString("LinkGithubOuter"))) ? COLOR_LIGHT_HOVER : COLOR_LIGHT}) + ) { + clay.Text("Github", clay.TextConfig({fontId = FONT_ID_BODY_24, fontSize = 24, textColor = {61, 26, 5, 255}})) } } - if clay.Rectangle(clay.ID("TopBorder1"), clay.Layout({sizing = {clay.SizingGrow({}), clay.SizingFixed(4)}}), clay.RectangleConfig({color = COLOR_TOP_BORDER_5})) {} - if clay.Rectangle(clay.ID("TopBorder2"), clay.Layout({sizing = {clay.SizingGrow({}), clay.SizingFixed(4)}}), clay.RectangleConfig({color = COLOR_TOP_BORDER_4})) {} - if clay.Rectangle(clay.ID("TopBorder3"), clay.Layout({sizing = {clay.SizingGrow({}), clay.SizingFixed(4)}}), clay.RectangleConfig({color = COLOR_TOP_BORDER_3})) {} - if clay.Rectangle(clay.ID("TopBorder4"), clay.Layout({sizing = {clay.SizingGrow({}), clay.SizingFixed(4)}}), clay.RectangleConfig({color = COLOR_TOP_BORDER_2})) {} - if clay.Rectangle(clay.ID("TopBorder5"), clay.Layout({sizing = {clay.SizingGrow({}), clay.SizingFixed(4)}}), clay.RectangleConfig({color = COLOR_TOP_BORDER_1})) {} - if clay.Rectangle( + if clay.UI(clay.ID("TopBorder1"), clay.Layout({sizing = {clay.SizingGrow({}), clay.SizingFixed(4)}}), clay.Rectangle({color = COLOR_TOP_BORDER_5})) {} + if clay.UI(clay.ID("TopBorder2"), clay.Layout({sizing = {clay.SizingGrow({}), clay.SizingFixed(4)}}), clay.Rectangle({color = COLOR_TOP_BORDER_4})) {} + if clay.UI(clay.ID("TopBorder3"), clay.Layout({sizing = {clay.SizingGrow({}), clay.SizingFixed(4)}}), clay.Rectangle({color = COLOR_TOP_BORDER_3})) {} + if clay.UI(clay.ID("TopBorder4"), clay.Layout({sizing = {clay.SizingGrow({}), clay.SizingFixed(4)}}), clay.Rectangle({color = COLOR_TOP_BORDER_2})) {} + if clay.UI(clay.ID("TopBorder5"), clay.Layout({sizing = {clay.SizingGrow({}), clay.SizingFixed(4)}}), clay.Rectangle({color = COLOR_TOP_BORDER_1})) {} + if clay.UI( clay.ID("ScrollContainerBackgroundRectangle"), - clay.Layout({sizing = {clay.SizingGrow({}), clay.SizingGrow({})}}), - clay.RectangleConfig({color = COLOR_LIGHT}), + clay.Scroll({vertical = true}), + clay.Layout({sizing = {clay.SizingGrow({}), clay.SizingGrow({})}, layoutDirection = clay.LayoutDirection.TOP_TO_BOTTOM}), + clay.Rectangle({color = COLOR_LIGHT}), + clay.Border({betweenChildren = {2, COLOR_RED}}) ) { - if clay.Scroll(clay.ID("OuterScrollContainer"), clay.Layout({sizing = {clay.SizingGrow({}), clay.SizingGrow({})}}), clay.ScrollConfig({vertical = true})) { - if clay.Border( - clay.ID("ScrollContainerInner"), - clay.Layout({layoutDirection = .TOP_TO_BOTTOM, sizing = {width = clay.SizingGrow({})}}), - clay.BorderConfig({betweenChildren = {2, COLOR_RED}}), - ) { - if (!mobileScreen) { - LandingPageDesktop() - FeatureBlocksDesktop() - DeclarativeSyntaxPageDesktop() - HighPerformancePageDesktop(lerpValue) - RendererPageDesktop() - } else { - LandingPageMobile() - FeatureBlocksMobile() - DeclarativeSyntaxPageMobile() - HighPerformancePageMobile(lerpValue) - RendererPageMobile() - } - } + if (!mobileScreen) { + LandingPageDesktop() + FeatureBlocksDesktop() + DeclarativeSyntaxPageDesktop() + HighPerformancePageDesktop(lerpValue) + RendererPageDesktop() + } else { + LandingPageMobile() + FeatureBlocksMobile() + DeclarativeSyntaxPageMobile() + HighPerformancePageMobile(lerpValue) + RendererPageMobile() } } } diff --git a/clay.h b/clay.h index 9ee2947..67c1e85 100644 --- a/clay.h +++ b/clay.h @@ -30,47 +30,59 @@ // Public Macro API ------------------------ -#define CLAY_LAYOUT(...) Clay__StoreLayoutConfig(CLAY__INIT(Clay_LayoutConfig) {__VA_ARGS__ }) +#ifdef __cplusplus +#define CLAY__CONFIG_WRAPPER(type, ...) __VA_ARGS__ +#else +#define CLAY__CONFIG_WRAPPER(type, ...) (type) __VA_ARGS__ +#endif -#define CLAY_RECTANGLE_CONFIG(...) Clay__StoreRectangleElementConfig(CLAY__INIT(Clay_RectangleElementConfig) {__VA_ARGS__ }) +#define CLAY_LAYOUT(...) Clay__AttachLayoutConfig(Clay__StoreLayoutConfig(CLAY__CONFIG_WRAPPER(Clay_LayoutConfig, __VA_ARGS__))) -#define CLAY_TEXT_CONFIG(...) Clay__StoreTextElementConfig(CLAY__INIT(Clay_TextElementConfig) {__VA_ARGS__ }) +#define CLAY_RECTANGLE(...) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .rectangleElementConfig = Clay__StoreRectangleElementConfig(CLAY__INIT(Clay_RectangleElementConfig) __VA_ARGS__) }, CLAY__ELEMENT_CONFIG_TYPE_RECTANGLE)) -#define CLAY_IMAGE_CONFIG(...) Clay__StoreImageElementConfig(CLAY__INIT(Clay_ImageElementConfig) {__VA_ARGS__ }) +#define CLAY_TEXT_CONFIG(...) Clay__StoreTextElementConfig(CLAY__CONFIG_WRAPPER(Clay_TextElementConfig, __VA_ARGS__)) -#define CLAY_FLOATING_CONFIG(...) Clay__StoreFloatingElementConfig(CLAY__INIT(Clay_FloatingElementConfig) {__VA_ARGS__ }) +#define CLAY_IMAGE(...) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .imageElementConfig = Clay__StoreImageElementConfig(CLAY__INIT(Clay_ImageElementConfig) __VA_ARGS__) }, CLAY__ELEMENT_CONFIG_TYPE_IMAGE)) -#define CLAY_CUSTOM_ELEMENT_CONFIG(...) Clay__StoreCustomElementConfig(CLAY__INIT(Clay_CustomElementConfig) {__VA_ARGS__ }) +#define CLAY_FLOATING(...) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .floatingElementConfig = Clay__StoreFloatingElementConfig(CLAY__INIT(Clay_FloatingElementConfig) __VA_ARGS__) }, CLAY__ELEMENT_CONFIG_TYPE_FLOATING_CONTAINER)) -#define CLAY_SCROLL_CONFIG(...) Clay__StoreScrollElementConfig(CLAY__INIT(Clay_ScrollElementConfig) {__VA_ARGS__ }) +#define CLAY_CUSTOM_ELEMENT(...) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .customElementConfig = Clay__StoreCustomElementConfig(CLAY__INIT(Clay_CustomElementConfig) __VA_ARGS__) }, CLAY__ELEMENT_CONFIG_TYPE_CUSTOM)) -#define CLAY_BORDER_CONFIG(...) Clay__StoreBorderElementConfig(CLAY__INIT(Clay_BorderElementConfig) { __VA_ARGS__ }) +#define CLAY_SCROLL(...) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .scrollElementConfig = Clay__StoreScrollElementConfig(CLAY__INIT(Clay_ScrollElementConfig) __VA_ARGS__) }, CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER)) -#define CLAY_BORDER_CONFIG_OUTSIDE(...) Clay__StoreBorderElementConfig(CLAY__INIT(Clay_BorderElementConfig) { .left = { __VA_ARGS__ }, .right = { __VA_ARGS__ }, .top = { __VA_ARGS__ }, .bottom = { __VA_ARGS__ } }) +#define CLAY_BORDER(...) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .borderElementConfig = Clay__StoreBorderElementConfig(CLAY__INIT(Clay_BorderElementConfig) __VA_ARGS__) }, CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER)) -#define CLAY_BORDER_CONFIG_OUTSIDE_RADIUS(width, color, radius) Clay__StoreBorderElementConfig(CLAY__INIT(Clay_BorderElementConfig) { .left = { width, color }, .right = { width, color }, .top = { width, color }, .bottom = { width, color }, .cornerRadius = { radius, radius, radius, radius } }) +#define CLAY_BORDER_OUTSIDE(...) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .borderElementConfig = Clay__StoreBorderElementConfig(CLAY__INIT(Clay_BorderElementConfig) { .left = __VA_ARGS__, .right = __VA_ARGS__, .top = __VA_ARGS__, .bottom = __VA_ARGS__ }) }, CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER)) -#define CLAY_BORDER_CONFIG_ALL(...) Clay__StoreBorderElementConfig(CLAY__INIT(Clay_BorderElementConfig) { .left = { __VA_ARGS__ }, .right = { __VA_ARGS__ }, .top = { __VA_ARGS__ }, .bottom = { __VA_ARGS__ }, .betweenChildren = { __VA_ARGS__ } }) +#define CLAY_BORDER_OUTSIDE_RADIUS(width, color, radius) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .borderElementConfig = Clay__StoreBorderElementConfig(CLAY__INIT(Clay_BorderElementConfig) { .left = { width, color }, .right = { width, color }, .top = { width, color }, .bottom = { width, color }, .cornerRadius = { radius, radius, radius, radius } })}, CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER)) -#define CLAY_BORDER_CONFIG_ALL_RADIUS(width, color, radius) Clay__StoreBorderElementConfig(CLAY__INIT(Clay_BorderElementConfig) { .left = { width, color }, .right = { width, color }, .top = { width, color }, .bottom = { width, color }, .betweenChildren = { width, color }, .cornerRadius = { radius, radius, radius, radius }}) +#define CLAY_BORDER_ALL(...) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .borderElementConfig = Clay__StoreBorderElementConfig(CLAY__INIT(Clay_BorderElementConfig) { .left = __VA_ARGS__, .right = __VA_ARGS__, .top = __VA_ARGS__, .bottom = __VA_ARGS__, .betweenChildren = __VA_ARGS__ }) }, CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER)) + +#define CLAY_BORDER_ALL_RADIUS(width, color, radius) Clay__AttachElementConfig(CLAY__CONFIG_WRAPPER(Clay_ElementConfigUnion, { .borderElementConfig = Clay__StoreBorderElementConfig(CLAY__INIT(Clay_BorderElementConfig) { .left = { width, color }, .right = { width, color }, .top = { width, color }, .bottom = { width, color }, .betweenChildren = { width, color }, .cornerRadius = { radius, radius, radius, radius }}) })) #define CLAY_CORNER_RADIUS(radius) CLAY__INIT(Clay_CornerRadius) { radius, radius, radius, radius } -#define CLAY_SIZING_FIT(...) CLAY__INIT(Clay_SizingAxis) { .sizeMinMax = CLAY__INIT(Clay_SizingMinMax) {__VA_ARGS__}, .type = CLAY__SIZING_TYPE_FIT } +#define CLAY__STRUCT_1_ARGS(a) a +#define CLAY__STRUCT_0_ARGS() {} +#define CLAY__STRUCT_OVERRIDE(_0, _1, NAME, ...) NAME -#define CLAY_SIZING_GROW(...) CLAY__INIT(Clay_SizingAxis) { .sizeMinMax = CLAY__INIT(Clay_SizingMinMax) {__VA_ARGS__}, .type = CLAY__SIZING_TYPE_GROW } +#define CLAY__SIZING_FIT_INTERNAL(...) CLAY__INIT(Clay_SizingAxis) { .sizeMinMax = CLAY__INIT(Clay_SizingMinMax) __VA_ARGS__, .type = CLAY__SIZING_TYPE_FIT } +#define CLAY_SIZING_FIT(...) CLAY__SIZING_FIT_INTERNAL(CLAY__STRUCT_OVERRIDE("empty", ##__VA_ARGS__, CLAY__STRUCT_1_ARGS, CLAY__STRUCT_0_ARGS)(__VA_ARGS__)) -#define CLAY_SIZING_FIXED(fixedSize) CLAY__INIT(Clay_SizingAxis) { .sizeMinMax = CLAY__INIT(Clay_SizingMinMax) { fixedSize, fixedSize }, .type = CLAY__SIZING_TYPE_FIXED } +#define CLAY__SIZING_GROW_INTERNAL(...) CLAY__INIT(Clay_SizingAxis) { .sizeMinMax = CLAY__INIT(Clay_SizingMinMax) __VA_ARGS__, .type = CLAY__SIZING_TYPE_GROW } +#define CLAY_SIZING_GROW(...) CLAY__SIZING_GROW_INTERNAL(CLAY__STRUCT_OVERRIDE("empty", ##__VA_ARGS__, CLAY__STRUCT_1_ARGS, CLAY__STRUCT_0_ARGS)(__VA_ARGS__)) + +#define CLAY_SIZING_FIXED(fixedSize) CLAY__INIT(Clay_SizingAxis) { .sizeMinMax = { fixedSize, fixedSize }, .type = CLAY__SIZING_TYPE_FIXED } #define CLAY_SIZING_PERCENT(percentOfParent) CLAY__INIT(Clay_SizingAxis) { .sizePercent = (percentOfParent), .type = CLAY__SIZING_TYPE_PERCENT } -#define CLAY_ID(label) Clay__HashString(CLAY_STRING(label), 0, 0) +#define CLAY_ID(label) Clay__AttachId(Clay__HashString(CLAY_STRING(label), 0, 0)) -#define CLAY_IDI(label, index) Clay__HashString(CLAY_STRING(label), index, 0) +#define CLAY_IDI(label, index) Clay__AttachId(Clay__HashString(CLAY_STRING(label), index, 0)) #define CLAY_ID_LOCAL(label) CLAY_IDI_LOCAL(label, 0) -#define CLAY_IDI_LOCAL(label, index) Clay__HashString(CLAY_STRING(label), index, Clay__GetOpenLayoutElementId()) +#define CLAY_IDI_LOCAL(label, index) Clay__AttachId(Clay__HashString(CLAY_STRING(label), Clay_LayoutElementArray_Get(&Clay__layoutElements, Clay__int32_tArray_Get(&Clay__openLayoutElementStack, Clay__openLayoutElementStack.length - 2))->children.length + 1, Clay__GetOpenLayoutElement()->id)) #define CLAY__STRING_LENGTH(s) ((sizeof(s) / sizeof((s)[0])) - sizeof((s)[0])) @@ -78,33 +90,26 @@ static int CLAY__ELEMENT_DEFINITION_LATCH = 0; -#define CLAY__ELEMENT_INTERNAL(open, close, ...) \ +#define CLAY__ELEMENT_INTERNAL(...) \ for (\ - CLAY__ELEMENT_DEFINITION_LATCH = (open(__VA_ARGS__), 0); \ + CLAY__ELEMENT_DEFINITION_LATCH = (Clay__OpenElement(), __VA_ARGS__, Clay__ElementPostConfiguration(), 0); \ CLAY__ELEMENT_DEFINITION_LATCH < 1; \ - ++CLAY__ELEMENT_DEFINITION_LATCH, close() \ + ++CLAY__ELEMENT_DEFINITION_LATCH, Clay__CloseElement() \ ) +#define CLAY__6_ARGS(a, b, c, d, e, f) a, b, c, d, e, f +#define CLAY__5_ARGS(a, b, c, d, e) a, b, c, d, e +#define CLAY__4_ARGS(a, b, c, d) a, b, c, d +#define CLAY__3_ARGS(a, b, c) a, b, c +#define CLAY__2_ARGS(a, b) a, b +#define CLAY__1_ARGS(a) a +#define CLAY__0_ARGS() Clay__Noop() +#define CLAY__ARGS_OVERRIDE(_0, _1, _2, _3, _4, _5, _6, NAME, ...) NAME // Publicly visible layout element macros ----------------------------------------------------- -#define CLAY_CONTAINER(...) CLAY__ELEMENT_INTERNAL(Clay__OpenContainerElement, Clay__CloseElementWithChildren, __VA_ARGS__) +#define CLAY(...) CLAY__ELEMENT_INTERNAL(CLAY__ARGS_OVERRIDE("empty", ##__VA_ARGS__, CLAY__6_ARGS, CLAY__5_ARGS, CLAY__4_ARGS, CLAY__3_ARGS, CLAY__2_ARGS, CLAY__1_ARGS, CLAY__0_ARGS)(__VA_ARGS__)) -#define CLAY_RECTANGLE(...) CLAY__ELEMENT_INTERNAL(Clay__OpenRectangleElement, Clay__CloseElementWithChildren, __VA_ARGS__) - -#define CLAY_TEXT(id, text, textConfig) Clay__OpenTextElement(id, text, textConfig) - -#define CLAY_IMAGE(...) CLAY__ELEMENT_INTERNAL(Clay__OpenImageElement, Clay__CloseElementWithChildren, __VA_ARGS__) - -#define CLAY_SCROLL_CONTAINER(...) CLAY__ELEMENT_INTERNAL(Clay__OpenScrollElement, Clay__CloseScrollElement, __VA_ARGS__) - -#define CLAY_FLOATING_CONTAINER(...) CLAY__ELEMENT_INTERNAL(Clay__OpenFloatingElement, Clay__CloseFloatingElement, __VA_ARGS__) - -#define CLAY_BORDER_CONTAINER(...) CLAY__ELEMENT_INTERNAL(Clay__OpenBorderElement, Clay__CloseElementWithChildren, __VA_ARGS__) - -#define CLAY_CUSTOM_ELEMENT(id, layoutConfig, customElementConfig, children) \ - Clay__OpenCustomElement(id, layoutConfig, customElementConfig); \ - children \ - Clay__CloseElementWithChildren() +#define CLAY_TEXT(text, textConfig) Clay__OpenTextElement(text, textConfig) #ifdef __cplusplus #define CLAY__INIT(type) type @@ -128,6 +133,13 @@ typedef struct { const char *chars; } Clay_String; +typedef struct +{ + uint32_t capacity; + uint32_t length; + Clay_String *internalArray; +} Clay__StringArray; + typedef struct { Clay_String label; uint64_t nextAllocation; @@ -166,6 +178,16 @@ typedef struct { float bottomRight; } Clay_CornerRadius; +typedef enum CLAY_PACKED_ENUM { + CLAY__ELEMENT_CONFIG_TYPE_RECTANGLE = 1, + CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER = 2, + CLAY__ELEMENT_CONFIG_TYPE_FLOATING_CONTAINER = 4, + CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER = 8, + CLAY__ELEMENT_CONFIG_TYPE_IMAGE = 16, + CLAY__ELEMENT_CONFIG_TYPE_TEXT = 32, + CLAY__ELEMENT_CONFIG_TYPE_CUSTOM = 64, +} Clay__ElementConfigType; + // Element Configs --------------------------- // Layout typedef enum CLAY_PACKED_ENUM { @@ -343,6 +365,12 @@ typedef union Clay_BorderElementConfig *borderElementConfig; } Clay_ElementConfigUnion; +typedef struct +{ + Clay__ElementConfigType type; + Clay_ElementConfigUnion config; +} Clay_ElementConfig; + // Miscellaneous Structs & Enums --------------------------------- typedef struct { @@ -374,6 +402,9 @@ typedef struct Clay_String text; // TODO I wish there was a way to avoid having to have this on every render command uint32_t id; Clay_RenderCommandType commandType; + #ifdef CLAY_DEBUG + Clay_String name; + #endif } Clay_RenderCommand; typedef struct @@ -383,8 +414,22 @@ typedef struct Clay_RenderCommand *internalArray; } Clay_RenderCommandArray; +typedef enum +{ + CLAY_POINTER_INFO_PRESSED_THIS_FRAME, + CLAY_POINTER_INFO_PRESSED, + CLAY_POINTER_INFO_RELEASED_THIS_FRAME, + CLAY_POINTER_INFO_RELEASED, +} Clay_PointerInfoMouseDownState; + +typedef struct +{ + Clay_Vector2 position; + Clay_PointerInfoMouseDownState state; +} Clay_PointerInfo; + // Function Forward Declarations --------------------------------- -// Public API functions +// Public API functions --- uint32_t Clay_MinMemorySize(); Clay_Arena Clay_CreateArenaWithCapacityAndMemory(uint32_t capacity, void *offset); void Clay_SetPointerState(Clay_Vector2 position, bool pointerDown); @@ -393,26 +438,22 @@ void Clay_UpdateScrollContainers(bool enableDragScrolling, Clay_Vector2 scrollDe void Clay_SetLayoutDimensions(Clay_Dimensions dimensions); void Clay_BeginLayout(); Clay_RenderCommandArray Clay_EndLayout(); -bool Clay_PointerOver(Clay_ElementId id); +Clay_ElementId Clay_GetElementId(Clay_String idString); +bool Clay_Hovered(); +void Clay_OnHover(void (*onHoverFunction)(Clay_ElementId elementId, Clay_PointerInfo pointerInfo, intptr_t userData), intptr_t userData); Clay_ScrollContainerData Clay_GetScrollContainerData(Clay_ElementId id); void Clay_SetMeasureTextFunction(Clay_Dimensions (*measureTextFunction)(Clay_String *text, Clay_TextElementConfig *config)); Clay_RenderCommand * Clay_RenderCommandArray_Get(Clay_RenderCommandArray* array, int32_t index); void Clay_SetDebugModeEnabled(bool enabled); -void Clay__OpenContainerElement(Clay_ElementId id, Clay_LayoutConfig *layoutConfig); -void Clay__OpenRectangleElement(Clay_ElementId id, Clay_LayoutConfig *layoutConfig, Clay_RectangleElementConfig *rectangleConfig); -void Clay__OpenTextElement(Clay_ElementId id, Clay_String text, Clay_TextElementConfig *textConfig); -void Clay__OpenImageElement(Clay_ElementId id, Clay_LayoutConfig *layoutConfig, Clay_ImageElementConfig *imageConfig); -void Clay__OpenScrollElement(Clay_ElementId id, Clay_LayoutConfig *layoutConfig, Clay_ScrollElementConfig *scrollConfig); -void Clay__OpenFloatingElement(Clay_ElementId id, Clay_LayoutConfig *layoutConfig, Clay_FloatingElementConfig *floatingConfig); -void Clay__OpenBorderElement(Clay_ElementId id, Clay_LayoutConfig *layoutConfig, Clay_BorderElementConfig *borderConfig); -void Clay__OpenCustomElement(Clay_ElementId id, Clay_LayoutConfig *layoutConfig, Clay_CustomElementConfig *customConfig); -void Clay__CloseElementWithChildren(); -void Clay__CloseScrollElement(); -void Clay__CloseFloatingElement(); - // Internal API functions required by macros +void Clay__OpenElement(); +void Clay__CloseElement(); Clay_LayoutConfig * Clay__StoreLayoutConfig(Clay_LayoutConfig config); +void Clay__ElementPostConfiguration(); +void Clay__AttachId(Clay_ElementId id); +void Clay__AttachLayoutConfig(Clay_LayoutConfig *config); +void Clay__AttachElementConfig(Clay_ElementConfigUnion config, Clay__ElementConfigType type); Clay_RectangleElementConfig * Clay__StoreRectangleElementConfig(Clay_RectangleElementConfig config); Clay_TextElementConfig * Clay__StoreTextElementConfig(Clay_TextElementConfig config); Clay_ImageElementConfig * Clay__StoreImageElementConfig(Clay_ImageElementConfig config); @@ -421,7 +462,7 @@ Clay_CustomElementConfig * Clay__StoreCustomElementConfig(Clay_CustomElementConf Clay_ScrollElementConfig * Clay__StoreScrollElementConfig(Clay_ScrollElementConfig config); Clay_BorderElementConfig * Clay__StoreBorderElementConfig(Clay_BorderElementConfig config); Clay_ElementId Clay__HashString(Clay_String key, uint32_t offset, uint32_t seed); -uint32_t Clay__GetOpenLayoutElementId(void); +void Clay__Noop(); extern Clay_Color Clay__debugViewHighlightColor; extern uint32_t Clay__debugViewWidth; @@ -459,8 +500,10 @@ extern uint32_t Clay__debugViewWidth; bool Clay__warningsEnabled = true; +void Clay__Noop() {}; + Clay_String CLAY__SPACECHAR = CLAY__INIT(Clay_String) { .length = 1, .chars = " " }; -Clay_String CLAY__STRING_DEFAULT = CLAY__INIT(Clay_String) { .length = 0, .chars = "" }; +Clay_String CLAY__STRING_DEFAULT = CLAY__INIT(Clay_String) { .length = 0, .chars = NULL }; typedef struct { @@ -563,7 +606,7 @@ bool Clay__Array_IncrementCapacityCheck(uint32_t length, uint32_t capacity) bool CLAY__BOOL_DEFAULT = false; -// __GENERATED__ template array_define TYPE=bool NAME=Clay__BoolArray +// __GENERATED__ template array_define,array_allocate TYPE=bool NAME=Clay__BoolArray #pragma region generated typedef struct { @@ -571,7 +614,6 @@ typedef struct uint32_t length; bool *internalArray; } Clay__BoolArray; - Clay__BoolArray Clay__BoolArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__BoolArray){.capacity = capacity, .length = 0, .internalArray = (bool *)Clay__Array_Allocate_Arena(capacity, sizeof(bool), CLAY__ALIGNMENT(bool), arena)}; } @@ -580,7 +622,7 @@ Clay__BoolArray Clay__BoolArray_Allocate_Arena(uint32_t capacity, Clay_Arena *ar Clay_ElementId CLAY__ELEMENT_ID_DEFAULT = CLAY__INIT(Clay_ElementId) {}; -// __GENERATED__ template array_define,array_get,array_add TYPE=Clay_ElementId NAME=Clay__ElementIdArray DEFAULT_VALUE=&CLAY__ELEMENT_ID_DEFAULT +// __GENERATED__ template array_define,array_allocate,array_get,array_add TYPE=Clay_ElementId NAME=Clay__ElementIdArray DEFAULT_VALUE=&CLAY__ELEMENT_ID_DEFAULT #pragma region generated typedef struct { @@ -588,7 +630,6 @@ typedef struct uint32_t length; Clay_ElementId *internalArray; } Clay__ElementIdArray; - Clay__ElementIdArray Clay__ElementIdArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__ElementIdArray){.capacity = capacity, .length = 0, .internalArray = (Clay_ElementId *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay_ElementId), CLAY__ALIGNMENT(Clay_ElementId), arena)}; } @@ -605,31 +646,43 @@ Clay_ElementId *Clay__ElementIdArray_Add(Clay__ElementIdArray *array, Clay_Eleme #pragma endregion // __GENERATED__ template -typedef enum CLAY_PACKED_ENUM { - CLAY__LAYOUT_ELEMENT_TYPE_CONTAINER, - CLAY__LAYOUT_ELEMENT_TYPE_RECTANGLE, - CLAY__LAYOUT_ELEMENT_TYPE_BORDER_CONTAINER, - CLAY__LAYOUT_ELEMENT_TYPE_FLOATING_CONTAINER, - CLAY__LAYOUT_ELEMENT_TYPE_SCROLL_CONTAINER, - CLAY__LAYOUT_ELEMENT_TYPE_IMAGE, - CLAY__LAYOUT_ELEMENT_TYPE_TEXT, - CLAY__LAYOUT_ELEMENT_TYPE_CUSTOM, -} Clay__LayoutElementType; +Clay_ElementConfig CLAY__ELEMENT_CONFIG_DEFAULT = CLAY__INIT(Clay_ElementConfig) {}; -Clay_RenderCommandType Clay__LayoutElementTypeToRenderCommandType[] = { - CLAY_RENDER_COMMAND_TYPE_NONE, - CLAY_RENDER_COMMAND_TYPE_RECTANGLE, - CLAY_RENDER_COMMAND_TYPE_NONE, - CLAY_RENDER_COMMAND_TYPE_NONE, - CLAY_RENDER_COMMAND_TYPE_BORDER, - CLAY_RENDER_COMMAND_TYPE_IMAGE, - CLAY_RENDER_COMMAND_TYPE_TEXT, - CLAY_RENDER_COMMAND_TYPE_CUSTOM, -}; +// __GENERATED__ template array_define,array_define_slice,array_allocate,array_get,array_add,array_get_slice TYPE=Clay_ElementConfig NAME=Clay__ElementConfigArray DEFAULT_VALUE=&CLAY__ELEMENT_CONFIG_DEFAULT +#pragma region generated +typedef struct +{ + uint32_t capacity; + uint32_t length; + Clay_ElementConfig *internalArray; +} Clay__ElementConfigArray; +typedef struct +{ + uint32_t length; + Clay_ElementConfig *internalArray; +} Clay__ElementConfigArraySlice; +Clay__ElementConfigArray Clay__ElementConfigArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { + return CLAY__INIT(Clay__ElementConfigArray){.capacity = capacity, .length = 0, .internalArray = (Clay_ElementConfig *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay_ElementConfig), CLAY__ALIGNMENT(Clay_ElementConfig), arena)}; +} +Clay_ElementConfig *Clay__ElementConfigArray_Get(Clay__ElementConfigArray *array, int index) { + return Clay__Array_RangeCheck(index, array->length) ? &array->internalArray[index] : &CLAY__ELEMENT_CONFIG_DEFAULT; +} +Clay_ElementConfig *Clay__ElementConfigArray_Add(Clay__ElementConfigArray *array, Clay_ElementConfig item) { + if (Clay__Array_IncrementCapacityCheck(array->length, array->capacity)) { + array->internalArray[array->length++] = item; + return &array->internalArray[array->length - 1]; + } + return &CLAY__ELEMENT_CONFIG_DEFAULT; +} +Clay_ElementConfig *Clay__ElementConfigArraySlice_Get(Clay__ElementConfigArraySlice *slice, int index) { + return Clay__Array_RangeCheck(index, slice->length) ? &slice->internalArray[index] : &CLAY__ELEMENT_CONFIG_DEFAULT; +} +#pragma endregion +// __GENERATED__ template -Clay_LayoutConfig CLAY_LAYOUT_DEFAULT = CLAY__INIT(Clay_LayoutConfig){}; +Clay_LayoutConfig CLAY_LAYOUT_DEFAULT = CLAY__INIT(Clay_LayoutConfig){ .sizing = { .width = { .sizeMinMax = {0, CLAY__MAXFLOAT }, .type = CLAY__SIZING_TYPE_FIT }, .height = { .sizeMinMax = {0, CLAY__MAXFLOAT }, .type = CLAY__SIZING_TYPE_FIT } } }; -// __GENERATED__ template array_define,array_add TYPE=Clay_LayoutConfig NAME=Clay__LayoutConfigArray DEFAULT_VALUE=&CLAY_LAYOUT_DEFAULT +// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_LayoutConfig NAME=Clay__LayoutConfigArray DEFAULT_VALUE=&CLAY_LAYOUT_DEFAULT #pragma region generated typedef struct { @@ -637,7 +690,6 @@ typedef struct uint32_t length; Clay_LayoutConfig *internalArray; } Clay__LayoutConfigArray; - Clay__LayoutConfigArray Clay__LayoutConfigArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__LayoutConfigArray){.capacity = capacity, .length = 0, .internalArray = (Clay_LayoutConfig *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay_LayoutConfig), CLAY__ALIGNMENT(Clay_LayoutConfig), arena)}; } @@ -653,7 +705,7 @@ Clay_LayoutConfig *Clay__LayoutConfigArray_Add(Clay__LayoutConfigArray *array, C Clay_RectangleElementConfig CLAY__RECTANGLE_ELEMENT_CONFIG_DEFAULT = CLAY__INIT(Clay_RectangleElementConfig){{0}}; -// __GENERATED__ template array_define,array_add TYPE=Clay_RectangleElementConfig NAME=Clay__RectangleElementConfigArray DEFAULT_VALUE=&CLAY__RECTANGLE_ELEMENT_CONFIG_DEFAULT +// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_RectangleElementConfig NAME=Clay__RectangleElementConfigArray DEFAULT_VALUE=&CLAY__RECTANGLE_ELEMENT_CONFIG_DEFAULT #pragma region generated typedef struct { @@ -661,7 +713,6 @@ typedef struct uint32_t length; Clay_RectangleElementConfig *internalArray; } Clay__RectangleElementConfigArray; - Clay__RectangleElementConfigArray Clay__RectangleElementConfigArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__RectangleElementConfigArray){.capacity = capacity, .length = 0, .internalArray = (Clay_RectangleElementConfig *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay_RectangleElementConfig), CLAY__ALIGNMENT(Clay_RectangleElementConfig), arena)}; } @@ -677,7 +728,7 @@ Clay_RectangleElementConfig *Clay__RectangleElementConfigArray_Add(Clay__Rectang Clay_TextElementConfig CLAY__TEXT_ELEMENT_CONFIG_DEFAULT = CLAY__INIT(Clay_TextElementConfig) {}; -// __GENERATED__ template array_define,array_add TYPE=Clay_TextElementConfig NAME=Clay__TextElementConfigArray DEFAULT_VALUE=&CLAY__TEXT_ELEMENT_CONFIG_DEFAULT +// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_TextElementConfig NAME=Clay__TextElementConfigArray DEFAULT_VALUE=&CLAY__TEXT_ELEMENT_CONFIG_DEFAULT #pragma region generated typedef struct { @@ -685,7 +736,6 @@ typedef struct uint32_t length; Clay_TextElementConfig *internalArray; } Clay__TextElementConfigArray; - Clay__TextElementConfigArray Clay__TextElementConfigArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__TextElementConfigArray){.capacity = capacity, .length = 0, .internalArray = (Clay_TextElementConfig *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay_TextElementConfig), CLAY__ALIGNMENT(Clay_TextElementConfig), arena)}; } @@ -701,7 +751,7 @@ Clay_TextElementConfig *Clay__TextElementConfigArray_Add(Clay__TextElementConfig Clay_ImageElementConfig CLAY__IMAGE_ELEMENT_CONFIG_DEFAULT = CLAY__INIT(Clay_ImageElementConfig) {}; -// __GENERATED__ template array_define,array_add TYPE=Clay_ImageElementConfig NAME=Clay__ImageElementConfigArray DEFAULT_VALUE=&CLAY__IMAGE_ELEMENT_CONFIG_DEFAULT +// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_ImageElementConfig NAME=Clay__ImageElementConfigArray DEFAULT_VALUE=&CLAY__IMAGE_ELEMENT_CONFIG_DEFAULT #pragma region generated typedef struct { @@ -709,7 +759,6 @@ typedef struct uint32_t length; Clay_ImageElementConfig *internalArray; } Clay__ImageElementConfigArray; - Clay__ImageElementConfigArray Clay__ImageElementConfigArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__ImageElementConfigArray){.capacity = capacity, .length = 0, .internalArray = (Clay_ImageElementConfig *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay_ImageElementConfig), CLAY__ALIGNMENT(Clay_ImageElementConfig), arena)}; } @@ -725,7 +774,7 @@ Clay_ImageElementConfig *Clay__ImageElementConfigArray_Add(Clay__ImageElementCon Clay_FloatingElementConfig CLAY__FLOATING_ELEMENT_CONFIG_DEFAULT = CLAY__INIT(Clay_FloatingElementConfig) {}; -// __GENERATED__ template array_define,array_add TYPE=Clay_FloatingElementConfig NAME=Clay__FloatingElementConfigArray DEFAULT_VALUE=&CLAY__FLOATING_ELEMENT_CONFIG_DEFAULT +// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_FloatingElementConfig NAME=Clay__FloatingElementConfigArray DEFAULT_VALUE=&CLAY__FLOATING_ELEMENT_CONFIG_DEFAULT #pragma region generated typedef struct { @@ -733,7 +782,6 @@ typedef struct uint32_t length; Clay_FloatingElementConfig *internalArray; } Clay__FloatingElementConfigArray; - Clay__FloatingElementConfigArray Clay__FloatingElementConfigArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__FloatingElementConfigArray){.capacity = capacity, .length = 0, .internalArray = (Clay_FloatingElementConfig *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay_FloatingElementConfig), CLAY__ALIGNMENT(Clay_FloatingElementConfig), arena)}; } @@ -749,7 +797,7 @@ Clay_FloatingElementConfig *Clay__FloatingElementConfigArray_Add(Clay__FloatingE Clay_CustomElementConfig CLAY__CUSTOM_ELEMENT_CONFIG_DEFAULT = CLAY__INIT(Clay_CustomElementConfig) {}; -// __GENERATED__ template array_define,array_add TYPE=Clay_CustomElementConfig NAME=Clay__CustomElementConfigArray DEFAULT_VALUE=&CLAY__CUSTOM_ELEMENT_CONFIG_DEFAULT +// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_CustomElementConfig NAME=Clay__CustomElementConfigArray DEFAULT_VALUE=&CLAY__CUSTOM_ELEMENT_CONFIG_DEFAULT #pragma region generated typedef struct { @@ -757,7 +805,6 @@ typedef struct uint32_t length; Clay_CustomElementConfig *internalArray; } Clay__CustomElementConfigArray; - Clay__CustomElementConfigArray Clay__CustomElementConfigArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__CustomElementConfigArray){.capacity = capacity, .length = 0, .internalArray = (Clay_CustomElementConfig *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay_CustomElementConfig), CLAY__ALIGNMENT(Clay_CustomElementConfig), arena)}; } @@ -773,7 +820,7 @@ Clay_CustomElementConfig *Clay__CustomElementConfigArray_Add(Clay__CustomElement Clay_ScrollElementConfig CLAY__SCROLL_CONTAINER_ELEMENT_CONFIG_DEFAULT = CLAY__INIT(Clay_ScrollElementConfig ) {}; -// __GENERATED__ template array_define,array_add TYPE=Clay_ScrollElementConfig NAME=Clay__ScrollElementConfigArray DEFAULT_VALUE=&CLAY__SCROLL_CONTAINER_ELEMENT_CONFIG_DEFAULT +// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_ScrollElementConfig NAME=Clay__ScrollElementConfigArray DEFAULT_VALUE=&CLAY__SCROLL_CONTAINER_ELEMENT_CONFIG_DEFAULT #pragma region generated typedef struct { @@ -781,7 +828,6 @@ typedef struct uint32_t length; Clay_ScrollElementConfig *internalArray; } Clay__ScrollElementConfigArray; - Clay__ScrollElementConfigArray Clay__ScrollElementConfigArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__ScrollElementConfigArray){.capacity = capacity, .length = 0, .internalArray = (Clay_ScrollElementConfig *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay_ScrollElementConfig), CLAY__ALIGNMENT(Clay_ScrollElementConfig), arena)}; } @@ -795,15 +841,37 @@ Clay_ScrollElementConfig *Clay__ScrollElementConfigArray_Add(Clay__ScrollElement #pragma endregion // __GENERATED__ template +// __GENERATED__ template array_define_slice,array_allocate,array_add TYPE=Clay_String NAME=Clay__StringArray DEFAULT_VALUE=&CLAY__STRING_DEFAULT +#pragma region generated typedef struct { - uint32_t elementIndex; + uint32_t length; + Clay_String *internalArray; +} Clay__StringArraySlice; +Clay__StringArray Clay__StringArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { + return CLAY__INIT(Clay__StringArray){.capacity = capacity, .length = 0, .internalArray = (Clay_String *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay_String), CLAY__ALIGNMENT(Clay_String), arena)}; +} +Clay_String *Clay__StringArray_Add(Clay__StringArray *array, Clay_String item) { + if (Clay__Array_IncrementCapacityCheck(array->length, array->capacity)) { + array->internalArray[array->length++] = item; + return &array->internalArray[array->length - 1]; + } + return &CLAY__STRING_DEFAULT; +} +#pragma endregion +// __GENERATED__ template + +typedef struct +{ + Clay_String text; Clay_Dimensions preferredDimensions; + uint32_t elementIndex; + Clay__StringArraySlice wrappedLines; } Clay__TextElementData; Clay__TextElementData CLAY__TEXT_ELEMENT_DATA_DEFAULT = CLAY__INIT(Clay__TextElementData) {}; -// __GENERATED__ template array_define,array_get,array_add TYPE=Clay__TextElementData NAME=Clay__TextElementDataArray DEFAULT_VALUE=&CLAY__TEXT_ELEMENT_DATA_DEFAULT +// __GENERATED__ template array_define,array_allocate,array_get,array_add TYPE=Clay__TextElementData NAME=Clay__TextElementDataArray DEFAULT_VALUE=&CLAY__TEXT_ELEMENT_DATA_DEFAULT #pragma region generated typedef struct { @@ -811,7 +879,6 @@ typedef struct uint32_t length; Clay__TextElementData *internalArray; } Clay__TextElementDataArray; - Clay__TextElementDataArray Clay__TextElementDataArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__TextElementDataArray){.capacity = capacity, .length = 0, .internalArray = (Clay__TextElementData *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay__TextElementData), CLAY__ALIGNMENT(Clay__TextElementData), arena)}; } @@ -830,7 +897,7 @@ Clay__TextElementData *Clay__TextElementDataArray_Add(Clay__TextElementDataArray Clay_BorderElementConfig CLAY__BORDER_CONTAINER_ELEMENT_CONFIG_DEFAULT = CLAY__INIT(Clay_BorderElementConfig ) {}; -// __GENERATED__ template array_define,array_add TYPE=Clay_BorderElementConfig NAME=Clay__BorderElementConfigArray DEFAULT_VALUE=&CLAY__BORDER_CONTAINER_ELEMENT_CONFIG_DEFAULT +// __GENERATED__ template array_define,array_allocate,array_add TYPE=Clay_BorderElementConfig NAME=Clay__BorderElementConfigArray DEFAULT_VALUE=&CLAY__BORDER_CONTAINER_ELEMENT_CONFIG_DEFAULT #pragma region generated typedef struct { @@ -838,7 +905,6 @@ typedef struct uint32_t length; Clay_BorderElementConfig *internalArray; } Clay__BorderElementConfigArray; - Clay__BorderElementConfigArray Clay__BorderElementConfigArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__BorderElementConfigArray){.capacity = capacity, .length = 0, .internalArray = (Clay_BorderElementConfig *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay_BorderElementConfig), CLAY__ALIGNMENT(Clay_BorderElementConfig), arena)}; } @@ -858,26 +924,26 @@ typedef struct uint16_t length; } Clay__LayoutElementChildren; -typedef struct t_Clay_LayoutElement +typedef struct { #ifdef CLAY_DEBUG Clay_String name; #endif union { Clay__LayoutElementChildren children; - Clay_String text; + Clay__TextElementData *textElementData; }; Clay_Dimensions dimensions; Clay_Dimensions minDimensions; Clay_LayoutConfig *layoutConfig; - Clay_ElementConfigUnion elementConfig; + Clay__ElementConfigArraySlice elementConfigs; + uint32_t configsEnabled; uint32_t id; - Clay__LayoutElementType elementType; } Clay_LayoutElement; Clay_LayoutElement CLAY__LAYOUT_ELEMENT_DEFAULT = CLAY__INIT(Clay_LayoutElement) {}; -// __GENERATED__ template array_define,array_add,array_get TYPE=Clay_LayoutElement NAME=Clay_LayoutElementArray DEFAULT_VALUE=&CLAY__LAYOUT_ELEMENT_DEFAULT +// __GENERATED__ template array_define,array_allocate,array_add,array_get TYPE=Clay_LayoutElement NAME=Clay_LayoutElementArray DEFAULT_VALUE=&CLAY__LAYOUT_ELEMENT_DEFAULT #pragma region generated typedef struct { @@ -885,7 +951,6 @@ typedef struct uint32_t length; Clay_LayoutElement *internalArray; } Clay_LayoutElementArray; - Clay_LayoutElementArray Clay_LayoutElementArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay_LayoutElementArray){.capacity = capacity, .length = 0, .internalArray = (Clay_LayoutElement *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay_LayoutElement), CLAY__ALIGNMENT(Clay_LayoutElement), arena)}; } @@ -902,7 +967,7 @@ Clay_LayoutElement *Clay_LayoutElementArray_Get(Clay_LayoutElementArray *array, #pragma endregion // __GENERATED__ template -// __GENERATED__ template array_define,array_add,array_get,array_remove_swapback TYPE=Clay_LayoutElement* NAME=Clay__LayoutElementPointerArray DEFAULT_VALUE=CLAY__NULL +// __GENERATED__ template array_define,array_allocate,array_add,array_get_value,array_remove_swapback TYPE=Clay_LayoutElement* NAME=Clay__LayoutElementPointerArray DEFAULT_VALUE=CLAY__NULL #pragma region generated typedef struct { @@ -910,7 +975,6 @@ typedef struct uint32_t length; Clay_LayoutElement* *internalArray; } Clay__LayoutElementPointerArray; - Clay__LayoutElementPointerArray Clay__LayoutElementPointerArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__LayoutElementPointerArray){.capacity = capacity, .length = 0, .internalArray = (Clay_LayoutElement* *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay_LayoutElement*), CLAY__ALIGNMENT(Clay_LayoutElement*), arena)}; } @@ -921,8 +985,8 @@ Clay_LayoutElement* *Clay__LayoutElementPointerArray_Add(Clay__LayoutElementPoin } return CLAY__NULL; } -Clay_LayoutElement* *Clay__LayoutElementPointerArray_Get(Clay__LayoutElementPointerArray *array, int index) { - return Clay__Array_RangeCheck(index, array->length) ? &array->internalArray[index] : CLAY__NULL; +Clay_LayoutElement* Clay__LayoutElementPointerArray_Get(Clay__LayoutElementPointerArray *array, int index) { + return Clay__Array_RangeCheck(index, array->length) ? array->internalArray[index] : CLAY__NULL; } Clay_LayoutElement* Clay__LayoutElementPointerArray_RemoveSwapback(Clay__LayoutElementPointerArray *array, int index) { if (Clay__Array_RangeCheck(index, array->length)) { @@ -938,16 +1002,11 @@ Clay_LayoutElement* Clay__LayoutElementPointerArray_RemoveSwapback(Clay__LayoutE Clay_RenderCommand CLAY__RENDER_COMMAND_DEFAULT = CLAY__INIT(Clay_RenderCommand) {}; -// __GENERATED__ template array_define TYPE=Clay_RenderCommand NAME=Clay_RenderCommandArray +// __GENERATED__ template array_allocate,array_add,array_get TYPE=Clay_RenderCommand NAME=Clay_RenderCommandArray DEFAULT_VALUE=&CLAY__RENDER_COMMAND_DEFAULT #pragma region generated Clay_RenderCommandArray Clay_RenderCommandArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay_RenderCommandArray){.capacity = capacity, .length = 0, .internalArray = (Clay_RenderCommand *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay_RenderCommand), CLAY__ALIGNMENT(Clay_RenderCommand), arena)}; } -#pragma endregion -// __GENERATED__ template - -// __GENERATED__ template array_add TYPE=Clay_RenderCommand NAME=Clay_RenderCommandArray DEFAULT_VALUE=&CLAY__RENDER_COMMAND_DEFAULT -#pragma region generated Clay_RenderCommand *Clay_RenderCommandArray_Add(Clay_RenderCommandArray *array, Clay_RenderCommand item) { if (Clay__Array_IncrementCapacityCheck(array->length, array->capacity)) { array->internalArray[array->length++] = item; @@ -955,11 +1014,6 @@ Clay_RenderCommand *Clay_RenderCommandArray_Add(Clay_RenderCommandArray *array, } return &CLAY__RENDER_COMMAND_DEFAULT; } -#pragma endregion -// __GENERATED__ template - -// __GENERATED__ template array_get TYPE=Clay_RenderCommand NAME=Clay_RenderCommandArray DEFAULT_VALUE=&CLAY__RENDER_COMMAND_DEFAULT -#pragma region generated Clay_RenderCommand *Clay_RenderCommandArray_Get(Clay_RenderCommandArray *array, int index) { return Clay__Array_RangeCheck(index, array->length) ? &array->internalArray[index] : &CLAY__RENDER_COMMAND_DEFAULT; } @@ -984,7 +1038,7 @@ typedef struct Clay__ScrollContainerDataInternal CLAY__SCROLL_CONTAINER_DEFAULT = CLAY__INIT(Clay__ScrollContainerDataInternal) {}; -// __GENERATED__ template define,array_add,array_get TYPE=Clay__ScrollContainerDataInternal NAME=Clay__ScrollContainerDataInternalArray DEFAULT_VALUE=&CLAY__SCROLL_CONTAINER_DEFAULT +// __GENERATED__ template array_define,array_allocate,array_add,array_get TYPE=Clay__ScrollContainerDataInternal NAME=Clay__ScrollContainerDataInternalArray DEFAULT_VALUE=&CLAY__SCROLL_CONTAINER_DEFAULT #pragma region generated typedef struct { @@ -992,7 +1046,6 @@ typedef struct uint32_t length; Clay__ScrollContainerDataInternal *internalArray; } Clay__ScrollContainerDataInternalArray; - Clay__ScrollContainerDataInternalArray Clay__ScrollContainerDataInternalArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__ScrollContainerDataInternalArray){.capacity = capacity, .length = 0, .internalArray = (Clay__ScrollContainerDataInternal *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay__ScrollContainerDataInternal), CLAY__ALIGNMENT(Clay__ScrollContainerDataInternal), arena)}; } @@ -1031,7 +1084,7 @@ typedef struct Clay__DebugElementData CLAY__DEBUG_ELEMENT_DATA_DEFAULT = CLAY__INIT(Clay__DebugElementData) {}; -// __GENERATED__ template array_define,array_add,array_get TYPE=Clay__DebugElementData NAME=Clay__DebugElementDataArray DEFAULT_VALUE=&CLAY__DEBUG_ELEMENT_DATA_DEFAULT +// __GENERATED__ template array_define,array_allocate,array_add,array_get TYPE=Clay__DebugElementData NAME=Clay__DebugElementDataArray DEFAULT_VALUE=&CLAY__DEBUG_ELEMENT_DATA_DEFAULT #pragma region generated typedef struct { @@ -1039,7 +1092,6 @@ typedef struct uint32_t length; Clay__DebugElementData *internalArray; } Clay__DebugElementDataArray; - Clay__DebugElementDataArray Clay__DebugElementDataArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__DebugElementDataArray){.capacity = capacity, .length = 0, .internalArray = (Clay__DebugElementData *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay__DebugElementData), CLAY__ALIGNMENT(Clay__DebugElementData), arena)}; } @@ -1056,11 +1108,13 @@ Clay__DebugElementData *Clay__DebugElementDataArray_Get(Clay__DebugElementDataAr #pragma endregion // __GENERATED__ template -typedef struct +typedef struct // todo get this struct into a single cache line { Clay_BoundingBox boundingBox; Clay_ElementId elementId; Clay_LayoutElement* layoutElement; + void (*onHoverFunction)(Clay_ElementId elementId, Clay_PointerInfo pointerInfo, intptr_t userData); + intptr_t hoverFunctionUserData; int32_t nextIndex; uint32_t generation; Clay__DebugElementData *debugData; @@ -1068,7 +1122,7 @@ typedef struct Clay_LayoutElementHashMapItem CLAY__LAYOUT_ELEMENT_HASH_MAP_ITEM_DEFAULT = CLAY__INIT(Clay_LayoutElementHashMapItem) { .layoutElement = &CLAY__LAYOUT_ELEMENT_DEFAULT }; -// __GENERATED__ template array_define,array_get,array_add TYPE=Clay_LayoutElementHashMapItem NAME=Clay__LayoutElementHashMapItemArray DEFAULT_VALUE=&CLAY__LAYOUT_ELEMENT_HASH_MAP_ITEM_DEFAULT +// __GENERATED__ template array_define,array_allocate,array_get,array_add TYPE=Clay_LayoutElementHashMapItem NAME=Clay__LayoutElementHashMapItemArray DEFAULT_VALUE=&CLAY__LAYOUT_ELEMENT_HASH_MAP_ITEM_DEFAULT #pragma region generated typedef struct { @@ -1076,7 +1130,6 @@ typedef struct uint32_t length; Clay_LayoutElementHashMapItem *internalArray; } Clay__LayoutElementHashMapItemArray; - Clay__LayoutElementHashMapItemArray Clay__LayoutElementHashMapItemArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__LayoutElementHashMapItemArray){.capacity = capacity, .length = 0, .internalArray = (Clay_LayoutElementHashMapItem *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay_LayoutElementHashMapItem), CLAY__ALIGNMENT(Clay_LayoutElementHashMapItem), arena)}; } @@ -1095,7 +1148,51 @@ Clay_LayoutElementHashMapItem *Clay__LayoutElementHashMapItemArray_Add(Clay__Lay typedef struct { - Clay_Dimensions dimensions; + Clay_String word; + uint32_t startOffset; + uint32_t length; + float width; +} Clay__MeasuredWord; + +Clay__MeasuredWord CLAY__MEASURED_WORD_DEFAULT = CLAY__INIT(Clay__MeasuredWord) {}; + +// __GENERATED__ template array_define,array_define_slice,array_allocate,array_get,array_get_slice,array_add TYPE=Clay__MeasuredWord NAME=Clay__MeasuredWordArray DEFAULT_VALUE=&CLAY__MEASURED_WORD_DEFAULT +#pragma region generated +typedef struct +{ + uint32_t capacity; + uint32_t length; + Clay__MeasuredWord *internalArray; +} Clay__MeasuredWordArray; +typedef struct +{ + uint32_t length; + Clay__MeasuredWord *internalArray; +} Clay__MeasuredWordArraySlice; +Clay__MeasuredWordArray Clay__MeasuredWordArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { + return CLAY__INIT(Clay__MeasuredWordArray){.capacity = capacity, .length = 0, .internalArray = (Clay__MeasuredWord *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay__MeasuredWord), CLAY__ALIGNMENT(Clay__MeasuredWord), arena)}; +} +Clay__MeasuredWord *Clay__MeasuredWordArray_Get(Clay__MeasuredWordArray *array, int index) { + return Clay__Array_RangeCheck(index, array->length) ? &array->internalArray[index] : &CLAY__MEASURED_WORD_DEFAULT; +} +Clay__MeasuredWord *Clay__MeasuredWordArraySlice_Get(Clay__MeasuredWordArraySlice *slice, int index) { + return Clay__Array_RangeCheck(index, slice->length) ? &slice->internalArray[index] : &CLAY__MEASURED_WORD_DEFAULT; +} +Clay__MeasuredWord *Clay__MeasuredWordArray_Add(Clay__MeasuredWordArray *array, Clay__MeasuredWord item) { + if (Clay__Array_IncrementCapacityCheck(array->length, array->capacity)) { + array->internalArray[array->length++] = item; + return &array->internalArray[array->length - 1]; + } + return &CLAY__MEASURED_WORD_DEFAULT; +} +#pragma endregion +// __GENERATED__ template + +typedef struct +{ + Clay_Dimensions unwrappedDimensions; + Clay__MeasuredWordArraySlice measuredWords; + // Hash map data uint32_t id; int32_t nextIndex; uint32_t generation; @@ -1103,7 +1200,7 @@ typedef struct Clay__MeasureTextCacheItem CLAY__MEASURE_TEXT_CACHE_ITEM_DEFAULT = CLAY__INIT(Clay__MeasureTextCacheItem) { }; -// __GENERATED__ template array_define,array_get,array_add,array_set TYPE=Clay__MeasureTextCacheItem NAME=Clay__MeasureTextCacheItemArray DEFAULT_VALUE=&CLAY__MEASURE_TEXT_CACHE_ITEM_DEFAULT +// __GENERATED__ template array_define,array_allocate,array_get,array_add,array_set TYPE=Clay__MeasureTextCacheItem NAME=Clay__MeasureTextCacheItemArray DEFAULT_VALUE=&CLAY__MEASURE_TEXT_CACHE_ITEM_DEFAULT #pragma region generated typedef struct { @@ -1111,7 +1208,6 @@ typedef struct uint32_t length; Clay__MeasureTextCacheItem *internalArray; } Clay__MeasureTextCacheItemArray; - Clay__MeasureTextCacheItemArray Clay__MeasureTextCacheItemArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__MeasureTextCacheItemArray){.capacity = capacity, .length = 0, .internalArray = (Clay__MeasureTextCacheItem *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay__MeasureTextCacheItem), CLAY__ALIGNMENT(Clay__MeasureTextCacheItem), arena)}; } @@ -1141,7 +1237,7 @@ void Clay__MeasureTextCacheItemArray_Set(Clay__MeasureTextCacheItemArray *array, #pragma endregion // __GENERATED__ template -// __GENERATED__ template array_define,array_get_value,array_add_value,array_set TYPE=int32_t NAME=Clay__int32_tArray DEFAULT_VALUE=-1 +// __GENERATED__ template array_define,array_allocate,array_get_value,array_add_value,array_set,array_remove_swapback TYPE=int32_t NAME=Clay__int32_tArray DEFAULT_VALUE=-1 #pragma region generated typedef struct { @@ -1149,7 +1245,6 @@ typedef struct uint32_t length; int32_t *internalArray; } Clay__int32_tArray; - Clay__int32_tArray Clay__int32_tArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__int32_tArray){.capacity = capacity, .length = 0, .internalArray = (int32_t *)Clay__Array_Allocate_Arena(capacity, sizeof(int32_t), CLAY__ALIGNMENT(int32_t), arena)}; } @@ -1174,11 +1269,18 @@ void Clay__int32_tArray_Set(Clay__int32_tArray *array, int index, int32_t value) #endif } } +int32_t Clay__int32_tArray_RemoveSwapback(Clay__int32_tArray *array, int index) { + if (Clay__Array_RangeCheck(index, array->length)) { + array->length--; + int32_t removed = array->internalArray[index]; + array->internalArray[index] = array->internalArray[array->length]; + return removed; + } + return -1; +} #pragma endregion // __GENERATED__ template -Clay_LayoutElement *Clay__openLayoutElement = CLAY__NULL; - typedef struct { Clay_LayoutElement *layoutElement; @@ -1188,7 +1290,7 @@ typedef struct Clay__LayoutElementTreeNode CLAY__LAYOUT_ELEMENT_TREE_NODE_DEFAULT = CLAY__INIT(Clay__LayoutElementTreeNode) {}; -// __GENERATED__ template array_define,array_add,array_get TYPE=Clay__LayoutElementTreeNode NAME=Clay__LayoutElementTreeNodeArray DEFAULT_VALUE=&CLAY__LAYOUT_ELEMENT_TREE_NODE_DEFAULT +// __GENERATED__ template array_define,array_allocate,array_add,array_get TYPE=Clay__LayoutElementTreeNode NAME=Clay__LayoutElementTreeNodeArray DEFAULT_VALUE=&CLAY__LAYOUT_ELEMENT_TREE_NODE_DEFAULT #pragma region generated typedef struct { @@ -1196,7 +1298,6 @@ typedef struct uint32_t length; Clay__LayoutElementTreeNode *internalArray; } Clay__LayoutElementTreeNodeArray; - Clay__LayoutElementTreeNodeArray Clay__LayoutElementTreeNodeArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__LayoutElementTreeNodeArray){.capacity = capacity, .length = 0, .internalArray = (Clay__LayoutElementTreeNode *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay__LayoutElementTreeNode), CLAY__ALIGNMENT(Clay__LayoutElementTreeNode), arena)}; } @@ -1223,7 +1324,7 @@ typedef struct Clay__LayoutElementTreeRoot CLAY__LAYOUT_ELEMENT_TREE_ROOT_DEFAULT = CLAY__INIT(Clay__LayoutElementTreeRoot) {}; -// __GENERATED__ template array_define,array_add,array_get TYPE=Clay__LayoutElementTreeRoot NAME=Clay__LayoutElementTreeRootArray DEFAULT_VALUE=&CLAY__LAYOUT_ELEMENT_TREE_ROOT_DEFAULT +// __GENERATED__ template array_define,array_allocate,array_add,array_get TYPE=Clay__LayoutElementTreeRoot NAME=Clay__LayoutElementTreeRootArray DEFAULT_VALUE=&CLAY__LAYOUT_ELEMENT_TREE_ROOT_DEFAULT #pragma region generated typedef struct { @@ -1231,7 +1332,6 @@ typedef struct uint32_t length; Clay__LayoutElementTreeRoot *internalArray; } Clay__LayoutElementTreeRootArray; - Clay__LayoutElementTreeRootArray Clay__LayoutElementTreeRootArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__LayoutElementTreeRootArray){.capacity = capacity, .length = 0, .internalArray = (Clay__LayoutElementTreeRoot *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay__LayoutElementTreeRoot), CLAY__ALIGNMENT(Clay__LayoutElementTreeRoot), arena)}; } @@ -1248,7 +1348,7 @@ Clay__LayoutElementTreeRoot *Clay__LayoutElementTreeRootArray_Get(Clay__LayoutEl #pragma endregion // __GENERATED__ template -// __GENERATED__ template array_define TYPE=uint8_t NAME=Clay__CharArray DEFAULT_VALUE=0 +// __GENERATED__ template array_define,array_allocate TYPE=uint8_t NAME=Clay__CharArray DEFAULT_VALUE=0 #pragma region generated typedef struct { @@ -1256,7 +1356,6 @@ typedef struct uint32_t length; uint8_t *internalArray; } Clay__CharArray; - Clay__CharArray Clay__CharArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { return CLAY__INIT(Clay__CharArray){.capacity = capacity, .length = 0, .internalArray = (uint8_t *)Clay__Array_Allocate_Arena(capacity, sizeof(uint8_t), CLAY__ALIGNMENT(uint8_t), arena)}; } @@ -1271,43 +1370,7 @@ Clay_String Clay__WriteStringToCharBuffer(Clay__CharArray *buffer, Clay_String s return CLAY__INIT(Clay_String) { .length = string.length, .chars = (const char *)(buffer->internalArray + buffer->length - string.length) }; } -// __GENERATED__ template array_define,array_add TYPE=Clay_String NAME=Clay__StringArray DEFAULT_VALUE=&CLAY__STRING_DEFAULT -#pragma region generated -typedef struct -{ - uint32_t capacity; - uint32_t length; - Clay_String *internalArray; -} Clay__StringArray; - -Clay__StringArray Clay__StringArray_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { - return CLAY__INIT(Clay__StringArray){.capacity = capacity, .length = 0, .internalArray = (Clay_String *)Clay__Array_Allocate_Arena(capacity, sizeof(Clay_String), CLAY__ALIGNMENT(Clay_String), arena)}; -} -Clay_String *Clay__StringArray_Add(Clay__StringArray *array, Clay_String item) { - if (Clay__Array_IncrementCapacityCheck(array->length, array->capacity)) { - array->internalArray[array->length++] = item; - return &array->internalArray[array->length - 1]; - } - return &CLAY__STRING_DEFAULT; -} -#pragma endregion -// __GENERATED__ template - -typedef enum -{ - CLAY__POINTER_INFO_PRESSED_THIS_FRAME, - CLAY__POINTER_INFO_PRESSED, - CLAY__POINTER_INFO_RELEASED_THIS_FRAME, - CLAY__POINTER_INFO_RELEASED, -} Clay__PointerInfoMouseDownState; - -typedef struct -{ - Clay_Vector2 position; - Clay__PointerInfoMouseDownState state; -} Clay__PointerInfo; - -Clay__PointerInfo Clay__pointerInfo = CLAY__INIT(Clay__PointerInfo) { .position = {-1, -1} }; +Clay_PointerInfo Clay__pointerInfo = CLAY__INIT(Clay_PointerInfo) { .position = {-1, -1} }; Clay_Dimensions Clay__layoutDimensions = CLAY__INIT(Clay_Dimensions){}; Clay_ElementId Clay__dynamicElementIndexBaseHash = CLAY__INIT(Clay_ElementId) { .id = 128476991, .stringId = { .length = 8, .chars = "Auto ID" } }; uint32_t Clay__dynamicElementIndex = 0; @@ -1321,14 +1384,16 @@ Clay_Arena Clay__internalArena; // Layout Elements / Render Commands Clay_LayoutElementArray Clay__layoutElements; Clay_RenderCommandArray Clay__renderCommands; -Clay__LayoutElementPointerArray Clay__openLayoutElementStack; +Clay__int32_tArray Clay__openLayoutElementStack; Clay__int32_tArray Clay__layoutElementChildren; Clay__int32_tArray Clay__layoutElementChildrenBuffer; Clay__TextElementDataArray Clay__textElementData; Clay__LayoutElementPointerArray Clay__imageElementPointers; -Clay__LayoutElementPointerArray Clay__layoutElementReusableBuffer; +Clay__int32_tArray Clay__reusableElementIndexBuffer; // Configs Clay__LayoutConfigArray Clay__layoutConfigs; +Clay__ElementConfigArray Clay__elementConfigBuffer; +Clay__ElementConfigArray Clay__elementConfigs; Clay__RectangleElementConfigArray Clay__rectangleElementConfigs; Clay__TextElementConfigArray Clay__textElementConfigs; Clay__ImageElementConfigArray Clay__imageElementConfigs; @@ -1338,6 +1403,7 @@ Clay__CustomElementConfigArray Clay__customElementConfigs; Clay__BorderElementConfigArray Clay__borderElementConfigs; // Misc Data Structures Clay__StringArray Clay__layoutElementIdStrings; +Clay__StringArray Clay__wrappedTextLines; Clay__LayoutElementTreeNodeArray Clay__layoutElementTreeNodeArray1; Clay__LayoutElementTreeRootArray Clay__layoutElementTreeRoots; Clay__LayoutElementHashMapItemArray Clay__layoutElementsHashMapInternal; @@ -1345,9 +1411,9 @@ Clay__int32_tArray Clay__layoutElementsHashMap; Clay__MeasureTextCacheItemArray Clay__measureTextHashMapInternal; Clay__int32_tArray Clay__measureTextHashMapInternalFreeList; Clay__int32_tArray Clay__measureTextHashMap; +Clay__MeasuredWordArray Clay__measuredWords; Clay__int32_tArray Clay__openClipElementStack; Clay__ElementIdArray Clay__pointerOverIds; -Clay__int32_tArray Clay__reusableElementIndexBuffer; Clay__ScrollContainerDataInternalArray Clay__scrollContainerDatas; Clay__BoolArray Clay__treeNodeVisited; Clay__CharArray Clay__dynamicStringData; @@ -1359,7 +1425,35 @@ Clay__DebugElementDataArray Clay__debugElementData; Clay_Dimensions (*Clay__MeasureText)(Clay_String *text, Clay_TextElementConfig *config); #endif -Clay_String LAST_HASH; +Clay_LayoutElement* Clay__GetOpenLayoutElement() { + return Clay_LayoutElementArray_Get(&Clay__layoutElements, Clay__int32_tArray_Get(&Clay__openLayoutElementStack, Clay__openLayoutElementStack.length - 1)); +} + +bool Clay__ElementHasConfig(Clay_LayoutElement *element, Clay__ElementConfigType type) { + return (element->configsEnabled & type); +} + +Clay_ElementConfigUnion Clay__FindElementConfigWithType(Clay_LayoutElement *element, Clay__ElementConfigType type) { + for (int i = 0; i < element->elementConfigs.length; i++) { + Clay_ElementConfig *config = Clay__ElementConfigArraySlice_Get(&element->elementConfigs, i); + if (config->type == type) { + return config->config; + } + } + return CLAY__INIT(Clay_ElementConfigUnion) { NULL }; +} + +Clay_ElementId Clay__HashNumber(const uint32_t offset, const uint32_t seed) { + uint32_t hash = seed; + hash += (offset + 48); + hash += (hash << 10); + hash ^= (hash >> 6); + + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + return CLAY__INIT(Clay_ElementId) { .id = hash + 1, .offset = offset, .baseId = seed, .stringId = CLAY__STRING_DEFAULT }; // Reserve the hash result of zero as "null id" +} Clay_ElementId Clay__HashString(Clay_String key, const uint32_t offset, const uint32_t seed) { uint32_t hash = 0; @@ -1381,17 +1475,9 @@ Clay_ElementId Clay__HashString(Clay_String key, const uint32_t offset, const ui base ^= (base >> 11); hash += (hash << 15); base += (base << 15); - #ifdef CLAY_DEBUG - LAST_HASH = key; - LAST_HASH.length = (int)offset; - #endif return CLAY__INIT(Clay_ElementId) { .id = hash + 1, .offset = offset, .baseId = base + 1, .stringId = key }; // Reserve the hash result of zero as "null id" } -uint32_t Clay__GetOpenLayoutElementId(void) { - return Clay__openLayoutElement ? Clay__openLayoutElement->id : 0; -} - Clay_ElementId Clay__Rehash(Clay_ElementId elementId, uint32_t number) { uint32_t id = elementId.baseId; id += number; @@ -1416,10 +1502,6 @@ uint32_t Clay__RehashWithNumber(uint32_t id, uint32_t number) { } uint32_t Clay__HashTextWithConfig(Clay_String *text, Clay_TextElementConfig *config) { - union { - float fontSize; - uint32_t bits; - } fontSizeBits = { .fontSize = (float)config->fontSize }; uint32_t hash = 0; uint64_t pointerAsNumber = (uint64_t)text->chars; @@ -1431,11 +1513,8 @@ uint32_t Clay__HashTextWithConfig(Clay_String *text, Clay_TextElementConfig *con hash += (hash << 10); hash ^= (hash >> 6); - hash += config->fontId; - hash += (hash << 10); - hash ^= (hash >> 6); - - hash += fontSizeBits.bits; + uint64_t configPointerAsNumber = (uint64_t)config; + hash += configPointerAsNumber; hash += (hash << 10); hash ^= (hash >> 6); @@ -1445,7 +1524,7 @@ uint32_t Clay__HashTextWithConfig(Clay_String *text, Clay_TextElementConfig *con return hash + 1; // Reserve the hash result of zero as "null id" } -Clay_Dimensions Clay__MeasureTextCached(Clay_String *text, Clay_TextElementConfig *config) { +Clay__MeasureTextCacheItem *Clay__MeasureTextCached(Clay_String *text, Clay_TextElementConfig *config) { uint32_t id = Clay__HashTextWithConfig(text, config); uint32_t hashBucket = id % Clay__measureTextHashMap.capacity; int32_t elementIndexPrevious = 0; @@ -1454,7 +1533,7 @@ Clay_Dimensions Clay__MeasureTextCached(Clay_String *text, Clay_TextElementConfi Clay__MeasureTextCacheItem *hashEntry = Clay__MeasureTextCacheItemArray_Get(&Clay__measureTextHashMapInternal, elementIndex); if (hashEntry->id == id) { hashEntry->generation = Clay__generation; - return hashEntry->dimensions; + return hashEntry; } // This element hasn't been seen in a few frames, delete the hash map item if (Clay__generation - hashEntry->generation > 2) { @@ -1473,19 +1552,61 @@ Clay_Dimensions Clay__MeasureTextCached(Clay_String *text, Clay_TextElementConfi elementIndex = hashEntry->nextIndex; } } - Clay_Dimensions measured = Clay__MeasureText(text, config); + uint32_t newItemIndex = 0; + Clay__MeasureTextCacheItem newCacheItem = CLAY__INIT(Clay__MeasureTextCacheItem) { .measuredWords = CLAY__INIT(Clay__MeasuredWordArraySlice) { .length = 0, .internalArray = &Clay__measuredWords.internalArray[Clay__measuredWords.length] }, .id = id, .generation = Clay__generation }; + Clay__MeasureTextCacheItem *measured = NULL; if (Clay__measureTextHashMapInternalFreeList.length > 0) { newItemIndex = Clay__int32_tArray_Get(&Clay__measureTextHashMapInternalFreeList, Clay__measureTextHashMapInternalFreeList.length - 1); Clay__measureTextHashMapInternalFreeList.length--; - Clay__MeasureTextCacheItemArray_Set(&Clay__measureTextHashMapInternal, newItemIndex, CLAY__INIT(Clay__MeasureTextCacheItem) { .dimensions = measured, .id = id, .generation = Clay__generation }); + Clay__MeasureTextCacheItemArray_Set(&Clay__measureTextHashMapInternal, newItemIndex, newCacheItem); + measured = Clay__MeasureTextCacheItemArray_Get(&Clay__measureTextHashMapInternal, newItemIndex); } else { if (Clay__measureTextHashMapInternal.length == Clay__measureTextHashMapInternal.capacity) { - return measured; + return NULL; } - Clay__MeasureTextCacheItemArray_Add(&Clay__measureTextHashMapInternal, CLAY__INIT(Clay__MeasureTextCacheItem) { .dimensions = measured, .id = id, .generation = Clay__generation }); + measured = Clay__MeasureTextCacheItemArray_Add(&Clay__measureTextHashMapInternal, newCacheItem); newItemIndex = Clay__measureTextHashMapInternal.length - 1; } + + uint32_t start = 0; + uint32_t end = 0; + float measuredWidth = 0; + float measuredHeight = 0; + float spaceWidth = Clay__MeasureText(&CLAY__SPACECHAR, config).width; + while (end < text->length) { + char current = text->chars[end]; + if (current == ' ' || current == '\n') { + uint32_t length = end - start; + Clay_String word = CLAY__INIT(Clay_String) { .length = (int)length, .chars = &text->chars[start] }; + Clay_Dimensions dimensions = Clay__MeasureText(&word, config); + if (current == ' ') { + dimensions.width += spaceWidth; + Clay__MeasuredWordArray_Add(&Clay__measuredWords, CLAY__INIT(Clay__MeasuredWord) { .word = word, .startOffset = start, .length = length + 1, .width = dimensions.width }); + } + if (current == '\n') { + Clay__MeasuredWordArray_Add(&Clay__measuredWords, CLAY__INIT(Clay__MeasuredWord) { .word = word, .startOffset = start, .length = length, .width = dimensions.width }); + Clay__MeasuredWordArray_Add(&Clay__measuredWords, CLAY__INIT(Clay__MeasuredWord) { .word = CLAY__INIT(Clay_String) { .length = 0, .chars = &text->chars[end] }, .startOffset = end + 1, .length = 0, .width = 0 }); + measured->measuredWords.length++; + } + measuredWidth += dimensions.width; + measuredHeight = dimensions.height; + measured->measuredWords.length++; + start = end + 1; + } + end++; + } + if (end - start > 0) { + Clay_String lastWord = CLAY__INIT(Clay_String) { .length = (int)(end - start), .chars = &text->chars[start] }; + Clay_Dimensions dimensions = Clay__MeasureText(&lastWord, config); + Clay__MeasuredWordArray_Add(&Clay__measuredWords, CLAY__INIT(Clay__MeasuredWord) { .word = lastWord, .startOffset = start, .length = end - start, .width = dimensions.width }); + measuredWidth += dimensions.width; + measuredHeight = dimensions.height; + measured->measuredWords.length++; + } + measured->unwrappedDimensions.width = measuredWidth; + measured->unwrappedDimensions.height = measuredHeight; + if (elementIndexPrevious != 0) { Clay__MeasureTextCacheItemArray_Get(&Clay__measureTextHashMapInternal, elementIndexPrevious)->nextIndex = newItemIndex; } else { @@ -1547,191 +1668,219 @@ Clay_LayoutElementHashMapItem *Clay__GetHashMapItem(uint32_t id) { return CLAY__NULL; } -Clay_LayoutElement *Clay__OpenElementWithParent(Clay_ElementId elementId, Clay__LayoutElementType commandType, Clay_LayoutConfig* layoutConfig, Clay_ElementConfigUnion elementConfig) { - Clay_LayoutElement layoutElement = CLAY__INIT(Clay_LayoutElement) { - #ifdef CLAY_DEBUG - .name = elementId.stringId, - #endif - .children = CLAY__INIT(Clay__LayoutElementChildren) { .length = 0 }, - .minDimensions = CLAY__INIT(Clay_Dimensions) { (float)layoutConfig->padding.x * 2, (float)layoutConfig->padding.y * 2 }, - .layoutConfig = layoutConfig, - .elementConfig = elementConfig, - .id = elementId.id, - .elementType = commandType, - }; - - Clay__openLayoutElement = Clay_LayoutElementArray_Add(&Clay__layoutElements, layoutElement); - Clay__LayoutElementPointerArray_Add(&Clay__openLayoutElementStack, Clay__openLayoutElement); - Clay__AddHashMapItem(elementId, Clay__openLayoutElement); +void Clay__GenerateIdForAnonymousElement(Clay_LayoutElement *openLayoutElement) { + Clay_LayoutElement *parentElement = Clay_LayoutElementArray_Get(&Clay__layoutElements, Clay__int32_tArray_Get(&Clay__openLayoutElementStack, Clay__openLayoutElementStack.length - 2)); + Clay_ElementId elementId = Clay__HashNumber(parentElement->children.length, parentElement->id); + openLayoutElement->id = elementId.id; + Clay__AddHashMapItem(elementId, openLayoutElement); Clay__StringArray_Add(&Clay__layoutElementIdStrings, elementId.stringId); - return Clay__openLayoutElement; + #ifdef CLAY_DEBUG + openLayoutElement->name = elementId.stringId; + #endif } -Clay_LayoutElement *Clay__OpenElement(Clay_ElementId id, Clay__LayoutElementType commandType, Clay_LayoutConfig *layoutConfig, Clay_ElementConfigUnion elementConfig) { - Clay__openLayoutElement->children.length++; - Clay_LayoutElement *element = Clay__OpenElementWithParent(id, commandType, layoutConfig, elementConfig); - Clay__int32_tArray_Add(&Clay__layoutElementChildrenBuffer, (int32_t)Clay__layoutElements.length - 1); - return element; -} +void Clay__ElementPostConfiguration() { + Clay_LayoutElement *openLayoutElement = Clay__GetOpenLayoutElement(); + // ID + if (openLayoutElement->id == 0) { + Clay__GenerateIdForAnonymousElement(openLayoutElement); + } + // Layout Config + if (!openLayoutElement->layoutConfig) { + openLayoutElement->layoutConfig = &CLAY_LAYOUT_DEFAULT; + } -void Clay__OpenContainerElement(Clay_ElementId id, Clay_LayoutConfig *layoutConfig) { - Clay__OpenElement(id, CLAY__LAYOUT_ELEMENT_TYPE_CONTAINER, layoutConfig, CLAY__INIT(Clay_ElementConfigUnion) { CLAY__NULL }); -} - -void Clay__OpenRectangleElement(Clay_ElementId id, Clay_LayoutConfig *layoutConfig, Clay_RectangleElementConfig *rectangleConfig) { - Clay__OpenElement(id, CLAY__LAYOUT_ELEMENT_TYPE_RECTANGLE, layoutConfig, CLAY__INIT(Clay_ElementConfigUnion) { .rectangleElementConfig = rectangleConfig }); -} - -void Clay__OpenImageElement(Clay_ElementId id, Clay_LayoutConfig *layoutConfig, Clay_ImageElementConfig *imageConfig) { - Clay__OpenElement(id, CLAY__LAYOUT_ELEMENT_TYPE_IMAGE, layoutConfig, CLAY__INIT(Clay_ElementConfigUnion) { .imageElementConfig = imageConfig }); - Clay__LayoutElementPointerArray_Add(&Clay__imageElementPointers, Clay__openLayoutElement); -} - -void Clay__OpenBorderElement(Clay_ElementId id, Clay_LayoutConfig *layoutConfig, Clay_BorderElementConfig *borderConfig) { - Clay__OpenElement(id, CLAY__LAYOUT_ELEMENT_TYPE_BORDER_CONTAINER, layoutConfig, CLAY__INIT(Clay_ElementConfigUnion) { .borderElementConfig = borderConfig }); -} - -void Clay__OpenCustomElement(Clay_ElementId id, Clay_LayoutConfig *layoutConfig, Clay_CustomElementConfig *customConfig) { - Clay__OpenElement(id, CLAY__LAYOUT_ELEMENT_TYPE_CUSTOM, layoutConfig, CLAY__INIT(Clay_ElementConfigUnion) { .customElementConfig = customConfig }); -} - -void Clay__OpenScrollElement(Clay_ElementId elementId, Clay_LayoutConfig *layoutConfig, Clay_ScrollElementConfig *scrollConfig) { - Clay_LayoutElement *scrollElement = Clay__OpenElement(elementId, CLAY__LAYOUT_ELEMENT_TYPE_SCROLL_CONTAINER, layoutConfig, CLAY__INIT(Clay_ElementConfigUnion) { .scrollElementConfig = scrollConfig }); - Clay__int32_tArray_Add(&Clay__openClipElementStack, (int)scrollElement->id); - Clay__ScrollContainerDataInternal *scrollOffset = CLAY__NULL; - for (int i = 0; i < Clay__scrollContainerDatas.length; i++) { - Clay__ScrollContainerDataInternal *mapping = Clay__ScrollContainerDataInternalArray_Get(&Clay__scrollContainerDatas, i); - if (elementId.id == mapping->elementId) { - scrollOffset = mapping; - scrollOffset->layoutElement = scrollElement; - scrollOffset->openThisFrame = true; + // Loop through element configs and handle special cases + openLayoutElement->elementConfigs.internalArray = &Clay__elementConfigs.internalArray[Clay__elementConfigs.length]; + for (int elementConfigIndex = 0; elementConfigIndex < openLayoutElement->elementConfigs.length; elementConfigIndex++) { + Clay_ElementConfig *config = Clay__ElementConfigArray_Add(&Clay__elementConfigs, *Clay__ElementConfigArray_Get(&Clay__elementConfigBuffer, Clay__elementConfigBuffer.length - openLayoutElement->elementConfigs.length + elementConfigIndex)); + openLayoutElement->configsEnabled |= config->type; + switch (config->type) { + case CLAY__ELEMENT_CONFIG_TYPE_RECTANGLE: break; + case CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER: break; + case CLAY__ELEMENT_CONFIG_TYPE_FLOATING_CONTAINER: { + Clay_FloatingElementConfig *floatingConfig = config->config.floatingElementConfig; + // This looks dodgy but because of the auto generated root element the depth of the tree will always be at least 2 here + Clay_LayoutElement *hierarchicalParent = Clay_LayoutElementArray_Get(&Clay__layoutElements, Clay__int32_tArray_Get(&Clay__openLayoutElementStack, Clay__openLayoutElementStack.length - 2)); + if (!hierarchicalParent) { + break; + } + int clipElementId = 0; + if (floatingConfig->parentId == 0) { + // If no parent id was specified, attach to the elements direct hierarchical parent + Clay_FloatingElementConfig newConfig = *floatingConfig; + newConfig.parentId = hierarchicalParent->id; + floatingConfig = Clay__FloatingElementConfigArray_Add(&Clay__floatingElementConfigs, newConfig); + config->config.floatingElementConfig = floatingConfig; + if (Clay__openClipElementStack.length > 0) { + clipElementId = Clay__int32_tArray_Get(&Clay__openClipElementStack, (int)Clay__openClipElementStack.length - 1); + } + } else { + Clay_LayoutElementHashMapItem *parentItem = Clay__GetHashMapItem(floatingConfig->parentId); + if (!parentItem) { + Clay__WarningArray_Add(&Clay_warnings, CLAY__INIT(Clay__Warning) { CLAY_STRING("Clay Warning: Couldn't find parent container to attach floating container to.") }); + } + } + Clay__LayoutElementTreeRootArray_Add(&Clay__layoutElementTreeRoots, CLAY__INIT(Clay__LayoutElementTreeRoot) { + .layoutElementIndex = (uint32_t)Clay__int32_tArray_Get(&Clay__openLayoutElementStack, Clay__openLayoutElementStack.length - 1), + .parentId = floatingConfig->parentId, + .clipElementId = (uint32_t)clipElementId, + .zIndex = floatingConfig->zIndex, + }); + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER: { + Clay__int32_tArray_Add(&Clay__openClipElementStack, (int)openLayoutElement->id); + // Retrieve or create cached data to track scroll position across frames + Clay__ScrollContainerDataInternal *scrollOffset = CLAY__NULL; + for (int i = 0; i < Clay__scrollContainerDatas.length; i++) { + Clay__ScrollContainerDataInternal *mapping = Clay__ScrollContainerDataInternalArray_Get(&Clay__scrollContainerDatas, i); + if (openLayoutElement->id == mapping->elementId) { + scrollOffset = mapping; + scrollOffset->layoutElement = openLayoutElement; + scrollOffset->openThisFrame = true; + } + } + if (!scrollOffset) { + Clay__ScrollContainerDataInternalArray_Add(&Clay__scrollContainerDatas, CLAY__INIT(Clay__ScrollContainerDataInternal){.layoutElement = openLayoutElement, .scrollOrigin = {-1,-1}, .elementId = openLayoutElement->id, .openThisFrame = true}); + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_CUSTOM: break; + case CLAY__ELEMENT_CONFIG_TYPE_IMAGE: { + Clay__LayoutElementPointerArray_Add(&Clay__imageElementPointers, openLayoutElement); + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_TEXT: break; } } - if (!scrollOffset) { - Clay__ScrollContainerDataInternalArray_Add(&Clay__scrollContainerDatas, CLAY__INIT(Clay__ScrollContainerDataInternal){.layoutElement = scrollElement, .scrollOrigin = {-1,-1}, .elementId = elementId.id, .openThisFrame = true}); - } -} - -void Clay__OpenFloatingElement(Clay_ElementId id, Clay_LayoutConfig *layoutConfig, Clay_FloatingElementConfig *floatingConfig) { - Clay_LayoutElement *parent = Clay__openLayoutElement; - uint32_t originalParentId = floatingConfig->parentId; - if (floatingConfig->parentId == 0) { - Clay_FloatingElementConfig newConfig = *floatingConfig; - newConfig.parentId = Clay__openLayoutElement->id; - floatingConfig = Clay__FloatingElementConfigArray_Add(&Clay__floatingElementConfigs, newConfig); - } else { - Clay_LayoutElementHashMapItem *parentItem = Clay__GetHashMapItem(floatingConfig->parentId); - if (!parentItem) { - Clay__WarningArray_Add(&Clay_warnings, CLAY__INIT(Clay__Warning) { CLAY_STRING("Clay Warning: Couldn't find parent container to attach floating container to.") }); - } else { - parent = parentItem->layoutElement; - } - } - Clay__OpenElementWithParent(id, CLAY__LAYOUT_ELEMENT_TYPE_FLOATING_CONTAINER, layoutConfig, CLAY__INIT(Clay_ElementConfigUnion) { .floatingElementConfig = floatingConfig }); - Clay__LayoutElementTreeRootArray_Add(&Clay__layoutElementTreeRoots, CLAY__INIT(Clay__LayoutElementTreeRoot) { - .layoutElementIndex = Clay__layoutElements.length - 1, - .parentId = parent->id, - .clipElementId = (uint32_t)(originalParentId == 0 ? (Clay__openClipElementStack.length > 0 ? Clay__int32_tArray_Get(&Clay__openClipElementStack, (int)Clay__openClipElementStack.length - 1) : 0) : 0), - .zIndex = floatingConfig->zIndex, - }); -} - -void Clay__AttachContainerChildren() { - Clay_LayoutConfig *layoutConfig = Clay__openLayoutElement->layoutConfig; - Clay__openLayoutElement->children.elements = &Clay__layoutElementChildren.internalArray[Clay__layoutElementChildren.length]; - - if (layoutConfig->layoutDirection == CLAY_LEFT_TO_RIGHT) { - for (int i = 0; i < Clay__openLayoutElement->children.length; i++) { - int32_t childIndex = Clay__int32_tArray_Get(&Clay__layoutElementChildrenBuffer, (int)Clay__layoutElementChildrenBuffer.length - Clay__openLayoutElement->children.length + i); - Clay_LayoutElement *child = Clay_LayoutElementArray_Get(&Clay__layoutElements, childIndex); - Clay__openLayoutElement->dimensions.width += child->dimensions.width; - Clay__openLayoutElement->dimensions.height = CLAY__MAX(Clay__openLayoutElement->dimensions.height, child->dimensions.height); - // Minimum size of child elements doesn't matter to scroll containers as they can shrink and hide their contents - if (Clay__openLayoutElement->elementType != CLAY__LAYOUT_ELEMENT_TYPE_SCROLL_CONTAINER || !Clay__openLayoutElement->elementConfig.scrollElementConfig->horizontal) { - Clay__openLayoutElement->minDimensions.width += child->minDimensions.width; - } - if (Clay__openLayoutElement->elementType != CLAY__LAYOUT_ELEMENT_TYPE_SCROLL_CONTAINER || !Clay__openLayoutElement->elementConfig.scrollElementConfig->vertical) { - Clay__openLayoutElement->minDimensions.height = CLAY__MAX(Clay__openLayoutElement->minDimensions.height, child->minDimensions.height); - } - Clay__int32_tArray_Add(&Clay__layoutElementChildren, childIndex); - } - float childGap = (float)(CLAY__MAX(Clay__openLayoutElement->children.length - 1, 0) * layoutConfig->childGap); - Clay__openLayoutElement->dimensions.width += childGap; - Clay__openLayoutElement->minDimensions.width += childGap; - } - else if (layoutConfig->layoutDirection == CLAY_TOP_TO_BOTTOM) { - for (int i = 0; i < Clay__openLayoutElement->children.length; i++) { - int32_t childIndex = Clay__int32_tArray_Get(&Clay__layoutElementChildrenBuffer, (int)Clay__layoutElementChildrenBuffer.length - Clay__openLayoutElement->children.length + i); - Clay_LayoutElement *child = Clay_LayoutElementArray_Get(&Clay__layoutElements, childIndex); - Clay__openLayoutElement->dimensions.height += child->dimensions.height; - Clay__openLayoutElement->dimensions.width = CLAY__MAX(Clay__openLayoutElement->dimensions.width, child->dimensions.width); - // Minimum size of child elements doesn't matter to scroll containers as they can shrink and hide their contents - if (Clay__openLayoutElement->elementType != CLAY__LAYOUT_ELEMENT_TYPE_SCROLL_CONTAINER || !Clay__openLayoutElement->elementConfig.scrollElementConfig->vertical) { - Clay__openLayoutElement->minDimensions.height += child->minDimensions.height; - } - if (Clay__openLayoutElement->elementType != CLAY__LAYOUT_ELEMENT_TYPE_SCROLL_CONTAINER || !Clay__openLayoutElement->elementConfig.scrollElementConfig->horizontal) { - Clay__openLayoutElement->minDimensions.width = CLAY__MAX(Clay__openLayoutElement->minDimensions.width, child->minDimensions.width); - } - Clay__int32_tArray_Add(&Clay__layoutElementChildren, childIndex); - } - float childGap = (float)(CLAY__MAX(Clay__openLayoutElement->children.length - 1, 0) * layoutConfig->childGap); - Clay__openLayoutElement->dimensions.height += childGap; - Clay__openLayoutElement->minDimensions.height += childGap; - } - - Clay__layoutElementChildrenBuffer.length -= Clay__openLayoutElement->children.length; + Clay__elementConfigBuffer.length -= openLayoutElement->elementConfigs.length; } void Clay__CloseElement() { - Clay_LayoutConfig *layoutConfig = Clay__openLayoutElement->layoutConfig; + Clay_LayoutElement *openLayoutElement = Clay__GetOpenLayoutElement(); + Clay_LayoutConfig *layoutConfig = openLayoutElement->layoutConfig; + bool elementHasScrollHorizontal = false; + bool elementHasScrollVertical = false; + if (Clay__ElementHasConfig(openLayoutElement, CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER)) { + Clay_ScrollElementConfig *scrollConfig = Clay__FindElementConfigWithType(openLayoutElement, CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER).scrollElementConfig; + elementHasScrollHorizontal = scrollConfig->horizontal; + elementHasScrollVertical = scrollConfig->vertical; + Clay__openClipElementStack.length--; + } + // Attach children to the current open element + openLayoutElement->children.elements = &Clay__layoutElementChildren.internalArray[Clay__layoutElementChildren.length]; + if (layoutConfig->layoutDirection == CLAY_LEFT_TO_RIGHT) { + openLayoutElement->dimensions.width = layoutConfig->padding.x * 2; + for (int i = 0; i < openLayoutElement->children.length; i++) { + int32_t childIndex = Clay__int32_tArray_Get(&Clay__layoutElementChildrenBuffer, (int)Clay__layoutElementChildrenBuffer.length - openLayoutElement->children.length + i); + Clay_LayoutElement *child = Clay_LayoutElementArray_Get(&Clay__layoutElements, childIndex); + openLayoutElement->dimensions.width += child->dimensions.width; + openLayoutElement->dimensions.height = CLAY__MAX(openLayoutElement->dimensions.height, child->dimensions.height + layoutConfig->padding.y * 2); + // Minimum size of child elements doesn't matter to scroll containers as they can shrink and hide their contents + if (!elementHasScrollHorizontal) { + openLayoutElement->minDimensions.width += child->minDimensions.width; + } + if (!elementHasScrollVertical) { + openLayoutElement->minDimensions.height = CLAY__MAX(openLayoutElement->minDimensions.height, child->minDimensions.height + layoutConfig->padding.y * 2); + } + Clay__int32_tArray_Add(&Clay__layoutElementChildren, childIndex); + } + float childGap = (float)(CLAY__MAX(openLayoutElement->children.length - 1, 0) * layoutConfig->childGap); + openLayoutElement->dimensions.width += childGap; // TODO this is technically a bug with childgap and scroll containers + openLayoutElement->minDimensions.width += childGap; + } + else if (layoutConfig->layoutDirection == CLAY_TOP_TO_BOTTOM) { + openLayoutElement->dimensions.height = layoutConfig->padding.y * 2; + for (int i = 0; i < openLayoutElement->children.length; i++) { + int32_t childIndex = Clay__int32_tArray_Get(&Clay__layoutElementChildrenBuffer, (int)Clay__layoutElementChildrenBuffer.length - openLayoutElement->children.length + i); + Clay_LayoutElement *child = Clay_LayoutElementArray_Get(&Clay__layoutElements, childIndex); + openLayoutElement->dimensions.height += child->dimensions.height; + openLayoutElement->dimensions.width = CLAY__MAX(openLayoutElement->dimensions.width, child->dimensions.width + layoutConfig->padding.x * 2); + // Minimum size of child elements doesn't matter to scroll containers as they can shrink and hide their contents + if (!elementHasScrollVertical) { + openLayoutElement->minDimensions.height += child->minDimensions.height; + } + if (!elementHasScrollHorizontal) { + openLayoutElement->minDimensions.width = CLAY__MAX(openLayoutElement->minDimensions.width, child->minDimensions.width + layoutConfig->padding.x * 2); + } + Clay__int32_tArray_Add(&Clay__layoutElementChildren, childIndex); + } + float childGap = (float)(CLAY__MAX(openLayoutElement->children.length - 1, 0) * layoutConfig->childGap); + openLayoutElement->dimensions.height += childGap; // TODO this is technically a bug with childgap and scroll containers + openLayoutElement->minDimensions.height += childGap; + } + + Clay__layoutElementChildrenBuffer.length -= openLayoutElement->children.length; + + // Clamp element min and max width to the values configured in the layout if (layoutConfig->sizing.width.type != CLAY__SIZING_TYPE_PERCENT) { if (layoutConfig->sizing.width.sizeMinMax.max <= 0) { // Set the max size if the user didn't specify, makes calculations easier layoutConfig->sizing.width.sizeMinMax.max = CLAY__MAXFLOAT; } - Clay__openLayoutElement->dimensions.width += (float)layoutConfig->padding.x * 2; - Clay__openLayoutElement->dimensions.width = CLAY__MAX(CLAY__MIN(layoutConfig->sizing.width.sizeMinMax.max, Clay__openLayoutElement->dimensions.width), layoutConfig->sizing.width.sizeMinMax.min); - Clay__openLayoutElement->minDimensions.width += (float)layoutConfig->padding.x * 2; - Clay__openLayoutElement->minDimensions.width = CLAY__MAX(CLAY__MIN(layoutConfig->sizing.width.sizeMinMax.max, Clay__openLayoutElement->minDimensions.width), layoutConfig->sizing.width.sizeMinMax.min); + openLayoutElement->dimensions.width = CLAY__MIN(CLAY__MAX(openLayoutElement->dimensions.width, layoutConfig->sizing.width.sizeMinMax.min), layoutConfig->sizing.width.sizeMinMax.max); + openLayoutElement->minDimensions.width = CLAY__MIN(CLAY__MAX(openLayoutElement->minDimensions.width, layoutConfig->sizing.width.sizeMinMax.min), layoutConfig->sizing.width.sizeMinMax.max); + } else { + openLayoutElement->dimensions.width = 0; } + + // Clamp element min and max height to the values configured in the layout if (layoutConfig->sizing.height.type != CLAY__SIZING_TYPE_PERCENT) { if (layoutConfig->sizing.height.sizeMinMax.max <= 0) { // Set the max size if the user didn't specify, makes calculations easier layoutConfig->sizing.height.sizeMinMax.max = CLAY__MAXFLOAT; } - Clay__openLayoutElement->dimensions.height += (float)layoutConfig->padding.y * 2; - Clay__openLayoutElement->dimensions.height = CLAY__MAX(CLAY__MIN(layoutConfig->sizing.height.sizeMinMax.max, Clay__openLayoutElement->dimensions.height), layoutConfig->sizing.height.sizeMinMax.min); - Clay__openLayoutElement->minDimensions.height += (float)layoutConfig->padding.x * 2; - Clay__openLayoutElement->minDimensions.height = CLAY__MAX(CLAY__MIN(layoutConfig->sizing.height.sizeMinMax.max, Clay__openLayoutElement->minDimensions.height), layoutConfig->sizing.height.sizeMinMax.min); + openLayoutElement->dimensions.height = CLAY__MIN(CLAY__MAX(openLayoutElement->dimensions.height, layoutConfig->sizing.height.sizeMinMax.min), layoutConfig->sizing.height.sizeMinMax.max); + openLayoutElement->minDimensions.height = CLAY__MIN(CLAY__MAX(openLayoutElement->minDimensions.height, layoutConfig->sizing.height.sizeMinMax.min), layoutConfig->sizing.height.sizeMinMax.max); + } else { + openLayoutElement->dimensions.height = 0; } - Clay__LayoutElementPointerArray_RemoveSwapback(&Clay__openLayoutElementStack, (int)Clay__openLayoutElementStack.length - 1); - Clay__openLayoutElement = *Clay__LayoutElementPointerArray_Get(&Clay__openLayoutElementStack, (int)Clay__openLayoutElementStack.length - 1); + bool elementIsFloating = Clay__ElementHasConfig(openLayoutElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING_CONTAINER); + + // Close the currently open element + int32_t closingElementIndex = Clay__int32_tArray_RemoveSwapback(&Clay__openLayoutElementStack, (int)Clay__openLayoutElementStack.length - 1); + openLayoutElement = Clay__GetOpenLayoutElement(); + + if (!elementIsFloating && Clay__openLayoutElementStack.length > 1) { + openLayoutElement->children.length++; + Clay__int32_tArray_Add(&Clay__layoutElementChildrenBuffer, closingElementIndex); + } } -void Clay__OpenTextElement(Clay_ElementId id, Clay_String text, Clay_TextElementConfig *textConfig) { - Clay_LayoutElement *internalElement = Clay__OpenElement(id, CLAY__LAYOUT_ELEMENT_TYPE_TEXT, &CLAY_LAYOUT_DEFAULT, CLAY__INIT(Clay_ElementConfigUnion) { .textElementConfig = textConfig }); - Clay_Dimensions textMeasured = Clay__MeasureTextCached(&text, textConfig); - internalElement->dimensions.width = textMeasured.width; - internalElement->dimensions.height = textMeasured.height; - internalElement->text = text; - internalElement->minDimensions = CLAY__INIT(Clay_Dimensions) { .width = textMeasured.height, .height = textMeasured.height }; // TODO not sure this is the best way to decide min width for text - Clay__TextElementDataArray_Add(&Clay__textElementData, CLAY__INIT(Clay__TextElementData) { .elementIndex = Clay__layoutElements.length - 1, .preferredDimensions = textMeasured }); - Clay__CloseElement(); +void Clay__OpenElement() { + Clay_LayoutElement layoutElement = CLAY__INIT(Clay_LayoutElement) {}; + Clay_LayoutElementArray_Add(&Clay__layoutElements, layoutElement); + Clay__int32_tArray_Add(&Clay__openLayoutElementStack, Clay__layoutElements.length - 1); } -void Clay__CloseElementWithChildren() { - Clay__AttachContainerChildren(); - Clay__CloseElement(); -} +void Clay__OpenTextElement(Clay_String text, Clay_TextElementConfig *textConfig) { + Clay_LayoutElement *parentElement = Clay__GetOpenLayoutElement(); + parentElement->children.length++; -void Clay__CloseScrollElement() { - Clay__openClipElementStack.length--; - Clay__CloseElementWithChildren(); -} - -void Clay__CloseFloatingElement() { - Clay__AttachContainerChildren(); - Clay__CloseElement(); + Clay__OpenElement(); + Clay_LayoutElement * openLayoutElement = Clay__GetOpenLayoutElement(); + Clay__int32_tArray_Add(&Clay__layoutElementChildrenBuffer, Clay__layoutElements.length - 1); + Clay__MeasureTextCacheItem *textMeasured = Clay__MeasureTextCached(&text, textConfig); + Clay_ElementId elementId = Clay__HashString(CLAY_STRING("Text"), parentElement->children.length, parentElement->id); + openLayoutElement->id = elementId.id; + #ifdef CLAY_DEBUG + openLayoutElement->name = CLAY_STRING("Text"); + #endif + Clay__AddHashMapItem(elementId, openLayoutElement); + Clay__StringArray_Add(&Clay__layoutElementIdStrings, elementId.stringId); + Clay_Dimensions textDimensions = CLAY__INIT(Clay_Dimensions) { .width = textMeasured->unwrappedDimensions.width, .height = textConfig->lineHeight > 0 ? textConfig->lineHeight : textMeasured->unwrappedDimensions.height }; + openLayoutElement->dimensions = textDimensions; + openLayoutElement->minDimensions = CLAY__INIT(Clay_Dimensions) { .width = textMeasured->unwrappedDimensions.height, .height = textDimensions.height }; // TODO not sure this is the best way to decide min width for text + openLayoutElement->textElementData = Clay__TextElementDataArray_Add(&Clay__textElementData, CLAY__INIT(Clay__TextElementData) { .text = text, .preferredDimensions = textMeasured->unwrappedDimensions, .elementIndex = Clay__layoutElements.length - 1 }); + openLayoutElement->elementConfigs = CLAY__INIT(Clay__ElementConfigArraySlice) { + .length = 1, + .internalArray = Clay__ElementConfigArray_Add(&Clay__elementConfigs, CLAY__INIT(Clay_ElementConfig) { .type = CLAY__ELEMENT_CONFIG_TYPE_TEXT, .config = { .textElementConfig = textConfig }}) + }; + openLayoutElement->configsEnabled |= CLAY__ELEMENT_CONFIG_TYPE_TEXT; + openLayoutElement->layoutConfig = &CLAY_LAYOUT_DEFAULT; + // Close the currently open element + Clay__int32_tArray_RemoveSwapback(&Clay__openLayoutElementStack, (int)Clay__openLayoutElementStack.length - 1); } void Clay__InitializeEphemeralMemory(Clay_Arena *arena) { @@ -1743,6 +1892,8 @@ void Clay__InitializeEphemeralMemory(Clay_Arena *arena) { Clay_warnings = Clay__WarningArray_Allocate_Arena(100, arena); Clay__layoutConfigs = Clay__LayoutConfigArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); + Clay__elementConfigBuffer = Clay__ElementConfigArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); + Clay__elementConfigs = Clay__ElementConfigArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); Clay__rectangleElementConfigs = Clay__RectangleElementConfigArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); Clay__textElementConfigs = Clay__TextElementConfigArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); Clay__imageElementConfigs = Clay__ImageElementConfigArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); @@ -1752,13 +1903,13 @@ void Clay__InitializeEphemeralMemory(Clay_Arena *arena) { Clay__borderElementConfigs = Clay__BorderElementConfigArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); Clay__layoutElementIdStrings = Clay__StringArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); + Clay__wrappedTextLines = Clay__StringArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); Clay__layoutElementTreeNodeArray1 = Clay__LayoutElementTreeNodeArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); Clay__layoutElementTreeRoots = Clay__LayoutElementTreeRootArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); Clay__layoutElementChildren = Clay__int32_tArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); - Clay__openLayoutElementStack = Clay__LayoutElementPointerArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); + Clay__openLayoutElementStack = Clay__int32_tArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); Clay__textElementData = Clay__TextElementDataArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); Clay__imageElementPointers = Clay__LayoutElementPointerArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); - Clay__layoutElementReusableBuffer = Clay__LayoutElementPointerArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); // TODO convert this to indexes instead of pointers Clay__renderCommands = Clay_RenderCommandArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); Clay__treeNodeVisited = Clay__BoolArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); Clay__treeNodeVisited.length = Clay__treeNodeVisited.capacity; // This array is accessed directly rather than behaving as a list @@ -1768,46 +1919,19 @@ void Clay__InitializeEphemeralMemory(Clay_Arena *arena) { } void Clay__InitializePersistentMemory(Clay_Arena *arena) { + // Persistent memory - initialized once and not reset Clay__scrollContainerDatas = Clay__ScrollContainerDataInternalArray_Allocate_Arena(10, arena); Clay__layoutElementsHashMapInternal = Clay__LayoutElementHashMapItemArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); Clay__layoutElementsHashMap = Clay__int32_tArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); Clay__measureTextHashMapInternal = Clay__MeasureTextCacheItemArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); Clay__measureTextHashMapInternalFreeList = Clay__int32_tArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); Clay__measureTextHashMap = Clay__int32_tArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); + Clay__measuredWords = Clay__MeasuredWordArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT * 2, arena); Clay__pointerOverIds = Clay__ElementIdArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); Clay__debugElementData = Clay__DebugElementDataArray_Allocate_Arena(CLAY_MAX_ELEMENT_COUNT, arena); Clay__arenaResetOffset = arena->nextAllocation; } -Clay_String Clay__IntToString(int integer) { - if (integer == 0) { - return CLAY__INIT(Clay_String) { .length = 1, .chars = "0" }; - } - char *chars = (char *)(Clay__dynamicStringData.internalArray + Clay__dynamicStringData.length); - int length = 0; - int sign = integer; - - if (integer < 0) { - integer = -integer; - } - while (integer > 0) { - chars[length++] = (char)(integer % 10 + '0'); - integer /= 10; - } - - if (sign < 0) { - chars[length++] = '-'; - } - - // Reverse the string to get the correct order - for (int j = 0, k = length - 1; j < k; j++, k--) { - char temp = chars[j]; - chars[j] = chars[k]; - chars[k] = temp; - } - Clay__dynamicStringData.length += length; - return CLAY__INIT(Clay_String) { .length = length, .chars = chars }; -} typedef enum { @@ -1816,21 +1940,18 @@ typedef enum CLAY__SIZE_DISTRIBUTION_TYPE_GROW_CONTAINER, } Clay__SizeDistributionType; -// Because of the max and min sizing properties, we can't predict ahead of time how (or if) all the excess width -// will actually be distributed. So we keep looping until either all the excess width is distributed or -// we have exhausted all our containers that can change size along this axis -float Clay__DistributeSizeAmongChildren(bool xAxis, float sizeToDistribute, Clay__LayoutElementPointerArray resizableContainerBuffer, Clay__SizeDistributionType distributionType) { - Clay__LayoutElementPointerArray remainingElements = Clay__layoutElementReusableBuffer; +float Clay__DistributeSizeAmongChildren(bool xAxis, float sizeToDistribute, Clay__int32_tArray resizableContainerBuffer, Clay__SizeDistributionType distributionType) { + Clay__int32_tArray remainingElements = Clay__openClipElementStack; remainingElements.length = 0; for (int i = 0; i < resizableContainerBuffer.length; ++i) { - Clay__LayoutElementPointerArray_Add(&remainingElements, *Clay__LayoutElementPointerArray_Get(&resizableContainerBuffer, i)); + Clay__int32_tArray_Add(&remainingElements, Clay__int32_tArray_Get(&resizableContainerBuffer, i)); } while (sizeToDistribute != 0 && remainingElements.length > 0) { float dividedSize = sizeToDistribute / (float)remainingElements.length; for (int childOffset = 0; childOffset < remainingElements.length; childOffset++) { - Clay_LayoutElement *childElement = *Clay__LayoutElementPointerArray_Get(&remainingElements, childOffset); + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&Clay__layoutElements, Clay__int32_tArray_Get(&remainingElements, childOffset)); Clay_SizingAxis childSizing = xAxis ? childElement->layoutConfig->sizing.width : childElement->layoutConfig->sizing.height; float *childSize = xAxis ? &childElement->dimensions.width : &childElement->dimensions.height; float childMinSize = xAxis ? childElement->minDimensions.width : childElement->minDimensions.height; @@ -1840,19 +1961,28 @@ float Clay__DistributeSizeAmongChildren(bool xAxis, float sizeToDistribute, Clay canDistribute = false; } // Currently, we don't support squishing aspect ratio images on their Y axis as it would break ratio - else if (!xAxis && childElement->elementType == CLAY__LAYOUT_ELEMENT_TYPE_IMAGE) { + else if (!xAxis && Clay__ElementHasConfig(childElement, CLAY__ELEMENT_CONFIG_TYPE_IMAGE)) { canDistribute = false; } else { switch (distributionType) { case CLAY__SIZE_DISTRIBUTION_TYPE_RESIZEABLE_CONTAINER: break; case CLAY__SIZE_DISTRIBUTION_TYPE_GROW_CONTAINER: if (childSizing.type != CLAY__SIZING_TYPE_GROW) canDistribute = false; break; - case CLAY__SIZE_DISTRIBUTION_TYPE_SCROLL_CONTAINER: if ((childElement->elementType != CLAY__LAYOUT_ELEMENT_TYPE_SCROLL_CONTAINER || (xAxis && !childElement->elementConfig.scrollElementConfig->horizontal) || (!xAxis && !childElement->elementConfig.scrollElementConfig->vertical))) canDistribute = false; break; + case CLAY__SIZE_DISTRIBUTION_TYPE_SCROLL_CONTAINER: { + if (Clay__ElementHasConfig(childElement, CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER)) { + Clay_ScrollElementConfig *scrollConfig = Clay__FindElementConfigWithType(childElement, CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER).scrollElementConfig; + if ((xAxis && !scrollConfig->horizontal) || (!xAxis && !scrollConfig->vertical)) { + Clay__int32_tArray_RemoveSwapback(&remainingElements, childOffset); + childOffset--; + continue; + } + } + } } } if (!canDistribute) { - Clay__LayoutElementPointerArray_RemoveSwapback(&remainingElements, childOffset); + Clay__int32_tArray_RemoveSwapback(&remainingElements, childOffset); childOffset--; continue; } @@ -1861,7 +1991,7 @@ float Clay__DistributeSizeAmongChildren(bool xAxis, float sizeToDistribute, Clay *childSize = CLAY__MAX(CLAY__MAX(CLAY__MIN(childSizing.sizeMinMax.max, *childSize + dividedSize), childSizing.sizeMinMax.min), childMinSize); float diff = *childSize - oldChildSize; if (diff > -0.01 && diff < 0.01) { - Clay__LayoutElementPointerArray_RemoveSwapback(&remainingElements, childOffset); + Clay__int32_tArray_RemoveSwapback(&remainingElements, childOffset); childOffset--; continue; } @@ -1873,7 +2003,7 @@ float Clay__DistributeSizeAmongChildren(bool xAxis, float sizeToDistribute, Clay void Clay__SizeContainersAlongAxis(bool xAxis) { Clay__int32_tArray bfsBuffer = Clay__layoutElementChildrenBuffer; - Clay__LayoutElementPointerArray resizableContainerBuffer = Clay__openLayoutElementStack; + Clay__int32_tArray resizableContainerBuffer = Clay__openLayoutElementStack; for (int rootIndex = 0; rootIndex < Clay__layoutElementTreeRoots.length; ++rootIndex) { bfsBuffer.length = 0; Clay__LayoutElementTreeRoot *root = Clay__LayoutElementTreeRootArray_Get(&Clay__layoutElementTreeRoots, rootIndex); @@ -1881,8 +2011,9 @@ void Clay__SizeContainersAlongAxis(bool xAxis) { Clay__int32_tArray_Add(&bfsBuffer, (int32_t)root->layoutElementIndex); // Size floating containers to their parents - if (rootElement->elementType == CLAY__LAYOUT_ELEMENT_TYPE_FLOATING_CONTAINER) { - Clay_LayoutElementHashMapItem *parentItem = Clay__GetHashMapItem(rootElement->elementConfig.floatingElementConfig->parentId); + if (Clay__ElementHasConfig(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING_CONTAINER)) { + Clay_FloatingElementConfig *floatingElementConfig = Clay__FindElementConfigWithType(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING_CONTAINER).floatingElementConfig; + Clay_LayoutElementHashMapItem *parentItem = Clay__GetHashMapItem(floatingElementConfig->parentId); if (parentItem) { Clay_LayoutElement *parentLayoutElement = parentItem->layoutElement; if (rootElement->layoutConfig->sizing.width.type == CLAY__SIZING_TYPE_GROW) { @@ -1915,12 +2046,12 @@ void Clay__SizeContainersAlongAxis(bool xAxis) { Clay_SizingAxis childSizing = xAxis ? childElement->layoutConfig->sizing.width : childElement->layoutConfig->sizing.height; float childSize = xAxis ? childElement->dimensions.width : childElement->dimensions.height; - if (childElement->elementType != CLAY__LAYOUT_ELEMENT_TYPE_TEXT && childElement->children.length > 0) { + if (!Clay__ElementHasConfig(childElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT) && childElement->children.length > 0) { Clay__int32_tArray_Add(&bfsBuffer, childElementIndex); } - if (childSizing.type != CLAY__SIZING_TYPE_PERCENT && childSizing.type != CLAY__SIZING_TYPE_FIXED && (childElement->elementType != CLAY__LAYOUT_ELEMENT_TYPE_TEXT || (childElement->elementConfig.textElementConfig->wrapMode == CLAY_TEXT_WRAP_WORDS))) { - Clay__LayoutElementPointerArray_Add(&resizableContainerBuffer, childElement); + if (childSizing.type != CLAY__SIZING_TYPE_PERCENT && childSizing.type != CLAY__SIZING_TYPE_FIXED && (!Clay__ElementHasConfig(childElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT) || (Clay__FindElementConfigWithType(childElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT).textElementConfig->wrapMode == CLAY_TEXT_WRAP_WORDS))) { + Clay__int32_tArray_Add(&resizableContainerBuffer, childElementIndex); } if (sizingAlongAxis) { @@ -1963,8 +2094,9 @@ void Clay__SizeContainersAlongAxis(bool xAxis) { // If the content is too large, compress the children as much as possible if (sizeToDistribute < 0) { // If the parent can scroll in the axis direction in this direction, don't compress children, just leave them alone - if (parent->elementType == CLAY__LAYOUT_ELEMENT_TYPE_SCROLL_CONTAINER) { - if (((xAxis && parent->elementConfig.scrollElementConfig->horizontal) || (!xAxis && parent->elementConfig.scrollElementConfig->vertical))) { + if (Clay__ElementHasConfig(parent, CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER)) { + Clay_ScrollElementConfig *scrollElementConfig = Clay__FindElementConfigWithType(parent, CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER).scrollElementConfig; + if (((xAxis && scrollElementConfig->horizontal) || (!xAxis && scrollElementConfig->vertical))) { continue; } } @@ -1979,14 +2111,14 @@ void Clay__SizeContainersAlongAxis(bool xAxis) { } else if (sizeToDistribute > 0 && growContainerCount > 0) { float targetSize = (sizeToDistribute + growContainerContentSize) / growContainerCount; for (int childOffset = 0; childOffset < resizableContainerBuffer.length; childOffset++) { - Clay_LayoutElement *childElement = *Clay__LayoutElementPointerArray_Get(&resizableContainerBuffer, childOffset); + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&Clay__layoutElements, Clay__int32_tArray_Get(&resizableContainerBuffer, childOffset)); Clay_SizingAxis childSizing = xAxis ? childElement->layoutConfig->sizing.width : childElement->layoutConfig->sizing.height; if (childSizing.type == CLAY__SIZING_TYPE_GROW) { float *childSize = xAxis ? &childElement->dimensions.width : &childElement->dimensions.height; float *minSize = xAxis ? &childElement->minDimensions.width : &childElement->minDimensions.height; if (targetSize < *minSize) { growContainerContentSize -= *minSize; - Clay__LayoutElementPointerArray_RemoveSwapback(&resizableContainerBuffer, childOffset); + Clay__int32_tArray_RemoveSwapback(&resizableContainerBuffer, childOffset); growContainerCount--; targetSize = (sizeToDistribute + growContainerContentSize) / growContainerCount; childOffset = -1; @@ -1999,18 +2131,21 @@ void Clay__SizeContainersAlongAxis(bool xAxis) { // Sizing along the non layout axis ("off axis") } else { for (int childOffset = 0; childOffset < resizableContainerBuffer.length; childOffset++) { - Clay_LayoutElement *childElement = *Clay__LayoutElementPointerArray_Get(&resizableContainerBuffer, childOffset); + Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&Clay__layoutElements, Clay__int32_tArray_Get(&resizableContainerBuffer, childOffset)); Clay_SizingAxis childSizing = xAxis ? childElement->layoutConfig->sizing.width : childElement->layoutConfig->sizing.height; float *childSize = xAxis ? &childElement->dimensions.width : &childElement->dimensions.height; - if (!xAxis && childElement->elementType == CLAY__LAYOUT_ELEMENT_TYPE_IMAGE) { + if (!xAxis && Clay__ElementHasConfig(childElement, CLAY__ELEMENT_CONFIG_TYPE_IMAGE)) { continue; // Currently we don't support resizing aspect ratio images on the Y axis because it would break the ratio } // If we're laying out the children of a scroll panel, grow containers expand to the height of the inner content, not the outer container float maxSize = parentSize - parentPadding * 2; - if (parent->elementType == CLAY__LAYOUT_ELEMENT_TYPE_SCROLL_CONTAINER && ((xAxis && parent->elementConfig.scrollElementConfig->horizontal) || (!xAxis && parent->elementConfig.scrollElementConfig->vertical))) { - maxSize = CLAY__MAX(maxSize, innerContentSize); + if (Clay__ElementHasConfig(parent, CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER)) { + Clay_ScrollElementConfig *scrollElementConfig = Clay__FindElementConfigWithType(parent, CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER).scrollElementConfig; + if (((xAxis && scrollElementConfig->horizontal) || (!xAxis && scrollElementConfig->vertical))) { + maxSize = CLAY__MAX(maxSize, innerContentSize); + } } if (childSizing.type == CLAY__SIZING_TYPE_FIT) { *childSize = CLAY__MAX(childSizing.sizeMinMax.min, CLAY__MIN(*childSize, maxSize)); @@ -2023,119 +2158,54 @@ void Clay__SizeContainersAlongAxis(bool xAxis) { } } -Clay_BoundingBox Clay__BoundingBoxWithRoundedValues(float x, float y, float width, float height) { - return CLAY__INIT(Clay_BoundingBox) { - (float)(int32_t)(x + (x > 0 ? 0.5f : -0.5f)), - (float)(int32_t)(y + (y > 0 ? 0.5f : -0.5f)), - (float)(int32_t)(width + (width > 0 ? 0.5f : -0.5f)), - (float)(int32_t)(height + (height > 0 ? 0.5f : -0.5f)) - }; -} - void Clay__CalculateFinalLayout() { // Calculate sizing along the X axis Clay__SizeContainersAlongAxis(true); // Wrap text - uint32_t originalTextLayoutElementDataLength = Clay__textElementData.length; - for (int i = 0; i < originalTextLayoutElementDataLength; ++i) { - Clay__TextElementData *textElementData = Clay__TextElementDataArray_Get(&Clay__textElementData, i); + for (int textElementIndex = 0; textElementIndex < Clay__textElementData.length; ++textElementIndex) { + Clay__TextElementData *textElementData = Clay__TextElementDataArray_Get(&Clay__textElementData, textElementIndex); + textElementData->wrappedLines = CLAY__INIT(Clay__StringArraySlice) { .length = 0, .internalArray = &Clay__wrappedTextLines.internalArray[Clay__wrappedTextLines.length] }; Clay_LayoutElement *containerElement = Clay_LayoutElementArray_Get(&Clay__layoutElements, (int)textElementData->elementIndex); - Clay_String text = containerElement->text; - Clay_TextElementConfig *textConfig = containerElement->elementConfig.textElementConfig; - containerElement->elementType = CLAY__LAYOUT_ELEMENT_TYPE_CONTAINER; - // Clone the style config to prevent pollution of other elements that share this config - containerElement->layoutConfig = Clay__LayoutConfigArray_Add(&Clay__layoutConfigs, *containerElement->layoutConfig); - containerElement->layoutConfig->layoutDirection = CLAY_TOP_TO_BOTTOM; - containerElement->children = CLAY__INIT(Clay__LayoutElementChildren) { // Note: this overwrites the text property - .elements = &Clay__layoutElementChildren.internalArray[Clay__layoutElementChildren.length], - .length = 0, - }; - // Short circuit all wrap calculations if wrap mode is none - if (textConfig->wrapMode == CLAY_TEXT_WRAP_NONE || (containerElement->dimensions.width == textElementData->preferredDimensions.width && textConfig->wrapMode != CLAY_TEXT_WRAP_NEWLINES)) { - float lineHeight = textConfig->lineHeight != 0 ? textConfig->lineHeight : textElementData->preferredDimensions.height; - Clay_LayoutElementArray_Add(&Clay__layoutElements, CLAY__INIT(Clay_LayoutElement) { - .text = text, - .dimensions = { textElementData->preferredDimensions.width, lineHeight }, - .minDimensions = textElementData->preferredDimensions, - .layoutConfig = CLAY_LAYOUT(.sizing = { .height = CLAY_SIZING_FIXED(lineHeight) }), - .elementConfig = { .textElementConfig = containerElement->elementConfig.textElementConfig }, - .id = Clay__RehashWithNumber(containerElement->id, containerElement->children.length), - .elementType = CLAY__LAYOUT_ELEMENT_TYPE_TEXT, - }); - containerElement->children.length++; - Clay__int32_tArray_Add(&Clay__layoutElementChildren, (int32_t)Clay__layoutElements.length - 1); + Clay_TextElementConfig *textConfig = Clay__FindElementConfigWithType(containerElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT).textElementConfig; + Clay__MeasureTextCacheItem *measureTextCacheItem = Clay__MeasureTextCached(&textElementData->text, textConfig); + float lineWidth = 0; + float lineHeight = textConfig->lineHeight > 0 ? textConfig->lineHeight : textElementData->preferredDimensions.height; + uint32_t lineLengthChars = 0; + uint32_t lineStartOffset = 0; + if (textElementData->preferredDimensions.width <= containerElement->dimensions.width) { + Clay__StringArray_Add(&Clay__wrappedTextLines, textElementData->text); + textElementData->wrappedLines.length++; continue; } - containerElement->dimensions.height = 0; - int lineStartIndex = 0; - int wordStartIndex = 0; - int wordEndIndex = 0; - Clay_Dimensions lineDimensions = CLAY__INIT(Clay_Dimensions){}; - float spaceWidth = Clay__MeasureText(&CLAY__SPACECHAR, textConfig).width; // todo may as well cache it somewhere - while (wordStartIndex <= text.length) { - if (text.chars[wordEndIndex] == ' ' || (text.chars[wordEndIndex] == '\n' && textConfig->wrapMode <= CLAY_TEXT_WRAP_NEWLINES) || wordEndIndex == text.length) { - Clay_String stringToRender = CLAY__INIT(Clay_String) { .length = wordEndIndex - lineStartIndex, .chars = text.chars + lineStartIndex }; - Clay_String wordToMeasure = CLAY__INIT(Clay_String) { .length = wordEndIndex - wordStartIndex, .chars = text.chars + wordStartIndex }; - // Clip off trailing spaces and newline characters - Clay_Dimensions wordDimensions = Clay__MeasureTextCached(&wordToMeasure, textConfig); - lineDimensions.width = lineDimensions.width + wordDimensions.width + spaceWidth; - lineDimensions.height = wordDimensions.height; - bool isOverlappingBoundaries = (lineDimensions.width - spaceWidth) > containerElement->dimensions.width + 0.01f; // Epsilon for floating point inaccuracy of adding components - // Need to wrap - if (isOverlappingBoundaries && textConfig->wrapMode == CLAY_TEXT_WRAP_WORDS) { - lineDimensions.width -= spaceWidth; - // We can wrap at the most recent word start - if (wordStartIndex != lineStartIndex) { - stringToRender = CLAY__INIT(Clay_String) { .length = wordStartIndex - lineStartIndex - 1, .chars = text.chars + lineStartIndex }; - lineDimensions.width -= (wordDimensions.width + spaceWidth); - lineStartIndex = wordStartIndex; - wordStartIndex = lineStartIndex; - wordEndIndex = lineStartIndex; - containerElement->dimensions.width = CLAY__MAX(containerElement->dimensions.width, lineDimensions.width); - // The single word is larger than the entire container - just render it in place - } else { - lineStartIndex = wordEndIndex + 1; - wordStartIndex = lineStartIndex; - wordEndIndex = lineStartIndex; - containerElement->dimensions.width = CLAY__MAX(containerElement->dimensions.width, lineDimensions.width); - } - // If we're at a space character and the current phrase fits, just keep going - } else if (text.chars[wordEndIndex] == ' ') { - wordStartIndex = wordEndIndex + 1; - wordEndIndex = wordStartIndex; - continue; - // Newline or end of string - } else { - lineStartIndex = wordEndIndex + 1; - wordStartIndex = lineStartIndex; - wordEndIndex = lineStartIndex; + for (int wordIndex = 0; wordIndex < measureTextCacheItem->measuredWords.length; ++wordIndex) { + Clay__MeasuredWord *measuredWord = Clay__MeasuredWordArraySlice_Get(&measureTextCacheItem->measuredWords, wordIndex); + // measuredWord->length == 0 means a newline character + if (measuredWord->length == 0 || lineWidth + measuredWord->width > containerElement->dimensions.width) { + Clay__StringArray_Add(&Clay__wrappedTextLines, CLAY__INIT(Clay_String) {.length = (int)lineLengthChars, .chars = &textElementData->text.chars[lineStartOffset] }); + textElementData->wrappedLines.length++; + if (lineLengthChars > 0 && measuredWord->length > 0) { + wordIndex--; } - float lineHeight = textConfig->lineHeight != 0 ? textConfig->lineHeight : lineDimensions.height; - Clay_LayoutElementArray_Add(&Clay__layoutElements, CLAY__INIT(Clay_LayoutElement) { - .text = stringToRender, - .dimensions = { lineDimensions.width, lineHeight }, - .minDimensions = { lineDimensions.width, lineDimensions.height }, - .layoutConfig = CLAY_LAYOUT(.sizing = { .height = CLAY_SIZING_FIXED(lineHeight) }), - .elementConfig = { .textElementConfig = containerElement->elementConfig.textElementConfig }, - .id = Clay__RehashWithNumber(containerElement->id, containerElement->children.length), - .elementType = CLAY__LAYOUT_ELEMENT_TYPE_TEXT, - }); - containerElement->dimensions.height += lineHeight; - containerElement->children.length++; - lineDimensions = CLAY__INIT(Clay_Dimensions) {}; - Clay__int32_tArray_Add(&Clay__layoutElementChildren, (int32_t)Clay__layoutElements.length - 1); + lineWidth = 0; + lineLengthChars = 0; + lineStartOffset = measuredWord->startOffset; } else { - // In the middle of a word - wordEndIndex++; + lineWidth += measuredWord->width; + lineLengthChars += measuredWord->length; } } + if (lineLengthChars > 0) { + Clay__StringArray_Add(&Clay__wrappedTextLines, CLAY__INIT(Clay_String) {.length = (int)lineLengthChars, .chars = &textElementData->text.chars[lineStartOffset] }); + textElementData->wrappedLines.length++; + } + containerElement->dimensions.height = lineHeight * textElementData->wrappedLines.length; } // Scale vertical image heights according to aspect ratio for (int i = 0; i < Clay__imageElementPointers.length; ++i) { - Clay_LayoutElement* imageElement = *Clay__LayoutElementPointerArray_Get(&Clay__imageElementPointers, i); - Clay_ImageElementConfig *config = imageElement->elementConfig.imageElementConfig; + Clay_LayoutElement* imageElement = Clay__LayoutElementPointerArray_Get(&Clay__imageElementPointers, i); + Clay_ImageElementConfig *config = Clay__FindElementConfigWithType(imageElement, CLAY__ELEMENT_CONFIG_TYPE_IMAGE).imageElementConfig; imageElement->dimensions.height = (config->sourceDimensions.height / CLAY__MAX(config->sourceDimensions.width, 1)) * imageElement->dimensions.width; } @@ -2153,14 +2223,14 @@ void Clay__CalculateFinalLayout() { if (!Clay__treeNodeVisited.internalArray[dfsBuffer.length - 1]) { Clay__treeNodeVisited.internalArray[dfsBuffer.length - 1] = true; // If the element has no children or is the container for a text element, don't bother inspecting it - if (currentElement->elementType == CLAY__LAYOUT_ELEMENT_TYPE_TEXT || currentElement->children.length == 0 || Clay_LayoutElementArray_Get(&Clay__layoutElements, currentElement->children.elements[0])->elementType == CLAY__LAYOUT_ELEMENT_TYPE_TEXT) { + if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT) || currentElement->children.length == 0) { dfsBuffer.length--; continue; } // Add the children to the DFS buffer (needs to be pushed in reverse so that stack traversal is in correct layout order) for (int i = 0; i < currentElement->children.length; i++) { Clay__treeNodeVisited.internalArray[dfsBuffer.length] = false; - Clay__LayoutElementTreeNodeArray_Add(&dfsBuffer, CLAY__INIT(Clay__LayoutElementTreeNode) { .layoutElement = Clay_LayoutElementArray_Get(&Clay__layoutElements, currentElement->children.elements[i]) }); // TODO fix before release + Clay__LayoutElementTreeNodeArray_Add(&dfsBuffer, CLAY__INIT(Clay__LayoutElementTreeNode) { .layoutElement = Clay_LayoutElementArray_Get(&Clay__layoutElements, currentElement->children.elements[i]) }); } continue; } @@ -2203,8 +2273,8 @@ void Clay__CalculateFinalLayout() { Clay_Vector2 rootPosition = CLAY__INIT(Clay_Vector2) {}; Clay_LayoutElementHashMapItem *parentHashMapItem = Clay__GetHashMapItem(root->parentId); // Position root floating containers - if (rootElement->elementType == CLAY__LAYOUT_ELEMENT_TYPE_FLOATING_CONTAINER && parentHashMapItem) { - Clay_FloatingElementConfig *config = rootElement->elementConfig.floatingElementConfig; + if (Clay__ElementHasConfig(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING_CONTAINER) && parentHashMapItem) { + Clay_FloatingElementConfig *config = Clay__FindElementConfigWithType(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING_CONTAINER).floatingElementConfig; Clay_Dimensions rootDimensions = rootElement->dimensions; Clay_BoundingBox parentBoundingBox = parentHashMapItem->boundingBox; // Set X position @@ -2280,9 +2350,9 @@ void Clay__CalculateFinalLayout() { if (!Clay__treeNodeVisited.internalArray[dfsBuffer.length - 1]) { Clay__treeNodeVisited.internalArray[dfsBuffer.length - 1] = true; - Clay_BoundingBox currentElementBoundingBox = Clay__BoundingBoxWithRoundedValues(currentElementTreeNode->position.x, currentElementTreeNode->position.y, currentElement->dimensions.width, currentElement->dimensions.height); - if (currentElement->elementType == CLAY__LAYOUT_ELEMENT_TYPE_FLOATING_CONTAINER) { - Clay_FloatingElementConfig *floatingElementConfig = currentElement->elementConfig.floatingElementConfig; + Clay_BoundingBox currentElementBoundingBox = CLAY__INIT(Clay_BoundingBox) { currentElementTreeNode->position.x, currentElementTreeNode->position.y, currentElement->dimensions.width, currentElement->dimensions.height }; + if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING_CONTAINER)) { + Clay_FloatingElementConfig *floatingElementConfig = Clay__FindElementConfigWithType(currentElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING_CONTAINER).floatingElementConfig; Clay_Dimensions expand = floatingElementConfig->expand; currentElementBoundingBox.x -= expand.width; currentElementBoundingBox.width += expand.width * 2; @@ -2292,12 +2362,8 @@ void Clay__CalculateFinalLayout() { Clay__ScrollContainerDataInternal *scrollContainerData = CLAY__NULL; // Apply scroll offsets to container - if (currentElement->elementType == CLAY__LAYOUT_ELEMENT_TYPE_SCROLL_CONTAINER) { - Clay_RenderCommandArray_Add(&Clay__renderCommands, CLAY__INIT(Clay_RenderCommand) { - .boundingBox = currentElementBoundingBox, - .id = Clay__RehashWithNumber(currentElement->id, 10), - .commandType = CLAY_RENDER_COMMAND_TYPE_SCISSOR_START, - }); + if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER)) { + Clay_ScrollElementConfig *scrollConfig = Clay__FindElementConfigWithType(currentElement, CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER).scrollElementConfig; // This linear scan could theoretically be slow under very strange conditions, but I can't imagine a real UI with more than a few 10's of scroll containers for (int i = 0; i < Clay__scrollContainerDatas.length; i++) { @@ -2305,11 +2371,10 @@ void Clay__CalculateFinalLayout() { if (mapping->layoutElement == currentElement) { scrollContainerData = mapping; mapping->boundingBox = currentElementBoundingBox; - Clay_ScrollElementConfig *config = mapping->layoutElement->elementConfig.scrollElementConfig; - if (config->horizontal) { + if (scrollConfig->horizontal) { scrollOffset.x = mapping->scrollPosition.x; } - if (config->vertical) { + if (scrollConfig->vertical) { scrollOffset.y = mapping->scrollPosition.y; } break; @@ -2317,57 +2382,114 @@ void Clay__CalculateFinalLayout() { } } - // Create the render command for this element - Clay_RenderCommand renderCommand = CLAY__INIT(Clay_RenderCommand) { - .boundingBox = currentElementBoundingBox, - .config = currentElement->elementConfig, - .id = currentElement->id, - .commandType = Clay__LayoutElementTypeToRenderCommandType[currentElement->elementType], - }; - Clay_LayoutElementHashMapItem *hashMapItem = Clay__GetHashMapItem(currentElement->id); if (hashMapItem) { - hashMapItem->boundingBox = renderCommand.boundingBox; + hashMapItem->boundingBox = currentElementBoundingBox; } - #ifndef CLAY_DISABLE_CULLING - // Culling - Don't bother to generate render commands for rectangles entirely outside the screen - this won't stop their children from being rendered if they overflow - bool offscreen = currentElementBoundingBox.x > (float)Clay__layoutDimensions.width || currentElementBoundingBox.y > (float)Clay__layoutDimensions.height || currentElementBoundingBox.x + currentElementBoundingBox.width < 0 || currentElementBoundingBox.y + currentElementBoundingBox.height < 0; - bool shouldRender = !offscreen; - #elif - bool shouldRender = true; - #endif - switch (renderCommand.commandType) { - case CLAY_RENDER_COMMAND_TYPE_NONE: { - shouldRender = false; - break; - } - case CLAY_RENDER_COMMAND_TYPE_TEXT: { - renderCommand.text = currentElement->text; - if (currentElement->minDimensions.height != currentElement->dimensions.height) { - renderCommand.boundingBox.y += (currentElement->dimensions.height - currentElement->minDimensions.height) / 2; + int sortedConfigIndexes[20]; + for (int elementConfigIndex = 0; elementConfigIndex < currentElement->elementConfigs.length; ++elementConfigIndex) { + sortedConfigIndexes[elementConfigIndex] = elementConfigIndex; + } + int sortMax = currentElement->elementConfigs.length - 1; + while (sortMax > 0) { // dumb bubble sort + for (int i = 0; i < sortMax; ++i) { + int current = sortedConfigIndexes[i]; + int next = sortedConfigIndexes[i + 1]; + Clay__ElementConfigType currentType = Clay__ElementConfigArraySlice_Get(¤tElement->elementConfigs, current)->type; + Clay__ElementConfigType nextType = Clay__ElementConfigArraySlice_Get(¤tElement->elementConfigs, next)->type; + if (nextType == CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER || currentType == CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER) { + sortedConfigIndexes[i] = next; + sortedConfigIndexes[i + 1] = current; } - break; } - case CLAY_RENDER_COMMAND_TYPE_BORDER: { // We render borders on close because they need to render above children - shouldRender = false; - break; - } - default: break; - } - if (shouldRender) { - Clay_RenderCommandArray_Add(&Clay__renderCommands, renderCommand); - } - if (offscreen) { - // NOTE: You may be tempted to try an early return / continue if an element is off screen. Why bother calculating layout for its children, right? - // Unfortunately, a FLOATING_CONTAINER may be defined that attaches to a child or grandchild of this element, which is large enough to still - // be on screen, even if this element isn't. That depends on this element and it's children being laid out correctly (even if they are entirely off screen) + sortMax--; } - // Handle child alignment along the layout axis - if (currentElementTreeNode->layoutElement->elementType != CLAY__LAYOUT_ELEMENT_TYPE_TEXT) { - dfsBuffer.length += currentElement->children.length; + // Create the render commands for this element + for (int elementConfigIndex = 0; elementConfigIndex < currentElement->elementConfigs.length; ++elementConfigIndex) { + Clay_ElementConfig *elementConfig = Clay__ElementConfigArraySlice_Get(¤tElement->elementConfigs, sortedConfigIndexes[elementConfigIndex]); + Clay_RenderCommand renderCommand = CLAY__INIT(Clay_RenderCommand) { + .boundingBox = currentElementBoundingBox, + .config = elementConfig->config, + .id = currentElement->id, + }; + #ifndef CLAY_DISABLE_CULLING + // Culling - Don't bother to generate render commands for rectangles entirely outside the screen - this won't stop their children from being rendered if they overflow + bool offscreen = currentElementBoundingBox.x > (float)Clay__layoutDimensions.width || currentElementBoundingBox.y > (float)Clay__layoutDimensions.height || currentElementBoundingBox.x + currentElementBoundingBox.width < 0 || currentElementBoundingBox.y + currentElementBoundingBox.height < 0; + bool shouldRender = !offscreen; + #elif + bool shouldRender = true; + #endif + switch (elementConfig->type) { + case CLAY__ELEMENT_CONFIG_TYPE_RECTANGLE: { + renderCommand.commandType = CLAY_RENDER_COMMAND_TYPE_RECTANGLE; + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER: { + renderCommand.commandType = CLAY_RENDER_COMMAND_TYPE_BORDER; + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_FLOATING_CONTAINER: { + renderCommand.commandType = CLAY_RENDER_COMMAND_TYPE_NONE; + shouldRender = false; + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER: { + renderCommand.commandType = CLAY_RENDER_COMMAND_TYPE_SCISSOR_START; + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_IMAGE: { + renderCommand.commandType = CLAY_RENDER_COMMAND_TYPE_IMAGE; + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_TEXT: { + shouldRender = false; + Clay_ElementConfigUnion configUnion = elementConfig->config; + Clay_TextElementConfig *textElementConfig = configUnion.textElementConfig; + float naturalLineHeight = currentElement->textElementData->preferredDimensions.height; + float finalLineHeight = textElementConfig->lineHeight > 0 ? textElementConfig->lineHeight : naturalLineHeight; + float lineHeightOffset = (finalLineHeight - naturalLineHeight) / 2; + float yPosition = lineHeightOffset; + for (int lineIndex = 0; lineIndex < currentElement->textElementData->wrappedLines.length; ++lineIndex) { + Clay_String wrappedLine = currentElement->textElementData->wrappedLines.internalArray[lineIndex]; // todo range check + if (wrappedLine.length == 0) { + continue; + } + Clay_RenderCommandArray_Add(&Clay__renderCommands, CLAY__INIT(Clay_RenderCommand) { + .boundingBox = { currentElementBoundingBox.x, currentElementBoundingBox.y + yPosition, (float)50, naturalLineHeight }, // TODO width + .config = configUnion, + .text = wrappedLine, + .id = Clay__HashNumber(lineIndex, currentElement->id).id, + .commandType = CLAY_RENDER_COMMAND_TYPE_TEXT, + }); + yPosition += finalLineHeight; + + if (currentElementBoundingBox.y + yPosition > Clay__layoutDimensions.height) { + break; + } + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_CUSTOM: { + renderCommand.commandType = CLAY_RENDER_COMMAND_TYPE_CUSTOM; + break; + } + default: break; + } + if (shouldRender) { + Clay_RenderCommandArray_Add(&Clay__renderCommands, renderCommand); + } + if (offscreen) { + // NOTE: You may be tempted to try an early return / continue if an element is off screen. Why bother calculating layout for its children, right? + // Unfortunately, a FLOATING_CONTAINER may be defined that attaches to a child or grandchild of this element, which is large enough to still + // be on screen, even if this element isn't. That depends on this element and it's children being laid out correctly (even if they are entirely off screen) + } + } + + // Setup initial on-axis alignment + if (!Clay__ElementHasConfig(currentElementTreeNode->layoutElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT)) { Clay_Dimensions contentSize = CLAY__INIT(Clay_Dimensions) {0,0}; if (layoutConfig->layoutDirection == CLAY_LEFT_TO_RIGHT) { for (int i = 0; i < currentElement->children.length; ++i) { @@ -2400,47 +2522,40 @@ void Clay__CalculateFinalLayout() { } if (scrollContainerData) { - scrollContainerData->contentSize = contentSize; + scrollContainerData->contentSize = CLAY__INIT(Clay_Dimensions) { contentSize.width + layoutConfig->padding.x * 2, contentSize.height + layoutConfig->padding.y * 2 }; } } - } else { + } + else { // DFS is returning upwards backwards - if (currentElement->elementType == CLAY__LAYOUT_ELEMENT_TYPE_SCROLL_CONTAINER) { - Clay_RenderCommandArray_Add(&Clay__renderCommands, CLAY__INIT(Clay_RenderCommand) { - .id = Clay__RehashWithNumber(currentElement->id, 11), - .commandType = CLAY_RENDER_COMMAND_TYPE_SCISSOR_END, - }); - // Borders between elements are expressed as additional rectangle render commands - } else if (currentElement->elementType == CLAY__LAYOUT_ELEMENT_TYPE_BORDER_CONTAINER) { - Clay_BoundingBox currentElementBoundingBox = Clay__BoundingBoxWithRoundedValues(currentElementTreeNode->position.x, currentElementTreeNode->position.y, currentElement->dimensions.width, currentElement->dimensions.height); - #ifndef CLAY_DISABLE_CULLING - bool offscreen = currentElementBoundingBox.x > (float)Clay__layoutDimensions.width || currentElementBoundingBox.y > (float)Clay__layoutDimensions.height || currentElementBoundingBox.x + currentElementBoundingBox.width < 0 || currentElementBoundingBox.y + currentElementBoundingBox.height < 0; - if (offscreen) { - #endif - dfsBuffer.length--; - continue; - #ifndef CLAY_DISABLE_CULLING + bool closeScrollElement = false; + if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER)) { + closeScrollElement = true; + Clay_ScrollElementConfig *scrollConfig = Clay__FindElementConfigWithType(currentElement, CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER).scrollElementConfig; + // todo get rid of this annoying duplication just for handling borders between elements + for (int i = 0; i < Clay__scrollContainerDatas.length; i++) { + Clay__ScrollContainerDataInternal *mapping = Clay__ScrollContainerDataInternalArray_Get(&Clay__scrollContainerDatas, i); + if (mapping->layoutElement == currentElement) { + if (scrollConfig->horizontal) { scrollOffset.x = mapping->scrollPosition.x; } + if (scrollConfig->vertical) { scrollOffset.y = mapping->scrollPosition.y; } + break; + } } - #endif - Clay_BorderElementConfig *borderConfig = currentElement->elementConfig.borderElementConfig; - - Clay_RenderCommandArray_Add(&Clay__renderCommands, CLAY__INIT(Clay_RenderCommand) { - .boundingBox = currentElementBoundingBox, - .config = currentElement->elementConfig, - .id = currentElement->id, - .commandType = CLAY_RENDER_COMMAND_TYPE_BORDER, - }); - - // Render border elements between children + } + if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER)) { + Clay_LayoutElementHashMapItem *currentElementData = Clay__GetHashMapItem(currentElement->id); + Clay_BoundingBox currentElementBoundingBox = currentElementData->boundingBox; + Clay_BorderElementConfig *borderConfig = Clay__FindElementConfigWithType(currentElement, CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER).borderElementConfig; if (borderConfig->betweenChildren.width > 0 && borderConfig->betweenChildren.color.a > 0) { + Clay_RectangleElementConfig *rectangleConfig = Clay__StoreRectangleElementConfig(CLAY__INIT(Clay_RectangleElementConfig) {.color = borderConfig->betweenChildren.color}); Clay_Vector2 borderOffset = { (float)layoutConfig->padding.x, (float)layoutConfig->padding.y }; if (layoutConfig->layoutDirection == CLAY_LEFT_TO_RIGHT) { for (int i = 0; i < currentElement->children.length; ++i) { Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&Clay__layoutElements, currentElement->children.elements[i]); if (i > 0) { Clay_RenderCommandArray_Add(&Clay__renderCommands, CLAY__INIT(Clay_RenderCommand) { - .boundingBox = { currentElementBoundingBox.x + borderOffset.x, currentElementBoundingBox.y, (float)borderConfig->betweenChildren.width, currentElement->dimensions.height }, - .config = { CLAY_RECTANGLE_CONFIG(.color = borderConfig->betweenChildren.color) }, + .boundingBox = { currentElementBoundingBox.x + borderOffset.x + scrollOffset.x, currentElementBoundingBox.y + scrollOffset.y, (float)borderConfig->betweenChildren.width, currentElement->dimensions.height }, + .config = { rectangleConfig }, .id = Clay__RehashWithNumber(currentElement->id, 5 + i), .commandType = CLAY_RENDER_COMMAND_TYPE_RECTANGLE, }); @@ -2452,8 +2567,8 @@ void Clay__CalculateFinalLayout() { Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&Clay__layoutElements, currentElement->children.elements[i]); if (i > 0) { Clay_RenderCommandArray_Add(&Clay__renderCommands, CLAY__INIT(Clay_RenderCommand) { - .boundingBox = { currentElementBoundingBox.x, currentElementBoundingBox.y + borderOffset.y, currentElement->dimensions.width, (float)borderConfig->betweenChildren.width }, - .config = { CLAY_RECTANGLE_CONFIG(.color = borderConfig->betweenChildren.color) }, + .boundingBox = { currentElementBoundingBox.x + scrollOffset.x, currentElementBoundingBox.y + borderOffset.y + scrollOffset.y, currentElement->dimensions.width, (float)borderConfig->betweenChildren.width }, + .config = { rectangleConfig }, .id = Clay__RehashWithNumber(currentElement->id, 5 + i), .commandType = CLAY_RENDER_COMMAND_TYPE_RECTANGLE, }); @@ -2463,12 +2578,21 @@ void Clay__CalculateFinalLayout() { } } } + // This exists because the scissor needs to end _after_ borders between elements + if (closeScrollElement) { + Clay_RenderCommandArray_Add(&Clay__renderCommands, CLAY__INIT(Clay_RenderCommand) { + .id = Clay__RehashWithNumber(currentElement->id, 11), + .commandType = CLAY_RENDER_COMMAND_TYPE_SCISSOR_END, + }); + } + dfsBuffer.length--; continue; } // Add children to the DFS buffer - if (currentElement->elementType != CLAY__LAYOUT_ELEMENT_TYPE_TEXT) { + if (!Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT)) { + dfsBuffer.length += currentElement->children.length; for (int i = 0; i < currentElement->children.length; ++i) { Clay_LayoutElement *childElement = Clay_LayoutElementArray_Get(&Clay__layoutElements, currentElement->children.elements[i]); // Alignment along non layout axis @@ -2520,6 +2644,24 @@ void Clay__CalculateFinalLayout() { } } +void Clay__AttachId(Clay_ElementId elementId) { + Clay_LayoutElement *openLayoutElement = Clay__GetOpenLayoutElement(); + openLayoutElement->id = elementId.id; + Clay__AddHashMapItem(elementId, openLayoutElement); + Clay__StringArray_Add(&Clay__layoutElementIdStrings, elementId.stringId); + #ifdef CLAY_DEBUG + openLayoutElement->name = elementId.stringId; + #endif +} + +void Clay__AttachLayoutConfig(Clay_LayoutConfig *config) { + Clay__GetOpenLayoutElement()->layoutConfig = config; +} +void Clay__AttachElementConfig(Clay_ElementConfigUnion config, Clay__ElementConfigType type) { + Clay_LayoutElement *openLayoutElement = Clay__GetOpenLayoutElement(); + openLayoutElement->elementConfigs.length++; + Clay__ElementConfigArray_Add(&Clay__elementConfigBuffer, CLAY__INIT(Clay_ElementConfig) { .type = type, .config = config }); +} inline Clay_LayoutConfig * Clay__StoreLayoutConfig(Clay_LayoutConfig config) { return Clay__LayoutConfigArray_Add(&Clay__layoutConfigs, config); } inline Clay_RectangleElementConfig * Clay__StoreRectangleElementConfig(Clay_RectangleElementConfig config) { return Clay__RectangleElementConfigArray_Add(&Clay__rectangleElementConfigs, config); } inline Clay_TextElementConfig * Clay__StoreTextElementConfig(Clay_TextElementConfig config) { return Clay__TextElementConfigArray_Add(&Clay__textElementConfigs, config); } @@ -2541,6 +2683,55 @@ const int CLAY__DEBUGVIEW_INDENT_WIDTH = 16; Clay_TextElementConfig Clay__DebugView_TextNameConfig = CLAY__INIT(Clay_TextElementConfig) {.textColor = {238, 226, 231, 255}, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE }; Clay_LayoutConfig Clay__DebugView_ScrollViewItemLayoutConfig = CLAY__INIT(Clay_LayoutConfig) {}; +Clay_String Clay__IntToString(int integer) { + if (integer == 0) { + return CLAY__INIT(Clay_String) { .length = 1, .chars = "0" }; + } + char *chars = (char *)(Clay__dynamicStringData.internalArray + Clay__dynamicStringData.length); + int length = 0; + int sign = integer; + + if (integer < 0) { + integer = -integer; + } + while (integer > 0) { + chars[length++] = (char)(integer % 10 + '0'); + integer /= 10; + } + + if (sign < 0) { + chars[length++] = '-'; + } + + // Reverse the string to get the correct order + for (int j = 0, k = length - 1; j < k; j++, k--) { + char temp = chars[j]; + chars[j] = chars[k]; + chars[k] = temp; + } + Clay__dynamicStringData.length += length; + return CLAY__INIT(Clay_String) { .length = length, .chars = chars }; +} + +typedef struct +{ + Clay_String label; + Clay_Color color; +} Clay__DebugElementConfigTypeLabelConfig; + +Clay__DebugElementConfigTypeLabelConfig Clay__DebugGetElementConfigTypeLabel(Clay__ElementConfigType type) { + switch (type) { + case CLAY__ELEMENT_CONFIG_TYPE_RECTANGLE: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Rectangle"), CLAY__INIT(Clay_Color) {243,134,48,255} }; + case CLAY__ELEMENT_CONFIG_TYPE_TEXT: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Text"), CLAY__INIT(Clay_Color) {105,210,231,255} }; + case CLAY__ELEMENT_CONFIG_TYPE_IMAGE: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Image"), CLAY__INIT(Clay_Color) {121,189,154,255} }; + case CLAY__ELEMENT_CONFIG_TYPE_FLOATING_CONTAINER: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Floating"), CLAY__INIT(Clay_Color) {250,105,0,255} }; + case CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Scroll"), CLAY__INIT(Clay_Color) {242,196,90,255} }; + case CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Border"), CLAY__INIT(Clay_Color) {108,91,123, 255} }; + case CLAY__ELEMENT_CONFIG_TYPE_CUSTOM: return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Custom"), CLAY__INIT(Clay_Color) {11,72,107,255} }; + } + return CLAY__INIT(Clay__DebugElementConfigTypeLabelConfig) { CLAY_STRING("Error"), CLAY__INIT(Clay_Color) {0,0,0,255} }; +} + typedef struct { uint32_t rowCount; @@ -2549,23 +2740,6 @@ typedef struct // Returns row count Clay__RenderDebugLayoutData Clay__RenderDebugLayoutElementsList(int32_t initialRootsLength, int32_t highlightedRowIndex) { - Clay_ElementId outerId = CLAY_ID("Clay__DebugView_ElementOuter"); - Clay_ElementId border = CLAY_ID("Clay__DebugView_ElementOuterBorder"); - Clay_ElementId inner = CLAY_ID("Clay__DebugView_ElementInner"); - Clay_ElementId paddingOffset = CLAY_ID("Clay__DebugView_ElementPaddingOffset"); - Clay_ElementId spacerId = CLAY_ID("Clay__DebugView_ElementSpacer"); - Clay_ElementId outerHighlightId = CLAY_ID("Clay__DebugView_OuterHighlight"); - Clay_ElementId collapseIconButton = CLAY_ID("Clay__DebugView_CollapseIconButton"); - Clay_ElementId collapseIcon = CLAY_ID("Clay__DebugView_CollapseIcon"); - Clay_ElementId elementNameId = CLAY_ID("Clay__DebugView_ElementName"); - Clay_ElementId elementDuplicateWarning = CLAY_ID("Clay__DebugView_ElementDuplicateWarning"); - Clay_ElementId elementOffscreenBorderId = CLAY_ID("Clay__DebugView_ElementOffscreenBorder"); - Clay_ElementId elementTextSpacer = CLAY_ID("Clay__DebugView_ElementTextSpacer"); - Clay_ElementId elementTypeBorderId = CLAY_ID("Clay__DebugView_ElementTextBorder"); - Clay_ElementId elementTypeInnerRectId = CLAY_ID("Clay__DebugView_ElementTextInnerRect"); - Clay_ElementId elementTypeTextId = CLAY_ID("Clay__DebugView_ElementTypeText"); - Clay_ElementId textContentsOuterId = CLAY_ID("Clay__DebugView_ElementTextContentsOuter"); - Clay_ElementId textContentsId = CLAY_ID("Clay__DebugView_ElementTextContents"); Clay__int32_tArray dfsBuffer = Clay__reusableElementIndexBuffer; Clay__DebugView_ScrollViewItemLayoutConfig = CLAY__INIT(Clay_LayoutConfig) { .sizing = { .height = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT) }, .childGap = 6, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER }}; Clay__RenderDebugLayoutData layoutData = {}; @@ -2578,8 +2752,8 @@ Clay__RenderDebugLayoutData Clay__RenderDebugLayoutElementsList(int32_t initialR Clay__int32_tArray_Add(&dfsBuffer, (int32_t)root->layoutElementIndex); Clay__treeNodeVisited.internalArray[0] = false; if (rootIndex > 0) { - CLAY_CONTAINER(CLAY_IDI("Clay__DebugView_EmptyRowOuter", rootIndex), CLAY_LAYOUT(.sizing = {.width = CLAY_SIZING_GROW()}, .padding = {CLAY__DEBUGVIEW_INDENT_WIDTH / 2})) { - CLAY_BORDER_CONTAINER(CLAY_IDI("Clay__DebugView_EmptyRow", rootIndex), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED((float)CLAY__DEBUGVIEW_ROW_HEIGHT) }), CLAY_BORDER_CONFIG(.top = { .width = 1, .color = CLAY__DEBUGVIEW_COLOR_3 } )) {} + CLAY(CLAY_IDI("Clay__DebugView_EmptyRowOuter", rootIndex), CLAY_LAYOUT({ .sizing = {.width = CLAY_SIZING_GROW({})}, .padding = {CLAY__DEBUGVIEW_INDENT_WIDTH / 2} })) { + CLAY(CLAY_IDI("Clay__DebugView_EmptyRow", rootIndex), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW({}), .height = CLAY_SIZING_FIXED((float)CLAY__DEBUGVIEW_ROW_HEIGHT) }}), CLAY_BORDER({ .top = { .width = 1, .color = CLAY__DEBUGVIEW_COLOR_3 } })) {} } layoutData.rowCount++; } @@ -2587,24 +2761,23 @@ Clay__RenderDebugLayoutData Clay__RenderDebugLayoutElementsList(int32_t initialR uint32_t currentElementIndex = Clay__int32_tArray_Get(&dfsBuffer, (int)dfsBuffer.length - 1); Clay_LayoutElement *currentElement = Clay_LayoutElementArray_Get(&Clay__layoutElements, (int)currentElementIndex); if (Clay__treeNodeVisited.internalArray[dfsBuffer.length - 1]) { - if (currentElement->elementType != CLAY__LAYOUT_ELEMENT_TYPE_TEXT && currentElement->children.length > 0) { - Clay__CloseElementWithChildren(); - Clay__CloseElementWithChildren(); - Clay__CloseElementWithChildren(); + if (!Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT) && currentElement->children.length > 0) { + Clay__CloseElement(); + Clay__CloseElement(); + Clay__CloseElement(); } dfsBuffer.length--; continue; } if (highlightedRowIndex == layoutData.rowCount) { - if (Clay__pointerInfo.state == CLAY__POINTER_INFO_PRESSED_THIS_FRAME) { + if (Clay__pointerInfo.state == CLAY_POINTER_INFO_PRESSED_THIS_FRAME) { Clay__debugSelectedElementId = currentElement->id; } highlightedElementId = currentElement->id; } Clay__treeNodeVisited.internalArray[dfsBuffer.length - 1] = true; - Clay_ElementId outerHash = Clay__Rehash(outerId, currentElement->id); Clay_LayoutElementHashMapItem *currentElementData = Clay__GetHashMapItem(currentElement->id); Clay_BoundingBox currentElementBoundingBox = currentElementData->boundingBox; #ifndef CLAY_DISABLE_CULLING @@ -2615,75 +2788,77 @@ Clay__RenderDebugLayoutData Clay__RenderDebugLayoutElementsList(int32_t initialR if (Clay__debugSelectedElementId == currentElement->id) { layoutData.selectedElementRowIndex = layoutData.rowCount; } - CLAY_CONTAINER(outerHash, &Clay__DebugView_ScrollViewItemLayoutConfig) { - if (!(currentElement->elementType == CLAY__LAYOUT_ELEMENT_TYPE_TEXT || currentElement->children.length == 0)) { - CLAY_BORDER_CONTAINER(Clay__Rehash(collapseIconButton, currentElement->id), CLAY_LAYOUT(.sizing = {CLAY_SIZING_FIXED(16), CLAY_SIZING_FIXED(16)}, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER}), CLAY_BORDER_CONFIG_OUTSIDE_RADIUS(1, CLAY__DEBUGVIEW_COLOR_3, 4)) { - CLAY_TEXT(Clay__Rehash(collapseIcon, currentElement->id), (currentElementData && currentElementData->debugData->collapsed) ? CLAY_STRING("+") : CLAY_STRING("-"), CLAY_TEXT_CONFIG(.textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16)); + CLAY(CLAY_IDI("Clay__DebugView_ElementOuter", currentElement->id), Clay__AttachLayoutConfig(&Clay__DebugView_ScrollViewItemLayoutConfig)) { + // Collapse icon / button + if (!(Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT) || currentElement->children.length == 0)) { + CLAY(CLAY_IDI("Clay__DebugView_CollapseElement", currentElement->id), + CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED(16), CLAY_SIZING_FIXED(16)}, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER} }), + CLAY_BORDER_OUTSIDE_RADIUS(1, CLAY__DEBUGVIEW_COLOR_3, 4) + ) { + CLAY_TEXT((currentElementData && currentElementData->debugData->collapsed) ? CLAY_STRING("+") : CLAY_STRING("-"), CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 })); } - } else { - CLAY_CONTAINER(Clay__Rehash(collapseIconButton, currentElement->id), CLAY_LAYOUT(.sizing = {CLAY_SIZING_FIXED(16), CLAY_SIZING_FIXED(16)}, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER})) { - CLAY_RECTANGLE(Clay__Rehash(collapseIcon, currentElement->id), CLAY_LAYOUT(.sizing = {CLAY_SIZING_FIXED(8), CLAY_SIZING_FIXED(8)}), CLAY_RECTANGLE_CONFIG(.color = CLAY__DEBUGVIEW_COLOR_3, .cornerRadius = CLAY_CORNER_RADIUS(2))) {} + } else { // Square dot for empty containers + CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED(16), CLAY_SIZING_FIXED(16)}, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER } })) { + CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED(8), CLAY_SIZING_FIXED(8)} }), CLAY_RECTANGLE({ .color = CLAY__DEBUGVIEW_COLOR_3, .cornerRadius = CLAY_CORNER_RADIUS(2) })) {} } } - CLAY_CONTAINER(Clay__Rehash(outerHighlightId, currentElement->id), CLAY_LAYOUT(.padding = {0,4}, .childGap = 12, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER })) { - if (currentElementData) { - if (currentElementData->debugData->collision) { - CLAY_BORDER_CONTAINER(Clay__Rehash(elementOffscreenBorderId, currentElement->id), CLAY_LAYOUT(.padding = { 8, 2 }), CLAY_BORDER_CONFIG_OUTSIDE_RADIUS(1, (CLAY__INIT(Clay_Color){177, 147, 8, 255}), 4)) { - CLAY_TEXT(Clay__Rehash(elementDuplicateWarning, currentElement->id), CLAY_STRING("Duplicate ID"), CLAY_TEXT_CONFIG(.textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16)); - } - } - - if (offscreen) { - CLAY_BORDER_CONTAINER(Clay__Rehash(elementOffscreenBorderId, currentElement->id), CLAY_LAYOUT(.padding = { 8, 2 }), CLAY_BORDER_CONFIG_OUTSIDE_RADIUS(1, CLAY__DEBUGVIEW_COLOR_3, 4)) { - CLAY_TEXT(Clay__Rehash(elementDuplicateWarning, currentElement->id), CLAY_STRING("Offscreen"), CLAY_TEXT_CONFIG(.textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16)); - } + // Collisions and offscreen info + if (currentElementData) { + if (currentElementData->debugData->collision) { + CLAY(CLAY_LAYOUT({ .padding = { 8, 2 } }), CLAY_BORDER_OUTSIDE_RADIUS(1, (CLAY__INIT(Clay_Color){177, 147, 8, 255}), 4)) { + CLAY_TEXT(CLAY_STRING("Duplicate ID"), CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16 })); } } - CLAY_TEXT(Clay__Rehash(elementNameId, currentElement->id), Clay__layoutElementIdStrings.internalArray[currentElementIndex], offscreen ? CLAY_TEXT_CONFIG(.textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16) : &Clay__DebugView_TextNameConfig); - Clay_String elementTypeName = CLAY__INIT(Clay_String){}; - Clay_Color elementTypeColor = CLAY__INIT(Clay_Color){}; - switch (currentElement->elementType) { - case CLAY__LAYOUT_ELEMENT_TYPE_RECTANGLE: elementTypeName = CLAY_STRING("Rectangle"); elementTypeColor = (CLAY__INIT(Clay_Color) {243,134,48,255}); break; - case CLAY__LAYOUT_ELEMENT_TYPE_CONTAINER: elementTypeName = CLAY_STRING("Container"); elementTypeColor = (CLAY__INIT(Clay_Color) {53,92,125, 255}); break; - case CLAY__LAYOUT_ELEMENT_TYPE_TEXT: elementTypeName = CLAY_STRING("Text"); elementTypeColor = (CLAY__INIT(Clay_Color) {105,210,231,255}); break; - case CLAY__LAYOUT_ELEMENT_TYPE_IMAGE: elementTypeName = CLAY_STRING("Image"); elementTypeColor = (CLAY__INIT(Clay_Color) {121,189,154,255}); break; - case CLAY__LAYOUT_ELEMENT_TYPE_FLOATING_CONTAINER: elementTypeName = CLAY_STRING("Floating"); elementTypeColor = (CLAY__INIT(Clay_Color) {250,105,0,255}); break; - case CLAY__LAYOUT_ELEMENT_TYPE_SCROLL_CONTAINER: elementTypeName = CLAY_STRING("Scroll"); elementTypeColor = (CLAY__INIT(Clay_Color) {242,196,90,255}); break; - case CLAY__LAYOUT_ELEMENT_TYPE_BORDER_CONTAINER: elementTypeName = CLAY_STRING("Border"); elementTypeColor = (CLAY__INIT(Clay_Color) {108,91,123, 255}); break; - case CLAY__LAYOUT_ELEMENT_TYPE_CUSTOM: elementTypeName = CLAY_STRING("Custom"); elementTypeColor = (CLAY__INIT(Clay_Color) {11,72,107,255}); break; + if (offscreen) { + CLAY(CLAY_LAYOUT({ .padding = { 8, 2 } }), CLAY_BORDER_OUTSIDE_RADIUS(1, CLAY__DEBUGVIEW_COLOR_3, 4)) { + CLAY_TEXT(CLAY_STRING("Offscreen"), CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16 })); + } } - Clay_Color backgroundColor = elementTypeColor; + } + Clay_String idString = Clay__layoutElementIdStrings.internalArray[currentElementIndex]; + if (idString.length > 0) { + CLAY_TEXT(idString, offscreen ? CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16 }) : &Clay__DebugView_TextNameConfig); + } + for (int elementConfigIndex = 0; elementConfigIndex < currentElement->elementConfigs.length; ++elementConfigIndex) { + Clay_ElementConfig *elementConfig = Clay__ElementConfigArraySlice_Get(¤tElement->elementConfigs, elementConfigIndex); + Clay__DebugElementConfigTypeLabelConfig config = Clay__DebugGetElementConfigTypeLabel(elementConfig->type); + Clay_Color backgroundColor = config.color; backgroundColor.a = 90; - CLAY_BORDER_CONTAINER(Clay__Rehash(elementTypeBorderId, currentElement->id), &CLAY_LAYOUT_DEFAULT, CLAY_BORDER_CONFIG_OUTSIDE_RADIUS(1, elementTypeColor, 4)) { - CLAY_RECTANGLE(Clay__Rehash(elementTypeInnerRectId, currentElement->id), CLAY_LAYOUT(.padding = { 8, 2 }), CLAY_RECTANGLE_CONFIG(.color = backgroundColor, .cornerRadius = CLAY_CORNER_RADIUS(4))) { - CLAY_TEXT(Clay__Rehash(elementTypeTextId, currentElement->id), elementTypeName, CLAY_TEXT_CONFIG(.textColor = offscreen ? CLAY__DEBUGVIEW_COLOR_3 : CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16)); - } + CLAY(CLAY_LAYOUT({ .padding = { 8, 2 } }), CLAY_RECTANGLE({ .color = backgroundColor, .cornerRadius = CLAY_CORNER_RADIUS(4) }), CLAY_BORDER_OUTSIDE_RADIUS(1, config.color, 4)) { + CLAY_TEXT(config.label, CLAY_TEXT_CONFIG({ .textColor = offscreen ? CLAY__DEBUGVIEW_COLOR_3 : CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 })); } } } // Render the text contents below the element as a non-interactive row - if (currentElement->elementType == CLAY__LAYOUT_ELEMENT_TYPE_TEXT) { + if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT)) { layoutData.rowCount++; - Clay_TextElementConfig *rawTextConfig = offscreen ? CLAY_TEXT_CONFIG(.textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16) : &Clay__DebugView_TextNameConfig; - CLAY_RECTANGLE(Clay__Rehash(textContentsOuterId, currentElement->id), CLAY_LAYOUT(.sizing = { .height = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER }), CLAY_RECTANGLE_CONFIG()) { - CLAY_CONTAINER(Clay__Rehash(elementTextSpacer, currentElement->id), CLAY_LAYOUT(.sizing = {CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_INDENT_WIDTH + 16)})) {} - CLAY_TEXT(CLAY_IDI("Clay__DebugView_TextOpenQuote", currentElement->id), CLAY_STRING("\""), rawTextConfig); - CLAY_TEXT(Clay__Rehash(textContentsId, currentElement->id), currentElement->text.length > 40 ? (CLAY__INIT(Clay_String) { .length = 40, .chars = currentElement->text.chars }) : currentElement->text, rawTextConfig); - if (currentElement->text.length > 40) { - CLAY_TEXT(CLAY_IDI("Clay__DebugView_TextEllipsis", currentElement->id), CLAY_STRING("..."), rawTextConfig); + Clay__TextElementData *textElementData = currentElement->textElementData; + Clay_TextElementConfig *rawTextConfig = offscreen ? CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16 }) : &Clay__DebugView_TextNameConfig; + CLAY(CLAY_LAYOUT({ .sizing = { .height = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER } }), CLAY_RECTANGLE({})) { + CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_INDENT_WIDTH + 16)} })) {} + CLAY_TEXT(CLAY_STRING("\""), rawTextConfig); + CLAY_TEXT(textElementData->text.length > 40 ? (CLAY__INIT(Clay_String) { .length = 40, .chars = textElementData->text.chars }) : textElementData->text, rawTextConfig); + if (textElementData->text.length > 40) { + CLAY_TEXT(CLAY_STRING("..."), rawTextConfig); } - CLAY_TEXT(CLAY_IDI("Clay__DebugView_TextCloseQuote", currentElement->id), CLAY_STRING("\""), rawTextConfig); + CLAY_TEXT(CLAY_STRING("\""), rawTextConfig); } } else if (currentElement->children.length > 0) { - Clay__OpenContainerElement(Clay__Rehash(paddingOffset, currentElement->id), CLAY_LAYOUT(.padding = { 8 })); - Clay__OpenBorderElement(Clay__Rehash(border, currentElement->id), CLAY_LAYOUT(.layoutDirection = CLAY_LEFT_TO_RIGHT), CLAY_BORDER_CONFIG(.left = { .width = 1, .color = CLAY__DEBUGVIEW_COLOR_3 })); - CLAY_CONTAINER(Clay__Rehash(spacerId, currentElement->id), CLAY_LAYOUT(.sizing = {CLAY_SIZING_FIXED( CLAY__DEBUGVIEW_INDENT_WIDTH)}, .childAlignment = { .x = CLAY_ALIGN_X_RIGHT })) {} - Clay__OpenContainerElement(Clay__Rehash(inner, currentElement->id), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM)); + Clay__OpenElement(); + CLAY_LAYOUT({ .padding = { 8 } }); + Clay__ElementPostConfiguration(); + Clay__OpenElement(); + CLAY_BORDER({ .left = { .width = 1, .color = CLAY__DEBUGVIEW_COLOR_3 }}); + Clay__ElementPostConfiguration(); + CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED( CLAY__DEBUGVIEW_INDENT_WIDTH)}, .childAlignment = { .x = CLAY_ALIGN_X_RIGHT } })) {} + Clay__OpenElement(); + CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM }); + Clay__ElementPostConfiguration(); } layoutData.rowCount++; - if (!(currentElement->elementType == CLAY__LAYOUT_ELEMENT_TYPE_TEXT || (currentElementData && currentElementData->debugData->collapsed))) { + if (!(Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT) || (currentElementData && currentElementData->debugData->collapsed))) { for (int i = currentElement->children.length - 1; i >= 0; --i) { Clay__int32_tArray_Add(&dfsBuffer, currentElement->children.elements[i]); Clay__treeNodeVisited.internalArray[dfsBuffer.length - 1] = false; // TODO needs to be ranged checked @@ -2692,11 +2867,12 @@ Clay__RenderDebugLayoutData Clay__RenderDebugLayoutElementsList(int32_t initialR } } - if (Clay__pointerInfo.state == CLAY__POINTER_INFO_PRESSED_THIS_FRAME) { + if (Clay__pointerInfo.state == CLAY_POINTER_INFO_PRESSED_THIS_FRAME) { + Clay_ElementId collapseButtonId = Clay__HashString(CLAY_STRING("Clay__DebugView_CollapseElement"), 0, 0); if (Clay__pointerInfo.position.x > Clay__layoutDimensions.width - (float)Clay__debugViewWidth && Clay__pointerInfo.position.x < Clay__layoutDimensions.width && Clay__pointerInfo.position.y > 0 && Clay__pointerInfo.position.y < Clay__layoutDimensions.height) { for (int i = (int)Clay__pointerOverIds.length - 1; i >= 0; i--) { Clay_ElementId *elementId = Clay__ElementIdArray_Get(&Clay__pointerOverIds, i); - if (elementId->baseId == collapseIconButton.baseId) { + if (elementId->baseId == collapseButtonId.baseId) { Clay_LayoutElementHashMapItem *highlightedItem = Clay__GetHashMapItem(elementId->offset); highlightedItem->debugData->collapsed = !highlightedItem->debugData->collapsed; break; @@ -2706,99 +2882,102 @@ Clay__RenderDebugLayoutData Clay__RenderDebugLayoutElementsList(int32_t initialR } if (highlightedElementId) { - CLAY_FLOATING_CONTAINER(CLAY_ID("Clay__DebugView_ElementHighlight"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_GROW()}), CLAY_FLOATING_CONFIG(.zIndex = 65535, .parentId = highlightedElementId)) { - CLAY_RECTANGLE(CLAY_ID("Clay__DebugView_ElementHighlightRectangle"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_GROW()}), CLAY_RECTANGLE_CONFIG(.color = Clay__debugViewHighlightColor)) {} + CLAY(CLAY_ID("Clay__DebugView_ElementHighlight"), CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({}), CLAY_SIZING_GROW({})} }), CLAY_FLOATING({ .zIndex = 65535, .parentId = highlightedElementId })) { + CLAY(CLAY_ID("Clay__DebugView_ElementHighlightRectangle"), CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({}), CLAY_SIZING_GROW({})} }), CLAY_RECTANGLE({.color = Clay__debugViewHighlightColor })) {} } } return layoutData; } -void Clay__RenderDebugLayoutSizing(Clay_ElementId baseId, Clay_SizingAxis sizing, Clay_TextElementConfig *infoTextConfig) { +void Clay__RenderDebugLayoutSizing(Clay_SizingAxis sizing, Clay_TextElementConfig *infoTextConfig) { Clay_String sizingLabel = CLAY_STRING("GROW"); if (sizing.type == CLAY__SIZING_TYPE_FIT) { sizingLabel = CLAY_STRING("FIT"); } else if (sizing.type == CLAY__SIZING_TYPE_PERCENT) { sizingLabel = CLAY_STRING("PERCENT"); - } else if (sizing.type == CLAY__SIZING_TYPE_FIXED) { - sizingLabel = CLAY_STRING("FIXED"); - } - CLAY_TEXT(Clay__Rehash(baseId, 1), sizingLabel, infoTextConfig); + } + CLAY_TEXT(sizingLabel, infoTextConfig); if (sizing.type == CLAY__SIZING_TYPE_GROW || sizing.type == CLAY__SIZING_TYPE_FIT) { - CLAY_TEXT(Clay__Rehash(baseId, 2), CLAY_STRING("("), infoTextConfig); + CLAY_TEXT(CLAY_STRING("("), infoTextConfig); if (sizing.sizeMinMax.min != 0) { - CLAY_TEXT(Clay__Rehash(baseId, 3), CLAY_STRING("min: "), infoTextConfig); - CLAY_TEXT(Clay__Rehash(baseId, 4), Clay__IntToString(sizing.sizeMinMax.min), infoTextConfig); + CLAY_TEXT(CLAY_STRING("min: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(sizing.sizeMinMax.min), infoTextConfig); if (sizing.sizeMinMax.max != CLAY__MAXFLOAT) { - CLAY_TEXT(Clay__Rehash(baseId, 5), CLAY_STRING(", "), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", "), infoTextConfig); } } if (sizing.sizeMinMax.max != CLAY__MAXFLOAT) { - CLAY_TEXT(Clay__Rehash(baseId, 6), CLAY_STRING("max: "), infoTextConfig); - CLAY_TEXT(Clay__Rehash(baseId, 7), Clay__IntToString(sizing.sizeMinMax.max), infoTextConfig); + CLAY_TEXT(CLAY_STRING("max: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(sizing.sizeMinMax.max), infoTextConfig); } - CLAY_TEXT(Clay__Rehash(baseId, 8), CLAY_STRING(")"), infoTextConfig); - } else { - CLAY_TEXT(Clay__Rehash(baseId, 2), CLAY_STRING("("), infoTextConfig); - CLAY_TEXT(Clay__Rehash(baseId, 4), Clay__IntToString(sizing.sizeMinMax.min), infoTextConfig); - CLAY_TEXT(Clay__Rehash(baseId, 8), CLAY_STRING(")"), infoTextConfig); + CLAY_TEXT(CLAY_STRING(")"), infoTextConfig); } } -void Clay__RenderDebugViewElementConfigHeader(Clay_String elementId, Clay_String title) { - CLAY_RECTANGLE(CLAY_IDI("Clay__DebugViewElementConfigItemBorder", 1), CLAY_LAYOUT(.sizing = {.width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(1)}), CLAY_RECTANGLE_CONFIG(.color = CLAY__DEBUGVIEW_COLOR_3)) {} - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewElementConfigItemHeader"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING}, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER})) { - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementConfigTitle", 1), title, CLAY_TEXT_CONFIG(.textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE)); - CLAY_CONTAINER(CLAY_IDI("Clay__DebugViewElementConfigTitleSpacer", 1), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW() })) {} - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementConfigTitle", 2), elementId, CLAY_TEXT_CONFIG(.textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE)); +void Clay__RenderDebugViewElementConfigHeader(Clay_String elementId, Clay__ElementConfigType type) { + Clay__DebugElementConfigTypeLabelConfig config = Clay__DebugGetElementConfigTypeLabel(type); + Clay_Color backgroundColor = config.color; + backgroundColor.a = 90; + CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({}), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT + 8)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING }, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER } })) { + CLAY(CLAY_LAYOUT({ .padding = { 8, 2 } }), CLAY_RECTANGLE({ .color = backgroundColor, .cornerRadius = CLAY_CORNER_RADIUS(4) }), CLAY_BORDER_OUTSIDE_RADIUS(1, config.color, 4)) { + CLAY_TEXT(config.label, CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 })); + } + CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({}) } })) {} + CLAY_TEXT(elementId, CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE })); } - CLAY_RECTANGLE(CLAY_IDI("Clay__DebugViewElementConfigItemBorder", 2), CLAY_LAYOUT(.sizing = {.width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(1)}), CLAY_RECTANGLE_CONFIG(.color = CLAY__DEBUGVIEW_COLOR_3)) {} } void Clay__RenderDebugViewColor(Clay_Color color, Clay_TextElementConfig *textConfig) { - CLAY_CONTAINER(CLAY_ID_LOCAL("Color"), CLAY_LAYOUT(.childAlignment = {.y = CLAY_ALIGN_Y_CENTER})) { - CLAY_TEXT(CLAY_ID_LOCAL("Red"), CLAY_STRING("{ r: "), textConfig); - CLAY_TEXT(CLAY_ID_LOCAL("RedValue"), Clay__IntToString(color.r), textConfig); - CLAY_TEXT(CLAY_ID_LOCAL("Green"), CLAY_STRING(", g: "), textConfig); - CLAY_TEXT(CLAY_ID_LOCAL("GreenValue"), Clay__IntToString(color.g), textConfig); - CLAY_TEXT(CLAY_ID_LOCAL("Blue"), CLAY_STRING(", b: "), textConfig); - CLAY_TEXT(CLAY_ID_LOCAL("BlueValue"), Clay__IntToString(color.b), textConfig); - CLAY_TEXT(CLAY_ID_LOCAL("Alpha"), CLAY_STRING(", a: "), textConfig); - CLAY_TEXT(CLAY_ID_LOCAL("AlphaValue"), Clay__IntToString(color.a), textConfig); - CLAY_TEXT(CLAY_ID_LOCAL("Brace"), CLAY_STRING(" }"), textConfig); - CLAY_CONTAINER(CLAY_ID_LOCAL("Spacer"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_FIXED(10) })) {} - CLAY_BORDER_CONTAINER(CLAY_ID_LOCAL("PreviewBorder"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8)}), CLAY_BORDER_CONFIG_OUTSIDE_RADIUS(1, CLAY__DEBUGVIEW_COLOR_4, 4)) { - CLAY_RECTANGLE(CLAY_ID_LOCAL("PreviewBackground"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8)}), CLAY_RECTANGLE_CONFIG(.color = color, .cornerRadius = CLAY_CORNER_RADIUS(4))) {} + CLAY(CLAY_LAYOUT({ .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} })) { + CLAY_TEXT(CLAY_STRING("{ r: "), textConfig); + CLAY_TEXT(Clay__IntToString(color.r), textConfig); + CLAY_TEXT(CLAY_STRING(", g: "), textConfig); + CLAY_TEXT(Clay__IntToString(color.g), textConfig); + CLAY_TEXT(CLAY_STRING(", b: "), textConfig); + CLAY_TEXT(Clay__IntToString(color.b), textConfig); + CLAY_TEXT(CLAY_STRING(", a: "), textConfig); + CLAY_TEXT(Clay__IntToString(color.a), textConfig); + CLAY_TEXT(CLAY_STRING(" }"), textConfig); + CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED(10) } })) {} + CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8)} }), CLAY_BORDER_OUTSIDE_RADIUS(1, CLAY__DEBUGVIEW_COLOR_4, 4)) { + CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 8)} }), CLAY_RECTANGLE({ .color = color, .cornerRadius = CLAY_CORNER_RADIUS(4) })) {} } } } void Clay__RenderDebugViewCornerRadius(Clay_CornerRadius cornerRadius, Clay_TextElementConfig *textConfig) { - CLAY_CONTAINER(CLAY_ID_LOCAL("CornerRadius"), CLAY_LAYOUT(.childAlignment = {.y = CLAY_ALIGN_Y_CENTER})) { - CLAY_TEXT(CLAY_ID_LOCAL("TopLeftLabel"), CLAY_STRING("{ topLeft: "), textConfig); - CLAY_TEXT(CLAY_ID_LOCAL("TopLeft"), Clay__IntToString(cornerRadius.topLeft), textConfig); - CLAY_TEXT(CLAY_ID_LOCAL("TopRightLabel"), CLAY_STRING(", topRight: "), textConfig); - CLAY_TEXT(CLAY_ID_LOCAL("TopRight"), Clay__IntToString(cornerRadius.topRight), textConfig); - CLAY_TEXT(CLAY_ID_LOCAL("BottomLeftLabel"), CLAY_STRING(", bottomLeft: "), textConfig); - CLAY_TEXT(CLAY_ID_LOCAL("BottomLeft"), Clay__IntToString(cornerRadius.bottomLeft), textConfig); - CLAY_TEXT(CLAY_ID_LOCAL("BottomRightLabel"), CLAY_STRING(", bottomRight: "), textConfig); - CLAY_TEXT(CLAY_ID_LOCAL("BottomRight"), Clay__IntToString(cornerRadius.bottomRight), textConfig); - CLAY_TEXT(CLAY_ID_LOCAL("Brace"), CLAY_STRING(" }"), textConfig); + CLAY(CLAY_LAYOUT({ .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} })) { + CLAY_TEXT(CLAY_STRING("{ topLeft: "), textConfig); + CLAY_TEXT(Clay__IntToString(cornerRadius.topLeft), textConfig); + CLAY_TEXT(CLAY_STRING(", topRight: "), textConfig); + CLAY_TEXT(Clay__IntToString(cornerRadius.topRight), textConfig); + CLAY_TEXT(CLAY_STRING(", bottomLeft: "), textConfig); + CLAY_TEXT(Clay__IntToString(cornerRadius.bottomLeft), textConfig); + CLAY_TEXT(CLAY_STRING(", bottomRight: "), textConfig); + CLAY_TEXT(Clay__IntToString(cornerRadius.bottomRight), textConfig); + CLAY_TEXT(CLAY_STRING(" }"), textConfig); } } void Clay__RenderDebugViewBorder(int index, Clay_Border border, Clay_TextElementConfig *textConfig) { - CLAY_CONTAINER(CLAY_ID_LOCAL("BorderConfig"), CLAY_LAYOUT(.childAlignment = {.y = CLAY_ALIGN_Y_CENTER})) { - CLAY_TEXT(CLAY_ID_LOCAL("WidthLabel"), CLAY_STRING("{ width: "), textConfig); - CLAY_TEXT(CLAY_ID_LOCAL("Width"), Clay__IntToString(border.width), textConfig); - CLAY_TEXT(CLAY_ID_LOCAL("ColorLabel"), CLAY_STRING(", color: "), textConfig); + CLAY(CLAY_LAYOUT({ .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} })) { + CLAY_TEXT(CLAY_STRING("{ width: "), textConfig); + CLAY_TEXT(Clay__IntToString(border.width), textConfig); + CLAY_TEXT(CLAY_STRING(", color: "), textConfig); Clay__RenderDebugViewColor(border.color, textConfig); - CLAY_TEXT(CLAY_ID_LOCAL("Color"), CLAY_STRING(" }"), textConfig); + CLAY_TEXT(CLAY_STRING(" }"), textConfig); + } +} + +void HandleDebugViewCloseButtonInteraction(Clay_ElementId elementId, Clay_PointerInfo pointerInfo, intptr_t userData) { + if (pointerInfo.state == CLAY_POINTER_INFO_PRESSED_THIS_FRAME) { + Clay__debugModeEnabled = false; } } void Clay__RenderDebugView() { - Clay_ElementId closeButtonId = CLAY_ID("Clay__DebugViewTopHeaderCloseButtonOuter"); - if (Clay__pointerInfo.state == CLAY__POINTER_INFO_PRESSED_THIS_FRAME) { + Clay_ElementId closeButtonId = Clay__HashString(CLAY_STRING("Clay__DebugViewTopHeaderCloseButtonOuter"), 0, 0); + if (Clay__pointerInfo.state == CLAY_POINTER_INFO_PRESSED_THIS_FRAME) { for (int i = 0; i < Clay__pointerOverIds.length; ++i) { Clay_ElementId *elementId = Clay__ElementIdArray_Get(&Clay__pointerOverIds, i); if (elementId->id == closeButtonId.id) { @@ -2810,13 +2989,13 @@ void Clay__RenderDebugView() { uint32_t initialRootsLength = Clay__layoutElementTreeRoots.length; uint32_t initialElementsLength = Clay__layoutElements.length; - Clay_TextElementConfig *infoTextConfig = CLAY_TEXT_CONFIG(.textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE); - Clay_TextElementConfig *infoTitleConfig = CLAY_TEXT_CONFIG(.textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE); - uint32_t scrollId = CLAY_ID("Clay__DebugViewOuterScrollPane").id; + Clay_TextElementConfig *infoTextConfig = CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE }); + Clay_TextElementConfig *infoTitleConfig = CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_3, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE }); + Clay_ElementId scrollId = Clay__HashString(CLAY_STRING("Clay__DebugViewOuterScrollPane"), 0, 0); float scrollYOffset = 0; for (int i = 0; i < Clay__scrollContainerDatas.length; ++i) { Clay__ScrollContainerDataInternal *scrollContainerData = Clay__ScrollContainerDataInternalArray_Get(&Clay__scrollContainerDatas, i); - if (scrollContainerData->elementId == scrollId) { + if (scrollContainerData->elementId == scrollId.id) { scrollYOffset = scrollContainerData->scrollPosition.y; break; } @@ -2826,282 +3005,284 @@ void Clay__RenderDebugView() { highlightedRow = -1; } Clay__RenderDebugLayoutData layoutData = {}; - CLAY_FLOATING_CONTAINER(CLAY_ID("Clay__DebugView"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_FIXED((float)Clay__debugViewWidth) , CLAY_SIZING_FIXED(Clay__layoutDimensions.height) }), CLAY_FLOATING_CONFIG(.attachment = { .element = CLAY_ATTACH_POINT_LEFT_CENTER, .parent = CLAY_ATTACH_POINT_RIGHT_CENTER })) { - CLAY_RECTANGLE(CLAY_ID("Clay__DebugViewLeftBorder"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_FIXED(1), .height = CLAY_SIZING_GROW() }), CLAY_RECTANGLE_CONFIG(.color = CLAY__DEBUGVIEW_COLOR_3)) {} - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewInner"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_GROW()}, .layoutDirection = CLAY_TOP_TO_BOTTOM )) { - CLAY_RECTANGLE(CLAY_ID("Clay__DebugViewTopHeaderOuter"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING}, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}), CLAY_RECTANGLE_CONFIG(.color = CLAY__DEBUGVIEW_COLOR_2)) { - CLAY_TEXT(CLAY_IDI("Clay__DebugViewTopHeaderId", 1), CLAY_STRING("Clay Debug Tools"), infoTextConfig); - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewTopHeaderSpacer"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW() })) {} - CLAY_BORDER_CONTAINER(CLAY_ID("Clay__DebugViewTopHeaderCloseButtonOuter"), &CLAY_LAYOUT_DEFAULT, CLAY_BORDER_CONFIG_OUTSIDE_RADIUS(1, (CLAY__INIT(Clay_Color){217,91,67,255}), 4)) { - CLAY_RECTANGLE(CLAY_ID("Clay__DebugViewTopHeaderCloseButtonInner"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 10), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 10)}, .childAlignment = {CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER}), CLAY_RECTANGLE_CONFIG(.color = (CLAY__INIT(Clay_Color){217,91,67,80}))) { - CLAY_TEXT(CLAY_ID("Clay__DebugViewTopHeaderCloseButtonText"), CLAY_STRING("x"), CLAY_TEXT_CONFIG(.textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16)); + CLAY(CLAY_ID("Clay__DebugView"), + CLAY_FLOATING({ .parentId = Clay__HashString(CLAY_STRING("Clay__RootContainer"), 0, 0).id, .attachment = { .element = CLAY_ATTACH_POINT_LEFT_CENTER, .parent = CLAY_ATTACH_POINT_RIGHT_CENTER }}), + CLAY_LAYOUT({ .sizing = { CLAY_SIZING_FIXED((float)Clay__debugViewWidth) , CLAY_SIZING_FIXED(Clay__layoutDimensions.height) }, .layoutDirection = CLAY_TOP_TO_BOTTOM }), + CLAY_BORDER({ .bottom = { .width = 1, .color = CLAY__DEBUGVIEW_COLOR_3 }}) + ) { + CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({}), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING}, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} }), CLAY_RECTANGLE({ .color = CLAY__DEBUGVIEW_COLOR_2 })) { + CLAY_TEXT(CLAY_STRING("Clay Debug Tools"), infoTextConfig); + CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({}) } })) {} + // Close button + CLAY(CLAY_BORDER_OUTSIDE_RADIUS(1, (CLAY__INIT(Clay_Color){217,91,67,255}), 4), + CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 10), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT - 10)}, .childAlignment = {CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER} }), + CLAY_RECTANGLE({ .color = {217,91,67,80} }), + Clay_OnHover(HandleDebugViewCloseButtonInteraction, 0) + ) { + CLAY_TEXT(CLAY_STRING("x"), CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16 })); + } + } + CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({}), CLAY_SIZING_FIXED(1)} }), CLAY_RECTANGLE({ .color = CLAY__DEBUGVIEW_COLOR_3 })) {} + CLAY(Clay__AttachId(scrollId), CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({}), CLAY_SIZING_GROW({})} }), CLAY_SCROLL({ .horizontal = true, .vertical = true })) { + CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({}), CLAY_SIZING_GROW({})}, .layoutDirection = CLAY_TOP_TO_BOTTOM }), CLAY_RECTANGLE({ .color = ((initialElementsLength + initialRootsLength) & 1) == 0 ? CLAY__DEBUGVIEW_COLOR_2 : CLAY__DEBUGVIEW_COLOR_1 })) { + Clay_ElementId panelContentsId = Clay__HashString(CLAY_STRING("Clay__DebugViewPaneOuter"), 0, 0); + // Element list + CLAY(Clay__AttachId(panelContentsId), CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({}), CLAY_SIZING_GROW({})} }), CLAY_FLOATING({})) { + CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({}), CLAY_SIZING_GROW({})}, .padding = {.x = CLAY__DEBUGVIEW_OUTER_PADDING }, .layoutDirection = CLAY_TOP_TO_BOTTOM })) { + layoutData = Clay__RenderDebugLayoutElementsList((int32_t)initialRootsLength, highlightedRow); } } - } - CLAY_RECTANGLE(CLAY_ID("Clay__DebugViewTopHeaderBorder"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(1)}), CLAY_RECTANGLE_CONFIG(.color = CLAY__DEBUGVIEW_COLOR_3)) {} - CLAY_SCROLL_CONTAINER(CLAY_ID("Clay__DebugViewOuterScrollPane"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_GROW()}), CLAY_SCROLL_CONFIG(.horizontal = true, .vertical = true)) { - CLAY_RECTANGLE(CLAY_ID("Clay__DebugViewPaneBackground"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_GROW()}, .layoutDirection = CLAY_TOP_TO_BOTTOM), CLAY_RECTANGLE_CONFIG(.color = ((initialElementsLength + initialRootsLength) & 1) == 0 ? CLAY__DEBUGVIEW_COLOR_2 : CLAY__DEBUGVIEW_COLOR_1)) { - Clay_ElementId panelContentsId = CLAY_ID("Clay__DebugViewPaneOuter"); - CLAY_FLOATING_CONTAINER(panelContentsId, CLAY_LAYOUT(.sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_GROW()}), CLAY_FLOATING_CONFIG()) { - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewPane"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_GROW()}, .padding = {.x = CLAY__DEBUGVIEW_OUTER_PADDING }, .layoutDirection = CLAY_TOP_TO_BOTTOM)) { - layoutData = Clay__RenderDebugLayoutElementsList((int32_t)initialRootsLength, highlightedRow); - } + float contentWidth = Clay__GetHashMapItem(panelContentsId.id)->layoutElement->dimensions.width; + CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED(contentWidth)}, .layoutDirection = CLAY_TOP_TO_BOTTOM })) {} + for (uint32_t i = 0; i < layoutData.rowCount; i++) { + Clay_Color rowColor = (i & 1) == 0 ? CLAY__DEBUGVIEW_COLOR_2 : CLAY__DEBUGVIEW_COLOR_1; + if (i == layoutData.selectedElementRowIndex) { + rowColor = CLAY__DEBUGVIEW_COLOR_SELECTED_ROW; } - float contentWidth = Clay__GetHashMapItem(panelContentsId.id)->layoutElement->dimensions.width; - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewScrollPanelWidth"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_FIXED(contentWidth)}, .layoutDirection = CLAY_TOP_TO_BOTTOM)) {} - for (uint32_t i = 0; i < layoutData.rowCount; i++) { - Clay_Color rowColor = (i & 1) == 0 ? CLAY__DEBUGVIEW_COLOR_2 : CLAY__DEBUGVIEW_COLOR_1; - if (i == layoutData.selectedElementRowIndex) { - rowColor = CLAY__DEBUGVIEW_COLOR_SELECTED_ROW; - } - if (i == highlightedRow) { - rowColor.r *= 1.25f; - rowColor.g *= 1.25f; - rowColor.b *= 1.25f; - } - CLAY_RECTANGLE(CLAY_IDI("Clay__DebugViewStripe", i), CLAY_LAYOUT(.sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .layoutDirection = CLAY_TOP_TO_BOTTOM), CLAY_RECTANGLE_CONFIG(.color = rowColor)) {} + if (i == highlightedRow) { + rowColor.r *= 1.25f; + rowColor.g *= 1.25f; + rowColor.b *= 1.25f; } + CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({}), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .layoutDirection = CLAY_TOP_TO_BOTTOM }), CLAY_RECTANGLE({ .color = rowColor })) {} } } - CLAY_RECTANGLE(CLAY_ID("Clay__DebugViewPanelBorder"), CLAY_LAYOUT(.sizing = {.width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(1)}), CLAY_RECTANGLE_CONFIG(.color = CLAY__DEBUGVIEW_COLOR_3)) {} - if (Clay__debugSelectedElementId != 0) { - Clay_LayoutElementHashMapItem *selectedItem = Clay__GetHashMapItem(Clay__debugSelectedElementId); - CLAY_SCROLL_CONTAINER(CLAY_ID("Clay__DebugViewInfoScrollPane"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(300)}, .childGap = 6), CLAY_SCROLL_CONFIG(.vertical = true)) { - CLAY_RECTANGLE(CLAY_ID("Clay__DebugViewElementInfoPane"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_GROW()}, .layoutDirection = CLAY_TOP_TO_BOTTOM), CLAY_RECTANGLE_CONFIG(.color = CLAY__DEBUGVIEW_COLOR_2)) { - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewElementInfoItemHeader"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING}, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER})) { - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoTitleId", 1), CLAY_STRING("Layout Config"), infoTextConfig); - CLAY_CONTAINER(CLAY_IDI("Clay__DebugViewElementInfoTitleSpacer", 1), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW() })) {} - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoTitle", 2), selectedItem->elementId.stringId, infoTitleConfig); - if (selectedItem->elementId.offset != 0) { - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoTitleIdOpenParen", 1), CLAY_STRING(" ("), infoTitleConfig); - CLAY_TEXT(CLAY_ID("Clay__DebugViewElementInfoTitleIdIndex"), Clay__IntToString(selectedItem->elementId.offset), infoTitleConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoTitleIdOpenParen", 3), CLAY_STRING(")"), infoTitleConfig); - } + } + CLAY(CLAY_LAYOUT({ .sizing = {.width = CLAY_SIZING_GROW({}), .height = CLAY_SIZING_FIXED(1)} }), CLAY_RECTANGLE({ .color = CLAY__DEBUGVIEW_COLOR_3 })) {} + if (Clay__debugSelectedElementId != 0) { + Clay_LayoutElementHashMapItem *selectedItem = Clay__GetHashMapItem(Clay__debugSelectedElementId); + CLAY( + CLAY_SCROLL({ .vertical = true }), + CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({}), CLAY_SIZING_FIXED(300)}, .layoutDirection = CLAY_TOP_TO_BOTTOM }), + CLAY_RECTANGLE({ .color = CLAY__DEBUGVIEW_COLOR_2 }), + CLAY_BORDER({ .betweenChildren = { .width = 1, .color = CLAY__DEBUGVIEW_COLOR_3 }}) + ) { + CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({}), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT + 8)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING}, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} })) { + CLAY_TEXT(CLAY_STRING("Layout Config"), infoTextConfig); + CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({}) } })) {} + if (selectedItem->elementId.stringId.length != 0) { + CLAY_TEXT(selectedItem->elementId.stringId, infoTitleConfig); + if (selectedItem->elementId.offset != 0) { + CLAY_TEXT(CLAY_STRING(" ("), infoTitleConfig); + CLAY_TEXT(Clay__IntToString(selectedItem->elementId.offset), infoTitleConfig); + CLAY_TEXT(CLAY_STRING(")"), infoTitleConfig); } - // Clay_LayoutConfig debug info - CLAY_RECTANGLE(CLAY_ID("Clay__DebugViewElementInfoTopBorder"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(1)}), CLAY_RECTANGLE_CONFIG(.color = CLAY__DEBUGVIEW_COLOR_3)) {} - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewElementInfoLayoutBody"), CLAY_LAYOUT(.padding = {8, 8}, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM)) { - // .boundingBox - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutTitle", 1), CLAY_STRING("Bounding Box"), infoTitleConfig); - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewElementInfoLayoutBoundingBox"), CLAY_LAYOUT()) { - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutBoundingData", 1), CLAY_STRING("{ x: "), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutBoundingData", 2), Clay__IntToString(selectedItem->boundingBox.x), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutBoundingData", 3), CLAY_STRING(", y: "), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutBoundingData", 4), Clay__IntToString(selectedItem->boundingBox.y), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutBoundingData", 5), CLAY_STRING(", width: "), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutBoundingData", 6), Clay__IntToString(selectedItem->boundingBox.width), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutBoundingData", 7), CLAY_STRING(", height: "), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutBoundingData", 8), Clay__IntToString(selectedItem->boundingBox.height), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutBoundingData", 9), CLAY_STRING(" }"), infoTextConfig); - } - // .layoutDirection - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutTitle", 2), CLAY_STRING("Layout Direction"), infoTitleConfig); - Clay_LayoutConfig *layoutConfig = selectedItem->layoutElement->layoutConfig; - CLAY_TEXT(CLAY_ID("Clay__DebugViewElementInfoLayoutDirection"), layoutConfig->layoutDirection == CLAY_TOP_TO_BOTTOM ? CLAY_STRING("TOP_TO_BOTTOM") : CLAY_STRING("LEFT_TO_RIGHT"), infoTextConfig); - // .sizing - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutTitle", 3), CLAY_STRING("Sizing"), infoTitleConfig); - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewElementInfoSizingWidth"), CLAY_LAYOUT()) { - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoSizingData", 1), CLAY_STRING("width: "), infoTextConfig); - Clay__RenderDebugLayoutSizing(CLAY_ID("Clay__DebugViewElementInfoSizingDataWidth"), layoutConfig->sizing.width, infoTextConfig); - } - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewElementInfoSizingHeight"), CLAY_LAYOUT()) { - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoSizingData", 2), CLAY_STRING("height: "), infoTextConfig); - Clay__RenderDebugLayoutSizing(CLAY_ID("Clay__DebugViewElementInfoSizingDataHeight"), layoutConfig->sizing.height, infoTextConfig); - } - // .padding - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutTitle", 4), CLAY_STRING("Padding"), infoTitleConfig); - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewElementInfoPadding"), CLAY_LAYOUT()) { - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutPaddingData", 1), CLAY_STRING("{ x: "), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutPaddingData", 2), Clay__IntToString(layoutConfig->padding.x), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutPaddingData", 3), CLAY_STRING(", y: "), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutPaddingData", 4), Clay__IntToString(layoutConfig->padding.y), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutPaddingData", 5), CLAY_STRING(" }"), infoTextConfig); - } - // .childGap - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutTitle", 5), CLAY_STRING("Child Gap"), infoTitleConfig); - CLAY_TEXT(CLAY_ID("Clay__DebugViewElementInfoLayoutChildGap"), Clay__IntToString(layoutConfig->childGap), infoTextConfig); - // .childAlignment - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutTitle", 6), CLAY_STRING("Child Alignment"), infoTitleConfig); - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewElementInfoLayoutAlignment"), CLAY_LAYOUT()) { - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutAlignment", 1), CLAY_STRING("{ x: "), infoTextConfig); - Clay_String alignX = CLAY_STRING("LEFT"); - if (layoutConfig->childAlignment.x == CLAY_ALIGN_X_CENTER) { - alignX = CLAY_STRING("CENTER"); - } else if (layoutConfig->childAlignment.x == CLAY_ALIGN_X_RIGHT) { - alignX = CLAY_STRING("RIGHT"); - } - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutAlignment", 2), alignX, infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutAlignment", 3), CLAY_STRING(", y: "), infoTextConfig); - Clay_String alignY = CLAY_STRING("TOP"); - if (layoutConfig->childAlignment.y == CLAY_ALIGN_Y_CENTER) { - alignY = CLAY_STRING("CENTER"); - } else if (layoutConfig->childAlignment.y == CLAY_ALIGN_Y_BOTTOM) { - alignY = CLAY_STRING("BOTTOM"); - } - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutAlignment", 4), alignY, infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoLayoutAlignment", 5), CLAY_STRING(" }"), infoTextConfig); - } + } + } + // Clay_LayoutConfig debug info + CLAY(CLAY_LAYOUT({ .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, 8}, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM })) { + // .boundingBox + CLAY_TEXT(CLAY_STRING("Bounding Box"), infoTitleConfig); + CLAY(CLAY_LAYOUT({})) { + CLAY_TEXT(CLAY_STRING("{ x: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(selectedItem->boundingBox.x), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", y: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(selectedItem->boundingBox.y), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", width: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(selectedItem->boundingBox.width), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", height: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(selectedItem->boundingBox.height), infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); + } + // .layoutDirection + CLAY_TEXT(CLAY_STRING("Layout Direction"), infoTitleConfig); + Clay_LayoutConfig *layoutConfig = selectedItem->layoutElement->layoutConfig; + CLAY_TEXT(layoutConfig->layoutDirection == CLAY_TOP_TO_BOTTOM ? CLAY_STRING("TOP_TO_BOTTOM") : CLAY_STRING("LEFT_TO_RIGHT"), infoTextConfig); + // .sizing + CLAY_TEXT(CLAY_STRING("Sizing"), infoTitleConfig); + CLAY(CLAY_LAYOUT({})) { + CLAY_TEXT(CLAY_STRING("width: "), infoTextConfig); + Clay__RenderDebugLayoutSizing(layoutConfig->sizing.width, infoTextConfig); + } + CLAY(CLAY_LAYOUT({})) { + CLAY_TEXT(CLAY_STRING("height: "), infoTextConfig); + Clay__RenderDebugLayoutSizing(layoutConfig->sizing.height, infoTextConfig); + } + // .padding + CLAY_TEXT(CLAY_STRING("Padding"), infoTitleConfig); + CLAY(CLAY_ID("Clay__DebugViewElementInfoPadding")) { + CLAY_TEXT(CLAY_STRING("{ x: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(layoutConfig->padding.x), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", y: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(layoutConfig->padding.y), infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); + } + // .childGap + CLAY_TEXT(CLAY_STRING("Child Gap"), infoTitleConfig); + CLAY_TEXT(Clay__IntToString(layoutConfig->childGap), infoTextConfig); + // .childAlignment + CLAY_TEXT(CLAY_STRING("Child Alignment"), infoTitleConfig); + CLAY(CLAY_LAYOUT({})) { + CLAY_TEXT(CLAY_STRING("{ x: "), infoTextConfig); + Clay_String alignX = CLAY_STRING("LEFT"); + if (layoutConfig->childAlignment.x == CLAY_ALIGN_X_CENTER) { + alignX = CLAY_STRING("CENTER"); + } else if (layoutConfig->childAlignment.x == CLAY_ALIGN_X_RIGHT) { + alignX = CLAY_STRING("RIGHT"); } - switch (selectedItem->layoutElement->elementType) { - case CLAY__LAYOUT_ELEMENT_TYPE_CONTAINER: break; - case CLAY__LAYOUT_ELEMENT_TYPE_RECTANGLE: { - Clay_RectangleElementConfig *rectangleConfig = selectedItem->layoutElement->elementConfig.rectangleElementConfig; - Clay__RenderDebugViewElementConfigHeader(selectedItem->elementId.stringId, CLAY_STRING("Rectangle Element Config")); - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewElementInfoRectangleBody"), CLAY_LAYOUT(.padding = {8, 8}, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM)) { - // .color - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoRectangleColorTitle", 1), CLAY_STRING("Color"), infoTitleConfig); - Clay__RenderDebugViewColor(rectangleConfig->color, infoTextConfig); - // .cornerRadius - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoRectangleColorTitle", 2), CLAY_STRING("Corner Radius"), infoTitleConfig); - Clay__RenderDebugViewCornerRadius(rectangleConfig->cornerRadius, infoTextConfig); + CLAY_TEXT(alignX, infoTextConfig); + CLAY_TEXT(CLAY_STRING(", y: "), infoTextConfig); + Clay_String alignY = CLAY_STRING("TOP"); + if (layoutConfig->childAlignment.y == CLAY_ALIGN_Y_CENTER) { + alignY = CLAY_STRING("CENTER"); + } else if (layoutConfig->childAlignment.y == CLAY_ALIGN_Y_BOTTOM) { + alignY = CLAY_STRING("BOTTOM"); + } + CLAY_TEXT(alignY, infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); + } + } + for (int elementConfigIndex = 0; elementConfigIndex < selectedItem->layoutElement->elementConfigs.length; ++elementConfigIndex) { + Clay_ElementConfig *elementConfig = Clay__ElementConfigArraySlice_Get(&selectedItem->layoutElement->elementConfigs, elementConfigIndex); + Clay__RenderDebugViewElementConfigHeader(selectedItem->elementId.stringId, elementConfig->type); + switch (elementConfig->type) { + case CLAY__ELEMENT_CONFIG_TYPE_RECTANGLE: { + Clay_RectangleElementConfig *rectangleConfig = elementConfig->config.rectangleElementConfig; + CLAY(CLAY_LAYOUT({ .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, 8}, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM })) { + // .color + CLAY_TEXT(CLAY_STRING("Color"), infoTitleConfig); + Clay__RenderDebugViewColor(rectangleConfig->color, infoTextConfig); + // .cornerRadius + CLAY_TEXT(CLAY_STRING("Corner Radius"), infoTitleConfig); + Clay__RenderDebugViewCornerRadius(rectangleConfig->cornerRadius, infoTextConfig); + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_TEXT: { + Clay_TextElementConfig *textConfig = elementConfig->config.textElementConfig; + CLAY(CLAY_LAYOUT({ .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, 8}, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM })) { + // .fontSize + CLAY_TEXT(CLAY_STRING("Font Size"), infoTitleConfig); + CLAY_TEXT(Clay__IntToString(textConfig->fontSize), infoTextConfig); + // .fontId + CLAY_TEXT(CLAY_STRING("Font ID"), infoTitleConfig); + CLAY_TEXT(Clay__IntToString(textConfig->fontId), infoTextConfig); + // .lineHeight + CLAY_TEXT(CLAY_STRING("Line Height"), infoTitleConfig); + CLAY_TEXT(textConfig->lineHeight == 0 ? CLAY_STRING("auto") : Clay__IntToString(textConfig->lineHeight), infoTextConfig); + // .letterSpacing + CLAY_TEXT(CLAY_STRING("Letter Spacing"), infoTitleConfig); + CLAY_TEXT(Clay__IntToString(textConfig->letterSpacing), infoTextConfig); + // .lineSpacing + CLAY_TEXT(CLAY_STRING("Wrap Mode"), infoTitleConfig); + Clay_String wrapMode = CLAY_STRING("WORDS"); + if (textConfig->wrapMode == CLAY_TEXT_WRAP_NONE) { + wrapMode = CLAY_STRING("NONE"); + } else if (textConfig->wrapMode == CLAY_TEXT_WRAP_NEWLINES) { + wrapMode = CLAY_STRING("NEWLINES"); } - break; + CLAY_TEXT(wrapMode, infoTextConfig); + // .textColor + CLAY_TEXT(CLAY_STRING("Text Color"), infoTitleConfig); + Clay__RenderDebugViewColor(textConfig->textColor, infoTextConfig); } - case CLAY__LAYOUT_ELEMENT_TYPE_TEXT: { - Clay_TextElementConfig *textConfig = selectedItem->layoutElement->elementConfig.textElementConfig; - Clay__RenderDebugViewElementConfigHeader(selectedItem->elementId.stringId, CLAY_STRING("Text Element Config")); - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewElementInfoRectangleBody"), CLAY_LAYOUT(.padding = {8, 8}, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM)) { - // .fontSize - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoRectangleFontTitle", 1), CLAY_STRING("Font Size"), infoTitleConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoRectangleFontBody", 1), Clay__IntToString(textConfig->fontSize), infoTextConfig); - // .fontId - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoRectangleFontTitle", 2), CLAY_STRING("Font ID"), infoTitleConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoRectangleFontBody", 2), Clay__IntToString(textConfig->fontId), infoTextConfig); - // .lineHeight - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoRectangleFontTitle", 3), CLAY_STRING("Line Height"), infoTitleConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoRectangleFontBody", 3), textConfig->lineHeight == 0 ? CLAY_STRING("Auto") : Clay__IntToString(textConfig->lineHeight), infoTextConfig); - // .letterSpacing - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoRectangleFontTitle", 4), CLAY_STRING("Letter Spacing"), infoTitleConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoRectangleFontBody", 4), Clay__IntToString(textConfig->letterSpacing), infoTextConfig); - // .lineSpacing - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoRectangleFontTitle", 5), CLAY_STRING("Wrap Mode"), infoTitleConfig); - Clay_String wrapMode = CLAY_STRING("WORDS"); - if (textConfig->wrapMode == CLAY_TEXT_WRAP_NONE) { - wrapMode = CLAY_STRING("NONE"); - } else if (textConfig->wrapMode == CLAY_TEXT_WRAP_NEWLINES) { - wrapMode = CLAY_STRING("NEWLINES"); - } - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoRectangleFontBody", 5), wrapMode, infoTextConfig); - // .textColor - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoRectangleFontTitle", 6), CLAY_STRING("Text Color"), infoTitleConfig); - Clay__RenderDebugViewColor(textConfig->textColor, infoTextConfig); + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_IMAGE: { + Clay_ImageElementConfig *imageConfig = elementConfig->config.imageElementConfig; + CLAY(CLAY_ID("Clay__DebugViewElementInfoImageBody"), CLAY_LAYOUT({ .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, 8}, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM })) { + // .sourceDimensions + CLAY_TEXT(CLAY_STRING("Source Dimensions"), infoTitleConfig); + CLAY(CLAY_ID("Clay__DebugViewElementInfoImageDimensions")) { + CLAY_TEXT(CLAY_STRING("{ width: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(imageConfig->sourceDimensions.width), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", height: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(imageConfig->sourceDimensions.height), infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); } - break; + // Image Preview + CLAY_TEXT(CLAY_STRING("Preview"), infoTitleConfig); + CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = imageConfig->sourceDimensions.width }) }}), Clay__AttachElementConfig(CLAY__INIT(Clay_ElementConfigUnion) { .imageElementConfig = imageConfig }, CLAY__ELEMENT_CONFIG_TYPE_IMAGE)) {} } - case CLAY__LAYOUT_ELEMENT_TYPE_IMAGE: { - Clay_ImageElementConfig *imageConfig = selectedItem->layoutElement->elementConfig.imageElementConfig; - Clay__RenderDebugViewElementConfigHeader(selectedItem->elementId.stringId, CLAY_STRING("Image Element Config")); - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewElementInfoImageBody"), CLAY_LAYOUT(.padding = {8, 8}, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM)) { - // .sourceDimensions - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoImageTitle", 1), CLAY_STRING("Source Dimensions"), infoTitleConfig); - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewElementInfoImageDimensions"), CLAY_LAYOUT()) { - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoImageDimensionsData", 1), CLAY_STRING("{ width: "), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoImageDimensionsData", 2), Clay__IntToString(imageConfig->sourceDimensions.width), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoImageDimensionsData", 3), CLAY_STRING(", height: "), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoImageDimensionsData", 4), Clay__IntToString(imageConfig->sourceDimensions.height), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoImageDimensionsData", 5), CLAY_STRING(" }"), infoTextConfig); - } - // Image Preview - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoImageTitle", 2), CLAY_STRING("Preview"), infoTitleConfig); - CLAY_IMAGE(CLAY_ID("Clay__DebugViewElementInfoImagePreview"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(.max = imageConfig->sourceDimensions.width) }), imageConfig) {} + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER: { + Clay_ScrollElementConfig *scrollConfig = elementConfig->config.scrollElementConfig; + CLAY(CLAY_LAYOUT({ .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, 8}, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM })) { + // .vertical + CLAY_TEXT(CLAY_STRING("Vertical"), infoTitleConfig); + CLAY_TEXT(scrollConfig->vertical ? CLAY_STRING("true") : CLAY_STRING("false") , infoTextConfig); + // .horizontal + CLAY_TEXT(CLAY_STRING("Horizontal"), infoTitleConfig); + CLAY_TEXT(scrollConfig->horizontal ? CLAY_STRING("true") : CLAY_STRING("false") , infoTextConfig); + } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_FLOATING_CONTAINER: { + Clay_FloatingElementConfig *floatingConfig = elementConfig->config.floatingElementConfig; + CLAY(CLAY_LAYOUT({ .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, 8}, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM })) { + // .offset + CLAY_TEXT(CLAY_STRING("Offset"), infoTitleConfig); + CLAY(CLAY_LAYOUT({})) { + CLAY_TEXT(CLAY_STRING("{ x: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(floatingConfig->offset.x), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", y: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(floatingConfig->offset.y), infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); } - break; - } - case CLAY__LAYOUT_ELEMENT_TYPE_SCROLL_CONTAINER: { - Clay_ScrollElementConfig *scrollConfig = selectedItem->layoutElement->elementConfig.scrollElementConfig; - Clay__RenderDebugViewElementConfigHeader(selectedItem->elementId.stringId, CLAY_STRING("Scroll Element Config")); - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewElementInfoScrollBody"), CLAY_LAYOUT(.padding = {8, 8}, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM)) { - // .vertical - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoScrollTitle", 1), CLAY_STRING("Vertical"), infoTitleConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoImageVerticalData", 1), scrollConfig->vertical ? CLAY_STRING("true") : CLAY_STRING("false") , infoTextConfig); - // .horizontal - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoScrollTitle", 2), CLAY_STRING("Horizontal"), infoTitleConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoImageVerticalData", 2), scrollConfig->horizontal ? CLAY_STRING("true") : CLAY_STRING("false") , infoTextConfig); + // .expand + CLAY_TEXT(CLAY_STRING("Expand"), infoTitleConfig); + CLAY(CLAY_LAYOUT({})) { + CLAY_TEXT(CLAY_STRING("{ width: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(floatingConfig->expand.width), infoTextConfig); + CLAY_TEXT(CLAY_STRING(", height: "), infoTextConfig); + CLAY_TEXT(Clay__IntToString(floatingConfig->expand.height), infoTextConfig); + CLAY_TEXT(CLAY_STRING(" }"), infoTextConfig); } - break; + // .zIndex + CLAY_TEXT(CLAY_STRING("z-index"), infoTitleConfig); + CLAY_TEXT(Clay__IntToString(floatingConfig->zIndex), infoTextConfig); + // .parentId + CLAY_TEXT(CLAY_STRING("Parent"), infoTitleConfig); + Clay_LayoutElementHashMapItem *hashItem = Clay__GetHashMapItem(floatingConfig->parentId); + CLAY_TEXT(hashItem->elementId.stringId, infoTextConfig); } - case CLAY__LAYOUT_ELEMENT_TYPE_FLOATING_CONTAINER: { - Clay_FloatingElementConfig *floatingConfig = selectedItem->layoutElement->elementConfig.floatingElementConfig; - Clay__RenderDebugViewElementConfigHeader(selectedItem->elementId.stringId, CLAY_STRING("Floating Element Config")); - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewElementInfoScrollBody"), CLAY_LAYOUT(.padding = {8, 8}, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM)) { - // .offset - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoFloatingTitle", 1), CLAY_STRING("Offset"), infoTitleConfig); - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewElementInfoFloatingOffset"), CLAY_LAYOUT()) { - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoFloatingOffsetData", 1), CLAY_STRING("{ x: "), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoFloatingOffsetData", 2), Clay__IntToString(floatingConfig->offset.x), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoFloatingOffsetData", 3), CLAY_STRING(", y: "), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoFloatingOffsetData", 4), Clay__IntToString(floatingConfig->offset.y), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoFloatingOffsetData", 5), CLAY_STRING(" }"), infoTextConfig); - } - // .expand - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoFloatingTitle", 2), CLAY_STRING("Expand"), infoTitleConfig); - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewElementInfoFloatingExpand"), CLAY_LAYOUT()) { - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoFloatingExpandData", 1), CLAY_STRING("{ width: "), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoFloatingExpandData", 2), Clay__IntToString(floatingConfig->expand.width), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoFloatingExpandData", 3), CLAY_STRING(", height: "), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoFloatingExpandData", 4), Clay__IntToString(floatingConfig->expand.height), infoTextConfig); - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoFloatingExpandData", 5), CLAY_STRING(" }"), infoTextConfig); - } - // .zIndex - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoFloatingTitle", 3), CLAY_STRING("z-index"), infoTitleConfig); - CLAY_TEXT(CLAY_ID("Clay__DebugViewElementInfoFloatingZIndex"), Clay__IntToString(floatingConfig->zIndex), infoTextConfig); - // .parentId - CLAY_TEXT(CLAY_IDI("Clay__DebugViewElementInfoFloatingTitle", 4), CLAY_STRING("Parent"), infoTitleConfig); - Clay_LayoutElementHashMapItem *hashItem = Clay__GetHashMapItem(floatingConfig->parentId); - CLAY_TEXT(CLAY_ID("Clay__DebugViewElementInfoFloatingParent"), hashItem->elementId.stringId, infoTextConfig); - } - break; - } - case CLAY__LAYOUT_ELEMENT_TYPE_BORDER_CONTAINER: { - Clay_BorderElementConfig *borderConfig = selectedItem->layoutElement->elementConfig.borderElementConfig; - Clay__RenderDebugViewElementConfigHeader(selectedItem->elementId.stringId, CLAY_STRING("Border Element Config")); - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewElementInfoBorderBody"), CLAY_LAYOUT(.padding = {8, 8}, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM)) { - // .left - CLAY_TEXT(CLAY_ID("Clay__DebugViewElementInfoBorderLeftTitle"), CLAY_STRING("Left Border"), infoTitleConfig); - Clay__RenderDebugViewBorder(1, borderConfig->left, infoTextConfig); - // .right - CLAY_TEXT(CLAY_ID("Clay__DebugViewElementInfoBorderRightTitle"), CLAY_STRING("Right Border"), infoTitleConfig); - Clay__RenderDebugViewBorder(2, borderConfig->right, infoTextConfig); - // .top - CLAY_TEXT(CLAY_ID("Clay__DebugViewElementInfoBorderTopTitle"), CLAY_STRING("Top Border"), infoTitleConfig); - Clay__RenderDebugViewBorder(3, borderConfig->top, infoTextConfig); - // .bottom - CLAY_TEXT(CLAY_ID("Clay__DebugViewElementInfoBorderBottomTitle"), CLAY_STRING("Bottom Border"), infoTitleConfig); - Clay__RenderDebugViewBorder(4, borderConfig->bottom, infoTextConfig); - // .betweenChildren - CLAY_TEXT(CLAY_ID("Clay__DebugViewElementInfoBorderChildrenTitle"), CLAY_STRING("Border Between Children"), infoTitleConfig); - Clay__RenderDebugViewBorder(5, borderConfig->betweenChildren, infoTextConfig); - // .cornerRadius - CLAY_TEXT(CLAY_ID("Clay__DebugViewElementInfoBorderCornerRadiusTitle"), CLAY_STRING("Corner Radius"), infoTitleConfig); - Clay__RenderDebugViewCornerRadius(borderConfig->cornerRadius, infoTextConfig); - } - break; - } - case CLAY__LAYOUT_ELEMENT_TYPE_CUSTOM: { - Clay__RenderDebugViewElementConfigHeader(selectedItem->elementId.stringId, CLAY_STRING("Layout Element Config")); - break; + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_BORDER_CONTAINER: { + Clay_BorderElementConfig *borderConfig = elementConfig->config.borderElementConfig; + CLAY(CLAY_ID("Clay__DebugViewElementInfoBorderBody"), CLAY_LAYOUT({ .padding = {CLAY__DEBUGVIEW_OUTER_PADDING, 8}, .childGap = 8, .layoutDirection = CLAY_TOP_TO_BOTTOM })) { + // .left + CLAY_TEXT(CLAY_STRING("Left Border"), infoTitleConfig); + Clay__RenderDebugViewBorder(1, borderConfig->left, infoTextConfig); + // .right + CLAY_TEXT(CLAY_STRING("Right Border"), infoTitleConfig); + Clay__RenderDebugViewBorder(2, borderConfig->right, infoTextConfig); + // .top + CLAY_TEXT(CLAY_STRING("Top Border"), infoTitleConfig); + Clay__RenderDebugViewBorder(3, borderConfig->top, infoTextConfig); + // .bottom + CLAY_TEXT(CLAY_STRING("Bottom Border"), infoTitleConfig); + Clay__RenderDebugViewBorder(4, borderConfig->bottom, infoTextConfig); + // .betweenChildren + CLAY_TEXT(CLAY_STRING("Border Between Children"), infoTitleConfig); + Clay__RenderDebugViewBorder(5, borderConfig->betweenChildren, infoTextConfig); + // .cornerRadius + CLAY_TEXT(CLAY_STRING("Corner Radius"), infoTitleConfig); + Clay__RenderDebugViewCornerRadius(borderConfig->cornerRadius, infoTextConfig); } + break; + } + case CLAY__ELEMENT_CONFIG_TYPE_CUSTOM: { + break; } } } } - else { - CLAY_SCROLL_CONTAINER(CLAY_ID("Clay__DebugViewWarningsScrollPane"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(300)}, .childGap = 6), CLAY_SCROLL_CONFIG(.horizontal = true, .vertical = true)) { - Clay_TextElementConfig *warningConfig = CLAY_TEXT_CONFIG(.textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE); - CLAY_RECTANGLE(CLAY_ID("Clay__DebugViewWarningsPane"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_GROW()}, .layoutDirection = CLAY_TOP_TO_BOTTOM), CLAY_RECTANGLE_CONFIG(.color = CLAY__DEBUGVIEW_COLOR_2)) { - CLAY_CONTAINER(CLAY_ID("Clay__DebugViewWarningItemHeader"), CLAY_LAYOUT(.sizing = {.height = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING}, .childGap = 8, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} )) { - CLAY_TEXT(CLAY_ID("Clay__DebugViewWarningsTitle"), CLAY_STRING("Warnings"), warningConfig); - } - CLAY_RECTANGLE(CLAY_ID("Clay__DebugViewWarningsTopBorder"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(1)}), CLAY_RECTANGLE_CONFIG(.color = {200, 200, 200, 255})) {} - int previousWarningsLength = (int)Clay_warnings.length; - for (int i = 0; i < previousWarningsLength; i++) { - Clay__Warning warning = Clay_warnings.internalArray[i]; - CLAY_CONTAINER(CLAY_IDI("Clay__DebugViewWarningItem", i), CLAY_LAYOUT(.sizing = {.height = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING}, .childGap = 8, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER})) { - CLAY_TEXT(CLAY_IDI("Clay__DebugViewWarningText", i), warning.baseMessage, warningConfig); - if (warning.dynamicMessage.length > 0) { - CLAY_TEXT(CLAY_IDI("Clay__DebugViewWarningTextDynamic", i), warning.dynamicMessage, warningConfig); - } - } + } else { + CLAY(CLAY_ID("Clay__DebugViewWarningsScrollPane"), CLAY_LAYOUT({ .sizing = {CLAY_SIZING_GROW({}), CLAY_SIZING_FIXED(300)}, .childGap = 6, .layoutDirection = CLAY_TOP_TO_BOTTOM }), CLAY_SCROLL({ .horizontal = true, .vertical = true }), CLAY_RECTANGLE({ .color = CLAY__DEBUGVIEW_COLOR_2 })) { + Clay_TextElementConfig *warningConfig = CLAY_TEXT_CONFIG({ .textColor = CLAY__DEBUGVIEW_COLOR_4, .fontSize = 16, .wrapMode = CLAY_TEXT_WRAP_NONE }); + CLAY(CLAY_ID("Clay__DebugViewWarningItemHeader"), CLAY_LAYOUT({ .sizing = {.height = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING}, .childGap = 8, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} })) { + CLAY_TEXT(CLAY_STRING("Warnings"), warningConfig); + } + CLAY(CLAY_ID("Clay__DebugViewWarningsTopBorder"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW({}), .height = CLAY_SIZING_FIXED(1)} }), CLAY_RECTANGLE({ .color = {200, 200, 200, 255} })) {} + int previousWarningsLength = (int)Clay_warnings.length; + for (int i = 0; i < previousWarningsLength; i++) { + Clay__Warning warning = Clay_warnings.internalArray[i]; + CLAY(CLAY_IDI("Clay__DebugViewWarningItem", i), CLAY_LAYOUT({ .sizing = {.height = CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING}, .childGap = 8, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} })) { + CLAY_TEXT(warning.baseMessage, warningConfig); + if (warning.dynamicMessage.length > 0) { + CLAY_TEXT(warning.dynamicMessage, warningConfig); } } } @@ -3158,11 +3339,13 @@ void Clay_SetPointerState(Clay_Vector2 position, bool isPointerDown) { } Clay__treeNodeVisited.internalArray[dfsBuffer.length - 1] = true; Clay_LayoutElement *currentElement = Clay_LayoutElementArray_Get(&Clay__layoutElements, Clay__int32_tArray_Get(&dfsBuffer, (int)dfsBuffer.length - 1)); - Clay_LayoutElementHashMapItem *mapItem = Clay__GetHashMapItem(currentElement->id); // TODO I wish there was a way around this, maybe the fact that it's essentially a binary tree limits the cost, have to measure + Clay_LayoutElementHashMapItem *mapItem = Clay__GetHashMapItem(currentElement->id); // TODO think of a way around this, maybe the fact that it's essentially a binary tree limits the cost, but the worst case is not great if (mapItem && Clay__PointIsInsideRect(position, mapItem->boundingBox)) { + if (mapItem->onHoverFunction) { + mapItem->onHoverFunction(mapItem->elementId, Clay__pointerInfo, mapItem->hoverFunctionUserData); + } Clay__ElementIdArray_Add(&Clay__pointerOverIds, mapItem->elementId); - - if (currentElement->elementType == CLAY__LAYOUT_ELEMENT_TYPE_TEXT) { + if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT)) { dfsBuffer.length--; continue; } @@ -3177,16 +3360,16 @@ void Clay_SetPointerState(Clay_Vector2 position, bool isPointerDown) { } if (isPointerDown) { - if (Clay__pointerInfo.state == CLAY__POINTER_INFO_PRESSED_THIS_FRAME) { - Clay__pointerInfo.state = CLAY__POINTER_INFO_PRESSED; - } else if (Clay__pointerInfo.state != CLAY__POINTER_INFO_PRESSED) { - Clay__pointerInfo.state = CLAY__POINTER_INFO_PRESSED_THIS_FRAME; + if (Clay__pointerInfo.state == CLAY_POINTER_INFO_PRESSED_THIS_FRAME) { + Clay__pointerInfo.state = CLAY_POINTER_INFO_PRESSED; + } else if (Clay__pointerInfo.state != CLAY_POINTER_INFO_PRESSED) { + Clay__pointerInfo.state = CLAY_POINTER_INFO_PRESSED_THIS_FRAME; } } else { - if (Clay__pointerInfo.state == CLAY__POINTER_INFO_RELEASED_THIS_FRAME) { - Clay__pointerInfo.state = CLAY__POINTER_INFO_RELEASED; - } else if (Clay__pointerInfo.state != CLAY__POINTER_INFO_RELEASED) { - Clay__pointerInfo.state = CLAY__POINTER_INFO_RELEASED_THIS_FRAME; + if (Clay__pointerInfo.state == CLAY_POINTER_INFO_RELEASED_THIS_FRAME) { + Clay__pointerInfo.state = CLAY_POINTER_INFO_RELEASED; + } else if (Clay__pointerInfo.state != CLAY_POINTER_INFO_RELEASED) { + Clay__pointerInfo.state = CLAY_POINTER_INFO_RELEASED_THIS_FRAME; } } } @@ -3208,7 +3391,7 @@ void Clay_Initialize(Clay_Arena arena, Clay_Dimensions layoutDimensions) { CLAY_WASM_EXPORT("Clay_UpdateScrollContainers") void Clay_UpdateScrollContainers(bool enableDragScrolling, Clay_Vector2 scrollDelta, float deltaTime) { - bool isPointerActive = enableDragScrolling && (Clay__pointerInfo.state == CLAY__POINTER_INFO_PRESSED || Clay__pointerInfo.state == CLAY__POINTER_INFO_PRESSED_THIS_FRAME); + bool isPointerActive = enableDragScrolling && (Clay__pointerInfo.state == CLAY_POINTER_INFO_PRESSED || Clay__pointerInfo.state == CLAY_POINTER_INFO_PRESSED_THIS_FRAME); // Don't apply scroll events to ancestors of the inner element int32_t highestPriorityElementIndex = -1; Clay__ScrollContainerDataInternal *highestPriorityScrollData = CLAY__NULL; @@ -3269,8 +3452,9 @@ void Clay_UpdateScrollContainers(bool enableDragScrolling, Clay_Vector2 scrollDe if (highestPriorityElementIndex > -1 && highestPriorityScrollData) { Clay_LayoutElement *scrollElement = highestPriorityScrollData->layoutElement; - bool canScrollVertically = scrollElement->elementConfig.scrollElementConfig->vertical && highestPriorityScrollData->contentSize.height > scrollElement->dimensions.height; - bool canScrollHorizontally = scrollElement->elementConfig.scrollElementConfig->horizontal && highestPriorityScrollData->contentSize.width > scrollElement->dimensions.width; + Clay_ScrollElementConfig *scrollConfig = Clay__FindElementConfigWithType(scrollElement, CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER).scrollElementConfig; + bool canScrollVertically = scrollConfig->vertical && highestPriorityScrollData->contentSize.height > scrollElement->dimensions.height; + bool canScrollHorizontally = scrollConfig->horizontal && highestPriorityScrollData->contentSize.width > scrollElement->dimensions.width; // Handle wheel scroll if (canScrollVertically) { highestPriorityScrollData->scrollPosition.y = highestPriorityScrollData->scrollPosition.y + scrollDelta.y * 10; @@ -3328,19 +3512,18 @@ void Clay_BeginLayout() { if (Clay__debugModeEnabled) { rootDimensions.width -= (float)Clay__debugViewWidth; } - Clay_ElementId rootElementId = CLAY_ID("Clay__RootContainer"); - Clay_LayoutElement rootLayoutElement = CLAY__INIT(Clay_LayoutElement) {.layoutConfig = CLAY_LAYOUT(.sizing = {CLAY_SIZING_FIXED((rootDimensions.width)), CLAY_SIZING_FIXED(rootDimensions.height)}), .id = rootElementId.id, }; - Clay__openLayoutElement = Clay_LayoutElementArray_Add(&Clay__layoutElements, rootLayoutElement); - Clay__LayoutElementPointerArray_Add(&Clay__openLayoutElementStack, Clay__openLayoutElement); - Clay__LayoutElementTreeRootArray_Add(&Clay__layoutElementTreeRoots, CLAY__INIT(Clay__LayoutElementTreeRoot) { .layoutElementIndex = Clay__layoutElements.length - 1 }); - Clay__StringArray_Add(&Clay__layoutElementIdStrings, CLAY_STRING("Clay__RootContainer")); - Clay__AddHashMapItem(rootElementId, Clay__openLayoutElement); + Clay__OpenElement(); + CLAY_ID("Clay__RootContainer"); + CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED((rootDimensions.width)), CLAY_SIZING_FIXED(rootDimensions.height)} }); + Clay__ElementPostConfiguration(); + Clay__int32_tArray_Add(&Clay__openLayoutElementStack, 0); + Clay__LayoutElementTreeRootArray_Add(&Clay__layoutElementTreeRoots, CLAY__INIT(Clay__LayoutElementTreeRoot) { .layoutElementIndex = 0 }); } CLAY_WASM_EXPORT("Clay_EndLayout") Clay_RenderCommandArray Clay_EndLayout() { - Clay__AttachContainerChildren(); + Clay__CloseElement(); if (Clay__debugModeEnabled) { #ifndef CLAY_DEBUG Clay__warningsEnabled = false; @@ -3354,6 +3537,35 @@ Clay_RenderCommandArray Clay_EndLayout() return Clay__renderCommands; } +CLAY_WASM_EXPORT("Clay_GetElementId") +Clay_ElementId Clay_GetElementId(Clay_String idString) { + return Clay__HashString(idString, 0, 0); +} + +bool Clay_Hovered() { + Clay_LayoutElement *openLayoutElement = Clay__GetOpenLayoutElement(); + // If the element has no id attached at this point, we need to generate one + if (openLayoutElement->id == 0) { + Clay__GenerateIdForAnonymousElement(openLayoutElement); + } + for (int i = 0; i < Clay__pointerOverIds.length; ++i) { + if (Clay__ElementIdArray_Get(&Clay__pointerOverIds, i)->id == openLayoutElement->id) { + return true; + } + } + return false; +} + +void Clay_OnHover(void (*onHoverFunction)(Clay_ElementId elementId, Clay_PointerInfo pointerInfo, intptr_t userData), intptr_t userData) { + Clay_LayoutElement *openLayoutElement = Clay__GetOpenLayoutElement(); + if (openLayoutElement->id == 0) { + Clay__GenerateIdForAnonymousElement(openLayoutElement); + } + Clay_LayoutElementHashMapItem *hashMapItem = Clay__GetHashMapItem(openLayoutElement->id); + hashMapItem->onHoverFunction = onHoverFunction; + hashMapItem->hoverFunctionUserData = userData; +} + CLAY_WASM_EXPORT("Clay_PointerOver") bool Clay_PointerOver(Clay_ElementId elementId) { // TODO return priority for separating multiple results for (int i = 0; i < Clay__pointerOverIds.length; ++i) { @@ -3373,7 +3585,7 @@ Clay_ScrollContainerData Clay_GetScrollContainerData(Clay_ElementId id) { .scrollPosition = &scrollContainerData->scrollPosition, .scrollContainerDimensions = CLAY__INIT(Clay_Dimensions) { scrollContainerData->boundingBox.width, scrollContainerData->boundingBox.height }, .contentDimensions = scrollContainerData->contentSize, - .config = *scrollContainerData->layoutElement->elementConfig.scrollElementConfig, + .config = *Clay__FindElementConfigWithType(scrollContainerData->layoutElement, CLAY__ELEMENT_CONFIG_TYPE_SCROLL_CONTAINER).scrollElementConfig, .found = true }; } diff --git a/examples/clay-official-website/index.html b/examples/clay-official-website/index.html index 285fea2..ff6fb85 100644 --- a/examples/clay-official-website/index.html +++ b/examples/clay-official-website/index.html @@ -322,11 +322,13 @@ let length = memoryDataView.getUint32(scratchSpaceAddress + 4, true); let arrayOffset = memoryDataView.getUint32(scratchSpaceAddress + 8, true); let scissorStack = [{ nextAllocation: { x: 0, y: 0 }, element: htmlRoot, nextElementIndex: 0 }]; + let previousId = 0; for (let i = 0; i < length; i++, arrayOffset += renderCommandSize) { let entireRenderCommandMemory = new Uint32Array(memoryDataView.buffer.slice(arrayOffset, arrayOffset + renderCommandSize)); let renderCommand = readStructAtAddress(arrayOffset, renderCommandDefinition); let parentElement = scissorStack[scissorStack.length - 1]; let element = null; + let isMultiConfigElement = previousId === renderCommand.id.value; if (!elementCache[renderCommand.id.value]) { let elementType = 'div'; switch (renderCommand.commandType.value) { @@ -357,7 +359,7 @@ let elementData = elementCache[renderCommand.id.value]; element = elementData.element; - if (Array.prototype.indexOf.call(parentElement.element.children, element) !== parentElement.nextElementIndex) { + if (!isMultiConfigElement && Array.prototype.indexOf.call(parentElement.element.children, element) !== parentElement.nextElementIndex) { if (parentElement.nextElementIndex === 0) { parentElement.element.insertAdjacentElement('afterbegin', element); } else { @@ -367,8 +369,12 @@ elementData.exists = true; // Don't get me started. Cheaper to compare the render command memory than to update HTML elements - let dirty = MemoryIsDifferent(elementData.previousMemoryCommand, entireRenderCommandMemory, renderCommandSize); - parentElement.nextElementIndex++; + let dirty = MemoryIsDifferent(elementData.previousMemoryCommand, entireRenderCommandMemory, renderCommandSize) && !isMultiConfigElement; + if (!isMultiConfigElement) { + parentElement.nextElementIndex++; + } + + previousId = renderCommand.id.value; elementData.previousMemoryCommand = entireRenderCommandMemory; let offsetX = scissorStack.length > 0 ? scissorStack[scissorStack.length - 1].nextAllocation.x : 0; diff --git a/examples/clay-official-website/main.c b/examples/clay-official-website/main.c index fee4791..e21ac15 100644 --- a/examples/clay-official-website/main.c +++ b/examples/clay-official-website/main.c @@ -6,7 +6,7 @@ double windowWidth = 1024, windowHeight = 768; float modelPageOneZRotation = 0; -int ACTIVE_RENDERER_INDEX = 0; +uint32_t ACTIVE_RENDERER_INDEX = 0; const uint32_t FONT_ID_BODY_16 = 0; const uint32_t FONT_ID_TITLE_56 = 1; @@ -35,27 +35,27 @@ const Clay_Color COLOR_BLOB_BORDER_3 = (Clay_Color) {225, 138, 50, 255}; const Clay_Color COLOR_BLOB_BORDER_4 = (Clay_Color) {236, 159, 70, 255}; const Clay_Color COLOR_BLOB_BORDER_5 = (Clay_Color) {240, 189, 100, 255}; -#define RAYLIB_VECTOR2_TO_CLAY_VECTOR2(vector) (Clay_Vector2) { .x = vector.x, .y = vector.y } +#define RAYLIB_VECTOR2_TO_CLAY_VECTOR2(vector) (Clay_Vector2) { .x = (vector).x, .y = (vector).y } Clay_TextElementConfig headerTextConfig = (Clay_TextElementConfig) { .fontId = 2, .fontSize = 24, .textColor = {61, 26, 5, 255} }; Clay_TextElementConfig blobTextConfig = (Clay_TextElementConfig) { .fontId = 2, .fontSize = 30, .textColor = {244, 235, 230, 255} }; void LandingPageBlob(int index, int fontSize, Clay_Color color, Clay_String text, Clay_String imageURL) { - CLAY_BORDER_CONTAINER(CLAY_IDI("HeroBlob", index), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(.max = 480) }, .padding = {16, 16}, .childGap = 16, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}), CLAY_BORDER_CONFIG_OUTSIDE_RADIUS(2, color, 10)) { - CLAY_IMAGE(CLAY_IDI("CheckImage", index), CLAY_LAYOUT(.sizing = { CLAY_SIZING_FIXED(32) }), CLAY_IMAGE_CONFIG(.sourceDimensions = { 128, 128 }, .sourceURL = imageURL)) {} - CLAY_TEXT(CLAY_IDI("HeroBlobText", index), text, CLAY_TEXT_CONFIG(.fontSize = fontSize, .fontId = FONT_ID_BODY_24, .textColor = color)); + CLAY(CLAY_IDI("HeroBlob", index), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = 480 }) }, .padding = {16, 16}, .childGap = 16, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER} }), CLAY_BORDER_OUTSIDE_RADIUS(2, color, 10)) { + CLAY(CLAY_IDI("CheckImage", index), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_FIXED(32) } }), CLAY_IMAGE({ .sourceDimensions = { 128, 128 }, .sourceURL = imageURL })) {} + CLAY_TEXT(text, CLAY_TEXT_CONFIG({ .fontSize = fontSize, .fontId = FONT_ID_BODY_24, .textColor = color })); } } void LandingPageDesktop() { - CLAY_CONTAINER(CLAY_ID("LandingPage1Desktop"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIT(.min = windowHeight - 70) }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = { .x = 50 })) { - CLAY_BORDER_CONTAINER(CLAY_ID("LandingPage1"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = { 32, 32 }, .childGap = 32), CLAY_BORDER_CONFIG(.left = { 2, COLOR_RED }, .right = { 2, COLOR_RED })) { - CLAY_CONTAINER(CLAY_ID("LeftText"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_PERCENT(0.55f) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8)) { - CLAY_TEXT(CLAY_ID("LeftTextTitle"), CLAY_STRING("Clay is a flex-box style UI auto layout library in C, with declarative syntax and microsecond performance."), CLAY_TEXT_CONFIG(.fontSize = 56, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_RED)); - CLAY_CONTAINER(CLAY_ID("LandingPageSpacer"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(32) })) {} - CLAY_TEXT(CLAY_ID("LeftTextTagline"), CLAY_STRING("Clay is laying out this webpage right now!"), CLAY_TEXT_CONFIG(.fontSize = 36, .fontId = FONT_ID_TITLE_36, .textColor = COLOR_ORANGE)); + CLAY(CLAY_ID("LandingPage1Desktop"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIT({ .min = windowHeight - 70 }) }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = { .x = 50 } })) { + CLAY(CLAY_ID("LandingPage1"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = { 32, 32 }, .childGap = 32 }), CLAY_BORDER({ .left = { 2, COLOR_RED }, .right = { 2, COLOR_RED } })) { + CLAY(CLAY_ID("LeftText"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_PERCENT(0.55f) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) { + CLAY_TEXT(CLAY_STRING("Clay is a flex-box style UI auto layout library in C, with declarative syntax and microsecond performance."), CLAY_TEXT_CONFIG({ .fontSize = 56, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_RED })); + CLAY(CLAY_ID("LandingPageSpacer"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(32) } })) {} + CLAY_TEXT(CLAY_STRING("Clay is laying out this webpage right now!"), CLAY_TEXT_CONFIG({ .fontSize = 36, .fontId = FONT_ID_TITLE_36, .textColor = COLOR_ORANGE })); } - CLAY_CONTAINER(CLAY_ID("HeroImageOuter"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_PERCENT(0.45f) }, .childAlignment = { CLAY_ALIGN_X_CENTER }, .childGap = 16)) { + CLAY(CLAY_ID("HeroImageOuter"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_PERCENT(0.45f) }, .childAlignment = { CLAY_ALIGN_X_CENTER }, .childGap = 16 })) { LandingPageBlob(1, 32, COLOR_BLOB_BORDER_5, CLAY_STRING("High performance"), CLAY_STRING("/clay/images/check_5.png")); LandingPageBlob(2, 32, COLOR_BLOB_BORDER_4, CLAY_STRING("Flexbox-style responsive layout"), CLAY_STRING("/clay/images/check_4.png")); LandingPageBlob(3, 32, COLOR_BLOB_BORDER_3, CLAY_STRING("Declarative syntax"), CLAY_STRING("/clay/images/check_3.png")); @@ -67,13 +67,13 @@ void LandingPageDesktop() { } void LandingPageMobile() { - CLAY_CONTAINER(CLAY_ID("LandingPage1Mobile"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIT(.min = windowHeight - 70) }, .childAlignment = {CLAY_ALIGN_X_CENTER, .y = CLAY_ALIGN_Y_CENTER}, .padding = { 16, 32 }, .childGap = 32)) { - CLAY_CONTAINER(CLAY_ID("LeftText"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW() }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8)) { - CLAY_TEXT(CLAY_ID("LeftTextTitle"), CLAY_STRING("Clay is a flex-box style UI auto layout library in C, with declarative syntax and microsecond performance."), CLAY_TEXT_CONFIG(.fontSize = 48, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_RED)); - CLAY_CONTAINER(CLAY_ID("LandingPageSpacer"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(32) })) {} - CLAY_TEXT(CLAY_ID("LeftTextTagline"), CLAY_STRING("Clay is laying out this webpage right now!"), CLAY_TEXT_CONFIG(.fontSize = 32, .fontId = FONT_ID_TITLE_36, .textColor = COLOR_ORANGE)); + CLAY(CLAY_ID("LandingPage1Mobile"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIT({ .min = windowHeight - 70 }) }, .childAlignment = {CLAY_ALIGN_X_CENTER, .y = CLAY_ALIGN_Y_CENTER}, .padding = { 16, 32 }, .childGap = 32 })) { + CLAY(CLAY_ID("LeftText"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW() }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) { + CLAY_TEXT(CLAY_STRING("Clay is a flex-box style UI auto layout library in C, with declarative syntax and microsecond performance."), CLAY_TEXT_CONFIG({ .fontSize = 48, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_RED })); + CLAY(CLAY_ID("LandingPageSpacer"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(32) } })) {} + CLAY_TEXT(CLAY_STRING("Clay is laying out this webpage right now!"), CLAY_TEXT_CONFIG({ .fontSize = 32, .fontId = FONT_ID_TITLE_36, .textColor = COLOR_ORANGE })); } - CLAY_CONTAINER(CLAY_ID("HeroImageOuter"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_GROW() }, .childAlignment = { CLAY_ALIGN_X_CENTER }, .childGap = 16)) { + CLAY(CLAY_ID("HeroImageOuter"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_GROW() }, .childAlignment = { CLAY_ALIGN_X_CENTER }, .childGap = 16 })) { LandingPageBlob(1, 28, COLOR_BLOB_BORDER_5, CLAY_STRING("High performance"), CLAY_STRING("/clay/images/check_5.png")); LandingPageBlob(2, 28, COLOR_BLOB_BORDER_4, CLAY_STRING("Flexbox-style responsive layout"), CLAY_STRING("/clay/images/check_4.png")); LandingPageBlob(3, 28, COLOR_BLOB_BORDER_3, CLAY_STRING("Declarative syntax"), CLAY_STRING("/clay/images/check_3.png")); @@ -84,71 +84,71 @@ void LandingPageMobile() { } void FeatureBlocksDesktop() { - CLAY_CONTAINER(CLAY_ID("FeatureBlocksOuter"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW() })) { - CLAY_BORDER_CONTAINER(CLAY_ID("FeatureBlocksInner"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW() }, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER } ), CLAY_BORDER_CONFIG(.betweenChildren = { .width = 2, .color = COLOR_RED })) { - Clay_TextElementConfig *textConfig = CLAY_TEXT_CONFIG(.fontSize = 24, .fontId = FONT_ID_BODY_24, .textColor = COLOR_RED ); - CLAY_CONTAINER(CLAY_ID("HFileBoxOuter"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_PERCENT(0.5f) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {50, 32}, .childGap = 8)) { - CLAY_RECTANGLE(CLAY_ID("HFileIncludeOuter"), CLAY_LAYOUT(.padding = {8, 4}), CLAY_RECTANGLE_CONFIG(.color = COLOR_RED, .cornerRadius = CLAY_CORNER_RADIUS(8))) { - CLAY_TEXT(CLAY_IDI("HFileBoxText", 2), CLAY_STRING("#include clay.h"), CLAY_TEXT_CONFIG(.fontSize = 24, .fontId = FONT_ID_BODY_24, .textColor = COLOR_LIGHT)); + CLAY(CLAY_ID("FeatureBlocksOuter"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW() } })) { + CLAY(CLAY_ID("FeatureBlocksInner"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW() }, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER } }), CLAY_BORDER({ .betweenChildren = { .width = 2, .color = COLOR_RED } })) { + Clay_TextElementConfig *textConfig = CLAY_TEXT_CONFIG({ .fontSize = 24, .fontId = FONT_ID_BODY_24, .textColor = COLOR_RED }); + CLAY(CLAY_ID("HFileBoxOuter"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_PERCENT(0.5f) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {50, 32}, .childGap = 8 })) { + CLAY(CLAY_ID("HFileIncludeOuter"), CLAY_LAYOUT({ .padding = {8, 4} }), CLAY_RECTANGLE({ .color = COLOR_RED, .cornerRadius = CLAY_CORNER_RADIUS(8) })) { + CLAY_TEXT(CLAY_STRING("#include clay.h"), CLAY_TEXT_CONFIG({ .fontSize = 24, .fontId = FONT_ID_BODY_24, .textColor = COLOR_LIGHT })); } - CLAY_TEXT(CLAY_ID("HFileSecondLine"), CLAY_STRING("~2000 lines of C99."), textConfig); - CLAY_TEXT(CLAY_IDI("HFileBoxText", 5), CLAY_STRING("Zero dependencies, including no C standard library."), textConfig); + CLAY_TEXT(CLAY_STRING("~2000 lines of C99."), textConfig); + CLAY_TEXT(CLAY_STRING("Zero dependencies, including no C standard library."), textConfig); } - CLAY_CONTAINER(CLAY_ID("BringYourOwnRendererOuter"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_PERCENT(0.5f) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {.x = 50, .y = 32}, .childGap = 8)) { - CLAY_TEXT(CLAY_IDI("ZeroDependenciesText", 1), CLAY_STRING("Renderer agnostic."), CLAY_TEXT_CONFIG(.fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = COLOR_ORANGE)); - CLAY_TEXT(CLAY_IDI("ZeroDependenciesText", 2), CLAY_STRING("Layout with clay, then render with Raylib, WebGL Canvas or even as HTML."), textConfig); - CLAY_TEXT(CLAY_IDI("ZeroDependenciesText", 3), CLAY_STRING("Flexible output for easy compositing in your custom engine or environment."), textConfig); + CLAY(CLAY_ID("BringYourOwnRendererOuter"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_PERCENT(0.5f) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {.x = 50, .y = 32}, .childGap = 8 })) { + CLAY_TEXT(CLAY_STRING("Renderer agnostic."), CLAY_TEXT_CONFIG({ .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = COLOR_ORANGE })); + CLAY_TEXT(CLAY_STRING("Layout with clay, then render with Raylib, WebGL Canvas or even as HTML."), textConfig); + CLAY_TEXT(CLAY_STRING("Flexible output for easy compositing in your custom engine or environment."), textConfig); } } } } void FeatureBlocksMobile() { - CLAY_BORDER_CONTAINER(CLAY_ID("FeatureBlocksInner"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW() }, ), CLAY_BORDER_CONFIG(.betweenChildren = { .width = 2, .color = COLOR_RED })) { - Clay_TextElementConfig *textConfig = CLAY_TEXT_CONFIG(.fontSize = 24, .fontId = FONT_ID_BODY_24, .textColor = COLOR_RED ); - CLAY_CONTAINER(CLAY_ID("HFileBoxOuter"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW() }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {16, 32}, .childGap = 8)) { - CLAY_RECTANGLE(CLAY_ID("HFileIncludeOuter"), CLAY_LAYOUT(.padding = {8, 4}), CLAY_RECTANGLE_CONFIG(.color = COLOR_RED, .cornerRadius = CLAY_CORNER_RADIUS(8))) { - CLAY_TEXT(CLAY_IDI("HFileBoxText", 2), CLAY_STRING("#include clay.h"), CLAY_TEXT_CONFIG(.fontSize = 24, .fontId = FONT_ID_BODY_24, .textColor = COLOR_LIGHT)); + CLAY(CLAY_ID("FeatureBlocksInner"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW() } }), CLAY_BORDER({ .betweenChildren = { .width = 2, .color = COLOR_RED } })) { + Clay_TextElementConfig *textConfig = CLAY_TEXT_CONFIG({ .fontSize = 24, .fontId = FONT_ID_BODY_24, .textColor = COLOR_RED }); + CLAY(CLAY_ID("HFileBoxOuter"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW() }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {16, 32}, .childGap = 8 })) { + CLAY(CLAY_ID("HFileIncludeOuter"), CLAY_LAYOUT({ .padding = {8, 4} }), CLAY_RECTANGLE({ .color = COLOR_RED, .cornerRadius = CLAY_CORNER_RADIUS(8) })) { + CLAY_TEXT(CLAY_STRING("#include clay.h"), CLAY_TEXT_CONFIG({ .fontSize = 24, .fontId = FONT_ID_BODY_24, .textColor = COLOR_LIGHT })); } - CLAY_TEXT(CLAY_ID("HFileSecondLine"), CLAY_STRING("~2000 lines of C99."), textConfig); - CLAY_TEXT(CLAY_IDI("HFileBoxText", 5), CLAY_STRING("Zero dependencies, including no C standard library."), textConfig); + CLAY_TEXT(CLAY_STRING("~2000 lines of C99."), textConfig); + CLAY_TEXT(CLAY_STRING("Zero dependencies, including no C standard library."), textConfig); } - CLAY_CONTAINER(CLAY_ID("BringYourOwnRendererOuter"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW() }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {.x = 16, .y = 32}, .childGap = 8)) { - CLAY_TEXT(CLAY_IDI("ZeroDependenciesText", 1), CLAY_STRING("Renderer agnostic."), CLAY_TEXT_CONFIG(.fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = COLOR_ORANGE)); - CLAY_TEXT(CLAY_IDI("ZeroDependenciesText", 2), CLAY_STRING("Layout with clay, then render with Raylib, WebGL Canvas or even as HTML."), textConfig); - CLAY_TEXT(CLAY_IDI("ZeroDependenciesText", 3), CLAY_STRING("Flexible output for easy compositing in your custom engine or environment."), textConfig); + CLAY(CLAY_ID("BringYourOwnRendererOuter"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW() }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {.x = 16, .y = 32}, .childGap = 8 })) { + CLAY_TEXT(CLAY_STRING("Renderer agnostic."), CLAY_TEXT_CONFIG({ .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = COLOR_ORANGE })); + CLAY_TEXT(CLAY_STRING("Layout with clay, then render with Raylib, WebGL Canvas or even as HTML."), textConfig); + CLAY_TEXT(CLAY_STRING("Flexible output for easy compositing in your custom engine or environment."), textConfig); } } } void DeclarativeSyntaxPageDesktop() { - CLAY_CONTAINER(CLAY_ID("SyntaxPageDesktop"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {.x = 50})) { - CLAY_BORDER_CONTAINER(CLAY_ID("SyntaxPage"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, .childAlignment = { 0, CLAY_ALIGN_Y_CENTER }, .padding = { 32, 32 }, .childGap = 32), CLAY_BORDER_CONFIG(.left = { 2, COLOR_RED }, .right = { 2, COLOR_RED })) { - CLAY_CONTAINER(CLAY_ID("SyntaxPageLeftText"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_PERCENT(0.5) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8)) { - CLAY_TEXT(CLAY_ID("SyntaxPageTextTitle"), CLAY_STRING("Declarative Syntax"), CLAY_TEXT_CONFIG(.fontSize = 52, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_RED)); - CLAY_CONTAINER(CLAY_ID("SyntaxSpacer"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(.max = 16) })) {} - CLAY_TEXT(CLAY_ID("SyntaxPageTextSubTitle1"), CLAY_STRING("Flexible and readable declarative syntax with nested UI element hierarchies."), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED)); - CLAY_TEXT(CLAY_ID("SyntaxPageTextSubTitle2"), CLAY_STRING("Mix elements with standard C code like loops, conditionals and functions."), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED)); - CLAY_TEXT(CLAY_ID("SyntaxPageTextSubTitle3"), CLAY_STRING("Create your own library of re-usable components from UI primitives like text, images and rectangles."), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED)); + CLAY(CLAY_ID("SyntaxPageDesktop"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIT({ .min = windowHeight - 50 }) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {.x = 50} })) { + CLAY(CLAY_ID("SyntaxPage"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, .childAlignment = { 0, CLAY_ALIGN_Y_CENTER }, .padding = { 32, 32 }, .childGap = 32 }), CLAY_BORDER({ .left = { 2, COLOR_RED }, .right = { 2, COLOR_RED } })) { + CLAY(CLAY_ID("SyntaxPageLeftText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.5) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) { + CLAY_TEXT(CLAY_STRING("Declarative Syntax"), CLAY_TEXT_CONFIG({ .fontSize = 52, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_RED })); + CLAY(CLAY_ID("SyntaxSpacer"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = 16 }) } })) {} + CLAY_TEXT(CLAY_STRING("Flexible and readable declarative syntax with nested UI element hierarchies."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); + CLAY_TEXT(CLAY_STRING("Mix elements with standard C code like loops, conditionals and functions."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); + CLAY_TEXT(CLAY_STRING("Create your own library of re-usable components from UI primitives like text, images and rectangles."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); } - CLAY_CONTAINER(CLAY_ID("SyntaxPageRightImage"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_PERCENT(0.50) }, .childAlignment = {.x = CLAY_ALIGN_X_CENTER})) { - CLAY_IMAGE(CLAY_ID("SyntaxPageRightImageInner"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(.max = 568) }), CLAY_IMAGE_CONFIG(.sourceDimensions = {1136, 1194}, .sourceURL = CLAY_STRING("/clay/images/declarative.png"))) {} + CLAY(CLAY_ID("SyntaxPageRightImage"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.50) }, .childAlignment = {.x = CLAY_ALIGN_X_CENTER} })) { + CLAY(CLAY_ID("SyntaxPageRightImageInner"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = 568 }) } }), CLAY_IMAGE({ .sourceDimensions = {1136, 1194}, .sourceURL = CLAY_STRING("/clay/images/declarative.png") })) {} } } } } void DeclarativeSyntaxPageMobile() { - CLAY_CONTAINER(CLAY_ID("SyntaxPageDesktop"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER}, .padding = {16, 32}, .childGap = 16)) { - CLAY_CONTAINER(CLAY_ID("SyntaxPageLeftText"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW() }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8)) { - CLAY_TEXT(CLAY_ID("SyntaxPageTextTitle"), CLAY_STRING("Declarative Syntax"), CLAY_TEXT_CONFIG(.fontSize = 48, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_RED)); - CLAY_CONTAINER(CLAY_ID("SyntaxSpacer"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(.max = 16) })) {} - CLAY_TEXT(CLAY_ID("SyntaxPageTextSubTitle1"), CLAY_STRING("Flexible and readable declarative syntax with nested UI element hierarchies."), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED)); - CLAY_TEXT(CLAY_ID("SyntaxPageTextSubTitle2"), CLAY_STRING("Mix elements with standard C code like loops, conditionals and functions."), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED)); - CLAY_TEXT(CLAY_ID("SyntaxPageTextSubTitle3"), CLAY_STRING("Create your own library of re-usable components from UI primitives like text, images and rectangles."), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED)); + CLAY(CLAY_ID("SyntaxPageDesktop"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIT({ .min = windowHeight - 50 }) }, .childAlignment = {CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER}, .padding = {16, 32}, .childGap = 16 })) { + CLAY(CLAY_ID("SyntaxPageLeftText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW() }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) { + CLAY_TEXT(CLAY_STRING("Declarative Syntax"), CLAY_TEXT_CONFIG({ .fontSize = 48, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_RED })); + CLAY(CLAY_ID("SyntaxSpacer"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = 16 }) } })) {} + CLAY_TEXT(CLAY_STRING("Flexible and readable declarative syntax with nested UI element hierarchies."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); + CLAY_TEXT(CLAY_STRING("Mix elements with standard C code like loops, conditionals and functions."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); + CLAY_TEXT(CLAY_STRING("Create your own library of re-usable components from UI primitives like text, images and rectangles."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); } - CLAY_CONTAINER(CLAY_ID("SyntaxPageRightImage"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW() }, .childAlignment = {.x = CLAY_ALIGN_X_CENTER})) { - CLAY_IMAGE(CLAY_ID("SyntaxPageRightImageInner"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(.max = 568) }), CLAY_IMAGE_CONFIG(.sourceDimensions = {1136, 1194}, .sourceURL = CLAY_STRING("/clay/images/declarative.png"))) {} + CLAY(CLAY_ID("SyntaxPageRightImage"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW() }, .childAlignment = {.x = CLAY_ALIGN_X_CENTER} })) { + CLAY(CLAY_ID("SyntaxPageRightImageInner"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = 568 }) } }), CLAY_IMAGE({ .sourceDimensions = {1136, 1194}, .sourceURL = CLAY_STRING("/clay/images/declarative.png") } )) {} } } } @@ -165,21 +165,21 @@ Clay_Color ColorLerp(Clay_Color a, Clay_Color b, float amount) { Clay_String LOREM_IPSUM_TEXT = CLAY_STRING("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."); void HighPerformancePageDesktop(float lerpValue) { - CLAY_RECTANGLE(CLAY_ID("PerformanceDesktop"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {.x = 82, 32}, .childGap = 64), CLAY_RECTANGLE_CONFIG(.color = COLOR_RED)) { - CLAY_CONTAINER(CLAY_ID("PerformanceLeftText"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_PERCENT(0.5) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8)) { - CLAY_TEXT(CLAY_ID("PerformanceTextTitle"), CLAY_STRING("High Performance"), CLAY_TEXT_CONFIG(.fontSize = 52, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT)); - CLAY_CONTAINER(CLAY_ID("PerformanceSpacer"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(.max = 16) })) {} - CLAY_TEXT(CLAY_IDI("PerformanceTextSubTitle", 1), CLAY_STRING("Fast enough to recompute your entire UI every frame."), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT)); - CLAY_TEXT(CLAY_IDI("PerformanceTextSubTitle", 2), CLAY_STRING("Small memory footprint (3.5mb default) with static allocation & reuse. No malloc / free."), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT)); - CLAY_TEXT(CLAY_IDI("PerformanceTextSubTitle", 3), CLAY_STRING("Simplify animations and reactive UI design by avoiding the standard performance hacks."), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT)); + CLAY(CLAY_ID("PerformanceDesktop"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIT({ .min = windowHeight - 50 }) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {.x = 82, 32}, .childGap = 64 }), CLAY_RECTANGLE({ .color = COLOR_RED })) { + CLAY(CLAY_ID("PerformanceLeftText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.5) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) { + CLAY_TEXT(CLAY_STRING("High Performance"), CLAY_TEXT_CONFIG({ .fontSize = 52, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT })); + CLAY(CLAY_ID("PerformanceSpacer"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = 16 }) }})) {} + CLAY_TEXT(CLAY_STRING("Fast enough to recompute your entire UI every frame."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT })); + CLAY_TEXT(CLAY_STRING("Small memory footprint (3.5mb default) with static allocation & reuse. No malloc / free."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT })); + CLAY_TEXT(CLAY_STRING("Simplify animations and reactive UI design by avoiding the standard performance hacks."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT })); } - CLAY_CONTAINER(CLAY_ID("PerformanceRightImageOuter"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_PERCENT(0.50) }, .childAlignment = {CLAY_ALIGN_X_CENTER})) { - CLAY_BORDER_CONTAINER(CLAY_ID(""), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(400) }), CLAY_BORDER_CONFIG_ALL(.width = 2, .color = COLOR_LIGHT)) { - CLAY_RECTANGLE(CLAY_ID("AnimationDemoContainerLeft"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_PERCENT(0.3f + 0.4f * lerpValue), CLAY_SIZING_GROW() }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = {32, 32}), CLAY_RECTANGLE_CONFIG(.color = ColorLerp(COLOR_RED, COLOR_ORANGE, lerpValue))) { - CLAY_TEXT(CLAY_ID("AnimationDemoTextLeft"), LOREM_IPSUM_TEXT, CLAY_TEXT_CONFIG(.fontSize = 24, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT)); + CLAY(CLAY_ID("PerformanceRightImageOuter"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.50) }, .childAlignment = {CLAY_ALIGN_X_CENTER} })) { + CLAY(CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(400) } }), CLAY_BORDER_ALL({ .width = 2, .color = COLOR_LIGHT })) { + CLAY(CLAY_ID("AnimationDemoContainerLeft"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.3f + 0.4f * lerpValue), CLAY_SIZING_GROW() }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = {32, 32} }), CLAY_RECTANGLE({ .color = ColorLerp(COLOR_RED, COLOR_ORANGE, lerpValue) })) { + CLAY_TEXT(LOREM_IPSUM_TEXT, CLAY_TEXT_CONFIG({ .fontSize = 24, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT })); } - CLAY_RECTANGLE(CLAY_ID("AnimationDemoContainerRight"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = {32, 32}), CLAY_RECTANGLE_CONFIG(.color = ColorLerp(COLOR_ORANGE, COLOR_RED, lerpValue))) { - CLAY_TEXT(CLAY_ID("AnimationDemoTextRight"), LOREM_IPSUM_TEXT, CLAY_TEXT_CONFIG(.fontSize = 24, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT)); + CLAY(CLAY_ID("AnimationDemoContainerRight"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = {32, 32} }), CLAY_RECTANGLE({ .color = ColorLerp(COLOR_ORANGE, COLOR_RED, lerpValue) })) { + CLAY_TEXT(LOREM_IPSUM_TEXT, CLAY_TEXT_CONFIG({ .fontSize = 24, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT })); } } } @@ -187,60 +187,70 @@ void HighPerformancePageDesktop(float lerpValue) { } void HighPerformancePageMobile(float lerpValue) { - CLAY_RECTANGLE(CLAY_ID("PerformanceMobile"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER}, .padding = {.x = 16, 32}, .childGap = 32), CLAY_RECTANGLE_CONFIG(.color = COLOR_RED)) { - CLAY_CONTAINER(CLAY_ID("PerformanceLeftText"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW() }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8)) { - CLAY_TEXT(CLAY_ID("PerformanceTextTitle"), CLAY_STRING("High Performance"), CLAY_TEXT_CONFIG(.fontSize = 48, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT)); - CLAY_CONTAINER(CLAY_ID("PerformanceSpacer"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(.max = 16) })) {} - CLAY_TEXT(CLAY_IDI("PerformanceTextSubTitle", 1), CLAY_STRING("Fast enough to recompute your entire UI every frame."), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT)); - CLAY_TEXT(CLAY_IDI("PerformanceTextSubTitle", 2), CLAY_STRING("Small memory footprint (3.5mb default) with static allocation & reuse. No malloc / free."), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT)); - CLAY_TEXT(CLAY_IDI("PerformanceTextSubTitle", 3), CLAY_STRING("Simplify animations and reactive UI design by avoiding the standard performance hacks."), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT)); + CLAY(CLAY_ID("PerformanceMobile"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIT({ .min = windowHeight - 50 }) }, .childAlignment = {CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER}, .padding = {.x = 16, 32}, .childGap = 32 }), CLAY_RECTANGLE({ .color = COLOR_RED })) { + CLAY(CLAY_ID("PerformanceLeftText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW() }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) { + CLAY_TEXT(CLAY_STRING("High Performance"), CLAY_TEXT_CONFIG({ .fontSize = 48, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT })); + CLAY(CLAY_ID("PerformanceSpacer"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = 16 }) }})) {} + CLAY_TEXT(CLAY_STRING("Fast enough to recompute your entire UI every frame."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT })); + CLAY_TEXT(CLAY_STRING("Small memory footprint (3.5mb default) with static allocation & reuse. No malloc / free."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT })); + CLAY_TEXT(CLAY_STRING("Simplify animations and reactive UI design by avoiding the standard performance hacks."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT })); } - CLAY_CONTAINER(CLAY_ID("PerformanceRightImageOuter"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW() }, .childAlignment = {CLAY_ALIGN_X_CENTER})) { - CLAY_BORDER_CONTAINER(CLAY_ID(""), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(400) }), CLAY_BORDER_CONFIG_ALL(.width = 2, .color = COLOR_LIGHT)) { - CLAY_RECTANGLE(CLAY_ID("AnimationDemoContainerLeft"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_PERCENT(0.35f + 0.3f * lerpValue), CLAY_SIZING_GROW() }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = {16, 16}), CLAY_RECTANGLE_CONFIG(.color = ColorLerp(COLOR_RED, COLOR_ORANGE, lerpValue))) { - CLAY_TEXT(CLAY_ID("AnimationDemoTextLeft"), LOREM_IPSUM_TEXT, CLAY_TEXT_CONFIG(.fontSize = 24, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT)); + CLAY(CLAY_ID("PerformanceRightImageOuter"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW() }, .childAlignment = {CLAY_ALIGN_X_CENTER} })) { + CLAY(CLAY_ID(""), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(400) } }), CLAY_BORDER_ALL({ .width = 2, .color = COLOR_LIGHT })) { + CLAY(CLAY_ID("AnimationDemoContainerLeft"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.35f + 0.3f * lerpValue), CLAY_SIZING_GROW() }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = {16, 16} }), CLAY_RECTANGLE({ .color = ColorLerp(COLOR_RED, COLOR_ORANGE, lerpValue) })) { + CLAY_TEXT(LOREM_IPSUM_TEXT, CLAY_TEXT_CONFIG({ .fontSize = 24, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT })); } - CLAY_RECTANGLE(CLAY_ID("AnimationDemoContainerRight"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = {16, 16}), CLAY_RECTANGLE_CONFIG(.color = ColorLerp(COLOR_ORANGE, COLOR_RED, lerpValue))) { - CLAY_TEXT(CLAY_ID("AnimationDemoTextRight"), LOREM_IPSUM_TEXT, CLAY_TEXT_CONFIG(.fontSize = 24, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT)); + CLAY(CLAY_ID("AnimationDemoContainerRight"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = {16, 16} }), CLAY_RECTANGLE({ .color = ColorLerp(COLOR_ORANGE, COLOR_RED, lerpValue) })) { + CLAY_TEXT(LOREM_IPSUM_TEXT, CLAY_TEXT_CONFIG({ .fontSize = 24, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT })); } } } } } -void RendererButtonActive(Clay_ElementId id, int index, Clay_String text) { - CLAY_RECTANGLE(id, CLAY_LAYOUT(.sizing = {CLAY_SIZING_FIXED(300) }, .padding = {16, 16}), CLAY_RECTANGLE_CONFIG(.color = Clay_PointerOver(id) ? COLOR_RED_HOVER : COLOR_RED, .cornerRadius = CLAY_CORNER_RADIUS(10))) { - CLAY_TEXT(CLAY_ID("RendererButtonActiveText"), text, CLAY_TEXT_CONFIG(.disablePointerEvents = true, .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT)); +void HandleRendererButtonInteraction(Clay_ElementId elementId, Clay_PointerInfo pointerInfo, intptr_t userData) { + if (pointerInfo.state == CLAY_POINTER_INFO_PRESSED_THIS_FRAME) { + ACTIVE_RENDERER_INDEX = (uint32_t)userData; } } -void RendererButtonInactive(Clay_ElementId id, int index, Clay_String text) { - CLAY_BORDER_CONTAINER(id, CLAY_LAYOUT(), CLAY_BORDER_CONFIG_OUTSIDE_RADIUS(2, COLOR_RED, 10)) { - CLAY_RECTANGLE(CLAY_IDI("RendererButtonInactiveInner", index), CLAY_LAYOUT(.sizing = {CLAY_SIZING_FIXED(300) }, .padding = {16, 16}), CLAY_RECTANGLE_CONFIG(.color = Clay_PointerOver(id) ? COLOR_LIGHT_HOVER : COLOR_LIGHT, .cornerRadius = CLAY_CORNER_RADIUS(10), .cursorPointer = true)) { - CLAY_TEXT(CLAY_IDI("RendererButtonInactiveText", index), text, CLAY_TEXT_CONFIG(.disablePointerEvents = true, .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED)); - } +void RendererButtonActive(Clay_String text) { + CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED(300) }, .padding = {16, 16} }), + CLAY_RECTANGLE({ .color = Clay_Hovered() ? COLOR_RED_HOVER : COLOR_RED, .cornerRadius = CLAY_CORNER_RADIUS(10) }) + ) { + CLAY_TEXT(text, CLAY_TEXT_CONFIG({ .disablePointerEvents = true, .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT })); + } +} + +void RendererButtonInactive(Clay_String text, size_t rendererIndex) { + CLAY(CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED(300)}, .padding = {16, 16} }), + CLAY_BORDER_OUTSIDE_RADIUS(2, COLOR_RED, 10), + CLAY_RECTANGLE({ .color = Clay_Hovered() ? COLOR_LIGHT_HOVER : COLOR_LIGHT, .cornerRadius = CLAY_CORNER_RADIUS(10), .cursorPointer = true }), + Clay_OnHover(HandleRendererButtonInteraction, rendererIndex) + ) { + CLAY_TEXT(text, CLAY_TEXT_CONFIG({ .disablePointerEvents = true, .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); } } void RendererPageDesktop() { - CLAY_CONTAINER(CLAY_ID("RendererPageDesktop"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {.x = 50})) { - CLAY_BORDER_CONTAINER(CLAY_ID("RendererPage"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, .childAlignment = { 0, CLAY_ALIGN_Y_CENTER }, .padding = { 32, 32 }, .childGap = 32), CLAY_BORDER_CONFIG(.left = { 2, COLOR_RED }, .right = { 2, COLOR_RED })) { - CLAY_CONTAINER(CLAY_ID("RendererLeftText"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_PERCENT(0.5) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8)) { - CLAY_TEXT(CLAY_ID("RendererTextTitle"), CLAY_STRING("Renderer & Platform Agnostic"), CLAY_TEXT_CONFIG(.fontSize = 52, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_RED)); - CLAY_CONTAINER(CLAY_ID("RendererSpacerLeft"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(.max = 16) })) {} - CLAY_TEXT(CLAY_IDI("RendererTextSubTitle", 1), CLAY_STRING("Clay outputs a sorted array of primitive render commands, such as RECTANGLE, TEXT or IMAGE."), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED)); - CLAY_TEXT(CLAY_IDI("RendererTextSubTitle", 2), CLAY_STRING("Write your own renderer in a few hundred lines of code, or use the provided examples for Raylib, WebGL canvas and more."), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED)); - CLAY_TEXT(CLAY_IDI("RendererTextSubTitle", 3), CLAY_STRING("There's even an HTML renderer - you're looking at it right now!"), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED)); + CLAY(CLAY_ID("RendererPageDesktop"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIT({ .min = windowHeight - 50 }) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {.x = 50} })) { + CLAY(CLAY_ID("RendererPage"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, .childAlignment = { 0, CLAY_ALIGN_Y_CENTER }, .padding = { 32, 32 }, .childGap = 32 }), CLAY_BORDER({ .left = { 2, COLOR_RED }, .right = { 2, COLOR_RED } })) { + CLAY(CLAY_ID("RendererLeftText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.5) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) { + CLAY_TEXT(CLAY_STRING("Renderer & Platform Agnostic"), CLAY_TEXT_CONFIG({ .fontSize = 52, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_RED })); + CLAY(CLAY_ID("RendererSpacerLeft"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = 16 }) }})) {} + CLAY_TEXT(CLAY_STRING("Clay outputs a sorted array of primitive render commands, such as RECTANGLE, TEXT or IMAGE."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); + CLAY_TEXT(CLAY_STRING("Write your own renderer in a few hundred lines of code, or use the provided examples for Raylib, WebGL canvas and more."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); + CLAY_TEXT(CLAY_STRING("There's even an HTML renderer - you're looking at it right now!"), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); } - CLAY_CONTAINER(CLAY_ID("RendererRightText"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_PERCENT(0.5) }, .childAlignment = {CLAY_ALIGN_X_CENTER}, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 16)) { - CLAY_TEXT(CLAY_ID("RendererTextRightTitle"), CLAY_STRING("Try changing renderer!"), CLAY_TEXT_CONFIG(.fontSize = 36, .fontId = FONT_ID_BODY_36, .textColor = COLOR_ORANGE)); - CLAY_CONTAINER(CLAY_ID("RendererSpacerRight"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(.max = 32) })) {} + CLAY(CLAY_ID("RendererRightText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.5) }, .childAlignment = {CLAY_ALIGN_X_CENTER}, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 16 })) { + CLAY_TEXT(CLAY_STRING("Try changing renderer!"), CLAY_TEXT_CONFIG({ .fontSize = 36, .fontId = FONT_ID_BODY_36, .textColor = COLOR_ORANGE })); + CLAY(CLAY_ID("RendererSpacerRight"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = 32 }) } })) {} if (ACTIVE_RENDERER_INDEX == 0) { - RendererButtonActive(CLAY_IDI("RendererSelectButtonActive", 0), 0, CLAY_STRING("HTML Renderer")); - RendererButtonInactive(CLAY_ID("RendererSelectButtonCanvas"), 1, CLAY_STRING("Canvas Renderer")); + RendererButtonActive(CLAY_STRING("HTML Renderer")); + RendererButtonInactive(CLAY_STRING("Canvas Renderer"), 1); } else { - RendererButtonInactive(CLAY_ID("RendererSelectButtonHTML"), 0, CLAY_STRING("HTML Renderer")); - RendererButtonActive(CLAY_IDI("RendererSelectButtonActive", 0), 1, CLAY_STRING("Canvas Renderer")); + RendererButtonInactive(CLAY_STRING("HTML Renderer"), 0); + RendererButtonActive(CLAY_STRING("Canvas Renderer")); } } } @@ -248,40 +258,40 @@ void RendererPageDesktop() { } void RendererPageMobile() { - CLAY_RECTANGLE(CLAY_ID("RendererMobile"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {.x = CLAY_ALIGN_X_CENTER, .y = CLAY_ALIGN_Y_CENTER}, .padding = {.x = 16, 32}, .childGap = 32), CLAY_RECTANGLE_CONFIG(.color = COLOR_LIGHT)) { - CLAY_CONTAINER(CLAY_ID("RendererLeftText"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW() }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8)) { - CLAY_TEXT(CLAY_ID("RendererTextTitle"), CLAY_STRING("Renderer & Platform Agnostic"), CLAY_TEXT_CONFIG(.fontSize = 48, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_RED)); - CLAY_CONTAINER(CLAY_ID("RendererSpacerLeft"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(.max = 16) })) {} - CLAY_TEXT(CLAY_IDI("RendererTextSubTitle", 1), CLAY_STRING("Clay outputs a sorted array of primitive render commands, such as RECTANGLE, TEXT or IMAGE."), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED)); - CLAY_TEXT(CLAY_IDI("RendererTextSubTitle", 2), CLAY_STRING("Write your own renderer in a few hundred lines of code, or use the provided examples for Raylib, WebGL canvas and more."), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED)); - CLAY_TEXT(CLAY_IDI("RendererTextSubTitle", 3), CLAY_STRING("There's even an HTML renderer - you're looking at it right now!"), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED)); + CLAY(CLAY_ID("RendererMobile"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIT({ .min = windowHeight - 50 }) }, .childAlignment = {.x = CLAY_ALIGN_X_CENTER, .y = CLAY_ALIGN_Y_CENTER}, .padding = {.x = 16, 32}, .childGap = 32 }), CLAY_RECTANGLE({ .color = COLOR_LIGHT })) { + CLAY(CLAY_ID("RendererLeftText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW() }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) { + CLAY_TEXT(CLAY_STRING("Renderer & Platform Agnostic"), CLAY_TEXT_CONFIG({ .fontSize = 48, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_RED })); + CLAY(CLAY_ID("RendererSpacerLeft"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = 16 }) }})) {} + CLAY_TEXT(CLAY_STRING("Clay outputs a sorted array of primitive render commands, such as RECTANGLE, TEXT or IMAGE."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); + CLAY_TEXT(CLAY_STRING("Write your own renderer in a few hundred lines of code, or use the provided examples for Raylib, WebGL canvas and more."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); + CLAY_TEXT(CLAY_STRING("There's even an HTML renderer - you're looking at it right now!"), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_RED })); } - CLAY_CONTAINER(CLAY_ID("RendererRightText"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW() }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 16)) { - CLAY_TEXT(CLAY_ID("RendererTextRightTitle"), CLAY_STRING("Try changing renderer!"), CLAY_TEXT_CONFIG(.fontSize = 36, .fontId = FONT_ID_BODY_36, .textColor = COLOR_ORANGE)); - CLAY_CONTAINER(CLAY_ID("RendererSpacerRight"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(.max = 32) })) {} + CLAY(CLAY_ID("RendererRightText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW() }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 16 })) { + CLAY_TEXT(CLAY_STRING("Try changing renderer!"), CLAY_TEXT_CONFIG({ .fontSize = 36, .fontId = FONT_ID_BODY_36, .textColor = COLOR_ORANGE })); + CLAY(CLAY_ID("RendererSpacerRight"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = 32}) }})) {} if (ACTIVE_RENDERER_INDEX == 0) { - RendererButtonActive(CLAY_IDI("RendererSelectButtonActive", 0), 0, CLAY_STRING("HTML Renderer")); - RendererButtonInactive(CLAY_ID("RendererSelectButtonCanvas"), 1, CLAY_STRING("Canvas Renderer")); + RendererButtonActive(CLAY_STRING("HTML Renderer")); + RendererButtonInactive(CLAY_STRING("Canvas Renderer"), 1); } else { - RendererButtonInactive(CLAY_ID("RendererSelectButtonHTML"), 0, CLAY_STRING("HTML Renderer")); - RendererButtonActive(CLAY_IDI("RendererSelectButtonActive", 0), 1, CLAY_STRING("Canvas Renderer")); + RendererButtonInactive(CLAY_STRING("HTML Renderer"), 0); + RendererButtonActive(CLAY_STRING("Canvas Renderer")); } } } } void DebuggerPageDesktop() { - CLAY_RECTANGLE(CLAY_ID("DebuggerDesktop"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIT(.min = windowHeight - 50) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {.x = 82, 32}, .childGap = 64), CLAY_RECTANGLE_CONFIG(.color = COLOR_RED)) { - CLAY_CONTAINER(CLAY_ID("DebuggerLeftText"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_PERCENT(0.5) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8)) { - CLAY_TEXT(CLAY_ID("DebuggerTextTitle"), CLAY_STRING("Integrated Debug Tools"), CLAY_TEXT_CONFIG(.fontSize = 52, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT)); - CLAY_CONTAINER(CLAY_ID("DebuggerSpacer"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(.max = 16) })) {} - CLAY_TEXT(CLAY_IDI("DebuggerTextSubTitle", 1), CLAY_STRING("Clay includes built in \"Chrome Inspector\"-style debug tooling."), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT)); - CLAY_TEXT(CLAY_IDI("DebuggerTextSubTitle", 2), CLAY_STRING("View your layout hierarchy and config in real time."), CLAY_TEXT_CONFIG(.fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT)); - CLAY_CONTAINER(CLAY_ID("DebuggerPageSpacer"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(32) })) {} - CLAY_TEXT(CLAY_ID("DebuggerTagline"), CLAY_STRING("Press the \"d\" key to try it out now!"), CLAY_TEXT_CONFIG(.fontSize = 32, .fontId = FONT_ID_TITLE_36, .textColor = COLOR_ORANGE)); + CLAY(CLAY_ID("DebuggerDesktop"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIT({ .min = windowHeight - 50 }) }, .childAlignment = {0, CLAY_ALIGN_Y_CENTER}, .padding = {.x = 82, 32}, .childGap = 64 }), CLAY_RECTANGLE({ .color = COLOR_RED })) { + CLAY(CLAY_ID("DebuggerLeftText"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.5) }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = 8 })) { + CLAY_TEXT(CLAY_STRING("Integrated Debug Tools"), CLAY_TEXT_CONFIG({ .fontSize = 52, .fontId = FONT_ID_TITLE_56, .textColor = COLOR_LIGHT })); + CLAY(CLAY_ID("DebuggerSpacer"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = 16 }) }})) {} + CLAY_TEXT(CLAY_STRING("Clay includes built in \"Chrome Inspector\"-style debug tooling."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT })); + CLAY_TEXT(CLAY_STRING("View your layout hierarchy and config in real time."), CLAY_TEXT_CONFIG({ .fontSize = 28, .fontId = FONT_ID_BODY_36, .textColor = COLOR_LIGHT })); + CLAY(CLAY_ID("DebuggerPageSpacer"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(32) } })) {} + CLAY_TEXT(CLAY_STRING("Press the \"d\" key to try it out now!"), CLAY_TEXT_CONFIG({ .fontSize = 32, .fontId = FONT_ID_TITLE_36, .textColor = COLOR_ORANGE })); } - CLAY_CONTAINER(CLAY_ID("DebuggerRightImageOuter"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_PERCENT(0.50) }, .childAlignment = {CLAY_ALIGN_X_CENTER})) { - CLAY_IMAGE(CLAY_ID("DebuggerPageRightImageInner"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(.max = 558) }), CLAY_IMAGE_CONFIG(.sourceDimensions = {1620, 1474}, .sourceURL = CLAY_STRING("/clay/images/debugger.png"))) {} + CLAY(CLAY_ID("DebuggerRightImageOuter"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_PERCENT(0.50) }, .childAlignment = {CLAY_ALIGN_X_CENTER} })) { + CLAY(CLAY_ID("DebuggerPageRightImageInner"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW({ .max = 558 }) } }), CLAY_IMAGE({ .sourceDimensions = {1620, 1474}, .sourceURL = CLAY_STRING("/clay/images/debugger.png") })) {} } } } @@ -298,71 +308,76 @@ float animationLerpValue = -1.0f; Clay_RenderCommandArray CreateLayout(bool mobileScreen, float lerpValue) { Clay_BeginLayout(); - CLAY_RECTANGLE(CLAY_ID("OuterContainer"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }), CLAY_RECTANGLE_CONFIG(.color = COLOR_LIGHT)) { - CLAY_CONTAINER(CLAY_ID("Header"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(50) }, .childAlignment = { 0, CLAY_ALIGN_Y_CENTER }, .childGap = 24, .padding = { 32 })) { - CLAY_TEXT(CLAY_ID("Logo"), CLAY_STRING("Clay"), &headerTextConfig); - CLAY_CONTAINER(CLAY_ID("Spacer"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW() })) {} - + CLAY(CLAY_ID("OuterContainer"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() } }), CLAY_RECTANGLE({ .color = COLOR_LIGHT })) { + CLAY(CLAY_ID("Header"), CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(50) }, .childAlignment = { 0, CLAY_ALIGN_Y_CENTER }, .childGap = 16, .padding = { 32 } })) { + CLAY_TEXT(CLAY_STRING("Clay"), &headerTextConfig); + CLAY(CLAY_ID("Spacer"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW() } })) {} if (!mobileScreen) { - CLAY_RECTANGLE(CLAY_ID("LinkExamplesOuter"), &CLAY_LAYOUT_DEFAULT, CLAY_RECTANGLE_CONFIG(.link = CLAY_STRING("https://github.com/nicbarker/clay/tree/main/examples"), .color = {0,0,0,0})) { - CLAY_TEXT(CLAY_ID("LinkExamplesText"), CLAY_STRING("Examples"), CLAY_TEXT_CONFIG(.disablePointerEvents = true, .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255})); + CLAY(CLAY_ID("LinkExamplesOuter"), CLAY_LAYOUT({ .padding = {8} }), CLAY_RECTANGLE({ .link = CLAY_STRING("https://github.com/nicbarker/clay/tree/main/examples"), .color = {0,0,0,0} })) { + CLAY_TEXT(CLAY_STRING("Examples"), CLAY_TEXT_CONFIG({ .disablePointerEvents = true, .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255} })); } - CLAY_RECTANGLE(CLAY_ID("LinkDocsOuter"), &CLAY_LAYOUT_DEFAULT, CLAY_RECTANGLE_CONFIG(.link = CLAY_STRING("https://github.com/nicbarker/clay/blob/main/README.md"), .color = {0,0,0,0})) { - CLAY_TEXT(CLAY_ID("LinkDocsText"), CLAY_STRING("Docs"), CLAY_TEXT_CONFIG(.disablePointerEvents = true, .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255})); + CLAY(CLAY_ID("LinkDocsOuter"), CLAY_LAYOUT({ .padding = {8} }), CLAY_RECTANGLE({ .link = CLAY_STRING("https://github.com/nicbarker/clay/blob/main/README.md"), .color = {0,0,0,0} })) { + CLAY_TEXT(CLAY_STRING("Docs"), CLAY_TEXT_CONFIG({ .disablePointerEvents = true, .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255} })); } } - Clay_ElementId discordButtonId = CLAY_ID("HeaderButtonDiscord"); - CLAY_BORDER_CONTAINER(CLAY_ID("LinkDiscordOuter"), CLAY_LAYOUT(), CLAY_BORDER_CONFIG_OUTSIDE_RADIUS(2, COLOR_RED, 10)) { - CLAY_RECTANGLE(discordButtonId, CLAY_LAYOUT(.padding = {16, 6}), CLAY_RECTANGLE_CONFIG(.cornerRadius = CLAY_CORNER_RADIUS(10), .link = CLAY_STRING("https://discord.gg/b4FTWkxdvT"), .color = Clay_PointerOver(discordButtonId) ? COLOR_LIGHT_HOVER : COLOR_LIGHT)) { - CLAY_TEXT(CLAY_ID("LinkDiscordText"), CLAY_STRING("Discord"), CLAY_TEXT_CONFIG(.disablePointerEvents = true, .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255})); - } + CLAY(CLAY_LAYOUT({ .padding = {16, 6} }), + CLAY_RECTANGLE({ + .cornerRadius = CLAY_CORNER_RADIUS(10), + .link = CLAY_STRING("https://discord.gg/b4FTWkxdvT"), + .color = Clay_Hovered() ? COLOR_LIGHT_HOVER : COLOR_LIGHT }), + CLAY_BORDER_OUTSIDE_RADIUS(2, COLOR_RED, 10) + ) { + CLAY_TEXT(CLAY_STRING("Discord"), CLAY_TEXT_CONFIG({ .disablePointerEvents = true, .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255} })); } - Clay_ElementId githubButtonId = CLAY_ID("HeaderButtonGithub"); - CLAY_BORDER_CONTAINER(CLAY_ID("LinkGithubOuter"), CLAY_LAYOUT(), CLAY_BORDER_CONFIG_OUTSIDE_RADIUS(2, COLOR_RED, 10)) { - CLAY_RECTANGLE(githubButtonId, CLAY_LAYOUT(.padding = {16, 6}), CLAY_RECTANGLE_CONFIG(.cornerRadius = CLAY_CORNER_RADIUS(10), .link = CLAY_STRING("https://github.com/nicbarker/clay"), .color = Clay_PointerOver(githubButtonId) ? COLOR_LIGHT_HOVER : COLOR_LIGHT)) { - CLAY_TEXT(CLAY_ID("LinkGithubText"), CLAY_STRING("Github"), CLAY_TEXT_CONFIG(.disablePointerEvents = true, .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255})); - } + CLAY(CLAY_LAYOUT({ .padding = {16, 6} }), + CLAY_RECTANGLE({ .cornerRadius = CLAY_CORNER_RADIUS(10), .link = CLAY_STRING("https://github.com/nicbarker/clay"), .color = Clay_Hovered() ? COLOR_LIGHT_HOVER : COLOR_LIGHT }), + CLAY_BORDER_OUTSIDE_RADIUS(2, COLOR_RED, 10) + ) { + CLAY_TEXT(CLAY_STRING("Github"), CLAY_TEXT_CONFIG({ .disablePointerEvents = true, .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255} })); } } - CLAY_RECTANGLE(CLAY_ID("TopBorder1"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(4) }), CLAY_RECTANGLE_CONFIG(.color = COLOR_TOP_BORDER_5)) {} - CLAY_RECTANGLE(CLAY_ID("TopBorder2"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(4) }), CLAY_RECTANGLE_CONFIG(.color = COLOR_TOP_BORDER_4)) {} - CLAY_RECTANGLE(CLAY_ID("TopBorder3"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(4) }), CLAY_RECTANGLE_CONFIG(.color = COLOR_TOP_BORDER_3)) {} - CLAY_RECTANGLE(CLAY_ID("TopBorder4"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(4) }), CLAY_RECTANGLE_CONFIG(.color = COLOR_TOP_BORDER_2)) {} - CLAY_RECTANGLE(CLAY_ID("TopBorder5"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(4) }), CLAY_RECTANGLE_CONFIG(.color = COLOR_TOP_BORDER_1)) {} - CLAY_RECTANGLE(CLAY_ID("ScrollContainerBackgroundRectangle"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }), CLAY_RECTANGLE_CONFIG(.color = COLOR_LIGHT)) { - CLAY_SCROLL_CONTAINER(CLAY_ID("OuterScrollContainer"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }), CLAY_SCROLL_CONFIG(.vertical = true)) { - CLAY_BORDER_CONTAINER(CLAY_ID("ScrollContainerInner"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { CLAY_SIZING_GROW() }), CLAY_BORDER_CONFIG(.betweenChildren = {2, COLOR_RED})) { - if (mobileScreen) { - LandingPageMobile(); - FeatureBlocksMobile(); - DeclarativeSyntaxPageMobile(); - HighPerformancePageMobile(lerpValue); - RendererPageMobile(); - } else { - LandingPageDesktop(); - FeatureBlocksDesktop(); - DeclarativeSyntaxPageDesktop(); - HighPerformancePageDesktop(lerpValue); - RendererPageDesktop(); - DebuggerPageDesktop(); - } - } + Clay_LayoutConfig topBorderConfig = (Clay_LayoutConfig) { .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(4) }}; + CLAY(CLAY_ID("TopBorder1"), CLAY_LAYOUT(topBorderConfig), CLAY_RECTANGLE({ .color = COLOR_TOP_BORDER_5 })) {} + CLAY(CLAY_ID("TopBorder2"), CLAY_LAYOUT(topBorderConfig), CLAY_RECTANGLE({ .color = COLOR_TOP_BORDER_4 })) {} + CLAY(CLAY_ID("TopBorder3"), CLAY_LAYOUT(topBorderConfig), CLAY_RECTANGLE({ .color = COLOR_TOP_BORDER_3 })) {} + CLAY(CLAY_ID("TopBorder4"), CLAY_LAYOUT(topBorderConfig), CLAY_RECTANGLE({ .color = COLOR_TOP_BORDER_2 })) {} + CLAY(CLAY_ID("TopBorder5"), CLAY_LAYOUT(topBorderConfig), CLAY_RECTANGLE({ .color = COLOR_TOP_BORDER_1 })) {} + CLAY(CLAY_ID("OuterScrollContainer"), + CLAY_LAYOUT({ .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, .layoutDirection = CLAY_TOP_TO_BOTTOM }), + CLAY_SCROLL({ .vertical = true }), + CLAY_BORDER({ .betweenChildren = {2, COLOR_RED} }) + ) { + if (mobileScreen) { + LandingPageMobile(); + FeatureBlocksMobile(); + DeclarativeSyntaxPageMobile(); + HighPerformancePageMobile(lerpValue); + RendererPageMobile(); + } else { + LandingPageDesktop(); + FeatureBlocksDesktop(); + DeclarativeSyntaxPageDesktop(); + HighPerformancePageDesktop(lerpValue); + RendererPageDesktop(); + DebuggerPageDesktop(); } } } if (!mobileScreen) { - Clay_ScrollContainerData scrollData = Clay_GetScrollContainerData(CLAY_ID("OuterScrollContainer")); + Clay_ScrollContainerData scrollData = Clay_GetScrollContainerData(Clay_GetElementId(CLAY_STRING("OuterScrollContainer"))); Clay_Color scrollbarColor = (Clay_Color){225, 138, 50, 120}; if (scrollbarData.mouseDown) { scrollbarColor = (Clay_Color){225, 138, 50, 200}; - } else if (Clay_PointerOver(CLAY_ID("ScrollBar"))) { + } else if (Clay_PointerOver(Clay_GetElementId(CLAY_STRING("ScrollBar")))) { scrollbarColor = (Clay_Color){225, 138, 50, 160}; } float scrollHeight = scrollData.scrollContainerDimensions.height - 12; - CLAY_FLOATING_CONTAINER(CLAY_ID("ScrollBar"), &CLAY_LAYOUT_DEFAULT, CLAY_FLOATING_CONFIG(.offset = { .x = -6, .y = -(scrollData.scrollPosition->y / scrollData.contentDimensions.height) * scrollHeight + 6}, .zIndex = 1, .parentId = CLAY_ID("OuterScrollContainer").id, .attachment = {.element = CLAY_ATTACH_POINT_RIGHT_TOP, .parent = CLAY_ATTACH_POINT_RIGHT_TOP})) { - CLAY_RECTANGLE(CLAY_ID("ScrollBarButton"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_FIXED(10), CLAY_SIZING_FIXED((scrollHeight / scrollData.contentDimensions.height) * scrollHeight)}), CLAY_RECTANGLE_CONFIG(.cornerRadius = CLAY_CORNER_RADIUS(5), .color = scrollbarColor)) {} - } + CLAY(CLAY_ID("ScrollBar"), + CLAY_FLOATING({ .offset = { .x = -6, .y = -(scrollData.scrollPosition->y / scrollData.contentDimensions.height) * scrollHeight + 6}, .zIndex = 1, .parentId = Clay_GetElementId(CLAY_STRING("OuterScrollContainer")).id, .attachment = {.element = CLAY_ATTACH_POINT_RIGHT_TOP, .parent = CLAY_ATTACH_POINT_RIGHT_TOP }}), + CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED(10), CLAY_SIZING_FIXED((scrollHeight / scrollData.contentDimensions.height) * scrollHeight)} }), + CLAY_RECTANGLE({ .cornerRadius = CLAY_CORNER_RADIUS(5), .color = scrollbarColor }) + ) {} } return Clay_EndLayout(); } @@ -385,14 +400,6 @@ CLAY_WASM_EXPORT("UpdateDrawFrame") Clay_RenderCommandArray UpdateDrawFrame(floa Clay_SetDebugModeEnabled(debugModeEnabled); } - if (isTouchDown || isMouseDown) { - if (Clay_PointerOver(CLAY_ID("RendererSelectButtonHTML"))) { - ACTIVE_RENDERER_INDEX = 0; - } else if (Clay_PointerOver(CLAY_ID("RendererSelectButtonCanvas"))) { - ACTIVE_RENDERER_INDEX = 1; - } - } - Clay__debugViewHighlightColor = (Clay_Color) {105,210,231, 120}; Clay_SetPointerState((Clay_Vector2) {mousePositionX, mousePositionY}, isMouseDown || isTouchDown); @@ -401,13 +408,13 @@ CLAY_WASM_EXPORT("UpdateDrawFrame") Clay_RenderCommandArray UpdateDrawFrame(floa scrollbarData.mouseDown = false; } - if (isMouseDown && !scrollbarData.mouseDown && Clay_PointerOver(CLAY_ID("ScrollBar"))) { - Clay_ScrollContainerData scrollContainerData = Clay_GetScrollContainerData(CLAY_ID("OuterScrollContainer")); + if (isMouseDown && !scrollbarData.mouseDown && Clay_PointerOver(Clay_GetElementId(CLAY_STRING("ScrollBar")))) { + Clay_ScrollContainerData scrollContainerData = Clay_GetScrollContainerData(Clay_GetElementId(CLAY_STRING("OuterScrollContainer"))); scrollbarData.clickOrigin = (Clay_Vector2) { mousePositionX, mousePositionY }; scrollbarData.positionOrigin = *scrollContainerData.scrollPosition; scrollbarData.mouseDown = true; } else if (scrollbarData.mouseDown) { - Clay_ScrollContainerData scrollContainerData = Clay_GetScrollContainerData(CLAY_ID("OuterScrollContainer")); + Clay_ScrollContainerData scrollContainerData = Clay_GetScrollContainerData(Clay_GetElementId(CLAY_STRING("OuterScrollContainer"))); if (scrollContainerData.contentDimensions.height > 0) { Clay_Vector2 ratio = (Clay_Vector2) { scrollContainerData.contentDimensions.width / scrollContainerData.scrollContainerDimensions.width, @@ -423,12 +430,12 @@ CLAY_WASM_EXPORT("UpdateDrawFrame") Clay_RenderCommandArray UpdateDrawFrame(floa } if (arrowKeyDownPressedThisFrame) { - Clay_ScrollContainerData scrollContainerData = Clay_GetScrollContainerData(CLAY_ID("OuterScrollContainer")); + Clay_ScrollContainerData scrollContainerData = Clay_GetScrollContainerData(Clay_GetElementId(CLAY_STRING("OuterScrollContainer"))); if (scrollContainerData.contentDimensions.height > 0) { scrollContainerData.scrollPosition->y = scrollContainerData.scrollPosition->y - 50; } } else if (arrowKeyUpPressedThisFrame) { - Clay_ScrollContainerData scrollContainerData = Clay_GetScrollContainerData(CLAY_ID("OuterScrollContainer")); + Clay_ScrollContainerData scrollContainerData = Clay_GetScrollContainerData(Clay_GetElementId(CLAY_STRING("OuterScrollContainer"))); if (scrollContainerData.contentDimensions.height > 0) { scrollContainerData.scrollPosition->y = scrollContainerData.scrollPosition->y + 50; } diff --git a/examples/cpp-project-example/CMakeLists.txt b/examples/cpp-project-example/CMakeLists.txt index 6ebaae7..8c6a754 100644 --- a/examples/cpp-project-example/CMakeLists.txt +++ b/examples/cpp-project-example/CMakeLists.txt @@ -8,5 +8,5 @@ add_executable(clay_examples_cpp_project_example main.cpp) target_include_directories(clay_examples_cpp_project_example PUBLIC .) -set(CMAKE_CXX_FLAGS_DEBUG "-Wall") +set(CMAKE_CXX_FLAGS_DEBUG "-Werror -Wall") set(CMAKE_CXX_FLAGS_RELEASE "-O3") \ No newline at end of file diff --git a/examples/cpp-project-example/main.cpp b/examples/cpp-project-example/main.cpp index 56062bd..8c26fd7 100644 --- a/examples/cpp-project-example/main.cpp +++ b/examples/cpp-project-example/main.cpp @@ -2,9 +2,14 @@ #define CLAY_IMPLEMENTATION #include "../../clay.h" +Clay_LayoutConfig layoutElement = Clay_LayoutConfig { .padding = {5} }; + int main(void) { uint64_t totalMemorySize = Clay_MinMemorySize(); Clay_Arena clayMemory = Clay_Arena { .label = CLAY_STRING("Clay Memory Arena"), .capacity = totalMemorySize, .memory = (char *)malloc(totalMemorySize) }; Clay_Initialize(clayMemory, Clay_Dimensions {1024,768}); + Clay_BeginLayout(); + CLAY(CLAY_RECTANGLE({ .color = {255,255,255,0} }), CLAY_LAYOUT(layoutElement)) {} + Clay_EndLayout(); return 0; } diff --git a/examples/raylib-sidebar-scrolling-container/CMakeLists.txt b/examples/raylib-sidebar-scrolling-container/CMakeLists.txt index f93f628..0e73526 100644 --- a/examples/raylib-sidebar-scrolling-container/CMakeLists.txt +++ b/examples/raylib-sidebar-scrolling-container/CMakeLists.txt @@ -20,7 +20,7 @@ FetchContent_MakeAvailable(raylib) add_executable(clay_examples_raylib_sidebar_scrolling_container main.c multi-compilation-unit.c) -target_compile_options(clay_examples_raylib_sidebar_scrolling_container PUBLIC -Wall -Werror -Wno-unknown-pragmas) +target_compile_options(clay_examples_raylib_sidebar_scrolling_container PUBLIC -DCLAY_DEBUG -DCLAY_OVERFLOW_TRAP -Wall -Werror -Wno-unknown-pragmas) target_include_directories(clay_examples_raylib_sidebar_scrolling_container PUBLIC .) target_link_libraries(clay_examples_raylib_sidebar_scrolling_container PUBLIC raylib) diff --git a/examples/raylib-sidebar-scrolling-container/main.c b/examples/raylib-sidebar-scrolling-container/main.c index bef69d3..832eb87 100644 --- a/examples/raylib-sidebar-scrolling-container/main.c +++ b/examples/raylib-sidebar-scrolling-container/main.c @@ -13,11 +13,18 @@ Texture2D profilePicture; Clay_String profileText = CLAY_STRING("Profile Page one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen"); Clay_TextElementConfig headerTextConfig = (Clay_TextElementConfig) { .fontId = 1, .fontSize = 16, .textColor = {0,0,0,255} }; +void HandleHeaderButtonInteraction(Clay_ElementId elementId, Clay_PointerInfo pointerInfo, intptr_t userData) { + if (pointerInfo.state == CLAY_POINTER_INFO_PRESSED_THIS_FRAME) { + // Do some click handling + } +} + // Examples of re-usable "Components" -void RenderHeaderButton(uint16_t index, Clay_String text) { - Clay_ElementId buttonId = CLAY_IDI("HeaderButton", index); - CLAY_RECTANGLE(buttonId, CLAY_LAYOUT(.padding = {16, 8}), CLAY_RECTANGLE_CONFIG(.color = Clay_PointerOver(buttonId) ? COLOR_BLUE : COLOR_ORANGE)) { - CLAY_TEXT(CLAY_IDI("Button", index), text, &headerTextConfig); +void RenderHeaderButton(Clay_String text) { + CLAY(CLAY_LAYOUT({ .padding = {16, 8} }), + CLAY_RECTANGLE({ .color = Clay_Hovered() ? COLOR_BLUE : COLOR_ORANGE }), + Clay_OnHover(HandleHeaderButtonInteraction, 1)) { + CLAY_TEXT(text, CLAY_TEXT_CONFIG(headerTextConfig)); } } @@ -26,93 +33,104 @@ Clay_RectangleElementConfig dropdownRectangleConfig = (Clay_RectangleElementConf Clay_TextElementConfig dropdownTextElementConfig = (Clay_TextElementConfig) { .fontSize = 24, .textColor = {255,255,255,255} }; void RenderDropdownTextItem(int index) { - CLAY_RECTANGLE(CLAY_IDI("ScrollContainerItem", index), &dropdownTextItemLayout, &dropdownRectangleConfig) { // We can save a lot of memory by re-using configs in loops rather than redefining them - CLAY_TEXT(CLAY_IDI("ScrollContainerText", index), CLAY_STRING("I'm a text field in a scroll container."), &dropdownTextElementConfig); + CLAY(CLAY_IDI("ScrollContainerItem", index), CLAY_LAYOUT(dropdownTextItemLayout), CLAY_RECTANGLE(dropdownRectangleConfig)) { + CLAY_TEXT(CLAY_STRING("I'm a text field in a scroll container."), &dropdownTextElementConfig); } } Clay_RenderCommandArray CreateLayout() { Clay_BeginLayout(); - CLAY_RECTANGLE(CLAY_ID("OuterContainer"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_GROW() }, .padding = { 16, 16 }, .childGap = 16), CLAY_RECTANGLE_CONFIG(.color = {200, 200, 200, 255})) { - CLAY_RECTANGLE(CLAY_ID("SideBar"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_FIXED(300), .height = CLAY_SIZING_GROW() }, .padding = {16, 16}, .childGap = 16), CLAY_RECTANGLE_CONFIG(.color = {150, 150, 255, 255})) { - CLAY_RECTANGLE(CLAY_ID("ProfilePictureOuter"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW() }, .padding = { 8, 8 }, .childGap = 8, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER }), CLAY_RECTANGLE_CONFIG(.color = {130, 130, 255, 255})) { - CLAY_IMAGE(CLAY_ID("ProfilePicture"), CLAY_LAYOUT( .sizing = { .width = CLAY_SIZING_FIXED(60), .height = CLAY_SIZING_FIXED(60) }), CLAY_IMAGE_CONFIG(.imageData = &profilePicture, .sourceDimensions = {60, 60})) {} - CLAY_TEXT(CLAY_ID("ProfileTitle"), profileText, CLAY_TEXT_CONFIG(.fontSize = 24, .textColor = {0, 0, 0, 255})); + CLAY(CLAY_ID("OuterContainer"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_GROW() }, .padding = { 16, 16 }, .childGap = 16 }), CLAY_RECTANGLE({ .color = {200, 200, 200, 255} })) { + CLAY(CLAY_ID("SideBar"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_FIXED(300), .height = CLAY_SIZING_GROW() }, .padding = {16, 16}, .childGap = 16 }), CLAY_RECTANGLE({ .color = {150, 150, 255, 255} })) { + CLAY(CLAY_ID("ProfilePictureOuter"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW() }, .padding = { 8, 8 }, .childGap = 8, .childAlignment = { .y = CLAY_ALIGN_Y_CENTER } }), CLAY_RECTANGLE({ .color = {130, 130, 255, 255} })) { + CLAY(CLAY_ID("ProfilePicture"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_FIXED(60), .height = CLAY_SIZING_FIXED(60) } }), CLAY_IMAGE({ .imageData = &profilePicture, .sourceDimensions = {60, 60} })) {} + CLAY_TEXT(profileText, CLAY_TEXT_CONFIG({ .fontSize = 24, .textColor = {0, 0, 0, 255} })); } - CLAY_RECTANGLE(CLAY_ID("SidebarBlob1"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(50) }), CLAY_RECTANGLE_CONFIG(.color = {110, 110, 255, 255})) {} - CLAY_RECTANGLE(CLAY_ID("SidebarBlob2"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(50) }), CLAY_RECTANGLE_CONFIG(.color = {110, 110, 255, 255})) {} - CLAY_RECTANGLE(CLAY_ID("SidebarBlob3"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(50) }), CLAY_RECTANGLE_CONFIG(.color = {110, 110, 255, 255})) {} - CLAY_RECTANGLE(CLAY_ID("SidebarBlob4"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(50) }), CLAY_RECTANGLE_CONFIG(.color = {110, 110, 255, 255})) {} + CLAY(CLAY_ID("SidebarBlob1"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(50) }}), CLAY_RECTANGLE({ .color = {110, 110, 255, 255} })) {} + CLAY(CLAY_ID("SidebarBlob2"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(50) }}), CLAY_RECTANGLE({ .color = {110, 110, 255, 255} })) {} + CLAY(CLAY_ID("SidebarBlob3"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(50) }}), CLAY_RECTANGLE({ .color = {110, 110, 255, 255} })) {} + CLAY(CLAY_ID("SidebarBlob4"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_FIXED(50) }}), CLAY_RECTANGLE({ .color = {110, 110, 255, 255} })) {} } // - CLAY_CONTAINER(CLAY_ID("RightPanel"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_GROW() }, .childGap = 16)) { - CLAY_RECTANGLE(CLAY_ID("HeaderBar"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW() }, .childAlignment = { .x = CLAY_ALIGN_X_RIGHT }, .padding = {8, 8}, .childGap = 8), CLAY_RECTANGLE_CONFIG(.color = {180, 180, 180, 255})) { - RenderHeaderButton(1, CLAY_STRING("Header Item 1")); - RenderHeaderButton(2, CLAY_STRING("Header Item 2")); - RenderHeaderButton(3, CLAY_STRING("Header Item 3")); + CLAY(CLAY_ID("RightPanel"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_GROW() }, .childGap = 16 })) { + CLAY(CLAY_ID("HeaderBar"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW() }, .childAlignment = { .x = CLAY_ALIGN_X_RIGHT }, .padding = {8, 8}, .childGap = 8 }), CLAY_RECTANGLE({ .color = {180, 180, 180, 255} })) { + RenderHeaderButton(CLAY_STRING("Header Item 1")); + RenderHeaderButton(CLAY_STRING("Header Item 2")); + RenderHeaderButton(CLAY_STRING("Header Item 3")); } - CLAY_SCROLL_CONTAINER(CLAY_ID("MainContent"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW(), .height = CLAY_SIZING_GROW() }), CLAY_SCROLL_CONFIG(.vertical = true)) { - CLAY_RECTANGLE(CLAY_ID("MainContentInner"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .padding = {16, 16}, .childGap = 16), CLAY_RECTANGLE_CONFIG(.color = {200, 200, 255, 255})) { - CLAY_FLOATING_CONTAINER(CLAY_ID("FloatingContainer"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_FIXED(300), .height = CLAY_SIZING_FIXED(300) }), CLAY_FLOATING_CONFIG(.zIndex = 1, .attachment = { CLAY_ATTACH_POINT_CENTER_TOP, CLAY_ATTACH_POINT_CENTER_TOP }, .offset = {0, -16})) { - CLAY_BORDER_CONTAINER(CLAY_ID("FloatingContainerBorder"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, .padding = { 16, 16 }), CLAY_BORDER_CONFIG_OUTSIDE(.color = {80, 80, 80, 255}, .width = 2)) { - CLAY_RECTANGLE(CLAY_ID("FloatingContainerBackground"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }), CLAY_RECTANGLE_CONFIG(.color = {140,80, 200, 200})) { - CLAY_TEXT(CLAY_ID("FloatingContainerText"), CLAY_STRING("I'm an inline floating container."), CLAY_TEXT_CONFIG(.fontSize = 24, .textColor = {255,255,255,255})); - } - } - } - - CLAY_TEXT(CLAY_ID("BodyText1"), - CLAY_STRING("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt."), - CLAY_TEXT_CONFIG(.fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {0,0,0,255})); - - CLAY_RECTANGLE(CLAY_ID("Photos2"), CLAY_LAYOUT(.childGap = 16, .padding = { 16, 16 }), CLAY_RECTANGLE_CONFIG(.color = {180, 180, 220, 255})) { - CLAY_IMAGE(CLAY_ID("Picture4"), CLAY_LAYOUT( .sizing = { .width = CLAY_SIZING_FIXED(120), .height = CLAY_SIZING_FIXED(120) }), CLAY_IMAGE_CONFIG(.imageData = &profilePicture, .sourceDimensions = {120, 120})) {} - CLAY_IMAGE(CLAY_ID("Picture5"), CLAY_LAYOUT( .sizing = { .width = CLAY_SIZING_FIXED(120), .height = CLAY_SIZING_FIXED(120) }), CLAY_IMAGE_CONFIG(.imageData = &profilePicture, .sourceDimensions = {120, 120})) {} - CLAY_IMAGE(CLAY_ID("Picture6"), CLAY_LAYOUT( .sizing = { .width = CLAY_SIZING_FIXED(120), .height = CLAY_SIZING_FIXED(120) }), CLAY_IMAGE_CONFIG(.imageData = &profilePicture, .sourceDimensions = {120, 120})) {} - } - - CLAY_TEXT(CLAY_ID("BodyText2"), - CLAY_STRING("Faucibus purus in massa tempor nec. Nec ullamcorper sit amet risus nullam eget felis eget nunc. Diam vulputate ut pharetra sit amet aliquam id diam. Lacus suspendisse faucibus interdum posuere lorem. A diam sollicitudin tempor id. Amet massa vitae tortor condimentum lacinia. Aliquet nibh praesent tristique magna."), - CLAY_TEXT_CONFIG(.fontSize = 24, .lineHeight = 60, .textColor = {0,0,0,255})); - - CLAY_TEXT(CLAY_ID("BodyText3"), - CLAY_STRING("Suspendisse in est ante in nibh. Amet venenatis urna cursus eget nunc scelerisque viverra. Elementum sagittis vitae et leo duis ut diam quam nulla. Enim nulla aliquet porttitor lacus. Pellentesque habitant morbi tristique senectus et. Facilisi nullam vehicula ipsum a arcu cursus vitae.\nSem fringilla ut morbi tincidunt. Euismod quis viverra nibh cras pulvinar mattis nunc sed. Velit sed ullamcorper morbi tincidunt ornare massa. Varius quam quisque id diam vel quam. Nulla pellentesque dignissim enim sit amet venenatis. Enim lobortis scelerisque fermentum dui faucibus in. Pretium viverra suspendisse potenti nullam ac tortor vitae. Lectus vestibulum mattis ullamcorper velit sed. Eget mauris pharetra et ultrices neque ornare aenean euismod elementum. Habitant morbi tristique senectus et. Integer vitae justo eget magna fermentum iaculis eu. Semper quis lectus nulla at volutpat diam. Enim praesent elementum facilisis leo. Massa vitae tortor condimentum lacinia quis vel."), - CLAY_TEXT_CONFIG(.fontSize = 24, .textColor = {0,0,0,255})); - - CLAY_RECTANGLE(CLAY_ID("Photos"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_GROW() }, .childAlignment = { .x = CLAY_ALIGN_X_CENTER, .y = CLAY_ALIGN_Y_CENTER }, .childGap = 16, .padding = {16, 16}), CLAY_RECTANGLE_CONFIG(.color = {180, 180, 220, 255})) { - CLAY_IMAGE(CLAY_ID("Picture2"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_FIXED(120), .height = CLAY_SIZING_FIXED(120) }), CLAY_IMAGE_CONFIG(.imageData = &profilePicture, .sourceDimensions = {120, 120})) {} - CLAY_RECTANGLE(CLAY_ID("Picture1"), CLAY_LAYOUT(.childAlignment = { .x = CLAY_ALIGN_X_CENTER }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .padding = {8, 8}), CLAY_RECTANGLE_CONFIG(.color = {170, 170, 220, 255})) { - CLAY_IMAGE(CLAY_ID("ProfilePicture2"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_FIXED(60), .height = CLAY_SIZING_FIXED(60) }), CLAY_IMAGE_CONFIG(.imageData = &profilePicture, .sourceDimensions = {60, 60})) {} - CLAY_TEXT(CLAY_ID("ProfileTitle2"), CLAY_STRING("Image caption below"), CLAY_TEXT_CONFIG(.fontSize = 24, .textColor = {0,0,0,255})); - } - CLAY_IMAGE(CLAY_ID("Picture3"), CLAY_LAYOUT( .sizing = { .width = CLAY_SIZING_FIXED(120), .height = CLAY_SIZING_FIXED(120) }), CLAY_IMAGE_CONFIG(.imageData = &profilePicture, .sourceDimensions = {120, 120})) {} - } -// - CLAY_TEXT(CLAY_ID("BodyText4"), - CLAY_STRING("Amet cursus sit amet dictum sit amet justo donec. Et malesuada fames ac turpis egestas maecenas. A lacus vestibulum sed arcu non odio euismod lacinia. Gravida neque convallis a cras. Dui nunc mattis enim ut tellus elementum sagittis vitae et. Orci sagittis eu volutpat odio facilisis mauris. Neque gravida in fermentum et sollicitudin ac orci. Ultrices dui sapien eget mi proin sed libero. Euismod quis viverra nibh cras pulvinar mattis. Diam volutpat commodo sed egestas egestas. In fermentum posuere urna nec tincidunt praesent semper. Integer eget aliquet nibh praesent tristique magna.\nId cursus metus aliquam eleifend mi in. Sed pulvinar proin gravida hendrerit lectus a. Etiam tempor orci eu lobortis elementum nibh tellus. Nullam vehicula ipsum a arcu cursus vitae. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Condimentum lacinia quis vel eros donec ac odio. Mattis pellentesque id nibh tortor id aliquet lectus. Turpis egestas integer eget aliquet nibh praesent tristique. Porttitor massa id neque aliquam vestibulum morbi. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien et. Nunc scelerisque viverra mauris in aliquam sem fringilla. Suspendisse ultrices gravida dictum fusce ut placerat orci nulla.\nLacus laoreet non curabitur gravida arcu ac tortor dignissim. Urna nec tincidunt praesent semper feugiat nibh sed pulvinar. Tristique senectus et netus et malesuada fames ac. Nunc aliquet bibendum enim facilisis gravida. Egestas maecenas pharetra convallis posuere morbi leo urna molestie. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Ac turpis egestas maecenas pharetra convallis posuere morbi leo urna. Viverra vitae congue eu consequat. Aliquet enim tortor at auctor urna. Ornare massa eget egestas purus viverra accumsan in nisl nisi. Elit pellentesque habitant morbi tristique senectus et netus et malesuada.\nSuspendisse ultrices gravida dictum fusce ut placerat orci nulla pellentesque. Lobortis feugiat vivamus at augue eget arcu. Vitae justo eget magna fermentum iaculis eu. Gravida rutrum quisque non tellus orci. Ipsum faucibus vitae aliquet nec. Nullam non nisi est sit amet. Nunc consequat interdum varius sit amet mattis vulputate enim. Sem fringilla ut morbi tincidunt augue interdum. Vitae purus faucibus ornare suspendisse. Massa tincidunt nunc pulvinar sapien et. Fringilla ut morbi tincidunt augue interdum velit euismod in. Donec massa sapien faucibus et. Est placerat in egestas erat imperdiet. Gravida rutrum quisque non tellus. Morbi non arcu risus quis varius quam quisque id diam. Habitant morbi tristique senectus et netus et malesuada fames ac. Eget lorem dolor sed viverra.\nOrnare massa eget egestas purus viverra. Varius vel pharetra vel turpis nunc eget lorem. Consectetur purus ut faucibus pulvinar elementum. Placerat in egestas erat imperdiet sed euismod nisi. Interdum velit euismod in pellentesque massa placerat duis ultricies lacus. Aliquam nulla facilisi cras fermentum odio eu. Est pellentesque elit ullamcorper dignissim cras tincidunt. Nunc sed id semper risus in hendrerit gravida rutrum. A pellentesque sit amet porttitor eget dolor morbi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper. Sed id semper risus in hendrerit gravida. Tincidunt praesent semper feugiat nibh. Aliquet lectus proin nibh nisl condimentum id venenatis a. Enim sit amet venenatis urna cursus eget. In egestas erat imperdiet sed euismod nisi porta lorem mollis. Lacinia quis vel eros donec ac odio tempor orci. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Erat pellentesque adipiscing commodo elit at.\nEgestas sed sed risus pretium quam vulputate. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Aliquam malesuada bibendum arcu vitae elementum. Congue mauris rhoncus aenean vel elit scelerisque mauris. Pellentesque dignissim enim sit amet venenatis urna cursus. Et malesuada fames ac turpis egestas sed tempus urna. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Nibh cras pulvinar mattis nunc sed blandit libero. Fringilla est ullamcorper eget nulla facilisi etiam dignissim. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. Mauris pharetra et ultrices neque ornare aenean euismod elementum. Ornare quam viverra orci sagittis eu. Odio ut sem nulla pharetra diam sit amet nisl suscipit. Ornare lectus sit amet est. Ullamcorper sit amet risus nullam eget. Tincidunt lobortis feugiat vivamus at augue eget arcu dictum.\nUrna nec tincidunt praesent semper feugiat nibh. Ut venenatis tellus in metus vulputate eu scelerisque felis. Cursus risus at ultrices mi tempus. In pellentesque massa placerat duis ultricies lacus sed turpis. Platea dictumst quisque sagittis purus. Cras adipiscing enim eu turpis egestas. Egestas sed tempus urna et pharetra pharetra. Netus et malesuada fames ac turpis egestas integer eget aliquet. Ac turpis egestas sed tempus. Sed lectus vestibulum mattis ullamcorper velit sed. Ante metus dictum at tempor commodo ullamcorper a. Augue neque gravida in fermentum et sollicitudin ac. Praesent semper feugiat nibh sed pulvinar proin gravida. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Neque gravida in fermentum et sollicitudin ac orci phasellus egestas.\nRidiculus mus mauris vitae ultricies. Morbi quis commodo odio aenean. Duis ultricies lacus sed turpis. Non pulvinar neque laoreet suspendisse interdum consectetur. Scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Volutpat est velit egestas dui id ornare arcu odio ut. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus est. Vestibulum lectus mauris ultrices eros. Sed blandit libero volutpat sed cras ornare. Id leo in vitae turpis massa sed elementum tempus. Gravida dictum fusce ut placerat orci nulla pellentesque. Pretium quam vulputate dignissim suspendisse in. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor. Risus viverra adipiscing at in tellus. Turpis nunc eget lorem dolor sed viverra ipsum. Senectus et netus et malesuada fames ac. Habitasse platea dictumst vestibulum rhoncus est. Nunc sed id semper risus in hendrerit gravida. Felis eget velit aliquet sagittis id. Eget felis eget nunc lobortis.\nMaecenas pharetra convallis posuere morbi leo. Maecenas volutpat blandit aliquam etiam. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Pulvinar mattis nunc sed blandit libero volutpat sed. Feugiat in ante metus dictum at tempor commodo ullamcorper. Vel pharetra vel turpis nunc eget lorem dolor. Est placerat in egestas erat imperdiet sed euismod. Quisque non tellus orci ac auctor augue mauris augue. Placerat vestibulum lectus mauris ultrices eros in cursus turpis. Enim nunc faucibus a pellentesque sit. Adipiscing vitae proin sagittis nisl. Iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Aliquam sem fringilla ut morbi.\nArcu odio ut sem nulla pharetra diam sit amet nisl. Non diam phasellus vestibulum lorem sed. At erat pellentesque adipiscing commodo elit at. Lacus luctus accumsan tortor posuere ac ut consequat. Et malesuada fames ac turpis egestas integer. Tristique magna sit amet purus. A condimentum vitae sapien pellentesque habitant. Quis varius quam quisque id diam vel quam. Est ullamcorper eget nulla facilisi etiam dignissim diam quis. Augue interdum velit euismod in pellentesque massa. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant. Vulputate eu scelerisque felis imperdiet. Nibh tellus molestie nunc non blandit massa. Velit euismod in pellentesque massa placerat. Sed cras ornare arcu dui. Ut sem viverra aliquet eget sit. Eu lobortis elementum nibh tellus molestie nunc non. Blandit libero volutpat sed cras ornare arcu dui vivamus.\nSit amet aliquam id diam maecenas. Amet risus nullam eget felis eget nunc lobortis mattis aliquam. Magna sit amet purus gravida. Egestas purus viverra accumsan in nisl nisi. Leo duis ut diam quam. Ante metus dictum at tempor commodo ullamcorper. Ac turpis egestas integer eget. Fames ac turpis egestas integer eget aliquet nibh. Sem integer vitae justo eget magna fermentum. Semper auctor neque vitae tempus quam pellentesque nec nam aliquam. Vestibulum mattis ullamcorper velit sed. Consectetur adipiscing elit duis tristique sollicitudin nibh. Massa id neque aliquam vestibulum morbi blandit cursus risus.\nCursus sit amet dictum sit amet justo donec enim diam. Egestas erat imperdiet sed euismod. Nullam vehicula ipsum a arcu cursus vitae congue mauris. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Duis ultricies lacus sed turpis tincidunt id aliquet risus feugiat. Faucibus ornare suspendisse sed nisi lacus sed viverra. Pretium fusce id velit ut tortor pretium viverra. Fermentum odio eu feugiat pretium nibh ipsum consequat nisl vel. Senectus et netus et malesuada. Tellus pellentesque eu tincidunt tortor aliquam. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Quis vel eros donec ac odio. Id interdum velit laoreet id donec ultrices tincidunt.\nMassa id neque aliquam vestibulum morbi blandit cursus risus at. Enim tortor at auctor urna nunc id cursus metus. Lorem ipsum dolor sit amet consectetur. At quis risus sed vulputate odio. Facilisis mauris sit amet massa vitae tortor condimentum lacinia quis. Et malesuada fames ac turpis egestas maecenas. Bibendum arcu vitae elementum curabitur vitae nunc sed velit dignissim. Viverra orci sagittis eu volutpat odio facilisis mauris. Adipiscing bibendum est ultricies integer quis auctor elit sed. Neque viverra justo nec ultrices dui sapien. Elementum nibh tellus molestie nunc non blandit massa enim. Euismod elementum nisi quis eleifend quam adipiscing vitae proin sagittis. Faucibus ornare suspendisse sed nisi. Quis viverra nibh cras pulvinar mattis nunc sed blandit. Tristique senectus et netus et. Magnis dis parturient montes nascetur ridiculus mus.\nDolor magna eget est lorem ipsum dolor. Nibh sit amet commodo nulla. Donec pretium vulputate sapien nec sagittis aliquam malesuada. Cras adipiscing enim eu turpis egestas pretium. Cras ornare arcu dui vivamus arcu felis bibendum ut tristique. Mus mauris vitae ultricies leo integer. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Quis hendrerit dolor magna eget. Nisl tincidunt eget nullam non. Vitae congue eu consequat ac felis donec et odio. Vivamus at augue eget arcu dictum varius duis at. Ornare quam viverra orci sagittis.\nErat nam at lectus urna duis convallis. Massa placerat duis ultricies lacus sed turpis tincidunt id aliquet. Est ullamcorper eget nulla facilisi etiam dignissim diam. Arcu vitae elementum curabitur vitae nunc sed velit dignissim sodales. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Neque viverra justo nec ultrices dui sapien eget mi proin. Viverra accumsan in nisl nisi scelerisque eu ultrices. Consequat interdum varius sit amet mattis. In aliquam sem fringilla ut morbi. Eget arcu dictum varius duis at. Nulla aliquet porttitor lacus luctus accumsan tortor posuere. Arcu bibendum at varius vel pharetra vel turpis. Hac habitasse platea dictumst quisque sagittis purus sit amet. Sapien eget mi proin sed libero enim sed. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Semper viverra nam libero justo. Fusce ut placerat orci nulla pellentesque dignissim enim sit amet. Et malesuada fames ac turpis egestas maecenas pharetra convallis posuere.\nTurpis egestas sed tempus urna et pharetra pharetra massa. Gravida in fermentum et sollicitudin ac orci phasellus. Ornare suspendisse sed nisi lacus sed viverra tellus in. Fames ac turpis egestas maecenas pharetra convallis posuere. Mi proin sed libero enim sed faucibus turpis. Sit amet mauris commodo quis imperdiet massa tincidunt nunc. Ut etiam sit amet nisl purus in mollis nunc. Habitasse platea dictumst quisque sagittis purus sit amet volutpat consequat. Eget aliquet nibh praesent tristique magna. Sit amet est placerat in egestas erat. Commodo sed egestas egestas fringilla. Enim nulla aliquet porttitor lacus luctus accumsan tortor posuere ac. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Dignissim convallis aenean et tortor at risus viverra. Morbi blandit cursus risus at ultrices mi. Ac turpis egestas integer eget aliquet nibh praesent tristique magna.\nVolutpat sed cras ornare arcu dui. Egestas erat imperdiet sed euismod nisi porta lorem mollis aliquam. Viverra justo nec ultrices dui sapien. Amet risus nullam eget felis eget nunc lobortis. Metus aliquam eleifend mi in. Ut eu sem integer vitae. Auctor elit sed vulputate mi sit amet. Nisl nisi scelerisque eu ultrices. Dictum fusce ut placerat orci nulla. Pellentesque habitant morbi tristique senectus et. Auctor elit sed vulputate mi sit. Tincidunt arcu non sodales neque. Mi in nulla posuere sollicitudin aliquam. Morbi non arcu risus quis varius quam quisque id diam. Cras adipiscing enim eu turpis egestas pretium aenean pharetra magna. At auctor urna nunc id cursus metus aliquam. Mauris a diam maecenas sed enim ut sem viverra. Nunc scelerisque viverra mauris in. In iaculis nunc sed augue lacus viverra vitae congue eu. Volutpat blandit aliquam etiam erat velit scelerisque in dictum non."), - CLAY_TEXT_CONFIG(.fontSize = 24, .textColor = {0,0,0,255})); + CLAY(CLAY_ID("MainContent"), + CLAY_SCROLL({ .vertical = true }), + CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM, .padding = {16, 16}, .childGap = 16, .sizing = { CLAY_SIZING_GROW() } }), + CLAY_RECTANGLE({ .color = {200, 200, 255, 255} })) + { + CLAY(CLAY_ID("FloatingContainer"), + CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_FIXED(300), .height = CLAY_SIZING_FIXED(300) }, .padding = { 16, 16 }}), + CLAY_FLOATING({ .zIndex = 1, .attachment = { CLAY_ATTACH_POINT_CENTER_TOP, CLAY_ATTACH_POINT_CENTER_TOP }, .offset = {0, -16} }), + CLAY_BORDER_OUTSIDE({ .color = {80, 80, 80, 255}, .width = 2 }), + CLAY_RECTANGLE({ .color = {140,80, 200, 200 }}) + ) { + CLAY_TEXT(CLAY_STRING("I'm an inline floating container."), CLAY_TEXT_CONFIG({ .fontSize = 24, .textColor = {255,255,255,255} })); } + + CLAY_TEXT(CLAY_STRING("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt."), + CLAY_TEXT_CONFIG({ .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {0,0,0,255} })); + + CLAY(CLAY_ID("Photos2"), CLAY_LAYOUT({ .childGap = 16, .padding = { 16, 16 }}), CLAY_RECTANGLE({ .color = {180, 180, 220, 255} })) { + CLAY(CLAY_ID("Picture4"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_FIXED(120), .height = CLAY_SIZING_FIXED(120) }}), CLAY_IMAGE({ .imageData = &profilePicture, .sourceDimensions = {120, 120} })) {} + CLAY(CLAY_ID("Picture5"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_FIXED(120), .height = CLAY_SIZING_FIXED(120) }}), CLAY_IMAGE({ .imageData = &profilePicture, .sourceDimensions = {120, 120} })) {} + CLAY(CLAY_ID("Picture6"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_FIXED(120), .height = CLAY_SIZING_FIXED(120) }}), CLAY_IMAGE({ .imageData = &profilePicture, .sourceDimensions = {120, 120} })) {} + } + + CLAY_TEXT(CLAY_STRING("Faucibus purus in massa tempor nec. Nec ullamcorper sit amet risus nullam eget felis eget nunc. Diam vulputate ut pharetra sit amet aliquam id diam. Lacus suspendisse faucibus interdum posuere lorem. A diam sollicitudin tempor id. Amet massa vitae tortor condimentum lacinia. Aliquet nibh praesent tristique magna."), + CLAY_TEXT_CONFIG({ .fontSize = 24, .lineHeight = 60, .textColor = {0,0,0,255} })); + + CLAY_TEXT(CLAY_STRING("Suspendisse in est ante in nibh. Amet venenatis urna cursus eget nunc scelerisque viverra. Elementum sagittis vitae et leo duis ut diam quam nulla. Enim nulla aliquet porttitor lacus. Pellentesque habitant morbi tristique senectus et. Facilisi nullam vehicula ipsum a arcu cursus vitae.\nSem fringilla ut morbi tincidunt. Euismod quis viverra nibh cras pulvinar mattis nunc sed. Velit sed ullamcorper morbi tincidunt ornare massa. Varius quam quisque id diam vel quam. Nulla pellentesque dignissim enim sit amet venenatis. Enim lobortis scelerisque fermentum dui faucibus in. Pretium viverra suspendisse potenti nullam ac tortor vitae. Lectus vestibulum mattis ullamcorper velit sed. Eget mauris pharetra et ultrices neque ornare aenean euismod elementum. Habitant morbi tristique senectus et. Integer vitae justo eget magna fermentum iaculis eu. Semper quis lectus nulla at volutpat diam. Enim praesent elementum facilisis leo. Massa vitae tortor condimentum lacinia quis vel."), + CLAY_TEXT_CONFIG({ .fontSize = 24, .textColor = {0,0,0,255} })); + + CLAY(CLAY_ID("Photos"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_GROW() }, .childAlignment = { .x = CLAY_ALIGN_X_CENTER, .y = CLAY_ALIGN_Y_CENTER }, .childGap = 16, .padding = {16, 16} }), CLAY_RECTANGLE({ .color = {180, 180, 220, 255} })) { + CLAY(CLAY_ID("Picture2"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_FIXED(120), .height = CLAY_SIZING_FIXED(120) }}), CLAY_IMAGE({ .imageData = &profilePicture, .sourceDimensions = {120, 120} })) {} + CLAY(CLAY_ID("Picture1"), CLAY_LAYOUT({ .childAlignment = { .x = CLAY_ALIGN_X_CENTER }, .layoutDirection = CLAY_TOP_TO_BOTTOM, .padding = {8, 8} }), CLAY_RECTANGLE({ .color = {170, 170, 220, 255} })) { + CLAY(CLAY_ID("ProfilePicture2"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_FIXED(60), .height = CLAY_SIZING_FIXED(60) }}), CLAY_IMAGE({ .imageData = &profilePicture, .sourceDimensions = {60, 60} })) {} + CLAY_TEXT(CLAY_STRING("Image caption below"), CLAY_TEXT_CONFIG({ .fontSize = 24, .textColor = {0,0,0,255} })); + } + CLAY(CLAY_ID("Picture3"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_FIXED(120), .height = CLAY_SIZING_FIXED(120) }}), CLAY_IMAGE({ .imageData = &profilePicture, .sourceDimensions = {120, 120} })) {} + } + + CLAY_TEXT(CLAY_STRING("Amet cursus sit amet dictum sit amet justo donec. Et malesuada fames ac turpis egestas maecenas. A lacus vestibulum sed arcu non odio euismod lacinia. Gravida neque convallis a cras. Dui nunc mattis enim ut tellus elementum sagittis vitae et. Orci sagittis eu volutpat odio facilisis mauris. Neque gravida in fermentum et sollicitudin ac orci. Ultrices dui sapien eget mi proin sed libero. Euismod quis viverra nibh cras pulvinar mattis. Diam volutpat commodo sed egestas egestas. In fermentum posuere urna nec tincidunt praesent semper. Integer eget aliquet nibh praesent tristique magna.\nId cursus metus aliquam eleifend mi in. Sed pulvinar proin gravida hendrerit lectus a. Etiam tempor orci eu lobortis elementum nibh tellus. Nullam vehicula ipsum a arcu cursus vitae. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Condimentum lacinia quis vel eros donec ac odio. Mattis pellentesque id nibh tortor id aliquet lectus. Turpis egestas integer eget aliquet nibh praesent tristique. Porttitor massa id neque aliquam vestibulum morbi. Mauris commodo quis imperdiet massa tincidunt nunc pulvinar sapien et. Nunc scelerisque viverra mauris in aliquam sem fringilla. Suspendisse ultrices gravida dictum fusce ut placerat orci nulla.\nLacus laoreet non curabitur gravida arcu ac tortor dignissim. Urna nec tincidunt praesent semper feugiat nibh sed pulvinar. Tristique senectus et netus et malesuada fames ac. Nunc aliquet bibendum enim facilisis gravida. Egestas maecenas pharetra convallis posuere morbi leo urna molestie. Sapien nec sagittis aliquam malesuada bibendum arcu vitae elementum curabitur. Ac turpis egestas maecenas pharetra convallis posuere morbi leo urna. Viverra vitae congue eu consequat. Aliquet enim tortor at auctor urna. Ornare massa eget egestas purus viverra accumsan in nisl nisi. Elit pellentesque habitant morbi tristique senectus et netus et malesuada.\nSuspendisse ultrices gravida dictum fusce ut placerat orci nulla pellentesque. Lobortis feugiat vivamus at augue eget arcu. Vitae justo eget magna fermentum iaculis eu. Gravida rutrum quisque non tellus orci. Ipsum faucibus vitae aliquet nec. Nullam non nisi est sit amet. Nunc consequat interdum varius sit amet mattis vulputate enim. Sem fringilla ut morbi tincidunt augue interdum. Vitae purus faucibus ornare suspendisse. Massa tincidunt nunc pulvinar sapien et. Fringilla ut morbi tincidunt augue interdum velit euismod in. Donec massa sapien faucibus et. Est placerat in egestas erat imperdiet. Gravida rutrum quisque non tellus. Morbi non arcu risus quis varius quam quisque id diam. Habitant morbi tristique senectus et netus et malesuada fames ac. Eget lorem dolor sed viverra.\nOrnare massa eget egestas purus viverra. Varius vel pharetra vel turpis nunc eget lorem. Consectetur purus ut faucibus pulvinar elementum. Placerat in egestas erat imperdiet sed euismod nisi. Interdum velit euismod in pellentesque massa placerat duis ultricies lacus. Aliquam nulla facilisi cras fermentum odio eu. Est pellentesque elit ullamcorper dignissim cras tincidunt. Nunc sed id semper risus in hendrerit gravida rutrum. A pellentesque sit amet porttitor eget dolor morbi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper. Sed id semper risus in hendrerit gravida. Tincidunt praesent semper feugiat nibh. Aliquet lectus proin nibh nisl condimentum id venenatis a. Enim sit amet venenatis urna cursus eget. In egestas erat imperdiet sed euismod nisi porta lorem mollis. Lacinia quis vel eros donec ac odio tempor orci. Donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Erat pellentesque adipiscing commodo elit at.\nEgestas sed sed risus pretium quam vulputate. Vitae congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Aliquam malesuada bibendum arcu vitae elementum. Congue mauris rhoncus aenean vel elit scelerisque mauris. Pellentesque dignissim enim sit amet venenatis urna cursus. Et malesuada fames ac turpis egestas sed tempus urna. Vel fringilla est ullamcorper eget nulla facilisi etiam dignissim. Nibh cras pulvinar mattis nunc sed blandit libero. Fringilla est ullamcorper eget nulla facilisi etiam dignissim. Aenean euismod elementum nisi quis eleifend quam adipiscing vitae proin. Mauris pharetra et ultrices neque ornare aenean euismod elementum. Ornare quam viverra orci sagittis eu. Odio ut sem nulla pharetra diam sit amet nisl suscipit. Ornare lectus sit amet est. Ullamcorper sit amet risus nullam eget. Tincidunt lobortis feugiat vivamus at augue eget arcu dictum.\nUrna nec tincidunt praesent semper feugiat nibh. Ut venenatis tellus in metus vulputate eu scelerisque felis. Cursus risus at ultrices mi tempus. In pellentesque massa placerat duis ultricies lacus sed turpis. Platea dictumst quisque sagittis purus. Cras adipiscing enim eu turpis egestas. Egestas sed tempus urna et pharetra pharetra. Netus et malesuada fames ac turpis egestas integer eget aliquet. Ac turpis egestas sed tempus. Sed lectus vestibulum mattis ullamcorper velit sed. Ante metus dictum at tempor commodo ullamcorper a. Augue neque gravida in fermentum et sollicitudin ac. Praesent semper feugiat nibh sed pulvinar proin gravida. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Neque gravida in fermentum et sollicitudin ac orci phasellus egestas.\nRidiculus mus mauris vitae ultricies. Morbi quis commodo odio aenean. Duis ultricies lacus sed turpis. Non pulvinar neque laoreet suspendisse interdum consectetur. Scelerisque eleifend donec pretium vulputate sapien nec sagittis aliquam. Volutpat est velit egestas dui id ornare arcu odio ut. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus est. Vestibulum lectus mauris ultrices eros. Sed blandit libero volutpat sed cras ornare. Id leo in vitae turpis massa sed elementum tempus. Gravida dictum fusce ut placerat orci nulla pellentesque. Pretium quam vulputate dignissim suspendisse in. Nisl suscipit adipiscing bibendum est ultricies integer quis auctor. Risus viverra adipiscing at in tellus. Turpis nunc eget lorem dolor sed viverra ipsum. Senectus et netus et malesuada fames ac. Habitasse platea dictumst vestibulum rhoncus est. Nunc sed id semper risus in hendrerit gravida. Felis eget velit aliquet sagittis id. Eget felis eget nunc lobortis.\nMaecenas pharetra convallis posuere morbi leo. Maecenas volutpat blandit aliquam etiam. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Pulvinar mattis nunc sed blandit libero volutpat sed. Feugiat in ante metus dictum at tempor commodo ullamcorper. Vel pharetra vel turpis nunc eget lorem dolor. Est placerat in egestas erat imperdiet sed euismod. Quisque non tellus orci ac auctor augue mauris augue. Placerat vestibulum lectus mauris ultrices eros in cursus turpis. Enim nunc faucibus a pellentesque sit. Adipiscing vitae proin sagittis nisl. Iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Aliquam sem fringilla ut morbi.\nArcu odio ut sem nulla pharetra diam sit amet nisl. Non diam phasellus vestibulum lorem sed. At erat pellentesque adipiscing commodo elit at. Lacus luctus accumsan tortor posuere ac ut consequat. Et malesuada fames ac turpis egestas integer. Tristique magna sit amet purus. A condimentum vitae sapien pellentesque habitant. Quis varius quam quisque id diam vel quam. Est ullamcorper eget nulla facilisi etiam dignissim diam quis. Augue interdum velit euismod in pellentesque massa. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant. Vulputate eu scelerisque felis imperdiet. Nibh tellus molestie nunc non blandit massa. Velit euismod in pellentesque massa placerat. Sed cras ornare arcu dui. Ut sem viverra aliquet eget sit. Eu lobortis elementum nibh tellus molestie nunc non. Blandit libero volutpat sed cras ornare arcu dui vivamus.\nSit amet aliquam id diam maecenas. Amet risus nullam eget felis eget nunc lobortis mattis aliquam. Magna sit amet purus gravida. Egestas purus viverra accumsan in nisl nisi. Leo duis ut diam quam. Ante metus dictum at tempor commodo ullamcorper. Ac turpis egestas integer eget. Fames ac turpis egestas integer eget aliquet nibh. Sem integer vitae justo eget magna fermentum. Semper auctor neque vitae tempus quam pellentesque nec nam aliquam. Vestibulum mattis ullamcorper velit sed. Consectetur adipiscing elit duis tristique sollicitudin nibh. Massa id neque aliquam vestibulum morbi blandit cursus risus.\nCursus sit amet dictum sit amet justo donec enim diam. Egestas erat imperdiet sed euismod. Nullam vehicula ipsum a arcu cursus vitae congue mauris. Habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Duis ultricies lacus sed turpis tincidunt id aliquet risus feugiat. Faucibus ornare suspendisse sed nisi lacus sed viverra. Pretium fusce id velit ut tortor pretium viverra. Fermentum odio eu feugiat pretium nibh ipsum consequat nisl vel. Senectus et netus et malesuada. Tellus pellentesque eu tincidunt tortor aliquam. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Quis vel eros donec ac odio. Id interdum velit laoreet id donec ultrices tincidunt.\nMassa id neque aliquam vestibulum morbi blandit cursus risus at. Enim tortor at auctor urna nunc id cursus metus. Lorem ipsum dolor sit amet consectetur. At quis risus sed vulputate odio. Facilisis mauris sit amet massa vitae tortor condimentum lacinia quis. Et malesuada fames ac turpis egestas maecenas. Bibendum arcu vitae elementum curabitur vitae nunc sed velit dignissim. Viverra orci sagittis eu volutpat odio facilisis mauris. Adipiscing bibendum est ultricies integer quis auctor elit sed. Neque viverra justo nec ultrices dui sapien. Elementum nibh tellus molestie nunc non blandit massa enim. Euismod elementum nisi quis eleifend quam adipiscing vitae proin sagittis. Faucibus ornare suspendisse sed nisi. Quis viverra nibh cras pulvinar mattis nunc sed blandit. Tristique senectus et netus et. Magnis dis parturient montes nascetur ridiculus mus.\nDolor magna eget est lorem ipsum dolor. Nibh sit amet commodo nulla. Donec pretium vulputate sapien nec sagittis aliquam malesuada. Cras adipiscing enim eu turpis egestas pretium. Cras ornare arcu dui vivamus arcu felis bibendum ut tristique. Mus mauris vitae ultricies leo integer. In nulla posuere sollicitudin aliquam ultrices sagittis orci. Quis hendrerit dolor magna eget. Nisl tincidunt eget nullam non. Vitae congue eu consequat ac felis donec et odio. Vivamus at augue eget arcu dictum varius duis at. Ornare quam viverra orci sagittis.\nErat nam at lectus urna duis convallis. Massa placerat duis ultricies lacus sed turpis tincidunt id aliquet. Est ullamcorper eget nulla facilisi etiam dignissim diam. Arcu vitae elementum curabitur vitae nunc sed velit dignissim sodales. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Neque viverra justo nec ultrices dui sapien eget mi proin. Viverra accumsan in nisl nisi scelerisque eu ultrices. Consequat interdum varius sit amet mattis. In aliquam sem fringilla ut morbi. Eget arcu dictum varius duis at. Nulla aliquet porttitor lacus luctus accumsan tortor posuere. Arcu bibendum at varius vel pharetra vel turpis. Hac habitasse platea dictumst quisque sagittis purus sit amet. Sapien eget mi proin sed libero enim sed. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus interdum. Semper viverra nam libero justo. Fusce ut placerat orci nulla pellentesque dignissim enim sit amet. Et malesuada fames ac turpis egestas maecenas pharetra convallis posuere.\nTurpis egestas sed tempus urna et pharetra pharetra massa. Gravida in fermentum et sollicitudin ac orci phasellus. Ornare suspendisse sed nisi lacus sed viverra tellus in. Fames ac turpis egestas maecenas pharetra convallis posuere. Mi proin sed libero enim sed faucibus turpis. Sit amet mauris commodo quis imperdiet massa tincidunt nunc. Ut etiam sit amet nisl purus in mollis nunc. Habitasse platea dictumst quisque sagittis purus sit amet volutpat consequat. Eget aliquet nibh praesent tristique magna. Sit amet est placerat in egestas erat. Commodo sed egestas egestas fringilla. Enim nulla aliquet porttitor lacus luctus accumsan tortor posuere ac. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper. Dignissim convallis aenean et tortor at risus viverra. Morbi blandit cursus risus at ultrices mi. Ac turpis egestas integer eget aliquet nibh praesent tristique magna.\nVolutpat sed cras ornare arcu dui. Egestas erat imperdiet sed euismod nisi porta lorem mollis aliquam. Viverra justo nec ultrices dui sapien. Amet risus nullam eget felis eget nunc lobortis. Metus aliquam eleifend mi in. Ut eu sem integer vitae. Auctor elit sed vulputate mi sit amet. Nisl nisi scelerisque eu ultrices. Dictum fusce ut placerat orci nulla. Pellentesque habitant morbi tristique senectus et. Auctor elit sed vulputate mi sit. Tincidunt arcu non sodales neque. Mi in nulla posuere sollicitudin aliquam. Morbi non arcu risus quis varius quam quisque id diam. Cras adipiscing enim eu turpis egestas pretium aenean pharetra magna. At auctor urna nunc id cursus metus aliquam. Mauris a diam maecenas sed enim ut sem viverra. Nunc scelerisque viverra mauris in. In iaculis nunc sed augue lacus viverra vitae congue eu. Volutpat blandit aliquam etiam erat velit scelerisque in dictum non."), + CLAY_TEXT_CONFIG({ .fontSize = 24, .textColor = {0,0,0,255} })); } } - CLAY_FLOATING_CONTAINER(CLAY_ID("Blob4Floating2"), &CLAY_LAYOUT_DEFAULT, CLAY_FLOATING_CONFIG(.zIndex = 1, .parentId = CLAY_ID("SidebarBlob4").id)) { - CLAY_SCROLL_CONTAINER(CLAY_ID("ScrollContainer"), CLAY_LAYOUT(.sizing = { .height = CLAY_SIZING_FIXED(200) }, .childGap = 2), CLAY_SCROLL_CONFIG(.vertical = true)) { - CLAY_FLOATING_CONTAINER(CLAY_ID("FloatingContainer2"), CLAY_LAYOUT(), CLAY_FLOATING_CONFIG(.zIndex = 1)) { - CLAY_RECTANGLE(CLAY_ID("FloatingContainerInner"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_FIXED(300), .height = CLAY_SIZING_FIXED(300) }, .padding = {16, 16}), CLAY_RECTANGLE_CONFIG(.color = {140,80, 200, 200})) { - CLAY_TEXT(CLAY_ID("FloatingContainerText2"), CLAY_STRING("I'm an inline floating container."), CLAY_TEXT_CONFIG(.fontSize = 24, .textColor = {255,255,255,255})); + CLAY(CLAY_ID("Blob4Floating2"), CLAY_FLOATING({ .zIndex = 1, .parentId = Clay_GetElementId(CLAY_STRING("SidebarBlob4")).id })) { + CLAY(CLAY_ID("ScrollContainer"), CLAY_LAYOUT({ .sizing = { .height = CLAY_SIZING_FIXED(200) }, .childGap = 2 }), CLAY_SCROLL({ .vertical = true })) { + CLAY(CLAY_ID("FloatingContainer2"), CLAY_LAYOUT({ }), CLAY_FLOATING({ .zIndex = 1 })) { + CLAY(CLAY_ID("FloatingContainerInner"), CLAY_LAYOUT({ .sizing = { .width = CLAY_SIZING_FIXED(300), .height = CLAY_SIZING_FIXED(300) }, .padding = {16, 16} }), CLAY_RECTANGLE({ .color = {140,80, 200, 200} })) { + CLAY_TEXT(CLAY_STRING("I'm an inline floating container."), CLAY_TEXT_CONFIG({ .fontSize = 24, .textColor = {255,255,255,255} })); } } - CLAY_RECTANGLE(CLAY_ID("ScrollContainerInner"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM), CLAY_RECTANGLE_CONFIG(.color = {160, 160, 160, 255})) { - for (int i = 0; i < 10; i++) { + CLAY(CLAY_ID("ScrollContainerInner"), CLAY_LAYOUT({ .layoutDirection = CLAY_TOP_TO_BOTTOM }), CLAY_RECTANGLE({ .color = {160, 160, 160, 255} })) { + for (int i = 0; i < 100; i++) { RenderDropdownTextItem(i); } } } } - Clay_ScrollContainerData scrollData = Clay_GetScrollContainerData(CLAY_ID("MainContent")); - CLAY_FLOATING_CONTAINER(CLAY_ID("ScrollBar"), &CLAY_LAYOUT_DEFAULT, CLAY_FLOATING_CONFIG(.offset = { .y = -(scrollData.scrollPosition->y / scrollData.contentDimensions.height) * scrollData.scrollContainerDimensions.height }, .zIndex = 1, .parentId = CLAY_ID("MainContent").id, .attachment = {.element = CLAY_ATTACH_POINT_RIGHT_TOP, .parent = CLAY_ATTACH_POINT_RIGHT_TOP})) { - CLAY_RECTANGLE(CLAY_ID("ScrollBarButton"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_FIXED(12), CLAY_SIZING_FIXED((scrollData.scrollContainerDimensions.height / scrollData.contentDimensions.height) * scrollData.scrollContainerDimensions.height)}), CLAY_RECTANGLE_CONFIG(.cornerRadius = {6}, .color = Clay_PointerOver(CLAY_ID("ScrollBar")) ? (Clay_Color){100, 100, 140, 150} : (Clay_Color){120, 120, 160, 150})) {} - }; + Clay_ScrollContainerData scrollData = Clay_GetScrollContainerData(Clay_GetElementId(CLAY_STRING("MainContent"))); + if (scrollData.found) { + CLAY(CLAY_ID("ScrollBar"), + CLAY_FLOATING({ + .offset = { .y = -(scrollData.scrollPosition->y / scrollData.contentDimensions.height) * scrollData.scrollContainerDimensions.height }, + .zIndex = 1, + .parentId = Clay_GetElementId(CLAY_STRING("MainContent")).id, + .attachment = {.element = CLAY_ATTACH_POINT_RIGHT_TOP, .parent = CLAY_ATTACH_POINT_RIGHT_TOP} + }) + ) { + CLAY(CLAY_ID("ScrollBarButton"), + CLAY_LAYOUT({ .sizing = {CLAY_SIZING_FIXED(12), CLAY_SIZING_FIXED((scrollData.scrollContainerDimensions.height / scrollData.contentDimensions.height) * scrollData.scrollContainerDimensions.height) }}), + CLAY_RECTANGLE({ .cornerRadius = {6}, .color = Clay_PointerOver(Clay__HashString(CLAY_STRING("ScrollBar"), 0, 0)) ? (Clay_Color){100, 100, 140, 150} : (Clay_Color){120, 120, 160, 150} }) + ) {} + } + } }; return Clay_EndLayout(); } @@ -147,13 +165,13 @@ void UpdateDrawFrame(void) scrollbarData.mouseDown = false; } - if (IsMouseButtonDown(0) && !scrollbarData.mouseDown && Clay_PointerOver(CLAY_ID("ScrollBar"))) { - Clay_ScrollContainerData scrollContainerData = Clay_GetScrollContainerData(CLAY_ID("MainContent")); + if (IsMouseButtonDown(0) && !scrollbarData.mouseDown && Clay_PointerOver(Clay__HashString(CLAY_STRING("ScrollBar"), 0, 0))) { + Clay_ScrollContainerData scrollContainerData = Clay_GetScrollContainerData(Clay__HashString(CLAY_STRING("MainContent"), 0, 0)); scrollbarData.clickOrigin = mousePosition; scrollbarData.positionOrigin = *scrollContainerData.scrollPosition; scrollbarData.mouseDown = true; } else if (scrollbarData.mouseDown) { - Clay_ScrollContainerData scrollContainerData = Clay_GetScrollContainerData(CLAY_ID("MainContent")); + Clay_ScrollContainerData scrollContainerData = Clay_GetScrollContainerData(Clay__HashString(CLAY_STRING("MainContent"), 0, 0)); if (scrollContainerData.contentDimensions.height > 0) { Clay_Vector2 ratio = (Clay_Vector2) { scrollContainerData.contentDimensions.width / scrollContainerData.scrollContainerDimensions.width, diff --git a/examples/raylib-sidebar-scrolling-container/multi-compilation-unit.c b/examples/raylib-sidebar-scrolling-container/multi-compilation-unit.c index 8d246be..e5df212 100644 --- a/examples/raylib-sidebar-scrolling-container/multi-compilation-unit.c +++ b/examples/raylib-sidebar-scrolling-container/multi-compilation-unit.c @@ -3,5 +3,5 @@ // NOTE: This file only exists to make sure that clay works when included in multiple translation units. void SatisfyCompiler() { - CLAY_CONTAINER(CLAY_ID("SatisfyCompiler"), CLAY_LAYOUT()) {} + CLAY(CLAY_ID("SatisfyCompiler"), CLAY_LAYOUT({})) {} } \ No newline at end of file diff --git a/generator/array_allocate.template.c b/generator/array_allocate.template.c new file mode 100644 index 0000000..8c28707 --- /dev/null +++ b/generator/array_allocate.template.c @@ -0,0 +1,3 @@ +$NAME$ $NAME$_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { + return CLAY__INIT($NAME$){.capacity = capacity, .length = 0, .internalArray = ($TYPE$ *)Clay__Array_Allocate_Arena(capacity, sizeof($TYPE$), CLAY__ALIGNMENT($TYPE$), arena)}; +} \ No newline at end of file diff --git a/generator/array_define.template.c b/generator/array_define.template.c index 1df342b..aac9c94 100644 --- a/generator/array_define.template.c +++ b/generator/array_define.template.c @@ -3,8 +3,4 @@ typedef struct uint32_t capacity; uint32_t length; $TYPE$ *internalArray; -} $NAME$; - -$NAME$ $NAME$_Allocate_Arena(uint32_t capacity, Clay_Arena *arena) { - return CLAY__INIT($NAME$){.capacity = capacity, .length = 0, .internalArray = ($TYPE$ *)Clay__Array_Allocate_Arena(capacity, sizeof($TYPE$), CLAY__ALIGNMENT($TYPE$), arena)}; -} \ No newline at end of file +} $NAME$; \ No newline at end of file diff --git a/generator/array_define_slice.template.c b/generator/array_define_slice.template.c new file mode 100644 index 0000000..680ffa2 --- /dev/null +++ b/generator/array_define_slice.template.c @@ -0,0 +1,5 @@ +typedef struct +{ + uint32_t length; + $TYPE$ *internalArray; +} $NAME$Slice; \ No newline at end of file diff --git a/generator/array_get_slice.template.c b/generator/array_get_slice.template.c new file mode 100644 index 0000000..ac02abb --- /dev/null +++ b/generator/array_get_slice.template.c @@ -0,0 +1,3 @@ +$TYPE$ *$NAME$Slice_Get($NAME$Slice *slice, int index) { + return Clay__Array_RangeCheck(index, slice->length) ? &slice->internalArray[index] : $DEFAULT_VALUE$; +} \ No newline at end of file