From 7749082566048f7f7d8cc85aed8e35e898930b85 Mon Sep 17 00:00:00 2001 From: iqbal024 Date: Fri, 25 Apr 2025 20:43:44 +0700 Subject: [PATCH 01/11] get data footer --- src/components/layouts/Footer.tsx | 73 ++++++++++++++++++------------- src/services/hooks/property.ts | 1 + 2 files changed, 44 insertions(+), 30 deletions(-) diff --git a/src/components/layouts/Footer.tsx b/src/components/layouts/Footer.tsx index 61fac2c..33b6881 100644 --- a/src/components/layouts/Footer.tsx +++ b/src/components/layouts/Footer.tsx @@ -1,6 +1,21 @@ +"use client"; +import React, { useEffect, useState } from "react"; import Image from "next/image"; +import { useLatestPropertyQuery } from "../../services/hooks/property"; export default function Footer() { + const { data, _fetch } = useLatestPropertyQuery(); + const [isDataFetched, setIsDataFetched] = useState(false); + + useEffect(() => { + if (!isDataFetched) { + _fetch(); + setIsDataFetched(true); + } + }, [isDataFetched, _fetch]); + + const latestProperties = data ? data.slice(0, 2) : []; + return ( <>
@@ -10,36 +25,34 @@ export default function Footer() {

Latest Properties

- -
- -
-
-
- - Retail Store Southwest 186th Street - -
-
- From $120/month -
-
-
- -
- -
-
-
- - Apartment Building with Subunits - -
-
- From $120/month -
-
-
+ {latestProperties && latestProperties.length > 0 ? ( + latestProperties.map((property, index) => ( + +
+ 0 + ? property.images[0].url + : "/images/featured-properties-17-480x287.jpg" + } + alt={property.title} + width={161} + height={136} + /> +
+
+
+ {property.title} +
+
+ From ${property.price}/month +
+
+
+ )) + ) : ( +
Data Not Available
+ )}

diff --git a/src/services/hooks/property.ts b/src/services/hooks/property.ts index 39ae8d8..1e9ff13 100644 --- a/src/services/hooks/property.ts +++ b/src/services/hooks/property.ts @@ -1,3 +1,4 @@ +"use client"; import { CardPropertyData } from "@/schema/property"; import { useState } from "react"; import { fetchLatestPropertyREST } from "../rest/property"; From 0cef18f696c74188d79cffa86bf7a2f6923c3391 Mon Sep 17 00:00:00 2001 From: RizqiSyahrendra Date: Sun, 27 Apr 2025 11:01:54 +0700 Subject: [PATCH 02/11] feat: new header styyling --- package.json | 4 +- public/css/style.css | 21 +- src/app/(main)/globals.css | 4 + src/components/layouts/Header.tsx | 357 +++++++++++------- src/components/layouts/HeaderDropdown.tsx | 76 ++++ .../layouts/HeaderFeaturedHomes.tsx | 34 ++ src/utils/general.ts | 7 + src/utils/style.ts | 6 + yarn.lock | 9 + 9 files changed, 379 insertions(+), 139 deletions(-) create mode 100644 src/components/layouts/HeaderDropdown.tsx create mode 100644 src/components/layouts/HeaderFeaturedHomes.tsx create mode 100644 src/utils/style.ts diff --git a/package.json b/package.json index d6e273d..c5dba84 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@payloadcms/plugin-form-builder": "^3.35.1", "@payloadcms/richtext-lexical": "^3.35.1", "@payloadcms/storage-s3": "^3.35.1", + "clsx": "^2.1.1", "country-state-city": "^3.2.1", "dayjs": "^1.11.13", "graphql": "^16.8.1", @@ -29,7 +30,8 @@ "react-hook-form": "^7.56.1", "react-select": "^5.10.1", "react-toastify": "^11.0.5", - "swiper": "^11.2.6" + "swiper": "^11.2.6", + "tailwind-merge": "^3.2.0" }, "devDependencies": { "@eslint/eslintrc": "^3", diff --git a/public/css/style.css b/public/css/style.css index b223537..ac840f3 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -3744,13 +3744,13 @@ html .page .divider-secondary::after { } .button-primary, .button-primary:focus { - color: #ffffff; - background-color: #bc986b; - border-color: #bc986b; + color: var(--color-colorBtnPrimaryText); + background-color: var(--color-colorBtnPrimary); + border-color: var(--color-colorBtnPrimary); } .button-primary:hover, .button-primary:active { - color: #151515; + color: var(--color-colorBtnPrimaryText); opacity: 0.8; } @@ -3759,15 +3759,14 @@ html .page .divider-secondary::after { } .button-secondary, .button-secondary:focus { - color: #151515; - background-color: #fdde52; - border-color: #fdde52; + color: var(--color-colorBtnSecondaryText); + background-color: var(--color-colorBtnSecondary); + border-color: var(--color-colorBtnSecondary); } .button-secondary:hover, .button-secondary:active { - color: #ffffff; - background-color: #bc986b; - border-color: #bc986b; + color: var(--color-colorBtnSecondaryText); + opacity: 0.8; } .button-secondary.button-ujarak::before { @@ -11699,7 +11698,7 @@ html.tablet .ui-to-top { } .rd-navbar-static .rd-menu { - z-index: 15; + z-index: 30; position: absolute; display: block; visibility: hidden; diff --git a/src/app/(main)/globals.css b/src/app/(main)/globals.css index f7699f9..7768b0a 100644 --- a/src/app/(main)/globals.css +++ b/src/app/(main)/globals.css @@ -35,6 +35,10 @@ --color-colorText2: var(--color-colorExt20); --color-colorLoaderBackground: var(--color-colorExt20); --color-colorPriceTag: var(--color-colorExt30); + --color-colorBtnPrimary: var(--color-colorext40); + --color-colorBtnPrimaryText: var(--color-colorExt20); + --color-colorBtnSecondary: var(--color-colorExt50); + --color-colorBtnSecondaryText: var(--color-colorExt20); } @layer components { diff --git a/src/components/layouts/Header.tsx b/src/components/layouts/Header.tsx index fc8378f..1b3e0ac 100644 --- a/src/components/layouts/Header.tsx +++ b/src/components/layouts/Header.tsx @@ -1,4 +1,6 @@ import { headers } from "next/headers"; +import HeaderFeaturedHomes from "./HeaderFeaturedHomes"; +import { HeaderDropdown, HeaderDropdownGroup, HeaderDropdownMenu } from "./HeaderDropdown"; export default async function Header() { const headerList = await headers(); @@ -103,46 +105,134 @@ export default async function Header() { srcSet="images/logo2.png 2x" /> - {/*

- Dynamic Realty -

*/}

-
- - BOOK APPOINTMENT - -
diff --git a/src/components/layouts/HeaderDropdown.tsx b/src/components/layouts/HeaderDropdown.tsx new file mode 100644 index 0000000..e29d103 --- /dev/null +++ b/src/components/layouts/HeaderDropdown.tsx @@ -0,0 +1,76 @@ +import { createSlug } from "@/utils/general"; +import { cn } from "@/utils/style"; +import { FC, Fragment, PropsWithChildren } from "react"; + +export const HeaderDropdown: FC = ({ children }) => { + return
    {children}
; +}; + +type HeaderDropdownGroupProps = { + title?: string; + className?: string; +}; + +export const HeaderDropdownGroup: FC> = ({ + children, + title, + className, +}) => { + return ( +
  • + {!!title &&
    {title}
    } + {children} +
  • + ); +}; + +type HeaderDropdownMenuItem = { title: string; href: string }; +type HeaderDropdownMenuItemWithChild = { title: string; child: HeaderDropdownMenuItem[] }; + +type HeaderDropdownMenuProps = { + list?: (HeaderDropdownMenuItem | HeaderDropdownMenuItemWithChild)[]; +}; + +export const HeaderDropdownMenu: FC = ({ list = [] }) => { + return ( +
      + {list.map((item, idx) => { + const collapseId = createSlug(`collapse-${item.title}-${idx}`); + const hasChild = "child" in item; + + return ( + + {hasChild && ( +
    • + +
      + {item.child.map((itemChild, itemChildIdx) => ( + + - {itemChild.title} + + ))} +
      +
    • + )} + + {!hasChild && ( +
    • + + {item.title} + +
    • + )} +
      + ); + })} +
    + ); +}; diff --git a/src/components/layouts/HeaderFeaturedHomes.tsx b/src/components/layouts/HeaderFeaturedHomes.tsx new file mode 100644 index 0000000..f789f95 --- /dev/null +++ b/src/components/layouts/HeaderFeaturedHomes.tsx @@ -0,0 +1,34 @@ +"use client"; + +import Image from "next/image"; + +export default function HeaderFeaturedHomes() { + const images = [ + "/images/featured-properties-17-480x287.jpg", + "/images/featured-properties-17-480x287.jpg", + "/images/featured-properties-17-480x287.jpg", + "/images/featured-properties-17-480x287.jpg", + "/images/featured-properties-17-480x287.jpg", + "/images/featured-properties-17-480x287.jpg", + ]; + + return ( +
    +
    + {images.map((src, index) => ( +
    + {`Gallery +
    + ))} +
    +
    + ); +} diff --git a/src/utils/general.ts b/src/utils/general.ts index 5e09779..39dc83f 100644 --- a/src/utils/general.ts +++ b/src/utils/general.ts @@ -24,3 +24,10 @@ export function formatCurrency(num: number): string { //maximumFractionDigits: 0, // Causes 2500.99 to be printed as $2,501 }).format(num); } + +export function createSlug(val: string) { + return val + .replace(/ /g, "-") + .replace(/[^\w-/]+/g, "") + .toLowerCase(); +} diff --git a/src/utils/style.ts b/src/utils/style.ts new file mode 100644 index 0000000..a5ef193 --- /dev/null +++ b/src/utils/style.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/yarn.lock b/yarn.lock index 96966cb..7b20ee9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5044,6 +5044,7 @@ __metadata: "@types/node": "npm:^20" "@types/react": "npm:^19" "@types/react-dom": "npm:^19" + clsx: "npm:^2.1.1" country-state-city: "npm:^3.2.1" dayjs: "npm:^1.11.13" eslint: "npm:^9" @@ -5061,6 +5062,7 @@ __metadata: react-select: "npm:^5.10.1" react-toastify: "npm:^11.0.5" swiper: "npm:^11.2.6" + tailwind-merge: "npm:^3.2.0" tailwindcss: "npm:^4" typescript: "npm:^5" languageName: unknown @@ -9759,6 +9761,13 @@ __metadata: languageName: node linkType: hard +"tailwind-merge@npm:^3.2.0": + version: 3.2.0 + resolution: "tailwind-merge@npm:3.2.0" + checksum: 10c0/294f6c2db0df74405bff126107107426c3126a70a1717d78e8d6811db65546c9bb3d61282bdb8d9fbded23f6bc8ec3e8e61031a4f53265f90b7f3dba558f88f4 + languageName: node + linkType: hard + "tailwindcss@npm:4.1.4, tailwindcss@npm:^4": version: 4.1.4 resolution: "tailwindcss@npm:4.1.4" From 0cf9ba523e918c6e38c2ec4e14d8e2370b73791e Mon Sep 17 00:00:00 2001 From: RizqiSyahrendra Date: Sun, 27 Apr 2025 11:08:59 +0700 Subject: [PATCH 03/11] fix: footer text format --- src/components/layouts/Footer.tsx | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/src/components/layouts/Footer.tsx b/src/components/layouts/Footer.tsx index 33b6881..ebb9f72 100644 --- a/src/components/layouts/Footer.tsx +++ b/src/components/layouts/Footer.tsx @@ -1,18 +1,16 @@ "use client"; -import React, { useEffect, useState } from "react"; + import Image from "next/image"; +import { useEffect } from "react"; import { useLatestPropertyQuery } from "../../services/hooks/property"; +import { formatCurrency } from "@/utils/general"; export default function Footer() { const { data, _fetch } = useLatestPropertyQuery(); - const [isDataFetched, setIsDataFetched] = useState(false); useEffect(() => { - if (!isDataFetched) { - _fetch(); - setIsDataFetched(true); - } - }, [isDataFetched, _fetch]); + _fetch(); + }, []); const latestProperties = data ? data.slice(0, 2) : []; @@ -29,23 +27,14 @@ export default function Footer() { latestProperties.map((property, index) => (
    - 0 - ? property.images[0].url - : "/images/featured-properties-17-480x287.jpg" - } - alt={property.title} - width={161} - height={136} - /> + {property.title}
    {property.title}
    - From ${property.price}/month + From {formatCurrency(property.price)}/month
    From 3d900192898768e805f0e3eac8cfcab1fe2997c5 Mon Sep 17 00:00:00 2001 From: RizqiSyahrendra Date: Sun, 27 Apr 2025 11:11:27 +0700 Subject: [PATCH 04/11] fix: header padding --- src/components/layouts/Header.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/layouts/Header.tsx b/src/components/layouts/Header.tsx index 1b3e0ac..a6d1081 100644 --- a/src/components/layouts/Header.tsx +++ b/src/components/layouts/Header.tsx @@ -120,7 +120,7 @@ export default async function Header() { -
    +
    From eb78e44f1c4ce6b663e84c4c4c57d4d004dfb6f1 Mon Sep 17 00:00:00 2001 From: RizqiSyahrendra Date: Mon, 28 Apr 2025 05:11:33 +0700 Subject: [PATCH 05/11] feat: header UI styling --- src/app/(main)/globals.css | 2 + src/components/layouts/Header.tsx | 315 ++++++++-------------- src/components/layouts/HeaderDropdown.tsx | 17 +- 3 files changed, 130 insertions(+), 204 deletions(-) diff --git a/src/app/(main)/globals.css b/src/app/(main)/globals.css index 7768b0a..3979b74 100644 --- a/src/app/(main)/globals.css +++ b/src/app/(main)/globals.css @@ -39,6 +39,8 @@ --color-colorBtnPrimaryText: var(--color-colorExt20); --color-colorBtnSecondary: var(--color-colorExt50); --color-colorBtnSecondaryText: var(--color-colorExt20); + --color-colorLinkText1: var(--color-colorExt30); + --color-colorLinkText2: var(--color-colorext40); } @layer components { diff --git a/src/components/layouts/Header.tsx b/src/components/layouts/Header.tsx index a6d1081..9bc29a4 100644 --- a/src/components/layouts/Header.tsx +++ b/src/components/layouts/Header.tsx @@ -1,18 +1,7 @@ -import { headers } from "next/headers"; -import HeaderFeaturedHomes from "./HeaderFeaturedHomes"; import { HeaderDropdown, HeaderDropdownGroup, HeaderDropdownMenu } from "./HeaderDropdown"; +import HeaderFeaturedHomes from "./HeaderFeaturedHomes"; -export default async function Header() { - const headerList = await headers(); - const fullUrl = headerList.get("x-full-url"); - - const headerActive = (pathName: string) => { - if (!fullUrl) return ""; - const splittedUrl = fullUrl.split("/"); - - return splittedUrl[3] === pathName ? "active" : ""; - }; - +export default function Header() { return (
    @@ -113,6 +102,108 @@ export default async function Header() { Buying / Selling + + +
    + +
    + + +
    + +
    +
    + +
    +
    + + + + + + + + + +
  • @@ -139,22 +230,22 @@ export default async function Header() { list={[ { title: "Our Rentals", - href: "/#", + href: "#", }, { title: "Application Process", child: [ { title: "Before You Apply", - href: "/#", + href: "#", }, { title: "Rental Criteria", - href: "/#", + href: "#", }, { title: "Before You Apply", - href: "/#", + href: "#", }, ], }, @@ -169,15 +260,15 @@ export default async function Header() { child: [ { title: "What To Be Done Prior", - href: "/#", + href: "#", }, { title: "Next Steps (keys, utilities, etc)", - href: "/#", + href: "#", }, { title: "Common Questions", - href: "/#", + href: "#", }, ], }, @@ -203,15 +294,15 @@ export default async function Header() { child: [ { title: "What To Be Done Prior", - href: "/#", + href: "#", }, { title: "Next Steps (keys, utilities, etc)", - href: "/#", + href: "#", }, { title: "Common Questions", - href: "/#", + href: "#", }, ], }, @@ -220,10 +311,10 @@ export default async function Header() { @@ -237,181 +328,9 @@ export default async function Header() {
  • - LOGIN + Login
  • - {/*
  • - - Properties - - - -
  • -
  • - - About Us - -
  • -
  • - - Blog - - - -
  • -
  • - - Pages - - - -
    -
    -
    - - -
    -
    -
    -
    - -
    -
    - - - - - - - - - -
    -
  • -
  • - - Contact Us - -
  • */}
    diff --git a/src/components/layouts/HeaderDropdown.tsx b/src/components/layouts/HeaderDropdown.tsx index e29d103..32b3ff9 100644 --- a/src/components/layouts/HeaderDropdown.tsx +++ b/src/components/layouts/HeaderDropdown.tsx @@ -2,8 +2,12 @@ import { createSlug } from "@/utils/general"; import { cn } from "@/utils/style"; import { FC, Fragment, PropsWithChildren } from "react"; -export const HeaderDropdown: FC = ({ children }) => { - return
      {children}
    ; +type HeaderDropdownProps = { + className?: string; +}; + +export const HeaderDropdown: FC> = ({ children, className }) => { + return
      {children}
    ; }; type HeaderDropdownGroupProps = { @@ -24,7 +28,7 @@ export const HeaderDropdownGroup: FC ); }; -type HeaderDropdownMenuItem = { title: string; href: string }; +type HeaderDropdownMenuItem = { title: string; href?: string }; type HeaderDropdownMenuItemWithChild = { title: string; child: HeaderDropdownMenuItem[] }; type HeaderDropdownMenuProps = { @@ -37,13 +41,14 @@ export const HeaderDropdownMenu: FC = ({ list = [] }) = {list.map((item, idx) => { const collapseId = createSlug(`collapse-${item.title}-${idx}`); const hasChild = "child" in item; + const hrefClass = hasChild || !!item?.href ? "text-colorLinkText1! hover:text-colorLinkText2!" : ""; return ( {hasChild && (
  • = ({ list = [] }) =
    {item.child.map((itemChild, itemChildIdx) => ( - + - {itemChild.title} ))} @@ -63,7 +68,7 @@ export const HeaderDropdownMenu: FC = ({ list = [] }) = {!hasChild && (
  • - + {item.title}
  • From 19b82640ee3947d690a679445fc1650f2296df97 Mon Sep 17 00:00:00 2001 From: RizqiSyahrendra Date: Mon, 28 Apr 2025 17:28:42 +0700 Subject: [PATCH 06/11] fix: home UI total revamp --- public/css/style.css | 2 +- public/images/logo1.png | Bin 0 -> 17753 bytes src/app/(main)/globals.css | 1 + src/app/(main)/page.tsx | 226 ++++-------------- src/components/HeroSlider.tsx | 35 ++- src/components/homes/HomeTopSection.tsx | 5 +- src/components/layouts/Footer.tsx | 56 ++--- src/components/layouts/Header.tsx | 22 +- .../ListOfFeaturedPropertiesFooter.tsx | 37 +++ 9 files changed, 136 insertions(+), 248 deletions(-) create mode 100644 public/images/logo1.png create mode 100644 src/components/properties/ListOfFeaturedPropertiesFooter.tsx diff --git a/public/css/style.css b/public/css/style.css index ac840f3..021cd23 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -11353,7 +11353,7 @@ html:not(.lt-ie10) .not-animated { .ui-to-top:hover { color: #151515; - background: #fdde52; + opacity: 0.8; text-decoration: none; } diff --git a/public/images/logo1.png b/public/images/logo1.png new file mode 100644 index 0000000000000000000000000000000000000000..db2b9295446173065213d6aa4e9848c2153c33fb GIT binary patch literal 17753 zcmeI3`#;nF|Nlu+Bpnp_+7w&D)|vLRS~AUo~-z5@wG?hq+BhPp?D4Dh1V!w@+USIdJ?X z=(h}+Tz;8hv`ESw`I=+1aU8je>wd&3O<5jk{bl-a)W#r2HyxG|_hW1Fr zF~Z3Emnzn8htgmUH8PbM6`~m`_R@0ukMnT0^5SID^f)o>z?AY6%b%3h&|Wf;%Y=dn zXUk&dqDNO-tEPp4OZ>mr|BDr9aX%m>gtjVo)L$Nvdvf)L;{F|Wzy~&;PZgSc9gGsP zRX7>Dy1;$)Mwb~?RAj3%sN#V7{>fEpx9|@Ag#J+Q{EO51QST@+Bm2`k4%N8KhxduD z6dcW0i>h#RY!ngNzoY(y@b2QtBdg^OrAO!H=8QZU<&JX_-+c$sBm6qryopR|dTQ#H zCO&weezv~TQLQi`p(_cXFrnL%J~K8(>v!#sL{EJDcqIS|WlUFE(V|~F>2!Xy zNcl3p>~D!Wdibyk-3T^wciQE}?irygmF4B-=4~ylB_$GvRf0b>CZCTW!>Rkq{FDJ7?$BAja!&cU#c~Mwm$@ zM+Je@WM65Mg1SuJxRB6pVc?z$ZH zxK>bTu5tC=Y&|Faf7ZbIp3oJq(bjl7*suaVzRz$q4&u5Bk-uzCi*+;0USD4~4oz+? zoT!D!eeFIVyA$}1ds|$p#p%D3Q&UqdAUVV1 ze*m}dbgAoun3&iEi&|ylKU=32U`&YZk&}~4#yvy(y1{2l15vf1$S7y2-3Nfpma%*= z%n`c)0%fU4i{F%#l*Al-@_D+#N|@*>Y>4$lT+3dUsy7^AGMOCV6K16s|K7vB3Ll<2 zfL`T{?lRKR3AeDc>>@q>a;FD}!x5mgj~_pV>Ys(4kyWy5-k@@$&VQXrnijr&<xeM$ zMa62o4AC&rxqXo-Ij$kBqK8**yMWmfP(qOV?}X>43PfD&Dim5sq*0U(d~1Un=|?`A zYObqVK=mJO(OMQ+Xb{Gg+9l));Z=4e zx2h6?OpLS*4Yza{r5#ma5fLSZ1vmOt_X#EJKW-{!`@PfKE@gg{WE`{Hqe~d1QUwoW zeB<-97JrS8k6ZeyBV8F@%gf7BjMn^oMS02IeCVB)2uG2BHhiywjH<6DF~gMDHF1Z- zbz+{r-%35<6}SB8(IZOmaKoZLE|+ln;1elGwpM7anFfYimu)pA|K-lTg>0Yvn(kp1 zo2?OZS>{AR(M$Im&xsiYf{0O$8^@vP^R!3ja){s2GjA9g{xvQYUE(XB`lRUMGp|BJ zLp$n8)dAGA3py6ylLbZZc4n`C_;7ioDV#NKvRI4L)z|m;7%!<m{?XZfB=CjHd8_ z*$)py}YkuRE>n(B72OK#>?tgHGaF0H1frmnMmFC5*geKb2ipGSZ~p{HVkk&NC? zly7(Me~*8pJx!xfWCO)al&AN({$WYFki1X9|Hr60g~@Dnl^QMbWbU6I2#@O=K}VF~ z@e$@o39LF=R#+jk9o5{_*w}bJx2Hrpj@_lV`_VQ8j41}5^p~y8DW^`Il09A-nt>|k zuC8jvbWJrVDk&MON3l|jfBg6{E?_u^{9aYP*dhHqU}}0=BdDXIqNe6NT1lLDF{f|Z zYoT!)GA%1d`jlyi-(5Mq0Vb+xstLJ9e=|Q_hcikh1&4%$+^E7u%@3XDpRf<>Bl^mE zq?)KToZZNcn6&`AS)#ClDi-8zqvCAXMpsk*shG_eAD`*RVvgtazX$`7@O9nRfvB#| z+CeVFKO-J_6(;xr?ZhwRO|u)pIP(nf>5NJ;qxIoKQR8KBwt|-{^t*;~?L00?3p&@C z{(X7EABk(MJEhO;`v^`As0+=0ropq<$ByMY57y+@n#!NL1b1!G+AwDnp80Xh;7%1R zg|PCe@f%My7Db@itv|bkbYh4Sc`Uq56}O?Y4tP2ob)hiGI3x zHkvk_Qs(+)yWPoQ2?=d(#EzskZR?i%n&VCgXuR2@+jeT1IcJcP=wZ9cul>UR32lzj zFyB2;b$L#;Vozu1jZU|%XO>4W0ue{oz$C4DbJnq9FKnF_t`O;%?V8dFsSm)l% zn4kTPFzLYG*41`);%rsNk|xyp)F*m<^Xfvs*Us?P`<&%t?T$3zvY{3Rf~~N)L4`wm zdZBP4H)s?hAL=$eG8yA<0rqw+B_AAe`E@TKje33=0_APLXAkH^S<}igZ`R}S)=`$Y z1Iv>r*q=TnT>|rtGzHAS=paewCTdk+pK6th%Y!0KH6}LXx1O>cB7zK$SDHU+^Rng6 zNGCsir#V@{I2O`n6V0RfY$ddM_vAQgWv_@lK*K6?E_qKxv${xM6pn^gtvgiRCU(DO z%RBeuh4eAUJaqdN{h zxmw2@Z9g6ynarCT4hV~5%1X?Mk9#fXr1^sbz)KDe4v63dJRYQ3F_>`&MFuY1IBb4n zNXrYU)W`XBktJZ*UY0`7?3pTy*%?-G(ck0jT*@VkW_VZBmS#l!cfmEwq{K0UmSWyL zi3NnGvGZjq72ji#!YgJPny%2sG-EhFF3(~w zV+c0+muSUkb`BPcMLFZv`dBWkUlFFi2WzRj^Ep*u_iYaimP7SgK2#P8fp`zsq{tbR zO6c{i=W{pX`8=~ABG*ZfjN9Q_72aEiOAM<@wZnecQe~9h4}etnCYpBAlie(c9EOqT znnnFk#hn5D)!F4d(?9D}?ckM=7vYdfYI^zEEnmKkQ%T=g__he(zGO9KLgTO=A6npM!W#RhN90X0V zXfXHnaDbB=NdE4Wjqz3(#t0fV(VmL>zM;J#kAC?sBA1<;o6A3h@up61o+f`5yozP& ztV4w}pY2ruQc!`zv5)WH2L`#(Ms90V`X{-og|R1tzS=U}zD_S!(I2tCw8ljcFge^z z$)lml>K^$I(CjsXCs#kxf1tiMA_roY1Ne0dZ{%@k=c#RMdwaWlMP!S=T2Ng)L_m}@ zshW?!Tot|K#);L)h&K{wr$2kv(if!b$XFlg?AN7@c2DUN;y0iO#x924`nhbq5X8=~ zzn-Fhgo1YD%2%>mlFK(DD4288vsb5~#2D@#*5%dKRbsHogV^4Y;NaCF==1bOwKb4B zm5w!`8*;CUwjVWA)I?&&;4R{X%lO`qhy_q?PAdBK!01=bSgF#vQg};*C^ve`v%Dcx zOiff+q41rj54`;dYft=xPqMgCsVH}M_sLLiXRGHf`41LobsbK{Qi$J4%e26VE2z+0 zM=+yZ?rkKn<&8eS(4@J+x#h~*_^d^L155%_Ur*1~$2dw~Uw@xi@PvC(pBrfQ#%6z^ zY2Lym!rUc|H<7fwUHabE!o$IuR6QG&F&{^MZ9k26{kT|fQbL-oT|w7u7t-7^-j=15Myqr=CQ?JfQ(Lqo&u!@oP38jlIH zb)zMH{=&89DC8^l0KMcGu3$~%%eQc+Ev%K`ab_cHLW~<=`w))IfaHxv#1Y)HJ#+l$}dEyL|znY^ZdCI!Oix4fp&q%K0Z z^(bB~l6*C;XmdU6FOjqVJ+qPuh2e$ghm!*Bj%?k)7B4Z#grJc*}!L&7{|W6vO<T;d&AtI1nf!s!ZC5EJrNf7-MQVdaVO@`2Q{${`Y=WI~ zxAV|u)e!=+Q%Pvlr$

    {yI>2E!$*7`v0LVc2@F;e)SdCg3z|!9kHq}uD#WdS(y?w=1OFv02<&GDrzb*tP--;!sPNP?c--AL~@xh@azIKnQwxC9m<1aE+ z#vYz}r5gW0h?0y+-3>hZ8im3wcVS z6#0>f1_kt%SLY9p`W;&r-`u0JYek*FoKdXO(bSmHSm}NacQc3g(1H1*-3W}6k`sTZ zs&nE@lo0a*dibC8e*6zNWrb%FobY3r!(%c+tYYBi|A4wzvHaQaihewOdZ%@ZmBA1qE)v4xnJ%)(tSG+GD=- z_B{&Sl4O*YBu<0L`COqE*xi|bA}ktQCI(gua7H;~9b?bW$C<%K@eyGfxx=kvLobU; z*lW#|R&aW*Zs5?llD$Z)?B${2)?nK2#sjSPk*rFB^2&zbhj?IIG@Nke?AiQ!vyQaM z-c6na0T)a82ZY}%44=K9F9{uPQ6=u`1qN!`xZF;0j8UzbU~@~ z<#cszeDwFzBllf{E!9gSmcdYbAPwz_aDc-rN3i%?Uw9LqS2(eb(~EBrmseI-R;1yy zI-hjG>Tv@xrv46nTTw^0QAUrql!^$F86;Ep#oQZ;P)8Z!&5VU^boM6gi+G`Ha40W7 zU^NGMt*?31`$3(V>-u9R70p1s&CXu81QU>!$#e~W2~h5_wqsGTfZPKT7kuXO<4hP) z57xEr)sdFxShA_7ZVO)3tw-WUC?#LKgSx!6vXS-i5Mym)V`I>zOD)x*)4eIJHs_Xe z(@5@&J-8=GC)agNw69&d4}5ffemKS^Q7F77 zI7Wj(@q>Nq0hv6-pB8`k(Sz2iN2|VVdK-`!a&X4JT`y|bceU0NVu>1%J5K5a5zCw* zBiPjG(8l40+BGX@=htFmOD79Nz*ouB5_}#|EHneJ4(SlKla9pKaC*MoF(i|x`i5~W zX!}gi>$M+hDZJ@Ez_VRZ4Li}CsM_i{CATmthF8++~r(boT>e2N)) z9cagoZYO$|2hKSQz20*~-xfA6dmbvF1aD=HNCYjvh!r1q5;bPfXnJml`NqVc5Q$u^ zt(gZRV(-vd!9PMHU9)>agR06qK!o)@3I;3OD&!UiKHA@JdvA4NWas@caUh5QvHFT( zz79HB%S6yI+uhyGg~00zE#>9qN%Oq*Bez|>FBZ*tBR!N~trr2Zeov$uIQ7r%IZTyu z<_n83ji*if%y8kaLBY(o%|pwHtgwxh*<2jm-r1R&eWQ4rn5n95TzJM^({)W^OQRKi zCjNF$j?QVg$GO%^3F=Az)Dn^kW%dC0@xqfx#H9>i zs?eYR38aAr*`W1Dl};@5q=`t4Rh|I0cpKu>ImVcI`USyC|5T3*B9@5 zb@Be%#wA~NYz#ulGxTF-T3zdsW>alKG8Wgu#uI#zUljV z$h}dp85@*-xPJvuSndyVe6M{hB>aEnddMy8mci0`AJVAYpX*Uw>!`++=xk!t2fH0v zKOrNjrY_K95c~#8u2@=1By|W;f!a?<=)~nmY5rz?EQ#GQB}#@d7c#H?VXvd31OIk+ z$utOsE0)WsSq0+g>5Nn$4tP|@`vaF}f2h7I5`?EUkNVWrXQE?oPa8fy*4roxNI z@xjtELpG`f#-$&OJUl!&&NU1dwqim+V#2;Lx6Kd3bUMAVAU;=X#and6T-~90{drAnE2>a(`C-gY?> zS6*EFMI;3N{lB!r0{70p!73z{{^FFyIIp3oXhIj~@5G2gp&6V3{K3WH0erBx_mq?( zV(sU^p+kp2r0DORW&UDV!+&u_0tes#HNeVB;w!s{YnMPUCMJ{E=a>DxwvPv_NpW!F zWY)M>x*`6W_ddscz`wQfcs!R&iotb%%BH}b!2BNZp-S;zt{MaA`^KJ@TG?+oESCDc zl%uw;U;7`Z5h6KE7bFrH`00@(D2dK?Dha<~>0aY5uBN=Qu!xZ{IZZ8t~oyd=-Xb=@NHkBb_Zm1=8Nqm}Zq216Gp zC8JhmzSCM;jnK3QGKv4H7hBQ9`8WguLB_)w+pjXq<2TR3Cb?(`^8D+r_{e+r?o~84 zuBYH_0)l~6?|!$d;`qN=dHo;gs7a&d84 z%fc0k^_|uhb5h))zds0Z**PJ|`T1x?cy3}8A#-*y0PU^m8yz1Px9KX%9S5+{B_Z`g zKr${o{%Lz$jx?i-iQgDN-6{etD|GhD8_NBX`RYN|!t@AhxQcEZ%+{;Ef1v-te)*$E zpZdw*8hd2=k>-r^qW9F7?>7!dI*u5<>!{+cthj_5v>kJ4n~@g#2PU5QssC}EP%621 z@B4}hB5}*u7kA^xMmRdiqli5VFePJrd}sG64&VhbukBoYF7@SgnW4s&T%5?Hd7YU8 zF}IWdo_MgTm8(azd9zQSB4scs3R7Sz<#fH@AObMf*@h|C>$(G|}Pa>b7Lay%Yiz)tLieOFGXiPuNC zwO!KE*N?%5?%AQ=cC0}N*s+73K7EoT@taA|s-6hZCHV@gwtDlny0RVz2%-W8$!5_1tY#lrZG3d-$<^Bt5g<(R5vdP)z-B(T4GHX>yg$;J;H+BB6P*;V))O5_63%Ev;KG0RK5g%Q>$z9i=Xt*y<3wg2@Czr5g$8jR@(E`AN<+i~1scrt2#tzb6F5&9>FVh<7O?C?IM++k&{r>uITaYj@~#>! zKCxNT2_zDUx_;ymPlAa_zkY5H1MZL4d~vM>;^7gT_pNtxf7DE2ato%cK7fifBjj-w z7H+j7hqkrPojX^&oL*|LDzV0r&Nvh^ujGka!Q+)QAmOagyWDl};nw8jM~{{^9(bBu zD&w6lC{hCsg3KSgJH@ATI)k=m%7lh6_nU84xUyO(b)688Fq?0pea%kU0l!=Ilb02X z0^>oiyS{|YpHO)1XlL)r_h*!T2qI1d4Et15F?&i9;J&_5tH9waot~cdFuwom>uusA z;&rA7dcUxOi*Q!@R|=i(Zvsz&tB(<(CfI>p{x$P%U3c~KwxJANEv=VSudZKJ(Ucgh zl62cN1m~ZL>|39inOVifKyc#h4L2$@8&SO}Q8_N#t-xBDMnUG>-k@ouaQ-UpVYH+X(Ku`El5%L97#!X&d z`|ZI0qS(KzzqL!Je!21@PZZv5b7}GF9iY|0d?YC!l-@BB=~9C3oAJSPdZHqQ7ku-v-rA76qz@}V!@N$@X5`m=!RKjmU_<{40yWX0R zj~ATEkQQor{#&Fe^+|q@_o>Rt%7_4ZbNz*(JN%{f&Fi9?xw!djK(mMCgl{=CB3@tS zEh6#tR-x_1@`6i6ef4dj)S@%j#8}>$+?kv|Rz!|3bk-``n(dys3|khVO!eeCtDdSN z*Y?WFkQ6y5TMGtLB^-;&>LUZuwt2LJVM z9=#H<{`Kx;c1(Z!C2ehod$Y|3y3p}b8x->{tf!|(iWWCcub?8jdM&1>rVtDsOe{%-Am zQ%~W`9&dPAzx{=yL>Kv(FED?T$~Hh#_*e8q0fbN$HYFft($08MtmkVTVuD~t73o0f#@p^m zj_&Rw>uI=)t(_nMYIlpEcLOZ$&gwbUS1Bq*L|aCK!i2?6*h=Q${4X(VR#sMo#t6^{ z%o87P({OpU0K!f{ZaG9NNBx)#ltTbPWs|j--4~~fO*m|L|JSvjt^5V(Z?yy?gn3(B zOGPQ)rpC&><8!Z_HAC-8I)K`~P2QL7_UfFvBlmUuVV~W)yDhdnRf-EHv^=?_7u<7rkqa5Vv?!G=<7R21ZzyMy4 z*Q?rLmEv@IB{DDA-(Nq#!z8vPb? zPmM1|^_OGgT=Z(g|C0Szp2$?5;V)4;JM}Xkj+AxRHqJYhXm>R1?a850ArG{^%iHAX z!-(HHxFHprYwFoOqMVxG(bkzKhfdq$M;HvgCDw;;FueBb2<(?fq>Ww$Z~MGPR{SkI zC=@D2on45x3VxF8y4+f$PE1?36QQ$`fU9U-yc? zj1GPvU%A|IV;Wfm)V8A@qv2F{3a!W7G2jxl?d)UnPGX15Q1hAnzdnZwZ>c?FbF$~8A(5Y(YIDtStpO^kDd@Mb>)cr2L<7$lA*(&lJuqIVU>5xe+;BQ zv%lwel(?McP{ndSBQ3r?YM1PEl@mASf1<#vczK|f5!BqH#dy=&@9al3H+ww@!XB@2 zaGj~3qYrgb;O>r|xl7ozA2Tz)?tsq#wAx^5GFZ!PG3rp&n1F1~+J<*$pRm%5?0JB& z9XbQk_)(}N12QY$>es8-Ysdj-ecjw_A!9!e<|8O+o_9bRqHzAJT9sAd|m)3tA3;^H4z>2bR!O{{XqtD(NQoVm~*sZqoHB_9{0qXV=C6TOh zo6NjV*`-a>q{=kkHvTS@87J8Il43o4tGe3H&O!Wra+p!oEYUpNS`f%TDlfl0&7Ti8 z?YF9NqRoSdKFMfYBqUqy3@-rZVl>XgfzF@5z52Q%T++XDJFRV9BP&a~mNp;Y1OV%A zgXLvv|E4QDyNug3IOIi`{s@{4!ku801#N%zK>OhWL0UkV!&KB-lRryNOiUQ!H8XE) zHPv3nV69y{wA2B)*_R8Odjrm5m(OiEGZ+lx^3}I_Z{KdB4PGlj+p$~P_?g3)Uc=UT z+~|r$z2KNJqQ!#DFhuL$DpuR}AZWq9QGUYRP%KVHHu8&pLZy2%h{fd84!@g1C1CzM zEHBTxzx)hoRVC(eC}*_^jg!P1g{<2m?H7FGOInG6Evu@8y<{?(I3JLb9}_DyN~n8wIn@*w@aCYy%T>^rn0r>!=g^?3`d*eg z6T1KIm*AE~b04kj`V(NzzR!g%wDrY+81?1bg_D|P6G;g{ZRclHrUlpf z16*{lW^21LbzE$s!8B~R4f`Jdkt2fct-s9F7rb5ZD!e{@6o_+8CMGMlsw%RqjBn%* zq(3?UR|HtyCmD`kRo_5mU*_O+UF>QSWAjE3%Gq!JSa{F;*+<$Ujbg_3_4w=|Yu1~^ z!om|I?cvw0D}M$9G)vJ|WA{wiZWz4Kuky~u4}_UXaW8BDVT#3_Z=QGuVcapyO=6B_ zWv&a4h;p^1|LE)NAK~u|XqM>Q;gUzm8i8if$I}Q(`yzG>P>e9_Zm3_n21ldnGNP#W zbUF1_DYX{wi3yJyiGSn(Xz9VAqGjyg1?<}NGM^;iQ<{mU(?4R;Lb=q;bH!01t)$gh z67_umxtNuq($z0Ff=3m`Zo8P&As!?~KjDQs9s*YQX=_5#nYGxBM8qH{u)Si5OD^%} z5spcpxeU3y@%gmT&qxs9v)Fo$Zqj%hVW=@|W+lkhHeKuigu(Ob^M^D0(_bmg z#Y}B%Y;4Yn0_jEa-}EwelDQD*j^YnbALX{7aBvu3X*J6`G1tSz<#07`{mGLjNI1W# zxmm-2fZtMg0>_PgcyN@wzk&dVO%vwgD@d37PyF7?QaOBvsdK021YYsTk;YHvOAfET zRziYQjFn$~+mwe*y`l>~qqb*JMlhHYc|jQb_&*r%xT(b#NIAT~#2h(4R5R7q)|N36 z1orR{V1hi7pvL9+WsZ8?TPMnq75Rn=LV2D||Mh+Y3vWf0=1dM+txD1ko`}rP)eT0x zCS35eO%Gu7sjDN~LH_>!t(ZRT+mT{Bv-RN9WllT8#+D@7LW`?4bjA2K+XRSS#fRBMd1J`1H)%vP29(2ZR3H zNm>I^?pj3p3T~Pf-ID$a zbg%!rn__3vb6&i7kqbAaO?+>rGGC=e8>;DGBYKE=H_{Z;-*_Mn{6n<#;ZD(0agT&CTT?#vX_Tf~ueHyXNeR z$7vrT4H-@aP%6s5dDm@!J_mS-B6Kgm+QHpr*wPEG;nc;`5jTtze&prlMN55%1~enV zq^*7GR+ZlY(Kd#=Yf<8>o*$r!Gpmv^G`8RN*m?dcN0Z0px(~R12+Nm?4~BK8f)2FM z>vCJydxAkKzq5Grv6 zJy9#WJDuxF{^fqLGBEmUz7tTP-Tk}dsnl&!ZQK`;G8;x0%s0t8EYwYf!7E;qU@R`) zhC1O~4>J4X!>;Z13yWoDYV zwHCzH`Z>Mfce`4y13~2=?Od@x5`V(Il8U=|_)cA!>+`w~S(NS4kwOPHo1I-)Scoxt zMW1}vr&T%TUzd|-?`eF{{VDzw-sS6?X2l*WFjS5rKKB-WCKvl`hE+O8EQ8s5b_ z1PEZfaAaa^kGrca)bjz;UyH&xuFYd6ODW;AXIpOOf@ILqQEp@Qz{8XhLY@a&0cnF} zbXuRiOc}!5q{K2sR2`$353~{lUw8mnede!&oJiG;QMWzU!&1#9TcKFRz;y%Zb~!Q)ge7hp&D8X?Ui=Og2iV&gDb5yYv-{ySQ|M1kiM z6`}AOJG;fdTwLUE?4JYjwxjmmC(F)r4s<3Q)_Ebgy22jZO_>T%_^PaY`m}(;)6vzP z?#d^eoL#1UxOgu>U9+n@i5qQ9jW((iv;c-)w)&H+C+`DcQA$mOQ0OiXrtu5KWx zc@E&{4cA#b0In-CO4&dP`dqJTou|*W0$A~IW9Vseo1CoGC;j)wi3Lg)7{|$=)mes4 z-5$5z&4g+Oy?)K`r_5Sa-QptmlOMLV711veVhtR!OACOEcETk?HRn^suMpHe3$=aol;g z6N$M2+d1i}QjQ1z4PgnZuiCr{1_$U~`x}f3*uluy zIl#4DJklH)dwW9vb6%tJ>sMMUo@fw;z4jDvg^z5ggsDi3-cBK86!MdL%kqc}%7*+V zBsiFpjEjx|;HZPslvenzx5AhHb0i+@RrsAnkJRuxcI;RMXKrqzEK}7XF1hw2C^zmZ z|5ja_*I>kglm!|;Iu9(DY$eh8h|f%|Y5anHjmwJI;378Rc+tKMbrn-V+RgEo*Z!zT zx?M`R@JArQK>1>+w=N;ZR4sF(I<}lN@KS?xC_PYt{4`--hM&Lx4VCA_Pk5Qjlx9Y` zHM(0_`3Qg?G#Rb90IK(h!*0dbZEI_57&IguP(ASPxO^wO%G3iSE26xCaS2xgJ0AY5q)&tR#~cwx?AOZ?5iE? zXuw_}7MQ%_Sx=649#+vohL56M9LG3U-CA5VX4SdX7v*lb)c8k=I&*HQVPXgsm$VEF z0@~u7j4PbVH@1ovs$D|Vb6G7eRiXT{Sf+C=E%3(8KSf4HMvg>YGOoAH{Fie&7JIra za^g9$H#>J05tuQoWXFg6l%R8m1j$$}nkK~JA}q<~^s8^>OVePJ@Me#Z%7FV|BOjX3 z`Q!?b@xejIx{-Eo(GC7)Is_MGnH>XQ5TL@+^mBET>~ijCZ{NPcYRRW^(oQ&7fdA>m z1NxC1F+a4pr}Aj#Ly|MiHyv;Jce5uD)rlxz+ri=~S-0wI&)to0+mFdqIXvcrKp2e< z4Xu@BmMaJldG~X($oLGUD$gOKdpgUOXDP3N8V-aHr%0)&e_ox z5l@R$ITwhJ?S(JNh=vF#7cd)efIqPh?8oA-MMg#cfqQbyD6S#G+uJ+I(3U^Xg@iX`4_4&G z-4Ko^vDKx;{X}1(_w7O#HptRiP~gb$@O5FmSKnGHNH(v=!&A4-103%@Xl5E$-zDKr z{z)KpmAI2fS3s-!eX*92s%|yH_Y-aakYh$vf%Zo&Qm|cyrm$qnm|mjjl6b<+5kEqi z>T`x0qZAd-qal6x0E?ZDVAH{sc^K^1iwkn`1H}Of!=2vXDJH(ZSoKL{TN;Kpox$_yS)0Afu2Xc=T0o((35ym#}ohNi9(sXUO>;e z9E_Ls^Yd%GnN4eUWTLI>9E$rtr75z0Nl3mPn^`2{Q9QZzEcy%S{|MsqJs$(LZ_? zLmD7dS{>mh5C5g%lhM-~fy#=OZ;c2FItzy{>ElO5t~}kVPzdyK6)Z~!bU?8{WfEK3 zIyhSRr(a6zufNfuUHmNR-rDb<6XF}CmmJ>%jreY$rK${6eU%~;T?@RAZzJ=2V>kFg zKWcj_sT!nYh28R6VShRGTch#IsT6exZAw{#1>YB>yZE%U;CBoDv`oK^D&K4WOL0fg zgA~yPd!Y0hstj~0A&s7|q_22sOqMipQFjD(u5iEERy>OvNwP3|wQ}E8RpUscD-O6G?UMaGcvBw+_(Z59aIe39zG0z8H!{) z^LN`+TfKU6QMgh+12AL-1<7Ua}cgCT*}Y;z-Huez=SY%C`?x3cFF!Jn*FTQ76` zaFqGf{34Ls5iB4%vdH`gVcwyLDsrw{Rs~=%_(iui+O#q^E*1 zZm40~mAnu~>jYxQ_S)oY4+L0{F$u`TA0u{kaWKN9BfXg?+t~N4RoE zetATBGJ3c@banIUC0U2Y)M=#0dJWUw=LW<1w63cO9M0y{*VjLrd84G#C1~Z*p4XL* zEEdE1#ME{PE2z6(CBHk*=$Bgs#m`0rjNCr;(J#AadU<=NqWFzd8;SXg4GQ1%K z9nX!-L}QrY3Wvl4MT21oi#3!ba#=U9Qf)+)8sHdeLWi7V0E6xmM zjFYxogoT&N=1yR)PVrzI~w zRJ#-!e%jWx+dY{KFh7hD5)l>_)+wIBwF#ovtCB7}k$2TslK^hmyuYvqO#{P^c>soD zbC??`7`E|)_-#j1;+jNfw?{v3=#!N3rY=6%*SD-8b~OlnT?PY~Vq~44-(nfNJoPRP z-TUE=!k$;M-MGd(=wXpA40G}W;L=8s)~9kA88|-59VbO901t~!Y1@SN*)-Hj&0NgQ z3%()fZS@p|a0I_j8|wi`iDFM3AalJ6u1!7@Pf1O;R@^8Cu&@>&n5OPl+0g17!Hoj#~^R$5%7 z$!JtwNlB3J|MW&DMPjmV`EdMx>h6Eyn!LW#4&&wM^~u-JObv5#T6A-kR6sKgw+zYU zLE?SAF-ryJkwM+&sJf2m`W-j{Z7^ugcB#$ydu`m-SX zNEmtZ2JkcwfOivRLLi!0ckTP0ax#=4f@32y=MfBQVZ z6rC}NDPWCA6_v_m)UhXTR|QBmCNh^OzQ7rrP}N9>v;kYL9UmVr$FFg;qcXRkDvjPd zC1(0ubegtrnt{C?upoax;x)LxuJhMSLPshPdJ|i=i8w#nOo>}wc=FA;@Q(Q`UAPZ0 z2J`{^cRQ%=jH7FbQU+77y}IfP^JtAAHHyA{+3F}3h}yAU-FmIVop%^=R$XdGbTX8m zo_WGN369HTobh6EHhVc2s1ypMkJl5k;N5I98rn8@#q`6j>|)70bk1`fP{jfr7qGS0 ziB$;LPFi|GN|apm)B}QprP?1$?r`zuFp1kz7#qaWtIWaVHe=(w)kNfS^d+Mb^6mIm zWsU84R?IL4oW$6N{gO?i2i6D&%nK-L1m@hzo&SQ6 zyUXYEw;+jd27c0TObZwwyyN?4raC*K!_lHEm@Of?np0_}uP%SN=h_ zj<*cwuoPG}!s3d%g+Qf-3_0-d`^8@K0~@ZdZXY#yb7i@;ZIVD_rs&{!FYY66Ic6 zfV|T0HxR00u@T8{xh05Z_x+93w-iH;yeRz7w02?9NdT)uOW!Nwd^ma zmRX}@U$X2Dmr~bWH8@;eIT8!>=&vw}E`C)+{!UW*m60t+j(~enkU#}?Ab&QjWG}7n zU?xtCddCjN8`Ao`bfmqvUJM$GWo0XTXSH{wpKoI38*E$cifLW0uV-%L(&i�C)d; zmsy;0S6`n$G7M;JE_?#4SDLB@={rTbhJ5P6L-Jk|twVsZD*v1vln+L?^K`j6V1uCp z*kgdcwM*2zBDz9xJ4>Yu420(H7$On0;yv&&mcmg+(5Gi`g@Mg}Q8yJwd4X`SgUTMRCo%<_};l72;8no5^+y zuJfSnlTUMG=)p=%H-6w0*%b9`&97QrBK^fXo#Z~8?b>$lD z#wDQ-HoyQiFmt*y%uSo(cr} z82|ntB9U&$8#>8u6$$|bK|kr}8X4tx0w6wW2mtN^*S45UkcO|OS^=pH%@ch4o5C@^ zLbl6%fywiW@^E0ZO}Zjr*REaT-+k*VYihnvy}?(EcvnAFH9+-mAJ8~mZ~P|z2WlIF97vJs?jpshlqMvDDoltpCz~p zTo&MZd2yxi`FC$0Ba}_^c&TGPSXPjO!-)~_(LxClCkrNW{!VumKtrO0Qspt~1dLt! zz#82aGNUd95lU_Xe`IN%X@JcJ^y3d8kKF-grmdwq0-u-{`N7z(8WJo1VnUt|U5q>k rhKNI

    +

    + Why Dynamic Realty? +

    -
    - +
    +
    - +
    + +
    -

    Buy

    -

    - Discover a wide selection of properties available for purchase in prime locations at competitive - prices. +

    Tailored Management, Trusted Care

    +

    + Committed to providing a personalized structure to each client, with on-site management & a robust + property management

    - -
    -
    - -
    - -
    -

    Sell

    -

    - List your property with ease and reach potential buyers quickly with our expert marketing support. -

    -
    -
    - -
    -
    - -
    - -
    -

    Rent

    -

    Find the perfect rental home or apartment with flexible lease terms and no hidden fees.

    -
    -
    - -
    -
    - -
    - -
    -

    Need Help?

    -

    - Have questions? Our support team is here to guide you through every step of your real estate - journey. -

    -
    -
    - -
    -
    -
    -
    - -
    - Experience the Difference in Every Key Turn -
    -
    -
    -
    -

    Experience the Difference in Every Key Turn

    -
    -

    - Dynamic Realty is a full-service veteran-owned real estate company based in Centerville, GA, - established in 2004. Our services include buying & selling, rentals, & property management. We are - committed to providing a personalized structure to each client, with on-site management & a robust - property management division. We strive to provide a service that meets the needs of all our customers - & are proud to have been helping people with their real estate needs for the past 20 years. -

    -

    - At Dynamic Realty, we offer a comprehensive range of realty services to meet the needs of our - customers in Central Georgia. Our services include buying & selling, renting, & property management. - We understand the real estate sector inside out & are committed to providing a professional service to - our clients. We strive to make the process of reaching your real estate goals as easy & stress-free as - possible. Get in touch with us today to find out more. -

    +
    +
    +
    +
    +
    + +
    +
    +

    20 Years of Real Estate Excellence

    +

    + We strive to provide a service that meets the needs of all our customers & are proud to have been + helping people with their real estate needs for the past 20 years +

    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +

    Expert Guidance, Stress-Free Journeys

    +

    + We understand the real estate sector inside out & are committed to providing a professional + service to our clients. We strive to make the process of reaching your real estate goals as easy & + stress-free as possible +

    +
    +
    @@ -109,101 +66,6 @@ export default function Home() {
    - -
    -
    -
    -

    - Featured Properties -

    -
    - -
    -
    -
    - -
    - -
    - - } - > - -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - 860 -
    -

    Properties on Map

    -
    -
    -
    -
    -
    -
    29
    -
    -

    Professional Agents

    -
    -
    -
    -
    -
    -
    10
    - k -
    -

    Happy Clients

    -
    -
    -
    -
    -
    -
    15
    -
    -

    New Apartments Daily

    -
    -
    -
    -
    -
    -
    - -
    -
    -

    - Find Us -

    -
    -
    -