1<!DOCTYPE html> 2<html lang="en" dir="ltr"> 3 4<head> 5 <!-- Meta Tags --> 6 <meta charset="UTF-8"> 7 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 8 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 9 10 <title>About - Zin Zen Wine Bistro - 6841 Virginia Parkway, McKinney TX, USA - YourFoodOnline</title> 11<meta name="description" content=" 12 2006 13 Our Story 14 Est. 2006 ⢠Adriatica Village ⢠McKinney, TX 15 A Quaint Area 16 Nestled on 45 Acres 17 Zin Zen Wine Bist..."> 18<meta name="keywords" content="Zin Zen Wine Bistro, zinzenwine.town.club, YourFoodOnline, Zin Zen Wine Bistro, zinzenwine.town.club, YourFoodOnline"> 19<meta name="author" content="YourFoodOnline"> 20<link rel="canonical" href="https://www.zinzenwine.com/custom/page/about"> 21 <meta property="og:title" content="About - Zin Zen Wine Bistro - 6841 Virginia Parkway, McKinney TX, USA - YourFoodOnline"> 22<meta property="og:description" content="Located in the heart of McKinneyâs Adriatica Village, Zin Zen is a premier wine bar and culinary destination. We pair a curated selection of 80+ global wines with a relaxing atmosphere and chef-inspired dishes to help you find your Zen, one pour at a time."> 23<meta property="og:site_name" content="YourFoodOnline"> 24<meta property="og:image" content="https://town-files-production.s3.amazonaws.com/uploads/165/business_v0p1m51ZxXHOe7V.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=feab9acadf1d83135677ff0c9b9b99de1351e4a3d37610c67caaff98fa28464f"> 25 26
26<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":"Zin Zen Wine Bistro - 6841 Virginia Parkway, McKinney TX, USA - YourFoodOnline","description":"Located in the heart of McKinneyâs Adriatica Village, Zin Zen is a premier wine bar and culinary destination. We pair a curated selection of 80+ global wines with a relaxing atmosphere and chef-inspired dishes to help you find your Zen, one pour at a time.","image":"https://town-files-production.s3.amazonaws.com/uploads/165/business_v0p1m51ZxXHOe7V.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=feab9acadf1d83135677ff0c9b9b99de1351e4a3d37610c67caaff98fa28464f"}</script>
26 27 28 <meta name="csrf-token" content="QUAY7qp3f9vxznTgECZV7rSPGioc1ts6bDtSsma9"> 29 <link rel="icon" type="image/x-icon" href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_qf1dZJw1Jhx6omp.ico?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=d313793b03c9cbb3b9dc4e10649856f2ace6a2282f876ab8568f776741e8a1fa"> 30 <link rel="shortcut icon" type="image/x-icon" href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_qf1dZJw1Jhx6omp.ico?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=d313793b03c9cbb3b9dc4e10649856f2ace6a2282f876ab8568f776741e8a1fa"> 31 <link rel="icon" sizes="16x16" type="image/png" href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_kCYrqglffPJm20D.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=1b3f75230e95c5439290dceedda9851c0b29e3b3dc026d9809ac23ead7ae85b4"> 32 <link rel="icon" sizes="32x32" type="image/png" href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_2IIDBkMMqA7qR0J.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=6ce8681e0901774a3c18a05ed1b9eb31fab9b90c4df3c7ec18f32545079f5008"> 33 <link rel="icon" sizes="96x96" type="image/png" href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_fwthANiL76sv5HR.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=626fce3c98950f5614f3319aac21248339a88d0757e3c487412aeddfb8689cf4"> 34 <link rel="apple-touch-icon" sizes="57x57" href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_YPOvk30nCO3soxG.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=0d4e9f4725d3b66680c92db92f7b4fe81a5cdef36fbaafeb67298d7596cf4256"> 35 <link rel="apple-touch-icon" sizes="60x60" href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_xno0QAuBBsj0Yg3.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=19ddb80371a30e639920566b49b2dd06cc7adf544c6c409bc0cd6462f6bcb93f"> 36 <link rel="apple-touch-icon" sizes="72x72" href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_CoiJHyzCnYiJzs7.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=c8fc0df4403a82704fb6e708b17f29686fcb2427ce87c4807dbfa206a97235ce"> 37 <link rel="apple-touch-icon" sizes="76x76" href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_wuP7XYWpZDdGhdF.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=d5145c1c6760eb0946db1508ea840a667dff7029b43d5233ff2ba3b7e437bcc5"> 38 <link rel="apple-touch-icon" sizes="114x114" href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_K6w8yaW6FewfV96.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=0db7a9e4f40f39de28d2d6a4876bb17cd9d4aaf1768d4c48a3f2291dd33dcf29"> 39 <link rel="apple-touch-icon" sizes="120x120" href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_FYukSOzRysNZ1np.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=4e22a44db1c01ad8e23e00c7a7d6ca24a8baccb1333cf92406ecdb5da3b104bd"> 40 <link rel="apple-touch-icon" sizes="144x144" href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_ZBBOuPunEIFN87z.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=0b6b69891b545114627e5b19ca5a857a91f819f8fa3ca818ed10b762cf69e9c2"> 41 <link rel="apple-touch-icon" sizes="152x152" href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_wf8SS1mSOZZHrmy.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=afadfc38c4c58f37031514c6d24e28bfa6f667308865bdfda9f7a3c262ceeb26"> 42 <link rel="apple-touch-icon" sizes="180x180" href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_nGhh4zqO8zFqBew.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=d95c584194f06a0b8254f6a98f10e85dff4fa84ce2c1eac2d7c314d9cdd83daf"> 43 <link rel="icon" sizes="192x192" type="image/png" href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_A79AWE6u1KPL9wt.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=8ebbe1b9b3d27502cf7fe2c0f8c615b8db6c293a4597173c0de1cad893264cf0"> 44 <link rel="icon" sizes="512x512" type="image/png" href="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_HsotL9TDaGYCCZu.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=75bdcb80861008dfcdf7154eacfa3aef4e9c1532dbe27dda092f7828ec70bdeb"> 45 <meta name="msapplication-TileImage" content="https://town-files-production.s3.amazonaws.com/domain_favicons/165/domainsetting_fRCbNhn1Kzst6f9.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=6ae0ae461e5a7297dfa3e48e85538fb4244f93acde7ddcbd1a02b6fdaa1f4c42"> 46 47 <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/bootstrap.min.css"> 48 <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/font-awesome.css"> 49 <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/animate.css"> 50 <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/magnific-popup.css"> 51 <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/meanmenu.css"> 52 <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/swiper-bundle.min.css"> 53 <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/nice-select.css"> 54 <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/main.css"> 55 <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/style.css"> 56 <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/custom.css?v=1790249518"> 57 58 <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/custom-desktop.css?v=1790249518"> 59 60 61 62 <style> 63 :root { 64 --text: #990100; 65 --theme: #2c3e50; 66 --header: #2c3e50; 67 --theme2: #009444; 68 --theme3: #c5a065; 69 --border: #2c3c50; 70 --body: #f9f8f4; 71 --white: #2c3e50; 72 --input: #FFFFFF; 73 --lightcontrast: #ffffff; 74 --darkcontrast: #2c3c50; 75 } 76 .form-control { background-color: var(--input) !important; } 77 .food-category-section { background-color: var(--body); } 78 .shop-list-items { background-color: var(--body); border: 1px solid var(--border); } 79 .nav .nav-link { color: var(--text) !important; font-weight: bold !important; font-size: 23px !important;} 80 .food-product-wrapper.style-two .nav .nav-link.active::before{ bottom: 0px !important;} 81 .mobile-header-btn{ border: 1px solid var(--theme) !important;} 82 83 84 .mobile-bottom-nav { 85 margin-bottom: 10px; 86 margin-right: -10px; 87 margin-left: 10px; 88 border-radius: 25px; 89 width: calc(100% - 20px); 90 } 91 92 </style> 93 94 <style> 95 * { box-sizing: border-box; } body {margin: 0;}.main-content{text-align:inherit !important;padding-top:20px !important;padding-bottom:0px !important;width:100vw !important;max-width:none !important;margin-left:calc(50% - 50vw) !important;margin-right:calc(50% - 50vw) !important;overflow-x:hidden !important;overflow-y:hidden !important;margin-top:-8.5em !important;margin-bottom:-8rem !important;position:relative !important;}.dynamic-page-section .page-content-rendered h1, .dynamic-page-section .page-content-rendered h2, .dynamic-page-section .page-content-rendered h3, .dynamic-page-section .page-content-rendered h4, .dynamic-page-section .page-content-rendered h5, .dynamic-page-section .page-content-rendered h6{margin-top:0px !important;color:inherit !important;}.dynamic-page-section .page-content-rendered img{max-width:100% !important;height:100% !important;}#i6szl{text-align:center;margin-bottom:5rem;}#ikq7r{margin-bottom:6rem;}#ixq9f{margin-top:15px;padding:0.8rem 1.5rem;font-size:0.7rem;}#ioqvv{margin-top:15px;padding:0.8rem 1.5rem;font-size:0.7rem;}#i7jng{margin-top:15px;padding:0.8rem 1.5rem;font-size:0.7rem;}#ic53a{margin-top:3rem;font-size:0.75rem;letter-spacing:2px;opacity:0.5;text-transform:uppercase;}#idvq3{color:var(--bg-cream);text-decoration:none;}#i4f5ao{text-align:center;margin-bottom:4rem;}#isrrfv{color:#fff !important;}
95#i1zhln{color:#fff !important;}#ibv0n5{color:#fff !important;}#igr2ei{color:#fff !important;}#iodfzb{color:#fff !important;}#i6ai0g{color:#fff !important;}#ilktbf{color:#fff !important;}#i76b7g{color:#fff !important;}#imvi4i{color:#fff !important;}#iml34r{color:#fff !important;}#ihdtvj{color:#fff !important;}#igwhp7{text-decoration:none !important;}#ibt598{text-align:center;margin-bottom:4rem;} 96 </style> 97 98 <style> 99 .dynamic-page-section .page-content-rendered img { 100 max-width: 100%; 101 height: auto; 102 border-radius: 0.25rem; 103 margin-top: 1rem; 104 margin-bottom: 1rem; 105 display: block; /* Para centrar con margin auto si es necesario */ 106 } 107 .dynamic-page-section .page-content-rendered h1, 108 .dynamic-page-section .page-content-rendered h2, 109 .dynamic-page-section .page-content-rendered h3, 110 .dynamic-page-section .page-content-rendered h4, 111 .dynamic-page-section .page-content-rendered h5, 112 .dynamic-page-section .page-content-rendered h6 { 113 margin-top: 1.5em; /* Espacio antes de los encabezados */ 114 margin-bottom: 0.5em; 115 color: var(--header, #333); /* Usar variable de color del tema o un fallback */ 116 font-weight: 600; 117 } 118 .dynamic-page-section .page-content-rendered p { 119 line-height: 1.7; 120 margin-bottom: 1em; 121 } 122 .dynamic-page-section .page-content-rendered ul, 123 .dynamic-page-section .page-content-rendered ol { 124 margin-bottom: 1em; 125 padding-left: 2em; /* Estándar para listas */ 126 } 127 .dynamic-page-section .page-content-rendered li { 128 margin-bottom: 0.5em; 129 } 130 .dynamic-page-section .page-content-rendered blockquote { 131 border-left: 4px solid var(--theme, #007bff); 132 padding: 0.5em 1em; 133 margin: 1em 0; 134 font-style: italic; 135 color: #555; 136 background-color: #f9f9f9; 137 } 138 .dynamic-page-section .page-content-rendered a { 139 color: var(--theme, #007bff); 140 text-decoration: underline; 141 } 142 .dynamic-page-section .page-content-rendered a:hover { 143 color: á¥ááá(var(--theme, #007bff), 20%); /* Oscurecer el color del tema en hover */ 144 } 145 /* Asegurar que el contenido del editor tenga algún padding si es necesario */ 146 .page-content-rendered { 147 padding-top: 1rem; 148 padding-bottom: 1rem; 149 } 150 </style> 151 152 153 <link rel="stylesheet" href="https://www.zinzenwine.com/assets/frontend/assets/css/tc/menu_product_modal.css"> 154 155 156</head> 157 158<body> 159 160 <style> 161 html.tc-privacy-lock, 162 html.tc-privacy-lock body { 163 overflow: hidden; 164 } 165 166 .tc-privacy-consent-screen *, 167 .tc-privacy-backdrop * { 168 box-sizing: border-box; 169 letter-spacing: 0 !important; 170 } 171 172 .tc-privacy-hidden { 173 display: none !important; 174 } 175 176 .tc-privacy-consent-screen { 177 position: fixed; 178 z-index: 2147483001; 179 isolation: isolate; 180 right: 0; 181 bottom: 0; 182 left: 0; 183 display: flex; 184 align-items: flex-end; 185 justify-content: center; 186 padding: 16px; 187 background: rgba(15, 23, 42, 0.58); 188 backdrop-filter: blur(5px); 189 -webkit-backdrop-filter: blur(5px); 190 color: #1c2539; 191 font-family: inherit; 192 pointer-events: auto; 193 } 194 195 .tc-privacy-card { 196 position: relative; 197 z-index: 1; 198 display: grid; 199 grid-template-columns: minmax(0, 1fr) auto; 200 gap: 16px; 201 align-items: center; 202 width: min(1120px, 100%); 203 overflow: hidden; 204 border: 1px solid rgba(28, 37, 57, 0.14);
205 border-top: 4px solid var(--theme, #20c7d6); 206 border-radius: 8px; 207 background: #fff; 208 box-shadow: 0 18px 52px rgba(15, 23, 42, 0.22); 209 pointer-events: auto; 210 } 211 212 .tc-privacy-card:focus { 213 outline: 3px solid rgba(32, 199, 214, 0.22); 214 outline-offset: 2px; 215 } 216 217 .tc-privacy-card__body { 218 padding: 18px 20px; 219 } 220 221 .tc-privacy-card__footer { 222 display: flex; 223 align-items: center; 224 justify-content: flex-end; 225 gap: 12px; 226 padding: 18px 20px 18px 0; 227 } 228 229 .tc-privacy-card__eyebrow { 230 display: inline-flex; 231 align-items: center; 232 gap: 8px; 233 margin-bottom: 8px; 234 color: var(--theme, #20c7d6); 235 font-size: 11px !important; 236 font-weight: 800; 237 letter-spacing: 0; 238 line-height: 1; 239 text-transform: uppercase; 240 } 241 242 .tc-privacy-card__mark { 243 width: 10px; 244 height: 10px; 245 border-radius: 50%; 246 background: var(--theme, #20c7d6); 247 box-shadow: 0 0 0 5px rgba(32, 199, 214, 0.14); 248 } 249 250 .tc-privacy-banner__title, 251 .tc-privacy-modal__title { 252 margin: 0 0 5px !important; 253 color: var(--header, #1c2539) !important; 254 font-family: inherit !important; 255 font-size: 18px !important; 256 font-weight: 800; 257 line-height: 1.2 !important; 258 text-transform: none !important; 259 } 260 261 .tc-privacy-banner__copy, 262 .tc-privacy-modal__copy { 263 margin: 0 !important; 264 color: #617085; 265 font-size: 13px !important; 266 line-height: 1.45; 267 text-transform: none !important; 268 } 269 270 .tc-privacy-banner__copy { 271 max-width: 760px; 272 } 273 274 .tc-privacy-summary { 275 display: flex; 276 flex-wrap: wrap; 277 gap: 8px; 278 margin: 12px 0 0; 279 padding: 0; 280 list-style: none; 281 } 282 283 .tc-privacy-summary li { 284 display: inline-flex; 285 align-items: center; 286 gap: 6px; 287 max-width: 100%; 288 padding: 6px 9px; 289 border: 1px solid rgba(28, 37, 57, 0.08); 290 border-radius: 6px; 291 background: #f8fafc; 292 } 293 294 .tc-privacy-summary__check { 295 display: inline-flex; 296 align-items: center; 297 justify-content: center; 298 width: 18px; 299 height: 18px; 300 border-radius: 50%; 301 background: #edf5ff; 302 color: var(--theme, #20c7d6); 303 font-size: 11px !important; 304 font-weight: 800; 305 line-height: 1; 306 flex: 0 0 auto; 307 } 308 309 .tc-privacy-summary strong { 310 display: inline; 311 color: #1c2539; 312 font-size: 12px !important; 313 font-weight: 800; 314 line-height: 1.2; 315 } 316 317 .tc-privacy-summary span { 318 display: inline; 319 } 320 321 .tc-privacy-summary span span { 322 display: none; 323 } 324 325 .tc-privacy-banner__actions { 326 display: grid; 327 grid-template-columns: 1fr; 328 gap: 8px; 329 width: 220px; 330 } 331 332 .tc-privacy-modal__actions { 333 display: flex; 334 align-items: center; 335 flex-wrap: wrap; 336 justify-content: flex-end; 337 gap: 10px; 338 } 339 340 .tc-privacy-btn { 341 display: inline-flex; 342 align-items: center; 343 justify-content: center; 344 min-height: 38px; 345 padding: 0 16px; 346 border: 1px solid var(--theme, #20c7d6); 347 border-radius: 6px; 348 background: #fff; 349 color: var(--theme, #20c7d6); 350 font-family: inherit !important; 351 font-size: 13px !important; 352 font-weight: 800; 353 line-height: 1; 354 text-decoration: none; 355 text-transform: none !important; 356 cursor: pointer; 357 transition: opacity 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease; 358 white-space: nowrap; 359 } 360 361 .tc-privacy-btn:hover, 362 .tc-privacy-link:hover { 363 opacity: 0.88; 364 } 365 366 .tc-privacy-btn:focus-visible, 367 .tc-privacy-link:focus-visible, 368 .tc-privacy-tab:focus-visible, 369 .tc-privacy-modal__close:focus-visible { 370 outline: 3px solid rgba(32, 199, 214, 0.22); 371 outline-offset: 2px; 372 } 373 374 .tc-privacy-btn:active { 375 transform: translateY(1px); 376 } 377 378 .tc-privacy-btn:disabled { 379 cursor: wait; 380 opacity: 0.62; 381 transform: none; 382 } 383 384 .tc-privacy-btn--primary { 385 border-color: var(--header, #1c2539); 386 background: var(--header, #1c2539); 387 color: #fff; 388 } 389 390 .tc-privacy-btn--dark { 391 border-color: var(--header, #1c2539); 392 background: var(--header, #1c2539); 393 color: #fff; 394 } 395 396 .tc-privacy-btn--muted { 397 border-color: rgba(28, 37, 57, 0.16); 398 color: #526176; 399 } 400 401 .tc-privacy-link { 402 border: 0; 403 background: transparent; 404 color: var(--theme, #20c7d6); 405 font: inherit !important; 406 font-size: 12px !important; 407 font-weight: 800; 408 line-height: 1.25; 409 text-decoration: underline; 410 text-underline-offset: 2px; 411 text-transform: none !important; 412 cursor: pointer; 413 } 414 415 .tc-privacy-backdrop { 416 position: fixed; 417 inset: 0; 418 z-index: 2147483001; 419 display: flex; 420 align-items: center; 421 justify-content: center; 422 padding: 18px; 423 background: rgba(15, 23, 42, 0.58); 424 backdrop-filter: blur(5px); 425 } 426 427 .tc-privacy-modal { 428 position: relative; 429 display: flex; 430 flex-direction: column; 431 width: min(880px, 100%); 432 max-height: calc(100vh - 36px); 433 overflow: hidden; 434 border-radius: 8px; 435 background: #fff; 436 box-shadow: 0 18px 56px rgba(28, 37, 57, 0.28); 437 } 438 439 .tc-privacy-modal:focus { 440 outline: 3px solid rgba(40, 120, 255, 0.28); 441 outline-offset: 3px; 442 } 443 444 .tc-privacy-modal__close { 445 position: absolute; 446 top: 16px; 447 right: 16px; 448 display: inline-flex; 449 align-items: center; 450 justify-content: center; 451 width: 34px; 452 height: 34px; 453 border: 1px solid rgba(28, 37, 57, 0.12); 454 border-radius: 6px; 455 background: #fff; 456 color: #617085; 457 font-size: 22px; 458 line-height: 1; 459 cursor: pointer; 460 } 461 462 .tc-privacy-modal__header, 463 .tc-privacy-modal__footer { 464 padding: 20px 24px; 465 } 466 467 .tc-privacy-modal__header { 468 padding-right: 62px; 469 border-bottom: 1px solid rgba(28, 37, 57, 0.1); 470 } 471 472 .tc-privacy-modal__tabs { 473 display: grid; 474 grid-template-columns: repeat(3, minmax(0, 1fr)); 475 border-bottom: 1px solid rgba(28, 37, 57, 0.1); 476 background: #f8fafc; 477 } 478 479 .tc-privacy-tab { 480 min-height: 48px; 481 border: 0; 482 border-right: 1px solid rgba(28, 37, 57, 0.08); 483 border-bottom: 3px solid transparent; 484 background: transparent; 485 color: #617085; 486 font: inherit !important; 487 font-size: 13px !important; 488 font-weight: 800; 489 text-transform: none !important; 490 cursor: pointer; 491 } 492 493 .tc-privacy-tab:last-child { 494 border-right: 0; 495 } 496 497 .tc-privacy-tab[aria-selected="true"] { 498 border-bottom-color: var(--theme, #20c7d6); 499 color: var(--header, #1c2539); 500 background: #fff; 501 } 502 503 .tc-privacy-modal__body { 504 overflow: auto; 505 padding: 22px 24px; 506 } 507 508 .tc-privacy-panel[hidden] { 509 display: none !important; 510 } 511 512 .tc-privacy-panel__lead { 513 margin: 0 0 16px !important; 514 color: #526176; 515 font-size: 14px !important; 516 line-height: 1.5; 517 } 518 519 .tc-privacy-about-list { 520 display: grid; 521 gap: 10px; 522 margin: 16px 0 0; 523 padding: 0; 524 list-style: none; 525 } 526 527 .tc-privacy-about-list a { 528 color: var(--theme, #20c7d6); 529 font-weight: 800; 530 } 531 532 .tc-privacy-modal__footer { 533 display: flex; 534 align-items: center; 535 flex-wrap: wrap; 536 justify-content: space-between; 537 gap: 12px; 538 border-top: 1px solid rgba(28, 37, 57, 0.1); 539 background: #fff; 540 } 541 542 .tc-privacy-option { 543 display: grid; 544 grid-template-columns: minmax(0, 1fr) auto; 545 gap: 16px; 546 align-items: start; 547 padding: 16px 0; 548 border-bottom: 1px solid rgba(28, 37, 57, 0.08); 549 } 550 551 .tc-privacy-option:last-child { 552 border-bottom: 0; 553 } 554 555 .tc-privacy-option input { 556 position: relative; 557 width: 44px; 558 height: 24px; 559 margin: 0; 560 border: 0; 561 border-radius: 999px; 562 appearance: none;
563 background: #d7dde5; 564 cursor: pointer; 565 transition: background 0.15s ease, opacity 0.15s ease; 566 flex: 0 0 auto; 567 } 568 569 .tc-privacy-option input::before { 570 position: absolute; 571 top: 3px; 572 left: 3px; 573 width: 18px; 574 height: 18px; 575 border-radius: 50%; 576 background: #fff; 577 box-shadow: 0 1px 4px rgba(15, 23, 42, 0.18); 578 content: ""; 579 transition: transform 0.15s ease; 580 } 581 582 .tc-privacy-option input:checked { 583 background: var(--theme, #20c7d6); 584 } 585 586 .tc-privacy-option input:checked::before { 587 transform: translateX(20px); 588 } 589 590 .tc-privacy-option input:disabled { 591 cursor: not-allowed; 592 opacity: 0.62; 593 } 594 595 .tc-privacy-option strong { 596 display: block; 597 margin-bottom: 3px; 598 color: #1c2539; 599 font-size: 14px !important; 600 } 601 602 .tc-privacy-option span { 603 display: block; 604 color: #617085; 605 font-size: 13px !important; 606 line-height: 1.45; 607 } 608 609 .tc-privacy-gpc { 610 margin-top: 14px; 611 padding: 12px 14px; 612 border: 1px solid rgba(32, 199, 214, 0.22); 613 border-radius: 6px; 614 background: rgba(32, 199, 214, 0.08); 615 color: #335078; 616 font-size: 13px !important; 617 line-height: 1.45; 618 } 619 620 @media (max-width: 760px) { 621 .tc-privacy-consent-screen { 622 padding: 10px; 623 } 624 625 .tc-privacy-card { 626 grid-template-columns: 1fr; 627 gap: 0; 628 } 629 630 .tc-privacy-card__body { 631 padding: 16px; 632 } 633 634 .tc-privacy-card__footer { 635 align-items: stretch; 636 flex-direction: column; 637 padding: 0 16px 16px; 638 } 639 640 .tc-privacy-banner__actions { 641 width: 100%; 642 } 643 644 .tc-privacy-backdrop { 645 align-items: flex-start; 646 padding: 12px; 647 overflow: auto; 648 } 649 650 .tc-privacy-modal__actions { 651 justify-content: stretch; 652 min-width: 0; 653 } 654 655 .tc-privacy-btn { 656 flex: 1 1 auto; 657 } 658 659 .tc-privacy-modal__footer { 660 align-items: stretch; 661 flex-direction: column; 662 } 663 664 .tc-privacy-modal__header, 665 .tc-privacy-modal__body, 666 .tc-privacy-modal__footer { 667 padding-right: 16px; 668 padding-left: 16px; 669 } 670 671 .tc-privacy-modal__header { 672 padding-right: 58px; 673 } 674 675 .tc-privacy-modal__tabs { 676 grid-template-columns: 1fr; 677 } 678 679 .tc-privacy-tab { 680 border-right: 0; 681 } 682 683 .tc-privacy-option { 684 grid-template-columns: minmax(0, 1fr); 685 } 686 } 687</style> 688
689<script> 690 window.TC_PRIVACY_CONFIG = { 691 version: 1, 692 privacyUrl: "https:\/\/www.town.club\/privacy", 693 consentUrl: "\/privacy\/consent", 694 scripts: {"head":"","bodyStart":"","bodyEnd":"PHNjcmlwdD4NCihmdW5jdGlvbigpIHsNCiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3p6LXNhZmUtc3R5bGVzJykpIHJldHVybjsNCg0KICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsNCiAgICBzdHlsZS5pZCA9ICd6ei1zYWZlLXN0eWxlcyc7DQogICAgc3R5bGUuaW5uZXJIVE1MID0gYA0KICAgICAgICBAaW1wb3J0IHVybCgnaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1Db3Jtb3JhbnQrR2FyYW1vbmQ6d2dodEA2MDA7NzAwJmZhbWlseT1Nb250c2VycmF0OndnaHRANDAwOzUwMDs2MDA7NzAwJmRpc3BsYXk9c3dhcCcpOw0KICAgICAgICBAaW1wb3J0IHVybCgnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9ib290c3RyYXAtaWNvbnNAMS4xMS4zL2ZvbnQvYm9vdHN0cmFwLWljb25zLm1pbi5jc3MnKTsNCg0KICAgICAgICA6cm9vdCB7DQogICAgICAgICAgICAtLXp6LXBsdW06ICM0OTBEMzQgIWltcG9ydGFudDsNCiAgICAgICAgICAgIC0tenotZ3JlZW46ICMwMDk0NDQgIWltcG9ydGFudDsNCiAgICAgICAgICAgIC0tenotcmVkOiAjOUExQjJGICFpbXBvcnRhbnQ7DQogICAgICAgICAgICAtLXp6LXJlZC1ob3ZlcjogIzdhMTUyNSAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgLS16ei1nb2xkOiAjYzVhMDY1ICFpbXBvcnRhbnQ7DQogICAgICAgICAgICAtLXp6LXNsYXRlOiAjMkMzRTUwICFpbXBvcnRhbnQ7DQogICAgICAgICAgICAtLXp6LWRhcmstc2xhdGU6ICMxYTI1MmYgIWltcG9ydGFudDsNCiAgICAgICAgICAgIC0tenotbGlnaHQ6ICNmZmZmZmYgIWltcG9ydGFudDsNCiAgICAgICAgICAgIC0tenotaGVhZC1mb250OiAnQ29ybW9yYW50IEdhcmFtb25kJywgc2VyaWYgIWltcG9ydGFudDsNCiAgICAgICAgICAgIC0tenotYm9keS1mb250OiAnTW9udHNlcnJhdCcsIHNhbnMtc2VyaWYgIWltcG9ydGFudDsNCiAgICAgICAgfQ0KDQogICAgICAgICNidXNpbmVzc1NlbGVjdG9yTW9kYWwsIC5tb2RhbC1iYWNrZHJvcCB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgb3BhY2l0eTogMCAhaW1wb3J0YW50OyBwb2ludGVyLWV2ZW50czogbm9uZSAhaW1wb3J0YW50OyB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsgfQ0KICAgICAgICBib2R5Lm1vZGFsLW9wZW4geyBvdmVyZmxvdy15OiBhdXRvICFpbXBvcnRhbnQ7IHBhZGRpbmctcmlnaHQ6IDAgIWltcG9ydGFudDsgfQ0KDQogICAgICAgIEBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkgew0KICAgICAgICAgICAgaGVhZGVyI2hlYWRlci1zdGlja3ksIC5oZWFkZXItdG9wLCAuaGVhZGVyLXRvcC02LCAjaGVhZGVyLW1pZGRsZS1zZWN0aW9uLCBmb290ZXIuZm9vdGVyLXNlY3Rpb24sIC5mb290ZXItYm90dG9tLCAubW9iaWxlLWhlYWRlciwgLm1vYmlsZS1ib3R0b20tbmF2IHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9DQogICAgICAgICAgICAjenotdG9wLWJhciwgI3p6LWN1c3RvbS1oZWFkZXIsICN6ei1jdXN0b20tZm9vdGVyIHsgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsgfQ0KICAgICAgICAgICAgYm9keSB7IHBhZGRpbmctdG9wOiAxMzBweCAhaW1wb3J0YW50OyB9DQogICAgICAgIH0NCg0KICAgICAgICBAbWVkaWEgKG1heC13aWR0aDogOTkxcHgpIHsNCiAgICAgICAgICAgICN6ei10b3AtYmFyLCAjenotY3VzdG9tLWhlYWRlciwgI3p6LWN1c3RvbS1mb290ZXIgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgICAgIGhlYWRlciNoZWFkZXItc3RpY2t5LCAuaGVhZGVyLXRvcCwgLmhlYWRlci10b3AtNiwgI2hlYWRlci1taWRkbGUtc2VjdGlvbiwgLm1vYmlsZS1oZWFkZXIsIC5tb2JpbGUtYm90dG9tLW5hdiB7IGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsgdmlzaWJpbGl0eTogdmlzaWJsZSAhaW1wb3J0YW50OyBvcGFjaXR5OiAxICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgICAgIGZvb3Rlci5mb290ZXItc2VjdGlvbiwgLmZvb3Rlci1ib3R0b20geyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyB2aXNpYmlsaXR5OiB2aXNpYmxlICFpbXBvcnRhbnQ7IG9wYWNpdHk6IDEgIWltcG9ydGFudDsgfQ0KICAgICAgICB9DQoNCiAgICAgICAgI3p6LXRvcC1iYXIgew0KICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tenotcGx1bSkgIWltcG9ydGFudDsNCiAgICAgICAgICAgIGNvbG9yOiB2YXIoLS16ei1saWdodCkgIWltcG9ydGFudDsNCiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS16ei1ib2R5LWZvbnQpICFpbXBvcnRhbnQ7DQogICAgICAgICAgICBmb250LXNpemU6IDEzcHggIWltcG9ydGFudDsNCiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDAgIWltcG9ydGFudDsNCiAgICAgICAgICAgIHBhZGRpbmc6IDEwcHggNXZ3ICFpbXBvcnRhbnQ7DQogICAgICAgICAgICBwb3NpdGlvbjogZml4ZWQgIWltcG9ydGFudDsNCiAgICAgICAgICAgIHRvcDogMCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgbGVmdDogMCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsNCiAgICAgICAgICAgIHotaW5kZXg6IDk5OTkgIWltcG9ydGFudDsNCiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMSkgIWltcG9ydGFudDsNCiAgICAgICAgfQ0KICAgICAgICAuenotdG9wLWlubmVyIHsNCiAgICAgICAgICAgIG1heC13aWR0aDogMTMwMHB4ICFpbXBvcnRhbnQ7IG1hcmdpbjogMCBhdXRvICFpbXBvcnRhbnQ7DQogICAgICAgICAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbiAhaW1wb3J0YW50OyBhbGlnbi1pdGVtczogY2VudGVyICFpbXBvcnRhbnQ7DQogICAgICAgIH0NCiAgICAgICAgLnp6LXRvcC1jb250YWN0IHsgZGlzcGxheTogZmxleCAhaW1wb3J0YW50OyBnYXA6IDI0cHggIWltcG9ydGFudDsgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50OyB9DQogICAgICAgIC56ei10b3AtY29udGFjdCBhIHsNCiAgICAgICAgICAgIGNvbG9yOiB2YXIoLS16ei1saWdodCkgIWltcG9ydGFudDsgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7DQogICAgICAgICAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7IGFsaWduLWl0ZW
6941zOiBjZW50ZXIgIWltcG9ydGFudDsgZ2FwOiA4cHggIWltcG9ydGFudDsNCiAgICAgICAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuM3MgIWltcG9ydGFudDsNCiAgICAgICAgfQ0KICAgICAgICAuenotdG9wLWNvbnRhY3QgYTpob3ZlciB7IGNvbG9yOiB2YXIoLS16ei1nb2xkKSAhaW1wb3J0YW50OyB9DQogICAgICAgIC56ei10b3AtY29udGFjdCBpIHsgY29sb3I6IHZhcigtLXp6LWdyZWVuKSAhaW1wb3J0YW50OyBmb250LXNpemU6IDE0cHggIWltcG9ydGFudDsgfQ0KDQogICAgICAgICN6ei1jdXN0b20taGVhZGVyIHsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXp6LWxpZ2h0KSAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNFNUU3RUIgIWltcG9ydGFudDsNCiAgICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgdG9wOiA0MHB4ICFpbXBvcnRhbnQ7DQogICAgICAgICAgICBsZWZ0OiAwICFpbXBvcnRhbnQ7DQogICAgICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgei1pbmRleDogOTk5OCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgZm9udC1mYW1pbHk6IHZhcigtLXp6LWJvZHktZm9udCkgIWltcG9ydGFudDsNCiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDIwcHggcmdiYSg0NCw2Miw4MCwwLjA4KSAhaW1wb3J0YW50Ow0KICAgICAgICB9DQogICAgICAgIC56ei1oLWlubmVyIHsNCiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuICFpbXBvcnRhbnQ7IGFsaWduLWl0ZW1zOiBjZW50ZXIgIWltcG9ydGFudDsNCiAgICAgICAgICAgIHBhZGRpbmc6IDEycHggNXZ3ICFpbXBvcnRhbnQ7IG1heC13aWR0aDogMTMwMHB4ICFpbXBvcnRhbnQ7IG1hcmdpbjogMCBhdXRvICFpbXBvcnRhbnQ7DQogICAgICAgIH0NCiAgICAgICAgLnp6LWJyYW5kIGltZyB7DQogICAgICAgICAgICBtYXgtaGVpZ2h0OiA2MHB4ICFpbXBvcnRhbnQ7IHdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7IG9iamVjdC1maXQ6IGNvbnRhaW4gIWltcG9ydGFudDsNCiAgICAgICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzIGVhc2UgIWltcG9ydGFudDsNCiAgICAgICAgfQ0KICAgICAgICAuenotYnJhbmQgaW1nOmhvdmVyIHsgdHJhbnNmb3JtOiBzY2FsZSgxLjA1KSAhaW1wb3J0YW50OyB9DQoNCiAgICAgICAgLnp6LW5hdi1saW5rcyB7IGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsgZ2FwOiAzMHB4ICFpbXBvcnRhbnQ7IG1hcmdpbjogMCAhaW1wb3J0YW50OyBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7IGFsaWduLWl0ZW1zOiBjZW50ZXIgIWltcG9ydGFudDsgbGlzdC1zdHlsZTogbm9uZSAhaW1wb3J0YW50OyB9DQogICAgICAgIC56ei1uYXYtbGluayB7DQogICAgICAgICAgICBjb2xvcjogdmFyKC0tenotc2xhdGUpICFpbXBvcnRhbnQ7IGZvbnQtd2VpZ2h0OiA2MDAgIWltcG9ydGFudDsgZm9udC1zaXplOiAxNHB4ICFpbXBvcnRhbnQ7DQogICAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlICFpbXBvcnRhbnQ7IHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDFweCAhaW1wb3J0YW50OyB0cmFuc2l0aW9uOiBjb2xvciAwLjNzICFpbXBvcnRhbnQ7IHBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50OyBwYWRkaW5nOiA1cHggMCAhaW1wb3J0YW50Ow0KICAgICAgICB9DQogICAgICAgIC56ei1uYXYtbGluazpob3ZlciwgLnp6LW5hdi1saW5rLmFjdGl2ZSB7IGNvbG9yOiB2YXIoLS16ei1yZWQpICFpbXBvcnRhbnQ7IH0NCg0KICAgICAgICAuenotbmF2LWFjdGlvbnMgeyBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7IGFsaWduLWl0ZW1zOiBjZW50ZXIgIWltcG9ydGFudDsgZ2FwOiAyMHB4ICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgLnp6LWNhcnQgeyBmb250LXNpemU6IDIycHggIWltcG9ydGFudDsgY29sb3I6IHZhcigtLXp6LXNsYXRlKSAhaW1wb3J0YW50OyB0cmFuc2l0aW9uOiBjb2xvciAwLjNzICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgLnp6LWNhcnQ6aG92ZXIgeyBjb2xvcjogdmFyKC0tenotcmVkKSAhaW1wb3J0YW50OyB9DQogICAgICAgIA0KICAgICAgICAuenotYnRuLWN0YSB7DQogICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS16ei1yZWQpICFpbXBvcnRhbnQ7IGNvbG9yOiB2YXIoLS16ei1saWdodCkgIWltcG9ydGFudDsNCiAgICAgICAgICAgIHBhZGRpbmc6IDEycHggMjRweCAhaW1wb3J0YW50OyBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDsNCiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDAgIWltcG9ydGFudDsgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2UgIWltcG9ydGFudDsNCiAgICAgICAgICAgIGxldHRlci1zcGFjaW5nOiAxLjVweCAhaW1wb3J0YW50OyB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZSAhaW1wb3J0YW50OyBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsgY3Vyc29yOiBwb2ludGVyICFpbXBvcnRhbnQ7DQogICAgICAgIH0NCiAgICAgICAgLnp6LWJ0bi1jdGE6aG92ZXIgew0KICAgICAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tenotcmVkLWhvdmVyKSAhaW1wb3J0YW50Ow0KICAgICAgICB9DQoNCiAgICAgICAgI3p6LWN1c3RvbS1mb290ZXIgew0KICAgICAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tenotc2xhdGUpICFpbXBvcnRhbnQ7DQogICAgICAgICAgICBwYWRkaW5nOiA3MHB4IDV2dyAwICFpbXBvcnRhbnQ7DQogICAgICAgICAgICBmb250LWZhbWlseTogdmFyKC0tenotYm9keS1mb250KSAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgY29sb3I6IHZhcigtLXp6LWxpZ2h0KSAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgYm9yZGVyLXRvcDogNXB4IHNvbGlkIHZhcigtLXp6LWdyZWVuKSAhaW1wb3J0YW50Ow0KICAgICAgICB9DQogICAgICAgIC56ei1mb290ZXItd3JhcCB7IG1heC13aWR0aDogMTIwMHB4ICFpbXBvcnRhbnQ7IG1hcmdpbjogMCBhdXRvICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgDQogICAgICAgIC56ei1mLWJhbm5lciB7DQogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuMDMpICFpbXBvcnRhbnQ7IGJvcmRlci1yYWRpdXM6IDhweCAhaW1wb3J0YW50OyBwYWRkaW5nOiAyNXB4ICFpbXBvcnRhbnQ7IHRleHQtYWxpZ246IGNlbnRlciAhaW1wb3J0YW50OyBtYXJnaW4tYm90dG9tOiA1MHB4ICFpbXBvcnRhbnQ7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4wNikgIWltcG9ydGFudDsNCiAgICAgICAgfQ0KICAgICAgICAuenotZi1iYW5uZXIgaDMgew0KICAgICAgICAgICAgZm9udC1mYW1pbHk6IHZhcigtLXp6LWhlYWQtZm9udCkgIWltcG9ydGFudDsgZm9udC1zaXplOiAyOHB4ICFpbXBvcnRhbnQ7IG1hcmdpbjogMCAhaW1wb3J0YW50OyBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7IGxldHRlci1zcGFjaW5nOiAxcHggIWltcG9ydGFudDsgY29sb3I6IHZhcigtLXp6LWxpZ2h0KSAhaW1wb3J0YW50Ow0KICAgICAgICB9DQogICAgICAgIC5keW5hbWljLXdpbmUtdGV4dCB7IHRyYW5zaXRpb246IG9wYWNpdHkgMC4yNXMgZWFzZS1pbi1vdXQgIWltcG9ydGFudDsgY29sb3I6IHZhcigtLXp6LWdvbGQpICFpbXBvcnRhbnQ7IGZvbnQtc3R5bGU6IGl0YWxpYyAhaW1wb3J0YW50OyB9DQoNCiAgICAgICAgLnp6LWZvb3Rlci1ncmlkIHsNCiAgICAgICAgICAgIGRpc3BsYXk6IGdyaWQgIWltcG9ydGFudDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyNDBweCwgMWZyKSkgIWltcG9ydGFudDsgZ2FwOiA0MHB4ICFpbXBvcnRhbnQ7IG1hcmdpbi1ib3R0b206IDUwcHggIWltcG9ydGFudDsNCiAgICAgICAgfQ0KDQogICAgICAgIC56ei1mLWJyYW5kLXRpdGxlIHsgZm9udC1mYW1pbHk6IHZhcigtLXp6LWhlYWQtZm9udCkgIWltcG9ydGFudDsgZm9udC1zaXplOiAzMnB4ICFpbXBvcnRhbnQ7IGZvbnQtd2VpZ2h0OiA3MDAgIWltcG9ydGFudDsgY29sb3I6IHZhcigtLXp6LWxpZ2h0KSAhaW1wb3J0YW50OyBtYXJnaW4tYm90dG9tOiAxNXB4ICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgLnp6LWYtZGVzYyB7IGZvbnQtc2l6ZTogMTRweCAhaW1wb3J0YW50OyBsaW5lLWhlaWdodDogMS43ICFpbXBvcnRhbnQ7IGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNzUpICFpbXBvcnRhbnQ7IG1hcmdpbjogMCAhaW1wb3J0YW50O30NCiAgICAgICAgDQogICAgICAgIC56ei1mLWNvbCBoNCB7DQogICAgICAgICAgICBmb250LWZhbWlseTogdmFyKC0tenotaGVhZC1mb250KSAhaW1wb3J0YW50OyBmb250LXdlaWdodDogNzAwICFpbXBvcnRhbnQ7IGZvbnQtc2l6ZTogMjJweCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgY29sb3I6IHZhcigtLXp6LWdyZWVuKSAhaW1wb3J0YW50OyBtYXJnaW46IDAgMCAyMHB4IDAgIWltcG9ydGFudDsNCiAgICAgICAgfQ0KICAgICAgICAuenotZi1jb2wgdWwgeyBsaXN0LXN0eWxlOiBub25lICFpbXBvcnRhbnQ7IHBhZGRpbmc6IDAgIWltcG9ydGFudDsgbWFyZ2luOiAwICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgLnp6LWYtY29sIGxpIHsgbWFyZ2luLWJvdHRvbTogMTBweCAhaW1wb3J0YW50OyB9DQogICAgICAgIC56ei1mLWNvbCBhIHsgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC44KSAhaW1wb3J0YW50OyB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsgdHJhbnNpdGlvbjogY29sb3IgMC4zcyAhaW
6941wb3J0YW50OyBmb250LXNpemU6IDE0cHggIWltcG9ydGFudDt9DQogICAgICAgIC56ei1mLWNvbCBhOmhvdmVyIHsgY29sb3I6IHZhcigtLXp6LWdvbGQpICFpbXBvcnRhbnQ7IH0NCg0KICAgICAgICAuenotZi1ob3Vycy1yb3cgeyBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbiAhaW1wb3J0YW50OyBwYWRkaW5nLWJvdHRvbTogNHB4ICFpbXBvcnRhbnQ7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMDUpICFpbXBvcnRhbnQ7IGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuOCkgIWltcG9ydGFudDsgZm9udC1zaXplOiAxNHB4ICFpbXBvcnRhbnQ7IG1hcmdpbi1ib3R0b206IDhweCAhaW1wb3J0YW50O30NCiAgICAgICAgLnp6LWYtaG91cnMtcm93IHNwYW46bGFzdC1jaGlsZCB7IGNvbG9yOiB2YXIoLS16ei1saWdodCkgIWltcG9ydGFudDsgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50OyB9DQoNCiAgICAgICAgLnp6LW5sLWZvcm0geyBwb3NpdGlvbjogcmVsYXRpdmUgIWltcG9ydGFudDsgZGlzcGxheTogZmxleCAhaW1wb3J0YW50OyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9DQogICAgICAgIC56ei1ubC1mb3JtIGlucHV0IHsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgcGFkZGluZzogMTRweCAyMHB4ICFpbXBvcnRhbnQ7IGJhY2tncm91bmQ6IHZhcigtLXp6LWxpZ2h0KSAhaW1wb3J0YW50OyBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50OyBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDsgZm9udC1zaXplOiAxNHB4ICFpbXBvcnRhbnQ7IGNvbG9yOiB2YXIoLS16ei1zbGF0ZSkgIWltcG9ydGFudDsgcGFkZGluZy1yaWdodDogODBweCAhaW1wb3J0YW50OyBmb250LWZhbWlseTogdmFyKC0tenotYm9keS1mb250KSAhaW1wb3J0YW50O30NCiAgICAgICAgLnp6LW5sLWZvcm0gYnV0dG9uIHsgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7IHJpZ2h0OiA1cHggIWltcG9ydGFudDsgdG9wOiA1cHggIWltcG9ydGFudDsgYm90dG9tOiA1cHggIWltcG9ydGFudDsgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tenotcmVkKSAhaW1wb3J0YW50OyBjb2xvcjogdmFyKC0tenotbGlnaHQpICFpbXBvcnRhbnQ7IGJvcmRlcjogbm9uZSAhaW1wb3J0YW50OyBwYWRkaW5nOiAwIDE2cHggIWltcG9ydGFudDsgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50OyBmb250LXNpemU6IDEzcHggIWltcG9ydGFudDsgYm9yZGVyLXJhZGl1czogNHB4ICFpbXBvcnRhbnQ7IGN1cnNvcjogcG9pbnRlciAhaW1wb3J0YW50OyB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnMgIWltcG9ydGFudDsgfQ0KICAgICAgICAuenotbmwtZm9ybSBidXR0b246aG92ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS16ei1yZWQtaG92ZXIpICFpbXBvcnRhbnQ7IH0NCg0KICAgICAgICAuenotbG93ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS16ei1kYXJrLXNsYXRlKSAhaW1wb3J0YW50OyBwYWRkaW5nOiAyNXB4IDAgIWltcG9ydGFudDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4wNSkgIWltcG9ydGFudDsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgfQ0KICAgICAgICAuenotbG93ZXItaW5uZXIgeyBtYXgtd2lkdGg6IDEyMDBweCAhaW1wb3J0YW50OyBtYXJnaW46IDAgYXV0byAhaW1wb3J0YW50OyBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbiAhaW1wb3J0YW50OyBhbGlnbi1pdGVtczogY2VudGVyICFpbXBvcnRhbnQ7IGZsZXgtd3JhcDogd3JhcCAhaW1wb3J0YW50OyBnYXA6IDIwcHggIWltcG9ydGFudDsgcGFkZGluZzogMCAyMHB4ICFpbXBvcnRhbnQ7fQ0KICAgICAgICAuenotY29weXJpZ2h0IHsgZm9udC1zaXplOiAxM3B4ICFpbXBvcnRhbnQ7IGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNSkgIWltcG9ydGFudDsgbWFyZ2luOiAwICFpbXBvcnRhbnQ7fQ0KICAgICAgICAuenotY29weXJpZ2h0IGEgeyBjb2xvcjogdmFyKC0tenotZ29sZCkgIWltcG9ydGFudDsgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgDQogICAgICAgIC56ei1jb21wbGlhbmNlIHsgZGlzcGxheTogZmxleCAhaW1wb3J0YW50OyBhbGlnbi1pdGVtczogY2VudGVyICFpbXBvcnRhbnQ7IGdhcDogMTVweCAhaW1wb3J0YW50OyBsaXN0LXN0eWxlOiBub25lICFpbXBvcnRhbnQ7IG1hcmdpbjogMCAhaW1wb3J0YW50OyBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7IGZsZXgtd3JhcDogd3JhcCAhaW1wb3J0YW50OyB9DQogICAgICAgIC56ei1jb21wbGlhbmNlIGJ1dHRvbiwgLnp6LWNvbXBsaWFuY2UgYSB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7IGJvcmRlcjogbm9uZSAhaW1wb3J0YW50OyBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7IGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNSkgIWltcG9ydGFudDsgZm9udC1mYW1pbHk6IHZhcigtLXp6LWJvZHktZm9udCkgIWltcG9ydGFudDsgZm9udC1zaXplOiAxM3B4ICFpbXBvcnRhbnQ7IHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OyBjdXJzb3I6IHBvaW50ZXIgIWltcG9ydGFudDsgdHJhbnNpdGlvbjogY29sb3IgMC4zcyAhaW1wb3J0YW50O30NCiAgICAgICAgLnp6LWNvbXBsaWFuY2UgYnV0dG9uOmhvdmVyLCAuenotY29tcGxpYW5jZSBhOmhvdmVyIHsgY29sb3I6IHZhcigtLXp6LWxpZ2h0KSAhaW1wb3J0YW50OyB9DQogICAgICAgIC56ei1jb21wbGlhbmNlIC5zZXBhcmF0b3IgeyBtYXJnaW46IDAgIWltcG9ydGFudDsgb3BhY2l0eTogMC41ICFpbXBvcnRhbnQ7IH0NCg0KICAgICAgICAuenotc29jaWFscyB7IGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsgZ2FwOiAxNXB4ICFpbXBvcnRhbnQ7IGZvbnQtc2l6ZTogMThweCAhaW1wb3J0YW50O30NCiAgICAgICAgLnp6LXNvY2lhbHMgYSB7IGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNikgIWltcG9ydGFudDsgdHJhbnNpdGlvbjogY29sb3IgMC4zcyAhaW
6941wb3J0YW50O30NCiAgICAgICAgLnp6LXNvY2lhbHMgYTpob3ZlciB7IGNvbG9yOiB2YXIoLS16ei1saWdodCkgIWltcG9ydGFudDt9DQoNCiAgICAgICAgLnp6LXBvd2VyZWQgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDsgd2lkdGg6IDkwcHggIWltcG9ydGFudDsgb3BhY2l0eTogMC44ICFpbXBvcnRhbnQ7IHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycyAhaW1wb3J0YW50OyB9DQogICAgICAgIC56ei1wb3dlcmVkIGltZyB7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IGhlaWdodDogYXV0byAhaW1wb3J0YW50OyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgLnp6LXBvd2VyZWQ6aG92ZXIgeyBvcGFjaXR5OiAxICFpbXBvcnRhbnQ7IH0NCg0KICAgICAgICBAbWVkaWEgKG1heC13aWR0aDogMTAyNHB4KSB7DQogICAgICAgICAgICAuenotZm9vdGVyLWdyaWQgeyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnIgIWltcG9ydGFudDsgfQ0KICAgICAgICB9DQogICAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgew0KICAgICAgICAgICAgLnp6LWZvb3Rlci1ncmlkIHsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgIWltcG9ydGFudDsgZ2FwOiA0MHB4ICFpbXBvcnRhbnQ7IH0NCiAgICAgICAgICAgIC56ei1sb3dlci1pbm5lciB7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4gIWltcG9ydGFudDsgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7IGp1c3RpZnktY29udGVudDogY2VudGVyICFpbXBvcnRhbnQ7fQ0KICAgICAgICAgICAgLnp6LWNvbXBsaWFuY2UgeyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlciAhaW1wb3J0YW50OyB9DQogICAgICAgIH0NCiAgICBgOw0KICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpOw0KDQogICAgZnVuY3Rpb24gYnVpbGRVSSgpIHsNCiAgICAgICAgaWYgKCFkb2N1bWVudC5ib2R5KSByZXR1cm47DQoNCiAgICAgICAgY29uc3QgT1VSX0lEUyA9IG5ldyBTZXQoWyd6ei10b3AtYmFyJywgJ3p6LWN1c3RvbS1oZWFkZXInLCAnenotY3VzdG9tLWZvb3RlciddKTsNCiAgICAgICAgY29uc3QgS0lMTF9TRUxFQ1RPUlMgPSBbJyNidXNpbmVzc1NlbGVjdG9yTW9kYWwnLCAnLm1vZGFsLWJhY2tkcm9wJ107DQoNCiAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoID49IDk5Mikgew0KICAgICAgICAgICAgS0lMTF9TRUxFQ1RPUlMucHVzaCgnLmhlYWRlci10b3AnLCAnLmhlYWRlci10b3AtNicsICcjaGVhZGVyLW1pZGRsZS1zZWN0aW9uJywgJyNoZWFkZXItc3RpY2t5JywgJ2Zvb3Rlci5mb290ZXItc2VjdGlvbicsICcuZm9vdGVyLXNlY3Rpb246bm90KC5keW5hbWljLXBhZ2Utc2VjdGlvbiknLCAnLmZvb3Rlci1ib3R0b20nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIG51a2Uocm9vdCkgew0KICAgICAgICAgICAgaWYoZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ21vZGFsLW9wZW4nKSkgew0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpOw0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJzsNCiAgICAgICAgICAgICAgICBkb2
694N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9ICcnOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgS0lMTF9TRUxFQ1RPUlMuZm9yRWFjaChzZWwgPT4gew0KICAgICAgICAgICAgICAgIChyb290ID09PSBkb2N1bWVudCA\/IGRvY3VtZW50IDogcm9vdCkucXVlcnlTZWxlY3RvckFsbChzZWwpLmZvckVhY2goZWwgPT4gew0KICAgICAgICAgICAgICAgICAgICBpZiAoIU9VUl9JRFMuaGFzKGVsLmlkKSkgZWwucmVtb3ZlKCk7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJvb3QgIT09IGRvY3VtZW50ICYmIHJvb3QubWF0Y2hlcyAmJiByb290Lm1hdGNoZXMoc2VsKSAmJiAhT1VSX0lEUy5oYXMocm9vdC5pZCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QucmVtb3ZlKCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGNhdGNoKGUpIHt9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA+PSA5OTIpIHsNCiAgICAgICAgICAgICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW4td3JhcHBlcicpOw0KICAgICAgICAgICAgICAgIGlmICh3cmFwcGVyKSB7DQogICAgICAgICAgICAgICAgICAgIHdyYXBwZXIucXVlcnlTZWxlY3RvckFsbCgnaGVhZGVyLCBmb290ZXInKS5mb3JFYWNoKGVsID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghT1VSX0lEUy5oYXMoZWwuaWQpKSBlbC5yZW1vdmUoKTsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgbnVrZShkb2N1bWVudCk7DQogICAgICAgIGNvbnN0IG9icyA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG0gPT4gbS5mb3JFYWNoKG11ID0+IG11LmFkZGVkTm9kZXMuZm9yRWFjaChuID0+IHsgaWYgKG4ubm9kZVR5cGUgPT09IDEpIG51a2Uobik7IH0pKSk7DQogICAgICAgIG9icy5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOw0KDQogICAgICAgIGxldCBzd2VlcENvdW50ID0gMDsNCiAgICAgICAgY29uc3QgZmFzdEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gew0KICAgICAgICAgICAgbnVrZShkb2N1bWVudCk7DQogICAgICAgICAgICBzd2VlcENvdW50Kys7DQogICAgICAgICAgICBpZiAoc3dlZXBDb3VudCA+PSA1MCkgeyBjbGVhckludGVydmFsKGZhc3RJbnRlcnZhbCk7IG9icy5kaXNjb25uZWN0KCk7IH0NCiAgICAgICAgfSwgMjAwKTsNCg0KICAgICAgICBjb25zdCBsb2dvVXJsID0gJ2h0dHBzOi8vdG93bi1wdWJsaWMuczMuYW1hem9uYXdzLmNvbS96aW56ZW53aW5lL3ppbnplbndpbmUud2VicCc7DQogICAgICAgIGNvbnN0IGN1cnJlbnREeW5hbWljWWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTsNCiAgICAgICAgY29uc3QgYmFzZVVybCA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47DQogICAgICAgIGNvbnN0IGNzcmZUb2tlbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT0iY3NyZi10b2tlbiJdJyk\/LmdldEF0dHJpYnV0ZSgnY29udGVudCcpIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9Il90b2tlbiJdJyk\/LnZhbHVlIHx8ICcnOw0KDQogICAgICAgIGNvbnN0IG5hdkxpbmtzID0gWw0KICAgICAgICAgICAgeyB0ZXh0OiAnSG9tZScsICAgIGhyZWY6IGAke2Jhc2VVcmx9YCB9LA0KICAgICAgICAgICAgeyB0ZXh0OiAnTWVudScsICAgIGhyZWY6IGAke2Jhc2VVcmx9L21gIH0sDQogICAgICAgICAgICB7IHRleHQ6ICdBYm91dCcsICAgaHJlZjogYCR7YmFzZVVybH0vY3VzdG9tL3BhZ2UvYWJvdXRgIH0sDQogICAgICAgICAgICB7IHRleHQ6ICdDbHViJywgICAgaHJlZjogYCR7YmFzZVVybH0vY3VzdG9tL3BhZ2UvY2x1YmAgfSwNCiAgICAgICAgICAgIHsgdGV4dDogJ0V2ZW50cycsICBocmVmOiBgJHtiYXNlVXJsfS9jdXN0b20vcGFnZS9ldmVudHNgIH0sDQogICAgICAgICAgICB7IHRleHQ6ICdDb250YWN0JywgaHJlZjogYCR7YmFzZVVybH0vY3VzdG9tL3BhZ2UvY29udGFjdGAgfQ0KICAgICAgICBdOw0KDQogICAgICAgIGNvbnN0IGN1c3RvbVRvcEJhckhUTUwgPSBgDQogICAgICAgICAgICA8ZGl2IGlkPSJ6ei10b3AtYmFyIj4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6ei10b3AtaW5uZXIiPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6ei10b3AtY29udGFjdCI+DQogICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iYmkgYmktZ2VvLWFsdC1maWxsIj48L2k+IDY4NDEgVmlyZ2luaWEgUGFya3dheSwgTWNLaW5uZXkgVFgsIFVTQTwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inp6LXRvcC1jb250YWN0Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9InRlbDo5NzI1NDc0NjIwIj48aSBjbGFzcz0iYmkgYmktdGVsZXBob25lLWZpbGwiPjwvaT4gKDk3MikgNTQ3LTQ2MjA8L2E+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIGA7DQoNCiAgICAgICAgY29uc3QgY3VzdG9tSGVhZGVySFRNTCA9IGANCiAgICAgICAgICAgIDxuYXYgaWQ9Inp6LWN1c3RvbS1oZWFkZXIiPg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inp6LWgtaW5uZXIiPg0KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIke2Jhc2VVcmx9IiBjbGFzcz0ienotYnJhbmQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9IiR7bG9nb1VybH0iIGFsdD0iWmluIFplbiBXaW5lIEJpc3RybyI+DQogICAgICAgICAgICAgICAgICAgIDwvYT4NCiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJ6ei1uYXYtbGlua3MiPg0KICAgICAgICAgICAgICAgICAgICAgICAgJHtuYXZMaW5rcy5tYXAobCA9PiBgPGxpPjxhIGhyZWY9IiR7bC5ocmVmfSIgY2xhc3M9Inp6LW5h
694di1saW5rIj4ke2wudGV4dH08L2E+PC9saT5gKS5qb2luKCcnKX0NCiAgICAgICAgICAgICAgICAgICAgPC91bD4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ienotbmF2LWFjdGlvbnMiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJHtiYXNlVXJsfS9jIiBjbGFzcz0ienotY2FydCIgYXJpYS1sYWJlbD0iU2hvcHBpbmcgQ2FydCI+PGkgY2xhc3M9ImJpIGJpLWJhZy1kYXNoLWZpbGwiPjwvaT48L2E+DQogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3RhYmxlcy5ob3N0bWVhcHAuY29tL3Jlc2VydmUvMTE4MTIiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIiBjbGFzcz0ienotYnRuLWN0YSI+Qm9vayBhIFRhYmxlPC9hPg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDwvbmF2Pg0KICAgICAgICBgOw0KDQogICAgICAgIGNvbnN0IGN1c3RvbUZvb3RlckhUTUwgPSBgDQogICAgICAgICAgICA8Zm9vdGVyIGlkPSJ6ei1jdXN0b20tZm9vdGVyIj4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6ei1mb290ZXItd3JhcCI+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inp6LWYtYmFubmVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5GaW5kIFlvdXIgWmVuLCBPbmUgUG91ciBhdCBhIFRpbWUgd2l0aCA8c3BhbiBjbGFzcz0iZHluYW1pYy13aW5lLXRleHQiPldpbmUgTG92ZXJzPC9zcGFuPjwvaDM+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inp6LWZvb3Rlci1ncmlkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6ei1mLWJyYW5kLXRpdGxlIj5aaW4gWmVuPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9Inp6LWYtZGVzYyI+TG9jYXRlZCBpbiB0aGUgaGVhcnQgb2YgTWNLaW5uZXnigJlzIEFkcmlhdGljYSBWaWxsYWdlLCBaaW4gWmVuIGlzIGEgcHJlbWllciB3aW5lIGJhciBhbmQgY3VsaW5hcnkgZGVzdGluYXRpb24uIFdlIHBhaXIgYSBjdXJhdGVkIHNlbGVjdGlvbiBvZiA4MCsgZ2xvYmFsIHdpbmVzIHdpdGggYSByZWxheGluZyBhdG1vc3BoZXJlLjwvcD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6ei1mLWNvbCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0PlF1aWNrIEFjY2VzczwvaDQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iJHtiYXNlVXJsfSI+SG9tZSBCYXNlPC9hPjwvbGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIke2Jhc2VVcmx9L20iPkJpc3RybyBNZW51PC9hPjwvbGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIke2Jhc2VVcmx9L2N1c3RvbS9wYWdlL2Fib3V0Ij5PdXIgU3Rvcnk8L2E+PC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiR7YmFzZVVybH0vY3VzdG9tL3BhZ2UvY2x1YiI+Q2x1YiBaaW48L2E+PC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiR7YmFzZVVybH0vY3VzdG9tL3BhZ2UvZXZlbnRzIj5MaXZlIEV2ZW50czwvYT48L2xpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ienotZi1jb2wiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND5CaXN0cm8gSG91cnM8L2g0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Ww0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ01vbiAtIFRodScsJzExOjAwYW0g4oCTIDEwOjAwcG0nXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydGcmkgLSBTYXQnLCcxMTowMGFtIOKAkyAxMTo1OXBtJ10sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnU3VuZGF5JywnMTE6MDBhbSDigJMgOTowMHBtJ10NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLm1hcCgoW2QsaF0pID0+IGA8ZGl2IGNsYXNzPSJ6ei1mLWhvdXJzLXJvdyI+PHNwYW4+JHtkfTwvc3Bhbj48c3Bhbj4ke2h9PC9zcGFuPjwvZGl2PmApLmpvaW4oJycpfQ0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Inp6LWYtY29sIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQ+TmV3c2xldHRlcjwvaDQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9ImZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDEuNjsgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC43NSk7IG1hcmdpbi1ib3R0b206IDE1cHg7Ij5TdWJzY3JpYmUgZm9yIHVwZGF0ZXMgYW5kIGJpc3RybyBub3RpZmljYXRpb25zLjwvcD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWZyYW1lIHNyYz0iaHR0cHM6Ly93d3cuemluemVud2luZS5jb20vZm9ybXMvemluLXplbi1uZXdzbGV0dGVyLXNpZ251cHMiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjIwMCIgZnJhbWVib3JkZXI9IjAiIHRpdGxlPSJaaW4gWmVuIE5ld3NsZXR0ZXIgU2lnbnVwcyI+PC9pZnJhbWU+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ienotbG93ZXIiPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6ei1sb3dlci1pbm5lciI+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6ei1jb3B5cmlnaHQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIMKpIENvcHlyaWdodCAke2N1cnJlbnREeW5hbWljWWVhcn0gPGEgaHJlZj0iJHtiYXNlVXJsfSI+WmluIFplbiBXaW5lIEJpc3RybzwvYT4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ienotY29tcGxpYW5jZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSJ3aW5kb3cuVENQcml2YWN5JiZ3aW5kb3cuVENQcml2YWN5Lm9wZW5QcmVmZXJlbmNlcygpIj5Qcml2YWN5IENob2ljZXM8L2J1dHRvbj48L2xpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ic2VwYXJhdG9yIj58PC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cudG93bi5jbHViL3ByaXZhY3kiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIj5Qcml2YWN5IFBvbGljeTwvYT48L2xpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ic2VwYXJhdG9yIj58PC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cudG93bi5jbHViL3Rlcm1zIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+VGVybXM8L2E+PC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2x
694hc3M9InNlcGFyYXRvciI+fDwvbGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LnRvd24uY2x1Yi9kaXNjbGFpbWVyIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+RGlzY2xhaW1lcjwvYT48L2xpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ic2VwYXJhdG9yIj58PC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iJHtiYXNlVXJsfS9jdXN0b20vcGFnZS9hY2Nlc3NpYmlsaXR5Ij5BY2Nlc3NpYmlsaXR5PC9hPjwvbGk+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3VsPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAyNXB4OyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly90b3duLmNsdWIiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIiBjbGFzcz0ienotcG93ZXJlZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgYWx0PSJQb3dlcmVkIGJ5IFRvd24iIHNyYz0iJHtiYXNlVXJsfS9hc3NldHMvaW1hZ2VzL3Bvd2VyZWRfYnlfbG9nb19uYW1lLnN2ZyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9mb290ZXI+DQogICAgICAgIGA7DQogICAgICAgIA0KICAgICAgICBjb25zdCBtYWluV3JhcHBlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluLXdyYXBwZXInKSB8fCBkb2N1bWVudC5ib2R5Ow0KICAgICAgICBtYWluV3JhcHBlci5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLCBjdXN0b21IZWFkZXJIVE1MKTsNCiAgICAgICAgbWFpbldyYXBwZXIuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywgY3VzdG9tVG9wQmFySFRNTCk7DQogICAgICAgIA0KICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgICAgIG1haW5XcmFwcGVyLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgY3VzdG9tRm9vdGVySFRNTCk7DQogICAgICAgIH0sIDMwMCk7DQoNCiAgICAgICAgY29uc3QgY3VycmVudFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCc\/JylbMF0ucmVwbGFjZSgvXC8kLywgIiIpOw0KICAgICAgICBjb25zdCBjbGVhbkJhc2VVcmwgPSBiYXNlVXJsLnJlcGxhY2UoL1wvJC8sICIiKTsNCiAgICAgICAgDQogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy56ei1uYXYtbGluaycpLmZvckVhY2gobGluayA9PiB7DQogICAgICAgICAgICBpZiAoIWxpbmsuaHJlZikgcmV0dXJuOw0KICAgICAgICAgICAgY29uc3QgbGlua1VybCA9IGxpbmsuaHJlZi5zcGxpdCgnPycpWzBdLnJlcGxhY2UoL1wvJC8sICIiKTsNCiAgICAgICAgICAgIGlmIChsaW5rVXJsID09PSBjdXJyZW50VXJsIHx8IChsaW5rVXJsICE9PSBjbGVhbkJhc2VVcmwgJiYgY3VycmVudFVybC5zdGFydHNXaXRoKGxpbmtVcmwpKSkgew0KICAgICAgICAgICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgICAgIGNvbnN0IHBocmFzZXMgPSBbIldpbmUgTG92ZXJzIiwgIkNvbm5vaXNzZXVycyIsICJTaW5jZXJlIEZyaWVuZHMiLCAiQ3VyYXRlZCBUYXN0ZXMiLCAiRWxldmF0ZWQgRGF0ZSBOaWdodHMiXTsNCiAgICAgICAgY29uc3QgcGhyYXNlQ29udGFpbmVyRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZHluYW1pYy13aW5lLXRleHQnKTsNCiAgICAgICAgaWYgKHBocmFzZUNvbnRhaW5lckVsKSB7DQogICAgICAgICAgICBsZXQgdHJhY2tlciA9IDA7DQogICAgICAgICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7DQogICAgICAgICAgICAgICAgdHJhY2tlciA9ICh0cmFja2VyICsgMSkgJSBwaHJhc2VzLmxlbmd0aDsNCiAgICAgICAgICAgICAgICBwaHJhc2VDb250YWluZXJFbC5zdHlsZS5vcGFjaXR5ID0gJzAnOw0KICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICAgICAgICAgICAgICBwaHJhc2VDb250YWluZXJFbC5pbm5lclRleHQgPSBwaHJhc2VzW3RyYWNrZXJdOw0KICAgICAgICAgICAgICAgICAgICBwaHJhc2VDb250YWluZXJFbC5zdHlsZS5vcGFjaXR5ID0gJzEnOw0KICAgICAgICAgICAgICAgIH0sIDI1MCk7DQogICAgICAgICAgICB9LCA0MDAwKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHsNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGJ1aWxkVUkpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGJ1aWxkVUkoKTsNCiAgICB9DQp9KSgpOw0KICAgIA0KICAgIA0KICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYA0KICAubWJuLWNlbnRlciwNCiAgLnNpbmdsZS1mb290ZXItd2lkZ2V0IC53aWRnZXQtaGVhZCBoNCwNCiAgLmZvb3Rlci13aWRnZXRzLXdyYXBwZXIuc3R5bGUtMiAuc2luZ2xlLWZvb3Rlci13aWRnZXQgLmZvb3Rlci1jb250ZW50IHAsDQogIHAud293LmZhZGVJbkxlZnQsDQogIC5mb290ZXItd2lkZ2V0cy13cmFwcGVyLnN0eWxlLTIgLnNpbmdsZS1mb290ZXItd2lkZ2V0IC5mb290ZXItY29udGVudCAubGluaywNCiAgLmZvb3Rlci13aWRnZXRzLXdyYXBwZXIuc3R5bGUtMiAuc2luZ2xlLWZvb3Rlci13aWRnZXQgLmZvb3Rlci1jb250ZW50IC5pbmZvLWRhdGUgbGksDQogIC5mb290ZXItYm90dG9tLnN0eWxlLTIgLmZvb3Rlci1ib3R0b20td3JhcHBlciB1bCBsaSBhDQpgKS5mb3JFYWNoKGVsID0+IHsNCiAgZWwuc3R5bGUuc2V0UHJvcGVydHkoJ2NvbG9yJywgJyNmZmYnLCAnaW1wb3J0YW50Jyk7DQp9KTsNCiAgICANCiAgICAoZnVuY3Rpb24oKSB7DQogICAgZnVuY3Rpb24gcmVwbGFjZUZvcm1Pbk1vYmlsZSgpIHsNCiAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoID4gOTkxKSByZXR1cm47DQoNCiAgICAgICAgY29uc3QgdGFyZ2V0Rm9ybSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Zvcm1bYWN0aW9uKj0iL25ld3NsZXR0ZXIvc3RvcmUiXScpOw0KICAgICAgICBpZiAodGFyZ2V0Rm9ybSkgew0KICAgICAgICAgICAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7DQogICAgICAgICAgICBpZnJhbWUuc3JjID0gJ2h0dHBzOi8vd3d3LnppbnplbndpbmUuY29tL2Zvcm1zL3ppbi16ZW4tbmV3c2xldHRlci1zaWdudXBzJzsNCiAgICAgICAgICAgIGlmcmFtZS53aWR0aCA9ICcxMDAlJzsNCiAgICAgICAgICAgIGlmcmFtZS5oZWlnaHQgPSAnMTUwJzsNCiAgICAgICAgICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoJ2ZyYW1lYm9yZGVyJywgJzAnKTsNCiAgICAgICAgICAgIGlmcmFtZS50aXRsZSA9ICdaaW4gWmVuIE5ld3NsZXR0ZXIgU2lnbnVwcyc7DQogICAgICAgICAgICBpZnJhbWUuc3R5bGUuYm9yZGVyID0gJ25vbmUnOw0KDQogICAgICAgICAgICB0YXJnZXRGb3JtLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGlmcmFtZSwgdGFyZ2V0Rm9ybSk7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gaW5pdFJlcGxhY2VtZW50KCkgew0KICAgICAgICBpZiAocmVwbGFjZUZvcm1Pbk1vYmlsZSgpKSByZXR1cm47DQoNCiAgICAgICAgbGV0IGF0dGVtcHRzID0gMDsNCiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGF0dGVtcHRzKys7DQogICAgICAgICAgICBpZiAocmVwbGFjZUZvcm1Pbk1vYmlsZSgpIHx8IGF0dGVtcHRzID49IDUwKSB7DQogICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7DQogICAgICAgICAgICB9DQogICAgICAgI
694H0sIDEwMCk7DQoNCiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGlmIChyZXBsYWNlRm9ybU9uTW9iaWxlKCkpIHsNCiAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7DQogICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgICAgIGlmIChkb2N1bWVudC5ib2R5KSB7DQogICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykgew0KICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdFJlcGxhY2VtZW50KTsNCiAgICB9IGVsc2Ugew0KICAgICAgICBpbml0UmVwbGFjZW1lbnQoKTsNCiAgICB9DQp9KSgpOw0KPC9zY3JpcHQ+"}, 695 }; 696</script>
696 697 698<div id="tc-privacy-banner" class="tc-privacy-consent-screen tc-privacy-hidden" role="presentation"> 699 <section class="tc-privacy-card" role="region" aria-labelledby="tc-privacy-banner-title" aria-describedby="tc-privacy-banner-description" tabindex="-1"> 700 <div class="tc-privacy-card__body"> 701 <div class="tc-privacy-card__eyebrow"> 702 <span class="tc-privacy-card__mark" aria-hidden="true"></span> 703 Privacy center 704 </div> 705 <h2 id="tc-privacy-banner-title" class="tc-privacy-banner__title">We respect your privacy</h2> 706 <p id="tc-privacy-banner-description" class="tc-privacy-banner__copy"> 707 We use essential cookies for ordering, security, checkout, and location selection. Analytics and marketing tools stay off unless you allow them. 708 <button type="button" class="tc-privacy-link" data-tc-privacy-open>Do Not Sell or Share / Privacy Choices</button> 709 </p> 710 <ul class="tc-privacy-summary" aria-label="Cookie categories"> 711 <li> 712 <span class="tc-privacy-summary__check" aria-hidden="true">â</span> 713 <span> 714 <strong>Necessary cookies are always on</strong> 715 <span>These keep the cart, checkout, fraud protection, selected business, and storefront scripts working.</span> 716 </span> 717 </li> 718 <li> 719 <span class="tc-privacy-summary__check" aria-hidden="true">â</span> 720 <span> 721 <strong>Analytics is optional</strong> 722 <span>Page view attribution starts only after you allow analytics.</span> 723 </span> 724 </li> 725 <li> 726 <span class="tc-privacy-summary__check" aria-hidden="true">â</span> 727 <span> 728 <strong>Marketing is optional</strong> 729 <span>Pixels and targeted advertising load only after marketing consent.</span> 730 </span> 731 </li> 732 </ul> 733 </div> 734 <div class="tc-privacy-card__footer"> 735 <div class="tc-privacy-banner__actions"> 736 <button type="button" class="tc-privacy-btn tc-privacy-btn--primary" data-tc-privacy-accept>Accept all</button> 737 <button type="button" class="tc-privacy-btn" data-tc-privacy-open>Manage settings</button> 738 <button type="button" class="tc-privacy-btn tc-privacy-btn--muted" data-tc-privacy-reject>Necessary only</button> 739 </div> 740 </div> 741 </section> 742</div> 743 744<div id="tc-privacy-modal" class="tc-privacy-backdrop tc-privacy-hidden" role="presentation"> 745 <div class="tc-privacy-modal" role="dialog" aria-modal="true" aria-labelledby="tc-privacy-modal-title" tabindex="-1"> 746 <button type="button" class="tc-privacy-modal__close" aria-label="Close privacy preferences" data-tc-privacy-close>×</button> 747 <div class="tc-privacy-modal__header"> 748 <h2 id="tc-privacy-modal-title" class="tc-privacy-modal__title">Manage privacy choices</h2> 749 <p class="tc-privacy-modal__copy">Choose how this site can use non-essential tracking. You can change this anytime from the footer.</p> 750 <div id="tc-privacy-gpc" class="tc-privacy-gpc tc-privacy-hidden"> 751 Your browser is sending a Global Privacy Control signal. Marketing, targeted advertising, and sale/share style processing will remain off for this browser. 752 </div> 753 </div> 754 <div class="tc-privacy-modal__tabs" role="tablist" aria-label="Privacy settings sections"> 755 <button type="button" class="tc-privacy-tab" role="tab" aria-selected="true" aria-controls="tc-privacy-panel-consent" id="tc-privacy-tab-consent" data-tc-privacy-tab="consent">Consent</button> 756 <button type="button" class="tc-privacy-tab" role="tab" aria-selected="false" aria-controls="tc-privacy-panel-details" id="tc-privacy-tab-details" data-tc-privacy-tab="details">Details</button> 757 <button type="button" class="tc-privacy-tab" role="tab" aria-selected="false" aria-controls="tc-privacy-panel-about" id="tc-privacy-tab-about" data-tc-privacy-tab="about">About</button> 758 </div> 759 <div class="tc-privacy-modal__body"> 760 <section class="tc-privacy-panel" role="tabpanel" aria-labelledby="tc-privacy-tab-consent" id="tc-privacy-panel-consent" data-tc-privacy-panel="consent"> 761 <p class="tc-privacy-panel__lead"> 762 Essential cookies stay on so ordering, checkout, forms, business selection, and security work correctly. You control analytics and marketing below.
763 </p> 764 <label class="tc-privacy-option"> 765 <span> 766 <strong>Strictly necessary</strong> 767 <span>Required for security, checkout, forms, business selection, configured storefront scripts, and core site functionality. These cannot be turned off here.</span> 768 </span> 769 <input type="checkbox" checked disabled> 770 </label> 771 <label class="tc-privacy-option"> 772 <span> 773 <strong>Analytics</strong> 774 <span>Allows first-party page view analytics, attribution, referrer, UTM, and performance signals so the business can understand site activity.</span> 775 </span> 776 <input type="checkbox" data-tc-privacy-category="analytics"> 777 </label> 778 <label class="tc-privacy-option"> 779 <span> 780 <strong>Marketing and targeted advertising</strong> 781 <span>Allows pixels, advertising scripts, and targeted advertising. Turning this off is treated as an opt-out of sale/share or targeted advertising where applicable.</span> 782 </span> 783 <input type="checkbox" data-tc-privacy-category="marketing"> 784 </label> 785 </section> 786 <section class="tc-privacy-panel" role="tabpanel" aria-labelledby="tc-privacy-tab-details" id="tc-privacy-panel-details" data-tc-privacy-panel="details" hidden> 787 <p class="tc-privacy-panel__lead"> 788 The site separates cookies by purpose. Essential functionality is always available; optional categories are only enabled after your choice. 789 </p> 790 <label class="tc-privacy-option"> 791 <span> 792 <strong>Necessary cookies</strong> 793 <span>Used for cart, checkout, CSRF protection, business selection, security, form flow, and configured storefront scripts. These are needed for the service to work.</span> 794 </span> 795 <input type="checkbox" checked disabled> 796 </label> 797 <label class="tc-privacy-option"> 798 <span> 799 <strong>Analytics cookies</strong> 800 <span>Used for page view attribution, referrer, UTM, and performance reporting. These do not run until analytics is allowed.</span> 801 </span> 802 <input type="checkbox" data-tc-privacy-category="analytics"> 803 </label> 804 <label class="tc-privacy-option"> 805 <span> 806 <strong>Marketing cookies</strong> 807 <span>Used for advertising pixels and targeted advertising. These do not load until marketing is allowed.</span> 808 </span> 809 <input type="checkbox" data-tc-privacy-category="marketing"> 810 </label> 811 </section> 812 <section class="tc-privacy-panel" role="tabpanel" aria-labelledby="tc-privacy-tab-about" id="tc-privacy-panel-about" data-tc-privacy-panel="about" hidden> 813 <p class="tc-privacy-panel__lead"> 814 You can accept, reject, or update non-essential cookie choices at any time. Global Privacy Control signals are respected for marketing and sale/share style processing. 815 </p> 816 <ul class="tc-privacy-about-list"> 817 <li><a href="https://www.town.club/privacy" target="_blank" rel="noopener">Privacy Policy</a></li> 818 <li><a href="https://www.town.club/terms" target="_blank" rel="noopener">Terms</a></li> 819 <li><a href="https://www.town.club/disclaimer" target="_blank" rel="noopener">Disclaimer</a></li> 820 </ul> 821 </section> 822 </div> 823 <div class="tc-privacy-modal__footer"> 824 <a class="tc-privacy-link" href="https://www.town.club/privacy" target="_blank" rel="noopener">Privacy Policy</a> 825 <div class="tc-privacy-modal__actions"> 826 <button type="button" class="tc-privacy-btn" data-tc-privacy-reject>Necessary only</button> 827 <button type="button" class="tc-privacy-btn tc-privacy-btn--dark" data-tc-privacy-save>Save choices</button> 828 <button type="button" class="tc-privacy-btn tc-privacy-btn--primary" data-tc-privacy-accept>Accept all</button> 829 </div> 830 </div> 831 </div> 832</div> 833
834<script> 835 (function () { 836 const config = window.TC_PRIVACY_CONFIG || {}; 837 const storageKey = `tc_privacy_preferences_v${config.version || 1}`; 838 const consentCookieName = 'tc_privacy_consent'; 839 const gpcEnabled = navigator.globalPrivacyControl === true; 840 let currentPreferences = null; 841 let customScriptsLoaded = false; 842 const listeners = []; 843 const privacyLockClass = 'tc-privacy-lock'; 844 845 function bannerElement() { 846 return document.getElementById('tc-privacy-banner'); 847 } 848 849 function modalElement() { 850 return document.getElementById('tc-privacy-modal'); 851 } 852 853 function hasSavedChoice() { 854 return Boolean(currentPreferences && currentPreferences.savedAt); 855 } 856 857 function elementIsOpen(element) { 858 return Boolean(element && !element.classList.contains('tc-privacy-hidden')); 859 } 860 861 function refreshLockState() { 862 document.documentElement.classList.toggle( 863 privacyLockClass, 864 elementIsOpen(bannerElement()) || elementIsOpen(modalElement()) 865 ); 866 } 867 868 function focusElement(element) { 869 if (!element || typeof element.focus !== 'function') { 870 return; 871 } 872 873 window.setTimeout(function () { 874 try { 875 element.focus({ preventScroll: true }); 876 } catch (error) { 877 element.focus(); 878 } 879 }, 0); 880 } 881 882 function defaultPreferences() { 883 return { 884 necessary: true, 885 analytics: false, 886 marketing: false, 887 saleShare: false, 888 savedAt: null, 889 gpc: gpcEnabled, 890 consentId: null, 891 }; 892 } 893 894 function normalizePreferences(preferences) { 895 const normalized = Object.assign(defaultPreferences(), preferences || {}); 896 normalized.necessary = true; 897 normalized.analytics = normalized.analytics === true; 898 normalized.marketing = normalized.marketing === true; 899 normalized.saleShare = normalized.saleShare === true; 900 normalized.gpc = gpcEnabled; 901 normalized.consentId = normalized.consentId || null; 902 903 if (gpcEnabled) { 904 normalized.marketing = false; 905 normalized.saleShare = false; 906 } 907 908 return normalized; 909 } 910 911 function loadSavedPreferences() { 912 try { 913 const raw = localStorage.getItem(storageKey); 914 return raw ? normalizePreferences(JSON.parse(raw)) : null; 915 } catch (error) { 916 return null; 917 } 918 } 919 920 function makeConsentId() { 921 if (window.crypto?.randomUUID) { 922 return window.crypto.randomUUID(); 923 } 924 925 return `tc-${Date.now()}-${Math.random().toString(16).slice(2)}`; 926 } 927 928 function setDecisionPending() { 929 document.querySelectorAll('[data-tc-privacy-accept], [data-tc-privacy-reject], [data-tc-privacy-save]').forEach(function (button) { 930 button.disabled = true; 931 }); 932 } 933 934 function reloadAfterConsent() { 935 window.setTimeout(function () { 936 window.location.reload(); 937 }, 80); 938 } 939 940 function savePreferences(preferences, action) { 941 setDecisionPending(); 942 943 currentPreferences = normalizePreferences(Object.assign({}, preferences, { 944 consentId: preferences.consentId || currentPreferences?.consentId || makeConsentId(), 945 savedAt: new Date().toISOString(), 946 })); 947 948 try { 949 localStorage.setItem(storageKey, JSON.stringify(currentPreferences)); 950 } catch (error) {} 951 952 saveConsentCookie(currentPreferences); 953 const consentSaved = recordConsent(action || 'save_choices', currentPreferences); 954 applyPreferences(currentPreferences); 955 hideBanner(); 956 hideModal(); 957 958 consentSaved.finally(reloadAfterConsent); 959 } 960 961 function saveConsentCookie(preferences) { 962 try { 963 const payload = { 964 version: config.version || 1, 965 analytics: preferences.analytics === true, 966 marketing: preferences.marketing === true, 967 saleShare: preferences.saleShare === true, 968 gpc: gpcEnabled, 969 consentId: preferences.consentId || null, 970 savedAt: preferences.savedAt || new Date().toISOString(), 971 }; 972 const encoded = btoa(JSON.stringify(payload)) 973 .replace(/\+/g, '-') 974 .replace(/\//g, '_') 975 .replace(/=+$/g, ''); 976 const secure = window.location.protocol === 'https:' ? '; Secure' : ''; 977 document.cookie = `${consentCookieName}=${encoded}; Max-Age=31536000; Path=/; SameSite=Lax${secure}`; 978 } catch (error) {} 979 } 980 981 function recordConsent(action, preferences) { 982 if (!config.consentUrl) { 983 return Promise.resolve(); 984 } 985 986 try { 987 const request = fetch(config.consentUrl, { 988 method: 'POST', 989 headers: { 990 'Content-Type': 'application/json', 991 'Accept': 'application/json', 992 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]')?.getAttribute('content') || '', 993 }, 994 body: JSON.stringify({ 995 consent_id: preferences.consentId, 996 action, 997 preferences, 998 privacy_policy_url: config.privacyUrl || '', 999 page_url: window.location.href, 1000 }), 1001 keepalive: true, 1002 }).catch(() => {}); 1003 1004 return Promise.race([ 1005 request, 1006 new Promise(function (resolve) { 1007 window.setTimeout(resolve, 1200); 1008 }), 1009 ]); 1010 } catch (error) { 1011 return Promise.resolve(); 1012 } 1013 } 1014 1015 function canUse(category) { 1016 const preferences = currentPreferences || defaultPreferences(); 1017 1018 if (category === 'necessary') { 1019 return true; 1020 } 1021 1022 if ((category === 'marketing' || category === 'saleShare') && gpcEnabled) { 1023 return false;
1024 } 1025 1026 return preferences[category] === true; 1027 } 1028 1029 function decodeBase64(value) { 1030 if (!value) { 1031 return ''; 1032 } 1033 1034 try { 1035 const binary = atob(value); 1036 const bytes = new Uint8Array(binary.length); 1037 for (let index = 0; index < binary.length; index += 1) { 1038 bytes[index] = binary.charCodeAt(index); 1039 } 1040 1041 if (window.TextDecoder) { 1042 return new TextDecoder().decode(bytes); 1043 } 1044 1045 let decoded = ''; 1046 bytes.forEach(function (byte) { 1047 decoded += String.fromCharCode(byte); 1048 }); 1049 1050 return decoded; 1051 } catch (error) { 1052 return ''; 1053 } 1054 } 1055 1056 function appendNode(target, node, anchor) { 1057 if (node.nodeType === Node.ELEMENT_NODE && node.tagName.toLowerCase() === 'script') { 1058 const script = document.createElement('script'); 1059 Array.from(node.attributes).forEach(function (attribute) { 1060 script.setAttribute(attribute.name, attribute.value); 1061 }); 1062 script.text = node.textContent || ''; 1063 if (anchor) { 1064 target.insertBefore(script, anchor); 1065 return; 1066 } 1067 1068 target.appendChild(script); 1069 return; 1070 } 1071 1072 const clone = node.cloneNode(true); 1073 if (anchor) { 1074 target.insertBefore(clone, anchor); 1075 return; 1076 } 1077 1078 target.appendChild(clone); 1079 } 1080 1081 function appendHtml(target, encodedHtml, prepend) { 1082 const html = decodeBase64(encodedHtml); 1083 if (!html.trim()) { 1084 return; 1085 } 1086 1087 const template = document.createElement('template'); 1088 template.innerHTML = html; 1089 const anchor = prepend ? target.firstChild : null; 1090 Array.from(template.content.childNodes).forEach(function (node) { 1091 appendNode(target, node, anchor); 1092 }); 1093 } 1094 1095 function loadCustomScripts() { 1096 if (customScriptsLoaded) { 1097 return; 1098 } 1099 1100 customScriptsLoaded = true; 1101 const scripts = config.scripts || {}; 1102 appendHtml(document.head, scripts.head || '', false); 1103 appendHtml(document.body, scripts.bodyStart || '', true); 1104 appendHtml(document.body, scripts.bodyEnd || '', false); 1105 } 1106 1107 function notifyListeners() { 1108 const snapshot = getPreferences(); 1109 listeners.forEach(function (callback) { 1110 try { 1111 callback(snapshot); 1112 } catch (error) {} 1113 }); 1114 document.dispatchEvent(new CustomEvent('tc:privacy-consent', { detail: snapshot })); 1115 } 1116 1117 function applyPreferences(preferences) { 1118 currentPreferences = normalizePreferences(preferences); 1119 syncForm(currentPreferences); 1120 loadCustomScripts(); 1121 notifyListeners(); 1122 } 1123 1124 function getPreferences() { 1125 return Object.assign({}, currentPreferences || defaultPreferences()); 1126 } 1127 1128 function showBanner() { 1129 const banner = bannerElement(); 1130 banner?.classList.remove('tc-privacy-hidden'); 1131 refreshLockState(); 1132 focusElement(banner?.querySelector('.tc-privacy-card')); 1133 } 1134 1135 function hideBanner() { 1136 bannerElement()?.classList.add('tc-privacy-hidden'); 1137 refreshLockState(); 1138 } 1139 1140 function showModal() { 1141 hideBanner(); 1142 syncForm(currentPreferences || defaultPreferences()); 1143 showTab('consent'); 1144 const modal = modalElement(); 1145 modal?.classList.remove('tc-privacy-hidden'); 1146 refreshLockState(); 1147 focusElement(modal?.querySelector('.tc-privacy-modal')); 1148 } 1149 1150 function hideModal() { 1151 modalElement()?.classList.add('tc-privacy-hidden'); 1152
1153 if (!hasSavedChoice()) { 1154 showBanner(); 1155 return; 1156 } 1157 1158 refreshLockState(); 1159 } 1160 1161 function showTab(tabName) { 1162 document.querySelectorAll('[data-tc-privacy-tab]').forEach(function (button) { 1163 const isSelected = button.getAttribute('data-tc-privacy-tab') === tabName; 1164 button.setAttribute('aria-selected', isSelected ? 'true' : 'false'); 1165 button.setAttribute('tabindex', isSelected ? '0' : '-1'); 1166 }); 1167 1168 document.querySelectorAll('[data-tc-privacy-panel]').forEach(function (panel) { 1169 panel.hidden = panel.getAttribute('data-tc-privacy-panel') !== tabName; 1170 }); 1171 } 1172 1173 function syncForm(preferences) { 1174 document.querySelectorAll('[data-tc-privacy-category]').forEach(function (input) { 1175 const category = input.getAttribute('data-tc-privacy-category'); 1176 input.checked = preferences[category] === true; 1177 input.disabled = gpcEnabled && category === 'marketing'; 1178 }); 1179 1180 const gpcNotice = document.getElementById('tc-privacy-gpc'); 1181 if (gpcNotice) { 1182 gpcNotice.classList.toggle('tc-privacy-hidden', !gpcEnabled); 1183 } 1184 } 1185 1186 function syncCategory(category, checked, source) { 1187 document.querySelectorAll(`[data-tc-privacy-category="${category}"]`).forEach(function (input) { 1188 if (input !== source) { 1189 input.checked = checked; 1190 } 1191 }); 1192 } 1193 1194 function readFormPreferences() { 1195 const preferences = defaultPreferences(); 1196 const categories = new Set(); 1197 document.querySelectorAll('[data-tc-privacy-category]').forEach(function (input) { 1198 categories.add(input.getAttribute('data-tc-privacy-category')); 1199 }); 1200 categories.forEach(function (category) { 1201 preferences[category] = Array.from(document.querySelectorAll(`[data-tc-privacy-category="${category}"]`)) 1202 .some(function (input) { 1203 return input.checked === true; 1204 }); 1205 }); 1206 preferences.saleShare = preferences.marketing; 1207 1208 return preferences; 1209 } 1210 1211 function acceptAll() { 1212 savePreferences({ 1213 necessary: true, 1214 analytics: true, 1215 marketing: !gpcEnabled, 1216 saleShare: !gpcEnabled, 1217 gpc: gpcEnabled, 1218 }, 'accept_all'); 1219 } 1220 1221 function rejectNonEssential() { 1222 savePreferences(defaultPreferences(), 'necessary_only'); 1223 } 1224
1225 function bindControls() { 1226 document.querySelectorAll('[data-tc-privacy-open]').forEach(function (button) { 1227 button.addEventListener('click', showModal); 1228 }); 1229 1230 document.querySelectorAll('[data-tc-privacy-tab]').forEach(function (button) { 1231 button.addEventListener('click', function () { 1232 showTab(button.getAttribute('data-tc-privacy-tab')); 1233 }); 1234 }); 1235 1236 document.querySelectorAll('[data-tc-privacy-category]').forEach(function (input) { 1237 input.addEventListener('change', function () { 1238 syncCategory(input.getAttribute('data-tc-privacy-category'), input.checked === true, input); 1239 }); 1240 }); 1241 1242 document.querySelectorAll('[data-tc-privacy-accept]').forEach(function (button) { 1243 button.addEventListener('click', acceptAll); 1244 }); 1245 1246 document.querySelectorAll('[data-tc-privacy-reject]').forEach(function (button) { 1247 button.addEventListener('click', rejectNonEssential); 1248 }); 1249 1250 document.querySelectorAll('[data-tc-privacy-save]').forEach(function (button) { 1251 button.addEventListener('click', function () { 1252 savePreferences(readFormPreferences()); 1253 }); 1254 }); 1255 1256 document.querySelectorAll('[data-tc-privacy-close]').forEach(function (button) { 1257 button.addEventListener('click', hideModal); 1258 }); 1259 1260 modalElement()?.addEventListener('click', function (event) { 1261 if (event.target === event.currentTarget) { 1262 hideModal(); 1263 } 1264 }); 1265 1266 document.addEventListener('keydown', function (event) { 1267 if (event.key === 'Escape' && elementIsOpen(modalElement())) { 1268 hideModal(); 1269 } 1270 }); 1271 } 1272 1273 window.TCPrivacy = { 1274 acceptAll, 1275 canUse, 1276 getPreferences, 1277 onConsentChange(callback) { 1278 if (typeof callback === 'function') { 1279 listeners.push(callback); 1280 callback(getPreferences()); 1281 } 1282 }, 1283 openPreferences: showModal, 1284 rejectNonEssential, 1285 savePreferences, 1286 }; 1287 1288 document.addEventListener('DOMContentLoaded', function () { 1289 bindControls(); 1290 1291 const saved = loadSavedPreferences(); 1292 if (saved) { 1293 saveConsentCookie(saved); 1294 applyPreferences(saved); 1295 return; 1296 } 1297 1298 applyPreferences(defaultPreferences()); 1299 showBanner(); 1300 }); 1301 })(); 1302</script>
1302 1303 1304 1305<div id="preloader" class="preloader"> 1306 <div class="animation-preloader"> 1307 <div class="spinner"></div> 1308 <p class="text-center">Loading</p> 1309 </div> 1310 <div class="loader"><div class="row"> 1311 <div class="col-3 loader-section section-left"><div class="bg"></div></div> 1312 <div class="col-3 loader-section section-left"><div class="bg"></div></div> 1313 <div class="col-3 loader-section section-right"><div class="bg"></div></div> 1314 <div class="col-3 loader-section section-right"><div class="bg"></div></div> 1315 </div></div> 1316</div> 1317 1318<div id="social-sidebar"> 1319 <ul> 1320 <li> 1321 <a href="https://www.facebook.com/ZinZenWine/" target="_blank" aria-label="FACEBOOK"> 1322 <i class="fab fa-facebook"></i> 1323 </a> 1324 </li> 1325 <li> 1326 <a href="https://www.instagram.com/zin_zen_wine_bistro/" target="_blank" aria-label="INSTAGRAM"> 1327 <i class="fab fa-instagram"></i> 1328 </a> 1329 </li> 1330 </ul> 1331</div> 1332 1333<div id="main-wrapper"> 1334 <style> 1335 .business-selector-action { 1336 height: 56px !important; 1337 border-radius: 999px !important; 1338 background: var(--theme) !important; 1339 color: var(--text) !important; 1340 border: 1px solid rgba(0, 0, 0, 0.08) !important; 1341 display: inline-flex !important; 1342 align-items: center !important; 1343 justify-content: center !important; 1344 padding: 0 18px !important; 1345 font-weight: 900 !important; 1346 letter-spacing: 0.6px !important; 1347 text-transform: uppercase !important; 1348 box-shadow: 0 10px 22px rgba(0, 0, 0, 0.14) !important; 1349 } 1350 1351 .business-selector-action:disabled { 1352 opacity: 0.65 !important; 1353 box-shadow: none !important; 1354 } 1355 1356 body.tc-business-selector-open .mobile-bottom-nav { 1357 opacity: 0 !important; 1358 visibility: hidden !important; 1359 pointer-events: none !important; 1360 } 1361</style> 1362 1363<div 1364 class="modal fade" 1365 id="tcBusinessSelectorModal" 1366 tabindex="-1" 1367 aria-labelledby="businessSelectorLabel" 1368 aria-describedby="businessSelectorDescription" 1369 data-switch-url="https://www.zinzenwine.com/context/switch-business" 1370 data-csrf-token="QUAY7qp3f9vxznTgECZV7rSPGioc1ts6bDtSsma9" 1371 data-current-business-id="168" 1372 data-auto-open="0" 1373 data-has-cart="0" 1374 data-google-maps-key="AIzaSyBR2DmXKK6EypRvjknGtRFi9zQ_NS-6N5U" 1375> 1376 <div class="modal-dialog modal-dialog-centered modal-md modal-dialog-scrollable"> 1377 <div class="modal-content border-0 shadow"> 1378 <div class="modal-header border-0 pb-0"> 1379 <div> 1380 <h2 class="modal-title fs-4" id="businessSelectorLabel">Select location</h2> 1381 </div> 1382 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> 1383 </div> 1384 1385 <div class="modal-body pt-3"> 1386 <p id="businessSelectorDescription" class="text-muted mb-3">Choose where you want to order from.</p> 1387 1388 <div class="rounded-3 border bg-light p-2 mb-3" aria-label="Current location"> 1389 <div class="d-flex align-items-center gap-2"> 1390 <span class="text-success px-1" aria-hidden="true"><i class="fas fa-map-marker-alt"></i></span> 1391 <div class="min-w-0"> 1392 <div class="d-flex flex-wrap align-items-center gap-2 mb-1"> 1393 <span class="fw-semibold" id="businessSelectorCurrentName">Zin Zen Wine Bistro</span> 1394 <span class="badge bg-success-subtle text-success-emphasis">Current</span> 1395 </div> 1396 <div class="small text-muted lh-sm"> 1397 6841 Virginia Parkway, McKinney TX, USA 1398 </div> 1399 </div> 1400 </div> 1401 </div> 1402 1403 <form id="tcBusinessSelectorForm" novalidate> 1404 <div class="position-relative rounded-3 overflow-hidden border mb-3"> 1405 <div 1406 id="businessSelectorMap" 1407 class="business-selector-map" 1408 role="group" 1409 aria-label="Map of available locations" 1410 style="height:220px;min-height:220px;background:#f3f5f7" 1411 ></div> 1412 <div 1413 id="businessSelectorMapLoading" 1414 class="business-selector-map-loading d-flex align-items-center justify-content-center" 1415 role="status" 1416 style="position:absolute;inset:0;background:rgba(243,245,247,.88);z-index:2" 1417 >
1418 <span class="spinner-border spinner-border-sm text-secondary" aria-hidden="true"></span> 1419 <span class="visually-hidden">Loading map</span> 1420 </div> 1421 </div> 1422 <div id="businessSelectorMapMessage" class="small text-muted mb-3 d-none" role="status"></div> 1423 1424 <label for="business" class="form-label fw-semibold">Location</label> 1425 <select id="business" name="business_id" class="form-select form-select-lg" required> 1426 <option 1427 value="168" 1428 data-name="Zin Zen Wine Bistro" 1429 data-address="6841 Virginia Parkway, McKinney TX, USA" 1430 data-logo="https://town-files-production.s3.amazonaws.com/uploads/165/business_v0p1m51ZxXHOe7V.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=feab9acadf1d83135677ff0c9b9b99de1351e4a3d37610c67caaff98fa28464f" 1431 data-phone="(972) 547-4620" 1432 data-lat="33.1982988" 1433 data-lng="-96.7069675" 1434 selected > 1435 Zin Zen Wine Bistro â 6841 Virginia Parkway, McKinney TX, USA </option> 1436 </select> 1437 1438 <div id="businessSelectorCartWarning" class="alert alert-warning mt-3 mb-0 d-none" role="alert"> 1439 <div class="fw-semibold">Changing locations may clear your cart.</div> 1440 <div class="small">Menu items and prices can vary by location.</div> 1441 <div id="businessSelectorCartConfirmation" class="small fw-semibold mt-2 d-none"> 1442 This cart is not compatible with the selected location. Select Change location again to clear it and continue. 1443 </div> 1444 </div> 1445 1446 <div id="businessSelectorError" class="alert alert-danger mt-3 mb-0 d-none" role="alert"></div> 1447 <div id="businessSelectorStatus" class="visually-hidden" role="status" aria-live="polite"></div> 1448 1449 <div class="mt-4 d-grid gap-2"> 1450 <button type="submit" id="businessSelectorSubmit" class="btn business-selector-action w-100"> 1451 <span class="business-selector-submit-label">Keep location</span> 1452 <span class="business-selector-submit-loading d-none" aria-hidden="true"> 1453 <span class="spinner-border spinner-border-sm me-2"></span>Changing location⦠1454 </span> 1455 </button> 1456 <button type="button" id="businessSelectorCancel" class="btn btn-link text-secondary fw-semibold" data-bs-dismiss="modal"> 1457 Cancel 1458 </button> 1459 </div> 1460 </form> 1461 </div> 1462 </div> 1463 </div> 1464</div> 1465 1466 <div class="header-top header-top-6"> 1467 <div class="container"> 1468 <div class="header-top-wrapper style-6"> 1469 <ul> 1470 <li> 1471 <i class="fas fa-map-marker-alt"></i> 1472 <div class="business-select-wrapper"> 1473 1474 <select 1475 id="business-selector" 1476 class="form-select business-selector" 1477 aria-label="Select location"> 1478 <option 1479 value="168" 1480 data-name="Zin Zen Wine Bistro" 1481 data-lat="33.1982988" 1482 data-lng="-96.7069675" 1483 data-logo="https://town-files-production.s3.amazonaws.com/uploads/165/business_v0p1m51ZxXHOe7V.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&
1483X-Amz-Signature=feab9acadf1d83135677ff0c9b9b99de1351e4a3d37610c67caaff98fa28464f" 1484 data-phone="(972) 547-4620" 1485 selected > 1486 Zin Zen Wine Bistro â 6841 Virginia Parkway, McKinney TX, USA </option> 1487 </select> 1488 </div> 1489 </li> 1490 </ul> 1491 1492 <div class="top-right"> 1493 <div class="social-icon d-flex align-items-center"> 1494 <ul> 1495 1496 1497 1498 <li> 1499 <a href="https://www.zinzenwine.com/login/phone"> 1500 <i class="fas fa-sign-in-alt"></i> Login 1501 </a> 1502 </li> 1503 </ul> 1504 </div> 1505 </div> 1506 </div> 1507 </div> 1508</div> 1509 1510<div class="header-middle-section sticky-header" id="header-middle-section"> 1511 <div class="container"> 1512 <div class="header-middle-wrapper"> 1513 <div class="middle-header-logo" id="selected-business-logo"> 1514 <a href="https://www.zinzenwine.com"> 1515 <img src="https://town-files-production.s3.amazonaws.com/uploads/165/business_v0p1m51ZxXHOe7V.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&X-Amz-Signature=feab9acadf1d83135677ff0c9b9b99de1351e4a3d37610c67caaff98fa28464f" alt="Zin Zen Wine Bistro" loading="eager"> 1516 </a> 1517 </div> 1518 <form action="https://www.zinzenwine.com/products" method="GET" class="search-toggle-box d-md-block"> 1519 <div class="input-area"> 1520 <input type="text" name="search" placeholder="Search"> 1521 <button type="submit" class="cmn-btn"> 1522 <i class="far fa-search"></i> 1523 </button> 1524 </div> 1525 </form> 1526 <div class="middle-header-right"> 1527 <div class="icon-items"> 1528 <i class="far fa-phone-alt"></i> 1529 <div class="content"> 1530 <p id="business-status" style="color: red">Closed Now</p> 1531 <h5> 1532 <a href="tel:(972) 547-4620" id="business-phone"> 1533 (972) 547-4620 1534 </a> 1535 </h5> 1536 </div> 1537 </div> 1538 1539 <div class="menu-cart"> 1540 1541 <a href="https://www.zinzenwine.com/c" class="cart-icon js-cart-icon-counter" data-count="0"> 1542 <i class="far fa-shopping-basket"></i> 1543 </a> 1544</div> 1545 </div> 1546 </div> 1547 </div> 1548</div> 1549 1550<header id="header-sticky" class="header-1 style-6"> 1551 <div class="container"> 1552 <div class="mega-menu-wrapper"> 1553 <div class="header-main"> 1554 <div class="logo"> 1555 <a href="https://www.zinzenwine.com" class="header-logo"> 1556 <img src="https://town-files-production.s3.amazonaws.com/uploads/165/business_v0p1m51ZxXHOe7V.png?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA3LL3ZEZ4YBDCNZYQ%2F20260924%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260924T113158Z&X-Amz-SignedHeaders=host&X-Amz-Expires=43200&
1556X-Amz-Signature=feab9acadf1d83135677ff0c9b9b99de1351e4a3d37610c67caaff98fa28464f" alt="Zin Zen Wine Bistro" loading="eager"> 1557 </a> 1558 </div> 1559 <div class="header-right d-flex justify-content-end align-items-center"> 1560 <div class="mean__menu-wrapper d-none d-lg-block"> 1561 <div class="main-menu"> 1562 <nav id="mobile-menu"> 1563 <ul> 1564 1565 <li class="has-dropdown active"> 1566 <a href="https://www.zinzenwine.com">Home</a> 1567 </li> 1568 1569 1570 1571 1572 1573 <li> 1574 <a href="https://www.zinzenwine.com/m"> 1575 Menu 1576 </a> 1577 </li> 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 <li><a href="https://www.zinzenwine.com/custom/page/about">About</a></li> 1596 <li><a href="https://www.zinzenwine.com/custom/page/club">Club</a></li> 1597 <li><a href="https://www.zinzenwine.com/custom/page/events">Events</a></li> 1598 <li><a href="https://www.zinzenwine.com/custom/page/contact">Contact</a></li> 1599 <li><a href="https://www.zinzenwine.com/c">Cart</a></li> 1600 </ul> 1601 </nav> 1602 </div> 1603 </div> 1604 <div class="sidebar__toggle" id="mobileSidebarToggle" style="background-color: white; padding: 12px 8px; border-radius: 5px; display: none;"> 1605 <div class="header-bar"> 1606 <span style="background: black!important;"></span> 1607 <span style="background: black!important;"></span> 1608 <span style="background: black!important;"></span> 1609 </div> 1610 </div> 1611 </div> 1612 </div> 1613 </div> 1614 </div> 1615</header> 1616 1617<div class="fix-area"> 1618 <div class="offcanvas__info"> 1619 <div class="offcanvas__wrapper"> 1620 <div class="offcanvas__content"> 1621 <div class="offcanvas__top mb-5 d-flex justify-content-between align-items-center"> 1622 <div class="offcanvas__logo"></div> 1623 <div class="offcanvas__close"><button><i class="fas fa-times"></i></button></div> 1624 </div> 1625 <div class="mobile-menu fix mb-3"></div> 1626 <div class="offcanvas__contact"> 1627 <h4>Contact Us</h4> 1628 <ul> 1629 <li class="d-flex align-items-center"> 1630 <div class="offcanvas__contact-icon"> 1631 <i class="fal fa-map-marker-alt"></i> 1632 </div> 1633 <div class="offcanvas__contact-text"> 1634 <a href="#">6841 Virginia Parkway, McKinney TX, USA</a> 1635 </div> 1636 </li> 1637 1638 <li class="d-flex align-items-center"> 1639 <div class="offcanvas__contact-icon mr-15"> 1640 <i class="fal fa-envelope"></i> 1641 </div> 1642 <div class="offcanvas__contact-text"> 1643 <a href="/cdn-cgi/l/email-protection#a8ebc7c6dcc9cbdce8d2c1c6d2cdc6dfc1c6cd86cbc7c5"><span class="__cf_email__" data-cfemail="a4e7cbcad0c5c7d0e4decdcadec1cad3cdcac18ac7cbc9">[email protected]</span></a> 1644 </div> 1645 </li> 1646 1647 <li class="d-flex align-items-center"> 1648 <div class="offcanvas__contact-icon mr-15"> 1649 <i class="far fa-phone"></i> 1650 </div> 1651 <div class="offcanvas__contact-text"> 1652 <a href="tel:(972) 547-4620">(972) 547-4620</a> 1653 </div> 1654 </li> 1655 </ul> 1656 </div> 1657 </div> 1658 </div> 1659 </div> 1660</div> 1661<div class="offcanvas__overlay"></div> 1662 1663 1664 1665 1666 <main> 1667 1668 1669 1670 <section class="dynamic-page-section section-padding"> 1671 <div class="container"> 1672 <div class="row"> 1673 <div class="col-lg-10 offset-lg-1"> 1674 <div class="page-content-rendered wow fadeInUp" data-wow-delay=".5s"> 1675 <body><div id="ixj5"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.min.css"/>
1675<link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin=""/><link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,600;0,700;1,400&family=Montserrat:wght@300;400;500;600&display=swap" rel="stylesheet"/><div class="main-content"><div class="texture-overlay"> 1676 </div><div class="page-header fade-up"><div class="header-watermark">2006 1677 </div><div class="header-content"><span class="accent-line"></span><h1>Our Story 1678 </h1><p>Est. 2006 ⢠Adriatica Village ⢠McKinney, TX 1679 </p></div></div><section><div class="story-split fade-up"><div class="story-img-container"><img src="https://town-public.s3.amazonaws.com/zinzenwine/hero2.webp" alt="Zin Zen Exterior" class="story-img"/></div><div class="story-text"><h2>A Quaint Area 1680 <br/>Nestled on 45 Acres 1681 </h2><p><strong>Zin Zen Wine Bistro</strong> was established in 2006 with a singular vision: to bring the rich, slow-paced culture of European dining to the Croatian-inspired Adriatica Village. 1682 </p><p>Locally owned and operated, we curate over 1683 <strong>80 different wines</strong> from around the world. Whether you are here for a quick glass or a lingering evening, our creative menu invites you to pause and savor the moment. 1684 </p><a href="https://www.zinzenwine.com/m/all-day-menu-3po-50" class="btn-primary">View The Menu</a></div></div></section><section class="experience-section"><div class="section-head fade-up" id="i6szl"><p>The Atmosphere 1685 </p><h2>The Zin Zen Experience 1686 </h2></div><div class="story-split fade-up" id="ikq7r"><div class="story-text"><h3>Ambiance Incomparable to Any Other 1687 </h3><p>Patrons will find several comfortable living room seating areas, intimate table options, and a beautiful patio where wine aficionados and novices alike are invited to explore. 1688 </p><p>From 1689 <strong>Wine Down Wednesdays</strong> to the soulful sounds of 1690 <strong>Live Music</strong>, the experience at Zin Zen is truly incomparable. 1691 </p></div><div class="story-img-container"><img src="https://town-public.s3.amazonaws.com/zinzenwine/hero3.webp" alt="Interior Vibe" class="story-img"/></div></div><div class="features-grid fade-up"><div class="feature-card"><i class="bi bi-cup-straw feature-icon"> 1692 </i><h3>80+ Wines 1693 </h3><p>A curated selection from around the globe, perfect for novices and aficionados alike. 1694 </p><a href="https://drive.google.com/file/d/1_LS-pjMdD7zMsp02_qBKkF1-GUBTL3TQ/preview" target="_blank" rel="noopener" class="btn-primary" id="ixq9f">Wine Menu</a></div><div class="feature-card"><i class="bi bi-music-note-beamed feature-icon"> 1695 </i><h3>Live Music 1696 </h3><p>Enhancing the atmosphere every Thursday, Friday, and Saturday evening. 1697 </p><a href="https://www.zinzenwine.com/custom/page/live-music-mckinney-this-weekend" class="btn-primary" id="ioqvv">Live Music</a></div><div class="feature-card"><i class="bi bi-egg-fried feature-icon"> 1698 </i><h3>Creative Menu 1699 </h3><p>From lunch specials to curated bites that pair perfectly with your pour. 1700 </p><a href="https://www.zinzenwine.com/m/all-day-menu-3po-50" class="btn-primary" id="i7jng">Food Menu</a></div></div></section><section class="community-section fade-up"><h2>Community Impact 1701 </h2><p class="lead">We feel blessed to be part of such an amazing and supportive community in McKinney. Giving back is at the heart of what we do. 1702 </p><div id="charity-list" class="charity-list"> 1703 </div><p id="ic53a">Proud Members of the 1704 <a href="https://www.mckinneychamber.com" target="_blank" id="idvq3">McKinney Chamber of Commerce</a> Since 2016 1705 </p></section><section class="specials-section"><div class="section-head fade-up" id="i4f5ao"><p>Something Every Day 1706 </p><h2>Weekly Specials 1707 </h2></div><div class="specials-grid fade-up"><div class="feature-card special-card"><i class="bi bi-clock-history feature-icon"> 1708 </i><h3>Monday 1709 </h3><p><strong>All Day Happy Hour</strong><br/>Start your week right with special pricing on select pours and bites. 1710 </p></div><div class="feature-card special-card"><i class="bi bi-collection feature-icon"> 1711 </i><h3>Tuesday 1712 </h3><p><strong>Flight Night</strong><br/>Explore our extensive list and discover new favorites with curated flights. 1713 </p></div><div class="feature-card special-card"><i class="bi bi-cup-straw feature-icon"> 1714 </i><h3>Wednesday 1715 </h3><p><strong>Wine Wednesday</strong><br/>Celebrate the middle of the week to unwind with the perfect glass. 1716 </p></div><div class="feature-card special-card"><i class="bi bi-music-note-beamed feature-icon"> 1717 </i><h3>Thu - Fri - Sat 1718 </h3><p><strong>Live Music</strong><br/>Enjoy the soulful sounds of local musicians while you sip and savor. 1719 </p></div><div class="feature-card special-card"><i class="bi bi-brightness-alt-high feature-icon"> 1720 </i><h3>Sat - Sun 1721 </h3><p><strong>Mimosa Brunch</strong><br/>Weekend mornings made perfect with a creative brunch menu and mimosas. 1722 </p></div></div></section><section id="collection" class="section-collection"><div class="section-head fade-up"><h2>The Zin Zen Experience 1723 </h2><p>Taste. Savor. Celebrate. 1724 </p></div><div class="mosaic-grid fade-up"><div class="mosaic-item item-large"><img src="https://town-public.s3.amazonaws.com/zinzenwine/zzwine.webp" alt="Curated Wine Selection"/><div class="mosaic-overlay"><h3 id="isrrfv">Curated Wines 1725 </h3><p>A handpicked selection of premium reds and whites. 1726 </p></div></div><div class="mosaic-item"><img src="https://town-public.s3.amazonaws.com/zinzenwine/OLD%20FASHIONED.webp" alt="Old Fashioned Cocktail"/><div class="mosaic-overlay"><h3 id="i1zhln">Old Fashioned 1727 </h3><p>Classic bourbon, bitters, and an orange twist. 1728 </p></div></div><div class="mosaic-item item-tall"><img src="https://town-public.s3.amazonaws.com/zinzenwine/salad.webp" alt="Strawberry Spinach Salad"/><div class="mosaic-overlay"><h3 id="ibv0n5">Strawberry Spinach Salad 1729 </h3><p>Fresh greens, glazed pecans, and fresh strawberries. 1730 </p></div></div><div class="mosaic-item item-wide"><img src="https://town-public.s3.amazonaws.com/zinzenwine/Flatbread.webp" alt="Breakfast Flatbread"/><div class="mosaic-overlay"><h3 id="igr2ei">Breakfast Flatbread 1731 </h3><p>Scrambled eggs and savory toppings on a crispy crust. 1732 </p></div></div><div class="mosaic-item"><img src="https://town-public.s3.amazonaws.com/zinzenwine/LEMON%20DROP.webp" alt="Lemon Drop Martini"/><div class="mosaic-overlay"><h3 id="iodfzb">Lemon Drop 1733 </h3><p>A crisp, citrusy cocktail with a sugared rim. 1734 </p></div></div><div class="mosaic-item"><img src="https://town-public.s3.amazonaws.com/zinzenwine/baked-brie.webp" alt="Baked Brie with Fruit"/><div class="mosaic-overlay"><h3 id="i6ai0g">Baked Brie 1735 </h3><p>Warm cheese served with crackers and fresh grapes. 1736 </p></div></div><div class="mosaic-item item-large"><img src="https://town-public.s3.amazonaws.com/zinzenwine/zzwinewall.webp" alt="Wine Bar Lounge"/><div class="mosaic-overlay"><h3 id="ilktbf">Wine Bar & Lounge 1737 </h3><p>Catch the game while relaxing by our signature wine wall. 1738 </p></div></div><div class="mosaic-item"><img src="https://town-public.s3.amazonaws.com/zinzenwine/gambas.webp" alt="Shrimp and Cheesy Bread"/><div class="mosaic-overlay"><h3 id="i76b7g">Savory Shrimp 1739 </h3><p>Succulent shrimp served with toasted cheesy bread. 1740 </p></div></div><div class="mosaic-item item-tall"><img src="https://town-public.s3.amazonaws.com/zinzenwine/SANGRIA.webp" alt="Fruit Sangria"/><div class="mosaic-overlay"><h3 id="imvi4i">Fruit Sangria 1741 </h3><p>A refreshing, light sangria loaded with fresh fruit. 1742 </p></div></div><div class="mosaic-item"><img src="https://town-public.s3.amazonaws.com/zinzenwine/hummus.webp" alt="Hummus and Veggie Platter"/><div class="mosaic-overlay"><h3 id="iml34r">Hummus Platter 1743 </h3><p>Creamy hummus paired with pita, carrots, and cucumbers. 1744 </p></div></div><div class="mosaic-item item-cta"><div class="cta-content"><h3 id="ihdtvj">Explore Full Menu 1745 </h3><p>80+ Wines & Countless Flavors 1746 </p><a href="https://drive.google.com/file/d/1_LS-pjMdD7zMsp02_qBKkF1-GUBTL3TQ/preview" target="_blank" rel="noopener" class="btn-primary" id="igwhp7">View All</a></div></div></div></section><section class="reviews-section"><div class="section-head fade-up" id="ibt598"><p>Testimonials 1747 </p><h2>Loved by Locals 1748 </h2></div><div class="slider-container fade-up"><div id="reviews-track" class="slider-track-reverse"> 1749 </div></div></section><div class="cta-banner"><div class="cta-overlay"> 1750 </div></div></div></div>
vendor: 108 bytes, line 1750
1750<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
1750</body> 1751 </div> 1752 </div> 1753 </div> 1754 </div> 1755 </section> 1756 </main> 1757 1758 <footer class="footer-section section-bg-3 fix bg-cover"> 1759 <div class="container"> 1760 <div class="footer-widgets-wrapper style-2"> 1761 <div class="row"> 1762 <!-- Newsletter Section --> 1763 1764 <div class="col-xl-5 col-lg-4 col-md-6 ps-xl-5 pe-md-5 wow fadeInUp" data-wow-delay=".5s"> 1765 <div class="single-footer-widget border-right"> 1766 <div class="widget-head"> 1767 <h4>Quick Access</h4> 1768 </div> 1769 <div class="list-area d-flex align-items-center"> 1770 <ul> 1771 <li> 1772 <a href="https://www.zinzenwine.com"> 1773 <span class="text-effect"> 1774 <span class="effect-2">Home</span> 1775 </span> 1776 </a> 1777 </li> 1778 1779 <li> 1780 <a href="https://www.zinzenwine.com/custom/page/about"> 1781 <span class="text-effect"> 1782 <span class="effect-2">About</span> 1783 </span> 1784 </a> 1785 </li> 1786 <li> 1787 <a href="https://www.zinzenwine.com/custom/page/club"> 1788 <span class="text-effect"> 1789 <span class="effect-2">Club</span> 1790 </span> 1791 </a> 1792 </li> 1793 <li> 1794 <a href="https://www.zinzenwine.com/custom/page/events"> 1795 <span class="text-effect"> 1796 <span class="effect-2">Events</span> 1797 </span> 1798 </a> 1799 </li> 1800 <li> 1801 <a href="https://www.zinzenwine.com/custom/page/contact"> 1802 <span class="text-effect"> 1803 <span class="effect-2">Contact</span> 1804 </span> 1805 </a> 1806 </li> 1807 <li> 1808 <a href="https://www.zinzenwine.com/custom/page/accessibility"> 1809 <span class="text-effect"> 1810 <span class="effect-2">Accessibility</span> 1811 </span> 1812 </a> 1813 </li> 1814 1815 1816 1817 <li> 1818 <a href="https://www.zinzenwine.com/products"> 1819 <span class="text-effect">
1820 <span class="effect-2">Menu</span> 1821 </span> 1822 </a> 1823 </li> 1824 1825 1826 1827 <li> 1828 <a href="https://www.zinzenwine.com/cart"> 1829 <span class="text-effect"> 1830 <span class="effect-2">Cart</span> 1831 </span> 1832 </a> 1833 </li> 1834 1835 <li> 1836 <a href="https://www.zinzenwine.com/admin"> 1837 <span class="text-effect"> 1838 <span class="effect-2">Admin Area</span> 1839 </span> 1840 </a> 1841 </li> 1842 </ul> 1843 </div> 1844 </div> 1845 </div> 1846 <!-- Contact Section --> 1847 <div class="col-xl-3 col-lg-4 col-md-6 ps-xl-5 wow fadeInUp" data-wow-delay=".7s"> 1848 <div class="single-footer-widget"> 1849 <div class="widget-head"> 1850 <h4>Contact Us</h4> 1851 </div> 1852 <div class="footer-content"> 1853 <p>6841 Virginia Parkway, McKinney TX, USA</p> 1854 1855 <a href="/cdn-cgi/l/email-protection#cc8fa3a2b8adafb88cb6a5a2b6a9a2bba5a2a9e2afa3a1" class="link"> 1856 <span class="__cf_email__" data-cfemail="87c4e8e9f3e6e4f3c7fdeee9fde2e9f0eee9e2a9e4e8ea">[email protected]</span> 1857 </a> 1858 1859 <a href="tel:(972) 547-4620" class="number"> 1860 (972) 547-4620 1861 </a> 1862 1863 1864 1865 <ul class="info-date"> 1866 <li> 1867 Monday: <span>11:00am â 10:00pm</span> 1868 </li> 1869 <li> 1870 Tuesday: <span>11:00am â 10:00pm</span> 1871 </li> 1872 <li> 1873 Wednesday: <span>11:00am â 10:00pm</span> 1874 </li> 1875 <li> 1876 Thursday: <span>11:00am â 10:00pm</span> 1877 </li> 1878 <li> 1879 Friday: <span>11:00am â 11:59pm</span> 1880 </li> 1881 <li> 1882 Saturday: <span>11:00am â 11:59pm</span> 1883 </li> 1884 <li> 1885 Sunday: <span>11:00am â 9:00pm</span> 1886 </li> 1887 </ul> 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 </div> 1899 </div> 1900 </div> 1901 <!-- End Contact Section --> 1902 </div> 1903 </div> 1904 </div> 1905 1906 <div class="footer-bottom style-2"> 1907 <div id="scrollUp" class="scroll-icon bg-cover"> 1908 <i class="fas fa-arrow-alt-up"></i> 1909 </div> 1910 <div class="container"> 1911 <div class="footer-bottom-wrapper d-flex align-items-center justify-content-between"> 1912 <p class="wow fadeInLeft" data-wow-delay=".3s"> 1913 © Copyright
1914 <span class="theme-color-3">2026</span> 1915 <a href="https://www.zinzenwine.com"> 1916 Zin Zen Wine Bistro 1917 </a>. All Rights Reserved. 1918 </p> 1919 <ul class="d-flex align-items-center gap-3 flex-wrap justify-content-end" style="width: auto"> 1920 <li> 1921 <button type="button" class="tc-privacy-link p-0" data-tc-privacy-open> 1922 Privacy Choices 1923 </button> 1924 </li> 1925 <li> 1926 <a href="https://www.town.club/privacy" target="_blank" rel="noopener"> 1927 Privacy Policy 1928 </a> 1929 </li> 1930 <li> 1931 <a href="https://www.town.club/terms" target="_blank" rel="noopener"> 1932 Terms 1933 </a> 1934 </li> 1935 <li> 1936 <a href="https://www.town.club/disclaimer" target="_blank" rel="noopener"> 1937 Disclaimer 1938 </a> 1939 </li> 1940 <li style="width: 100px"> 1941 <a href="https://app.yourfoodonline.com" target="_blank"> 1942 <img alt="Town" src="https://www.zinzenwine.com/assets/images/powered_by_logo_name.svg" loading="lazy" decoding="async"> 1943 </a> 1944 </li> 1945 </ul> 1946 </div> 1947 </div> 1948 </div> 1949</footer> 1950 </div>
vendor: 110 bytes, lines 1950-1952
1950 1951 1952<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
1952<script src="https://www.zinzenwine.com/assets/frontend/assets/js/jquery-3.7.1.min.js"></script>
vendor: 1 bytes, line 1952
1952
1953<script src="https://www.zinzenwine.com/assets/frontend/assets/js/viewport.jquery.js"></script>
vendor: 1 bytes, line 1953
1953
1954<script src="https://www.zinzenwine.com/assets/frontend/assets/js/bootstrap.bundle.min.js"></script>
vendor: 1 bytes, line 1954
1954
1955<script src="https://www.zinzenwine.com/assets/frontend/assets/js/jquery.nice-select.min.js"></script>
vendor: 1 bytes, line 1955
1955
1956<script src="https://www.zinzenwine.com/assets/frontend/assets/js/jquery.waypoints.js"></script>
vendor: 1 bytes, line 1956
1956
1957<script src="https://www.zinzenwine.com/assets/frontend/assets/js/jquery.counterup.min.js"></script>
vendor: 1 bytes, line 1957
1957
1958<script src="https://www.zinzenwine.com/assets/frontend/assets/js/swiper-bundle.min.js"></script>
vendor: 1 bytes, line 1958
1958
1959<script src="https://www.zinzenwine.com/assets/frontend/assets/js/jquery.meanmenu.min.js"></script>
vendor: 1 bytes, line 1959
1959
1960<script src="https://www.zinzenwine.com/assets/frontend/assets/js/jquery.magnific-popup.min.js"></script>
vendor: 1 bytes, line 1960
1960
1961<script src="https://www.zinzenwine.com/assets/frontend/assets/js/animation.js"></script>
vendor: 1 bytes, line 1961
1961
1962<script src="https://www.zinzenwine.com/assets/frontend/assets/js/wow.min.js"></script>
vendor: 1 bytes, line 1962
1962
1963<script src="https://www.zinzenwine.com/assets/frontend/assets/js/color-contrast.js"></script>
vendor: 1 bytes, line 1963
1963
1964<script> 1965 window.TC_CURRENCY = {"code":"USD","stripe":"usd","symbol":"$","country":"US","exponent":2,"factor":100}; 1966 window.TcMoney = (function () { 1967 const defaultConfig = window.TC_CURRENCY || {}; 1968 1969 function normalizedConfig(override) { 1970 const config = Object.assign({}, defaultConfig, override || {}); 1971 const exponent = Math.max(0, Math.min(4, parseInt(config.exponent ?? 2, 10) || 0)); 1972 const factor = Math.max(1, parseInt(config.factor ?? Math.pow(10, exponent), 10) || Math.pow(10, exponent)); 1973 1974 return { 1975 code: config.code || 'USD', 1976 symbol: config.symbol || '$', 1977 exponent, 1978 factor, 1979 }; 1980 } 1981 1982 function format(value, override) { 1983 const config = normalizedConfig(override); 1984 const amount = Number(value); 1985 const safeAmount = Number.isFinite(amount) ? amount : 0; 1986 const rendered = safeAmount.toLocaleString(undefined, { 1987 minimumFractionDigits: config.exponent, 1988 maximumFractionDigits: config.exponent, 1989 }); 1990 1991 return `${config.symbol} ${rendered}`.trim(); 1992 } 1993 1994 function formatMinor(value, override) { 1995 const config = normalizedConfig(override); 1996 const cents = parseInt(value || 0, 10); 1997 const safeCents = Number.isFinite(cents) ? cents : 0; 1998 1999 return format(safeCents / config.factor, config); 2000 } 2001 2002 function toMinor(value, override) { 2003 const config = normalizedConfig(override); 2004 const amount = Number(value); 2005 2006 return Math.round((Number.isFinite(amount) ? amount : 0) * config.factor); 2007 } 2008 2009 function fromMinor(value, override) { 2010 const config = normalizedConfig(override); 2011 const cents = parseInt(value || 0, 10); 2012 2013 return (Number.isFinite(cents) ? cents : 0) / config.factor; 2014 } 2015 2016 return { config: normalizedConfig(), format, formatMinor, toMinor, fromMinor }; 2017 })(); 2018</script>
2018 2019
2020<script src="https://www.zinzenwine.com/assets/frontend/assets/js/main.js?v=1790249518"></script>
2020 2021 2022
2023<script> 2024 document.addEventListener('DOMContentLoaded', function(){ 2025 const sidebar = document.getElementById('social-sidebar'); 2026 if (sidebar) { 2027 const toggle = sidebar.querySelector('.toggle-btn'); 2028 if (toggle) { 2029 toggle.addEventListener('click', () => { 2030 sidebar.classList.toggle('expanded'); 2031 }); 2032 } 2033 } 2034 }); 2035</script>
2035 2036
2037<script> 2038 document.addEventListener('DOMContentLoaded', function () { 2039 let trafficTracked = false; 2040 2041 function trackTrafficWhenAllowed() { 2042 if (trafficTracked || !window.TCPrivacy || !window.TCPrivacy.canUse('analytics')) { 2043 return; 2044 } 2045 2046 trafficTracked = true; 2047 2048 try { 2049 const storageKey = 'tc_visitor_id'; 2050 let visitorId = localStorage.getItem(storageKey); 2051 if (!visitorId) { 2052 visitorId = (window.crypto?.randomUUID ? window.crypto.randomUUID() : `${Date.now()}-${Math.random().toString(16).slice(2)}`); 2053 localStorage.setItem(storageKey, visitorId); 2054 } 2055 2056 const params = new URLSearchParams(window.location.search); 2057 const payload = { 2058 event_type: 'page_view', 2059 page_url: window.location.href, 2060 path: window.location.pathname, 2061 referrer: document.referrer || '', 2062 visitor_id: visitorId, 2063 utm_source: params.get('utm_source') || '', 2064 utm_medium: params.get('utm_medium') || '', 2065 utm_campaign: params.get('utm_campaign') || '' 2066 }; 2067 2068 fetch("\/analytics\/traffic", { 2069 method: 'POST', 2070 headers: { 2071 'Content-Type': 'application/json', 2072 'Accept': 'application/json', 2073 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]')?.getAttribute('content') || '' 2074 }, 2075 body: JSON.stringify(payload), 2076 keepalive: true 2077 }).catch(() => {}); 2078 2079 } catch (error) {} 2080 } 2081 2082 if (window.TCPrivacy) { 2083 window.TCPrivacy.onConsentChange(trackTrafficWhenAllowed); 2084 } 2085 2086 trackTrafficWhenAllowed(); 2087 }); 2088</script>
2088 2089 2090 2091 2092 2093
2093<script> 2094 document.addEventListener('DOMContentLoaded', function() { 2095 const sidebarToggle = document.getElementById('mobileSidebarToggle'); 2096 const headerSticky = document.getElementById('header-sticky'); 2097 2098 function updateSidebarVisibility() { 2099 if (!sidebarToggle) return; 2100 sidebarToggle.style.display = window.innerWidth < 768 ? 'block' : 'none'; 2101 } 2102 2103 function updateSticky() { 2104 if (!headerSticky) return; 2105 headerSticky.classList.toggle('sticky', window.scrollY > 80); 2106 } 2107 updateSidebarVisibility(); 2108 updateSticky(); 2109 window.addEventListener('resize', updateSidebarVisibility); 2110 window.addEventListener('scroll', updateSticky); 2111 }); 2112 </script>
2112 2113
2114<script src="https://www.zinzenwine.com/assets/frontend/assets/js/tc/business_selector.js?v=1790073480"></script>
2114 2115
2115<script> 2116 document.addEventListener('DOMContentLoaded', () => { 2117 if (window.TownClubBusinessSelector?.mount) { 2118 window.TownClubBusinessSelector.mount(); 2119 return; 2120 } 2121 2122 const modalEl = document.getElementById('tcBusinessSelectorModal'); 2123 const modal = modalEl ? new bootstrap.Modal(modalEl) : null; 2124 const $dropdown = $('#business-selector'); 2125 const $form = $('#tcBusinessSelectorForm'); 2126 const $loading = $('#loadingMessage'); 2127 const $error = $('#locationError'); 2128 const $logoImg = $('#selected-business-logo img'); 2129 const $phoneEl = $('#business-phone'); 2130 const $modalSelect = $('#business'); 2131 2132 $error.hide(); 2133 2134 function getCookie(name) { 2135 const match = document.cookie.match(new RegExp('(?:^|; )' + name.replace(/([.*+?^${}()|\[\]\/\\])/g, '\\$1') + '=([^;]*)')); 2136 return match ? decodeURIComponent(match[1]) : undefined; 2137 } 2138 2139 function updateHeader() { 2140 const opt = $dropdown.find(':selected'); 2141 const logo = opt.data('logo') || 'assets/img/logo/logo-3.svg'; 2142 const phone = opt.data('phone') || '+1718-904-4450'; 2143 $logoImg.attr('src', logo); 2144 $phoneEl.text(phone).attr('href', `tel:${phone}`); 2145 } 2146 2147 function saveSelection() { 2148 const opt = $dropdown.find(':selected'); 2149 const businessId = opt.val(); 2150 2151 if (!businessId) return; 2152 2153 if ($loading) $loading.show(); 2154 2155 // Cambiado de 'business.switch' a 'frontend.business.switch' 2156 fetch('https://www.zinzenwine.com/context/switch-business', { 2157 method: 'POST', 2158 headers: { 2159 'Content-Type': 'application/json', 2160 'X-CSRF-TOKEN': 'QUAY7qp3f9vxznTgECZV7rSPGioc1ts6bDtSsma9' 2161 }, 2162 body: JSON.stringify({ business_id: businessId }) 2163 }) 2164 .then(response => response.json()) 2165 .then(data => { 2166 if (data.success) { 2167 localStorage.setItem('selectedBusiness', JSON.stringify({ 2168 id: data.business.id, 2169 name: data.business.name, 2170 logo: data.business.logo, 2171 phone: opt.data('phone') 2172 })); 2173 window.location.reload(); 2174 } else { 2175 alert(data.message || 'Error switching business'); 2176 } 2177 }) 2178 .catch(error => { 2179 console.error('Error:', error); 2180 }) 2181 .finally(() => { 2182 if ($loading) $loading.hide(); 2183 }); 2184 } 2185 2186 function showManualLocationSelector() { 2187 $loading.hide(); 2188 $error.show(); 2189 $form.show(); 2190 } 2191 2192 function showNoBusinessesError() { 2193 $loading.hide(); 2194 $form.hide(); 2195 $error.html('<div class="alert alert-danger">There are no business available at the moment.</div>').show(); 2196 } 2197 2198 function showFormOnly() { 2199 $loading.hide(); 2200 $error.hide(); 2201 $form.show(); 2202 } 2203 2204 function init() { 2205 const saved = localStorage.getItem('selectedBusiness'); 2206 const cookie = getCookie('resolved_business'); 2207 const forced = new URLSearchParams(window.location.search).get('tc_business_id'); 2208 const opts = $dropdown.find('option'); 2209 let savedBusiness = null; 2210 2211 try { 2212 savedBusiness = saved ? JSON.parse(saved) : null; 2213 } catch (error) { 2214 localStorage.removeItem('selectedBusiness'); 2215 } 2216 2217 const savedId = savedBusiness?.id; 2218 const validSaved = savedId && opts.filter(`[value="${savedId}"]`).length; 2219 const validCookie = cookie && opts.filter(`[value="${cookie}"]`).length; 2220 const validForced = forced && opts.filter(`[value="${forced}"]`).length; 2221 2222 if (validSaved || validCookie || validForced) { 2223 if (validForced || validCookie) { 2224 $dropdown.val(validForced ? forced : cookie); 2225 const opt = $dropdown.find(':selected'); 2226 const data = { 2227 id: opt.val(), 2228 name: opt.text().trim(), 2229 lat: opt.data('lat'), 2230 lng: opt.data('lng'), 2231 logo: opt.data('logo'), 2232 phone:opt.data('phone'), 2233 }; 2234 localStorage.setItem('selectedBusiness', JSON.stringify(data)); 2235 } else { 2236 $dropdown.val(savedId); 2237 } 2238 updateHeader(); 2239 } else { 2240 localStorage.removeItem('selectedBusiness'); 2241 2242 const businessCount = opts.length; 2243 2244 if (businessCount === 0) { 2245 if (modal) modal.show(); 2246 showNoBusinessesError(); 2247 } else if (businessCount === 1) { 2248 $dropdown.val(opts.first().val()); 2249 saveSelection(); 2250 } else { 2251 if (modal) modal.show(); 2252 showManualLocationSelector(); 2253 } 2254 } 2255 } 2256 2257 $form.on('submit', e => { 2258 e.preventDefault(); 2259 const id = $modalSelect.val(); 2260 if (id) { 2261 $dropdown.val(id); 2262 } 2263 saveSelection(); 2264 }); 2265 2266 $dropdown.on('change', saveSelection); 2267 2268 if (modalEl) { 2269 modalEl.addEventListener('show.bs.modal', e => { 2270 $modalSelect.val($dropdown.val()); 2271 2272 if (e.relatedTarget?.dataset.bsTarget === '#tcBusinessSelectorModal') { 2273 showFormOnly(); 2274 return; 2275 } 2276 $loading.show(); 2277 $form.hide(); 2278 $error.hide(); 2279 2280 showManualLocationSelector(); 2281 }); 2282 } 2283 2284 init(); 2285 }); 2286 </script>
2286 2287
2287<script> 2288 document.addEventListener('DOMContentLoaded', () => { 2289 // --- 0. OBSERVER SETUP --- 2290 const observerOptions = { 2291 root: null, 2292 rootMargin: '0px', 2293 threshold: 0.1 2294 }; 2295 const observer = new IntersectionObserver((entries, observer) => { 2296 entries.forEach(entry => { 2297 if (entry.isIntersecting) { 2298 entry.target.style.opacity = 1; 2299 entry.target.style.transform = 'translateY(0)'; 2300 observer.unobserve(entry.target); 2301 } 2302 } 2303 ); 2304 } 2305 , observerOptions); 2306 document.querySelectorAll('.fade-up').forEach(el => { 2307 el.style.opacity = 0; 2308 el.style.transform = 'translateY(40px)'; 2309 el.style.transition = 'opacity 1s ease-out, transform 1s cubic-bezier(0.2, 0.8, 0.2, 1)'; 2310 observer.observe(el); 2311 } 2312 ); 2313 // --- INJECT CSS --- 2314 const injectStyles = (css) => { 2315 const style = document.createElement('style'); 2316 style.textContent = css; 2317 document.head.appendChild(style); 2318 }; 2319 const pageStyles = ` 2320:root { 2321--brand-navy: #2C3E50 !important; 2322--brand-red: #9A1B2F !important; 2323--brand-green: #009444 !important; 2324--bg-cream: #F9F8F4 !important; 2325--bg-white: #ffffff !important; 2326--section-padding: 80px !important; 2327} 2328body { 2329font-family: 'Montserrat', sans-serif !important; 2330background-color: var(--bg-cream) !important; 2331color: var(--brand-navy) !important; 2332line-height: 1.9 !important; 2333font-weight: 300 !important; 2334overflow-x: hidden !important; 2335} 2336/* --- GENERAL STYLES --- */ 2337.texture-overlay { 2338position: fixed !important; top: 0 !important; left: 0 !important; width: 100% !important; height: 100% !important; 2339pointer-events: none !important; z-index: 9999 !important; opacity: 0.04 !important; 2340background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E") !important; 2341} 2342h1, h2, h3, h4 { font-family: 'Cormorant Garamond', serif !important; color: var(--brand-navy) !important; font-weight: 700 !important; line-height: 1.05 !important; } 2343strong { font-weight: 600 !important; color: var(--brand-red) !important; } 2344img { width: 100% !important; display: block !important; object-fit: cover !important; } 2345.page-header { padding-top: 100px !important; padding-bottom: 120px !important; text-align: center !important; background: var(--bg-cream) !important; position: relative !important; overflow: hidden !important; } 2346.header-watermark { position: absolute !important; top: 50% !important; left: 50% !important; transform: translate(-50%, -50%) !important; font-family: 'Cormorant Garamond', serif !important; font-size: 18vw !important; color: var(--brand-navy) !important; opacity: 0.03 !important; font-weight: 700 !important; z-index: 0 !important; pointer-events: none !important; line-height: 0 !important; } 2347.accent-line { width: 1px !important; height: 80px !important; background: var(--brand-green) !important; margin: 0 auto 2rem auto !important; display: block !important; } 2348.page-header h1 { font-size: 4.5rem !important; margin-bottom: 1.5rem !important; letter-spacing: -1px !important; } 2349.page-header p { font-size: 0.85rem !important; letter-spacing: 4px !important; text-transform: uppercase !important; color: var(--brand-navy) !important; font-weight: 500 !important; opacity: 0.7 !important; } 2350section { padding: var(--section-padding) 8% !important; position: relative !important; } 2351.story-split { display: grid !important; grid-template-columns: 1fr 1fr !important; gap: 6rem !important; align-items: center !important; } 2352.story-img-container { position: relative !important; padding: 15px !important; } 2353.story-img-container::before { content: '' !important; position: absolute !important; top: 0 !important; left: 0 !important; width: 100% !important; height: 100% !important; border: 1px solid var(--brand-navy) !important; z-index: 0 !important; opacity: 0.3 !important; } 2354.story-img { position: relative !important; z-index: 1 !important; box-shadow: 0 20px 50px rgba(0,0,0,0.1) !important; transform: translate(15px, 15px) !important; filter: saturate(0.9) !important; } 2355.story-text h2 { font-size: 3rem !important; margin-bottom: 2rem !important; } 2356.story-text p { margin-bottom: 1.5rem !important; color: #555 !important; font-size: 1.05rem !important; text-align: justify !important; } 2357.experience-section { background: var(--bg-white) !important; padding-bottom: 50px !important; } 2358.section-head h2 { font-size: 3.5rem !important; margin-bottom: 0.5rem !important; } 2359.section-head p { font-family: 'Montserrat', sans-serif !important; font-size: 1rem !important; color: var(--brand-green) !important; letter-spacing: 2px !important; text-transform: uppercase !important; } 2360.features-grid { display: grid !important; grid-template-columns: repeat(3, 1fr) !important; gap: 2.5rem !important; margin-top: -80px !important; position: relative !important; z-index: 10 !important; } 2361.feature-card { padding: 3rem 2rem !important; background: var(--bg-cream) !important; text-align: center !important; transition: all 0.4s ease !important; border: 1px solid rgba(0,0,0,0.03) !important; position: relative !important; } 2362.feature-card::after { content: '' !important; position: absolute !important; bottom: 0 !important; left: 0 !important; width: 100% !important; height: 3px !important; background: var(--brand-red) !important; transform: scaleX(0) !important; transition: transform 0.4s ease !important; } 2363.feature-card:hover { transform: translateY(-10px) !important; box-shadow: 0 20px 40px rgba(44, 62, 80, 0.08) !important; } 2364.feature-card:hover::after { transform: scaleX(1) !important; } 2365.feature-icon { font-size: 2.5rem !important; color: var(--brand-navy) !important; margin-bottom: 1.5rem !important; opacity: 0.8 !important; transition: 0.3s !important; } 2366.feature-card:hover .feature-icon { color: var(--brand-red) !important; opacity: 1 !important; } 2367.feature-card h3 { margin-bottom: 1rem !important; font-size: 1.8rem !important; } 2368.feature-card p { font-size: 0.95rem !important; line-height: 1.6 !important; } 2369.community-section { background: var(--brand-navy) !important; color: #fff !important; text-align: center !important; padding-top: 100px !important; padding-bottom: 100px !important; } 2370.community-section h2 { color: #fff !important; margin-bottom: 1.5rem !important; font-size: 3rem !important; } 2371.community-section p.lead { max-width: 600px !important; margin: 0 auto 4rem auto !important; color: rgba(255,255,255,0.7) !important; font-size: 1.1rem !important; } 2372.charity-list { display: flex !important; flex-wrap: wrap !important; justify-content: center !important; gap: 0.8rem !important; max-width: 900px !important; margin: 0 auto !important; } 2373.charity-tag { background: transparent !important; padding: 10px 25px !important; border: 1px solid rgba(255,255,255,0.15) !important; border-radius: 50px !important; font-size: 0.8rem !important; letter-spacing: 1px !important; text-transform: uppercase !important; font-weight: 500 !important; transition: all 0.3s ease !important; cursor: default !important; text-decoration: none !important; color: var(--bg-cream) !important; } 2374.charity-tag:hover { background: var(--bg-white) !important; border-color: var(--bg-white) !important; color: var(--brand-navy) !important; transform: translateY(-2px) !important; } 2375.cta-banner { background: url('https://town-public.s3.amazonaws.com/zinzenwine/about_cta.webp') !important; background-size: cover !important; background-position: center !important; background-attachment: fixed !important; position: relative !important; padding: 10rem 2rem !important; display: flex !important; justify-content: center !important; align-items: center !important; } 2376.cta-overlay { position: absolute !important; top:0 !important; left:0 !important; width:100% !important; height:100% !important; background: linear-gradient(135deg, rgba(44,62,80,0.9), rgba(154,27,47,0.8)) !important; } 2377.cta-content { position: relative !important; z-index: 2 !important; max-width: 800px !important; text-align: center !important; color: white !important; backdrop-filter: blur(5px) !important; } 2378.cta-content h2 { color: white !important; font-size: 3.5rem !important; margin-bottom: 1.5rem !important; } 2379.btn-primary { display: inline-block !important; padding: 1.2rem 3.5rem !important; background: var(--brand-red) !important; color: #fff !important; text-transform: uppercase !important; letter-spacing: 2px !important; font-size: 0.8rem !important; font-weight: 600 !important; transition: all 0.3s ease !important; cursor: pointer !important; text-decoration:none !important;} 2380.btn-primary:hover { background: transparent !important; border-color: var(--brand-navy) !important; color: var(--brand-navy) !important; } 2381.cta-content .btn-primary { border-color: #fff !important; background: #fff !important; color: var(--brand-navy) !important; } 2382.cta-content .btn-primary:hover { background: transparent !important; color: #fff !important; border-color: #fff !important; } 2383@media (max-width: 968px) { .story-split { grid-template-columns: 1fr !important; gap: 3rem !important; } .features-grid { grid-template-columns: 1fr !important; margin-top: 3rem !important; } .header-watermark { font-size: 25vw !important; } .story-img-container::before { transform: translate(-10px, -10px) !important; } .story-img { transform: none !important; } .page-header h1 { font-size: 3.5rem !important; } .cta-content { padding: 2rem !important; border: none !important; } } 2384/* --- REVIEWS SLIDER (UPDATED TO FIX PADDING Y & EQUAL HEIGHTS) --- */ 2385.reviews-section { background: var(--bg-white) !important; border-top: 1px solid rgba(0,0,0,0.05) !important; overflow: hidden !important; } 2386.slider-container { width: 100% !important; padding: 2rem 0 !important; position: relative !important; overflow: hidden !important; } 2387.slider-track-reverse { display: flex !important; gap: 2rem !important; width: max-content !important; will-change: transform !important; transform: translateX(0); align-items: stretch !important; } 2388.slide-card.review-slide { width: 350px !important; flex-shrink: 0 !important; display: flex !important; } 2389/* New Inner Wrapper handles all the padding, backgrounds, and equal spacing */ 2390.review-inner { background: #fff !important; padding: 4rem 2.5rem !important; border: 1px solid rgba(0,0,0,0.05) !important; text-align: center !important; display: flex !important; flex-direction: column !important; justify-content: space-between !important; width: 100% !important; border-radius: 8px !important;} 2391.review-inner .stars { color: #D4AF37 !important; margin-bottom: 1rem !important; font-size: 0.9rem !important; } 2392.review-inner .review-body { font-style: italic !important; font-size: 1.1rem !important; margin-bottom: 1.5rem !important; color: #555 !important; flex-grow: 1 !important; display: flex !important; align-items: center !important; justify-content: center !important; } 2393.review-inner .review-author { font-weight: 700 !important; color: var(--brand-red) !important; font-size: 0.8rem !important; text-transform: uppercase !important; } 2394/* --- MOSAIC GALLERY --- */ 2395.mosaic-grid { display: grid !important; grid-template-columns: repeat(4, 1fr) !important; grid-auto-rows: 250px !important; gap: 15px !important; max-width: 1400px !important; margin: 0 auto !important; padding: 0 15px !important; grid-auto-flow: dense !important; } 2396.mosaic-item { position: relative !important; overflow: hidden !important; border-radius: 4px !important; cursor: pointer !important; } 2397.mosaic-item img { width: 100% !important; height: 100% !important; object-fit: cover !important; transition: transform 0.8s ease !important; } 2398/* Grid Sizes */ 2399.item-large { grid-column: span 2 !important;
2399 grid-row: span 2 !important; } 2400.item-wide { grid-column: span 2 !important; grid-row: span 1 !important; } 2401.item-tall { grid-column: span 1 !important; grid-row: span 2 !important; } 2402.mosaic-overlay { position: absolute !important; top: 0 !important; left: 0 !important; width: 100% !important; height: 100% !important; background: rgba(44, 62, 80, 0.85) !important; display: flex !important; flex-direction: column !important; justify-content: center !important; align-items: center !important; text-align: center !important; opacity: 0 !important; transition: all 0.4s ease !important; } 2403.mosaic-overlay h3 { font-family: 'Cormorant Garamond', serif !important; font-size: 1.8rem !important; margin-bottom: 0.5rem !important; line-height: 1.2 !important; transform: translateY(20px) !important; transition: 0.4s ease !important; } 2404.mosaic-overlay p { color: var(--brand-green) !important; font-weight: 600 !important; text-transform: uppercase !important; font-size: 0.75rem !important; letter-spacing: 2px !important; transform: translateY(20px) !important; transition: 0.4s ease 0.1s !important; margin: 0 !important; } 2405.item-cta { background: var(--brand-navy) !important; display: flex !important; align-items: center !important; justify-content: center !important; text-align: center !important; padding: 2rem !important; border: 1px solid rgba(255,255,255,0.1) !important; } 2406.cta-content h3 { color: #fff !important; font-size: 2rem !important; margin-bottom: 0.5rem !important; } 2407.cta-content p { color: #ccc !important; font-size: 0.9rem !important; margin-bottom: 1.5rem !important; } 2408.mosaic-item:hover img { transform: scale(1.15) !important; } 2409.mosaic-item:hover .mosaic-overlay { opacity: 1 !important; } 2410.mosaic-item:hover .mosaic-overlay h3, .mosaic-item:hover .mosaic-overlay p { transform: translateY(0) !important; } 2411/* Tablet */ 2412@media (max-width: 1024px) { 2413.mosaic-grid { grid-template-columns: repeat(3, 1fr) !important; } 2414.item-large { grid-column: span 2 !important; grid-row: span 2 !important; } 2415} 2416/* Mobile - 1 Item Per Row & FIXED CTA */ 2417@media (max-width: 768px) { 2418.mosaic-grid { grid-template-columns: 1fr !important; gap: 15px !important; } 2419.item-large, .item-wide, .item-tall { grid-column: span 1 !important; grid-row: span 1 !important; height: 300px !important; } 2420.item-cta { height: 300px !important; width: 100% !important; padding: 1rem !important; box-sizing: border-box !important; } 2421.item-cta .cta-content h3 { font-size: 1.8rem !important; } 2422} 2423.dynamic-page-section .page-content-rendered img { max-width: 100% !important; height: 100% !important; } 2424/* --- WEEKLY SPECIALS --- */ 2425.specials-section { background: var(--bg-cream) !important; padding: 80px 8% !important; } 2426.specials-grid { display: grid !important; grid-template-columns: repeat(5, 1fr) !important; gap: 1.5rem !important; position: relative !important; z-index: 10 !important; max-width: 1400px !important; margin: 3rem auto 0 auto !important; } 2427.special-card { padding: 3rem 1.2rem 2rem 1.2rem !important; background: var(--bg-white) !important; display: flex !important; flex-direction: column !important; justify-content: flex-start !important; align-items: center !important; height: 100% !important; box-shadow: 0 4px 15px rgba(0,0,0,0.02) !important; border: 1px solid rgba(0,0,0,0.03) !important; } 2428.special-card .feature-icon { font-size: 2rem !important; margin-bottom: 1.5rem !important; } 2429.special-card h3 { font-size: 1.5rem !important; color: var(--brand-red) !important; margin-bottom: 0.5rem !important; } 2430.special-card p { font-size: 0.85rem !important; color: #666 !important; line-height: 1.6 !important; margin: 0 !important; } 2431.special-card strong { font-family: 'Montserrat', sans-serif !important; font-size: 0.8rem !important; color: var(--brand-navy) !important; text-transform: uppercase !important; letter-spacing: 1px !important; display: block !important; margin-bottom: 0.8rem !important; font-weight: 600 !important; } 2432@media (max-width: 1200px) { .specials-grid { grid-template-columns: repeat(3, 1fr) !important; gap: 2rem !important; } } 2433@media (max-width: 900px) { .specials-grid { grid-template-columns: repeat(2, 1fr) !important; gap: 2rem !important; } } 2434@media (max-width: 600px) { .specials-grid { grid-template-columns: 1fr !important; gap: 2rem !important; } .special-card { padding: 2.5rem 1.5rem 2rem 1.5rem !important; } } 2435`; 2436 injectStyles(pageStyles); 2437 document.body.style.opacity = '1'; 2438 // --- 1. SLIDER JS FORCE (UPDATED INNER HTML) --- 2439 const reviewsData = [ 2440 { 2441 text: "What a fantastic place! I booked a table through hostme to celebrate my husband's birthday and so happy I did.", author: "M. S." } 2442 , 2443 { 2444 text: "Big thanks to the team at Zin Zen! We recently hosted our
2444car club brunch and meeting there, and we couldnât have been happier. The food was excellent, the service outstanding and the venue was perfect for a small social event. The team there went above and beyond to accommodate a larger group than we had expected. Highly recommend!", author: "Jason" } 2445 , 2446 { 2447 text: "The food and the wine were both delicious! We loved the baked brie, and the shrimp was very tasty as well. We don't know too much about wine, so we really appreciated the pre built flights. We ordered one to share, which was plenty. The price was quite reasonable as well.", author: "Rachael Hudson" } 2448 , 2449 { 2450 text: "We had my birthday celebration there and it was amazing. The service was great. The food was incredible!", author: "Laurie McGuire" } 2451 , 2452 { 2453 text: "Delicious flatbread and wine cocktail. Our server was very nice and helpful.", author: "Nikolett Fülöp" } 2454 , 2455 { 2456 text: "Decided to come in for a peaceful lunch by myself today. There were 2 ladies that helped me. One took my order and the other one brought me my food. Both ladies were very sweet.", author: "April" } 2457 , 2458 { 2459 text: "I've been wanting to try this place for years! We went for a girl's night and it was great! Monday is all day Happy Hour, so we tried a lot of the appetizers on that menu. They were good and very easy to share. The drinks were also delicious.", author: "Michelle Flannigan" } 2460 , 2461 { 2462 text: "We've been coming for so many years, if you go, the service is incredible. We always sit with Daniel⦠We have an incredible experience in music is surreal. The service is amazing and the food is great. You will never be disappointed if you come here.", author: "Teresa D" } 2463 , 2464 { 2465 text: "I was hosting a baby shower at Zin Zen in December. Food, ambience and service were superb! Guests said it is perfect place for that. I am also a guest there and enjoy their warm atmosphere, yummy food and very friendly stuff. I am happy that we have this bistro in our neighbourhood", author: "Tihana KosanoviÄ" } 2466 , 2467 { 2468 text: "Not even sure how to describe it! Little Italy meets Texas - Charming, great service, great food, wine, atmosphere. We sat outside on the patio & could hear the live music inside. Completely perfect evening!", author: "Homes By Katina" } 2469 ]; 2470 const reviewsTrack = document.getElementById('reviews-track'); 2471 if (reviewsTrack) { 2472 const fullReviews = [...reviewsData, ...reviewsData, ...reviewsData]; 2473 const getStars = (count) => { 2474 return Array(5).fill('<i class="bi bi-star"></i>').map((s, i) => i < count ? '<i class="bi bi-star-fill"></i>' : s).join(''); 2475 }; 2476 /* INNER WRAPPER ADDED HERE */ 2477 reviewsTrack.innerHTML = fullReviews.map(review => ` 2478<div class="slide-card review-slide"> 2479<div class="review-inner"> 2480<div> 2481<div class="stars">${getStars(5)} 2482 </div> 2483<p class="review-body">"${review.text} 2484"</p> 2485 </div> 2486<div class="review-author">- ${review.author} 2487 </div> 2488 </div> 2489 </div> 2490`).join(''); 2491 // Javascript Animation Loop 2492 let currentPosition = 0; 2493 const speed = 0.5; 2494 let isHovered = false; 2495 reviewsTrack.addEventListener('mouseenter', () => isHovered = true); 2496 reviewsTrack.addEventListener('mouseleave', () => isHovered = false); 2497 function animateSlider() { 2498 if (!isHovered) { 2499 currentPosition -= speed; 2500 const totalWidth = reviewsTrack.scrollWidth; 2501 const oneSetWidth = totalWidth / 3; 2502 if (Math.abs(currentPosition) >= oneSetWidth) { 2503 currentPosition = 0; 2504 } 2505 reviewsTrack.style.transform = `translateX(${currentPosition} 2506px)`; 2507 } 2508 requestAnimationFrame(animateSlider); 2509 } 2510 requestAnimationFrame(animateSlider); 2511 } 2512 // --- 2. CHARITY LIST --- 2513 const charityData = [ 2514 { 2515 name: "Goodwill", url: "https://www.goodwillnorthtexas.org/" } 2516 , 2517 { 2518 name: "Kidd's Kids", url: "https://www.kiddskids.org/" } 2519 , 2520 { 2521 name: "Relay For Life", url: "https://connect.relayforlife.org/" } 2522 , 2523 { 2524 name: "Meals on Wheels", url: "https://connect.relayforlife.org/" } 2525 , 2526 { 2527 name: "The Samaritan Inn", url: "https://connect.relayforlife.org/" } 2528 , 2529 { 2530 name: "Heritage High School", url: "https://connect.relayforlife.org/" } 2531 , 2532 { 2533 name: "Delicious Wishes 2016", url: "#" } 2534 , 2535 { 2536 name: "The Parker Foundation", url: "https://connect.relayforlife.org/" } 2537 , 2538 { 2539 name: "Eagleâs Wings Athletics", url: "https://connect.relayforlife.org/" } 2540 , 2541 { 2542 name: "St. Mark Catholic School", url: "https://connect.relayforlife.org/" } 2543 , 2544 { 2545 name: "Wolford Elementary PTA", url: "https://connect.relayforlife.org/" } 2546 , 2547 { 2548 name: "Bennett Elementary PTO", url: "https://connect.relayforlife.org/" } 2549 , 2550 { 2551 name: "Slaughter Elementary PTO", url: "https://connect.relayforlife.org/" } 2552 , 2553 { 2554 name: "Allen Community Outreach", url: "https://connect.relayforlife.org/" } 2555 , 2556 { 2557 name: "Childrenâs Advocacy Center", url: "https://connect.relayforlife.org/" } 2558 , 2559 { 2560 name: "McKinney Performing Arts Center", url: "https://connect.relayforlife.org/" } 2561 , 2562 { 2563 name: "Pulmonary Hypertension Association", url: "https://connect.relayforlife.org/" } 2564 , 2565 { 2566 name: "McKinney Boyd Engineering Boosters", url: "https://connect.relayforlife.org/" } 2567 , 2568 { 2569 name: "St. Peterâs Episcopal Church Youth Group", url: "https://connect.relayforlife.org/" } 2570 , 2571 { 2572 name: "McKinney High School Cross Country Team", url: "https://connect.relayforlife.org/" } 2573 , 2574 ]; 2575 const charityContainer = document.getElementById('charity-list'); 2576 if (charityContainer) { 2577 charityContainer.innerHTML = charityData.map(item => ` 2578<a href="${item.url} 2579" target="_blank" class="charity-tag">${item.name} 2580 </a> 2581`).join(''); 2582 } 2583 // --- 3. APPLY WHITE TITLES --- 2584 const mosaicTitles = document.querySelectorAll('.mosaic-overlay h3');
2585 mosaicTitles.forEach(h3 => { 2586 h3.setAttribute('style', 'color: #ffffff !important;'); 2587 } 2588 ); 2589 } 2590 ); 2591</script>
2591 2592
2593<script type="application/ld+json"> 2594{ 2595 "@context": "https://schema.org", 2596 "@type": "AboutPage", 2597 "name": "Our Story | Zin Zen Wine Bistro", 2598 "mainEntity": { 2599 "@type": ["BarOrPub", "Restaurant"], 2600 "name": "Zin Zen Wine Bistro", 2601 "description": "Zin Zen Wine Bistro was established in 2006 with a singular vision: to bring the rich, slow-paced culture of European dining to the Croatian-inspired Adriatica Village. Locally owned and operated, we curate over 80 different wines from around the world.", 2602 "foundingDate": "2006", 2603 "image": [ 2604 "https://town-public.s3.amazonaws.com/zinzenwine/hero2.webp", 2605 "https://town-public.s3.amazonaws.com/zinzenwine/hero3.webp" 2606 ], 2607 "address": { 2608 "@type": "PostalAddress", 2609 "addressLocality": "McKinney", 2610 "addressRegion": "TX" 2611 }, 2612 "hasMenu": "https://www.zinzenwine.com/m/all-day-menu-3po-50", 2613 "memberOf": { 2614 "@type": "Organization", 2615 "name": "McKinney Chamber of Commerce" 2616 } 2617 } 2618} 2619</script>
2619 2620 2621</body> 2622</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.