From 6ffe697cc664942d210c9921822e03a4f20ef1ce Mon Sep 17 00:00:00 2001 From: John Ritsema Date: Fri, 9 Jun 2023 21:41:47 -0400 Subject: [PATCH] implements crud app --- .gitignore | 1 + Dockerfile | 2 +- Makefile | 29 +- README.md | 18 +- css/input.css | 3 + css/output.css | 972 +++++++++++++++++++++++++++++++++++++ data.go | 88 ++++ docker-compose.yml | 7 - go.mod | 2 + go.sum | 4 + logging.go | 40 ++ main.go | 55 +++ routes.go | 81 ++++ screenshot.jpeg | Bin 0 -> 110039 bytes tailwind.config.js | 12 + templates/companies.html | 38 ++ templates/company-add.html | 6 + templates/index.html | 21 + templates/row-add.html | 51 ++ templates/row-edit.html | 53 ++ templates/row.html | 29 ++ 21 files changed, 1484 insertions(+), 28 deletions(-) create mode 100644 css/input.css create mode 100644 css/output.css create mode 100644 data.go delete mode 100644 docker-compose.yml create mode 100644 go.sum create mode 100644 logging.go create mode 100644 routes.go create mode 100644 screenshot.jpeg create mode 100644 tailwind.config.js create mode 100644 templates/companies.html create mode 100644 templates/company-add.html create mode 100644 templates/index.html create mode 100644 templates/row-add.html create mode 100644 templates/row-edit.html create mode 100644 templates/row.html diff --git a/.gitignore b/.gitignore index f3cceee..a817cd4 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ app *.swp *.test *.out +tmp diff --git a/Dockerfile b/Dockerfile index 950cc51..925e9ae 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.19 AS build +FROM golang:1.20.4 AS build WORKDIR /go/src/app COPY . . ENV CGO_ENABLED=0 GOOS=linux diff --git a/Makefile b/Makefile index 5a7d7b9..5118a24 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,13 @@ help: Makefile @sed -n 's/^##//p' $< | column -t -s ':' | sed -e 's/^/ /' @echo +## init: initialize project (make init module=github.com/user/project) +.PHONY: init +init: + go mod init ${module} + go install github.com/cosmtrek/air@latest + asdf reshim golang + ## vet: vet code .PHONY: vet vet: @@ -25,12 +32,6 @@ test: build: test go build -o ./app -v -## autobuild: auto build when source files change -.PHONY: autobuild -autobuild: - # curl -sf https://gobinaries.com/cespare/reflex | sh - reflex -g '*.go' -- sh -c 'echo "\n\n\n\n\n\n" && make build' - ## dockerbuild: build project into a docker container image .PHONY: dockerbuild dockerbuild: test @@ -39,12 +40,14 @@ dockerbuild: test ## start: build and run local project .PHONY: start start: build - clear - @echo "" - ./app + air -## deploy: build code into a container and deploy it to the cloud dev environment -.PHONY: deploy -deploy: build - ./deploy.sh +## css: build tailwindcss +.PHONY: css +css: + tailwindcss -i css/input.css -o css/output.css --minify +## css-watch: watch build tailwindcss +.PHONY: css-watch +css-watch: + tailwindcss -i css/input.css -o css/output.css --watch diff --git a/README.md b/README.md index 92a9d3d..5aae05f 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,23 @@ -# go-template +# go-htmx-tailwind-example -Quick starter template for new go projects +Example CRUD app written in Go + HTMX + Tailwind CSS -```sh -go mod init app -``` +This project implements a pure dynamic web app with SPA-like features but without heavy complex Javascript or Go frameworks to keep up with. Just HTML/CSS + Go ❤️ + +![screenshot](./screenshot.jpeg) + + +## Develop ``` Choose a make command to run + init initialize project (make init module=github.com/user/project) vet vet code test run unit tests build build a binary - autobuild auto build when source files change dockerbuild build project into a docker container image start build and run local project - deploy build code into a container and deploy it to the cloud dev environment + css build tailwindcss + css-watch watch build tailwindcss ``` diff --git a/css/input.css b/css/input.css new file mode 100644 index 0000000..bd6213e --- /dev/null +++ b/css/input.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/css/output.css b/css/output.css new file mode 100644 index 0000000..76e479a --- /dev/null +++ b/css/output.css @@ -0,0 +1,972 @@ +/* +! tailwindcss v3.3.2 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +*/ + +html { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden] { + display: none; +} + +[type='text'],[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #6b7280; + border-width: 1px; + border-radius: 0px; + padding-top: 0.5rem; + padding-right: 0.75rem; + padding-bottom: 0.5rem; + padding-left: 0.75rem; + font-size: 1rem; + line-height: 1.5rem; + --tw-shadow: 0 0 #0000; +} + +[type='text']:focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: #2563eb; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + border-color: #2563eb; +} + +input::-moz-placeholder, textarea::-moz-placeholder { + color: #6b7280; + opacity: 1; +} + +input::placeholder,textarea::placeholder { + color: #6b7280; + opacity: 1; +} + +::-webkit-datetime-edit-fields-wrapper { + padding: 0; +} + +::-webkit-date-and-time-value { + min-height: 1.5em; +} + +::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field { + padding-top: 0; + padding-bottom: 0; +} + +select { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); + background-position: right 0.5rem center; + background-repeat: no-repeat; + background-size: 1.5em 1.5em; + padding-right: 2.5rem; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; +} + +[multiple] { + background-image: initial; + background-position: initial; + background-repeat: unset; + background-size: initial; + padding-right: 0.75rem; + -webkit-print-color-adjust: unset; + print-color-adjust: unset; +} + +[type='checkbox'],[type='radio'] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + padding: 0; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + display: inline-block; + vertical-align: middle; + background-origin: border-box; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + flex-shrink: 0; + height: 1rem; + width: 1rem; + color: #2563eb; + background-color: #fff; + border-color: #6b7280; + border-width: 1px; + --tw-shadow: 0 0 #0000; +} + +[type='checkbox'] { + border-radius: 0px; +} + +[type='radio'] { + border-radius: 100%; +} + +[type='checkbox']:focus,[type='radio']:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); + --tw-ring-offset-width: 2px; + --tw-ring-offset-color: #fff; + --tw-ring-color: #2563eb; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); +} + +[type='checkbox']:checked,[type='radio']:checked { + border-color: transparent; + background-color: currentColor; + background-size: 100% 100%; + background-position: center; + background-repeat: no-repeat; +} + +[type='checkbox']:checked { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); +} + +[type='radio']:checked { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); +} + +[type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus { + border-color: transparent; + background-color: currentColor; +} + +[type='checkbox']:indeterminate { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e"); + border-color: transparent; + background-color: currentColor; + background-size: 100% 100%; + background-position: center; + background-repeat: no-repeat; +} + +[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus { + border-color: transparent; + background-color: currentColor; +} + +[type='file'] { + background: unset; + border-color: inherit; + border-width: 0; + border-radius: 0; + padding: 0; + font-size: unset; + line-height: inherit; +} + +[type='file']:focus { + outline: 1px solid ButtonText; + outline: 1px auto -webkit-focus-ring-color; +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +.m-2 { + margin: 0.5rem; +} + +.inline-block { + display: inline-block; +} + +.flex { + display: flex; +} + +.inline-flex { + display: inline-flex; +} + +.table { + display: table; +} + +.h-8 { + height: 2rem; +} + +.w-full { + width: 100%; +} + +.min-w-full { + min-width: 100%; +} + +.appearance-none { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.flex-col { + flex-direction: column; +} + +.items-center { + align-items: center; +} + +.justify-end { + justify-content: flex-end; +} + +.overflow-hidden { + overflow: hidden; +} + +.overflow-x-auto { + overflow-x: auto; +} + +.whitespace-nowrap { + white-space: nowrap; +} + +.rounded { + border-radius: 0.25rem; +} + +.rounded-lg { + border-radius: 0.5rem; +} + +.border { + border-width: 1px; +} + +.border-b { + border-bottom-width: 1px; +} + +.bg-blue-700 { + --tw-bg-opacity: 1; + background-color: rgb(29 78 216 / var(--tw-bg-opacity)); +} + +.bg-red-700 { + --tw-bg-opacity: 1; + background-color: rgb(185 28 28 / var(--tw-bg-opacity)); +} + +.px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} + +.px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; +} + +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.text-left { + text-align: left; +} + +.text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.font-light { + font-weight: 300; +} + +.font-medium { + font-weight: 500; +} + +.leading-tight { + line-height: 1.25; +} + +.text-blue-100 { + --tw-text-opacity: 1; + color: rgb(219 234 254 / var(--tw-text-opacity)); +} + +.text-blue-700 { + --tw-text-opacity: 1; + color: rgb(29 78 216 / var(--tw-text-opacity)); +} + +.text-gray-700 { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity)); +} + +.text-red-100 { + --tw-text-opacity: 1; + color: rgb(254 226 226 / var(--tw-text-opacity)); +} + +.shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.transition-colors { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.duration-150 { + transition-duration: 150ms; +} + +@media (min-width: 768px) { + .md\:container { + width: 100%; + } + + @media (min-width: 640px) { + .md\:container { + max-width: 640px; + } + } + + @media (min-width: 768px) { + .md\:container { + max-width: 768px; + } + } + + @media (min-width: 1024px) { + .md\:container { + max-width: 1024px; + } + } + + @media (min-width: 1280px) { + .md\:container { + max-width: 1280px; + } + } + + @media (min-width: 1536px) { + .md\:container { + max-width: 1536px; + } + } +} + +.hover\:bg-blue-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(30 64 175 / var(--tw-bg-opacity)); +} + +.hover\:bg-red-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(153 27 27 / var(--tw-bg-opacity)); +} + +.hover\:underline:hover { + text-decoration-line: underline; +} + +.focus\:outline-none:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +@media (prefers-color-scheme: dark) { + .dark\:border-neutral-500 { + --tw-border-opacity: 1; + border-color: rgb(115 115 115 / var(--tw-border-opacity)); + } +} + +@media (min-width: 640px) { + .sm\:-mx-6 { + margin-left: -1.5rem; + margin-right: -1.5rem; + } + + .sm\:px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; + } +} + +@media (min-width: 768px) { + .md\:mx-auto { + margin-left: auto; + margin-right: auto; + } +} + +@media (min-width: 1024px) { + .lg\:-mx-8 { + margin-left: -2rem; + margin-right: -2rem; + } + + .lg\:px-8 { + padding-left: 2rem; + padding-right: 2rem; + } +} \ No newline at end of file diff --git a/data.go b/data.go new file mode 100644 index 0000000..70192d4 --- /dev/null +++ b/data.go @@ -0,0 +1,88 @@ +package main + +import "strconv" + +var data []Company + +type Company struct { + ID string + Company string + Contact string + Country string +} + +func init() { + data = []Company{ + { + ID: "1", + Company: "Amazon", + Contact: "Jeff Bezos", + Country: "United States", + }, + { + ID: "2", + Company: "Apple", + Contact: "Tim Cook", + Country: "United States", + }, + { + ID: "3", + Company: "Microsoft", + Contact: "Satya Nadella", + Country: "United States", + }, + } +} + +func getCompanyByID(id string) Company { + var result Company + for _, i := range data { + if i.ID == id { + result = i + break + } + } + return result +} + +func updateCompany(company Company) { + result := []Company{} + for _, i := range data { + if i.ID == company.ID { + i.Company = company.Company + i.Contact = company.Contact + i.Country = company.Country + } + result = append(result, i) + } + data = result +} + +func addCompany(company Company) { + max := 0 + for _, i := range data { + n, _ := strconv.Atoi(i.ID) + if n > max { + max = n + } + } + max++ + id := strconv.Itoa(max) + + data = append(data, Company{ + ID: id, + Company: company.Company, + Contact: company.Contact, + Country: company.Country, + }) +} + +func deleteCompany(id string) { + result := []Company{} + for _, i := range data { + if i.ID != id { + result = append(result, i) + } + } + data = result +} diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index f566e4c..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,7 +0,0 @@ -version: "3.7" -services: - app: - build: . - image: app:0.1.0 - environment: - FOO: bar diff --git a/go.mod b/go.mod index d38f91b..d318025 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module github.com/jritsema/go-htmx-starter go 1.20 + +require github.com/jritsema/gotoolbox v0.8.0 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..f0cc2d1 --- /dev/null +++ b/go.sum @@ -0,0 +1,4 @@ +github.com/jritsema/gotoolbox v0.7.0 h1:pvEf4VnB/Gjf/UYoq8T6f9vnIb7ssteGlFJEXg0Ejpo= +github.com/jritsema/gotoolbox v0.7.0/go.mod h1:OgV4sjpMB/bx/ZZPpXWvfalGrniFvkvGtqFRQH6GGHY= +github.com/jritsema/gotoolbox v0.8.0 h1:guUvlilrUcT24i0iGnasLch6pjWJ437Qnabk6WTmPEU= +github.com/jritsema/gotoolbox v0.8.0/go.mod h1:OgV4sjpMB/bx/ZZPpXWvfalGrniFvkvGtqFRQH6GGHY= diff --git a/logging.go b/logging.go new file mode 100644 index 0000000..969a72c --- /dev/null +++ b/logging.go @@ -0,0 +1,40 @@ +package main + +import ( + "context" + "log" + "net/http" +) + +type key int + +const requestIDKey key = 0 + +func logging(logger *log.Logger) func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + defer func() { + requestID, ok := r.Context().Value(requestIDKey).(string) + if !ok { + requestID = "unknown" + } + logger.Println(requestID, r.Method, r.URL.Path, r.RemoteAddr, r.UserAgent()) + }() + next.ServeHTTP(w, r) + }) + } +} + +func tracing(nextRequestID func() string) func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + requestID := r.Header.Get("X-Request-Id") + if requestID == "" { + requestID = nextRequestID() + } + ctx := context.WithValue(r.Context(), requestIDKey, requestID) + w.Header().Set("X-Request-Id", requestID) + next.ServeHTTP(w, r.WithContext(ctx)) + }) + } +} diff --git a/main.go b/main.go index 2498eb9..e79bb9d 100644 --- a/main.go +++ b/main.go @@ -1,10 +1,29 @@ package main import ( + "embed" "fmt" + "html/template" + "log" + "net/http" "os" "os/signal" "syscall" + "time" + + "github.com/jritsema/gotoolbox" + "github.com/jritsema/gotoolbox/web" +) + +var ( + //go:embed all:templates/* + templateFS embed.FS + + //go:embed css/output.css + css embed.FS + + //parsed templates + html *template.Template ) func main() { @@ -12,6 +31,42 @@ func main() { //exit process immediately upon sigterm handleSigTerms() + //parse templates + var err error + html, err = web.TemplateParseFSRecursive(templateFS, ".html", true, nil) + if err != nil { + panic(err) + } + + //add routes + router := http.NewServeMux() + router.Handle("/css/output.css", http.FileServer(http.FS(css))) + + router.Handle("/company/add", web.Action(companyAdd)) + router.Handle("/company/add/", web.Action(companyAdd)) + + router.Handle("/company/edit", web.Action(companyEdit)) + router.Handle("/company/edit/", web.Action(companyEdit)) + + router.Handle("/company", web.Action(companies)) + router.Handle("/company/", web.Action(companies)) + + router.Handle("/", web.Action(index)) + router.Handle("/index.html", web.Action(index)) + + //logging/tracing + nextRequestID := func() string { + return fmt.Sprintf("%d", time.Now().UnixNano()) + } + logger := log.New(os.Stdout, "http: ", log.LstdFlags) + middleware := tracing(nextRequestID)(logging(logger)(router)) + + port := gotoolbox.GetEnvWithDefault("PORT", "8080") + logger.Println("listening on http://localhost:" + port) + if err := http.ListenAndServe(":"+port, middleware); err != nil { + logger.Println("http.ListenAndServe():", err) + os.Exit(1) + } } func handleSigTerms() { diff --git a/routes.go b/routes.go new file mode 100644 index 0000000..fa35ea0 --- /dev/null +++ b/routes.go @@ -0,0 +1,81 @@ +package main + +import ( + "net/http" + + "github.com/jritsema/gotoolbox/web" +) + +// Delete -> DELETE /company/{id} -> delete, companys.html + +// Edit -> GET /company/edit/{id} -> row-edit.html +// Save -> PUT /company/{id} -> update, row.html +// Cancel -> GET /company/{id} -> nothing, row.html + +// Add -> GET /company/add/ -> companys-add.html (target body with row-add.html and row.html) +// Save -> POST /company -> add, companys.html (target body without row-add.html) +// Cancel -> GET /company -> nothing, companys.html + +func index(r *http.Request) *web.Response { + return web.HTML(http.StatusOK, html, "index.html", data, nil) +} + +// GET /company/add +func companyAdd(r *http.Request) *web.Response { + return web.HTML(http.StatusOK, html, "company-add.html", data, nil) +} + +// /GET company/edit/{id} +func companyEdit(r *http.Request) *web.Response { + id, _ := web.PathLast(r) + row := getCompanyByID(id) + return web.HTML(http.StatusOK, html, "row-edit.html", row, nil) +} + +// GET /company +// GET /company/{id} +// DELETE /company/{id} +// PUT /company/{id} +// POST /company +func companies(r *http.Request) *web.Response { + id, segments := web.PathLast(r) + switch r.Method { + + case http.MethodDelete: + deleteCompany(id) + return web.HTML(http.StatusOK, html, "companies.html", data, nil) + + //cancel + case http.MethodGet: + if segments > 1 { + //cancel edit + row := getCompanyByID(id) + return web.HTML(http.StatusOK, html, "row.html", row, nil) + } else { + //cancel add + return web.HTML(http.StatusOK, html, "companies.html", data, nil) + } + + //save edit + case http.MethodPut: + row := getCompanyByID(id) + r.ParseForm() + row.Company = r.Form.Get("company") + row.Contact = r.Form.Get("contact") + row.Country = r.Form.Get("country") + updateCompany(row) + return web.HTML(http.StatusOK, html, "row.html", row, nil) + + //save add + case http.MethodPost: + row := Company{} + r.ParseForm() + row.Company = r.Form.Get("company") + row.Contact = r.Form.Get("contact") + row.Country = r.Form.Get("country") + addCompany(row) + return web.HTML(http.StatusOK, html, "companies.html", data, nil) + } + + return web.Empty(http.StatusNotImplemented) +} diff --git a/screenshot.jpeg b/screenshot.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7461d4643b791e15a25ebb5af89ed1bb4f7b90cc GIT binary patch literal 110039 zcmeFYcT`hP_cwY%fY5tyLAq3>_kc(fDS~u0(m|wG1qq^nARPe(1u4=Ik*2grZz@%) z(k=7^5CSCOJ@`Cde`URE-QT_I{&C;6?!d{}XEHNq_RQ=(pS}0wWa?xAV7R1bs0TnG z0FVOy0Vj(gTL&W}Fh6Dg& zJpj^wm$3uyrwMHNwD!O6(6kr;20k%?*Ta`2|CA;VeF^=ChMv{{v@LWD4Z*vGlfR3L zcYwQ3;K?SSYzE$azz1J`Iq7qN@&!X<($n{W=?^XZhh!M%O_)vw-jc3HQa;_lU5GeY zq7^dK(LtJ-o9Y=}*8RgWEsKM%?`;wW0Pyk-^f%YPz;9z~#}E4n_JR$d0i*$12d4mE zZ8NjWr)~ao|I_~8kNt^1oB?A}r)~Ys{+|(y&MpB?;LwQ@NQ;4Gd_nrOePzf0)Q;PKq8%I@|F-Gi z;P#jP7cXE<@WmHB0(@^f-1+nH|K^9+?I3Wx{v;9blg8cOz#P1@fnzr1>0|Vl_I5Ne z{U_f8;KIU2)6iJHxOKq|Fq*9X!dsuZ#i5# zUH5^Fqr&Do(KY5PWb@P zq2?6iAN;4eKgtNyaZ~_3zyfdre1ISz_NQlxfEu6$_V^ND3S0$jfg6Am;0|~J{y+#2 z4%`P~fXAS&%K);0JfILL1*(9zKqJrsv;#fBATSJk0cL>(;5)DmV1Rw#7y^O7AhZx> z2qy#%5r#-WWFg8BO^7b!GQ=EW3%Ln#gLp%NAmNY)kjIcTNH!!NQUd3nc3#zo7t>8p;Me1C@d*Lv^60P&=qA)E^oFjfZAJ3!tx|P0(KG7<2);0X-xo zCuJt(CzT>qBQ+qkBy}S7BaI+UAk8K%C2b(>A{`@LB*l;t$!N)V$Rx;A$qdPC$lS<6 z$YRJc$%@J9$-2qDkbNiHCnqOoBNruCA~ztnCBH=;MxH?ag1nmi1NjK~GWl;948{qQ zfN8)?VGgiBSPbkLtP+NXjl#aea1_)Oa0*!pJqkMtZ;B|2Op0=fHi}V-pA^TG43xr@ zs+6Xb&Xjj3lPQZRn<$4Uzf&GlF;aM7N0s&1;URJ+vF)B@Bh)K{oI zs3WPLQoo_@qh6#wq+y~Fr_rIgMiWGnL{mcZfo7U!mzI`RgjS2zjy8}siMEWklXi|4 zN5@PjO=n2wOoyV&p=+QUrQ4#Xq!*^wroTadmp+remVStSgMpGkgh7YFfgyq+hv7ZL zB*Sk;X2$c3ri@;U35?~8{fxhuU`!%Rx=hYY519&?I+>Q4q0EBJI?PVY515OXyP3bU zkh6%g7_!`AdCXG9@|gw0%ET(qYQ-ALn#0=4y1)iy6JaxCyUmu&_Lgme?TDS1U7Ov7 zJ&ye~`zZSX2RDZnhYLqMM>WS6jw4QfPF+q<&Q#7u&Tm|#T;g0;xI(ycxw^SFxLLT> zxShD;x!-cn@R0C`^O*C5@f7lWVofIb(1p=uG~Z&u5MWLMq?`&`kv+4D^2FP)D%-*kRQR$SIeHb-_`j#f@j z4khABLRGK;dAa)NT73Yp3U z6_iSg%Au;FYM|;{)onE?HBYs2wO{I@>MrU<>dP7e8V(xy8Vj2Inm09HYAztoARG_{ zh$SsSEoZG_t)JRwwQp%xYHwXQcftQc{e=S^Rh@e}A1*>K>R*h%_*s`p*HSlIcTP`0 z&rPpF52LT3AEy7ofXu+iAk|>fkk`=3u*?v1N$JwPOI=1ZMixfdMoX8)FZ*9^GA1#; zWSnmN)kN6D+oaJHFf}wyH~nTNYUXFwe1-gq*_E6tKg`dYhnx3WFk2uk$}RSjfJbn|n5cwp_Lzw(smw7yw>6YpT^P~h;}(a`a^BgRR`Da&cyS23_M-5* z>Gj^5$=lPr%ZJY=)Mvz3!Z*fu!B5pM!w=(cB3Ai5cE|3KTM<0X4f}(>KgEfP5 zf^i{MA+@25q28e%?}*=tyYus|-rZMWq+w2B9pPuf?}snm)4rD<0f}&o=s*dg9-_WS z>PME|r@HTX|5MbtsI;iP2i6ao9`Zhne7GE~A6*ec7vmo@8LJkX_lWe7$D_}2a&gb% zi1E(x1CP%=&U}nda7q|RJfHY9@g&JL>2tDTa&8KFig(IHDk8NsjWO+R+H$&adcza` zC-G1AGLRYlnev%=SyWj;Sqo1uKYjO1=vm4$e71Y`mz)bZ)z5jJ$2~uI;rwDWS1b2* z9&g^`yrY*MFQ@YL^BW383Nj1H3xf-P6j>GZzEXZwR?JoWxR_AlU9wPWUfNZrR905b zQ=VKwQV~?KT6wKPjt-CWXgrX{D9wKchos_kLh3HmPj_Xpn(8|`lG z%N@v$*-o3z@vbXfpSz8^`+D?xI(xNy(R~_yE&Zzf?+26z8V3~z8$K$0tpB9&ss6L# z=Y}Drp?AY7!%ZXVBWZugtLSuq7m`yiPy=AuYRoG!1x} zf%H`^fJ9F2?*;rT{R^v~(&t`-CPTp~^)F55-2GdIgEmmiW)3X&j64>pimN0 zC>hzQ5dygfeh-i`k};h*uT9Q;#Q`SZ$0B<_HJ?K8LQOlX`3Ocx&e1=Ll8TL;gOf{G zL{#joxV(a*lCp}b&P824eFMWw7FR8;tU-9@s1$jo~BEW4nv=v8q^X<7N(+PeCN#&_?VIy$?$dwTo&2S&%nzf4R{P0uVYEw6n4 z@$=W}8g^%Q@Av)z?(pc8F9-nr7h8Wh`)_Q9wLhHw&lrpPf5h2e#{Pq^SwIIM z`IDd|Bv3La6iP-;1}1U}5P6Z4Q&3U-NmTz%G=CD^X`=s|PQXSWU>l^Qq%iQGftr$< z;s16z`353r_mdfb1_}We6O<7^00ewNycqERU;m#S1L(={f1RW9EG4V`;GJ*Z2Hxn9 z)HXMhUDV}tbyWvoLb(~1=-lqHHHCGcv}x$?p(DuAd{iSqK99a`wA_9C<{BN^?kol&mGve5bp zTlRc+ZcBXnyPZFVbK$|Khz}7x2#lo<9o}PNZ##OPXQQe`V(FW17n^GI`?Ig+FZWVX zOD25sk=xUm< zKK{uapA&$Ll#oonk%cvxK+qT}Oh&0+P5ZjaG?*^j-1WiObsO(Rw<7*CQ}5dM2V4LV z?OuH!weTEKXH|H7k@#uG_0>{Xb$w__N3CLF*+B0>dL2a-S?ABR(T>4Zbi8grulB(g zfWw^OIDU-yaQc5oclTL}MpGsPXcMkSGiVNVKIz{<2|D<$K( z1APKDB4*SERc4eP_0trJcMDOi@7<&gmOpJ9g2}_P*e}g@nMNUN>8h9KqmMe>?-E*x zc{CwLEOM+#9#QY6RSlje$u(+b?EJ(t#qK}HeLvQ{hBq-ym=i-WNk?YO*~B)~H|`jZ zv@k7iV0D{Ap5%oo_j2?Py$08n{Ryx#_I(FB zg&Q;81}7=qyleeo9)m&Q#7qhFTzN#wO4K18`t^|*6nBtEq_Q{;nEAMW0B72AOp}Yz zACv#$qWO^fTKv=r5c?3-u02K4rZV2A9wqMyC+fUrCsOgA0HUw3*2E6K6JS+dfso{p zw?kV84$}D(;FmxoA`5vR(P+9kxs;bUPaiI`gyL9Zw^OWM;uZOPBswaY>RkV>IbJ38 zg%|4+7Dq}_#&O08v?pSrV4jUA5Y9w+8ieA*%S>?VOm1%P;hdUm@}E`)TxRX*AHBHZ z_u~Ctb+g2-5|L^i93&(-X;T)LPJq$-TJUG+8Xr7M`ZBTlSTEGH1I?@MI<2Zq0#W|?mBzMieAAW3meG4K7mJ|e?Ln`82p>M(4q?#g8$ zG09%Q-|!`Ue>G0rdNX<%H9gcB!Gu9}@VXsy_h_DZm$o045zjeCt2o6n`!+C;{Em&6 zSIML2en?GJy9~-K?` z_5DXKHz#I8Sj`~`@6}6TyPZVJZLppwE@KJ(cokE-pN9+1yLK;4W2_`1&QC z;Qh8Co=fIG)gU(wQuuk~7zw05aircaQdm6!mkQxh;KlE3@y-aht7L{*Z_)Ae{OMK-uqE|MbB#=j=BngR-rj zZ5=P&m5adK()Fky=hs-V>0{&9M{gnFGOy{YB;M!p5ZZrwIeWQGPtwIE;J4PX8Iy(V{++Ap$Cyk*8W!0 zLo@qpgj%ycri*#*NoIl#Js(TSie#Rbmmx~?-n61OdBZSvV?8H8U2mM*M2qfHT2@1* z#muZ-LyqI%aZyl|SX`!AcrSfgWVwTlCW__+Sa=GrSq{I4dos`7f^v1k$V6>fc3hUt z&MbeIrc4*=zSNg?8{_{-n{J9&`VV@*B0w#|-Z3=Y*^wEcfNQSMOfEv+D9)oP^U@gc zd?uJ?X`CYX=1?FY?R<}1nizCeteOKSh}~X{-DF-kY`KHUxq1(&+t`xU{v+&8)uVTD zO#0W;3zVn@p5ITpi}9TPb&AxWI~7E#WbEwn&<8XO$9x6HS$S=h-L8tTVqNX!Mmrt4 z9LII8!`+2C%Ji};niI9S01mQQ-VvVy0?%x70_^ajuJ4(_u!JyhmGBdq_ohj?V!J#C zZ8<~8vW&)3)Y8^7FDtY_BVn$!+V_&|dVX#msKo?1uv6j&l zI=`gUc>=^_yY2t%GG$tw<9Z|No@d@1KdPu1Kl(OCeUDQfGCP7iJ45`6e9QZNvF7p8 ze5}>wWm%-qmE9A-7=8=2{AKU;Kj{0$emUnKw=E;F_!UaSi0CVh^;M zl%t4DTA|k{vAiAQD*jn>0p?D8R022JGK5h|Di{23JHt%^Fm%Ef(h@o7?$o-`Ad^?LT2MNN#Rp(uiM`< z&yu`z_Imwt@ji?vN&=fsq9I~d{_95qzd{-vr#ChhNJ3xTzjB~W z>hr;s<6F{Q>kZhZ2dI^+!D?Oe45-z%yTnlRLK1u@gdMRjbqjH%IunT~r;_-Hx5cI} zvPafmDG2@9%LR`OVoP*on@KA1^iYY5qgqlavYIjA=efCXWF1g^>u&J-5<5>-g|A9S z_x21mTDw~wOUmhp#~2ExQd;SmQ@s&l@E3!c#DDyvU@WII=3QTPYm1v!vqv;{>Bo|8 zJcmP~k$RfJig-b(@Y57vWs-Ukk$|QM4=G1E-~@YB*&o%P;Wpa$QnRRU&KtY{MP$(= z%xVjYa&WRhR_m_Z2wFM;9wVrT@Eh&LxD%k~u1w79Ex}#KSc`G5%9S+rjJY!TN4EYH zeH?uPk?IHg<+#p@a1uf;-V+<3H8y53jz_pAdy(cR=z07|`o^bKbUsNjMJ-ZWyvR8S zo<5H;rN@c+^qv4oD0m^x7<|nK5~5jIII=XQ#9zdrme(a-7=6eU8O7^+ zxXy~^7`I04DCcoEGBWC-DQp7%`pqwj?@;Q~rg|Qe$j>OY}#7eO|o9 z)33gk_<}_Pb)IEd)!mUdHdp@PJmYv83g%Z*v^>~fF1@a(}yR(Ft!X- zl-b~VOIiPoBvN`E>k~)eyy{n$kLi={ZcfyA6irVJI!jA>ZIT#Drd4E|YiGP2&BFu= zcQ=UbZ>W?Lhw~uvQYP!V6GY)qH`8%Rmr!Y`*9wotieqg0t&&tseUgqT?x3WmlUSZHTb0@hgUb)-uNt&f3D|xQt)wi$FmX@57T^N8T&2ym6C;0>* zQP(NA`xODlr7l*PnzyAoHrCfqNEYXMa7P;~8yd;+eIPLg?h;t66Y$!E{5G=ivrSy6 zE)?87m$y~Wx1psiMlDSvJZ;WZV}BS{dj+Y4Gum$c zPlBi*CM!Ls4T!>?FMp(VpFFT8@f<4?kC$1f5l<|h$;?Iv z1|n-2$W4V7tdt&Vir^J+4;yPkVcpsKaTdl?-bv3;KB4?f-qSyxUf=hgnhkMMGg0LN zw#BNS)uUzw_brEmiZR3rtbJz+vM5GWyR>7SyPC{7(D9M>!j{8>?y%};y!|4Q``2)2 za{Jv+x#*&=KL=XIwgj6R(>>Z}B`^2+hAPWLMz35GO==UttKytWdMm>9u_jrIVJdMp z-^aJl)EaW?UCMu!6%ZzET7L%#PPymM^n+fmmbne@k>0 zzm_{2aB9ZgW3lF4rsu=4FaAzY%}Wl~FUH;a{KHh_Y`t3F?WH@u_KqzdBO4&fFlEwV zn3Jx*CKI+dss&ZtUxi~vj^Xu7IwiCYRK30`rBs%ef8sWzmW`zvxRjnkq0t>W8Hczn zGws=-nmY3P1c-0rX>7GV-(pzWDW|tw-Y4L;)3=Rg0WC?^&QSQ0Y3ESfjQu)_F5I{n zSJ0t2wY!?-cfBWh(zEVzyZzL{WPlbt3XQoc1LBAML>v^9G;NGe2b|Mzag%GiQ!#62 zw(8aM#n;X)EpbKP{AiK~Et1ng`S3 zI5Y1!(rj5NT;)_>yh?wIh(a%bCe2PDk>doYQ3U11gey8?i`a$UaX$el&>MDR=)FtB zu<^hvNKM@AemNnhjpvpUmr`Pzh&$JfLibtGx_cMc-^aBIMROKeY+N;i4PUiR!E4|S zF{VqO25s>2*ty3`_I+a?!#ufhuJ5iAcP~`^5Ic~F|Gfr?6~zA^b)Ag-S0_^S3W7+L zzLYc195F*wX?*wmlUKfe@#;kRU0t4Fvq1rRA5B~PwJ(HFYiuJ3dsxO+#!y~}_{^Q3 z0c+`hZBn4(HH?7&+FX+1TSqd5D-{)1dfh22E^+hb#aYUJEX~Pz^V#$kKz!Rm zkLg`RcS?9x$ixttM%B-f?N(+nt}3$aQ_8*UsC(@Fh$GUMvY!O4hFW-)*RcQUST5Aw z6c>aU_@PWZ6I#yp++;wA_;Kv*2%$*AsD%9JfKy-7z+OIR;@AvupLLK=@e0ixeV zoDFThiZx$FOd*|AGd^Z%YUgbdeX?3!G~?^OB{l0tTtT(#e;fG^sDyS2J2! zn$kzKg{X+}5e(sq!$kV*nv+gk?fF1Jz;`o zK?$QVmP0XIh)$oGU90BdMI%oi&ee(RV_mLj-Q3{JxnLk9%|0X}IXD108oN=ktf8~S zzA=p%?6GS(0X)VP5cI1h-ungpB`#K-ittLFQL`sxMo@ghT5FAL z{vLeyo7(7%Pmo|Q-)!Ra?GhF4(3kYD*AH94UG^KQ-xlY00^BspBb+Tc0Xnyc5~vXc z&`%@&qm6`64Qk|V7UCpPd^r5d(mnFQ&YxOu!;}kZ?+DHRxa92SnnD1>LN|8;KEQqp z9@B#M&r7@@sDpwBPXMjz^7TW1oD3*4w{bZbpGE5!O}6P!c7yRvyo?KPg0-xvANL@S zEyZVD0=Uu^$&eKlg@r5P5~pmz4RD=4Qp8v!)}+X%jUX{ z+Wz#uWjA=k>bT9(O|$;U2YeTJrOQmBHqO36t!h=bZ%;Mu3r(PJKWn*8m%NmNqCs^C zHPHMBvwpwZ_SFsQJ!#w={^0pfmHn6Wt4c&Z*fA$+#CjB=g2sJ=V=#!RL1KJc>LJ*x zp7k9Rk>}2`>5=#mib(bS1X$ifbtbEW7)cjt3JT>lG(I9yqnb#idu&hq3}-t5T<&?c zBWPRhl&l|p|3Z8r6r4%)NKNDHY!2@uXVo(?zT@-Xd~4Q&dG$(oX6CN>w_t2Q8JMNblaRUP00J*s}16->Qd+t?Wq}! z1HE`rv8evlaLW_m&2!X|F)hj|+YSG~3$dPnI-;mvPX51irO8sW!8VFB zKuAY|zFhIYb$=zE0B?VO2*A$o3*&ZOirasB5}DDXzc=OF2kSDe4n*9a&>3ca?JIAc zci52lm5dXF^*X%7?RL%A{;2h980*6FB8{w+;XZX*jps|ZMrR{`4r|{4*Bq&q*&Ga4 zSt(0bSWH4s@XJLjpxjL`gxkX1`ngYGM)gEA9khe zlP=T)DCBQU2%g1f`3;W#SPGY8HuhRQ5!LN<47)tzyDqi%Cfial#j(+r*S_{4CnxJZ zA_{-KAoQSvOEeL$p!|L`T-(hD<-t!BlXhY{qZ#W-lhhkebVDz^M)Qc^@{V<;@PflG zo-bq;_eiD-A4~mMYn*j{_W>SSKv4kYq%cA)*`B?X z{;HPd0VQtt-kv03XULRsuJOyca+tqHY9F~p7w#Ri>D zPk$uee)FCKHkc0Ms2VJbkVduZf!cNow7M zY8OGdBgyd`xK-4`JePet8M@28s&3uON((x3y<=;*;~HVg+jbvKkhh6D)aHjCS>d!X zB^_{5O&)h7bql5E{&jBcMjNNk>iyU7qo2+K-f7m7TYiJg2{crDYho`+;w1(n6hgPQ z7kxmt4mbXCO}){29@Vd=m@?LuN-LEcpTGUM>Uu-V@tsgWJn&l_e+Lw`2~cCzgc=ch zsZ9w=^OJq^m}7MO{GM?j5>NHMIs@%ljT4JaM0@7NHX%FFj5t%%VXweea}7(kx@-@j zI|5PeB#fdEgQt1dKwok-3Zo};s6gvU>;Xl9Ao#X=Vuomdavs8oO@e~vjE>1d(csk< zY1NSR&Er4EKOR^Zv&8Rq)99Xi&Y+&6eNYW5{>1|nEBaUVFEox7gsdY3)}L^SaE}12 z;G%w1o4}mCa7J%@ow1T-8pYJxiw6@UpZhBBoH1Hp?k8#Gi=+}Oh(zSTaZ+e}W^ycg zUk2>QD}U>C7@k>J?c;jPLJ9^W`WVJmFfw4oQNC#>2}8n zaI{#4TK&8hsZp_Ci2Lqxtc0h=T6eEk1hu>y+593|m80g?`YtHu8#gI$u2U3Fg@Pl= z^UxXt?;M&z5~&2S#l%IK`Rfz5V3?t7O}6E3#IxHUgGC2k3nT|$H0yepYj6$bKnTPe z;jA&o%j_}s?Rm`d2I|@c>NTIeyp?XtcE3p6$xz|cSYK9dlLKW?9qnk;>eR_a-dGT- zZ-&kwFLWuY>M8VhZKPq8X8YpJrD*&qI^A0dZU^88v7&fJxuvSu*zc{F-Y#QN>o3a} z2Hg~jCQ=PLacuWScf#1To!26>+#j3=6Xs`K%Hh}OF z0m6JHydBQRE5xgC-OnZgc`@bVn7v)M_r?`IEyzxf=Iz`fa9XFoz53Ehs8nirEgZGT zX7Dx8*)KzIjTXfVr$Brc;A021aymWnMa9u1PDyYO6Z>Ijp!?gN)cL2mh9VQPhSe*D zi!gkV4mef&<_;&o7^pEV=IcxF+2|hAW9D#hODR5FKLmYHQOcn{WJybv?#Kv#hA?&NMasII}7Yx+CT-CyH*IUw0f(XG1S9k(Yt?z43)-~IEGwPIP(ZkKSr6B zKR~`jVC=TzVV1az1=EL$=IQjYd#m;KuPkx8Vl1MsdkarJJ`#Xdz?tRY@ zP0CwVY-ooZ8%)c&TYBfNCi;JRIO%P3Gs<`%dPv#S8$eXe5HFz?N+RUiaJ9#`*V}kT zuFfmPE|1|=oZ|-7OWT}N@2~Gy#Idg67ITnA*Lrg^0*aLCe*?Rleic+S#vw>`P{0{lcwf=Nmrz}lXROC(mO3xTU(j@4pcL8>KceKw z_qqOfRg2FOj%S1~RfOJ=F2iDw*v4u%s90k&(x$pD&-g zrK-DG^ctY)cT;V-nOj00-1`cMI1CrUB^QO?#JMac$8)jx(8k8?9f#qT(#e)~Q{?oz zd~LbK4VDGt@!<9!RZ9FicUDto9N~(5I8&GHo%O0*^ij2!ZDH<@?>)QDX=P*%iI)zW z4Ww6k=EdKjMrCj!Ruxi18&a6LgDdF*a~gIUy>(`{Lfi|9B=N9e>s<#7T+3(1bH5Yw zDLKI}FjpC?g8stVt{EtMc{0nRefciz+WzM-GuSAq)*8>$yd2v*Pcaj&Jy|b-Bnb_> znqcHOIbx`>`O)~m)!t>gL4>D5J>JG4<5J3(5-e(;k5G=fS<&p1bOO+}7!oRq-9N{8 zS?lfI%>80S^LWtev)A)T_>VNXQ7s53v1BoZ+ueNb8=F{xS!p~;d3gc=o=;b$%CB;t zF^!Y=1np$ciPZVk>>{R_Z}uOX3$rPo6s0!hmJb*R4iCey=d1CCZMg1Z5L|SOe324- z(}LARd)-rKsBvG;v`u+;;p^sS1DFtc2h zLtG0GI^Mbum^g4 ziG)P-uS!s(AB>~%-sqZG?Da^2@RH^jaI;yA$4*6+ zrs+_pnhg-ZVUKEvn3%`BRwqT*R!8|LhNkxffB$_)5TQ_<(pB~-b!4kgBKdFy&hKM! z12p4ElL$#|gH*&X2u4Xi`6UDO^FFdWrT*!+NclED`sQtIhconj!T4-^!g%)1W3JH8 zlvrYuyKHZG@ovRbErs9yZ zx?K~h;mZ2%_WVU-YF_%BV&y9i`{(dsgiO$usr}1m`7{rMP^D zG(&+4hAJYF2tI^68YeX0;}fMxJ{}U85Rb|Sr?>wq0=-!A-WLlK)eB-`;xpzqOp zx2~K>PAWaW?L3U3=`3|m^71c)D?NNI;MS31m6v)hJnj38ZRM7ffSg8ovm1jt#YVXa zV+tAc4(om}xT%l@6B1`WFSX~~_`?4#aXIzOm=;|U)f>WI&2Mrv4SL~)tU9Wpq@y7* zp1IWIJzt`SvLF`50wDmXb{jB4JD?64#>gX6Vx~UwQ||}v>ZDvbW8}UMPWY#K9*eZ3 z^_7^fPiNfaf4}SaBzBzn@|xOEE`{X~6n3N!uBaMNaGr!#5Yc;i1j(c}3NVW=G|cEd zR;GKN&6uR2u*A-N!fZhQW6E5Ah|mE2%}-vOh^=^F`8N_Lfa+d1rRXnRZ9|M~my>!n8;f}O^{mn+h?$N@ zbH1cISd`hwItDRKyMe+t>*dBSQ)cPZf^XLhS-6r4YA;vE2(=f_kN}Mj@g+Ym!uZ*J zal5FQbt2^_tkeFLVSen_nGAG-I{#=T^BS9PKTW3jdusTMgX1xip4yepw_6kswuPqD zYqgP`{DwZ>J3U_ythMy>Ssb#UNhMgIsv9< zCn#Tr+)hhT>;Ary#&!W6bd?r?lPbZdR6|fxeW<;pyEuI!#pf+_eNtt)0sZ22Ev0wI zme1PpTGh?yg@(MH3oT?PfYTZ92#?AyC^miJpc|gtCW&+KI_AbRM6HKBu0O6a*$h17 zQhN-ZuCSY(eSGJd7vt>3hE1VYIZot*ixzopfj&3^x9*&3I^iFUSbF`j-;KsS18TNg z{8osLNfn)5P5}YcWeq|Ik>VMq!a$WhnW%WVDpD`sU$m--B zXncy;1GhNTk`HCXDCmToPn<|p-@$oyW%8SP-f{n7PpdbptY%16+c6)s97M{;X<38( zg4jqu)^(q+XK$xvUdqhjvRh;FuKiNQkR}x*MshfkkQRK-B~3joyz$y@_8~Qq>KM~& zfJJSTDJB1iCNEo%y7c)6<^B(CGJL;_{F!Enx*8SUkDkc0sCIfhGGZ*;62mg){nm0! zL0Le9$=o%@6}~O@2!5aogtFt=@`xsRo$!4T5Sy=dnpJ*FT1H0#E+H3Cg!vkDnd$t)2S?+6c)V1iPOE%dCeRC8z_ZMjDj17Caq}x#}}J z*nI`pY(~f?(ynd4TAeXt41H`?=a|L(jnA$}sl;d(?VwF3Wvy!DfDmH9K!Bgvy77Pc#V?5;wi+5(j-0K8Iff$E`S` z8_tA>Ex}{k1e1|Dm$AHw-4EAh>=c=nWOHI%j|X22+>L_p#N+RQgz{}#y?LV7`Aru<-5kH73$XkjbfHd0|663|2a-sA9usriiQo;C zNnmRLp^pT%I6HIfQekm^F>&)j?t`Faom%x5RmsiBG2QU(V^iYiIYvTB8^hW>b-3l@ zJ8s=QIrnPAGug2uXI{WKp?=n8dcUT#1XTdI7^+kfBUdCa@4uf>#13YIa6CgSNUG9m}Ly$W@xQez6HD?%MmYV{QQo z*ML1I+{O06wp$~(QSBZP^6tS%db}ux+w`4bP?b3$sA6j5zGs-4%}P9@z;C|5G^V`Y z{jC+BG$lZdep|uwo4A+S0y>i2sO_1pwb_I>DbXsFCi6|Sd1tBA*=xV8SPv^O4;FfR zw`Y5oEx&bqz3!=+RN|Yyo_nU1tZJj+w)CNm*R_Y-4)@O)n3a~tUy6+Q3^vTF4h<^^ zXTnx@arey#VKr-c>)RHSWqB2O?! zsO%8JVtr|O+&f_GonWZ~;TB#9=dhR@HBZ~3hG}e1<)}l^&Ing>*R)-b9W^=wK!x72 zrS<`Aj=mD0ubryK5PElV!>%>DX*+Y-Br(@uOF(lE_=y!qw80)^TwG&&e58peegc+wzz0x!%-zpE3J6%zYk^KcMk# zM|~+|S3cB1T_5S?VXQn?dQpqjQV)Rs!IqTk(YX7V`433e7WFx1Tynl$=wtmm=1v}A z9GQYbccx}d{n8&?|H1;vh=g7Ixdg?H+}34ib-`# zFOR~n-ReyyIRW9R2Hr|!!BI+7UH*`Efk@3}LJG=he)>TVyq3Pxlm%C^Sp2wr?dWx! zXFyPp-)*5xkD}`zx4Kr+P#^q|CLZV-w~f5QHN~d3EKIdlLu*ZjXw=nOvynk&ay^T+ zN(igxzUpxO5KY7&k{XX#x~{owIKCmzt^C?cdMQ+zKh@$%nhN0T@bw(2_1M1-cOT|} zT>jV4Q9ODf28}(&<`CcGP>1uAGiZ#}32-P2Zsi@>*2E`NxQajF7dV;|y`C3)0=xjh zrPdy(U?V(G?RMyu!4{npz(E5P&P!HpaBu;Ewqu{gvM9lC7_}#{cKqOfaM&8Q$F0i( z9%!rpyGIAwqNAs_sDtvU*My7MD?fBdK7*R%03R8Vy>L8>8qw5fshaR`8H6y9*<0Me{XA#X{BgUs4Ba3+UzX|h1YTf|53rF>(V(p0?s&2%% z+-5jVvid_Z&PbE#7m_zH?A}allr&lH%K;THMM6j6`L*zz#QXXV64}e>h1mHWp>S}l z-XuK(tyH(_>7hq+WWy1nIQlL)U5hC^=T&G@$Fk{r=r+ZcpqQ$NS5@pGi$K{{** z2sV#h+~=qW2`wn6WzT%!$@ZtNEp_qwo!6$3Y@P-zHQy5#-Sw5tu+>mjj47VEanYpu z*f?Se6T05>Y}`wpx(sh!d3k+jDAaYA-%3MHc&swobnc>GJkD(i_7HE6LG=)&aQ0Qk zQdL_SA&Ob0`rPV%U#lt?v;47bBB7&KKWlfq`9+H|Mq>=~?!z(VDA&@KunPM-sz1A) zWm))l(lrHYy^3f4W^44hZOjZdiLO7uXJ_@mk6D6-2m+aClK)*G=ZH8tzjF)8f!eq- ziP(#`!&89+3{Jp*ITKCLvR;zGv)1l+@=;^PB0k;#TA|mmEF`83gPey|fzx{CV}eCl zf?2%z3sJ(P5h)Q9$hzbhFwTg6V2AFia&!4ynEZBCQF2PD>0xl( zf+#2Sro`g$)o`7fPp@(eVKH9cZwNhg5ka@F392N)_YWE%7e&9%AG7D<_Gq)Yuf(`@cXwIfTu z9KnL({zXv`tQ(%$biWf`7u(Ukkj!=CFpr^yna1x1C-*^ibk^6HJ-5t=)S=0rozL&Y zOYBXc9~;BXaqY)s5o0}82{X8?cJ>~LM@F)`z$&{rd;4aOC+ZgMvQN^KEWX$plHTQ-DTverJ>xN)gcQWDw9v2<0LVnkpcX0- zwaFjyz(KD)hzU2upg$ZTV}gvTnP=^c{G7Z6Qa9%YcJvZbzZeNTzk46q#(D@gLKcJz zTi%X?*EYt;BV!}D#_^V=_PFwiB_l8C&z`GktTnAVg8C$Cq%;Gs9`)GJti%I{U?lO% zu|ha0uJKs;7V#`DXW_a`S5sYtaBG8o&M(qYNyeEO*&fPY`7a*v73Kau0)qlHa>x9r z5h2V05h4{n2}0SY82V&Q9^%KDhFC0hXH!;;0;jssJ>SfxS49&Rbuymr75qs-dQ-MG z`kXbtk#d0ExFDnZGyD8!LuOI6{ z4?*kte{l5L@(=-zK_loA8v*;)eTdq7eTe{iTB2N0{YiKk@E0LmS;XgCrO-~$KB$7% zAs-W|!dXYuxfj$9d*W{NkNDhvEu;&c4}WEDvqBN;5jYcaPSlSDax_!~z6ab(oHkYE zjrxK%%}Rm#&#&ql-|q-K3fLfvposW}qHf~~XCsuf*kT43FPhuCa|zh+#~aS9^r|=b z4$8*yWFq9AN11R-eBgjrAi*Ei)whA}=xerk3XE03%=ZqKq}?vQi|6cW;OnGpV{|la1OM=-_U`+&7zvg z9SiWsAm(QlQO9S`fhHw*V!Ld6W{hZz1b5B2HhwTf75*EKMYZ!FR<@*38+PNUy`XxO z4*Gu*vjT{P3NHjrC-)w2!mJ)$vsp7U@>2I2S$cL!HP5jqo@jw~sMyrm_XL;F|6=bw z!WZs8yb2q=Q|7L_VhR6wLeMVdSas1#{YY0^bnXbFOJ5CQ2(l-?t~2!xJ^NC%}Q zgr?Ml5&|in<$k~RK6_u^dB5ws_Bnf>^ZZyp%oWL6YtDJkdyX;gaYud&QkyJPKoKj8 z76f`9Hw<3B(&esGGuy{%eO|i>6 z9ve{&&m+le!=goV9q(B83`wqlqU*k+a;9uwj2@&%z)3?G+Hd;Q&6Bp5Q-qvClB6X% zYY1$_JL42B$CGJBc(MJ;D&djc^pi?cBGeJVc^AZ#!p|6zJdNoszIIJRnQ+i+`AsiY zyE;s(#+UED;`-si3B>g6h)ag~IV)&HOCXjijbjV-0Tit+vFN)5Zlq6<6|3Wcndeo* zgdk;3I?4|~CSEYsg~98y#m*m3`f&<+}e;BAffb7d3&1VN8&qb@`%?3~VZZ6$nhd|0fyMQbc0{ zvN_Q_oFO%06S0>W0&)Kj5)_93px-oFOC5sB=LQ|#M5saWR)&ZCZ2(I!m5TZW%9Aao z--FOjhPiNUZwTOzK6|EbF*FFU5uqk6jC+cd722m}5=oY94`bNwY5$IR0*i7=>-l6% zmyy$J8nkErS=26WyKNeo3v@9Ro9s6$d!=gk(;6fRBTZ2-C0jtxNeB``aUTERqm z$EcOWr)kf>IgeHCj#}p}>qk;?D%g+JJ}iy&M{&hssnW1ar*zS$ELRlTjZ{RFhnZ=< z0HZ{b(ZalF;j_gery0A_+Ca(ScKWZ9D zV=lmyOKrsZcLobu&UlzpX2WHK=3Yp>4|vV?bvxQd zrHYh6wsx6^jAFiw?Qiqx`#I0ok3t>J{sO^?Q^bB~moXk31?Qo7Rg(g7-$qY4-khwE zbzh9{juq^`>|xLq`XHO*^5tuykERZ!Z=Co?WDNOEn=CNM(TM)kzsa0jp+_dCK=7-G z4&X)amOved@+l!g>86#ATvUA|7meM^8i8;-QENc zEEfHC9bzzHZaV{qVz7)D6HjRioD*X*`6H*=!tVUm6G?xml@JY1;8B|4BRL8Lk3M~L zh!RirG)ce1)8Z!nUt?G;2^L!7cV$NkvC1r3X0*eCEx9DRL)7L%XTwFwR z_z4v50=X1~&nfELW=nndZg1aLVkutn9a-+aN*amOY&5p2jSG+LiU)U~g<7Ob=hvpW z%1vELo_5YZ_7`NS5=|9|cB3>Yg@9c?*rw8X)q;ZkB`6%RL~;DrG_P`(W}6Z(r=l*= z-2t!CFELf!1#{^=%ORlS$vtr3)YqX3S=!eCl7(;DP^wsF+Zu@sgsn5Aw`8Xw#*IF* z0_pC$P933)8nF^s!d1u82!P`c1(;%W+&n%gylrT+{Um1g%p)9ueT&=)KmsR^4H0=- z(%=p7umpuGf%ZpU4|E^cet`|w&W9jRIn#&g9U=p?(t#M%?eFOlAlP-V22fmoftrAb z{QLnOnF{SUq;RFt452-c{e|CuN6?4rVzvW>+Y|OcaGfF;QejSzBOM_S!WhkfUV04^ zptV~#(vtdY{K!Dg)?X3?WSUj_mO$*j2*@K&A^OkZm8l`MLsYR>E!)Hn;E&uR0g2p` zR3PEYzcC9q(Ya)lI*Z~4q)Jm&MXE|KpXPbhIt zc0h8?SMdXDpgYtU+L%Hyr7#d6ee&NsF*?+WHUZ6eZj5Ooe!sh%HFfmU>kcp3x6`ao zR2Eb22!=JCyvIj}`d$I1vAE%r3{UHL0!VK2Tw80+YC~P-w96H7RV&rLbN3KGqeU={ zjKjcsMhQ5z@lxaKwolLNa&Pw>y~-+@E`&Qgb-#D`^*UCp>iAwieIp7u@L{8bg__d3 z5nL_i!yg(NYDYKj-P5?YtEX1}?%8s34axr(gDYyhGk(iQXRd5K9eH#1AS^C|KY zw~dco66FfLs=IU2^wHOA&Y-`^KgRw9?1z)ZeoCX@-H20r5Ol}XI&9{3&mzz+Z#YmD4u|irS(*(0$5W82q6isZU||iUu2v1=s>czDb5%O zzbIR~=VUf~(qh`AIaB3)!>#p*dvbA)XxivJ2+13{Vf_nqi&pdt6lRH}NukBj*dk~( zPYjKjVlz%tgI)OQuLhJS4sD)vf5%7@3n<^=PE}#{;@7*ldmheUIUra(x5w7bMv_^7 zYQtTF-`-?dupIO-`Vjqu_HASye0|$Ppr|e*S1TFB?VZf(_0j@Fjz?pY&{fVQ4#SF< z7)9Tjt^x%m74k2E1QxoXk3Yc4g)Jf?W$X!Z(a+?{Z%k$`9afd7>@>V>XH8OoW+Lh! z6t2blq&%#(;ldOUWKYeKp3GQ#WSwOMseDDM$i{81JcZ6a{~- z&DDr)%B_({rOp;{n|zOlt8Y9uJ-Q?n7(?Ff6lTUJbWs^*I_DWi%J)tQe|aLU&&x5- zIdqTX5`&@FI3S&CZvNW~re8FSMSfu0KoW{fle=v$;ek_hm4dD8N`_3ccT!Du&FA_r ziJzAMJyq1;w$1$oBuPwp1G=#OqmBj1V&h`K5^27@FP#=E{fRa4>YXlilNXHdk9$J% zuNpC`EF>_)96PRyp(0wq1r|>Ov|=_wzkWX6&=4K4AQC4PmvfgG04f6zz%kv+(l;L|h}lHB^j zYLB`I*{f^nxt2`*d=POahmnnMS9U4pW(40ti27+QPYCc6$PfV7aBcpAKGC88)Gw{W zLM$r?WVdBZwro%r4<&d=X|BzMI_s#mN)Ns@a^rV>C73Tr3kc^3_@`eWZZ(%uiYDP8 z1YM`5S@BuCrHM8^j@`90VPZ==F{+K0da+Y1bTsvyy*E+2s#mEL^e%v|z2xb;V=ZXh zR0qJ(2&wUS0*kXSk=nFCE_srv@1YUsHhN=bQNzAAQTNg;zFqi`YYl)|!zgS3>BtQK z%FSPyfw%2K;u9>_@AW9+f-ASS2VoCN1?L78tQgcT(&xC$0~%S48>BokBkePUKga_? z0OO!9&YBXq3oq~}>lZt7M?l3Dqgiy^yg2=tN}FbqK>dpQ4#@>h)4~~!xlf5dogNnf zGLRO9I8o!<@7XzhncvZET6h~VUcqgjd@8JpFRa2Qa9dE(x2HB%KeRQ>6a4F^ByCfa zdq1x?@y37dh%~yn(!zpm*l;2%!N1ZjHW3;+wiyAbl8afYN6~;M^*zF`c~Va#CE0$W zyZAEU{4A$3FXQpBeIZV|U34GYcU!E^CRiici%`_%ffFB2wXX(G^GrrFWtY5uS=$({ z=N6m#=q`w_$2EwZnoVP&eYMcedmqG$ABPLoPOMtSwitT)h>l*^upXV$m&tnI=*%#k zUj@)N!JYq6L3S9sXtv=;R;CTp&eag0yqqkss7_IWiur&bP z1&zpIB0;e6@(T@J6{=*BuFT7yQd4uC9Cx~_uMUy>=k)~SHsB8Go@2*89!b*0m0fuA zjL-a07+{+N1aS@s7J#{dgGH+|f*lIG`lC5~j3=Wuu*CIAV)_#D{K*%3D*d`sDl2Vd zV8&b`sgOam&q(^Z0S_+Hl@2FQ)Wct(67+acCe1wE8#e0jG|%(|HOVK11V3C{XGd4P$m*)^p&Pp>$$4~O^Y*s#rdwheBB^jf*-^xjsoae-kh}_E( zV$_Y?Ao6>&TUz!sW!V8#kX4n;vv;gXdRs0_gJ9w@YLYiNDiyN_rzxl0J*z814-ggqfM+4P)HkbGhq8KmOqTwu6MP zb#u7u@gh#e2=a0;_dV2Z;GuTBOo#gCNHB;iXl^@Zy zb8TD&VhR@w(6TI(g@g16uTYCa{6QL)n|{`ffo1(u_s2K8Yx)P!X(z@#OKkh6^CTon z6p897DTNvK9);g-f3TR=PSoPZmk2(RDkg$JQu~~A1F(S(nh+^$LDsgNCSOa2N1`kS zZ38`4)NI^Ze%!l_IV)ZHATi}pSMj;27ZhG<9NGc>eZ9v_SQ(gX+Z#g8YhU$G%0X)7 zw+<}t5IzAf1^0mO>FX_)k8$*&H;+Nb8Y3br^Q_Ln0 zcVlC;HT%JIKWDb|hu#gro$IF14)FIO?9|3`{+b221I32uRJSd=+rVQ?tz6swlEU+( ze!Z#iarh$h4dP&6JSWKPD_Rg?4+%lkhEFE@6N)+kF@K`Ld(n~a$}=8rY6XpwcHke$ zodTX(Tb1{ec42g@7IMb?X35Wns&v3AGWX%TOr^CXZEV@aEv5@~#qZd@ zCh!1>xD3Qro_j6Xd4zOlRWo(rOM-9)LhX#*J`2m0d>7hhsTbeOnu5;!ev_E*IBFd_ zyzNwI-@`;DA#L14lzV4ls7UIoEG;s}~bw)OJ7s=n&AB;Lo-w{$p-iyz!JZU>CG z89}DuoODAZWLG9noSJG0$*`Mfyk?MFd+wLTLQO}_w#T{f9@*6!- zmt?SLEsc}!8lqQ<$H{VQ1HJ-^Zl;<7*RQ(m===WYNX)oX{rcv)81m&9&=SQKi#kcs z#BZ*?4D!mGUZ0kG_fev@CE6jpeTk!->62QCU|1-Vh$5b$3`ozisc}9+59=g@REmER zKBg&69u>5QC1m7{Vy?| zw`+QvpYdAwmd7_XEv{uW8|0DvccA1Yeh(crPlrD<+M=0vXUqanjXJG)F})pmjg)dJ zilUTj^DzlE^#o^Vf&7s@2``~+8rNV_y9<~eSqZX7*VHy^vc=)6(q;%JmOQm&r--R}ZcXQIBqqpBuSoWC(!Fj{UtbT9 zq?gbcy-KCms~)aR4~iAK&QwvcI6GJ^`QU<_dFnMI20hUO#kT-zdJ=}{gL6)*vEv2| z8-8R`vxz+QNga@kxaZqIGyXm;=y9`BYf$y znkj$E=gyv2y5FzpR|Rt^y%>JvX$i&~V7?FF0Fwy3swE!WbItA1L>(Ku)taYlK5ju{ zNcL^M6yR|0hDQsh@1uq@L5Eq`$c-@ab=ub*;O;xo3>H79vqA-o-{$O)U05$y^mM8A z=KGj`F4>a)nJM{>EluMptruD2xXF&og7Q-y;}H~5{)rU8OV|piMVof3i_sH%@ZH6e zLr|^Kk4yIJ$#zg6I<$pv0Uc?>K0-N(oq=pn*>2XweEp31k_44vGIJI`d^q=k(e#O- zm$f}7T}G*sg-uhD)sLfz?Cas-xU2VPX0@xkWLz(O`T>MUp_{ylc;$EmHVs;p7OyBB z52c;y_ZEmvonO4unlmW~WFHJG5egeodDCc3;C^4W2>^jY8K7??_*;vjfIYsi%-L7R z`@ZwR6-@EtPaZX&S7twmoJ+4RdaV^a9F>^c2h=EoKnx)IcgG5V849Gf|4tX=*ZAL^ zApf0C!2dhkEB&vDzsBfa9GRj2HTl;V{mYNh)L&!tFF!_q@-@zlp}YXltSs7`@Ocu8 zi#`56c7M2@&=)1!LY`T&9{pK=FDWrfl_fgLttgp4zTMr<9z^|v0O^K+V3Ll#HezE} z&zSig1#c*!^V^q={DX==(4ezRbjcv``PXJ^(zb~bl3<7w3Dp_6j6Ol zl=KTkRwwPOn>FA+t4}PpN8TOZaLenunrHVa?F`W2DhMra{@w2k9aVk=iUi{g!86Ae zi62PDzVkBXI6~h`(TFKicDYYm_v~#we2cF^m2D%9+r6KF?!AMD4by4e5{rMEXL=%; z543Y->_Q=cU`n06ARQHZYROK{|D4aYcPEQ;bM-`CSLZQEK5G}m9`S=x{|0it)DuwE zE@u(HOt<7%sAT}agbyxWy|-mPtD+eJ3Jd%3^qBMSyhTd>GUQTEqX)gJ*H?8=yt`8=!f9RG7RdEV zfuyN8=vxa$B;YXp>umhD{T`43px&hW>-wj>1IE8|ep-p`1tm`Nrkk3)L*-RPDjrv91m8z?An9jYv zxhAz~+}c_@=DMXQbjz;3t}cE#^C7R44*#hyU;08gkLjtO0KphL48Ln)88RUc=mvP<{GNka5{k)NqvWQO_+wS6LqOsbr1Ip zPyO@*ptmoRW9rp&tvRN|H6pC-vC~-wpoY9UsOa=o47wJ~0C7f!AZx{oN}RxqL8dt( zA4f0fZH>sfW7%~?-0oT6c*mE*LQX=$;bMpm0n=&2X=U8YX}lpxk0C(=eaDMKh{>Rv-qUMgF>%J^jH#X1;0&{wp z-SZCAc+@Hz5l&V^;2%P`Je}T>!Xwq7j0a^7a5aKf8Sep#(JEkEg@;z-JQ#r0+ z#Czzp<*e2E`~@dF9zRo=wGU!5c{0hD&n}lr)64nYx!XArPu8b(0k+zY^iT0Du6B7u z?W_@Q26LXpShOFx%@uSb)$A8{iyppDd{f5Y>d5@5BN}`g(Q(>Xz>?H)-pJZ*?~;IE zh|PhB1__)Jya^n_t>|gI$-TGZ68-bpH)+UIpaA7g!}#VR0D=1EMdRVlk9I6w7v`S` z{}#fj)lzL4`!Gi#$;3i8_Fexu_CbUivTE)ZXw#ZdZS6>OBT3_2;)Tb$M>UIGnp@J& zGS+>lHH|7s=U5kvmt?qxAFZE|IU5WghIb-%VrQUadJ+mylW&(TBS`0G10cx+xN!s7 z%r~kC0<*;7DXnCsBHBd<`Ylww}%j~0%1<8%dIo4Rt#Oe>o%HgEd@(+@~uxnwm56Nne zW4JCh@cFZ)Qk;PaVnX?Yn%O4gj26`32zrnO7_OdoJ~;5~a1l@NP92szTyAKLS-YP; z%p>W${9qyWv0*C(pu$5F;3E*;wyVw%di3KVrkkZo*#~Fp^Sqc1)mEkrWw&fEe@?9@ z&V1lno%<+tw{u21mQ;rYYJ;VFRy!g5Ye>!@`+{lMJ&fjf;lw5nSxhuoT{hn(J*C2p z#r)s0?zYi;Iy(DhQ;zOi zd7eK_OoEFDcPBno{#|S$EI1H7U_56ER3!DI*>GV zILX)gjaORqku^=AH5u7m;lqWGlpNjZK(DUvLVygB+%A=qbm z4VRBT7%wMV(Fms0Z>)*x-KC!^>7>}}7rsA)-@&s{3ISvesG?|~rHi8g>0@XF;H)qK z!R9wJyv15Zxv3e7klfXexrBj}g=Vg2`5{y+)XSdholkl3vv!q}ZasjJ!rq1Jdquh4 zrbH?uKsSU{#*M7>+{E&mGh$2+Lx+M6BsazH3YK0n?Z3CkP!Dh~h-rz%zKvzF0eZuP ztOt}-6U~yTk#`%L-d0+SZZ2|ID7JRzt4>>sbDc>@$+&cu-ND$_ODxl-8_v{T;Dc^I z))DlGeg=ZAK-VdE17lRN0JKVA@zHBhmyeOPZyQH#T6I0g^QlF-;nL4MF}3#+xyX9M zxKR!}{}AxxaP09|FeK?#YRKB+Sk5)K*LXQJz-Eo+{OA1-0pmb=iVf76dW`xJ{kT=0 z*oogt@GDqnS@;FwCAkb*3Y5I=ce#2cP34>+k5Nsu;S}DC= z>BGPx=H%0=@c0LsD9xqrOULLM?wOD1&@-2|g8D#UKtS4|s38uYIBS421hVy7WTa0| zY}c8S-fvw@sv8pmy5tjO%WUqvkn?P^;hz0s1d(~~ORF(U-o8T4_H{VaK&{ zKu*KfZ`YGu6D_Z_zFp33zP+o7mOm?+BvpHNuuEFH;S0}R>Aw}e_V0xS{<&zhA4p{O9)~2c9_iHR?Ex6g=-s?ZqV{16QtAp0Y+ML!sYInthJXheGQJ{LFSb`X#2JoyR z--b_H*rAWX=}5;GwWgp&;a?@|A%Pr`O@hj}NQ-?1NW%^R*SzjnK(30wqr(ho4 zo>46~3oM+YTDjMlR_W1n9VNBFjJNRnRe%HVx|`B$cKYUf-TN9Jjp%NG0rg&oI>NRe zZHEc>^Mn=P8VP-|b`k4lPc4Ide=>gv9T9xiDZBMBl6C8w*sV-TAGHw98stNLiFS^~ zOb=k)lf_Zk!6$1gM@w2~2RvLG@>@4kcC>bN=vCx7v!y5@LO-rhh3>KE0C^4MZ~EHt zwfS@SIIq6_qO8{OGy0wZ^5;VR8HPtR1*LXB*zR2XcCy#&z_1$8AqTPj1&Ttl zDH;S4Q%H+0p0+p?XNM>^w_kf~cf^`j&dSpMlX zaI58!KPY&`smC@Ea(r?SgisB5_X`w{eb+}p&-?sP04tJF94PyT*On zXOdso_FoW!g`qFo6k`$vQ)5i!$qUZ+olhou1%3c0(`Cu5n>J* zFU||Tet>-`!3$)GCtb)FNJt`#4-blDOj$^rD&$hU-_tiRP-T~x=Qa!F>nF=xcjjfjv!-T8+rgAYdfFZ zLt_sP>^!1)S=_wj#Q}9%@s#1=o>H~G{fW~*QCTg;H3((1PN*RgNDE|V!1>*;E8+XW z!sbw<+C|4gn|WCB!=|hu5revh!01Pgx-U&vOm4mRQyq9)R_m@vWrhBnhL^azDXKoL z#JX2~iM=2gPqrXA45F9=Hzndo<2>lTKSK^+ql#JJ zhe+Zu5gM}sp;4G=i~>joi)OCVqKn@#Ur)OpJPh9L2gdO%bf|%HW(iEvh0BAFd`1v^ zs?D_UAMe;!ZQJhvMtp(0VZHB5llN%tnQiI7PvpZtA>Mv|hOJm>G9?Z+(y`@hq zzfBk4aWNNli4BZ3fo7~UBqEorJ~9aS{{j96G^;tJ;5{hZSr74;@ZNBO%R<~#o5C2+ zryNVm4tuWd5lZ=Jhl~tyJ8@TX{z~=T8mT=6En*?f9M?{HNgpd$uGGG#K+f`d_rt8g2@zOiY3Ku*f$*cT1=pdQFYx5vd43X=3?aqZWOX)Moe?j~cbejnbvrSbKPWZi>3H^qSj&%F z`a7?WJ^spTmZbyCxfc8fd`K!ZLK%&Jb12H2dISMlJ~O~#QMdfH=y}>%15Vip%cq^MU&bjsu6_G*YWpt$*j{~gBYFMjf0Y0dnjd-=P*tN-GB>OXph|J6UE z|1-Ju*BJfNatQh%xCliH-`6?Bgdt7!qzP*ypX4oD@rfrk>gL|lUiE4R-_r#plA;N* zKx^4L!d)5;V=!KbpA0dNa&@&+Xu3P^yce;PN8LIGZ?qlN(A?J@th&(6!Txw* z{Xt{uCHVf_x49(M%~%JF!QeVH$AoIKpd6WQ0h4qvZ+12juSAu`{Is9jMkK8xzFfyp@%DKxeJ8cy>6~OgXf$EC>mG`+Z)CuXQ2{Eof&x}WZ_H?tV8uvLR zx8S}vQ{pC}nUciwbQbJzj|o-V#z31vveSeyGe0#nK4$f32t461RBxE?WD{7-Xmjj4 z5ET^;L0OO@VhC5h3U)YLeJf+HC`#M^abP&S*|Ea)VP~~K8a%EO(V~?LtI@0?$VbYJ z9vF=OR&!rT@pjL_zIrKq^Y|Gi#bG?C2M(xgJFc~f*jNMATMNOILfvvDXQdn28+rl* zjmAGd)?X4X?`wtUzW=n?ia15^U>lJB;*7Q1{=64FHUSqnMAj^uFGqLvRXLmIU{8dAF&*H=XJqh)QDE#EmRBTfS)xNiwaY8QGB;|7(Q zI>0a>KIJh2%*s!oyjGHOMd=qPu!43G{(Gh#-T%rgiOL7;&LUEg95mU77B1XnKKV`x zdV&6evCS%68s>|SVCVDgKdC=Z^#9)GXvi2*5>tlnQT_#@2YRLozbqY(zqU1$Rg9{G zxI!a^d4?4M3h5>(*wMvh0mD8WeymqCW@a$X!_4Fcr+-zW2z^q1j?1E|zGc>W`o_lN zz}V<-qMp44bKe`8OE2rGhg7=8sum@5YVvW}9jT95T&40W_C6NV&MVxnvWeNN@B%E) zpr?KsRJycrj?0v@`>BmuHkwaO-qpBCBT55LI5RpqIfj#uOr7Kmznk{y1}7NP|I=y= z=X|;MF@D@4sbr|sX(mNttd*u!e!Mk%P5-W?llyAtxEW%>BOJk@=H_q|8Lp-hSYmPh z+#svW6HyJcxtnGwh{(@LO%a z?!8OiGhz3V-rUzKt8_@2CtJb(X!8-ui5Z-qOBotElFV&O$Nom|HK+ja^*k9Uv+sH+ zgkAtQ0fp9O7SwVf7lI+}Bmhc^^#N5#RRQY&iM#1S{NRIH1oJ_bf`LvrM|U7r0QYzx zw$?YI#dYYk|M#o#@9Q`JSKpogXFVVNA(dK>URn)u`~`ZpO;w&T`&_qgwpj;MSF0{U z$dN$X)9E%7)OH)tg(MHmI5=b$1AF786;KL9|X6u`{|SX7Cm_2pPErGC{DT7 zPDfKO?E@>WT4|dsz2a~XxY92sY#y@NHwplgMCp+|b>X2tFi%~UPh)atz1_?f4P=}2 z@Y~sJg$E|5;zG>5#S5t!XeVe?z)+7Hr1KZ(jN*4ib!kgISz`xXprvj6$R+z57zJUQ zD`Duwc98~>nS3~$4RCjl$4m6=ioJ@)l?O-Y@rv45eOf+04?B^Y^++PV|5ZLcf$xn% zV*oFux!P*1?!o)uCrc@}Q7HYowSaN;H>=t$N@lNGH@9-mFAU9qab2XXQ~KRgBQ`Mj z4p!`I_M_-WmQDh!#U0AaoOpc>&s}#xvm*HPbxDGJADABIlif!xadUHO^nq$@=6yPH zFZD%N1+_5}bO~m!DEEsxu)*Sp+I|&3%jolQTet1(*h_*yz8}F`q0cTN+~%IR(JxAb zDb5%P2P=IQDDF_>j#!@a+PE`i&41|Ty2`p^m%NnOY-+ab`=ib}V6D>ry3b;Gag|5u z+~NApb<}jiA|eLPwss`ni3sN?irnxXU@Az&y;62nuz$tHA$@|mq%m<s64P~ci+-{`CmUZs$^GO{Z%xUHfwRDiJ^j_D2z zNb)#vQ*|kvHm9WI#z-GokWdqDEY|4XyOe7U)^yi!l@fXDRPfI=i9Bls< z1Zx2I1m#8XeH!3%F&11GR0e(j+m1idEK|8VUKOX_V)qReF(JGBn(d?CQzdN9Oz!uF zDVG4V)p!I9hDa!i>VKA8xb;Q^oNXpeF($nV)HdohxwnPE6az7m$e8qh4)7lbJRH4= z`XbkL4jxpUhlkZ^YH=ogIIHR9>1sand4!u+)x1*YeGl-d`LP(u!oNZC7$p8KV2{#? zpEUF!>1-kPN`d)w;|Jp%3b5~ndIqVq)P5jH^azmRJfRz7<0I3Ud`mK6*bmxdBLGQG-Kye`e+(e^puh zkDG==aM2)Dd|wZg2}-)slllwv^g|o8t&v0X!cJ0mw@_u|Yxuj+lZ*tOMV^g7fHQP> z@2QbhIEZsQu5bxs-fQ>lZOacHuihJL&+d-Zz;>5TCYe|RMy>hljwQ)tNiR1j6)jD`}+iPn) z^zc5QU(v9}gQ*&TM+*Xr{9M5G`x|j&ARmYh{RJwPr<4Hv9ph2tFOVU62TGFIDbqrj zJUqzL*h6%8AjWxU4*)SBJyjE+Trr38l(UB>x#-ez@(3~jf_sEsWBCP=LJ(ij-UF*| zo03L5NhuwHPM8M&7-|I*EuVU}Ian*FPl1K-~=>`;jl&U#7# z+d)4ocfIMsRPKbXvFv6KuHS=uF`=3L!Rr^<3sH=Fv04Zf8nEewCc>v6HGbV>k7Kmy zOxB}U8PB+iE`PgeU!uv9Eki`PR$0z!=bzC&jbq}t$bfz?e+rhMMTm^_Msvg5H|6)< zI!p=-=tq6M=MwmmLwkMWb9)SEKDQB2zeQ;r8?7_WbrB>w`4HiZmn=&W?jMBv}uDw z=BwDiQ`B;#uZuso`HXPf%do>?hPPbzR@Npv=eAG|`Y;hbC(%bydE?0;(mb~ae&K4y zD?sL~Sn<$#UQb%$yWA7xW5(mkse_?x6(H|g(_mU&(a+bh@pspxb)%Vu9nHt9mRPIk z)l41oa6>Fk{7+mgDr@ZRi$3{Qd^uq6V-Z|Dru`^?^;Iq12+*EkEx@NIW-ax=Sl{83 z-Pydd+eXhVVXDv6y<+SmYVy_!deeeWEF_$0$uKo&`uR40@hV-3mL1e3Q!ed7SIHVT zG3nYYx6{4LI)8+8ds@VFwA-sNzSao<0cXO$nO6NauKMp@T!%<9oQ5GHtF0@MSo8@e z;?Z{ZDR+7=K|ihdLZnM$?%=bi&s(FH9t%1Tye86I#w8h$G z*md2u>8z`=S34)uF)K_#33chrlunzUyNrET>8NtX&ZZ2Zr&XukASKQL?g@_Kd1Z55woYvFS9fHL zi+}E3Im3v1O0ONWvd6{)yWiufHqSj-UYCw*_pNSvwP2=x+18=&?tT%X3|L?zu5hG&w$|K~o0n`EXnmOHT@@9?>|_c^y}^pykCxZJ4lrq_>wk+&}h7b0&AePi=GIZU*93aJl*RBs4#e`p*Ln<&3J zR*86e=9bM(&I<7kKEv0a%mfI1#?VskwEBSX=GkwCLSN+HR^RRz#$vIRIt(FlBUS|m zuhh5-ojreKrlO0coiAsL)lPZpTw(tyaLM-2>>ks(GtWxP?CjMYzi73M%aA@EQ4NmHv(=$s|VM|?}*cCU@No=G{;GlpTGjl6h z-SRu-Hff+}NI9Y~>C(@VpZu_zFGwG;q|R#vFS6dT{_y$+G;&WVMx`R`P}6xGh&ogk z7hyZRVrfi%!=5{!GV2Os($|f1&$)WlK4lB`i8Cy`zExeF@O~e|33KTr4g})dEXH&j zp4>>ajx!{_F=C){CFi?XXrS$yQ^OGq1y7g4Gp8S9Ue>X?&cU{-7hL%?)2{4v zQL*K;?&9&d$xOnT~ciD;r$+BQEikzb_;6HFc*< zp6DP|T%bcMezMG|%(7(Kt~N(y7;vqtVI5}J~TF5@E*m>{N)PP?qpBlPgYUB;$TrTI(vl;s5C z+nfel^^C;avpQa9we6rSSzWfzhD202>BdG(WGgE?-szXAB;oi}%;LjJfEF>Y{Yx*o zObbmce5f0jU1>h?B3fKKS^6Mi*sE7%@7<})e*qg1$p0I~hf*a~z5513Eu_V?h?K00 zbWOIM838+DAD4+nag0;+Tq1U{=Lpl&O^!1?UV zklG}JSW0+#sL3sRJs$Vvt8|o6k_b_nfNu1z+C%-4+Xl3CR>#Z=Jcf9gWKWPFb`w@N4m=1aY7($5M-Z0@!CTSKlqh5dP-rPU#~&U2;8mSa;ql7&tgWeEk-c9f4nb$ z;nlp8`ufK9j5O97vnfDUA$?r%ecdlyu^0v-3>zfoEQERW?k z*~n5s{M2ICt8Nh7e1_tWVX;(86}O^5C)?c#Q?2>z6t_~{eWO4#fG@xsA)|TFRfvt` z1t_46J}&QG>*N!St}5SV-8k^gbZh2w+$ofJ_IgVDSiJ7Tc#S1oj$Qz!?BNay%KE(fZO+?=21M$VPV~n8jm=S zqVcPnR}9?l>nO`uZ-lpubf}l6s=jnvmCp6Pg^F|Uc?ACo!2{K@k!U8g{h;*1P;`rG z$vg?uc|Gu()4;LYuJXqphv(@_-w}mw$plkBKK=n{^{V?Mv@CU$|TWir{Mq;6`GIJ_H0*?*} zQYif*EBmB@Y@TJ_*bp@&pK2FvW_JN(o+>I-){tz0tU294kSFp|+kg^aN2-~*a;9lX zg~ikB*$Uj;4T)=^kPmZ*w--dA*Dqcfkd(`cl2Artk&uSMXz~RLWJ*n%Am4cebh+?2 znrgQ5tO;(rb}nX(Ln4*;`|T&QNvNhPpI>+Jf*E|+c;Itj{5_#7xD{kxzkSio zN^_TnI}m@N)T~^lwy(($gV89FxW)2Uy1YN=jsVX7#3^bP#f?ye6Hh3o+#!uDU?L$* z8(J+!=FVnA9@3v$=B&y&jz_p4v-55JJHz>`2a$aMDkoVd%@L^US)zk z?r>LqB7Y>SLTTk&FK5Oh=6Jz%5m13Y^V-at-3@euIyI$%!g>FGBel>?QC+j$_rUjr zTZPaF^0rd{hli>50{UB*4_%v*2kF9=5}2t~6l=09EYBD}h~7YAEs-oF7k&NW%6;j? zYu8i8{AEOhgK8AGf6(i+z^aoU`IKaa+oi2FDsL~DmIt9ccd7GR?4+~|!n9z4FC z7NEZL1++nD8*>ODdID?T8`eiGqo#X%MAJk_;p)+K_2aT?5(UB8`fkUS4!qJhs_dmC zKJI!|>474|8gK4Fe)sJ%PQZ)Mnn?g~`-igPfgj~8nD&R`LIU;q1Y&R9?*=#xgV%xb zI@>6;0=Dleq*8xHFvB|k**R*2sVt|BUFhhNHXE~q{)-m6&?zkAYBvZ3*Sk$ToIkbZ@9Bk&M; zFx&f7B*Fz138^y-myPDno3{SU`R1XIEVJ%`=qozr8cW{$#|6XTOrJo4Je%sa5}QEL zxkt{rqb z#0(46x30JIqY`N1l)Kboid9bVQg#31M_MW2Jy~r67pWndX7OmLiU|04W3U?9(dt!aCH{3)bLV|j?rfD38{mXbssruFGNbL&gOzh>IbyDBc)4Q@x5UnOYugktlFZBbq9_9dfgMT(JGH@+DnpYd7xl^Sk=j-#>~`*hc~V zv4CRSx`RzRLc#;m0ztaRVitL-LW|tzrv4?*pc&otB-X=?UZ{er(a*J5THu1b4N}mB z9~BJ&x=Q1X<_!C6^3VnVnW ze)sD|;P1+VVInw02T}lI=uuKT;NkoEgVoHO#fH=QbRBZj;|yM*{Kp~oKIe{M9wR#L zYKY1Ag1_lwhkDK*n?^_PTVFpiH%p0esvXFaalWg^BEEc_$o1dYd(W_@x^3?}G?6CK zq!SSokS5X;kSIzM0RibHDk{=JK!St>klu@cf)Ei9q>2QP8afKnn{*ODq$hwOn&P|e z^Woh0-skMI_xn80b?x)PPZAc+HM7>7V~#oI7{C8s*7hO!jw`aBKURwgk6AK}{%%xe ztPy0V@*&J>hkUb{O-S-)*WMioU5L`jw1GBD_C*t9y8%tukpjRd!jbUfBV_PbsvqAzC`021Qvf|J z8@clPIsI|^bF3^Y)*i2O^E-ipPyJWO_EXKeRd549QBHBX#%aO}f)yG+xJxWK1}rPJ zq|C|nR~#u#U2&_v^^evB?>9gw~-QZuy*NK**YuCH|=$#nL>Imyje zoC#XiWEq%u=VJXW$a~MahCqdQg_>g5XtR6C+d7(G#9yEu3aiVcg!Nnytor74NOT}9 zc0j+(EE69A(kwoWXNu@h-Z24&LX$@B_BmONjrY^0SrUmgdX=D=!gsgZgeZ>GcNB{N zJSUAc(U$=2YP`3_GO@2R!x3(?V^Rnt&+&;(UQ>_&vu5Ks*QDXdocoVA4MzG#;Co8~| zv8J)L$%3>|4Y3M>b_d&RiN`_Chbj-350SRZ^>-N@w9?+OepbtP(9;9pPEdFQB%r^X zj^*!$a>5qPP!{;ZPFed)`lg2V!L#;8e6vH09=$QW)6ZTXnA;05^ZnSx@AqKdMWvI^ zIexRo91DQ*QvAo|ygkhgjk_{8gA}t*HpFym=vC_^RMpzrcmoP z46+8*2&Urp?!wY@TX9NJ?I-aODT7^8Uw(mrytljFGyB8~)H0QM>!maYSSQwVd*J1h z+M!twkI0@}S*8z0@fUaavfUkOdcGB35H?u&rmam)ph5mfmefK(NK@?)(PjveqvF85 z*v-%_Y_0wSIt9(oRh}r+&mh~tUi?+h+IU`gw+aw4zm8Bvj6!Pl67iixe|*tv*b&^< z+3i5P+GnGSop%H+f&*j#VX!*_bMKzMtZOq_n*nKG1g1khZSV{Uo#;u+_?%7vUaG~VU&Lv|pl)Za#%|LN}Jzno;02Bz0mygZbS(u-2_DJbI;Z2LLU2b6f; z20CQ?unxlY3*@mm#0TqtQ1sR{Td%01>ky==oqxLP_>0S0-t^cxvEI~=d{i~kFHjp$ zh?%og;f?(TN{~m)zJ`U5+RJ`;bPH`EV^JG@w)3KuNEt}~6ebINVjcPiC>&CkPe7mw zT6!Z_ni@hNXRT%}hAU?k0dR@V0BeTTPTHwzCIK(9GZ9!!!+T-;P9)p6q`)QZ=t@_b z{G@00d;rH4&+URS`0Clct~+@T((ZvbNS2IIbJw>|f(tMlfDB{U;=A6^R&f#;TbuE{ zC1wn4F}~c;92`pch95e=wSVDi?Htcy!a)^)BEl>I67VFM#a;+MsUHV?2L*XKm4^il z&6#}rc8awhaWj2=GAu~~p@zqT+MKQ`p8%IY-}QFv&KTibwnhj*T+S8By{R6JOUhBm zDwuT-dYwrwc3YzB{YD;d zGnsF-@A%z#vk|YthlM=tA7161N{jF@5xmNNM8+u{uvS$-PHH?JN{veaY-+%KkSSoo z1l%xq3-GLqPCdypf5HBtCr9QB!4JCo73dsWC-)@{xaB;Fpv z;Qsg*h^tkMVt8V-H8rrXzfdrohc{4d?2}K);05+|rL&xp5?sSe3x-oQqD+Qp1yx`blcJWhIQ8`a_X z*cBJQ^#pE}b<;?qSJGTlqj^)rZ7?&qe(APA&;^G_Rm#L*)s`yw50}qXLk$mwRm_=LK6>>tQ!tU$OLtO4oML?kE`B!lh z<&(qGF(vF*gL*Y~mv|;@V#M3NMv@mZs_#cMEO`)&r z=8=;sMS44JfmJUdOCQ9U0@ElO!1eEGhZ)sH@}|wVppDGkfwYNsrXosH(@ys zO-B+X^U;Q&$1!dYF?S?$vjh%G()E`e&~kF0dZ6~gZgleAp7UNt`hc@$!O_n#7@0?g zmpM1Bw*eE+NUA1X1^xkq2tz553PW7W)s82h^HgdZGQZe;tS)M{I!xuWPCr}sNitW@ zMp`0aY7m9Lmi$8=xZ4&q8A!2RuKIRpK2{zOqOoZ>jl z84U1oZY0l~@9l)V+fBYVb=p>VY2VE{o=Yo7GscO?_x*Dgy}#LFf^{fhZ-o*38)B-Y z+U21ciLTko!V#>R)&57i{Qyz3&-LfSA&IAMsGCSpFq#PQdD1NL76A$<7-df9kTtuw zJB#Ktl?=sZdWf2{vSCTBo){)rUmqg+C*Y5S`%#3!N09f1j<{x7(ex^CHc6P0`;V)0 z%vcG`qE}D9i&A5L`F4FYR2zs+|Nl3`|BwIAePhp z$Q<_t?-HuTf?qaFzf20mwy1Z^+^bRToLRT>`O-F~QHqYbzy*XHZ`uoz9Jt}VMvmZaz&HJ#0 zkL$7}!#f7P0)UDh9j(nq5yK;6T?nWMINPglh?9-`@NK$FrM`2YFkfJU#v-^z;g)=L zHzX|HM{RXC3GRI^=~fQQ{V?=oZ5QK`94eF-{RZY@PIAHK3`ppn&k??O;4b62ZQQeX zp_8Y}O8HFp!Y%q)J-;xg0bP&}fD5(9_jl6-tMR7s%@PHh2+=Wiy)ok!AjafT@%iZ8 z_`doKA(g%5yRo%;6O!xy>2yG~D`~n@*VtEC#qJ5QMtQRuLa(7lq$z*p93|Dzz z+;?o$H-*y-8V;?k%OE2VGkFjQ>wS`?b~2WeZL>bM*io3}fb2SKFsvKo8~9|^@!G}P zcjye9Bc1EPBY;@OzW!DQ`4UhvQN!Pc;iO2{h?pZlf3a{oYylI#h6y1F}P`QnYWFqtU=|nHEplFwB3I0_LMgu zP4Wu_c(b7pMr~fG;aiFt{zNRcZ2eY&!xx(?Or7EzZ!B+;Lu%qSnmzGrfZy0vp(YB( zsYj_`_*{vjvAFt)@>i`<7sH=%pEXG;#o9(KDTnL%7(X7r$$TlFWZ$XHKP*p?#U`E^ zGZ>LS-p!HtlB?aF*TYacrKdEmFg*n%lD(?Mh4;qtcWO4}Ud3X<&=6Kfr&HZpjV3SL zoh7T^&T-8wsK~wAqmz8l0%$Z~fsTw}d%MbPJP;Bv3qyi&ZIf4=yj2g|N@8+=?MMg8 z*GdHfA_;fU_yKexKaegr2FN*kWJ0$3jV|1NKYdaDEHzKnh9LexL562bGpH^Sp!yBK`D9RZNT=~gT)z(B zM!@+BNUx3V)CsBz3wYg+HIe%{7l`6KGInRCPF}Zv+ zcg7%lo_Xco`5=!xH>248||EYe+>Zs50GZNH-kwEO)xEbG8um@bX=*Csm3MxAAW~Qj{y|}h>Tlx~!RVVOMTfSsD7{oTY z%Snu6izPeiF>~uGRVP{SBwf{$WakR|c8gxqdhCz2#*DzW6xco#ugJd01Lr9q<+^~&hU9{O)8na*Esi+Au-Q8tAAOVK!cmeDO;@ON zHtS@dNA?0iKSE1tIroJ3G1!#u`>BJn1VNAQY_Oe*xul%e8MY>x_pFV88G(o<^(F@Qbd6?srwk<*l#Ro?DPJkxX>aONg};Idby{Ya7>7$G~VBFcR=tk>5EP zNY?E?)e^A-)`R2+FYXu5&Q3c}Un}u01T;Ua{`6HZAN(k{kN#y?+`(CChM{H-d>J;d zlkN$M11?%Xy5Xj$?5~ojz0hWIXMXhu#wAgGYhgCfML0<#dk904$NO0lN-6piTFkE; zNwue=0w&LlZr>ZfHn~y89==|n%$#VZqqbFY^9YDA<%Fd2jvvW_tJK6Cx-DM zf@jp^_R)t)==7()6gmffhgt+zps@{Cd3k!NK5hsD zQY&(E%W6yn3lh#8V)Yzfk^4Df;*q&KJwuL!={D`NKp@f3Jw(^c& zx)eF12HxN2rxG#C`hRWXwt^XuE&pfdlmBevb(_O$Ak+RY{R98mi0qsbkagz10E_r1p;d2khK{_G8Wm9{Ac@R&&+&efbfeAatIAQ>;P!&;6EF&mVUit zK^y$T6@Q4?jRa(LA%8YfX{Os&Ow9$HYwZ!_A{&ht`Ikltz#P-E$59pa#^73oNVf&Mx$B}ks`Q^euy9?E&^*VWv=Rlj87SrkapW<)MHNJ^Qv(28odtL zlSbdRq?)2+>(TLnFElzni*)7K`-P!zui)MHd1x%j%Zr@fgp#|F(=K{b+gewONX+)A zoA~YR-0{E^hi_SX+^x5&m1TpxYYW>i1jVhS`1T?u!K@w#RUkE+#tYY+@~V_S;JDhp zuU#RE9$?I}x@j6BJCkLa)1R9m@r<4&@j3l5X@>8@ZNESwtw1gC_>KxR+DUV`*|cOv zCdd;#e|=`>-sQ^*=28!4(-Xh+zy>T^fTUx*>ZsBE>liBQYy4h!=tgH)G-#h z_9C+I7#;*^Cka_)Ly3rCip~P}Wb0{?Tc=&(XVd%IRW70(2E|N5YR}Hs!DcRN zPwXph%|l|eFZ_||PEqu(f;FynTK^o1e(04&R9m}2%wzB#AD!FGP*Nn}^~u^(x~K0){!IYTp^(kc*u8z8ps zT910Dy!}3}LuB(jKXarZbHkSJWD=v}wyZ(d+1Dj=HZSQ0eVu^vG!9epIiL;$ibv9T zg^)nKSydcnDf7uTrmJfDYL_2YiBZo>N)M|&+V z2R5!S95A#)__X;cH`G!13d)@VQu+D<6e!#*v0n@ld%UYSuqR6N{xTcrtZAYlG(gzx z8G5?NCKW!0vrarPWt($U`1X4IJ6o{fJ%{B-l9lCsoaRTE;J#!<#Ly)2-R{=>vT2Od zsVKH8;YHUe#3=$xy=C0ASPx6(sp>EZI&NW~!GedN8YKba(pG*lGolZ|K~savL28+| zg$s2FY`qZfon7yH={8VpS$o)8+JZ{li8D$c^jl1{uSv)7N}U9k(|8HV5fs0It2i*@ z=40)Xqs5Z?fyHyZfnF;CY;rgH40Z=x7T|iMkYaa@N6n8ilT-S9gfUJSY?ckm{y)h1p~qa(R)d?8!mzuuvrEjKo;(g8YVf_WzJm5O zCf*O6U3~^x;xm)BvN)rkh?vL&ib2BtQPC{R$Ah^xf>UBX^6Qf)HqcP>w$G0xz}1pAaCb*nL7sD(TGVDy^$7d*kTt{Y-ru ztxfkJd;d4`WZJFUN58g)P$RW8@%%s{UDz_IDTwd_4qf&%>a45JlgTkBsPMmAf4!os z5^ghNIwxlyCiWv~YlUa`EOU&8yhny}? zFXT>b;P*SXlo0pRh3ErR=rP*Dnegb$R=SZ>NPd#NVX}>^^HGg(BTwGSdMWQ+2E%>P z>3+Y-P>2Tn5)Kjxt&QHkPcXG6O%rO!6795OT|FTV_!IFZb|j3!bV;vS)uhmk55>u1 znOwUDG;iLI5w@W`pk^u1M5gUFw58*_>MP#NIyEHC*ym1ao_N4sbQ9Hl<)f(bXf5pw zY>~z~q#o(*Nm0g=+ldwfJY^29*2ssg5zbllM*W2mA4C~sR}LJ8nMWb-dbjy-$un1% zniozIwj=BUj>zla4$vx!3&o)3erAJ z>et6t&FtM4%B7r0loo~8W{kILZZq={^eH?|-6$rNnHSR zFz&K&+>z8PmH}ozrwPh{x_DFBPzAs=tzLp~%nym2*)^Z2)f5ozQX2u?%Xa0zU@**{ z-bNp)VJu8cqUKTb%j_PCiIGrPPYd($(>9(Jo&imQYkAfeZY8Nauc;BEFOi%ofE9Ev z@Z$B7)nl4nD{LPMS+;8Rx9H%2dch&%(Z0T?+FvnXpi*G^unmx3?`?p%CknUKi5($9 zv9^iz;VQG5D(}-RKGZ+vD05`Al$2fTvuL}`OnL8orl)2}UY!Uy9^v7z*>=ncAx|T0 zZ#$dtg>8Q`iPII6`5{8pX+Dvr3+G*!Pw`?h@p>oY%^TLdA`Jy|72NR{HTiowqp#_R4ND zFSLTG`K|P@s;;XY+5)6x?0~()gD;tC*|mj-fFSU^!Klt>eVr#kvO8k$?(_xEwsX`(JV4n3fJF~! zV&kSW=yT?1<4ZohljJbybAX0x z`a=xk1}4kc)zgwPF(x~|K+BWJL*XAcncKj4WAC`U3#20Q*=f=yE(xR7PzuzQxyi_H zFDG^gIC!$pfl8GR_`aX1AYY*{4^xz#myMkP=Dw#22LJ`{qkgx);_i>HwmrcDA9(-% zoOn3*t?*+?P}Cy+2IPl6b(acv{{{Lu^$c)3&jVPZ2n-j*#Zv-T+{3{Q7ItzP3UMv6 zcPrSodg2+uf4;1jsp+e#s~7uw&EtlW&LS%eMBtsN;a$2oPC&RwJWlTjVi~gMyfcZB<$+@CX*=r4I*!#ECivJF z1?*+dW240D^d%c^PwXkSErK2*YrHAE1>LBlt%9=a2o^%`Qwt|gago~EmKAGRZuFh^ zZ3@$Ml|HY{3szbA(Ii3MKnSo~n|Z`Cto7*Og0Pj9AbYVXnvv_9F395>q#pIO3gcnQ zMUfe&1YiXa{5G)rs>1TlWS#jFj+Srgtm?_GANE8d(kxa>7WdX(ss5BbQc>i%Znl}3 zl``;V;An%e>`WL$qN~EjAMuM!_xZZa! zvorRUNGeS&jLePpd6l}*@&-fSs_2Mp7pLgspIYFHL%-)Lb~>G`u1P(}HSg%OuqW-F za>TzleUAURa)}l92}vGw*`4STJK7ZL_!x}^$Ql>0H%o2y6_M(EYNi0+Rapp0aP%fG z_|$10em|c$PWLmcoHmT1(^AJdFJX=Yclr9Fsvu^jW6cU3wR-OoS3wYitO&l4KA4rX ziOp;&p9hNBX^IaYZK!jvKc;bxu11Z2-u6mbbnY*_x5c=!5|*BB2dM!#Btt|WJf__d ze2w&Usf?4Kly3VzY0YN*`-N*$-huvMt6bMjNPKLbrt%r@)VUopA9D0NogqXHoMfN1eVbGkt z$umvn)D#3AEFU4_>clp-G)^(X@kKZ|efW?hWgwsN0W9AI>y$XbZWP)C{jP(#fc&FE z5sV`i6JCR7(uwAT3`_(<;!?Kj&)he!o6y@8AW3fgg_>m z64bk-#?Sz--c<(cX>B{avm@WtdgD!pRT7Tt)J~jk+m@g~dpj>^=*up#2*0+?fKTtR z%Zj0xy)q>5SfcZAzd(9pJ6Qg6Ka@YdAPZ(24l}a$239`df?kDf;-)$lBZoVE0j&2= z{m8Tx9+nBkS2gFiH&smtO+(_u$o9o^ z?R=4qpJyNQ(G{8KtblCeK?oE{zt@R{6jt;LJO$j?s>-FDT*bDJL5%D$9T}Z25z!cl=}C9@r1(I_29waM?Fx zOX{Rm;!H-ufrn341DwoUz}*gyUvETi1;IPp5bF4eQFpZyc*kj*GsW&-2dnsMM|H#B zayz?uI_|!sd@g7q?c%{pXbj#wIgBQd-Y#_2Ra;>UekG*bPWVD|qRzUf_X8e>GxP5+ zq+Z>*ZL-7xLbQ>PU3sE}2l3uGDCt{w152kJCn2O@_rG^arO9R4)F{8GNtTn!Nk0RdK5Qvlf{Y7lhll%mxsR##(TXi z$~G=G_-b5EkM4Ww%Xmt`#1ATo`1Esa3nuH-%;qzEhtjTAk07;Jg0vTdCnE`$G}pw!7aVVGE8h z-nwt{vPiJOwW`IPN~~WBUIdH+7Q?c>W<{_nb1$@!Wl~72onv@KUq|R1Pr) z;RZ^Icc-g*g_1jWxo6yxT}4xZRLF%H*nLHD5ad~Ry3fb<9zFL@if~zXvLRy1Nn!-< zbFT#--I?=nIjYl7?!1G++a|=Q_Ce%yO#2-nnIC#*tG3h08YJdUFk2N(0J9BH+lh$uIAKx*Si#dcAt(}p^mBdAmeYs*-5;~1+cvSTLjBY)a|+>w0mhGhSyR$ zPk&7Q%&D*@=nWFh~JnR?foZ>O$w@r;I@^unWMT^>sjtPyg4=dh+FyEXPsi-@-J!j@=yA-^R#})k4jSoipK~eDcwBW|W!AnzZ?q40QEb80*+LqYF}=(t zE*rHX#;Lm5`@Jd;*l+`3S0;RYXEG~5w4LF5gDQ2KIg>YKeY5MW-0G74-K~oky`TTg zbN_ZD>1jHYC0j4TS2; zS+HOLlCu(3?y$b;mD9d-AO(;3ji2A|~CRsTto^+v|E!(9^)m7DKnH9Tc7f02G zDBH36Z}uBv8#oT(S$ek0+vt~5>vLDS9_43Gb_^y+>0X~}PO%FzJS|Dq+=2HnC|aHy zDHHr;T=651mN>I0q27j28PPsPf?OxmN6odO$~tOvKirwBkqAo>6yUqfBFM}*sfQsv z#X=)hAzR+OB#hx`Ez?QWmVp(e>p4+Z{2wq~5&c331yR@l^c!b1>RnZAv*X=WuY;VN zvXDzd+GdTJ(rLQP5-XVx;LeOmPp0_rPXHMo@MtrWyHvNMoqTY2b{F*F#F>`b@ds%a zzy4T|^p6R3mO7$)_w#IyFC)k(l)Ef0%~HxFSKmZ?P;2z@#!ty~rwZy2IpBkZb=$)C{S&B)?EBQHs{6-^-^}#}yZYzjviUhhVy834Q`&w$g$mFYRbs(}w~K{ZzHT#=*;J;MB|N}igi<^0MOBhc)JPsc9QoM~86W+v8U$n~ERFnE}0 zGjZS2ci*%+mccjS99T)Jo|^exTE$xgF+5W-c})!=*_cb1^6+!4rZV~6Jui4$Jh}7w z?%bP+iQJ+Ks{Y?i1_uIFijysibl%K-y5xm6t+M<=X70vtYlBH#I8z~5vgz=GkDX+5 zLlS@Lm3HaM_U8=aq3-sb3o`hrc>nJc&9Y^7n`#Q5Uk6_th1DxsE(+dBopU*bIZ0y$ z>iazjx-<+yllXFy=N92{4g9O7eVKcIjC@5nrO67ArynmZ_=^lU+5LxT0J*B4ti!|&p&B`>H{Cb#iU|coeuboH8+P+lu4T(05Y!#b@C0`Tc zY^ZCZO*IC`#MU-NO3m^Nd}WNS?};<(dE`4D_j62t@&L)Tp5p$5i6ZnS_Yq6d*U4Mi zg7noEwZj=6=T0ttXS7~JcA+AX$0Vt>2r$gI`QknQmSEFyg{q3?jJ-;iJ+GC0NvDL_ z43m({mHot_sft!E%CXT_G15_eY!mo6G$gXSRA7|typVfnxV9cq0tVW#@?B_9a?p(I zHdX9csw}o*shdQJjHTCAl!bf>P%VCLStO!sH|ZOXOnZMYwX6LanYhS&X98Ib?iD(_ zDC==9hs3}~*Dg6un|~vZf80CA+?2(Q!_~!S_Wh)}!Z-b){oBXMS3|~U zKG0pRbl7|<$}U3iFR(hxai;WY+WNO5(cqoD(oH`HF|Rc{l?S*V>GiTL6(heuFAf6$ znW7`X?SMf1-^;cAhk^Q^sH%T#_V@N_tan+wr#Ha|<_F%?Y|PDXuS5S{Z05iFtbH8t z3=`qdMv^gEo|LqB6(|6Xi0;`2N1@R%VAVI{Pvwf#DD9c^_s{B!6Aw>iEe%n403+am zhjdi2!7O^9$Iyz$VNXrRmK?9sb_O+LD-~Y^&RtA1{(P%%;GGL=&MhCNka=AYLX83= zg)Ak1DIivpWC{D&%xHJ4HzNSXgNx%d-32BWCXBK3j63n6oM)_h%{(qhzWiC$brXr* zTx3lGj-Vor`~m?E{i5~yHZR=|Aa2g&$VeMn;A|VBSPMzf!hE4V6!oS`D9!rNgsz{I%!DnQ^&c<8xUIgF z(PezcJcbZL%>M#aFGgvLJ#6J9u`Jm)EsEycs;j{xa$g&Y9?oXyJYQ?rYc7cXlD5aJrJ2~^awgoI%pa3%ot=yB{8Fk}zn z*R19`?KuAD z`eA*_L%Z7_l?6|Q6}Z26D*CxNp@DYV<`*a*7yv7%Xe3$+(4HZ?!hkKs5t2QQB_Q5% zEHSFYuJ7x3_lXML;e05%SKzJ=8z-L_4fR&#u{{U@~4(C1&P7OAM<-ceEcqh zQ^4$$D>%;CV&Wh^Ynu)`KuniHSc1Fk}EKtklC>gsIWHwdi^L|nRKNPYLE1oYnvQ_x@kmM=&p9X zzw?nz`ohU`UyLHz^D&OK9O@<$6*EJYwQ+m%jlJjPVi2Wmad}5i)<(*27udW`V7hgg z@7A$Ux;9`yOOb6{wI!%8k?x)h#Lvkc>7-69vFtT~)`#FqDsJ=htZyU$Q8TqTAl;@hLS3n+>z-v_%Y4@+IIflDXDAeL&HPb+ z1KsMpwH(B*G`A(A=((>eqfbz@UyvKW@AnHm#vr&XIrvR6c#Drff9dYb!q81eu{MWJ z*K}{*Mc4X$?o*e~sCqqgDA?(w8%tZV2-`6x(m!PCCHuINNgd}J>eH< zc-fn>vw5)dhfxxyu|k&z7_iYjrqjVV{&+#$2yoJ3KimK5)K!T>F4fq_M=yF7NHL@* z(P>$~G5%vtQ`5a9V9m0=Rj?fMvp1}S5XqVjH`;tkPVY@g68h<&Md+K%tG!#|_oh@W~V& znsG4Eg<9TxQ4LjOvk|E7Btp>AYyz3wHvyz=tFN5cL}e~ zi_Tv4I@{)b`WB<&p7r)F*_?8Tfb1;;Pb=aSV->W7@x7OWgLeg;t}=B^X%yy2G}MpX zw!ar>)7Pl{@v?Bzlb+Y6bJwmV(gTIvdLRZ6-M6!LAPSXa3p^x7YFxm!eaGTagdpt2 z>+C%vM+t*>@dlXsNF%VT#w)OJgpAz^5U-RuvJsvx}@|>BjZjA?Bv0zPzX21b$4c2pIS#b z0lANy<^-$+05}`O4XApW8yRlPp_>FA7)1p+=~~@%Iw$(#@fLeo%Zn>yK$I{^TO9Eb zMc>S)-hpJqbaAk?k9={pt3aRb-V!n{`VhZ;v+z#MJ3R&;ogH?><*tx)cNZ6D!MMJo z+ruw25_Q;rF5RuX$&3YW+ma1wov2#=juvYGHP47wEy_G1z7Y7(@e;pg4yL#WVL)5jq-v%N z7Z`^SCn0Z+17{%j#*fsTsJ$a>qB5_epJ|}!9rXCW}Y>A7}W~WU< zm=4qk?KPevVxV9tlFg%L`9>H7`xs~(~sTlwBN z^tJCv?>}6zq?_GnyEoAXq9l_5Ks1v&NgoT1`sp2pd}tqH-vQ+T@@G!G2q_RfzY(;v z<2kOEcx3#f%96~q>>0rrrmSOt=R!O~VD91+LbmI)o+Itz9)u}I)+Te4?vDPvqyYax ze5`mn+gAUARyoGS;B$Ofl;rW^vk+Ii!BL}#Mwr=~gyZk|n8w9kshe4S16B2V$0E`7 zJ~mvWt;99Hyh*a1_{2O>&7R~olJN-6AF>XcqAS>B)+BQHq!x_f&(e_ao%vQ zimNzJg^5?GlH>9f_a5$?GLU3l?Mf}%>Txv7xbonp&%rMcNv3xzNHKD9*#bXLtx7br zlF>TXC~FA!u8yitGL_Ro2JM9pCOmn@yjnG>YiY^)3Zy|dT1Jig>=;u2F?m~H_N%8b zVZEtRnqd|7l%__);vmzbhqyDv_=V06u?sErO)aAo701`dPH4^aKE7U{E4LcNNDrJs zS+N%^1NkjX^we~1aoBlNHpG{_W7=Ybx;)8nfU}fc7wKD)s?l&$KKE5f(+An+9?K7( z+MIv>u)J4Wmua(>$s2Tcu=hSw)}_bkABSo|h}(cQRG=^|gIQoaxD!o*`5R(b+@8#6AOY@b?<t5J5w1nm&CBPyV80p z6Sr`frizvz%+>wC-t0GT$>(TecBt+O7o!i&c+O<`<+u&pv=KFJm0o7@dQZ0wH5N*VdsjTYSqJlONPK4PF+4Lp?r#yg zsAM`mwYQR(X31W7JN*37ONsiP>}tbBE#>aqiq~{m3%)V)O@uCssA_zGJHiz&xm}mh z4%RK9$oFQn-a{K}I-VJu(AvDuC*o!vX{2NQxOS$M7&!eCJ_L*kKj4If3V=c0@kc`r zLUJE33N~w&!^()t4I^k->*m%Fp6f5f6TAZLUFu(Sl&qx0bkTkK26%d3U`z(v*O^83 z+&^^^RNm^vC8!o#j@uosjCsAx`QF-lV{byiy&on`dqR`?_zUzN)$7d&*T<_RE;$Mr zVyECrg)>)zytPh)$Xc!p8W;NBXNf!#7QJOXbzynaEXY9Q1B35Ih_CrE?Ond*2hX!r zeYxN2+ky*cY5xDNG=mNEIt!+Ine(gniiW^KM1=jk0_ zUlO54oE&90jOs7lz412i?B$QTE@$=E)jlhXjiw})8{k^^`MYfcZa7qL9+|h=X()A) zIb6LNk9fJb0#kY4NGL4PSlF4-8(gSIrtZ}qZmlt4wi*KP%mxj%-r8-C=hQ!@Eyn6D zeBI%C1M*9I8#XArrWk=j*LN&N=N*4f@+J&*CS!+qNOp|xQw)oPUgIwC%H3dn>$w$r zFSRyiPM9O?r}u-mvfLHdOO|shDcV)<@0V_x-#qgpVAeXo6ClJ`7t0LpsIRw-K^40wZ%9{{ zhmO(urW!HrsN@-jD~#5o4(r)%HT=it>_38r`q;SI?$r1)y%3ObLd1|93Gb(HYuy** zXne3U;!C+27deP6ejf6RLo>4yb)ZLv(NuUd5epjWhjPp=X%xlK)&KkS@SUf#blNOndu?LnI{pu)T`L{-yTyJ-z zUf0!aBNk;*d5h@D)IYfp z3#y}tkr^3kfi~mAMJ~kgvW>BI^@3Y9F$p{HdWcpr$23VVnAarMA7(dZ&THPnTphVMV70o>84v3F&2Knvbo1v_P?U-K1Z) z!VYx)K>{Y{uQ4hG2y^`-U;Fp(|NYN~;WzB-fBpFUd)ODfjOeMvBEQJXHmJ)NRbNnB z3V(rykdy#SN1gO5cI5W96fGFY{Hg$$0^Y8W{l#A(QEz-joXp%mz9#)a;1_6i#*_ji zko4M9q-hJI$TbX2V-ai5Yvu#&BJ0tpAG^OmN%bVNzq#M*C1)Vz!X$t~_yQmflK;|F@}J%2tJdXb0ROcm@Sk0iy&I=+ z1oAgcLH_KVRX4B0?{E40UH%@izvty|>+{>j{$5Fbub1_t-(EpQ-2Xlg@6;vt8)>>p z7vF!@39D_83Y)3@_B!S7b-lrV$Nl=fXZ-i?8UOwrF#P(>tN8n8^1to#KjBq;ZMH9; zC;4?WPQ`fm|EP7(Rp|S=AuH?eD%Fs7^u?sW2!pa#gy&5<$rR9;Pz}5PkG=PfYWmyu zMT2zdNN)i_=_0)fh|)wvK)Mi=4$`Cr2nmApCLkc7pcFxA(mSD}s8ng81cIoPK!Os2 z3Gse^=iPJ8zW1E{_8ITK@y5O5?LRVL48r=>HP>8oeu^w0AaJ~Qt(Gzm=Rss5+Ie1K zB=KG;o*mH;w#b}q+uy>q4^=FU^6Qz(FJC<$pY`-j(1b&A?P;C@T$C~iZaqi^9Nboo zhucdo;{<-V4QtV$(oPn-LOnJi%{}o%T~8~GyKlQ>0$ug>901ds|AHGOlH)Itgf4(n zo`K*}X;_+FUnLWcMW}E`z^3)6+)uo`P;MdY>9vnyJzMV9e0#IvtaonHV@J5x(aq|k zOpq)H6`2?BvifAQejDG4sannaEi@FtM{t<#-_DL-YlYe2NgMQ!bfN=sv!l9_?bGC| zVU?fj}8r?oZ5Ah^ZZ;;exZl%|88XxdP%D^51WSq$pY_#!wcVmsGNaQo?vy{k*9 z4#R$OX`I4O%HJOi+K zByI9VoX2Ex*uo6?{D;@xQCB|US5{3Gp=v1cli;4>5{*OWFU;wUG*k4*X$X%WV0fLi zcszt=mn8bs!i)jjoc|^B=bv1=)GY7H`nyLDFt#~YC5Bua5lwWxT3-NAZ?Nqo1sKD^ zeH<{8gqQ7i4l5oOJ9%GH*viz@caJozusXT-H1Rf3u7aC}LmzBsc~^1>nIb|_}gb<@K zyJ%{dIMIa@J^VZIDaD3RS#9DVFy}#^u##iMo)P~s`zz~BZ!JAe#DHuM{e~YsUVRU} znZ*e`H%2h~wzR`i-7t8W$kTl$VLx={sCcJTIn9W^m)l&U$vqy7gU}6sKnT9uuN82 z1f*KNo+SW{#wa}gH7NwWr`{^AEt!YO zr`s_ct8F-%%ngLHy{LRD6uYP~dDku%#((+}&I+F@5*|zLV}q7058H+Zh7zb4U>cI9#YW~@-moC6Nha@ym8N_KDyi3ro~pBtX7+oK zSfmy}Q}fqdC{>u)N-7{?8|FVYBvWYL;W%NIUs}8U^#*es468GYwkeaK))(BH+3DRk z_HFOdQ8nq0LSM4(q!PV`5I8IFV)uy4#k9d9$Z!pGe_w*b@WSc~?2DSd;H;Jv{U_Cv z2A^IMF7{zK#VjsgmNE({QQR#8|JMo@>>1Ridp%hJQ1oG0}Tqh3l(p zcBbDZf*mnngmhzLfi_vt?UZt2&B>f6N~VE+kzw9BUVQ4e4R9PKwL;bVhR}$CDkE30!tx!6Vy!V(@u% z8=;pZd6)Rn5~na!niOT&R)^rpQeO%@Dhv>Bf50DgVn%q`Q*(Y#;!U{iZMKDR*+XTF zI{6$hoz^E4y@(kkZYXjX4#pGW;7hExP&lzEvpnV-%yEmO^Y^#D1mYa& zJ{)+;&EH-Z@s0!vI{9ezWTzOWTUtbha`f%$*fx$&CsNLd-j4Q+)qP&pb8Q{adB8aV zCfb);A@O~(ZFnKa$g3ejeiG{Jk+Dyeu4);}&^&#Iiu!(bKiEujX$<2LNdS{1Rt|>3EW^y(_`(4 z!C`Uq}Dpi132o+IOGNrHJRK z3+7EfeKOu3$Dkpe4G|>HQqF=&LS#Ms9SRE|;1wN+l{Ix_dgS958N;k3JtRBn&z$Wp z!bf-ER)iZ}tnNZtCzzIq9@OK2sk&`~&+PJ`_EX+mBt>_d(ll!PFful>eli|(Cys%J z!#ND}7p&kPeXg&tvZ$~obRIXnhb*}f9^%kr5Rk8~0zNQBb=PS*#wuFBEh07h*^E>L zP0IQ3)k4-=!Rf&eFS6Qcjt&cMXfz6u8H!-vJzj_ke6ckY9U;_){eB(S_RIeEb9xEb z5DhgJa<3$aLQQL1&yR6>!_=_x1GNo@_wGR#g$8?}qh*!eeLbsJt^m<@Gv3`!AjxW#_b^3!#Y}$1D@5&j30iMz8kQ_ zb>r~z-HhQ&yy6n>cJK9Cc(Jqq)bx07YqM9cKZ+dDj=Sn1j`|>!|MM~F0l$Z79@C@I z8v)dReVfjBh_BXt`-aNaUX|3yXTy$~mWG%XWJr}@p;bA*i&^1CY)q(~E}_6`_M8P} zK7Z#zfz;()G695+4rh=baIPD;_u_Vn2qAVG{?O8jE!fZ&a7r> z-R9rCOWhfHxW$WuE)AF{zWc7@dbuB1NtKDl>&X5Z1xA=2o~tM#*<+^V=f>f^90!l) zRC~8e&KSiwSKG`=!!ZD}sA!$PEH)81Hp zkgDqILYu*zmyUJ!Pv5LY*?mSfACDnvV2-%`!m{lm{2a{sUM1?|+c#}R=bKM_n-#rM z!~@qjbq$QGxPN77Xf~V!7c30g<}qKt>)xfZFzJ%@3T@CMGjOZ8%MIASd{h04!*PCs z{>|&cXa$MzKcL-(uSt8W0Ld_9vpuoL41?x{W;wU^HZRogWj|=(7FU!AzQM?8EVkNZ z`(Z*c^GeJ$0Ej`WD^How0#fdCx{T0+JM*EdEIK5tpj|Fjv9|>_zRr^U&Soq2deEcP z4;>)*F7Kem4QQvUSh~xccJx$mS`4pJz{38Fi&wmvTAj>|?#lhZ^6vK6N!#pvV^OXr ziCT8g$rp$zugUhr=yE8@Gc+Aa{OzwwNa-Q zRWrn8K=k?-y z{5C8^yxF0p1HYeZ)fa~yUrcCH(yF0Ov=yFI36Lt@2A+b$9Pd3$ z($Xl(?eQ>`^z7<1Qj4kkWO(Vk0On~N91FD@Mxcz>CkJ1cc>g6R z7LF>J`ZmK?*;z;pGJf{1{3McwUFeN?cDA#{P-z;P6)wO1a|g_(`aTSbO?Jq$!Q`J` zTJDp!k+{96ZF*No=v=(L&4_>9lHwPnBTG|g1`JwGi`@%Ku75*#46@#6_) zNH8%F!yDfN*=n)Wy@f=@MJ*M- zh1XwvC1#ta+fElkdv|4*PaHk@?v7{pOt9zlK*F{fUbh`-mne>?f1mK%DmZNhGRiM= zdQBGTTpj+2_k6-#SD(9m;_w$geHp&_9Me}Y+bYX)f0V`UMrY>X#5Rw;XTosy2f_3j z*-O`?0iH8U&^LZH1%@*G9S<79w=}z7U0PCZ(l*GZqVT<0RjIPnpA)fvCpY}Rm1-7Q-dy@t>xCTvb^%4an%NTr>aD zd~#z@BVA^i7bc~|TyzYH*E>UI!NqUbCG_!cqs*U96C*6*=Dw*-?{~bgQ=UL8$g5O- zbz6M~P=iXzoTN>*p*dm-K8+AbjHtWRu)$<*1?d0T2FiFVzh2cE(>X8uIP>};W2|fS z%E%(KP!YPdeK3Q5(+j|cuP+Qu@=6yE9hdM#zc5%aapS#hKZytxeem#uM7C(yey2E% zd$c6h4mUYc%7XBjjDr9=6aWaCam{yd0#DY)L_710I;9BS=w3}r5oY;WC zkBA@F&CS*u1|YE_s#7}tm}J45-MtIIl{Ia5Jy4f%E4kh&=|)a?{7^6d<&$-_Gpb0G z`g$I64-4QttMF`teBYfqf5~eNVMAVrn?;7yIIZ063i$3-EKW12tuJ(&eg@rW+^?5} zW5b`f{bSw|+fAD1!fKWuo24`aG_0FeaNg)I09+k2qG+i*CCI%bU8s}A=?frb zu7Gd?ixDkt(j&6pMs<%#k-OJrluJcp!~U0G0gvxz0hyv~8%7yOcops4llkO9;KuLdk})g* zg1M)_`Umu*c$}zC&^~$Yp91rR`ZchUHTsCoxHMA-iMdNK zYoD(>sPa5Ijk>zUc)r#2j+O2RVN%Xf<5m}&&{i--8>Bq6{>b1 zyDpM9 zP9cLOGWfAQA3Xgag>kw8cD2ssh2$PVE2gI)!s;Zdt|F_6&*nv2S+g3|V4MYLAq~EQ zX6r!!k`a&%a1u;O{W^qSfGnF|cb&3}dW4)1PR6=|P={NdV2`KxIY_hYHD%=lhb9y3WA# z`$D|BE(=})5BACQP1l8)2aX1fs^a#7*U9&AenPg3IDQeHx~{%_y;MmkA#z5x`5v0~O%F zM2a9jJTIcmm!PJ6VI=Ptr_eXubNl-7H?~#9OcH4YT)^r*=Cp;GvY!H3obYurKpwLnS%lFFmUE5kMsC z*wBs^heY_vv7-%G=H1(J3~lo0wmyo9XHTmBme&X8L2x$GB<~P^a zHWxn)C~0keatJOtIc}J9Bo_c6_{q(&y>gQ2?jKOA-X4A<5{6hui;R}y3ZR}-*-`Br zXW(-WQfnv7JO*sC<8|KNkxg_4vjeZhb=`|lqy>T*MgvId1x9W}bT9)vB_j(9W`!c|e35^sq(ky^kVwwn?lp?3 z!Aue_w)aCo-r#1tq`r&3MK*2Cn_zI|=$p4Y?aA$S%8@@!IQ7)@KXDn+9Zf3ndVTkNHj^q8y(tk1-Oyq7`YbMp zD#S$$IMQRqfJwzh+}cE@+FI@cm^((J;&ShB-nUJt<;agRh1V}J+!x??r};|%^xao6 zm(q1`Y@a%18qxYduT5bT%`k~04Xts`dd%uvcm?qYqb58K&B1Ii*h2DsOxIFP-On;) zh1@1qZ75{wHF;qjFczqg4TZP{T?ryJ#=Mq;m}@-q^urrR7bmIfC46}ftEM8ZqL)v$ z>=t#}U$U?fWxxXs^h;!_QbH`Q^|1&Tj~xu=L%MauHjz|rZ!Ce{vEvwV zVN)Rsjk}%ZEW57oNSB+Kw$U)O`*GK=l+$lbs)cl}*e`;Up$_vP$#u7b#>+G4QBTW? z-x@M-GC=^44-msC48mz~t>2KZy>+#xK7VeltZ0AZ|9W{u;^y($RFbRBV0RyvSMFyJ zly~p=txqY=k}dQ1A5fOAwgtglb|V2L%(O8#*c5rSU%GlnYMm)ja!WRj8dgi=alN!< zotEm3D=Ucmq>AK8nV{&*>NvlKFCv?nS->L}^wpH<*_TGa7-2;a=T!;QPffLM-j+YR z?%g>_Vb$Ftns1UyQ~rS1LLq`^XoNMc@>?Z?UxuuGYyJdbB23#oWwVeYnVEGAMP1Jq zh;1lfuuY z3FesggQ#=N;a7>sA+QMYJ{!tw3?T&PCGs3#AcM%%S$Rrp)%J}UUq|>${?!WmFWOH$ z@*UJ^q%6lZ4N^ydjV;nYE3*^~6R(CzofcB)pj|`5A{QRjUYzT>>MrN6@}r(>Oy$wB zO7vhO!;DERxY*C_9_R;R{Tbpgi-i77T=)aZep`w&wTSBj&FXpjYhxamdS*iU2#g0z-=gcwDIQn&J_yn+swH6E%M?3C&_bZ1>G{6{BgOKr*ymg+dI|Oeri6agcTV zF3uU&B3*eQ{@Fe8A?@Qo!=Ho)tY!wM1`Z&oiL++FV@sk;t*Ona2pdceq2>!Ve(b4A z*Lh@)V>cSxOl_GGErlxi9qh$9E7*e!L6P6%LjA>%>$QJC>~a}^eg<4<5ThrpMn`ff zQKubMK5&TuB8m~-|1qH6N}+)X;BUQnyR$~~ z&sesMf3ABc^@wd*e1m>OA+1E1=s+?dGt7#hF?vHjvkooOtrF}jcOBOxtnND8Oz&rW zQdVQ+09BHCcfS*a3rvRy0UOz@R0zE);_)G6VokfXIhz0etYLe+?P_hnnQx5pOA-*d zngmH2I)2;n95%LEm@N^xK1r0|I>1zi2@8${iQ+~{iym#=PK*kVnev{Yq)!=(N*X|CXw}7&^%vxLeCqcwiVj!bT)W)WX2_JgH9DScvUwr#8}$<@>UXEl z^}N^;N*VfSy}_)%8rT+B2EwWgeploU2w|&NCi#56z9_VK#-DPQ)yDelOQ|zRJs?d6 z;uhP01yLG222K(=w<;1}1&vzsV-UC|x%9F(XM9h;^TVB#N)P==6qV+Lg&Ph*_^Xu0 zNff+ARL2(+;P|%gO(cs!k$>;Eq^i@Zn_qHPuLs>Y)<5xidR8JwPf>}9+$q(GXe=Gd zLP?qea@A5~3*yg>55JZHu|ML&wQpw6{J(0sE1S#L7*`ENWL@-;zh{_1&=x9x7~ByH zAF>-jwk+%!df=PK026_R#1bVW@gCmTB>AdHYgJV&_GDZkd(QF3s5s{THtu+HD&8O?);cO2D5 z%pBufMy{-aBZz;21n4z+W+-InUL4ps$Z(;ap)agnwHIrili!;?0JgE~Of3&ToqtaC zQ;}Lucbu4prv|o*g2?;86~QcVUl86is((Oqe!OjQ-&B9zmv_7DaW9`q;=$Rr8GX_9 z?9VVad^F(`ae#CUdd`ukK+=KH;nM}ar}*w20eRON~$pgdWr0=lUSw zdaj!$qiU}q5#5|{FjTrYqURayx45sW3?!mAbJjV<)KSkvbUsz2pWKgJ_7T?(&MuLn z&H*NJ&~_IL(O59J`vZI5si3iIRmzZ4Xl-(?u?Ux8jA_`@!?6Jz!z|S-wr#D+VRV|n z)>5&(^Tk1P_|CZg*kyw~9=l7iUM?Id9ewN;`W}&M4&1$mXr^c~QUDr6mqwvi5}Q$R=RW2t_tJw2y;M`2AW@%>yRXY z;~^#lH}Mu_;ZEzqugV$8FYb@c^-xw^5w=$M5^fgvxrs2m|8T63S!A1!Sg(dOKbQAn z%=~^G&vc{D5o1JR!GC0a7&2iViH`ksfO5kC<$-G(0C%A@70lYo#t6L+VcW4q!RRyt zc+H#b>+`w4c-=V^>+Z-gpjf&NIB=z>{yJE;9s=SxnVxhL#&`NwSA@uGNld9E%Al=h zkFIE&WW4UV-kWN2t=6ReE7yznVkWegN3K!p3muTTvqnOGpqX_A$PbT_2#ZAgh8}DCBRy}#((-5#GE@F>+lRaTkzIbR*=?!-aO#A@t;Xuf4TocA6{lkJ~<~ zWIQ~d+?{y&MtGhSX!VQ875ERL-G%}x%>;kn8D@_!$*cE1!_Qq;C!a5Uvw|g^-yb7N zz3`1JyE(a3ih&FV#!_gJxWqbK(nwToyW`V^GN%}=Q2i!jp?g8oUZSHGn-B<0=d=uF zwu$6hgxcLE+F$}%2BN?1BfrRt$lAj?O0Is>KL4nv+VFe6tL)L5dR=-=%E+x3TDNi^ zM%>6!?Or1F(%JW`d{>kpqN%=1Km zbbKz(QKdh)JkIw~^nHK0^`f02DI6w+%df(PlQ0rIw^4p2!a0i-xU$j1fnc5R1Lnt6 zoyO1jL&mcY*OjS_F-eJi5@hz%mzUtWWIfy-MIQG(r7maL;a!u}f})m;Sg0ZMqOPNf z&>7`kCvOkmpFrQ77m%k%dP9;TPztfS!n;v=Ne_C8i;us^J1Z!x+^FI1t?Q!qvI+U7 zeQEz(&aFaKg54m=$9%ACG@XYHjYe55e$YuyT~e%pOj zp64HLVXd5I%)TFp6yh!ojxKDl#d)>1rAm8DwG8g1au=TpD1V@qEOk6u`CfFQPH-mX zVglKrPUgTt8_w*C@bu#P3jG2W)aMTk{X)K;A7u7FFSgbnuoVBO^x3BBQNa!3&F?H$ znKBhJR|3|y_xD@P>#{;me!;S zOyh@&YEj>&tFHMe-#sAp=^MCDKu1@;A(fC`4Ji-~T^eY}un6~;J`Q4yee|jCH$Yo) z_Paf~(=An0*ZbrT=*}%;zVqFIg3xwC{%K{)iLNlzu3sI(O4hFC;Hj$K`854$9($Z^ zIdc)!e=lG4;fl0}!P2R^?gr}Fb5xtym&ZPutDh&dWcTy-(e8QsunB6V3>`V2iWO`t zz)B0txN}CH$y~dCC-bpabq)9oMT*Qz zjKq!IoO%sRA^H1+-}CBU0*%tRXI#u=l46>43ZYjqim__3!8xWRFDoMBMir4-q2F1_ znzi(_WWMp%raU2b?cs_B-v?z1{;6vi^_f05q91+;bI=di;-JXV#8TYY-T6zQ3?nZx z2-yJ(m+xL>XF3x=eGm0g%Hw`;#(P1{BafncKLs?}lM=RMCSW}~#X)|nQRKVz$IgPC zCt>xybmq?(Ose@V3zETw;`j(GF^k>MO zBd=S$%$Oe!*A|NB92YFA3>S$cf*0}4x*jtyqy~QBQP=?=vD*ci9~oxmtfakYDM;@g zu;0zstr_!H`3b8*diWX#p0zlHY;X~^KQ{Bo=h(^P);W9wrBJko6G92 z2cSa(^@lm_OWHT~-{36>SH6UmCKZjvwd(OhMRxE9DxZx_lPBd&FLKqUzO24~W{dB& zkfPO2e^vz1124EaHjd&OMmjn|2SL zq%%6U%UA2qFf#L8A~(!VHZ9}n9eKF-w)gU?&x5>4JzC?HN~4FqmVURKtu5@}lgK-f z$HOtoH-X~f4$+C)@%sHzQ$QYPQLQ_sIcKe^I*6NU zrC8lrvEg2%GkunLR$n%8)F`Snql5w2L;D~fX?eD9d{+87)OVq=Lm)39vm$Q(t69Lz z^=Z@Y$4Uy5{2DZS5(yGn;7h~PRS@aXg`Ch0Zr-;&?p2mGb#wJEP_3D$UthN|)mNiG zuljVggp)1529X_3OEz(KWZ5~QEXMlPGo5lUK?r{DBs?+^qW$S-_eppA{&&r9-3^OM zo5S-+*4D|hyWtUpa7Uvmu~|5pX-Ks7#kIY&D?uBDaXHkQ-z%+W{($@fQwT*;(_}-O z->@>Vi-x1g$?1mN_dFv3eTtKkm`*H@K0Th}bIb+Y)joyE_33Juub;=lftOD{YKfa? zW;O0{LMkW!0JG^z5CcsPOYrxmH`f&E3@SLSpE~y1sG*R(Ts<$Imxgsu&4S8xu1hky ze895aDe(F&j`~rSN}l@d`gdEJGym_g-y3pu%t%_h0>{{-4KT{{iVH)_0Sh#I^Lnm@ z_u`~n?v)`%?g126ui2LUl)&l2cb^1z|3fjKDpItpt;Y`fbb~k%7U6CnH z`$e6msh;tDdZu>KZ;@2cW)Jm7XAgKC!U{FQcytt8n|-k7a);K|s4d~X9M#t|cA|D} z|2XUUM_JK7|Nigykm{e>2>%E0?!Wv`Gq^09+_6N+M==hj=Vtat&3h4$r<%?PG?LP* zP1R`V285$OpxL~IQxX92nLcg!1G;4gIR<$14TiCcWsN|^?+<8ue3x?i2Xyp<0z}#> z*#^?_AJ9Ts{{u^VAgu+^xm#g>K=41H-@pEX4gA|!u4+=X2rT0FL!e}aM4U$H{q0Ea z1i5VW{{2+I|HCl$EUB_!5`^-+9(e#r0k~xS%_wqoBivbkdz!}oJ_--@{nW9)J;(CD z86@qWSNqRr`_DJ|pY!&gQR<&D8Cc8yxdQ#$vi;BX_Fr?9e`Xi|njHTBFPD0sb?2vq zJ>^4CcQU^>jxIX4BoD}e0hEFM-x4bjf9C$D4EujScKiQsOz!`$&xiV-3Jm`T>{S1e z0z(Iqn|uw&_J~tcClKSWJhZKLMy))W<>iCt%=|Axa>ux*wxjxT>leq~co$4TmOhS~ z2cG|UE=HJ<9;ZT8^>_SD{zuOfuN|%Y7v)RlZ+sUl9UPYHw>@9XYfQ&DEXLAzs&v6$ zRqf2*-f^_~V%Ju{)F=HaEJxjX)!CFLI$odmN7*}oqss|J*!A_y{Hn8>C;YtSUvT@H zmZ=;|j-rgTT#{(|WnmUjpygd~lI{hvE-JOE&~EB<3M^1h!IC1GRne&@oGpudt}3XNj#mk(!q zY8e?S-_s`3#A^Npw>9L>h^hZkoT%P>e0>H!m2Wt&sK__EI#J#b1v;p%r@sLVDeN~^v@j$r>D1nZ zw@bR07-M|P;3i@Eu1wF(O+Ko*FPTvs&PV@{jQ6)|%D???t5#g^-8Hm&t$c^)xZ$33 z+=l;_=}n~uI?Xe=jY(k|=i3-T?o(%`?SJcbmO&Fg`8v|Q3Vef7=04{*o@?X~mGQ&m z{l2o(U(Md2D2w6Aq^^UEFhr7;dh(tE%=+bs5Gt{dW$?;s?ZfpNGj{E#!XLi`cZOsP zi3)E4{jvW`$i|NP9$+x(Se138kWd6~57bLj@v}b&RGD-8KHz_8HRtlETHDdsl@Ua2n!l4| z03tB>jGtZOc9(kcuU*oI<|e*Nn0#9llW=vdX+O<#)_B$0cXOQGY3=38Hf4ky?ehp3 zR>kMj+3`i+bnGxlHmIb2H(oC_aQ4=$oI%Smr~6xa*R&TeOB`bPgw5R;Zalml*BvF% z9@r$`lI#B?OxQ>F`NFw3Cb=F z7mZSeY~QtiX<3@tnb}v#=P&cee-MgQQo6iebA~}YPNvexSLd@zgWvMo)u{UZ*Tt=$ zwWP|P4E}eG2)g*}&-}u)K>$IT=*OJJye2#2mZM~o*YJ|oWQRdvfcwj~<9tT_@@a!% zUmS(C#G~hp4BXqK<^|)3i=|Iw*&WPkt{O0%FNl&#O!_ z?*v0up;2F#(4&vyoq%Sg)N<@s?t7!g^hM$~tkQDQd;&-i^JvD;7jvVU+ks93-+!FY z{{d}4^=InuXHB)F69uux&H{^+fJ-^*-esPP4Wd>yX0BM8^>dk8^9k2KHNJ@uvoSK& z0nq~vK+nJc9Av#z7ramxW|4w!%PeIZR!D_k=q_<;>*&tMjE}Eq%UyOl|J1qrveDJW z%PB3=lSMFLoM#~kKt>IiR1weN1P-ATFtmJ#t!_7pzau)$|I(4!TP=FI_harFD+JA}yvgGyX=wAcCjI6o=8~3lI;(9gXD_z$2|1q;0Kk_=}m`JI+$YLHhmK zh7s?wu!iMiX8hnHaqK2>KER_1pOq`&xU$eTQgIp5(rork>e5@a=bSqy6GtF$)35&m zX%`06R%w9?&Q&G?wOQBrKcMpR1^`{Po{QiN+YL!wx6H}9ff z($S1J4-Is>Q`V`J6nuXJ#ADh&po?C32xWl&56IXULQCwl*uzThm6AN{x(zGV#lZNs+Ew}>0Q}&BF zmammMc)D87$gU=Xw+e!Vo21kpdjEl9+=)@R3ixEC%%EYz@-dM1)>xi z)<(#en^TV|0ptpj%LH*z?V+2u{($zjqVc575&(ohs4f7`0Q6rzz#OV?b|g~19ZzP9 zppOsNc`}W1IYv4c6`4)XXN^LZCpYK^A<1mGf*Uif2gz`?cJpH`vu)u&Fur|x#?lrg0qa2p#oOU2vWeXfO$L93Ai@`QfA6HSx|NUGc^rGeStOK&Ug zh$!PHQ^FX-{4mOzOO5k90U!H}i-kY+5c=uo5g_D)hIn*~Lb9p?4HW9@B8X2+k29;I z9_A@s`dwuFsDL9NET~g3u2J@hJ?KtJAZ7u(jT2w58m>cZK(cOC`PX?n`nQ$o6nlR& z+l-K~H1zYVQ7D!lP)d|>vpHKk@~#!TCPAdfeH?-C>HsHVHCv)50KFkyw|9X326cG( z!a+cKj^Ugr>&CVC_7Jx^7$X2XWAt_r2hea`#AciMI`Qt}p%U7*zQ&*Idby#KegPNm zerFcX*Jt?tZC4-c3A=Dw)gy^l-^fJb16`(owzC#nl4Ox~E~dt2cI)tbq9$dEOFN#! z0YtC!PSh)%T%%6rhOEceO*FrP@{VbtAJ=XvnqipC`B{rD2SH%D<+MWIqiS$)Ya7IR zo!xO0d~%H)ci*{~1!&bP&xC%y5xBwgTJ!r*G~;;&278__rXviR(uMy{!6uKy< zVy?6#hpolvi)F5*%d$##AD0?Oa4O zIbxw-uMLTVjHgmh*hckmmWan%lBq`xj6}9U_$A^i$;3)U-*!0H45CG@cIhFX&SyE- zJkj*5Cr^S_>@q0*QRW2z0@@pmDqcq>FvJi1R_pYLxaUtL%l)(cwATM8a~;FE@g4NNgD&z4x`LeQ*H-=J{T>peHZ@+lu-s+@zLdL;{Cbo?#`H!qskJeRPDSV{xChYlyH;SN>U|50!5&t z^@t?4M6z?p!wgKX*0(7KU&I55%4k5jt^55652`QE+fElBq@H}IFoIugJ5~*_alyR4 z=yap`h~J019;50`_+PYfc_b8*x>vWxY74KtqdH>SJ0d+G^PiTHug0vGvej2@l=Ash zyB8ZQU=8zMZ8fZg-aZsh*wK$!7ixM00YFMP%Y#h7!Z~mhoS?_3W4f-u4e=J?!auyb z^W=rR<1)nLvHrE!=Pq9QV4TfwVu4Km>9R>e{P>NCM|vZdvNk0XXSDTrK4NzLIV0~2 zdiBiiUr2G3)Ej==WDg7L~SMdbMfsxR07> ziYaA-PTDSfifYLvzNUQGSMeb@uS}$!R!V%@x4rT%);b9y7ev)C{Rfl|IW!>$1L69L z#UGHVdqWODIs+fxFJ=A%+E)fzXlW=AiSlIShjM)sOhxer}y_2u+7Y=VpNvIH_L{_&$YZrYF0Nuy}u#j5^NcIZXS!Mbe% zcnF2-fo5ob@*YU9$M2W6RPDv!tO;*3KahikegjV7 za!gm;ObbQ7_}hga8H_kPsKW-FZ_St*ROG-F@KybYWhB84H*%cScNXT~K`eX;4d++5 z1k=MrBXlF0ADML-s$|J_+VC?8<$tGU%1sajm!a8?fbE?Ik*#94v?a08jSj$W$mt^A z7+>^vsC$~!A>XJOc6;v(+w&*oFB>w^l(X457w-U_YZXMcv7)N@I;IquvHvSCGaD=8 zXYM|EaY2zDw!&wR#$qB#res2pTU0s>W?7X}2;@z~>aNCUz}x?AY$cg@cVWX@cQ zDR?B1B&~Ho$yuDDUqrGZz0uU<8^qR4V2C1*l2@;Zr5m4~$p5m#8w%Vt1pHH@t%aJD zhwc14=2(R_zHaDwE1;D7(angYmMhVt`B8~)B$JQqRbq6dT)MQ+U3jLVX|UU9 zg%c8YC+vKm>gg-&WIx+7a)Tbr?N7;i3A>R&X2Z}^GZIpQ9!P}mIgopDpKz}H+O>xM zUW8Bm%cN(3ie|MC-PT!i!glfVde~n5a>vot_VXv_#CFs)HaqBN(Jhi#1TLQ7*EQ3k zz~A<&7FvAQ`a)(x8S1p%sw0^Pa@nwx!}?(!?TZNZ@c7ooA(+@{uP!IdiWu*OD|ea# zKsDb-1)h4E$?J_cMi4^QsHXJS+!F6op#*&%uy^X%QRB-u#|91n56ky}9V1Ngi>?d| znsmda!(WC2d24pnCOhC#OPw0pTga%>_{^yvB-f8JkLkgM(yz#)% zIO|t-)y}M6e$XdJ`kqoz5B>HxrcOGKQr`spEpK-~@Ry)AifVVv!<_?&fNWecwy=Wg+ zSi&IAK;b|nx9G}p?!nXMtq?*|;*6|jG-hre(ktfMo?H{c7lBS2hy{3s0WdxJ+*{an zV#eE%a&G}0xW~w+PK^&|t5aV#cQ>9*e%Y)DI^(y201h)?p?h|xA+Tmwml@xXNEVEi z8DUEeljo{WjZhm2FX8u)Ne^yGxB_?WS;zyvZEy?)eBU5VRfBQ_ycGPR^2M`D1 zsn#jY{Kk^H|JpQNnEQ(U1>v?FYJWMZlZGM0Vg4jHVo50rF#f~JerQ3m!Dj$Xu7HL_ zfU(L|dL~epe{pH~u1|@0x4+dm4&r3SoIU!pR@dR8Ts1xGm~SXU>#nZgAJEe_Xbt7V zQ^aqGk3J*r8pSG}1PB@|(hnhj8+y5H;1>uOz(rPlw2^!{f6Nizkg;~5@RtRP{b}DJ z%@exxPfVk4Ixf4uO2dk^Z9FYyBZ~b2NnbrJ2c`=(AR~Fcx%vo!Qr>6>5)=!tcWEo*a&WkON9L7mto>+sYz!k#kT69w!yk`C`~k84 z+Pwl96j7PIckc5mXyznI@3vx?SB82=(91Y||9^g{d< z`EJ6``Ep*Xv+uvv;8$Z_jf%;!`Y6_Z{cv7f3{}r|>BcWrQv81}?)+=}?A9-sZpoPpMjs;Kbw$S8rMLTE;j~&+Hb!0pi&wYnCrI^6^>l}tb@gL9z(Xt2EfoG%>A`%? zl)ey}eQSDH!h7*0>nA(rJ7-uTkICn_B`k=Nr^}Z`b$*}RJ?0Y^$J2Eoh!R=xDquFs z*l)d*mSvO8FFn@PzUu0;kI$Hzw|>fRl-0AU&L+Qne&&<0^%J(&NKYUfZf+=G_2`<} z9WJZ2MJmgE37Fa2Ei0d1m8eFtzwr>ohRYZUNsEf8Z_L+_G!032VJ`1*cJceQ z6qz4I{*Oz}&xLymF8g)d>qynUM@TwJJ|us-Ci2}fXOXVw;-pz44xr|Y?#Gt)yC0wDm~|UUEO&BT_S#==mjJKw&tGnrNWkqx@-<*5z+_`h^T>pTX!22fI``v5pz1Dix^W?Gu{cG*$^O7eLJ~+;; z%lH!4M8VVAuQ|i<8|&}Z1`=dT2G%GW(kY=bn8_iY6Mw)TKY&w1aJ359e8R<3=vjs& zrw_BXz#Fd!OYTIW|L?D4+VQWvl{91o;5mc|?&{36M^2W>Vkd@QK$LvjG=^{<4HZl3oS> zL$y|JrI{a{sg6{(PZ9Dbnje69Jc2|E30*RXR^(9Oh$@$~9}!3}w@JUx95*-%V2!<`_ICzFzXdzTQo<9)k!_#P7g4M7QcDAk% zxlUM4iz~!y5$v(q{N0Z^Y2C|z>J3CJ`=xpOOis zR>-AMuO+Iu(&87FZNlr;ZjQ?nOJnbI$ec3~?u7L(*?%_KV_o_d-#?E9Il;*2jB8-9^^lEp|?|h;K3kbN0Ey;Fo@%Z_YO^I zcf&a4-F+QBml0GOzO{`$m&05(xA}4;mKYbT-fv_vtX$<4p=?Jlfq`i)BiL0H-bxL? zm!XV6|DJXI==N#@L9xhT#FfKIHJa07%*HvG$DPUwV)SydR%jbxoWn9tYM z-<;;6J)}TMKBw|hz@U@9I0)U{L=i1j!~1x0Qzc8rQ6uHk0xros)vWYl+K_?qX|ZH_(` zChVD2F$frIn{VMsmuIItH@1r1v#EcVDO06d-U9!GE)AZ&3HUKf?j88%4f z%%^Qj!I$Pd_f|vv4Dvn}Z-Rb0rSAo{g)c*>b(E4@1wy&dRiC~n?XaXzFNRBzdfY)y z?ywrSjPBlW5)(i%dMDj-^h9rk{(=8H&8u~!VQI2T3;Ds_H!nY5m)I>O>)npoFU2Mz zYQm4g1@Q`No4%n^kxn%#A?sV1^;}2Aa5W5n|8CuJh`Mz{&($}OuMmcy(T=|a=^_(O zBuZv~qM&12-SZze@2aIgiQAd;iSuo^z;-DNwCVPyq7&BMrM1}uxh2>cV6^ww*?86V z5KItSlW3aCBD}yCm?nGu%cJ`g>W<5i@XW~Z z3~87mP4iLnL&KN+oNDLP8~@W(1;sz5HXxsdrUpO)k!u75E~01|1_grLn&MQtyQ_4) zDjsxQVUR4X&vp9AE+LT&qF7h zXEWWKdQ?=Qtv0#VyP1i<*$X|de&MIePDHD)8;P+t)+A?c+H7Yxdqm__f4~suTzgoK zipclY?|=!Ozc&}s0*6MmXb|A$1kb#i0!|(Ku;kAxk*e=rIEMHDlbaWUUzwVHwpMtp z>Z=o?I#v$^tnO|iBeb<78Zt52^Cfu(?b>T8nW0W= z*r7W9dnv*DcBVCcJT3Zd%VFI#OS*rU$c*Co4h^Oif!kO~ZRK__dUQj?%mh9|ke^Ov&tcFvjxBusJj-1o*}x}fCu#9 z3IC78TM(dqBPI9vIT!}tbG`TC!8*}{O}9Qd=(Tnl=_iRTyRO;WW?i6@%gE+SnZ2W% z&ce)Txzz44@8ae#ArBU{z&?DUEE!%gW3#Su?RBo<*j7ukdn3Did=A%1uWY(Ug8;?A z9(*iYWitKbJSU*KWV1-%8-?v>s2q@wQedwQmKdiAdA$s_4=mi7{I#$CjG9aI-dbRQ zKwga4ll8wCF=3)Ghs5bUaJb#MXM^&)VCVeEOWhO~_*!ZcjD3BXri?@cOlBG07cp!; z(hA;)gNG0T5A{b|Ie#2s+0o9b8;f)sqzljI6$%2+8!&!87eDf5FSgP1O?I3$l!p#E z%?sZ=lM9&INb!>*N_W6kLri6hHQ1>R#n)A0+;2%FWV>GL?s*)1Ps{u_*>(2=NxtQ| z{s>?*(n;OCSRtQ@jSbaxEz-bhMWXi>E~ZA5X*xN}Tg zNuU>NiPC-6v&?2-*kwC82!pImwp;;8qqYeFl^#3HW7~pemhU_(yxvs3gxIOIA5Rt_ z8G%%Sb6YN*n$jCUZb^S|J7?m>9Q{j4rL=a~n4Ev`%Mz_1oIZ=(nyo>J{_Z=; zs+gDdruSDkj95qRjn`lK=;@bi<9WPxVWI4;?uEJXcAZwZ#Qt>X+6;n@Bnb$wKqDr* zNYpJ#?6{W3yd-4f*0-Jj-Pc#Iemkd|(>3`STP5?GEcP{F2RyEHn<$YIo65YWt3j!B zzoA5uA|U~@sR3FBVOR#)S z8|qR@;q#vx9tdbd3BWTE;`xyY540I2U3QJ#7mRAx&MwdSc}eM&Z~5ls2>A=%Ffqw^ z^kaN8r|$93$Jj2!%nq*pNsFb@Q~6n5z3!%i3e)99?WbN;OxR%FSgFt0u5*f`owi}r z)_C8;SRk0tYB>O9(DAV^U2m)H$wqTVZ1FSJ^s$+zzLX(LwY&d}Kbw~?+s6^H?ei4PfZhB|WZIisI-Z9NyvO#9Y&ZDYjmRBA;k7Ul+_Ik85E z*Q+zcoN?DTH4bL%u)6VsaGcC$R%OD;bd#ml=ScIha?zP3{C4X_ea+EWH?MNl{(JE1 zB9ueH=)Ip67~fpREYn;;{jrRrV8^`B;JSeMeHj!VYJ>xjI9aLRkLYJ&iQqlt7C zBg@oe()Dzi=%soVstjq}4*~5REQv4S3%?NEQcN}{3W%7d%|IKD5h_`IS-0WPoMoy6 zt;C}wibc7kUD0IAM@#3gV_vKCGmz#%26351?J>}94=d42Z@F^{u#gsE+^kuSr6}!r8KZ=Zg$*1l&d5_wy+m$@P zMVDXkwJ^~0uki$rV%|zyJNQ1z_reh^+CtB(juA6q{VoFHsv?co@1AL$&w-~OhBkvM@Kq_cQah~mQV@N6D?iB6mLRXZFJ@e#@FmyVN3{PF zEBIv`g)i$eJ(ShC`fV~h$AR;X)Jh3xmRX*6uc6e`vF? zEfirwT`AfH*9Y~iwN7M*(OyGSSdA1M^>Y%`9QghHCnI=w!$AH4NaqfP8QOK@*Y_;j>bgC<$ibA) zTC?BpeB#DK#M?q972cDEs*$%(W91j8XM0W89gFpGj7oZ`*2(u=i>GI9@rMqlneKYo zgTy;b3$)Y<2lK4t$C04h+d9o4$()EI*iTGO3*R^bvCC8+hTpJQ%`WILB^Fxtvcf*r z1+&Pe8m{;V_iK5-P6#z#@^0UWT3|Z;02ce8F)02K^-nl7Peqt~$WV=j@JxJaaRPc? zn_ur@&&p9$G)E&@j;dV?k41#v`p3z&Tj@?IpaJi^HR^uLjer=0=_q0On zelv?wI%}dp$erS@lILr2ODk(1Axk@3=0uj0JB0AX%~c$|K@67m#2qbEBF{c{d1OaE za~c$5dAWxyR1A+}GpFZ!V_T@Fw2=*tZU~>!21Y|i-HC}4P|$6<$fCG|3_2C7Gzx>{ z?u_ft%p1s7WyWi4<$g-{+I%uUuGLK*yH7d~C=mF;w0BrIFuRg^n6e58o8cW>Q{CT( z=FJ_aR}Q&sal82@l5GDF0=gWoNr zE=YK9MawAL6q>Qe6Tb9%_{IREnn2-Sj81s(@I1i#{R!8In&q;XNZJU5^*5QPrC?#3 zMvc{w*GPVIQiR8=*mDMHaxtfNc~8_YoF-r$6Pb}Tc1PLRyZ9Qh6V2(16wM{CC_WYL!(i=Ge~50%y;9WpakAWqdE;i zh02-@2}|t9%3lo6d>Q5!VMG+~8&a<=ZiW)oPR#I#E?6`OD(FRQp33#0Syt<%^49fR zC-2tR^%?Gl4G2^yek;CYTj}I{87Zd;s1hwm-B4zvwbJG!PE{%fL8s>UUcIb|A${1j zK0|*FyFq1e#bmlh+_t38oK3dme%fi^U#F24TD;uh>(hL!i#Hueq*nc~~Z^ZcB94}nEa`GA!=}ug>-R!4+$F<7_*q{Hnk{kejt==S!nEH^<`P- z+a;C@jyI8QD+<3N|7+g*zu|HJ4wpea0JTYSu`WX(saK6@G0_zD$;S*x+vuLaTLh(d zWW<%arQ4m+G~ZfFT8T$^xR1Zg-{${p&PB~k;8+G3`J4}*;_Kex6FWeh*p@nn<}!`I z=z)Z<@xC^4ce(+ZcHE%%;4g|p4)c-T%|g$@#7}S1JBiB z3D18Ge%vZ-uw~cF)T810ChIw8e`8nVkEc;;f z?>-Pl`pLSt)UYSvkiZ&aJ+Z4Bi+ymc=f&F{w6-~pA3bb1O;Z;K@^Lx2OFR&e=!TFO zE2)r#=`OJZbL04hm)c2Nt7yd=FM2Zb&5msYnkf-wpq5lO7H?<}*#z%`P4h2Psl<=0 zAF1H#qC27h%J(qdxBWMf-eBN)C zydnDwkK}^X04$06CudGeP7uV~ND6#tZZ`ySqFq%TX*OIq#y9F+E?gONH3^sDTa)iG zCk@?^eMx?=v==3N!h70;bwzWZhys}_L)5M$&XE@Aa=FSfj2;wls8?dIbC*urF=}ZB zaiwN7`L~xNeLbCy*{YilL9RiurJ>o$rJ=6ecpGNGwGb%}j}2^04tVyT($A>!(FP z+yZpG`n)kK0$vU^{_CEK=EUH5;g_YcBaAw={-ZH^&km$&X4oIPoBMOj6Qz&FV zTj=}3&(Y4<(ixkd7TrUyid!w~f;@3yG&$Nc-Mm@km90kDx*9`jFdbEk-E1sJeO;v5 zXM}XjWPm&@)M3sw<9=cjcIU;2W*x7xzsi`P)cvX5OB89Spjl zHUdw3F0;6e$WDt%pzk{a@x#53hdF!+A{AB|0+|fWv?9R6$L}#0K&V&Z4DpZ`6mRpB zn%-%zL$i~Zfk?v?5j0_nlk=l6Pw%Kj zPJW=AusMsA$2+BZ3b5NSj(X*_Chxkkr4L~n;+kGG*NbQyr(UYR5z!f<&2& z=#|2rr0TY#)-(Ftyf?Sb@lGypFBn5!2<-Lt#eu48KJn9+;PYdD?bY<^j3>A8Yg_Y# z(iQdU{L|calH`b=rL`n+i+$%Xx?I9D|26XEi_e)Bid=q%J}++bwXlFd_bp%IWiUR= zevjkYfxRs@Fw?Za*Fi+P)hiyf52kexjK0I(6A zPHvojKtV_&xt#l!^b$(CL?m40Zf3BzfX&4!qFfoRc)UnRX>4?%FaPx_(Je%#7aRJ4 zOWu>eBHI6zAD9T~3TkMvrgsy}Xxs`)JWM}*;o;E&e;2gL52SabrwCSNtjZAq-WdgD zCs*I^)Np5VYpBZ_iZ5uAM5jvB3v%1Q2}h#NS)5!PRRBo6B^wzLN+4FW>yt zWO^Pxd?dC-Cqju6!#+cw7X%G7${gvJczft64u54h(~x-U0wS|M{nM`65N!KgU~q`4 z*AQziZ7U;E8$Yx)O6Xk?YAguNY$r*N)?Ae@-Knv}&Nx(8*T?wp8fm>&RP&JI6S>;| z&35vyMX`$Qg@r?F!GgssEzAuwz1YEyI9GNs1QB{xvJU6KukZB~iz+(=FDSI{=81L& zQ%PTmQ+S-X^?-O4e6)EaC_ujq39I148}vw#=`mFoMmw6n4f}aNe%r(0HCt->=XkQv zvN&TZk4M@I`{2ic*4RA+Tv?25Q5Al&KNQ9dd#uj&KQhwFK*7iN8UP3{VT#rjJqh-KrqFWy7q|8KXO3GFCJrEV*KJfc`m&Y z>Rx(zo%WMZYX#__1W_OXHi=FXFV?}1rIKnrw~jrJ{$Oaft}eoTP+Qn+p{3Y1DcyH# zgeIN7FGkCRl3`KKh17?rrUucU>4#OoQ-bq~`0z&Y^43{?pYl$5^; zv<&2Te5$)*OwLNv-1}7xl7t-l5?~;Sn=t<7VH5$fB|{XPnF3m8drRrSo&WLkPtM;5 zD4x`_Po7tEO^NV+{ZuR9*a1G1`yPA--=w-0!3=%-EpP{*{Rut04+}fYrLEavzH!Li zT3_ORZh@-$^&Q_bG4A|C86B&FN7)5W!)_)vA=!wkE-1>=^wC3?VQ;Ro^vZMxD-81-`jKh{Vmufw;3Vc-~OA;^Xp` zR$JE`mleggpFeXIh?d#Mg;PFS6F4sFG@v9+V=HZHSG>uQVt}mpMFXP#MKLAHi=em9WSxyPl{H|3e1Xn0zQVnCvs035#bF!MCqFGPwB&bm&et)%{+Lip6az8nS43JuxY)gcqrV!Oy@y^Sq3hG?Q zdn4QV6E#0tC+b18eRgSIQvTfRH~B|hkIdyNUt2QR&mdC_0I;%g=34bv>ZjWzsvk!S z!Z8Zlk}hiEmHPQ~sr&)qDf2ZWo(w(Fmh zuZk!2UeL9;qdxcIs&7rvI)am5{tcOW>O0E#jjw)gP132lIwD_m_5|ucpy0GiCS1=c zLtk`SUU=wYu*iUEifQu($Opm`4843}1lX@&m{Gl7kz&I&i#5Po`Rwyk)5l-m2~{Ug zze6a@Y3@eNW&>B3vf>V*%qX^v9JSMocL1DO@0y*bP(RywX_0!xh$}bbB(>;!Yd-XG z4Jqt9O7ZT{ z=BzJa^3K<-7HWcX`&XB=oQogAW=0JocDY(dF43PC)4Y)UV)pEJk0%EBxaHO&+ujYG zF`qWpZS95%h5_zMwpDB6IOSS5rP^N~Eg%1yT4dCoZom1uIdBnwJ2^(ALhd1$excms zSz3q&Ap(rUwHU@92nGrN5Nkb?hOt|tKkM$*Io)2NWAjq6lMY_X_<=OQ6A$Z7^Qb`g zntL%Df7IS{E2KgEyIy8yfpLSReX`+{tu%el8(h?*H}D_n^==duUyCw`9@-biQk`QX zxL<-m<`A74V&RpBMbf<5ZHFYo``J2I1DfjJMZ>yw2MutLXP8zNeY_hzy6VSyGaj08 zX&Y(kflI<=F+hsX&y%cglYKc@t@{Hr?M zh3=)Ev-gMh5N#O76Q3BOB>~$j;b=rO6RB$w%#W-dU9rLXRi$4g^K@#XN_Voar#uV* z96{7>5P0M&UY?h>FbDDxX?q6t;3NN>qEJ1chNZw zQ`ExOIFtJ+I_84x8TWM7@f#ualh(RL=^c_xTMdhWA&Vio+3LIins|%!`QqgXKWz9# zXgy)A^VD=5bGg?2WnEK^^U}L@&I?PTY4m&_45zfj#U@Bx>$x@cajk-yD?2ge&}T^H zcU^?pAk-I}Fj24Rg+Qa9vvGX@3a@O!!|IS*apOtww_hU%TN&Fu1P{Wwl;Rt?waKgg z;>Q`an9@}v_h6BtiKDTO1QTvgkuO%o^IE@9@cPtEqzO?IsQ@$zcN(dD#AR=DL^9ILK^lz3dI@s5sW8tngk_<6WUj->SoN zb$<@1e<)Y*U^P}*$4)KvlYSd6X6e+Z`!2_1t?K)B&a(V&wiN>ir_=>+P-rICFNoaJIfnngt|1x^0=;AxX(AFJnH zVU+IM*R2Hd{561D_m}ok;&aqx0M;HhyPO*h?aH~_lD+LEAna%8O-Ch-$MUVf{E%Hs z_H3IWu?*77afjWGubnHqj1T?r`|Izv=Zu?CRgbE6_?f9n>BgMbJhW!3NNMQ!r?Eh|S+MoOW_1sbZArkvDezNAhhZ^{0&+VnTsn?RD5h5Fx@c-+%$>;3zC z*M$Ck$y8qKpAr0z2mI$5{9~d0Sw(+a3TWYfEE#lGe|*s&Z~A9P`~TPu90V5%Mnpf^ zSL%?}XB1I3_SU)&YhL>2v^wk$Z`A(-hu(>QjfMFW4F0!xew4reE8eJo9eDl;%Kz`o J4dw6Ye*=h#0f_(r literal 0 HcmV?d00001 diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..354e7fe --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,12 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["./templates/**/*.{html,js}"], + theme: { + extend: {}, + }, + plugins: [ + require('@tailwindcss/forms'), + require('@tailwindcss/typography'), + ], +} + diff --git a/templates/companies.html b/templates/companies.html new file mode 100644 index 0000000..cbf5b65 --- /dev/null +++ b/templates/companies.html @@ -0,0 +1,38 @@ +
+
Processing...
+
+
+
+
+
+ +
+ + + + + + + + + + + {{range .}} + {{ template "row.html". }} + {{end}} + +
#CompanyContactCountry
+
+
+
+
+
diff --git a/templates/company-add.html b/templates/company-add.html new file mode 100644 index 0000000..3fab4c8 --- /dev/null +++ b/templates/company-add.html @@ -0,0 +1,6 @@ + + {{ template "row-add.html" . }} + {{range .}} + {{ template "row.html". }} + {{end}} + diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..0eb330d --- /dev/null +++ b/templates/index.html @@ -0,0 +1,21 @@ + + + + + + + + + Go + HTMX + Tailwind + + +
+
+

Go + HTMX + Tailwind Example

+
+ Companies +
{{ template "companies.html" . }}
+
+
+ + diff --git a/templates/row-add.html b/templates/row-add.html new file mode 100644 index 0000000..a20d793 --- /dev/null +++ b/templates/row-add.html @@ -0,0 +1,51 @@ + + + + + + + + + + + + + Save + + + Cancel + + diff --git a/templates/row-edit.html b/templates/row-edit.html new file mode 100644 index 0000000..cb9e5ee --- /dev/null +++ b/templates/row-edit.html @@ -0,0 +1,53 @@ + + {{.ID}} + + + + + + + + + + + Save + + + Cancel + + diff --git a/templates/row.html b/templates/row.html new file mode 100644 index 0000000..be76c33 --- /dev/null +++ b/templates/row.html @@ -0,0 +1,29 @@ + + {{.ID}} + {{.Company}} + {{.Contact}} + {{.Country}} + + + Edit + + + + Delete + +