{"id":3425,"date":"2026-03-06T00:27:33","date_gmt":"2026-03-06T00:27:33","guid":{"rendered":"https:\/\/housefly1stg.wpenginepowered.com\/?page_id=3425"},"modified":"2026-10-11T05:30:43","modified_gmt":"2026-10-11T05:30:43","slug":"fencing","status":"publish","type":"page","link":"https:\/\/housefly.com\/es\/services\/dallas\/fencing\/","title":{"rendered":"Cercas"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"3425\" class=\"elementor elementor-3425\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-464c961 e-con-full e-flex e-con e-parent\" data-id=\"464c961\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4efcae1 elementor-widget elementor-widget-html\" data-id=\"4efcae1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style id=\"hfc-css\">\n.hfc,.hfc *{box-sizing:border-box}.hfc{font-family:'Inter',-apple-system,BlinkMacSystemFont,sans-serif;color:#0b172a;position:relative;width:100vw;max-width:100vw;margin-left:calc(50% - 50vw);background:#fff;text-align:left}\n.hfc-hero{position:relative;width:100%;margin-top:calc(-1 * var(--hf-header-h, 88px));padding:calc(84px + var(--hf-header-h, 88px)) 24px 64px;text-align:center;color:#fff;\n background:linear-gradient(180deg,rgba(11,23,42,.40),rgba(11,23,42,.84)),url(\"https:\/\/housefly.com\/account\/front_assets\/pro-hero-fe.jpg\") 62% 30%\/cover no-repeat,#0b172a}\n.hfc-ey{font-size:20px;font-weight:800;letter-spacing:3px;text-transform:uppercase;color:#41C7F5!important;margin:0}.hfc-lead{color:rgba(255,255,255,.92)!important}#hfc .hfc-hero .hfc-ey{color:#41C7F5!important;-webkit-text-fill-color:#41C7F5}\n.hfc-h1{font-size:60px;font-weight:800;letter-spacing:-1.5px;line-height:1.04;margin:12px 0 14px;color:#fff}.hfc-h1 span{background:linear-gradient(90deg,#41C7F5,#5cd67a);-webkit-background-clip:text;background-clip:text;color:transparent}\n.hfc-lead{font-size:18px;line-height:1.55;max-width:600px;margin:0 auto;color:rgba(255,255,255,.92)}\n.hfc-srch{max-width:660px;margin:28px auto 0;display:flex;align-items:center;background:#fff;border:1.5px solid #40C9F3;border-radius:999px;padding:7px 7px 7px 22px;box-shadow:0 0 0 6px rgba(64,201,243,.16),0 24px 60px -18px rgba(0,0,0,.45)}\n.hfc-srch svg{flex:none;color:#94a3b8;margin-right:10px}\n.hfc-srch input{flex:1;border:0!important;outline:0;font:500 17px Inter,sans-serif;padding:12px 0!important;color:#16233A;min-width:0;background:transparent!important;box-shadow:none!important;height:auto;border-radius:0}\n.hfc-srch input::placeholder{color:#8CA0B8}\n.hfc .hfc-srch button,.hfc .hfc-srch button:focus{flex:none;border:0;border-radius:999px;background:#40C9F3;color:#fff;font:700 16px Inter,sans-serif;padding:14px 30px;cursor:pointer;transition:background .15s}\n.hfc .hfc-srch button:hover{background:#2ED87A;color:#fff}\n.hfc-btn{display:inline-flex;align-items:center;justify-content:center;background:#41C7F5;color:#0b172a!important;font-weight:800;font-size:15px;border-radius:11px;padding:14px 22px;border:0;cursor:pointer;font-family:inherit;text-decoration:none!important;line-height:1.1}\n.hfc-btn:disabled{opacity:.55;cursor:default}\n.hfc-pop{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;margin:20px auto 0;max-width:660px}\n.hfc .hfc-pop button{display:inline-flex;align-items:center;border-radius:999px;background:rgba(255,255,255,.10);border:1px solid rgba(255,255,255,.28);padding:9px 16px;font:600 15px Inter,sans-serif;color:#eaf2fa;cursor:pointer;transition:all .15s;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}\n.hfc-wrap{max-width:1240px;margin:0 auto;padding:0 29px}\n.hfc-lay{display:grid;grid-template-columns:minmax(0,1fr) 508px;gap:32px;align-items:stretch;padding:40px 0 58px}.hfc-box{position:relative;align-self:stretch}.hfc-box .hfc-nb{position:relative;top:0}\n.hfc-stp{display:flex;align-items:center;gap:11px;margin:0 0 13px}.hfc-stp i{font-style:normal;width:31px;height:31px;border-radius:5px;background:#0b172a;color:#41C7F5;font-weight:800;font-size:15px;display:flex;align-items:center;justify-content:center;flex:none}\n.hfc-stp h3{margin:0;font-size:22px;font-weight:800;letter-spacing:-.3px;color:#0b172a}.hfc-stp span{margin-left:auto;font-size:14px;color:#5a6b85}\n.hfc-blk{margin-bottom:31px}\n.hfc-lay>*,.hfc-sv>*,.hfc-aog>*{min-width:0}.hfc-sv{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:9px}\n.hfc-card{display:flex;gap:11px;align-items:center;border:1.5px solid #e3e9f1;border-radius:13px;padding:13px;background:#fff;cursor:pointer;text-align:left;font-family:inherit;width:100%;transition:border-color .15s,box-shadow .15s}\n.hfc-card:hover{border-color:#9fd6ee}.hfc-card.on{border-color:#29ABE2;background:#eef8fd;box-shadow:0 0 0 3px rgba(41,171,226,.15)}\n.hfc-ic{width:40px;height:40px;border-radius:5px;background:#f2f6fa;display:flex;align-items:center;justify-content:center;font-size:20px;flex:none}\n.hfc-card h4{margin:0;font-size:15px;font-weight:800;color:#0b172a;line-height:1.2}.hfc-card p{margin:2px 0 0;font-size:14px;color:#5a6b85;line-height:1.35}\n.hfc-more{display:flex;justify-content:center;align-items:center;gap:7px;border:1.5px dashed #9fd6ee;border-radius:11px;padding:13px;color:#1580b8;font-weight:800;font-size:14px;margin-top:9px;background:#fff;width:100%;cursor:pointer;font-family:inherit}\n.hfc-more span{font-weight:600;color:#5a6b85}\n.hfc-cat{margin-top:16px}.hfc-cat h5{margin:0 0 7px;font-size:14px;font-weight:800;letter-spacing:1.2px;text-transform:uppercase;color:#29ABE2}\n.hfc-aog{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:9px}\n.hfc-ao{display:flex;justify-content:space-between;align-items:center;gap:9px;border:1.5px solid #e3e9f1;border-radius:11px;padding:13px 14px;font-size:14px;font-weight:700;background:#fff;color:#0b172a;cursor:pointer;font-family:inherit;text-align:left;width:100%}\n.hfc-ao b{color:#1f9d55;white-space:nowrap;font-weight:800}.hfc-ao small{font-size:14px;font-weight:600;color:#5a6b85}.hfc-ao.on{border-color:#5cd67a;background:#effbf2}.hfc-ao:disabled{opacity:.45;cursor:default}\n.hfc-note{font-size:14px;color:#5a6b85;margin:0 0 11px}\n.hfc-nb{background:linear-gradient(160deg,#16243a,#0b172a 60%);border:1px solid rgba(65,199,245,.18);border-radius:17px;padding:22px;color:#fff;box-shadow:0 24px 50px rgba(11,23,42,.28)}\n.hfc-nb .t{font-size:23px;font-weight:800;letter-spacing:-.4px;line-height:1.15}\n.hfc-pill{display:inline-block;margin-top:8px;font-size:14px;font-weight:700;color:#8fe0ff;border:1px solid rgba(65,199,245,.4);background:rgba(65,199,245,.1);border-radius:77px;padding:5px 10px}\n.hfc-inc{border:1.5px solid rgba(255,255,255,.16);border-radius:9px;margin-top:12px}.hfc-inc button{display:flex;justify-content:space-between;width:100%;background:none;border:0;color:#fff;padding:12px 14px;font:800 14px Inter,sans-serif;letter-spacing:1.4px;cursor:pointer}\n.hfc-inc button span{color:#41C7F5}.hfc-inc ul{margin:0;padding:0 14px 11px 28px;font-size:14px;line-height:1.5;color:#d7e2ef}.hfc-inc li{margin:3px 0}\n.hfc-lbl{font-size:14px;font-weight:800;letter-spacing:1.4px;text-transform:uppercase;color:#9fb0c6;margin:12px 0 6px}\n.hfc-seg{display:grid;grid-template-columns:1fr 1fr;gap:8px}.hfc-seg.c3{grid-template-columns:repeat(3,1fr)}.hfc-seg.c4{grid-template-columns:1fr 1fr}\n.hfc-seg button{border:1.5px solid rgba(255,255,255,.2);border-radius:9px;padding:10px 6px;text-align:center;font:700 14px Inter,sans-serif;color:#fff;background:transparent;cursor:pointer}\n.hfc-seg button.on{border-color:#41C7F5;background:rgba(65,199,245,.14);color:#8fe0ff}\n.hfc-step{display:grid;grid-template-columns:40px 1fr 40px;gap:8px}.hfc-step button,.hfc-step div{border:1.5px solid rgba(255,255,255,.22);border-radius:9px;height:40px;display:flex;align-items:center;justify-content:center;font:800 15px Inter,sans-serif;color:#fff;background:transparent}\n.hfc-step button{cursor:pointer}.hfc-step button:disabled{opacity:.35;cursor:default}.hfc-step div{border-color:#41C7F5;color:#8fe0ff;font-size:15px}.hfc-step div small{font-size:14px;font-weight:600;margin-left:5px;opacity:.8}\n.hfc-rooms{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.hfc-rooms>div{border:1.5px solid rgba(255,255,255,.2);border-radius:9px;padding:9px 5px;text-align:center;font-weight:700;font-size:14px}\n.hfc-mini{display:flex;align-items:center;justify-content:center;gap:8px;margin-top:5px}.hfc-mini button{width:25px;height:25px;border-radius:6px;border:1.5px solid rgba(255,255,255,.25);background:transparent;color:#8fe0ff;font:800 14px Inter,sans-serif;cursor:pointer}\n.hfc-mini button:disabled{opacity:.3;cursor:default}.hfc-mini b{font-size:19px;min-width:17px}\n.hfc-ex{border-top:1px solid rgba(255,255,255,.14);margin-top:14px;padding-top:5px}\n.hfc-li{display:flex;align-items:center;gap:8px;font-size:14px;padding:5px 0;color:#d7e2ef}.hfc-li span{flex:1}.hfc-li b{color:#5cd67a}.hfc-li .hfc-mini{margin:0}.hfc-li .hfc-mini b{font-size:14px}\n.hfc-li .x{background:none;border:0;color:#8a9bb2;font-size:14px;cursor:pointer;padding:0 2px}\n.hfc-foot{display:flex;align-items:center;justify-content:space-between;gap:9px;border-top:1px solid rgba(255,255,255,.14);margin-top:14px;padding-top:12px}\n.hfc-price{font-size:31px;font-weight:800;color:#5cd67a;letter-spacing:-.5px;line-height:1.05}.hfc-price.na{font-size:14px;color:#ffcf70}.hfc-foot p{margin:3px 0 0;font-size:14px;color:#9fb0c6}\n.hfc-ft{font-size:14px;color:#8a9bb2;text-align:center;margin-top:11px}.hfc-err{font-size:14px;color:#ffcf70;text-align:center;margin-top:8px}\n.hfc-bar{display:none}\n.hfc button{font-family:inherit;text-transform:none;box-shadow:none;outline:none;min-height:0;line-height:1.2}\n.hfc button{white-space:normal;word-break:normal}.hfc .hfc-card h4{color:#0b172a!important}.hfc .hfc-card p{color:#5a6b85!important;font-size:14px!important}.hfc .hfc-card{color:#0b172a!important}.hfc-card>span:last-child{flex:1;min-width:0}.hfc-ao>span{min-width:0}\n.hfc .hfc-card:hover,.hfc .hfc-card:focus{background:#fff;color:#0b172a}.hfc .hfc-card.on:hover,.hfc .hfc-card.on:focus{background:#eef8fd}\n.hfc .hfc-ao:hover,.hfc .hfc-ao:focus{background:#fff;color:#0b172a;border-color:#9fd6ee}.hfc .hfc-ao.on:hover,.hfc .hfc-ao.on:focus{background:#effbf2;border-color:#5cd67a}\n.hfc .hfc-more:hover,.hfc .hfc-more:focus{background:#f4f9fd;color:#1580b8}\n.hfc .hfc-btn:hover,.hfc .hfc-btn:focus{background:#6dd5f8;color:#0b172a}\n.hfc .hfc-seg button:hover,.hfc .hfc-seg button:focus{background:rgba(255,255,255,.06);color:#fff}.hfc .hfc-seg button.on:hover,.hfc .hfc-seg button.on:focus{background:rgba(65,199,245,.14);color:#8fe0ff}\n.hfc .hfc-step button:hover,.hfc .hfc-step button:focus,.hfc .hfc-mini button:hover,.hfc .hfc-mini button:focus{background:rgba(255,255,255,.08);color:#8fe0ff}\n.hfc .hfc-inc button:hover,.hfc .hfc-inc button:focus,.hfc .hfc-li .x:hover,.hfc .hfc-li .x:focus{background:none;color:#fff}\n.hfc .hfc-pop button:hover,.hfc .hfc-pop button:focus{background:rgba(64,201,243,.22);border-color:#40C9F3;color:#fff}\n.hfc-mini button{padding:0;display:inline-flex;align-items:center;justify-content:center}.hfc-step button{padding:0}\n@media(max-width:1100px){.hfc-lay{grid-template-columns:minmax(0,1fr) 454px;gap:22px}}\n@media(max-width:900px){.hfc-lay{grid-template-columns:minmax(0,1fr)}.hfc-box{position:static}.hfc-box .hfc-nb{position:static!important;width:auto!important}}\n@media(max-width:767px){.hfc-rooms{gap:5px}.hfc-rooms>div{padding:8px 2px;font-size:14px}.hfc-mini{gap:3px}.hfc-mini button{width:22px;height:22px;font-size:14px}.hfc-mini b{font-size:15px;min-width:11px}.hfc-li{gap:5px;font-size:14px}.hfc-li .hfc-mini b{font-size:14px}}\n@media(max-width:767px){.hfc-hero{padding:calc(48px + var(--hf-header-h, 70px)) 16px 40px;background-image:linear-gradient(180deg,rgba(11,23,42,.55),rgba(11,23,42,.9)),url(\"https:\/\/housefly.com\/account\/front_assets\/pro-hero-fe.jpg\")}\n.hfc-ey{font-size:15px;letter-spacing:1.8px}.hfc-h1{font-size:38px;letter-spacing:-1px}.hfc-lead{font-size:16px}\n.hfc-srch{margin-top:22px;padding:5px 5px 5px 16px}.hfc-srch svg{display:none}.hfc-srch input{font-size:16px;padding:10px 0!important}.hfc .hfc-srch button,.hfc .hfc-srch button:focus{padding:12px 16px;font-size:14px}.hfc-pop{gap:6px;margin-top:16px}.hfc .hfc-pop button{padding:8px 13px;font-size:14px}\n.hfc-wrap{padding:0 14px}.hfc-lay{gap:23px;padding:25px 0 0}.hfc-stp h3{font-size:18px}.hfc-sv,.hfc-aog{grid-template-columns:minmax(0,1fr)}\n.hfc-nb{padding:15px;border-radius:14px}.hfc-nb .t{font-size:19px}.hfc-price{font-size:25px}.hfc-btn{font-size:14px;padding:13px 16px}\n.hfc-bar{display:flex;position:sticky;bottom:0;z-index:5;justify-content:space-between;align-items:center;gap:11px;background:#0b172a;color:#fff;padding:11px 14px;margin:22px -14px 0;border-radius:14px 14px 0 0}\n.hfc-bar b{font-size:20px;color:#5cd67a;display:block}.hfc-bar small{display:block;color:#9fb0c6;font-size:14px}}\n@media(max-width:767px){.hfc-mini button{width:30px;height:30px}.hfc-step button,.hfc-step div{height:44px}}\n<\/style>\n<style id=\"hfc-css2\">\n.hfc .hfc-sv{align-items:start}\n.hfc-cw{border:1.5px solid #e3e9f1;border-radius:13px;background:#fff;transition:border-color .15s,box-shadow .15s;min-width:0}\n.hfc-cw:hover{border-color:#9fd6ee}.hfc-cw.on{border-color:#29ABE2;box-shadow:0 0 0 3px rgba(41,171,226,.15)}\n.hfc .hfc-cw>.hfc-card{border:0!important;box-shadow:none!important;border-radius:12px;position:relative;padding-right:40px}\n.hfc .hfc-cw.on>.hfc-card{background:#eef8fd}.hfc .hfc-cw.on>.hfc-card:not(:last-child){border-radius:12px 12px 0 0}\n.hfc-ck{position:absolute;top:12px;right:12px;width:22px;height:22px;border-radius:6px;border:1.5px solid #c9d6e4;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:800;color:#fff;background:#fff}\n.hfc-cw.on .hfc-ck{background:#29ABE2;border-color:#29ABE2}\n.hfc-opt{padding:4px 14px 14px;border-top:1px solid #e3e9f1}\n.hfc-opt .ol{font-size:14px;font-weight:800;letter-spacing:1.1px;text-transform:uppercase;color:#5a6b85;margin:12px 0 7px}\n.hfc-opt .os{display:flex;flex-wrap:wrap;gap:7px}\n.hfc .hfc-opt .os button{flex:1 1 auto;border:1.5px solid #dbe4ee;border-radius:10px;padding:9px 10px;font:700 14px Inter,sans-serif;color:#0b172a;background:#fff;cursor:pointer;text-align:center}\n.hfc .hfc-opt .os button.on,.hfc .hfc-opt .os button.on:hover{border-color:#29ABE2;background:#eef8fd;color:#0b6c99}\n.hfc .hfc-opt .os button:hover,.hfc .hfc-opt .os button:focus{background:#f6f9fc;color:#0b172a}.hfc .hfc-opt .os button small{font-size:14px;font-weight:600;color:#1f9d55}\n.hfc-opt .orw{display:flex;align-items:center;gap:10px;padding:6px 0;font-size:15px;color:#0b172a}.hfc-opt .orw>span{flex:1;min-width:0}\n.hfc-opt .orw small{display:block;font-size:14px;color:#5a6b85}\n.hfc-opt .om{display:flex;align-items:center;gap:8px;flex:none}\n.hfc .hfc-opt .om button{width:32px;height:32px;border-radius:8px;border:1.5px solid #c9d6e4;background:#fff;color:#1580b8;font:800 18px Inter,sans-serif;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center}\n.hfc .hfc-opt .om button:hover,.hfc .hfc-opt .om button:focus{background:#f2f8fc;color:#1580b8}\n.hfc .hfc-opt .om button:disabled{opacity:.35;cursor:default}\n.hfc-opt .om b{min-width:22px;text-align:center;font-size:16px;color:#0b172a}.hfc-opt .om b.z{color:#94a3b8}\n.hfc-opt .ost{display:flex;align-items:center;gap:8px}.hfc-opt .ost .ov{flex:1;text-align:center;border:1.5px solid #dbe4ee;border-radius:10px;padding:7px 6px;font-weight:800;font-size:15px;color:#0b172a}\n.hfc-opt .ost .ov small{font-weight:600;color:#5a6b85;margin-left:5px;font-size:14px}\n.hfc-opt .orm{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:7px}.hfc-opt .orm>div{border:1.5px solid #dbe4ee;border-radius:10px;padding:8px 4px;text-align:center;font-size:14px;font-weight:700;color:#0b172a}\n.hfc-opt .orm .om{justify-content:center;margin-top:5px}\n.hfc-opt .oh{font-size:14px;color:#c2410c;margin:8px 0 0}\n.hfc .hfc-opt .oi{display:flex;justify-content:space-between;width:100%;background:none;border:0;padding:12px 0 0;font:800 14px Inter,sans-serif;letter-spacing:1.1px;color:#1580b8;cursor:pointer;text-transform:uppercase}\n.hfc .hfc-opt .oi:hover,.hfc .hfc-opt .oi:focus{background:none;color:#1580b8}\n.hfc-opt ul{margin:6px 0 0;padding-left:20px;font-size:14px;line-height:1.45;color:#3d4d66}\n.hfc-nb .t{font-size:23px}\n.hfc-nb .hfc-emp{font-size:15px;color:#9fb0c6;margin:12px 0 4px;line-height:1.45}\n.hfc-nb .hfc-ln{display:flex;gap:10px;align-items:flex-start;padding:11px 0;border-bottom:1px solid rgba(255,255,255,.1);font-size:15px;color:#fff}\n.hfc-nb .hfc-ln:last-child{border-bottom:0}.hfc-nb .hfc-ln>span{flex:1;min-width:0;font-weight:700;line-height:1.3}\n.hfc-nb .hfc-ln small{display:block;font-weight:500;font-size:14px;color:#9fb0c6;margin-top:2px}\n.hfc-nb .hfc-ln b{color:#5cd67a;white-space:nowrap;font-size:15px}.hfc-nb .hfc-ln b.q{color:#ffcf70}\n.hfc .hfc-nb .x,.hfc .hfc-nb .x:hover,.hfc .hfc-nb .x:focus{border:0!important;box-shadow:none!important;background:none!important;min-width:0;width:auto;height:auto;padding:0 2px;color:#8a9bb2;font-size:18px;line-height:1}.hfc .hfc-nb .x:hover{color:#fff}\n.hfc .hfc-nb .hfc-ln .x{background:none;border:0;color:#8a9bb2;font-size:18px;cursor:pointer;padding:0 2px;line-height:1}\n.hfc .hfc-nb .hfc-ln .x:hover,.hfc .hfc-nb .hfc-ln .x:focus{background:none;color:#fff}\n.hfc-nb .hfc-lns{margin-top:6px;max-height:52vh;overflow-y:auto}\n.hfc-sv{grid-auto-flow:row dense}.hfc-cw.wide{grid-column:1\/-1}.hfc-cw.wide .hfc-card h4{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.hfc-cw.wide .hfc-opt{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);column-gap:28px}.hfc-cw.wide .hfc-opt>.ol,.hfc-cw.wide .hfc-opt>.os,.hfc-cw.wide .hfc-opt>.ost,.hfc-cw.wide .hfc-opt>.orm,.hfc-cw.wide .hfc-opt>.oh,.hfc-cw.wide .hfc-opt>.oi,.hfc-cw.wide .hfc-opt>ul{grid-column:1\/-1}\n.hfc-cat{margin-top:26px}.hfc-cat .hfc-stp{margin-bottom:12px}\n.hfc-nb .hfc-sg{border-bottom:1px solid rgba(255,255,255,.1);padding:4px 0 8px}.hfc-nb .hfc-sg:last-child{border-bottom:0}\n.hfc-nb .hfc-sg .hfc-ln{border-bottom:0;padding:8px 0}.hfc-nb .hfc-row{padding:6px 0 6px 12px!important;border-left:2px solid rgba(65,199,245,.35)}\n.hfc-nb .hfc-sh{display:flex;align-items:center;gap:10px;padding:10px 0 4px;font-weight:800;font-size:15px;color:#fff}.hfc-nb .hfc-sh>span{flex:1}\n.hfc-bs{display:flex;align-items:center;gap:7px;flex:none}\n.hfc .hfc-bs button{width:28px;height:28px;border-radius:8px;border:1.5px solid rgba(255,255,255,.28);background:transparent;color:#8fe0ff;font:800 16px Inter,sans-serif;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center}\n.hfc .hfc-bs button:hover,.hfc .hfc-bs button:focus{background:rgba(255,255,255,.08);color:#8fe0ff}.hfc .hfc-bs button:disabled{opacity:.3;cursor:default}\n.hfc-bs b{min-width:20px;text-align:center;color:#fff!important;font-size:15px}\n.hfc .hfc-sm{background:none;border:0;padding:2px 0;color:#41C7F5;font:700 14px Inter,sans-serif;cursor:pointer}.hfc .hfc-sm:hover,.hfc .hfc-sm:focus{background:none;color:#8fe0ff}\n.hfc-dsc{font-size:14px;line-height:1.5;color:#c9d6e6;padding:4px 0 6px}.hfc-dsc p{margin:0 0 4px}.hfc-dsc ul{margin:0;padding-left:18px}\n\/* HF-2026-10-10v: the hero subtext on ONE line (two at most on phones); the pills ONE row, never wider than the search bar *\/\n.hfc .hfc-hero .hfc-lead{max-width:none;white-space:nowrap}\n.hfc .hfc-pop{flex-wrap:nowrap;overflow:hidden;max-width:660px;width:100%}.hfc .hfc-pop button{flex:none;white-space:nowrap}\n@media(max-width:767px){.hfc .hfc-opt .om button{width:34px;height:34px}.hfc .hfc-hero .hfc-lead{white-space:normal;max-width:350px;font-size:16px}}\n<\/style>\n<!-- ================= HOUSE FLY \u2014 SMOKE SPLIT HERO + GLASS BOOKING CELL (production template, 2026-07-16) =================\n     Left: header + smoke service pills. Right: frosted-glass booking cell (live check-zip pricing, Book -> autobook -> cart).\n     Generated per page from pc-memory\/smoke-hero-template.html \u2014 edit the template, regenerate, redeploy. -->\n<style>\n@keyframes hfHeroKenBurns{0%{transform:scale(1) translate(0%,0%)}50%{transform:scale(1.06) translate(-1.5%,0.5%)}100%{transform:scale(1.10) translate(1.5%,-0.5%)}}\n@media (prefers-reduced-motion: reduce){.hfsk-hero::before{animation:none !important}}\nbody{overflow-x:hidden}\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-464c961,\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-464c961::before,\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-464c961::after{\n  max-height:none !important;min-height:0 !important;height:auto !important;\n  background-image:none !important;background-color:transparent !important;\n  flex-direction:column !important;align-items:stretch !important;justify-content:flex-start !important;\n  padding:0 !important;overflow:visible !important;border-radius:0 !important;box-shadow:none !important}\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-464c961::before,\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-464c961::after{display:none !important;background:transparent !important;content:none !important}\nbody [class*=\"elementor-\"] .elementor-element.elementor-element-4efcae1 .elementor-widget-container{display:block !important;width:100% !important}\n.hfsk-root{display:block;width:100%}\n.hfsk-root,.hfsk-root *{box-sizing:border-box}\n\/* ===== hero: full-bleed smoke split ===== *\/\n.hfsk-hero{position:relative;background:#10161f;overflow:hidden;isolation:isolate;color:#fff;\n  width:100vw;max-width:100vw;margin-left:calc(50% - 50vw);\n  margin-top:calc(-1 * var(--hf-header-h, 88px));\n  padding:calc(56px + var(--hf-header-h, 88px)) 40px 72px;\n  font-family:'Inter',-apple-system,BlinkMacSystemFont,sans-serif}\n.hfsk-hero::before{content:\"\";position:absolute;top:0;left:0;right:0;bottom:0;background:url('https:\/\/housefly.com\/wp-content\/uploads\/2026\/03\/hero-cleaning-3-1536x864.webp') center\/cover no-repeat;opacity:.45;animation:hfHeroKenBurns 28s ease-in-out infinite alternate;will-change:transform;z-index:-2}\n.hfsk-hero::after{content:\"\";position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(115deg,rgba(13,20,31,.92) 0%,rgba(13,20,31,.72) 45%,rgba(13,20,31,.55) 100%);z-index:-1;pointer-events:none}\n@media (max-width:1024px){.hfsk-hero::before{background-image:url('https:\/\/housefly.com\/wp-content\/uploads\/2026\/03\/hero-cleaning-3-1024x576.webp')}}\n.hfsk-cols{position:relative;z-index:2;max-width:1220px;margin:0 auto;display:grid;grid-template-columns:1.05fr 1fr;gap:56px;align-items:center}\n.hfsk-left{text-align:left}\n.hfsk-ey{font-size:clamp(16px,1.6vw,21px);font-weight:800;letter-spacing:.22em;color:#40C9F3;text-transform:uppercase;margin:0 0 12px;line-height:1.2}\n.hfsk-h1{font-size:clamp(34px,4.4vw,56px);font-weight:900;line-height:1.05;letter-spacing:-1.5px;margin:0 0 12px;color:#fff}\n.hfsk-h1 span{background:linear-gradient(90deg,#40C9F3,#2ED87A);-webkit-background-clip:text;background-clip:text;color:transparent}\n.hfsk-sub{color:rgba(201,214,230,.82);font-size:16.5px;font-weight:300;line-height:1.55;max-width:460px;margin:0 0 30px}\n.hfsk-rowlabel{font-size:12px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:rgba(255,255,255,.85);margin:0 0 12px}\n.hfsk-pills{display:flex;flex-wrap:wrap;gap:10px}\n#hfskCats{margin-bottom:24px}\n.hfsk-pill{display:inline-flex;align-items:center;font-family:inherit;font-size:14px;font-weight:700;color:#dfe9f5;\n  background:linear-gradient(180deg,rgba(255,255,255,.09),rgba(255,255,255,.02));border:1.5px solid rgba(255,255,255,.2);\n  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-radius:999px;padding:11px 19px;cursor:pointer;transition:all .16s}\n.hfsk-pill:hover:not(.on){border-color:rgba(255,255,255,.48)}\n.hfsk-pill.on{border-color:#40C9F3;background:linear-gradient(180deg,rgba(35,210,255,.26),rgba(35,210,255,.09));color:#fff;box-shadow:0 0 0 4px rgba(35,210,255,.14),0 12px 30px -12px rgba(35,210,255,.5)}\n.hfsk-pill:focus{outline:none}\n.hfsk-pill:focus-visible{outline:2px solid #40C9F3;outline-offset:2px}\n.hfsk-divider{max-width:420px;height:1px;background:linear-gradient(90deg,rgba(255,255,255,.18),transparent);margin:2px 0 20px}\n#hfskSubs{display:flex;flex-direction:column;gap:10px}\n.hfsk-pills.fixedrow{flex-wrap:nowrap}\n.hfsk-pills.fixedrow .hfsk-pill{min-width:0;justify-content:center;white-space:nowrap}\n@media (max-width:480px){.hfsk-pills.fixedrow .hfsk-pill{flex:1 1 0;font-size:clamp(9.5px,2.9vw,12.5px);padding:9px 4px;min-height:33px}}\n@media (max-width:480px){.hfsk-pills.fixedrow.compact .hfsk-pill{white-space:nowrap;font-size:clamp(9px,2.55vw,12.5px);padding:9px 2px;min-height:33px}}\n\/* ===== glass booking cell ===== *\/\n.hfsk-glass{background:rgba(20,29,43,.62);border:1px solid rgba(255,255,255,.16);border-radius:22px;\n  backdrop-filter:blur(22px);-webkit-backdrop-filter:blur(22px);\n  box-shadow:0 40px 110px -30px rgba(0,0,0,.8),inset 0 1px 0 rgba(255,255,255,.09);\n  padding:24px 26px 22px;max-width:520px;margin-left:auto;color:#fff;text-align:left;font-family:'Inter',-apple-system,sans-serif}\n.hfsk-glass *{box-sizing:border-box}\n.g-top{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:16px}\n.g-top h3{font-size:23px;font-weight:800;letter-spacing:-.5px;color:#fff;margin:0;font-family:inherit}\n.g-badge{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:700;color:#7FE3FF;background:rgba(35,210,255,.14);border:1px solid rgba(35,210,255,.3);padding:4px 10px;border-radius:99px;margin-top:8px}\n.g-zip{flex:none;width:150px;text-align:left}\n.g-zip label{display:block;font-size:10px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:#8fb3d0;margin-bottom:6px;padding-left:2px}\n.g-zipbox{position:relative;display:flex;align-items:center;height:42px;background:rgba(255,255,255,.07);border:1.5px solid rgba(255,255,255,.22);border-radius:12px;padding:0 12px;transition:border-color .15s}\n.g-zipbox:focus-within{border-color:#40C9F3}.g-zipbox.bad{border-color:#ff8f8f}\n.g-zipbox .pin{position:absolute;left:12px;font-size:14px;line-height:1}\n.g-zipbox input{width:100%;height:100%;padding:0;margin:0;text-align:center;border:none;background:transparent;font-family:inherit;font-size:16px;font-weight:800;color:#fff;outline:none;letter-spacing:2px;line-height:normal;box-shadow:none}\n.g-inc{border:1px solid rgba(255,255,255,.14);border-radius:13px;overflow:hidden;margin-bottom:15px;background:rgba(255,255,255,.03)}\n.g-inc>button{width:100%;display:flex;align-items:center;justify-content:space-between;background:transparent;border:none;padding:11px 14px;font-family:inherit;font-size:12.5px;font-weight:800;color:#dfe9f5;cursor:pointer;letter-spacing:.04em}\n.g-inc .car{transition:transform .2s;color:#40C9F3}.g-inc.open .car{transform:rotate(180deg)}\n.g-inc ul{list-style:none;max-height:0;overflow:hidden;transition:max-height .28s;padding:0 16px;margin:0}\n.g-inc.open ul{max-height:420px;padding:2px 16px 12px}\n.g-inc li{font-size:12.5px;color:rgba(223,233,245,.92);padding:4px 0 4px 20px;position:relative;line-height:1.5}\n.g-inc li::before{content:\"\";position:absolute;left:2px;top:11px;width:6px;height:6px;border-radius:50%;background:#2ED87A}\n.g-inc li.you::before{background:#40C9F3}\n.g-inc li.na::before{background:#ff9b9b}\n.g-inc li b{color:#fff;font-weight:800}\n.g-q{margin-bottom:14px}.g-q:last-child{margin-bottom:0}\n.g-q>label{display:block;font-size:11px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:#8fa6c0;margin-bottom:8px}\n.g-seg{display:flex;flex-wrap:wrap;gap:7px}\n.g-seg button{flex:1 1 0;min-width:0;font-family:inherit;font-size:13px;font-weight:700;color:#fff;background:rgba(255,255,255,.05);border:1.5px solid rgba(255,255,255,.18);border-radius:10px;padding:10px 8px;cursor:pointer;transition:all .15s;white-space:nowrap}\n.g-seg button.on{border-color:#40C9F3;background:rgba(35,210,255,.12);color:#7FE3FF;box-shadow:0 0 0 3px rgba(35,210,255,.12)}\n.g-seg.four button{flex:1 1 46%}\n.g-step{display:flex;align-items:center;gap:8px}\n.g-step button{width:42px;height:40px;flex:none;border-radius:10px;border:1.5px solid rgba(255,255,255,.22);background:rgba(255,255,255,.06);color:#40C9F3;font-size:21px;font-weight:700;cursor:pointer;line-height:1;display:flex;align-items:center;justify-content:center;transition:all .15s}\n.g-step button:hover:not(:disabled){border-color:#40C9F3}.g-step button:disabled{opacity:.3;cursor:not-allowed}\n.g-step .val{flex:1;text-align:center;height:40px;display:flex;align-items:center;justify-content:center;border:1.5px solid rgba(64,201,243,.55);background:rgba(35,210,255,.09);border-radius:10px;font-size:14.5px;font-weight:800;color:#7FE3FF;letter-spacing:.2px}\n.g-step .val span{font-size:11px;font-weight:600;color:#8fa6c0;margin-left:5px}\n.g-rooms{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}\n.g-rooms.two{grid-template-columns:repeat(2,minmax(0,1fr))}\n.g-rc{background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.13);border-radius:12px;padding:10px 8px;text-align:center}\n.g-rc .rl{font-size:16.5px;font-weight:700;color:#fff;line-height:1.2;min-height:26px;display:flex;align-items:center;justify-content:center}\n.g-rc .rs{display:flex;align-items:center;justify-content:center;gap:8px;margin-top:6px}\n.g-rc .rs button{width:28px;height:28px;border-radius:8px;border:1.5px solid rgba(255,255,255,.22);background:rgba(255,255,255,.06);font-size:17px;font-weight:700;color:#40C9F3;cursor:pointer;line-height:1;display:flex;align-items:center;justify-content:center}\n.g-rc .rs button:disabled{opacity:.3;cursor:not-allowed}\n.g-rc .rs .v{font-size:24px;line-height:1;font-weight:800;color:#fff;min-width:20px}\n.g-itemhead{display:flex;justify-content:space-between;font-size:10px;font-weight:800;letter-spacing:.07em;text-transform:uppercase;color:#6d8199;padding:0 2px 7px}\n.g-item .lbl{min-width:0}\n.g-item{display:flex;align-items:center;justify-content:space-between;gap:10px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.13);border-radius:13px;padding:10px 13px;margin-bottom:8px;transition:all .15s}\n.g-item:last-child{margin-bottom:0}\n.g-item.picked{border-color:rgba(64,201,243,.6);background:rgba(35,210,255,.09)}\n.g-item .lbl{font-size:13.5px;font-weight:700;color:#fff;line-height:1.3}\n.g-item .rs{display:flex;align-items:center;gap:9px;flex:none}\n.g-item .rs button{width:30px;height:30px;border-radius:9px;border:1.5px solid rgba(255,255,255,.25);background:rgba(255,255,255,.06);font-size:17px;font-weight:700;color:#40C9F3;cursor:pointer;line-height:1;display:flex;align-items:center;justify-content:center}\n.g-item .rs button:disabled{opacity:.3;cursor:not-allowed}\n.g-item .rs .v{font-size:16px;font-weight:800;color:#fff;min-width:16px;text-align:center}\n.g-note{font-size:11px;color:#8fa6c0;margin-top:8px;line-height:1.5}\n.g-foot{margin-top:16px;padding-top:15px;border-top:1px solid rgba(255,255,255,.12)}\n.g-row{display:flex;align-items:center;justify-content:space-between;gap:14px}\n.g-pr{text-align:left}\n.g-price{font-size:32px;font-weight:900;letter-spacing:-1.2px;color:#2ED87A;line-height:1}\n.g-price.na{font-size:15px;color:#ff9b9b;font-weight:700;letter-spacing:0}\n.g-est{font-size:11.5px;color:#8fa6c0;margin-top:5px}\n.g-book{flex:none;background:#23D2FF;color:#0F1923;border:none;border-radius:13px;padding:15px 26px;font-family:inherit;font-size:15.5px;font-weight:800;cursor:pointer;box-shadow:0 14px 34px -12px rgba(35,210,255,.6);transition:filter .15s;white-space:nowrap}\n.g-book:hover,.g-book:focus,.g-book:active{background:#23D2FF !important;color:#0F1923 !important;filter:brightness(1.06);outline:none}\n.g-book:disabled{opacity:.45;cursor:not-allowed}\n\/* WP theme sets a red\/pink global button:hover \u2014 pin every control in this block to our palette *\/\n.hfsk-root button:hover,.hfsk-root button:focus,.hfsk-root button:active{color:inherit}\n.hfsk-pill:hover,.hfsk-pill:focus,.hfsk-pill:active{background:linear-gradient(180deg,rgba(255,255,255,.09),rgba(255,255,255,.02)) !important;color:#dfe9f5 !important}\n.hfsk-pill.on:hover,.hfsk-pill.on:focus,.hfsk-pill.on:active{background:linear-gradient(180deg,rgba(35,210,255,.26),rgba(35,210,255,.09)) !important;color:#fff !important}\n.g-seg button:hover,.g-seg button:focus,.g-seg button:active{background:rgba(255,255,255,.08) !important;color:#fff !important;outline:none}\n.g-seg button.on:hover,.g-seg button.on:focus,.g-seg button.on:active{background:rgba(35,210,255,.12) !important;color:#7FE3FF !important}\n.g-step button:hover,.g-step button:focus,.g-step button:active{background:rgba(255,255,255,.1) !important;color:#40C9F3 !important;outline:none}\n.g-item .rs button:hover,.g-item .rs button:focus,.g-item .rs button:active{background:rgba(255,255,255,.12) !important;color:#40C9F3 !important;outline:none}\n.g-rc .rs button:hover,.g-rc .rs button:focus,.g-rc .rs button:active{background:rgba(255,255,255,.12) !important;color:#40C9F3 !important;outline:none}\n.g-inc>button:hover,.g-inc>button:focus,.g-inc>button:active{background:rgba(255,255,255,.04) !important;color:#dfe9f5 !important;outline:none}\n.g-fine{font-size:10.5px;color:#6d8199;margin-top:12px;text-align:center}\n\/* flooring extras: pattern preview, stain picker *\/\n.g-flprev{display:flex;align-items:center;gap:10px;margin-top:9px}\n.g-flprev img{width:96px;height:64px;object-fit:cover;border-radius:9px;border:1px solid rgba(255,255,255,.18);background:#fff}\n.g-flprev span{font-size:12px;color:#8fa6c0}\n.g-flstain{display:flex;align-items:center;gap:10px;margin-top:2px}\n.g-flstain img{width:44px;height:44px;object-fit:cover;border-radius:9px;border:1px solid rgba(255,255,255,.22);flex:none}\n.g-select{flex:1;min-width:0;height:42px;padding:0 12px;border-radius:10px;background:rgba(255,255,255,.07);border:1.5px solid rgba(255,255,255,.22);color:#fff;font-family:inherit;font-size:13.5px;font-weight:600;outline:none;appearance:auto;-webkit-appearance:menulist}\n.g-select:focus{border-color:#40C9F3}\n.g-select option{color:#0F1923;background:#fff}\n@media (max-width:980px){\n  .hfsk-hero{padding:calc(34px + var(--hf-header-h, 88px)) 18px 56px}\n  \/* minmax(0,1fr): a bare 1fr track grows to the cell's min-content and the\n     hero's overflow:hidden clips it off the right edge of small phones *\/\n  .hfsk-cols{grid-template-columns:minmax(0,1fr);gap:32px}\n  .hfsk-cols>*{min-width:0;max-width:100%}\n  .hfsk-glass{margin:0 auto;width:100%;max-width:520px}\n  .hfsk-sub{margin-bottom:22px}\n  .hfsk-pills{gap:8px}\n  .hfsk-pill{font-size:12.5px;padding:9px 14px}\n}\n@media (max-width:480px){\n  .hfsk-glass{padding:20px 18px 18px}\n  .g-price{font-size:26px}\n  .g-book{padding:13px 18px;font-size:14px}\n  .g-row{gap:10px}\n  .g-zip{width:132px}\n  .g-top h3{font-size:20px}\n  \/* compress-only-when-needed: identical at 390px+, shrinks on smaller phones *\/\n  .g-seg button{white-space:normal}\n  .hfsk-pills.fixedrow .hfsk-pill{white-space:normal;text-align:center;line-height:1.15}\n  .g-rc{padding:10px 5px}\n  .g-rc .rl{font-size:clamp(13px,4.2vw,16.5px)}\n  .g-rc .rs{gap:5px}\n  .g-rc .rs button{width:26px;height:26px}\n  .g-rc .rs .v{min-width:16px;font-size:22px}\n}\n<\/style>\n\n<div class=\"hfc\" id=\"hfc\">\n<section class=\"hfc-hero\"><div class=\"hfc-ey\">Dallas Fencing<\/div><h1 class=\"hfc-h1\">Fence Installation in <span>Dallas<\/span><\/h1>\n<p class=\"hfc-lead\">Search for what you need or pick a service below, and see your price as you go<\/p>\n<form class=\"hfc-srch\" id=\"hfcSearch\" role=\"search\" autocomplete=\"off\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"7\"\/><path d=\"m20 20-3.5-3.5\"\/><\/svg><input id=\"hfcQ\" type=\"text\" placeholder=\"Search for what you need\" aria-label=\"What do you need done?\"><button type=\"submit\">Get My Price<\/button><\/form>\n<div class=\"hfc-pop\"><button type=\"button\" data-hq=\"Wood privacy fence\">Wood Fence<\/button><button type=\"button\" data-hq=\"Vinyl privacy fence\">Vinyl<\/button><button type=\"button\" data-hq=\"Chain link fence\">Chain Link<\/button><button type=\"button\" data-hq=\"Fence repair\">Repair<\/button><button type=\"button\" data-hq=\"Fence gate\">Gate<\/button><\/div><\/section>\n<div class=\"hfc-wrap\"><div class=\"hfc-lay\" id=\"hfcLay\">\n<div class=\"hfc-left\"><div class=\"hfc-blk\" id=\"hfcS1\"><div class=\"hfc-stp\"><h3>Most popular<\/h3><\/div><div class=\"hfc-sv\" id=\"hfcMain\"><\/div><div id=\"hfcAll\" hidden><\/div><button type=\"button\" class=\"hfc-more\" id=\"hfcMore\"><\/button><\/div>\n<\/div>\n<div class=\"hfc-box\" id=\"hfcBox\"><div class=\"hfc-nb\" id=\"hfcNb\"><\/div><\/div>\n<div class=\"hfc-bar\" id=\"hfcBar\"><div><b id=\"hfcBarP\">&hellip;<\/b><small id=\"hfcBarS\"><\/small><\/div><button type=\"button\" class=\"hfc-btn\" id=\"hfcBarB\">Book It<\/button><\/div>\n<\/div><\/div><\/div>\n\n\n\n<!-- ================= END HOUSE FLY SMOKE HERO ================= -->\n\n<!-- HF deep-link preselect 2026-08-17 (live) -->\n<script>\n(function(){\n  var q = new URLSearchParams(window.location.search);\n  var svc = q.get('hf_svc'), task = q.get('hf_task');\n  if(!svc && !task) return;\n  var tries = 0;\n  function norm(s){return (s||'').replace(\/\\s+\/g,' ').trim().toLowerCase()}\n  function findPill(label){\n    var pills = [].slice.call(document.querySelectorAll('button.hfsk-pill'));\n    var n = norm(label);\n    return pills.find(function(p){return norm(p.textContent)===n}) ||\n           pills.find(function(p){return norm(p.textContent).indexOf(n)===0}) ||\n           pills.find(function(p){return n.indexOf(norm(p.textContent))===0});\n  }\n  function go(){\n    tries++;\n    var pills = document.querySelectorAll('button.hfsk-pill');\n    if(!pills.length){ if(tries<40) return setTimeout(go,250); return; }\n    var s = svc && findPill(svc);\n    if(s && s.className.indexOf('on')<0){ s.click(); }\n    setTimeout(function(){\n      var t = task && findPill(task);\n      if(t && t.className.indexOf('on')<0){ t.click(); }\n    }, s ? 400 : 0);\n  }\n  if(document.readyState==='loading') document.addEventListener('DOMContentLoaded',function(){setTimeout(go,300)});\n  else setTimeout(go,300);\n})();\n<\/script><script id=\"hfc-js\" data-no-defer=\"1\" data-no-optimize=\"1\" data-no-minify=\"1\">\n(function(){\n  var D = {\"slug\": \"fencing\", \"st\": \"Fencing\", \"items\": [{\"qdef\": null, \"pstep\": null, \"key\": \"fe_wood_privacy_v\", \"t\": \"menu\", \"name\": \"Wood Privacy Fence, Vertical\", \"icon\": \"\ud83d\udea7\", \"desc\": \"The classic dog ear privacy fence\", \"full\": \"The classic dog ear privacy fence: pressure treated pickets run vertical with less than a half inch of gap, on 4x4 posts set in concrete with two or three rails behind. Labor, lumber, posts, caps, connectors and fasteners included. Old fence removal is an extra.\", \"section\": \"Wood Fences\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 33.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-WD-PRIVV\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 18.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 23.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 28.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 33.99}, {\"key\": \"h7\", \"label\": \"7 ft\", \"price\": 38.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 44.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"6 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_wood_privacy_h\", \"t\": \"menu\", \"name\": \"Wood Privacy Fence, Horizontal\", \"icon\": \"\ud83d\udea7\", \"desc\": \"The modern look: boards run horizontal edge to edge with a tight\", \"full\": \"The modern look: boards run horizontal edge to edge with a tight gap, on posts set in concrete. More layout, more cuts and more blocking than a vertical fence, so it prices above one. Labor, lumber, posts and hardware included.\", \"section\": \"Wood Fences\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 41.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-WD-PRIVH\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 23.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 29.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 35.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 41.99}, {\"key\": \"h7\", \"label\": \"7 ft\", \"price\": 47.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 54.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"6 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_wood_bob_v\", \"t\": \"menu\", \"name\": \"Wood Board on Board Fence, Vertical\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Shadow box: pickets overlap front and back\", \"full\": \"Shadow box: pickets overlap front and back so the fence looks finished from both sides and no gap opens up when the wood dries. About a third more lumber than a standard privacy fence. Labor, lumber, posts and hardware included.\", \"section\": \"Wood Fences\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 37.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-WD-BOBV\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 21.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 26.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 32.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 37.99}, {\"key\": \"h7\", \"label\": \"7 ft\", \"price\": 43.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 49.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"6 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_wood_bob_h\", \"t\": \"menu\", \"name\": \"Wood Board on Board Fence, Horizontal\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Shadow box boards run horizontal\", \"full\": \"Shadow box boards run horizontal: overlapping front and back, good looking from either side, no gaps. The most labor and the most lumber of the wood builds. Labor, lumber, posts and hardware included.\", \"section\": \"Wood Fences\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 45.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-WD-BOBH\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 26.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 32.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 38.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 45.99}, {\"key\": \"h7\", \"label\": \"7 ft\", \"price\": 51.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 58.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"6 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_wood_picket\", \"t\": \"menu\", \"name\": \"Wood Picket Fence, Flat Top\", \"icon\": \"\ud83d\udea7\", \"desc\": \"The traditional open picket fence\", \"full\": \"The traditional open picket fence: flat top pickets spaced two inches or more apart, on posts set in concrete. Marks the yard and keeps pets in without closing off the view. Labor, lumber, posts and hardware included.\", \"section\": \"Wood Fences\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 27.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-WD-PICKET\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 15.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 19.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 23.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 27.99}, {\"key\": \"h7\", \"label\": \"7 ft\", \"price\": 31.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 35.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"4 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_wood_split\", \"t\": \"menu\", \"name\": \"Wood Split Rail Fence, 2 Rail\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Two split rails set through drilled or notched posts\", \"full\": \"Two split rails set through drilled or notched posts: the rustic property line fence for acreage, pastures and front yards. Wire mesh backing is a custom quote. Labor, rails, posts and hardware included.\", \"section\": \"Wood Fences\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 17.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-WD-SPLIT\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 11.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 13.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 15.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 17.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"4 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_wood_ranch\", \"t\": \"menu\", \"name\": \"Wood Ranch Rail Fence, 3 Rail\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Three horizontal rails on posts set in concrete\", \"full\": \"Three horizontal rails on posts set in concrete: the ranch or paddock fence, cleaner and taller than split rail. Labor, rails, posts and hardware included.\", \"section\": \"Wood Fences\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 19.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-WD-RANCH\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 13.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 15.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 17.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 19.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"4 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_wood_crossbuck\", \"t\": \"menu\", \"name\": \"Wood Cross Buck Fence\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Rails with an X brace in every section\", \"full\": \"Rails with an X brace in every section: the farm and horse property look, stiffer than a plain rail fence. Labor, rails, posts and hardware included.\", \"section\": \"Wood Fences\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 23.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-WD-XBUCK\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 16.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 18.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 21.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 23.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"4 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_vinyl_belmont\", \"t\": \"menu\", \"name\": \"Vinyl Spear Top Fence, Belmont\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Vinyl picket panels with a flat run of spear tops\", \"full\": \"Vinyl picket panels with a flat run of spear tops, on routed vinyl posts set in concrete. Never needs paint or stain and washes clean. Labor, panels, posts, caps and hardware included.\", \"section\": \"Vinyl Fences\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 41.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-VY-BELMONT\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 26.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 31.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 36.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 41.99}, {\"key\": \"h7\", \"label\": \"7 ft\", \"price\": 47.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 53.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"4 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_vinyl_scalloped\", \"t\": \"menu\", \"name\": \"Vinyl Spear Top Fence, Concave Scalloped\", \"icon\": \"\ud83d\udea7\", \"desc\": \"The same vinyl spear top panel with a scalloped dip in each\", \"full\": \"The same vinyl spear top panel with a scalloped dip in each section: a softer front yard line. Labor, panels, posts, caps and hardware included.\", \"section\": \"Vinyl Fences\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 42.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-VY-SCALLOP\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 27.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 32.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 37.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 42.99}, {\"key\": \"h7\", \"label\": \"7 ft\", \"price\": 48.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 54.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"4 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_vinyl_ascot\", \"t\": \"menu\", \"name\": \"Vinyl Flat Top Fence, Ascot\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Flat top vinyl picket panels, square and simple\", \"full\": \"Flat top vinyl picket panels, square and simple, on routed posts set in concrete. Labor, panels, posts, caps and hardware included.\", \"section\": \"Vinyl Fences\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 41.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-VY-ASCOT\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 26.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 31.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 36.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 41.99}, {\"key\": \"h7\", \"label\": \"7 ft\", \"price\": 47.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 53.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"4 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_vinyl_privacy\", \"t\": \"menu\", \"name\": \"Vinyl Privacy Panel Fence, No Gaps\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Solid tongue and groove vinyl panels with no gaps, full privacy\", \"full\": \"Solid tongue and groove vinyl panels with no gaps, full privacy, on reinforced posts set in concrete. The vinyl answer to a wood privacy fence, without the maintenance. Labor, panels, posts, caps and hardware included.\", \"section\": \"Vinyl Fences\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 47.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-VY-PRIVACY\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 29.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 35.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 41.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 47.99}, {\"key\": \"h7\", \"label\": \"7 ft\", \"price\": 54.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 61.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"6 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_alum_belmont\", \"t\": \"menu\", \"name\": \"Aluminum Spear Top Fence, Belmont\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Powder coated aluminum panels with a flat run of spear tips\", \"full\": \"Powder coated aluminum panels with a flat run of spear tips, on aluminum posts set in concrete. The ornamental look of iron with no rust and no repainting. Pool code heights available. Labor, panels, posts and hardware included.\", \"section\": \"Aluminum & Iron\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 45.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-AL-BELMONT\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 29.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 34.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 39.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 45.99}, {\"key\": \"h7\", \"label\": \"7 ft\", \"price\": 52.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 59.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"4 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_alum_hamilton\", \"t\": \"menu\", \"name\": \"Aluminum Spear Top Fence, Staggered Hamilton\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Aluminum panels with staggered spear tips\", \"full\": \"Aluminum panels with staggered spear tips, taller pickets alternating with short: the dressier ornamental pattern. Labor, panels, posts and hardware included.\", \"section\": \"Aluminum & Iron\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 47.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-AL-HAMILTON\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 31.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 36.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 41.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 47.99}, {\"key\": \"h7\", \"label\": \"7 ft\", \"price\": 54.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 61.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"4 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_alum_ascot\", \"t\": \"menu\", \"name\": \"Aluminum Flat Top Fence, Ascot\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Flat top aluminum panels, clean and square with no points\", \"full\": \"Flat top aluminum panels, clean and square with no points, on posts set in concrete. Often the pool and playground choice. Labor, panels, posts and hardware included.\", \"section\": \"Aluminum & Iron\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 45.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-AL-ASCOT\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 29.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 34.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 39.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 45.99}, {\"key\": \"h7\", \"label\": \"7 ft\", \"price\": 52.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 59.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"4 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_alum_canterbury\", \"t\": \"menu\", \"name\": \"Aluminum Flat Top Fence, Staggered Canterbury\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Flat top aluminum with a staggered picket line, no spear tips\", \"full\": \"Flat top aluminum with a staggered picket line, no spear tips. Labor, panels, posts and hardware included.\", \"section\": \"Aluminum & Iron\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 47.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-AL-CANTER\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 31.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 36.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 41.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 47.99}, {\"key\": \"h7\", \"label\": \"7 ft\", \"price\": 54.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 61.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"4 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_iron_belmont\", \"t\": \"menu\", \"name\": \"Wrought Iron Spear Top Fence, Belmont\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Real welded iron with a flat run of spear tips\", \"full\": \"Real welded iron with a flat run of spear tips, primed and powder coated, on posts set in concrete. The heaviest and longest lasting fence we build. Labor, panels, posts and hardware included.\", \"section\": \"Aluminum & Iron\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 64.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-IR-BELMONT\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 42.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 49.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 56.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 64.99}, {\"key\": \"h7\", \"label\": \"7 ft\", \"price\": 73.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 83.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"4 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_iron_hamilton\", \"t\": \"menu\", \"name\": \"Wrought Iron Spear Top Fence, Staggered Hamilton\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Welded iron with staggered spear tips\", \"full\": \"Welded iron with staggered spear tips, tall and short pickets alternating: the traditional estate pattern. Labor, panels, posts and hardware included.\", \"section\": \"Aluminum & Iron\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 67.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-IR-HAMILTON\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 44.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 51.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 58.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 67.99}, {\"key\": \"h7\", \"label\": \"7 ft\", \"price\": 76.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 86.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"4 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_iron_ascot\", \"t\": \"menu\", \"name\": \"Wrought Iron Flat Top Fence, Ascot\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Flat top welded iron, square and simple with no points\", \"full\": \"Flat top welded iron, square and simple with no points, primed and powder coated. Labor, panels, posts and hardware included.\", \"section\": \"Aluminum & Iron\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 64.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-IR-ASCOT\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 42.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 49.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 56.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 64.99}, {\"key\": \"h7\", \"label\": \"7 ft\", \"price\": 73.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 83.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"4 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_iron_canterbury\", \"t\": \"menu\", \"name\": \"Wrought Iron Flat Top Fence, Staggered Canterbury\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Flat top welded iron with a staggered picket line\", \"full\": \"Flat top welded iron with a staggered picket line. Labor, panels, posts and hardware included.\", \"section\": \"Aluminum & Iron\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 67.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-IR-CANTER\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 44.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 51.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 58.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 67.99}, {\"key\": \"h7\", \"label\": \"7 ft\", \"price\": 76.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 86.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"4 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_chain_link\", \"t\": \"menu\", \"name\": \"Chain Link Fence Installation\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Galvanized chain link mesh stretched on steel line posts set\", \"full\": \"Galvanized chain link mesh stretched on steel line posts set in concrete, with top rail, tension bars and ties. The least expensive way to close in a yard, a dog run or a work area. Black or green vinyl coated mesh is an option. Labor, mesh, posts and hardware included.\", \"section\": \"Chain Link & Farm\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 21.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-CL-CHAIN\", \"variants\": [{\"key\": \"h3\", \"label\": \"3 ft\", \"price\": 13.99}, {\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 15.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 18.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 21.99}, {\"key\": \"h7\", \"label\": \"7 ft\", \"price\": 25.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 29.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"4 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_comp_horizontal\", \"t\": \"menu\", \"name\": \"Composite Fence, Horizontal Board\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Capped composite boards run horizontal between aluminum\", \"full\": \"Capped composite boards run horizontal between aluminum reinforced posts, no gaps: the look of a stained horizontal wood fence with none of the staining, warping or rot. Boards, posts, caps and hardware included.\", \"section\": \"Composite & Metal\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 64.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-CP-HORIZ\", \"variants\": [{\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 49.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 56.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 64.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 79.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"6 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_comp_vertical\", \"t\": \"menu\", \"name\": \"Composite Fence, Vertical Board\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Capped composite pickets run vertical with no gaps\", \"full\": \"Capped composite pickets run vertical with no gaps, on reinforced posts: full privacy, never needs paint or stain, and it will not grey out or splinter.\", \"section\": \"Composite & Metal\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 64.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-CP-VERT\", \"variants\": [{\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 49.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 56.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 64.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 79.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"6 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_metal_horizontal\", \"t\": \"menu\", \"name\": \"Corrugated Metal Fence, Horizontal Panel\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Corrugated steel panels run horizontal in a welded or wood frame\", \"full\": \"Corrugated steel panels run horizontal in a welded or wood frame: the modern industrial look, full privacy, and nothing to rot. Panels, frame, posts and hardware included.\", \"section\": \"Composite & Metal\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 48.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-MT-HORIZ\", \"variants\": [{\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 37.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 42.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 48.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 58.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"6 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_metal_vertical\", \"t\": \"menu\", \"name\": \"Corrugated Metal Fence, Vertical Panel\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Corrugated steel panels run vertical between framed posts\", \"full\": \"Corrugated steel panels run vertical between framed posts, rails top and bottom: clean, private and about as low maintenance as a fence gets.\", \"section\": \"Composite & Metal\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 48.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-MT-VERT\", \"variants\": [{\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 37.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 42.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 48.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 58.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"6 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_farm_woven\", \"t\": \"menu\", \"name\": \"Woven Wire Field Fence\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Woven wire field fence stretched on driven or set posts\", \"full\": \"Woven wire field fence stretched on driven or set posts with a top and bottom wire: the working fence for pasture, paddock and property lines on acreage. Wire, posts, staples and bracing included.\", \"section\": \"Chain Link & Farm\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 15.99, \"min_qty\": 100, \"max_qty\": 5000, \"step\": 50, \"code\": \"FE-FM-WOVEN\", \"variants\": [{\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 9.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 11.99}, {\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 13.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"5 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_farm_barbed\", \"t\": \"menu\", \"name\": \"Barbed Wire Fence, 5 Strand\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Five strands of barbed wire stretched and stapled on line posts\", \"full\": \"Five strands of barbed wire stretched and stapled on line posts with braced corners: the least expensive way to fence acreage and hold cattle.\", \"section\": \"Chain Link & Farm\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 6.99, \"min_qty\": 100, \"max_qty\": 5000, \"step\": 50, \"code\": \"FE-FM-BARBED\", \"variants\": [{\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 5.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 6.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"4 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_farm_deer\", \"t\": \"menu\", \"name\": \"Deer and Garden Fence\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Tall poly or welded wire deer mesh on steel or wood posts\", \"full\": \"Tall poly or welded wire deer mesh on steel or wood posts, staked tight to the ground so nothing slips under: keeps deer out of a garden, an orchard or a whole yard.\", \"section\": \"Chain Link & Farm\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 16.99, \"min_qty\": 50, \"max_qty\": 5000, \"step\": 50, \"code\": \"FE-FM-DEER\", \"variants\": [{\"key\": \"h6\", \"label\": \"6 ft\", \"price\": 11.99}, {\"key\": \"h7\", \"label\": \"7 ft\", \"price\": 13.99}, {\"key\": \"h8\", \"label\": \"8 ft\", \"price\": 15.99}], \"rows\": false, \"variant_q\": \"How tall should the fence be?\", \"variant_default\": \"7 ft\", \"rank\": 50, \"questions\": [{\"key\": \"fe_ground\", \"label\": \"Ground along the fence line\", \"options\": [\"Flat and clear\", \"Sloped or uneven\", \"Rocky or hard digging\"], \"add\": {\"Sloped or uneven\": 299, \"Rocky or hard digging\": 499}}, {\"key\": \"fe_permit\", \"label\": \"Permit and utility locate\", \"options\": [\"I will handle it\", \"The pro pulls the permit\"], \"add\": {\"The pro pulls the permit\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_repair\", \"t\": \"menu\", \"name\": \"Fence Repair\", \"icon\": \"\ud83d\udee0\", \"desc\": \"A fence that is still standing put back right\", \"full\": \"A fence that is still standing put back right: boards and pickets replaced, a blown down section rebuilt, rails and framing repaired, everything fastened back to the posts and the debris hauled off.\", \"section\": \"Repairs\", \"unit\": \"unit\", \"unit_label\": \"section\", \"price\": 179.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"FE-REPAIR\", \"variants\": [{\"key\": \"boards\", \"label\": \"Loose or broken boards and pickets\", \"price\": 89.99}, {\"key\": \"section\", \"label\": \"A full section or panel\", \"price\": 179.99}, {\"key\": \"rails\", \"label\": \"Rails and framing\", \"price\": 149.99}, {\"key\": \"storm\", \"label\": \"Storm damage, several sections\", \"price\": 229.99}], \"rows\": false, \"variant_q\": \"What needs repairing?\", \"variant_default\": \"A full section or panel\", \"rank\": 50, \"questions\": [{\"key\": \"rp_mat\", \"label\": \"What is the fence made of?\", \"options\": [\"Wood\", \"Vinyl or composite\", \"Aluminum or wrought iron\", \"Chain link\"], \"add\": {\"Vinyl or composite\": 40, \"Aluminum or wrought iron\": 60}}, {\"key\": \"rp_supply\", \"label\": \"Material\", \"options\": [\"I have the material\", \"The pro supplies it\"], \"add\": {\"The pro supplies it\": 99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_post_repair\", \"t\": \"menu\", \"name\": \"Fence Post Repair or Replacement\", \"icon\": \"\ud83e\udeb5\", \"desc\": \"Leaning, rotted or snapped posts made solid again\", \"full\": \"Leaning, rotted or snapped posts made solid again: the post reset and braced, or dug out with its old footing and replaced with a new post in fresh concrete, and the panels refastened.\", \"section\": \"Repairs\", \"unit\": \"unit\", \"unit_label\": \"post\", \"price\": 189.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"FE-POSTFIX\", \"variants\": [{\"key\": \"lean\", \"label\": \"Leaning, reset and brace\", \"price\": 149.99}, {\"key\": \"rot\", \"label\": \"Rotted or snapped, full replacement\", \"price\": 189.99}, {\"key\": \"footing\", \"label\": \"Broken off in concrete, old footing dug out\", \"price\": 249.99}], \"rows\": false, \"variant_q\": \"What is wrong with the post?\", \"variant_default\": \"Rotted or snapped, full replacement\", \"rank\": 50, \"questions\": [{\"key\": \"pr_mat\", \"label\": \"Post\", \"options\": [\"Wood 4x4\", \"Steel or vinyl sleeve\", \"Iron or aluminum\"], \"add\": {\"Steel or vinyl sleeve\": 40, \"Iron or aluminum\": 60}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_gate_new\", \"t\": \"menu\", \"name\": \"New Gate on an Existing Fence\", \"icon\": \"\ud83d\udeaa\", \"desc\": \"A new gate cut into a fence you already have\", \"full\": \"A new gate cut into a fence you already have: heavier gate posts set in concrete, the opening framed, and the gate built to match the fence and hung to swing and latch true.\", \"section\": \"Gates\", \"unit\": \"unit\", \"unit_label\": \"gate\", \"price\": 499.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"FE-GATENEW\", \"variants\": [{\"key\": \"single\", \"label\": \"Single walk gate\", \"price\": 499.99}, {\"key\": \"double\", \"label\": \"Double drive gate\", \"price\": 1099.99}], \"rows\": false, \"variant_q\": \"Which gate?\", \"variant_default\": \"Single walk gate\", \"rank\": 50, \"questions\": [{\"key\": \"gn_height\", \"label\": \"Gate height\", \"options\": [\"4 ft\", \"6 ft\", \"8 ft\"], \"add\": {\"6 ft\": 100, \"8 ft\": 225}}, {\"key\": \"gn_hw\", \"label\": \"Hardware\", \"options\": [\"Standard latch and hinges\", \"Self closing and lockable, pool code\"], \"add\": {\"Self closing and lockable, pool code\": 149}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_gate_repair\", \"t\": \"menu\", \"name\": \"Gate Repair and Realignment\", \"icon\": \"\ud83d\udd27\", \"desc\": \"A gate that sags, drags or will not latch put back square\", \"full\": \"A gate that sags, drags or will not latch put back square: hinges and hardware replaced, the gate post reinforced or reset, the leaf rebuilt or re-squared, and the latch set so it closes with one hand.\", \"section\": \"Gates\", \"unit\": \"unit\", \"unit_label\": \"gate\", \"price\": 219.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"FE-GATEFIX\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"gr_what\", \"label\": \"What is wrong?\", \"options\": [\"Sags or drags on the ground\", \"Will not latch or line up\", \"Hinges or hardware broken\", \"The post the gate hangs on is loose\"], \"add\": {\"Hinges or hardware broken\": 60, \"The post the gate hangs on is loose\": 120}}, {\"key\": \"gr_gate\", \"label\": \"Gate\", \"options\": [\"Single walk gate\", \"Double drive gate\"], \"add\": {\"Double drive gate\": 120}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_pool\", \"t\": \"menu\", \"name\": \"Pool Safety Fence, Removable Mesh\", \"icon\": \"\ud83c\udfca\", \"desc\": \"Code compliant removable mesh fence around the pool\", \"full\": \"Code compliant removable mesh fence around the pool: UV mesh panels on poles set into sleeves in the deck, so it comes out in sections when you want the yard back. Most codes want 4 ft minimum and no more than a 4 inch gap at the bottom.\", \"section\": \"Specialty Fences\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 27.99, \"min_qty\": 40, \"max_qty\": 400, \"step\": 5, \"code\": \"FE-POOL\", \"variants\": [{\"key\": \"h4\", \"label\": \"4 ft\", \"price\": 27.99}, {\"key\": \"h5\", \"label\": \"5 ft\", \"price\": 31.99}], \"rows\": false, \"variant_q\": \"How tall?\", \"variant_default\": \"4 ft\", \"rank\": 50, \"questions\": [{\"key\": \"pl_deck\", \"label\": \"Deck surface\", \"options\": [\"Concrete or pavers\", \"Wood deck\", \"Stone, tile or turf\"], \"add\": {\"Wood deck\": 99, \"Stone, tile or turf\": 199}}, {\"key\": \"pl_gate\", \"label\": \"Self closing gate\", \"options\": [\"No gate needed\", \"One self closing gate\", \"Two self closing gates\"], \"add\": {\"One self closing gate\": 549, \"Two self closing gates\": 1049}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_opener\", \"t\": \"menu\", \"name\": \"Automatic Gate and Opener\", \"icon\": \"\ud83c\udf9b\", \"desc\": \"A driveway gate that opens itself\", \"full\": \"A driveway gate that opens itself: the gate, the operator, the safety loops and photo eyes, the keypad or remotes, and the electrical run out to it.\", \"section\": \"Gates\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 3999.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"FE-OPENER\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"op_gate\", \"label\": \"The gate\", \"options\": [\"I have a gate, I need it automated\", \"I need the gate and the opener\"], \"add\": {}}, {\"key\": \"op_power\", \"label\": \"Power at the gate\", \"options\": [\"There is power at the gate\", \"Power has to be run out to it\"], \"add\": {}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_temp\", \"t\": \"menu\", \"name\": \"Temporary or Construction Fencing\", \"icon\": \"\ud83d\udea7\", \"desc\": \"Panel fence up around a job site, an event or a pool\", \"full\": \"Panel fence up around a job site, an event or a pool while it is being built: delivered, set with stands or driven posts, and taken away when you are done. Priced by the run and how long you need it.\", \"section\": \"Specialty Fences\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 499.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"FE-TEMP\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"tf_how_long\", \"label\": \"How long do you need it?\", \"options\": [\"Under a month\", \"One to three months\", \"Longer than three months\"], \"add\": {}}, {\"key\": \"tf_screen\", \"label\": \"Privacy screen on it?\", \"options\": [\"No\", \"Yes, wind and privacy screen\"], \"add\": {}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_large\", \"t\": \"menu\", \"name\": \"Large Property Fencing Over 500 Feet\", \"icon\": \"\ud83c\udfde\", \"desc\": \"Acreage, a ranch line, an HOA or a commercial lot\", \"full\": \"Acreage, a ranch line, an HOA or a commercial lot: the run measured, corners, bracing, gates and access planned, and a price that fits the volume.\", \"section\": \"Specialty Fences\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 9999.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"FE-LARGE\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"lg_type\", \"label\": \"What kind of fence?\", \"options\": [\"Farm, field or barbed wire\", \"Wood, vinyl or composite privacy\", \"Ornamental iron or aluminum\", \"Chain link\"], \"add\": {}}, {\"key\": \"lg_terrain\", \"label\": \"The land\", \"options\": [\"Flat and clear\", \"Rolling or wooded\", \"Steep or rocky\"], \"add\": {}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_columns\", \"t\": \"menu\", \"name\": \"Masonry Columns and Custom Fence Design\", \"icon\": \"\ud83e\uddf1\", \"desc\": \"Brick or stone columns with iron or wood panels between them\", \"full\": \"Brick or stone columns with iron or wood panels between them, a custom entry, an arbor over the gate, or a fence drawn to match the house.\", \"section\": \"Specialty Fences\", \"unit\": \"flat\", \"unit_label\": \"\", \"price\": 2499.99, \"min_qty\": 1, \"max_qty\": 1, \"step\": 1, \"code\": \"FE-COLUMNS\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"cs_what\", \"label\": \"What do you have in mind?\", \"options\": [\"Columns with panels between them\", \"A custom entry or arbor\", \"A one off design to match the house\"], \"add\": {}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_gate_ao\", \"t\": \"menu\", \"name\": \"Single walk gate\", \"icon\": \"\ud83d\udeaa\", \"desc\": \"A single walk gate framed and hung in the new fence line\", \"full\": \"A single walk gate framed and hung in the new fence line: heavier posts set in concrete, hinges, a latch and the gate leaf built to match the fence.\", \"section\": \"Gates\", \"unit\": \"unit\", \"unit_label\": \"gate\", \"price\": 449.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"FE-AO-GATE\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"gt_height\", \"label\": \"Gate height\", \"options\": [\"4 ft\", \"6 ft\", \"8 ft\"], \"add\": {\"6 ft\": 100, \"8 ft\": 225}}, {\"key\": \"gt_hw\", \"label\": \"Hardware\", \"options\": [\"Standard latch and hinges\", \"Self closing, lockable or keyed\"], \"add\": {\"Self closing, lockable or keyed\": 129}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_dgate_ao\", \"t\": \"menu\", \"name\": \"Double drive gate\", \"icon\": \"\ud83d\ude9b\", \"desc\": \"A two leaf drive gate for a driveway or side yard\", \"full\": \"A two leaf drive gate for a driveway or side yard: corner posts set deep in concrete, drop rod, cane bolt and latching hardware, sized to the opening you give us.\", \"section\": \"Gates\", \"unit\": \"unit\", \"unit_label\": \"gate\", \"price\": 999.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"FE-AO-DGATE\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"dg_width\", \"label\": \"Opening\", \"options\": [\"10 ft\", \"12 ft\", \"16 ft or wider\"], \"add\": {\"12 ft\": 199, \"16 ft or wider\": 449}}, {\"key\": \"dg_height\", \"label\": \"Gate height\", \"options\": [\"4 ft\", \"6 ft\", \"8 ft\"], \"add\": {\"6 ft\": 149, \"8 ft\": 299}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_post_ao\", \"t\": \"menu\", \"name\": \"Extra or replacement post\", \"icon\": \"\ud83d\udee0\", \"desc\": \"One extra post beyond the standard 8 ft spacing\", \"full\": \"One extra post beyond the standard 8 ft spacing, or a rotted or leaning post pulled and reset: new post, concrete footing and the panel refastened.\", \"section\": \"Prep & Removal\", \"unit\": \"unit\", \"unit_label\": \"post\", \"price\": 129.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"FE-AO-POST\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"po_what\", \"label\": \"Post\", \"options\": [\"A new post in the run\", \"A rotted or leaning post replaced\"], \"add\": {\"A rotted or leaning post replaced\": 40}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_teardown_ao\", \"t\": \"menu\", \"name\": \"Old fence removal and haul away\", \"icon\": \"\ud83d\udd28\", \"desc\": \"The existing fence pulled down\", \"full\": \"The existing fence pulled down, posts dug out and everything loaded and hauled to the dump before the new fence goes up. Dump fees included.\", \"section\": \"Prep & Removal\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 6.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-AO-TEARDOWN\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"td_mat\", \"label\": \"Fence coming out\", \"options\": [\"Wood or chain link\", \"Vinyl, aluminum or wrought iron\", \"Posts set in concrete footings\"], \"add\": {\"Vinyl, aluminum or wrought iron\": 99, \"Posts set in concrete footings\": 249}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_rail_ao\", \"t\": \"menu\", \"name\": \"Second iron rail\", \"icon\": \"\u2796\", \"desc\": \"A second horizontal rod run about a foot off the ground\", \"full\": \"A second horizontal rod run about a foot off the ground on a wrought iron or aluminum fence: stiffer panel, tighter gap at the bottom. Priced by the linear foot, as the legacy sheet did.\", \"section\": \"Upgrades\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 5.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-AO-RAIL\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": []}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_kickboard_ao\", \"t\": \"menu\", \"name\": \"Rot board along the bottom\", \"icon\": \"\ud83e\udeb5\", \"desc\": \"A pressure treated or composite board run flat along the ground\", \"full\": \"A pressure treated or composite board run flat along the ground under the pickets, so the fence boards never touch dirt and the fence lasts years longer. Also closes the gap small dogs squeeze through.\", \"section\": \"Upgrades\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 4.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-AO-KICKBOARD\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"kb_mat\", \"label\": \"Board\", \"options\": [\"Pressure treated pine\", \"Composite, will never rot\"], \"add\": {\"Composite, will never rot\": 99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_lattice_ao\", \"t\": \"menu\", \"name\": \"Lattice top or topper\", \"icon\": \"\ud83e\ude9f\", \"desc\": \"A decorative lattice or solid board section added across the top\", \"full\": \"A decorative lattice or solid board section added across the top of the fence: another foot or two of height and privacy without rebuilding the fence.\", \"section\": \"Upgrades\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 12.99, \"min_qty\": 20, \"max_qty\": 600, \"step\": 10, \"code\": \"FE-AO-LATTICE\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"lt_style\", \"label\": \"Topper\", \"options\": [\"Square lattice\", \"Diagonal lattice\", \"Solid board topper\"], \"add\": {\"Solid board topper\": 99}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_caps_ao\", \"t\": \"menu\", \"name\": \"Post caps\", \"icon\": \"\ud83d\udca1\", \"desc\": \"A finished cap on every post\", \"full\": \"A finished cap on every post: flat, pyramid or a solar light cap that charges through the day and lights the fence line at night.\", \"section\": \"Upgrades\", \"unit\": \"unit\", \"unit_label\": \"post\", \"price\": 24.99, \"min_qty\": 2, \"max_qty\": 99, \"step\": 1, \"code\": \"FE-AO-CAPS\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"pc_type\", \"label\": \"Cap\", \"options\": [\"Flat or pyramid cap\", \"Solar light cap\"], \"add\": {\"Solar light cap\": 22}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_slats_ao\", \"t\": \"menu\", \"name\": \"Privacy slats or windscreen\", \"icon\": \"\ud83d\udccf\", \"desc\": \"Slats woven through chain link\", \"full\": \"Slats woven through chain link, or a fabric windscreen stretched across it, so the yard is private and the wind and dust are cut down. Roughly 75 to 85 percent coverage.\", \"section\": \"Upgrades\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 7.99, \"min_qty\": 20, \"max_qty\": 600, \"step\": 10, \"code\": \"FE-AO-SLATS\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"sl_type\", \"label\": \"Type\", \"options\": [\"Woven vinyl slats\", \"Aluminum slats\", \"Fabric windscreen\"], \"add\": {\"Aluminum slats\": 79}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_digguard_ao\", \"t\": \"menu\", \"name\": \"Dig guard for dogs\", \"icon\": \"\ud83d\udc15\", \"desc\": \"A buried wire mesh apron, or a poured concrete strip\", \"full\": \"A buried wire mesh apron, or a poured concrete strip, run along the bottom of the fence so a digging dog cannot get under it.\", \"section\": \"Upgrades\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 8.99, \"min_qty\": 20, \"max_qty\": 600, \"step\": 10, \"code\": \"FE-AO-DIGGUARD\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"dg_method\", \"label\": \"Method\", \"options\": [\"Buried wire mesh apron\", \"Poured concrete mow strip\"], \"add\": {\"Poured concrete mow strip\": 299}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_clearing_ao\", \"t\": \"menu\", \"name\": \"Fence line clearing\", \"icon\": \"\ud83e\ude93\", \"desc\": \"The fence line cleared before the crew sets posts\", \"full\": \"The fence line cleared before the crew sets posts: grass and brush cut back, roots and small stumps out, old concrete footings broken out and hauled off.\", \"section\": \"Prep & Removal\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 6.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-AO-CLEARING\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"cl_what\", \"label\": \"What is on the line\", \"options\": [\"Grass and light brush\", \"Heavy brush and small trees\", \"Roots or an old concrete footing every few feet\"], \"add\": {\"Heavy brush and small trees\": 199, \"Roots or an old concrete footing every few feet\": 399}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_coredrill_ao\", \"t\": \"menu\", \"name\": \"Core drill posts through concrete\", \"icon\": \"\ud83d\udd73\", \"desc\": \"Posts set through an existing slab, patio or driveway\", \"full\": \"Posts set through an existing slab, patio or driveway: each hole core drilled, the post set and the surface patched around it.\", \"section\": \"Prep & Removal\", \"unit\": \"unit\", \"unit_label\": \"post\", \"price\": 89.99, \"min_qty\": 1, \"max_qty\": 99, \"step\": 1, \"code\": \"FE-AO-COREDRILL\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"cd_surface\", \"label\": \"Surface\", \"options\": [\"Concrete slab or patio\", \"Asphalt\", \"Brick, stone or pavers\"], \"add\": {\"Brick, stone or pavers\": 40}}]}, {\"qdef\": null, \"pstep\": null, \"key\": \"fe_security_ao\", \"t\": \"menu\", \"name\": \"Barbed or security topper\", \"icon\": \"\ud83d\udd12\", \"desc\": \"A three strand barbed arm, or a spike topper\", \"full\": \"A three strand barbed arm, or a spike topper, added along the top of a chain link or metal fence for a yard, a lot or a work site.\", \"section\": \"Upgrades\", \"unit\": \"unit\", \"unit_label\": \"linear ft\", \"price\": 9.99, \"min_qty\": 20, \"max_qty\": 1000, \"step\": 10, \"code\": \"FE-AO-SECURITY\", \"variants\": [], \"rows\": false, \"variant_q\": \"\", \"variant_default\": \"\", \"rank\": 50, \"questions\": [{\"key\": \"sc_type\", \"label\": \"Topper\", \"options\": [\"Three strand barbed arm\", \"Spike or razor topper\"], \"add\": {\"Spike or razor topper\": 149}}]}], \"extras\": [], \"main\": [\"fe_wood_privacy_v\", \"fe_vinyl_privacy\", \"fe_alum_ascot\", \"fe_chain_link\", \"fe_repair\", \"fe_post_repair\"], \"sections\": [\"Wood Fences\", \"Vinyl Fences\", \"Aluminum & Iron\", \"Chain Link & Farm\", \"Composite & Metal\", \"Repairs\", \"Gates\", \"Specialty Fences\", \"Prep & Removal\", \"Upgrades\"]};\n  var APP = '\/account', QUOTE = APP + '\/customer\/booking-assistant\/quote', CART = APP + '\/customer\/booking-assistant\/create-cart', ZIP = '75201';\n  var SQ_HOUSE = ['Up to 1,000 sq ft','1,001 - 2,000','2,001 - 3,000','3,001 - 4,000','4,001 - 5,000'], SQ_APT = ['Up to 1,000 sq ft','1,001 - 2,000','2,001 - 3,000'];\n  var I = {}, X = {};\n  D.items.forEach(function(o){ I[o.key] = o; }); (D.extras || []).forEach(function(a){ X[a.key] = a; });\n  var st = { sel: [], c: {}, ex: {}, all: true, inc: {}, desc: {} };\n  var q = { busy: false, res: [], groups: [], seq: 0, err: '' };\n  function $(id){ return document.getElementById(id); }\n  function esc(t){ return String(t == null ? '' : t).replace(\/[&<>\"]\/g, function(c){ return {'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c]; }); }\n  function money(n){ return '$' + Number(n).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2}); }\n  function dur(h){ var m = Math.round((Number(h) || 0) * 60), dd = Math.floor(m \/ 480), r = m % 480, hh = Math.floor(r \/ 60), mm = r % 60, p = []; if (dd) p.push(dd + ' day' + (dd > 1 ? 's' : '')); if (hh) p.push(hh + ' hr'); if (mm) p.push(mm + ' min'); return p.join(' ') || '0 min'; }\n  function unitTxt(o){ if (o.unit === 'sqft') return '\/ sq ft'; if (o.unit === 'hour') return '\/ hour'; if (o.unit === 'unit' && o.unit_label) return '\/ ' + o.unit_label; return ''; }\n  function on(k){ return st.sel.indexOf(k) >= 0; }\n  function nOf(o){ return o.unit === 'sqft' ? 'sq ft' : (o.unit === 'hour' ? 'hour' : (o.unit_label || '')); }\n  function pl(o, n){ return n > 1 && (o.unit === 'unit' || o.unit === 'hour') && !\/(ft|s)$\/.test(nOf(o)) ? 's' : ''; }\n  \/\/ per service settings, created with its defaults the first time it is added\n  function cf(o){\n    if (st.c[o.key]) return st.c[o.key];\n    var c = {};\n    if (o.t === 'visit') c = { often: 'One Time', freq: 'Weekly', prop: 0, sq: 1, beds: 1, full: 1, half: 0, cleaners: 1, hours: 2 };\n    else if (o.t === 'legacy') (o.fields || []).forEach(function(f){ if (f.t === 'seg') c[f.n] = f.def != null ? f.def : f.opts[0]; else if (f.t === 'num') c[f.n] = f.def; else if (f.t === 'list') c[f.n] = f.def || 0; else if (f.t === 'items') c.items = f.items.map(function(_, i){ return i === 0 ? 1 : 0; }); });\n    else { c.qty = o.qdef || o.min_qty || 1; c.ans = {}; (o.questions || []).forEach(function(qq){ c.ans[qq.key] = qq.options[0]; }); if ((o.variants || []).length){ var dv = o.variants.filter(function(x){ return x.key === o.variant_default || x.label === o.variant_default; })[0]; c.variant = (dv || o.variants[0]).key; if (o.rows){ c.rows = {}; o.variants.forEach(function(x){ c.rows[x.key] = 0; }); } \/* HF-2026-10-10z (Chris): nothing is picked for the customer, every count starts at 0 *\/ } }\n    st.c[o.key] = c; return c;\n  }\n  function shown(o, f){ if (!f.when) return true; var v = cf(o); for (var k in f.when){ if (f.when[k].indexOf(v[k]) < 0) return false; } return true; }\n  function rowsSum(o){ var c = cf(o), n = 0; for (var k in c.rows) n += c.rows[k]; return n; }\n  \/\/ a service with counted rows needs at least one row above 0 before it can be priced\n  function empty(o){\n    if (o.t === 'legacy'){ var f = (o.fields || []).filter(function(x){ return x.t === 'items'; })[0]; return !!f && !cf(o).items.some(function(n){ return n > 0; }); }\n    if (o.rows) return rowsSum(o) <= 0;\n    return false;\n  }\n  function hintOf(o){\n    if (o.hint) return o.hint;\n    if (o.t === 'quote') return 'custom quote';\n    if ((o.variants || []).length){ var ps = o.variants.map(function(x){ return x.price; }).filter(function(x){ return x > 0; }); if (ps.length) return 'from ' + money(Math.min.apply(null, ps)) + (o.unit !== 'flat' ? ' ' + unitTxt(o) : ''); }\n    return o.price > 0 ? money(o.price) + (o.unit !== 'flat' ? ' ' + unitTxt(o) : '') : 'see price';\n  }\n  \/\/ ---- the options under a picked card (white, on the left) ----\n  function ob(k, name, val, opts){ return '<div class=\"os\">' + opts.map(function(x){ return '<button type=\"button\" data-k=\"' + k + '\" data-fs=\"' + esc(name) + '\" data-v=\"' + esc(x) + '\"' + (x === val ? ' class=\"on\"' : '') + '>' + esc(x) + '<\/button>'; }).join('') + '<\/div>'; }\n  function om(k, name, val, min, max){ return '<div class=\"om\"><button type=\"button\" data-k=\"' + k + '\" data-fn=\"' + esc(name) + '\" data-d=\"-1\"' + (val <= min ? ' disabled' : '') + ' aria-label=\"Less\">\u2212<\/button><b' + (val ? '' : ' class=\"z\"') + '>' + val + '<\/b><button type=\"button\" data-k=\"' + k + '\" data-fn=\"' + esc(name) + '\" data-d=\"1\"' + (val >= max ? ' disabled' : '') + ' aria-label=\"More\">+<\/button><\/div>'; }\n  function ost(k, name, disp, unit, lo, hi){ return '<div class=\"ost\"><div class=\"om\"><button type=\"button\" data-k=\"' + k + '\" data-fn=\"' + esc(name) + '\" data-d=\"-1\"' + (lo ? ' disabled' : '') + ' aria-label=\"Less\">\u2212<\/button><\/div><div class=\"ov\">' + esc(disp) + (unit ? '<small>' + esc(unit) + '<\/small>' : '') + '<\/div><div class=\"om\"><button type=\"button\" data-k=\"' + k + '\" data-fn=\"' + esc(name) + '\" data-d=\"1\"' + (hi ? ' disabled' : '') + ' aria-label=\"More\">+<\/button><\/div><\/div>'; }\n  function lbl(t){ return '<div class=\"ol\">' + esc(t) + '<\/div>'; }\n  function optsHTML(o){\n    var c = cf(o), k = o.key, h = '';\n    if (o.t === 'visit'){\n      if (o.recurring){ h += lbl('How often?') + ob(k, 'often', c.often, ['One Time', 'Recurring']); if (c.often === 'Recurring') h += lbl('How frequently?') + ob(k, 'freq', c.freq, ['Weekly', 'Bi-Weekly', 'Monthly']); }\n      if (o.hourly){ var mx = c.often === 'Recurring' ? 4 : 8; if (c.hours > mx) c.hours = mx;\n        h += lbl('How many cleaners?') + ob(k, 'cleaners', c.cleaners === 2 ? '2 Cleaners' : '1 Cleaner', ['1 Cleaner', '2 Cleaners']);\n        h += lbl('How many hours?') + ost(k, 'hours', c.hours, 'hr' + (c.hours > 1 ? 's' : ''), c.hours <= 1, c.hours >= mx);\n      } else { var sl = c.prop ? SQ_APT : SQ_HOUSE; if (c.sq > sl.length - 1) c.sq = sl.length - 1;\n        h += lbl('Type of property') + ob(k, 'prop', c.prop ? 'Apartment \/ Condo' : 'House \/ Townhouse', ['House \/ Townhouse', 'Apartment \/ Condo']);\n        h += lbl('Square feet') + ost(k, 'sq', sl[c.sq].replace(' sq ft', ''), 'sq ft', c.sq <= 0, c.sq >= sl.length - 1);\n        h += lbl('Bedrooms & bathrooms') + '<div class=\"orm\"><div>Bedrooms' + om(k, 'beds', c.beds, 1, 9) + '<\/div><div>Full Baths' + om(k, 'full', c.full, 1, 9) + '<\/div><div>Half Baths' + om(k, 'half', c.half, 0, 9) + '<\/div><\/div>';\n      }\n    } else if (o.t === 'legacy'){\n      (o.fields || []).forEach(function(f){\n        if (!shown(o, f)) return;\n        if (f.t === 'seg') h += lbl(f.label) + ob(k, f.n, c[f.n], f.opts);\n        else if (f.t === 'num') h += lbl(f.label) + ost(k, f.n, Number(c[f.n]).toLocaleString('en-US'), f.unit + (f.unit && c[f.n] > 1 && !\/ft$\/.test(f.unit) ? 's' : ''), c[f.n] <= f.min, c[f.n] >= f.max);\n        else if (f.t === 'list') h += lbl(f.label) + ost(k, f.n, f.vals[c[f.n]], f.unit, c[f.n] <= 0, c[f.n] >= f.vals.length - 1);\n        else if (f.t === 'items') h += lbl(f.label) + f.items.map(function(it, i){ return '<div class=\"orw\"><span>' + esc(it) + '<\/span>' + om(k, 'it:' + i, c.items[i], 0, 20) + '<\/div>'; }).join('');\n      });\n    } else if (o.t === 'menu'){\n      if (o.rows) h += lbl(o.variant_q || 'How many?') + o.variants.map(function(x){ return '<div class=\"orw\"><span>' + esc(x.label) + '<small>' + money(x.price) + ' each<\/small><\/span>' + om(k, 'row:' + x.key, c.rows[x.key] || 0, 0, o.max_qty || 20) + '<\/div>'; }).join('');\n      else {\n        if ((o.variants || []).length){ var cv = o.variants.filter(function(x){ return x.key === c.variant; })[0] || o.variants[0];\n          h += lbl(o.variant_q || 'Which one?') + '<div class=\"os\">' + o.variants.map(function(x){ return '<button type=\"button\" data-k=\"' + k + '\" data-var=\"' + esc(x.key) + '\"' + (x.key === cv.key ? ' class=\"on\"' : '') + '>' + esc(x.label) + '<\/button>'; }).join('') + '<\/div>'; }\n        if (o.unit !== 'flat'){ var lab = nOf(o) + pl(o, c.qty); h += lbl('How many?') + ost(k, 'qty', Number(c.qty).toLocaleString('en-US'), lab, c.qty <= o.min_qty, c.qty >= o.max_qty); }\n        (o.questions || []).forEach(function(qq){ h += lbl(qq.label) + '<div class=\"os\">' + qq.options.map(function(x){ var ad = (qq.add || {})[x]; return '<button type=\"button\" data-k=\"' + k + '\" data-q=\"' + esc(qq.key) + '\" data-v=\"' + esc(x) + '\"' + (c.ans[qq.key] === x ? ' class=\"on\"' : '') + '>' + esc(x) + (ad ? ' <small>+' + money(ad).replace('.00', '') + '<\/small>' : '') + '<\/button>'; }).join('') + '<\/div>'; });\n      }\n    }\n    if (empty(o)) h += '<p class=\"oh\">Add at least one to see your price.<\/p>';\n    if ((o.inc || []).length) h += '<button type=\"button\" class=\"oi\" data-k=\"' + k + '\" data-tog=\"inc\">What is included <span>' + (st.inc[k] ? '\u25b4' : '\u25be') + '<\/span><\/button>' + (st.inc[k] ? '<ul>' + o.inc.map(function(i){ return '<li>' + esc(i) + '<\/li>'; }).join('') + '<\/ul>' : '');\n    return h ? '<div class=\"hfc-opt\">' + h + '<\/div>' : '';\n  }\n  function cardHTML(o){\n    var s = on(o.key), op = s ? optsHTML(o) : '';\n    \/\/ HF-2026-10-10x (Chris): a picked card with options spans both columns and pushes the others down\n    return '<div class=\"hfc-cw' + (s ? ' on' : '') + (op ? ' wide' : '') + '\"><button type=\"button\" class=\"hfc-card' + (s ? ' on' : '') + '\" data-svc=\"' + o.key + '\" aria-pressed=\"' + (s ? 'true' : 'false') + '\"><span class=\"hfc-ic\">' + o.icon + '<\/span><span><h4>' + esc(o.name) + '<\/h4><p>' + esc(o.desc) + (o.desc ? ' \u00b7 ' : '') + hintOf(o) + '<\/p><\/span><span class=\"hfc-ck\">' + (s ? '\u2713' : '') + '<\/span><\/button>' + op + '<\/div>';\n  }\n  function hostVisit(){ for (var i = 0; i < st.sel.length; i++){ var o = I[st.sel[i]]; if (o.t === 'visit' && !o.hourly) return o; } return null; }\n  function renderLeft(){\n    $('hfcMain').innerHTML = D.main.map(function(k){ return cardHTML(I[k]); }).join('');\n    var rest = D.items.filter(function(o){ return D.main.indexOf(o.key) < 0; });\n    \/\/ HF-2026-10-10x (Chris): no numbered steps; \"Most popular\" on top, then every category\n    $('hfcAll').hidden = false;\n    $('hfcAll').innerHTML = D.sections.map(function(sec){\n      var it = rest.filter(function(o){ return o.section === sec; }); if (!it.length) return '';\n      return '<div class=\"hfc-cat\"><div class=\"hfc-stp\"><h3>' + esc(sec) + '<\/h3><\/div><div class=\"hfc-sv\">' + it.map(cardHTML).join('') + '<\/div><\/div>';\n    }).join('');\n    var mb = $('hfcMore'); if (mb) mb.hidden = true;\n    var s2 = $('hfcS2'); if (s2){ s2.hidden = !(D.extras || []).length;\n      if (!s2.hidden){ var hv = hostVisit();\n        $('hfcAo').innerHTML = D.extras.map(function(a){ return '<button type=\"button\" class=\"hfc-ao' + (st.ex[a.key] && hv ? ' on' : '') + '\" data-ex=\"' + a.key + '\"' + (hv ? '' : ' disabled') + '><span>' + esc(a.name) + '<\/span><b>' + money(a.price) + (a.unit !== 'flat' ? ' <small>' + unitTxt(a) + '<\/small>' : '') + '<\/b><\/button>'; }).join('');\n        var nt = $('hfcAoNote'); nt.hidden = !!hv; nt.textContent = 'These ride along with a home cleaning visit. Pick Whole Home, Deep Clean, Move In \/ Out or Airbnb above to add them.';\n        var am = $('hfcAoMore'); if (am) am.hidden = true; } }\n  }\n  \/\/ ---- engine calls: which services price together ----\n  function menuSel(o){ var c = cf(o), m = { key: o.key, qty: 1, variant: null, answers: {} };\n    if (o.rows){ m.qty = rowsSum(o); m.answers = { rows: o.variants.filter(function(x){ return c.rows[x.key] > 0; }).map(function(x){ return x.key + ':' + c.rows[x.key]; }).join(',') }; }\n    else { m.qty = o.unit === 'flat' ? 1 : c.qty; m.variant = (o.variants || []).length ? c.variant : null; for (var qk in (c.ans || {})) m.answers[qk] = c.ans[qk]; }\n    return m; }\n  function groups(){\n    var g = [], menus = [], hv = hostVisit();\n    st.sel.forEach(function(k){ var o = I[k]; if (o.t === 'menu' && !empty(o)) menus.push(o); });\n    if (hv) g.push({ k: 'visit', host: hv, aos: menus, ex: Object.keys(st.ex).filter(function(x){ return st.ex[x]; }) });\n    st.sel.forEach(function(k){ var o = I[k]; if (o.t === 'visit' && o.hourly) g.push({ k: 'visit', host: o, aos: [], ex: [] }); });\n    if (!hv && menus.length) g.push({ k: 'menu', host: menus[0], aos: menus.slice(1), ex: [] });\n    st.sel.forEach(function(k){ var o = I[k]; if (o.t === 'legacy' && !empty(o)) g.push({ k: 'legacy', host: o, aos: [], ex: [] }); });\n    return g;\n  }\n  function selection(gr){\n    var o = gr.host, c = cf(o), p = { service_type: D.st, zip: ZIP, zipcode: ZIP };\n    if (gr.k === 'visit'){\n      p.cleaningType = 'House Cleaning'; p.houseCleaningType = o.hct;\n      if (o.recurring){ p.recurring = c.often; if (c.often === 'Recurring') p.frequency = c.freq; } else p.recurring = 'One Time';\n      if (o.hourly){ p.cleaners = c.cleaners === 2 ? '2 Cleaners' : '1 Cleaner'; p.hours = c.hours + ' HR'; }\n      else { var sl = c.prop ? SQ_APT : SQ_HOUSE; p.propertyType = c.prop ? 'Apartment \/ Condo' : 'House \/ Townhouse'; p.sqft = sl[c.sq]; p.bedrooms = String(c.beds); p.fullBaths = String(c.full); p.halfBaths = String(c.half); }\n    } else if (gr.k === 'legacy'){\n      for (var k in o.sel) p[k] = o.sel[k];\n      (o.fields || []).forEach(function(f){\n        if (!shown(o, f)) return;\n        if (f.t === 'seg'){ var val = c[f.n]; p[f.p] = f.pv ? f.pv[val] : val; if (f.p2 && f.pv2 && f.pv2[val]) p[f.p2] = f.pv2[val]; }\n        else if (f.t === 'num') p[f.p] = String(c[f.n]);\n        else if (f.t === 'list') p[f.p] = f.vals[c[f.n]];\n        else if (f.t === 'items'){ var sel = {}, parts = []; f.items.forEach(function(it, i){ var n = c.items[i] || 0; if (n > 0){ sel[it] = n; parts.push(n + ' x ' + it); } }); p[f.pj] = JSON.stringify(sel); p[f.pt] = parts.join(', '); }\n      });\n    } else {\n      var m = menuSel(o); p.menu_json = JSON.stringify({ key: o.key, code: o.code, qty: m.qty, variant: m.variant, answers: m.answers, name: o.name, extras_only: false }); p.service_code = o.code;\n    }\n    var aos = gr.aos.map(menuSel).concat(gr.ex.map(function(x){ return { key: x, qty: 1 }; }));\n    if (aos.length) p.addons_json = JSON.stringify(aos);\n    return p;\n  }\n  function post(url, body, again){\n    var h = { 'Content-Type': 'application\/json', 'Accept': 'application\/json', 'X-Requested-With': 'XMLHttpRequest' };\n    var t = document.querySelector('meta[name=\"csrf-token\"]'); if (t) h['X-CSRF-TOKEN'] = t.getAttribute('content');\n    \/\/ a price answers in well under a second; one that hangs (about 1 in 60 through the load balancer) is cut at 6 s and\n    \/\/ tried again, twice at most, so the box never sits on \"\u2026\" (cart posts are never retried)\n    var quote = url === QUOTE, ac = (quote && window.AbortController) ? new AbortController() : null, tm = ac ? setTimeout(function(){ ac.abort(); }, 6000) : null;\n    return fetch(url, { method: 'POST', headers: h, credentials: 'same-origin', body: JSON.stringify(body), signal: ac ? ac.signal : undefined }).then(function(r){ clearTimeout(tm); if (!r.ok) throw new Error('HTTP ' + r.status); return r.json(); })\n      .catch(function(e){ clearTimeout(tm); if (quote && (again || 0) < 2) return post(url, body, (again || 0) + 1); throw e; });\n  }\n  var timer = null;\n  function reprice(){\n    q.busy = true; q.err = ''; renderBox(); clearTimeout(timer);\n    timer = setTimeout(function(){\n      var my = ++q.seq, gs = groups();\n      if (!gs.length){ q.busy = false; q.groups = []; q.res = []; renderBox(); return; }\n      Promise.all(gs.map(function(g){ return post(QUOTE, selection(g)); })).then(function(rs){ if (my !== q.seq) return; q.groups = gs; q.res = rs; q.busy = false; renderBox(); })\n        .catch(function(){ if (my !== q.seq) return; q.busy = false; q.groups = []; q.res = []; q.err = 'We could not load a price. Please try again.'; renderBox(); });\n    }, 220);\n  }\n  \/\/ ---- the navy box: only what was added ----\n  function subOf(o){\n    var c = cf(o), sl;\n    if (o.t === 'visit'){ if (o.hourly) return (c.cleaners === 2 ? '2 cleaners' : '1 cleaner') + ' \u00b7 ' + c.hours + ' hr' + (c.hours > 1 ? 's' : '') + (c.often === 'Recurring' ? ' \u00b7 ' + c.freq : '');\n      sl = c.prop ? SQ_APT : SQ_HOUSE; return (c.often === 'Recurring' ? c.freq : 'One time') + ' \u00b7 ' + sl[c.sq].replace(' sq ft', '') + ' sq ft \u00b7 ' + c.beds + ' bd \u00b7 ' + c.full + (c.half ? '.5' : '') + ' ba'; }\n    if (o.t === 'legacy'){ var out = [];\n      (o.fields || []).forEach(function(f){ if (!shown(o, f)) return;\n        if (f.t === 'items') f.items.forEach(function(it, i){ if (c.items[i] > 0) out.push(c.items[i] + ' \u00d7 ' + it); });\n        else if (f.t === 'num') out.push(Number(c[f.n]).toLocaleString('en-US') + ' ' + f.unit + (c[f.n] > 1 && f.unit && !\/ft$\/.test(f.unit) ? 's' : ''));\n        else if (f.t === 'list') out.push(f.vals[c[f.n]] + (f.unit ? ' ' + f.unit : ''));\n        else if (f.t === 'seg') out.push(c[f.n]); });\n      return out.join(' \u00b7 '); }\n    if (o.t === 'quote') return 'Homer builds your quote in chat';\n    if (o.rows) return o.variants.filter(function(x){ return c.rows[x.key] > 0; }).map(function(x){ return c.rows[x.key] + ' \u00d7 ' + x.label; }).join(', ');\n    var v = (o.variants || []).filter(function(x){ return x.key === c.variant; })[0], bits = [];\n    if (v) bits.push(v.label); if (o.unit !== 'flat') bits.push(Number(c.qty).toLocaleString('en-US') + ' ' + nOf(o) + pl(o, c.qty));\n    (o.questions || []).forEach(function(qq){ var a = (c.ans || {})[qq.key]; if (a && a !== qq.options[0]) bits.push(\/^(yes|no)$\/i.test(a) ? qq.label.replace(\/\\?$\/, '') + ': ' + a : a); });\n    return bits.join(' \u00b7 ');\n  }\n  function bst(k, fn, n, min, max){ return '<div class=\"hfc-bs\"><button type=\"button\" data-k=\"' + k + '\" data-fn=\"' + esc(fn) + '\" data-d=\"-1\"' + (n <= min ? ' disabled' : '') + ' aria-label=\"Less\">\u2212<\/button><b>' + Number(n).toLocaleString('en-US') + '<\/b><button type=\"button\" data-k=\"' + k + '\" data-fn=\"' + esc(fn) + '\" data-d=\"1\"' + (n >= max ? ' disabled' : '') + ' aria-label=\"More\">+<\/button><\/div>'; }\n  function xb(k){ return '<button type=\"button\" class=\"x\" data-rm=\"' + esc(k) + '\" aria-label=\"Remove\">\u00d7<\/button>'; }\n  function moreOf(o){ var t = o.full || ((o.inc || []).length ? '' : o.desc); if (!t && !(o.inc || []).length) return '';\n    return '<button type=\"button\" class=\"hfc-sm\" data-k=\"' + o.key + '\" data-tog=\"desc\">' + (st.desc[o.key] ? 'See less \u25b4' : 'See more \u25be') + '<\/button>' + (st.desc[o.key] ? '<div class=\"hfc-dsc\">' + (t ? '<p>' + esc(t) + '<\/p>' : '') + ((o.inc || []).length ? '<ul>' + o.inc.map(function(i){ return '<li>' + esc(i) + '<\/li>'; }).join('') + '<\/ul>' : '') + '<\/div>' : ''); }\n  \/\/ HF-2026-10-10x (Chris): every item is its own row with its amount (\u2212 n +) and price; \"See more\" opens the description\n  function groupHTML(o, price, pending){\n    var c = cf(o), P = function(v){ return v != null && !pending ? '<b>' + money(v) + '<\/b>' : '<b>&hellip;<\/b>'; }, h = '<div class=\"hfc-sg\">';\n    if (o.t === 'quote') return h + '<div class=\"hfc-ln\"><span>' + esc(o.name) + '<small>Homer builds your quote in chat<\/small><\/span><b class=\"q\">Custom quote<\/b>' + xb(o.key) + '<\/div>' + moreOf(o) + '<\/div>';\n    if (o.rows){\n      h += '<div class=\"hfc-sh\"><span>' + esc(o.name) + '<\/span>' + xb(o.key) + '<\/div>';\n      o.variants.forEach(function(x){ var n = c.rows[x.key] || 0; if (n <= 0) return;\n        h += '<div class=\"hfc-ln hfc-row\"><span>' + esc(x.label) + '<small>' + money(x.price) + ' each<\/small><\/span>' + bst(o.key, 'row:' + x.key, n, 0, o.max_qty || 20) + P(pending ? null : (function(v){ var nc = Math.round((v + 0.01) \/ 5) * 5 - 0.01; return (nc > 0 && Math.abs(nc - v) < 2.6) ? Math.round(nc * 100) \/ 100 : v; })(Math.round(x.price * n * 100) \/ 100)) + '<\/div>'; });\n      if (empty(o)) h += '<div class=\"hfc-ln hfc-row\"><span><small>Add at least one on the left<\/small><\/span><\/div>';\n    } else {\n      var stp = (o.t === 'menu' && o.unit !== 'flat') ? bst(o.key, 'qty', c.qty, o.min_qty, o.max_qty) : '';\n      h += '<div class=\"hfc-ln\"><span>' + esc(o.name) + '<small>' + esc(subOf(o)) + '<\/small><\/span>' + stp + P(price) + xb(o.key) + '<\/div>';\n    }\n    return h + moreOf(o) + '<\/div>';\n  }\n  function lineHTML(name, sub, price, k){ return '<div class=\"hfc-ln\"><span>' + esc(name) + (sub ? '<small>' + esc(sub) + '<\/small>' : '') + '<\/span>' + price + (k ? '<button type=\"button\" class=\"x\" data-rm=\"' + esc(k) + '\" aria-label=\"Remove\">\u00d7<\/button>' : '') + '<\/div>'; }\n  function renderBox(){\n    var h = '<div class=\"t\">Your services<\/div>', ok = true, total = 0, mins = 0, any = false, na = false, quotes = [];\n    var pending = q.busy || (q.groups.length !== groups().length);\n    if (!st.sel.length) h += '<p class=\"hfc-emp\">Pick one or more services on the left. Everything you add shows here with its price.<\/p>';\n    var lines = '';\n    var priced = {};\n    q.groups.forEach(function(g, i){ var r = q.res[i] || {};\n      if (!r.available){ na = true; ok = false; return; }\n      if (r.needs_quote || !(r.price > 0)){ ok = false; return; }\n      any = true; total += Number(r.price); mins += Number(r.duration) || 0;\n      var aol = r.addons || [], aoSum = 0; aol.forEach(function(l){ aoSum += Number(l.price) || 0; });\n      \/\/ HF-2026-10-11a: every line carries its own engine price and the total is their sum (no rounding on a line)\n      var base = Math.round((r.price - aoSum) * 100) \/ 100;\n      priced[g.host.key] = base;\n      aol.forEach(function(l){ priced[l.key] = Math.round(Number(l.price) * 100) \/ 100; });\n    });\n    st.sel.forEach(function(k){ var o = I[k]; if (o.t === 'quote') quotes.push(o); lines += groupHTML(o, priced[k], pending); });\n    Object.keys(st.ex).forEach(function(x){ if (st.ex[x] && hostVisit()) lines += lineHTML(X[x].name, 'With your home cleaning', priced[x] != null && !pending ? '<b>' + money(priced[x]) + '<\/b>' : '<b>&hellip;<\/b>', 'ex:' + x); });\n    if (lines) h += '<div class=\"hfc-lns\">' + lines + '<\/div>';\n    var onlyQ = st.sel.length && quotes.length === st.sel.length, canBook = !pending && any && ok && !q.err;\n    var ptxt = onlyQ ? 'Custom quote' : (!st.sel.length ? '$0.00' : (pending ? '&hellip;' : (na ? 'Not available yet' : (any ? money(total) : '&hellip;'))));\n    var btn = onlyQ ? 'Get My Quote' : 'Book It';\n    h += '<div class=\"hfc-foot\"><div><div class=\"hfc-price' + (na || onlyQ ? ' na' : '') + '\" id=\"hfcP\">' + ptxt + '<\/div><p>' + (canBook ? 'est. duration: ' + dur(mins) : (onlyQ ? 'Homer builds your quote in chat' : '')) + '<\/p><\/div><button type=\"button\" class=\"hfc-btn\" id=\"hfcBook\"' + (canBook || onlyQ ? '' : ' disabled') + '>' + btn + '<\/button><\/div>';\n    if (quotes.length && !onlyQ) h += '<div class=\"hfc-err\">' + esc(quotes.map(function(o){ return o.name; }).join(', ')) + ' ' + (quotes.length > 1 ? 'are' : 'is') + ' priced by custom quote. Book the rest, then ask Homer for the quote.<\/div>';\n    if (q.err) h += '<div class=\"hfc-err\">' + esc(q.err) + '<\/div>';\n    h += '<div class=\"hfc-ft\">Upfront price \u00b7 free cancellation up to 24 hours before service<\/div>';\n    $('hfcNb').innerHTML = h;\n    $('hfcBarP').innerHTML = ptxt;\n    $('hfcBarS').textContent = st.sel.length ? st.sel.length + ' service' + (st.sel.length > 1 ? 's' : '') : 'Pick a service';\n    $('hfcBarB').disabled = !(canBook || onlyQ); $('hfcBarB').textContent = btn;\n  }\n  function ask(text){\n    try { window.dataLayer = window.dataLayer || []; window.dataLayer.push({ event: 'hf_hero_select', hf_kind: 'query', hf_value: text }); } catch (e) {}\n    if (typeof window.hfOpenConcierge === 'function'){ window.hfOpenConcierge({ type: 'query', q: text, big: true }); return; }\n    window.location.href = APP + '\/customer\/ai-booking?embed=1&panel=1&full=1&q=' + encodeURIComponent(text);\n  }\n  function busyBtns(t){ [$('hfcBook'), $('hfcBarB')].forEach(function(b){ if (b){ b.disabled = true; b.textContent = t; } }); }\n  function book(){\n    var quotes = st.sel.filter(function(k){ return I[k].t === 'quote'; });\n    if (quotes.length && quotes.length === st.sel.length){ ask('I need a quote for ' + quotes.map(function(k){ return I[k].name; }).join(' and ')); return; }\n    var gs = q.groups, rs = q.res; if (!gs.length) return;\n    busyBtns('Adding to your cart\u2026');\n    try { window.dataLayer = window.dataLayer || []; window.dataLayer.push({ event: 'hf_card_book', hf_service: st.sel.map(function(k){ return I[k].name; }).join(', '), hf_zip: ZIP }); } catch (e) {}\n    var i = 0, last = null;\n    function fail(m){ q.err = m || 'We could not add this to your cart. Please try again.'; renderBox(); }\n    function next(){\n      if (i >= gs.length){ window.location.href = (last && last.redirect) || (APP + '\/customer\/services\/cart'); return; }\n      var g = gs[i], r = rs[i], p = selection(g);\n      p.price = r.price; p.duration = r.duration; p.provider_id = r.provider_id; p.last_category_id = r.last_category_id; p.sacf_id = r.sacf_id || null;\n      p.line_title = ((g.aos.length || g.ex.length) ? '' : r.summary) || g.host.name; \/\/ with extras on the line, each extra gets its own row, so the host line is just its own name p.append = i > 0 ? 1 : 0;\n      if (r.job_items && r.job_items.length) p.job_items = r.job_items;\n      if (r.addons && r.addons.length){ p.addons_json = JSON.stringify(r.addons); var tt = {}; r.addons.forEach(function(l){ if (l.code) tt[l.code] = l.name + ((Number(l.qty) || 1) > 1 ? ' \u00d7 ' + l.qty : ''); }); p.line_titles = JSON.stringify(tt); }\n      post(CART, p).then(function(d){\n        if (d && d.success){ last = d; i++; next(); return; }\n        if (d && d.code === 'quote_only'){ ask('I need a quote for ' + g.host.name); return; }\n        if (d && d.code === 'one_pro_per_booking'){ fail(g.host.name + ' is done by a different pro, so it books separately. Book the rest first, then add it.'); return; }\n        fail(d && d.message);\n      }).catch(function(){ fail(); });\n    }\n    next();\n  }\n  function toggle(k){\n    var o = I[k]; if (!o) return;\n    if (on(k)) st.sel.splice(st.sel.indexOf(k), 1);\n    else { if (o.t === 'visit') st.sel = st.sel.filter(function(x){ return I[x].t !== 'visit'; }); st.sel.push(k); cf(o); }\n    renderLeft(); reprice();\n  }\n  function onClick(e){\n    var t = e.target.closest ? e.target.closest('button') : null; if (!t || !$('hfc').contains(t)) return;\n    if (t.getAttribute('data-hq')){ ask(t.getAttribute('data-hq')); return; }\n    if (t.getAttribute('data-svc')){ toggle(t.getAttribute('data-svc')); return; }\n    var rm = t.getAttribute('data-rm');\n    if (rm){ if (rm.indexOf('ex:') === 0) st.ex[rm.slice(3)] = 0; else if (on(rm)) st.sel.splice(st.sel.indexOf(rm), 1); renderLeft(); reprice(); return; }\n    if (t.getAttribute('data-ex')){ var xk = t.getAttribute('data-ex'); st.ex[xk] = st.ex[xk] ? 0 : 1; renderLeft(); reprice(); return; }\n    if (t.id === 'hfcMore'){ st.all = !st.all; renderLeft(); if (!st.all) $('hfcS1').scrollIntoView({ behavior: 'smooth', block: 'start' }); return; }\n    if (t.id === 'hfcBook' || t.id === 'hfcBarB'){ book(); return; }\n    var o = I[t.getAttribute('data-k')]; if (!o) return; var c = cf(o);\n    if (t.getAttribute('data-tog') === 'inc'){ st.inc[o.key] = !st.inc[o.key]; renderLeft(); return; }\n    if (t.getAttribute('data-tog') === 'desc'){ st.desc[o.key] = !st.desc[o.key]; renderBox(); return; }\n    var fs = t.getAttribute('data-fs');\n    if (fs){ var val = t.getAttribute('data-v');\n      if (o.t === 'visit'){ if (fs === 'prop') c.prop = val === 'Apartment \/ Condo' ? 1 : 0; else if (fs === 'cleaners') c.cleaners = val === '2 Cleaners' ? 2 : 1; else c[fs] = val; }\n      else c[fs] = val;\n      renderLeft(); reprice(); return; }\n    if (t.getAttribute('data-var')){ c.variant = t.getAttribute('data-var'); renderLeft(); reprice(); return; }\n    if (t.getAttribute('data-q')){ c.ans[t.getAttribute('data-q')] = t.getAttribute('data-v'); renderLeft(); reprice(); return; }\n    var fn = t.getAttribute('data-fn'), d = parseInt(t.getAttribute('data-d'), 10); if (!fn) return;\n    if (o.t === 'visit'){\n      if (fn === 'beds' || fn === 'full') c[fn] = Math.max(1, Math.min(9, c[fn] + d)); else if (fn === 'half') c.half = Math.max(0, Math.min(9, c.half + d));\n      else if (fn === 'sq') c.sq = Math.max(0, c.sq + d); else if (fn === 'hours') c.hours = Math.max(1, Math.min(c.often === 'Recurring' ? 4 : 8, c.hours + d));\n    } else if (fn.indexOf('it:') === 0){ var ii = parseInt(fn.slice(3), 10); c.items[ii] = Math.max(0, Math.min(20, (c.items[ii] || 0) + d)); }\n    else if (fn.indexOf('row:') === 0){ var rk = fn.slice(4); c.rows[rk] = Math.max(0, Math.min(o.max_qty || 20, (c.rows[rk] || 0) + d));\n      if ($('hfcNb').contains(t) && rowsSum(o) <= 0 && on(o.key)) st.sel.splice(st.sel.indexOf(o.key), 1); } \/\/ the last row taken to 0 in the box takes the service off\n    else if (fn === 'qty'){ var sp = o.pstep || o.step || 1; c.qty = Math.max(o.min_qty, Math.min(o.max_qty, d > 0 ? Math.floor(c.qty \/ sp) * sp + sp : Math.ceil(c.qty \/ sp) * sp - sp)); }\n    else { var f = (o.fields || []).filter(function(x){ return x.n === fn; })[0]; if (!f) return;\n      if (f.t === 'num') c[fn] = Math.max(f.min, Math.min(f.max, c[fn] + d * f.step)); else if (f.t === 'list') c[fn] = Math.max(0, Math.min(f.vals.length - 1, c[fn] + d)); }\n    renderLeft(); reprice();\n  }\n  \/\/ HF-2026-10-10o (Chris): the booking box stays in view while the left side scrolls, never above the white section's\n  \/\/ top and never below the end of the selections (a WP wrapper's overflow breaks CSS sticky, so it is pinned by hand).\n  function pin(){\n    var col = $('hfcBox'), nb = $('hfcNb'); if (!col || !nb) return;\n    if (window.innerWidth <= 900){ nb.style.position = ''; nb.style.top = ''; nb.style.left = ''; nb.style.width = ''; return; }\n    var hh = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--hf-header-h'), 10) || 88, T = hh + 16;\n    var r = col.getBoundingClientRect(), h = nb.offsetHeight;\n    if (h + T + 16 > window.innerHeight) T = window.innerHeight - 16 - h;\n    if (r.top >= T || r.height <= h + 2){ nb.style.position = 'relative'; nb.style.top = '0px'; nb.style.left = ''; nb.style.width = ''; }\n    else if (r.bottom - h <= T){ nb.style.position = 'absolute'; nb.style.top = (r.height - h) + 'px'; nb.style.left = '0px'; nb.style.width = r.width + 'px'; }\n    else { nb.style.position = 'fixed'; nb.style.top = T + 'px'; nb.style.left = r.left + 'px'; nb.style.width = r.width + 'px'; }\n  }\n  var pinQ = false; function pinSoon(){ if (pinQ) return; pinQ = true; requestAnimationFrame(function(){ pinQ = false; pin(); }); }\n  \/\/ the pills stay one row: the last ones are hidden until the row fits the search bar's width\n  function fitPills(){ var p = document.querySelector('#hfc .hfc-pop'); if (!p) return; var bs = [].slice.call(p.children), w = p.clientWidth, gap = 8;\n    bs.forEach(function(b){ b.style.display = ''; });\n    for (var n = bs.length; n > 1; n--){ var t = 0; for (var i = 0; i < n; i++) t += bs[i].offsetWidth + (i ? gap : 0); if (t <= w) break; bs[n - 1].style.display = 'none'; } }\n  function boot(){\n    if (!$('hfc')) return;\n    fitPills(); window.addEventListener('resize', fitPills); if (document.fonts && document.fonts.ready) document.fonts.ready.then(fitPills);\n    window.addEventListener('scroll', pinSoon, { passive: true }); window.addEventListener('resize', pinSoon);\n    if (window.MutationObserver) new MutationObserver(pinSoon).observe($('hfcLay'), { childList: true, subtree: true });\n    document.addEventListener('click', onClick);\n    $('hfcSearch').addEventListener('submit', function(e){ e.preventDefault(); ask(($('hfcQ').value || '').replace(\/^\\s+|\\s+$\/g, '') || 'I need help with my home'); });\n    \/\/ HF-2026-10-10z (Chris): no service is pre-selected on any page; the customer picks\n    renderLeft(); reprice();\n  }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot); else boot();\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3797073 e-con-full e-flex e-con e-parent\" data-id=\"3797073\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d8ac1d1 elementor-widget elementor-widget-html\" data-id=\"d8ac1d1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style id=\"hf-city-local-css\">.hf-city-local{background:#fff;padding:64px 24px 24px}.hf-city-local .in{max-width:880px;margin:0 auto}.hf-city-local h2{font-family:Inter,-apple-system,sans-serif;font-size:34px;line-height:1.2;font-weight:800;color:#0b172a;margin:0 0 16px;letter-spacing:-.4px}.hf-city-local p{font-family:Inter,-apple-system,sans-serif;font-size:18px;line-height:1.65;color:#475569;margin:0 0 14px}@media(max-width:767px){.hf-city-local{padding:44px 18px 12px}.hf-city-local h2{font-size:26px}.hf-city-local p{font-size:16px}}<\/style><section class=\"hf-city-local\" data-city=\"dallas\"><div class=\"in\"><h2>Fence Installation and Repair in Dallas<\/h2><p>Cedar privacy fences line most Dallas backyards, and clay soil and spring storms push posts out of line over time. Fencing covers new wood, vinyl and iron fences, gates, repairs and tear outs, priced by the foot or by the section.<\/p><p>If you live in an HOA, check its fence height and style rules before you book. Then price the fence you want, add gates, caps or haul away of the old one, and pick a start date.<\/p><\/div><\/section><script type=\"application\/ld+json\">{\"@context\": \"https:\/\/schema.org\", \"@type\": \"Service\", \"name\": \"Fence Installation in Dallas\", \"serviceType\": \"Fencing\", \"url\": \"https:\/\/housefly.com\/services\/dallas\/fencing\/\", \"provider\": {\"@type\": \"Organization\", \"name\": \"House Fly\", \"url\": \"https:\/\/housefly.com\/\"}, \"areaServed\": {\"@type\": \"City\", \"name\": \"Dallas\", \"containedInPlace\": {\"@type\": \"State\", \"name\": \"Texas\"}}, \"description\": \"Cedar privacy fences line most Dallas backyards, and clay soil and spring storms push posts out of line over time. Fencing covers new wood, vinyl and iron fences, gates, repairs and tear outs, priced by the foot or by the section.\"}<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-7509952 e-con-full e-flex e-con e-parent\" data-id=\"7509952\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-aadaed2 elementor-widget elementor-widget-html\" data-id=\"aadaed2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- hf: cleaning cards grid retired 2026-07-16 - replaced by hero booking cell in container 464c961. Restore from wp option hf_cleaning_3435_backup_20260716b -->\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-eade1a6 e-con-full e-flex e-con e-parent\" data-id=\"eade1a6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2ebfeba elementor-widget elementor-widget-html\" data-id=\"2ebfeba\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- hf: Pressure Washing + Trash Haul Away info sections retired 2026-07-16; services live in the hero tabs. Restore from wp option hf_cleaning_3435_backup_20260716_preTrim -->\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2adfbb7 e-con-full e-flex e-con e-parent\" data-id=\"2adfbb7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e818acb elementor-widget elementor-widget-html\" data-id=\"e818acb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>#hf-optimized-faqs{display:none!important}<\/style>\n<!-- cleaning-HIW-from-parent-671577f-2026-05-29 -->\n<style>\n.hf-svc-hiw{max-width:1200px;margin:0 auto;padding:42px 24px;font-family:'Inter',-apple-system,sans-serif;text-align:center}\n.hf-svc-hiw *{box-sizing:border-box}\n.hf-svc-hiw-label{font-size:26px;font-weight:700;letter-spacing:3px;text-transform:uppercase;color:#40C9F3;margin-bottom:12px}\n.hf-svc-hiw h2{font-size:clamp(28px,4vw,42px);font-weight:800;color:#2D3E50;margin:0 0 12px}\n.hf-svc-hiw-sub{font-size:17px;color:#6b7d93;max-width:560px;margin:0 auto 48px;line-height:1.6}\n.hf-svc-steps{display:grid;grid-template-columns:repeat(3,1fr);gap:32px;position:relative}\n.hf-svc-steps::before{content:'';position:absolute;top:36px;left:12%;right:12%;height:2px;background:linear-gradient(90deg,#2ED87A,#40C9F3);z-index:0}\n.hf-svc-step{position:relative;z-index:1}\n.hf-svc-step-num{width:72px;height:72px;border-radius:50%;background:#fff;border:2px solid #eef2f6;display:flex;align-items:center;justify-content:center;margin:0 auto 16px;font-size:13px;font-weight:700;color:#fff;position:relative}\n.hf-svc-step-num-inner{width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center}\n.hf-sn-1 .hf-svc-step-num-inner{background:#2ED87A}\n.hf-sn-2 .hf-svc-step-num-inner{background:#40C9F3}\n.hf-sn-3 .hf-svc-step-num-inner{background:#3D4F6F}\n.hf-sn-4 .hf-svc-step-num-inner{background:#2ED87A}\n.hf-svc-step-num svg{width:26px;height:26px;fill:#fff}\n.hf-svc-step h3{font-size:16px;font-weight:700;color:#2D3E50;margin:0 0 8px}\n.hf-svc-step p{font-size:13px;color:#6b7d93;line-height:1.5;margin:0}\n\n\n.hf-svc-trust2 img:hover{opacity:1}\n@media(max-width:768px){\n  \/* hf-svc-hiw-mobile-stack-2026-05-28: mirror home hf-hiw2 mobile stack layout *\/\n  \/* hf-svc-hiw-mobile-top-gap-2026-05-29: breathing room above HIW section under svc-grid *\/\n  .hf-svc-hiw{padding:64px 18px 28px}\n  .hf-svc-hiw-label{font-size:25px;letter-spacing:2px;margin-bottom:12px}\n  .hf-svc-hiw h2{font-size:26px;line-height:1.2;margin-bottom:10px}\n  .hf-svc-hiw-sub{font-size:14px;max-width:340px;margin:0 auto 32px}\n  .hf-svc-steps{grid-template-columns:1fr;gap:0;padding:0 0 0 6px;position:relative;margin-bottom:0}\n  .hf-svc-steps::before{display:block;top:27px;bottom:27px;left:31px;right:auto;width:2px;height:auto;background:linear-gradient(180deg,#2ED87A,#40C9F3,#3D4F6F);border-radius:2px}\n  .hf-svc-step{display:grid;grid-template-columns:64px 1fr;grid-template-rows:auto auto;column-gap:18px;row-gap:6px;align-items:start;text-align:left;padding-bottom:28px}\n  .hf-svc-step:last-child{padding-bottom:0}\n  .hf-svc-step-num{grid-column:1;grid-row:1 \/ span 2;width:54px;height:54px;margin:0;justify-self:start;margin-left:4px;box-shadow:0 4px 12px rgba(41,171,226,.18)}\n  .hf-svc-step-num-inner{width:42px;height:42px}\n  .hf-svc-step-num svg{width:20px;height:20px}\n  .hf-svc-step h3{grid-column:2;grid-row:1;font-size:16.5px;font-weight:700;color:#40C9F3;margin:0;padding-top:4px;line-height:1.25}\n  .hf-svc-step p{grid-column:2;grid-row:2;font-size:13.5px;color:#000;line-height:1.55;margin:0;padding-top:2px}\n}\n<\/style><div class=\"hf-svc-hiw\">\n  <div class=\"hf-svc-hiw-label\">HOW IT WORKS<\/div>\n  <h2>From Selection to Done in Just a Few Taps<\/h2>\n  <p class=\"hf-svc-hiw-sub\">No phone tag. No guessing games. One upfront price, hand-matched pros, and total peace of mind.<\/p>\n  <div class=\"hf-svc-steps\">\n    <div class=\"hf-svc-step hf-sn-1\">\n      <div class=\"hf-svc-step-num\"><div class=\"hf-svc-step-num-inner\"><svg viewBox=\"0 0 24 24\"><path d=\"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0016 9.5 6.5 6.5 0 109.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"><\/path><\/svg><\/div><\/div>\n      <h3>Select Your Service<\/h3>\n      <p>Pick your service, set the details, and see your real upfront price instantly.<\/p>\n    <\/div>\n    <div class=\"hf-svc-step hf-sn-2\">\n      <div class=\"hf-svc-step-num\"><div class=\"hf-svc-step-num-inner\"><svg viewBox=\"0 0 24 24\"><path d=\"M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z\"><\/path><\/svg><\/div><\/div>\n      <h3>Schedule The Job<\/h3>\n      <p>Select the day and time best for you and checkout with any of our secure payment options.<\/p>\n    <\/div>\n    <div class=\"hf-svc-step hf-sn-3\">\n      <div class=\"hf-svc-step-num\"><div class=\"hf-svc-step-num-inner\"><svg viewBox=\"0 0 24 24\"><path d=\"M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm-2 16l-4-4 1.41-1.41L10 14.17l6.59-6.59L18 9l-8 8z\"><\/path><\/svg><\/div><\/div>\n      <h3>Sit Back And Relax<\/h3>\n      <p>House Fly takes care of all pro-matching, scheduling, communication, and payments.<\/p>\n    <\/div>\n    \n  <\/div>\n  <\/div>\n\n<!-- cleaning-Common-Questions-from-parent-68f9d25-2026-05-29 -->\n<div class=\"hf-cq\">\n  <div class=\"hf-cq-head\">\n    <div class=\"hf-cq-eyebrow\">Common Questions<\/div>\n    <h2 class=\"hf-cq-title\">Ask Homer Anything<\/h2>\n    <p class=\"hf-cq-sub\">Select a question to start a chat with Homer.<\/p>\n  <\/div>\n  <div class=\"hf-cq-chips\">\n    <button type=\"button\" class=\"hf-cq-chip\" onclick=\"hfCqAsk(this, &quot;What is your cancellation policy?&quot;)\">\n      <span class=\"hf-cq-q\">What&rsquo;s the cancellation policy?<\/span>\n      <span class=\"hf-cq-arrow\">&#8599;<\/span>\n    <\/button>\n    <button type=\"button\" class=\"hf-cq-chip\" onclick=\"hfCqAsk(this, &quot;Can I book a same-day service?&quot;)\">\n      <span class=\"hf-cq-q\">Same-day booking?<\/span>\n      <span class=\"hf-cq-arrow\">&#8599;<\/span>\n    <\/button>\n    <button type=\"button\" class=\"hf-cq-chip\" onclick=\"hfCqAsk(this, &quot;What payment methods do you accept?&quot;)\">\n      <span class=\"hf-cq-q\">Payment methods?<\/span>\n      <span class=\"hf-cq-arrow\">&#8599;<\/span>\n    <\/button>\n  <\/div>\n<\/div>\n\n<style>\n\/* Match Simple-by-Design header proportions (.hf-hiw2-eyebrow\/.hf-hiw2-title\/.hf-hiw2-sub) *\/\n\/* hf-cq-bottom-gap-2026-05-29: separation from \"We're here to help\" section *\/\n.hf-cq { font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; max-width: 1140px; margin: 0 auto; padding: 60px 24px 56px; color: #000; box-sizing: border-box; }\n.hf-cq * { box-sizing: border-box; }\n.hf-cq-head { text-align: center; margin-bottom: 48px; }\n.hf-cq-eyebrow { font-size: 27.5px; font-weight: 800; letter-spacing: 2.5px; text-transform: uppercase; color: #29ABE2; margin: 0 0 14px; line-height: 1.1; font-family: inherit; }\n.hf-cq-title { font-size: 38px; font-weight: 800; color: #000; line-height: 1.18; margin: 0 0 14px; letter-spacing: -0.5px; font-family: inherit; }\n.hf-cq-sub { font-size: 16px; color: #000; max-width: 520px; margin: 0 auto; line-height: 1.6; font-family: inherit; }\n\n\/* Chips \u2014 no card wrapper, sit directly on the page background *\/\n.hf-cq-chips { display: flex; flex-wrap: wrap; gap: 12px; justify-content: center; max-width: 680px; margin: 0 auto; padding: 0 16px; }\n.hf-cq-chip { background: #F1F5F9; border: 1px solid #E2E8F0; border-radius: 99px; padding: 12px 20px; font-size: 14px; color: #1E293B; font-weight: 600; cursor: pointer; transition: all .15s; font-family: inherit; display: inline-flex; align-items: center; gap: 8px; }\n.hf-cq-chip:hover { background: #E0F2FE; border-color: #7DD3FC; color: #0C4A6E; transform: translateY(-1px); box-shadow: 0 4px 12px rgba(64,201,243,0.18); }\n.hf-cq-chip:active { transform: translateY(0); }\n.hf-cq-chip.hf-cq-loading { opacity: 0.65; cursor: wait; }\n.hf-cq-arrow { color: #94A3B8; font-size: 12px; }\n.hf-cq-chip:hover .hf-cq-arrow { color: #29ABE2; }\n\n\/* \"View All FAQs \u2192\" Elementor button widget #0ce9e01 \u2014 turn link blue *\/\n.elementor-element-0ce9e01 .elementor-button,\n.elementor-element-0ce9e01 .elementor-button-text,\n.elementor-element-0ce9e01 .elementor-button .elementor-button-text { color: #29ABE2 !important; }\n.elementor-element-0ce9e01 .elementor-button:hover .elementor-button-text { color: #0891B2 !important; }\n\n\/* Hide snippet 3650's invisible-but-present accordion on homepage (was set earlier) *\/\nbody.home #hf-optimized-faqs, body.page-id-2229 #hf-optimized-faqs, body.page-id-538 #hf-optimized-faqs { display: none !important; }\n\n\/* Mobile \u2014 match SBD breakpoints *\/\n@media (max-width: 900px) {\n  .hf-cq { padding: 50px 20px 44px; }\n  .hf-cq-head { margin-bottom: 36px; }\n  .hf-cq-eyebrow { font-size: 25px; letter-spacing: 2px; margin-bottom: 12px; }\n  .hf-cq-sub { font-size: 14px; max-width: 340px; }\n}\n@media (max-width: 700px) {\n  .hf-cq { padding: 40px 18px 36px; }\n  .hf-cq-eyebrow { font-size: 22px; letter-spacing: 1.8px; }\n  .hf-cq-title { font-size: 28px; }\n  .hf-cq-chips { gap: 10px; }\n  .hf-cq-chip { padding: 10px 16px; font-size: 13px; }\n}\n<\/style>\n\n<script type=\"application\/ld+json\">{\"@context\":\"https:\/\/schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"How does House Fly work for booking home services?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"House Fly is a concierge home services platform available nationwide, anywhere in the United States. Chat with Homer, pick your date and time, and pay upfront. A local home services pro arrives and completes the work. Transparent pricing, instant booking, and a real rep manages the job from start to finish.\"}},{\"@type\":\"Question\",\"name\":\"Are there any hidden fees with House Fly?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"No. The service fee is built into the upfront price shown when you book, so there are no surprise charges at checkout or after service. The price you see is the price you pay. Payments are processed securely through Stripe with no extra processing fees added at checkout.\"}},{\"@type\":\"Question\",\"name\":\"What is House Fly's cancellation policy?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"You can cancel any House Fly booking for free up to 24 hours before the scheduled appointment and receive a full refund. Cancellations inside the 24-hour window may incur a small fee depending on the service. Reschedule any time by chatting with Homer or contacting House Fly support.\"}},{\"@type\":\"Question\",\"name\":\"Can I book same-day home services with House Fly?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. Most House Fly home services have same-day or next-day availability, and we are available nationwide, anywhere in the United States. Available time slots appear in real time when you book through Homer. Emergency services like plumbing leaks are often dispatched within a couple of hours of booking.\"}},{\"@type\":\"Question\",\"name\":\"What payment methods does House Fly accept?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"House Fly accepts all major credit cards, Apple Pay, and PayPal. All payments are processed securely through Stripe's PCI-compliant infrastructure. Your card is charged only when you confirm the booking. You can save a payment method to your account for one-tap rebooking on future services.\"}},{\"@type\":\"Question\",\"name\":\"How does House Fly choose its home services pros?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"House Fly hand-selects local home services pros through a diligence process that includes reviewing each pro's Google Business Profile, customer reviews, and operating history. We work only with pros that demonstrate a strong track record of quality work in their local area.\"}}]}<\/script>\n\n<script>\n(function(){\n  function getInput(){\n    var f = document.getElementById('hfCcFrame');\n    try { return f && f.contentDocument && f.contentDocument.querySelector('#hfAiSearchInput'); }\n    catch(e){ return null; }\n  }\n  function inject(q, btn, tries){\n    var input = getInput();\n    if (input) {\n      try {\n        input.value = q;\n        input.dispatchEvent(new Event('input', {bubbles:true}));\n        var form = input.form || document.getElementById('hfCcFrame').contentDocument.getElementById('hfAiSearchForm');\n        if (form) {\n          if (typeof form.requestSubmit === 'function') form.requestSubmit();\n          else form.dispatchEvent(new Event('submit', {bubbles:true, cancelable:true}));\n        }\n      } catch(e){}\n      if (btn) btn.classList.remove('hf-cq-loading');\n      return;\n    }\n    if (tries > 0) setTimeout(function(){ inject(q, btn, tries - 1); }, 300);\n    else if (btn) btn.classList.remove('hf-cq-loading');\n  }\n  window.hfCqAsk = function(btn, q){\n    if (btn && btn.classList) btn.classList.add('hf-cq-loading');\n    var launcher = document.getElementById('hfCcLauncher');\n    if (launcher) launcher.click();\n    setTimeout(function(){ inject(q, btn, 20); }, 400);\n  };\n})();\n<\/script>\n<!-- cleaning-Help-from-parent-7f6a459-2026-05-29 -->\n<style>\n.hf-contact{font-family:'Inter',-apple-system,BlinkMacSystemFont,sans-serif;width:100%;background:linear-gradient(180deg,#f8fbfd 0%,#f1f6fb 100%);padding:48px 20px;text-align:center}\n.hf-contact *{box-sizing:border-box;margin:0;padding:0}\n.hf-contact-inner{max-width:520px;margin:0 auto}\n.hf-contact-heading{font-size:30px;font-weight:800;color:#000;margin:0 0 10px;line-height:1.2;letter-spacing:-.3px}\n.hf-contact-sub{font-size:15px;color:#000;margin:0 auto 26px;max-width:340px;line-height:1.5}\n\n.hf-chat-cta{display:inline-flex;align-items:center;justify-content:center;gap:10px;background:#29ABE2;color:#fff;font-weight:700;font-size:16px;padding:16px 36px;border-radius:12px;border:0;cursor:pointer;text-decoration:none;box-shadow:0 10px 28px rgba(41,171,226,.32);font-family:inherit;line-height:1;transition:transform .2s,box-shadow .2s;position:relative;margin-bottom:24px}\n.hf-chat-cta{-webkit-tap-highlight-color:rgba(46,216,122,.3)}.hf-chat-cta:hover{transform:translateY(-2px);box-shadow:0 14px 32px rgba(46,216,122,.4);background:#2ED87A;color:#fff}.hf-chat-cta:active,.hf-chat-cta:focus,.hf-chat-cta:focus-visible{background:#29ABE2!important;color:#fff!important;outline:2px solid #29ABE2!important;outline-offset:2px;-webkit-tap-highlight-color:transparent}\/* hf-cta-no-red-2026-05-24 *\/\n.hf-chat-cta svg{width:20px;height:20px;fill:#fff}\n.hf-chat-cta-dot{position:absolute;top:13px;right:18px;width:8px;height:8px;border-radius:50%;background:#2ED87A;box-shadow:0 0 0 4px rgba(46,216,122,.25);animation:hfPulse 2s infinite}\n@keyframes hfPulse{0%,100%{box-shadow:0 0 0 4px rgba(46,216,122,.25)}50%{box-shadow:0 0 0 8px rgba(46,216,122,.10)}}\n\n.hf-contact-divider{display:flex;align-items:center;gap:12px;color:#8a9ab0;font-size:11px;letter-spacing:1.8px;text-transform:uppercase;font-weight:700;margin-bottom:18px}\n.hf-contact-divider::before,.hf-contact-divider::after{content:\"\";flex:1;height:1px;background:#d8e0ea}\n\n.hf-contact-links{display:flex;flex-direction:column;gap:10px}\n.hf-contact-link{display:flex;align-items:center;gap:14px;padding:16px 22px;border-radius:14px;color:#fff;text-decoration:none;transition:transform .2s,box-shadow .2s;font-size:15px;font-weight:600;line-height:1.2}\n.hf-contact-link:hover{transform:translateY(-2px);box-shadow:0 10px 24px rgba(0,0,0,.18);color:#fff;text-decoration:none}\n.hf-contact-link .ic{width:36px;height:36px;border-radius:10px;background:rgba(255,255,255,.22);display:flex;align-items:center;justify-content:center;flex-shrink:0}\n.hf-contact-link .ic svg{width:20px;height:20px;fill:#fff}\n.hf-contact-link .lbl{font-weight:700;font-size:15px;color:#fff}\n.hf-contact-link .inf{margin-left:auto;font-weight:700;font-size:15px;color:#fff;letter-spacing:.2px}\n\n.hf-cc-call{background:linear-gradient(135deg,#2ED87A 0%,#24b866 100%)}\n.hf-cc-text{background:linear-gradient(135deg,#40C9F3 0%,#2ba8d4 100%)}\n.hf-cc-email{background:linear-gradient(135deg,#3D4F6F 0%,#2f3e58 100%)}\n\n@media (max-width:600px){\n  .hf-contact{padding:40px 16px}\n  .hf-contact-heading{font-size:26px}\n  .hf-contact-sub{font-size:14px;margin-bottom:22px}\n  .hf-chat-cta{padding:15px 30px;font-size:15px;margin-bottom:20px}\n  .hf-contact-link{padding:14px 18px}\n  .hf-contact-link .lbl{font-size:14px}\n  .hf-contact-link .inf{font-size:14px}\n}\n@media (max-width:380px){\n  .hf-contact-heading{font-size:22px}\n  .hf-contact-link{padding:13px 14px;gap:10px}\n  .hf-contact-link .ic{width:32px;height:32px}\n  .hf-contact-link .ic svg{width:18px;height:18px}\n  .hf-contact-link .lbl{font-size:13px}\n  .hf-contact-link .inf{font-size:13px;letter-spacing:0}\n}\n\n@media (min-width: 768px) {\n  \/* hf-help-desktop-grid-2026-05-28: 3 square cards side-by-side on wide viewports *\/\n  .hf-contact-inner { max-width: 1000px; }\n  .hf-contact-links { flex-direction: row; gap: 20px; align-items: stretch; }\n  .hf-contact-link {\n    flex: 1 1 0;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    text-align: center;\n    padding: 36px 24px;\n    gap: 16px;\n    min-height: 230px;\n    border-radius: 20px;\n  }\n  .hf-contact-link .ic {\n    width: 64px;\n    height: 64px;\n    border-radius: 50%;\n  }\n  .hf-contact-link .ic svg { width: 28px; height: 28px; }\n  .hf-contact-link .lbl { font-size: 22px; font-weight: 800; }\n  .hf-contact-link .lbl::after { content: ' Us'; }\n  .hf-contact-link .inf { margin-left: 0; font-size: 15px; font-weight: 500; opacity: .95; letter-spacing: .2px; }\n}\n<\/style>\n<div class=\"hf-contact\">\n  <div class=\"hf-contact-inner\">\n    <h2 class=\"hf-contact-heading\">We're Here to Help<\/h2>\n    <p class=\"hf-contact-sub\">Reach out however works best for you.<\/p>\n\n    <button type=\"button\" class=\"hf-chat-cta\" onclick=\"var l=document.getElementById('hfCcLauncher');if(l){l.click();}\">\n      <svg viewBox=\"0 0 24 24\"><path d=\"M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z\"\/><\/svg>\n      Chat with Homer\n      <span class=\"hf-chat-cta-dot\"><\/span>\n    <\/button>\n\n    <div class=\"hf-contact-divider\">Or Reach Us<\/div>\n\n    <div class=\"hf-contact-links\">\n      <a class=\"hf-contact-link hf-cc-call\" href=\"tel:5044207359\" data-wpel-link=\"internal\" rel=\"follow\">\n        <div class=\"ic\"><svg viewBox=\"0 0 24 24\"><path d=\"M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z\"\/><\/svg><\/div>\n        <span class=\"lbl\">Call<\/span>\n        <span class=\"inf\">504-420-7359<\/span>\n      <\/a>\n      <a class=\"hf-contact-link hf-cc-text\" href=\"sms:5044207359\" data-wpel-link=\"internal\" rel=\"follow\">\n        <div class=\"ic\"><svg viewBox=\"0 0 24 24\"><path d=\"M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z\"\/><\/svg><\/div>\n        <span class=\"lbl\">Text<\/span>\n        <span class=\"inf\">504-420-7359<\/span>\n      <\/a>\n      <a class=\"hf-contact-link hf-cc-email\" href=\"mailto:help@housefly.com\">\n        <div class=\"ic\"><svg viewBox=\"0 0 24 24\"><path d=\"M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z\"\/><\/svg><\/div>\n        <span class=\"lbl\">Email<\/span>\n        <span class=\"inf\">help@housefly.com<\/span>\n      <\/a>\n    <\/div>\n  <\/div>\n<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>DALLAS FENCING Trusted Fencing Servicesin Dallas Verified pros, upfront pricing, and instant booking with no surprises 5.0 on Google A+ Better Business Bureau Free cancellation What We Offer Fencing Services in Dallas Professional fence installation and repair across the Dallas-Fort Worth metroplex. Get upfront pricing from verified local fencing pros and book instantly. House Fly\u2019s [&hellip;]<\/p>\n","protected":false},"author":15,"featured_media":2920,"parent":3422,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-3425","page","type-page","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.7 (Yoast SEO v28.7) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Fence Installation in Dallas | Upfront Prices | House Fly<\/title>\n<meta name=\"description\" content=\"Book fencing in Dallas, TX with House Fly. Cedar privacy fences, gates, leaning posts and storm repairs. See your upfront price and book online in minutes.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/housefly.com\/es\/services\/dallas\/fencing\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Fencing\" \/>\n<meta property=\"og:description\" content=\"Book fencing in Dallas, TX with House Fly. Cedar privacy fences, gates, leaning posts and storm repairs. See your upfront price and book online in minutes.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/housefly.com\/es\/services\/dallas\/fencing\/\" \/>\n<meta property=\"og:site_name\" content=\"House Fly\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/houseflyapp\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-11T05:30:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/housefly.com\/wp-content\/uploads\/2025\/01\/housefly-social-share.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"703\" \/>\n\t<meta property=\"og:image:height\" content=\"703\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@houseflyapp\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Fence Installation in Dallas | Upfront Prices | House Fly","description":"Book fencing in Dallas, TX with House Fly. Cedar privacy fences, gates, leaning posts and storm repairs. See your upfront price and book online in minutes.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/housefly.com\/es\/services\/dallas\/fencing\/","og_locale":"es_MX","og_type":"article","og_title":"Fencing","og_description":"Book fencing in Dallas, TX with House Fly. Cedar privacy fences, gates, leaning posts and storm repairs. See your upfront price and book online in minutes.","og_url":"https:\/\/housefly.com\/es\/services\/dallas\/fencing\/","og_site_name":"House Fly","article_publisher":"https:\/\/www.facebook.com\/houseflyapp","article_modified_time":"2026-10-11T05:30:43+00:00","og_image":[{"url":"https:\/\/housefly.com\/wp-content\/uploads\/2025\/01\/housefly-social-share.jpg","width":703,"height":703,"type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@houseflyapp","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/housefly.com\/services\/dallas\/fencing\/","url":"https:\/\/housefly.com\/services\/dallas\/fencing\/","name":"Fence Installation in Dallas | Upfront Prices | House Fly","isPartOf":{"@id":"https:\/\/housefly.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/housefly.com\/services\/dallas\/fencing\/#primaryimage"},"image":{"@id":"https:\/\/housefly.com\/services\/dallas\/fencing\/#primaryimage"},"thumbnailUrl":"https:\/\/housefly.com\/wp-content\/uploads\/2025\/09\/find-someone-to-install-a-vinyl-fence-near-me.png","datePublished":"2026-03-06T00:27:33+00:00","dateModified":"2026-10-11T05:30:43+00:00","description":"Book fencing in Dallas, TX with House Fly. Cedar privacy fences, gates, leaning posts and storm repairs. See your upfront price and book online in minutes.","breadcrumb":{"@id":"https:\/\/housefly.com\/services\/dallas\/fencing\/#breadcrumb"},"inLanguage":"es-MX","potentialAction":[{"@type":"ReadAction","target":["https:\/\/housefly.com\/services\/dallas\/fencing\/"]}]},{"@type":"ImageObject","inLanguage":"es-MX","@id":"https:\/\/housefly.com\/services\/dallas\/fencing\/#primaryimage","url":"https:\/\/housefly.com\/wp-content\/uploads\/2025\/09\/find-someone-to-install-a-vinyl-fence-near-me.png","contentUrl":"https:\/\/housefly.com\/wp-content\/uploads\/2025\/09\/find-someone-to-install-a-vinyl-fence-near-me.png","width":703,"height":703,"caption":"find someone to install a vinyl fence near me"},{"@type":"BreadcrumbList","@id":"https:\/\/housefly.com\/services\/dallas\/fencing\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/housefly.com\/"},{"@type":"ListItem","position":2,"name":"Services","item":"https:\/\/housefly.com\/services\/"},{"@type":"ListItem","position":3,"name":"Dallas Home Services","item":"https:\/\/housefly.com\/services\/dallas\/"},{"@type":"ListItem","position":4,"name":"Fencing"}]},{"@type":"WebSite","@id":"https:\/\/housefly.com\/#website","url":"https:\/\/housefly.com\/","name":"House Fly","description":"App M\u00f3vil de Servicios para el Hogar Bajo Demanda","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/housefly.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es-MX"}]}},"_links":{"self":[{"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages\/3425","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/users\/15"}],"replies":[{"embeddable":true,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/comments?post=3425"}],"version-history":[{"count":1,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages\/3425\/revisions"}],"predecessor-version":[{"id":5609,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages\/3425\/revisions\/5609"}],"up":[{"embeddable":true,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/pages\/3422"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/media\/2920"}],"wp:attachment":[{"href":"https:\/\/housefly.com\/es\/wp-json\/wp\/v2\/media?parent=3425"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}