Skip to content

Sign in

Support: Contact us Phone: +1 (415) 732-9086

Create account

Theme preferences

Remember my choice
Saved in localStorage
Auto-open this panel
Show on next visit
We use cookies

We use essential cookies to keep the site working and optional cookies to improve experience. You can change preferences anytime.

Cookie preferences

Essential
Required for site functionality
Analytics
Help us understand usage patterns
Marketing
Personalized offers (optional)

1. Overview

The Service provides educational materials, course content, and related resources. These Terms apply to all visitors, users, and others who access the Service.

If you do not agree to these Terms, do not use the Service. If you are using the Service on behalf of an organization, you represent and warrant that you have authority to bind that organization.

  • “Content” includes videos, text, worksheets, templates, downloads, and community materials.
  • “You” refers to the individual accessing the Service (or the entity they represent).
  • Some features may be subject to additional terms shown at checkout or within the Service.

2. Eligibility & Account

2.1 Eligibility

You must be at least 18 years old (or the age of majority in your jurisdiction) to purchase paid offerings. You may browse public pages without an account.

2.2 Account security

If you create an account, you are responsible for maintaining the confidentiality of your credentials and for all activity under your account. Notify us promptly if you suspect unauthorized access.

2.3 Accurate information

You agree to provide current, complete, and accurate information during registration and checkout, and to update information as necessary.

3. License & Content

3.1 Our Content

All Content is owned by us or our licensors and is protected by applicable intellectual property laws. Purchasing or accessing Content does not transfer ownership.

3.2 Limited license to you

Subject to your compliance with these Terms and any payment obligations, we grant you a limited, non-exclusive, non-transferable, revocable license to access and use the Content for your personal, non-commercial educational purposes.

3.3 Restrictions

  • You may not reproduce, redistribute, sell, sublicense, or publicly display Content unless explicitly permitted in writing.
  • You may not share login access, downloadable files, or course materials with others.
  • You may not remove or alter any copyright, trademark, or proprietary notices.
  • You may not scrape, crawl, or use automated means to access the Service in a way that burdens systems or circumvents protections.

4. Acceptable Use

You agree not to use the Service in a way that is unlawful, harmful, or interferes with others’ use. This includes, without limitation:

  • Violating any applicable laws or regulations.
  • Infringing intellectual property or privacy rights.
  • Uploading malware, attempting to gain unauthorized access, or probing vulnerabilities.
  • Harassing, defaming, threatening, or promoting hate or violence.
  • Attempting to bypass paywalls, access controls, or license limitations.

We may suspend or terminate access if we reasonably believe you violated these Terms or created risk for the Service, other users, or third parties.

5. Payments, Refunds & Subscriptions

5.1 Pricing and taxes

Prices are displayed at checkout. Taxes may apply based on your location and will be shown before you complete your purchase.

5.2 Subscriptions

If you purchase a subscription, it renews automatically at the interval shown at checkout until canceled. You can cancel renewal from your account settings (if available) or by contacting support.

5.3 Refunds

Refund eligibility, if offered, is described at the time of purchase. If a refund policy is presented at checkout, it is incorporated into these Terms. Some purchases may be non-refundable (for example, instant-access digital downloads), as allowed by law.

5.4 Chargebacks and disputes

If you believe a charge is incorrect, contact support before initiating a chargeback. Excessive chargebacks or payment disputes may result in restricted access.

Billing notice

For billing support, email [email protected] or call +1 (415) 803-2749.

6. Third‑Party Services

The Service may integrate or link to third‑party services (for example, payment processors or analytics). Third‑party services are governed by their own terms and privacy practices. We are not responsible for third‑party services, content, or policies.

  • We may rely on third parties to process payments securely.
  • Third‑party outages may impact access to the Service.
  • You are responsible for reviewing third‑party terms when applicable.

7. Disclaimers

The Service and Content are provided on an “as is” and “as available” basis. To the maximum extent permitted by law, we disclaim all warranties, express or implied, including warranties of merchantability, fitness for a particular purpose, and non‑infringement.

Educational content is informational and may not be appropriate for every situation. You are responsible for your decisions, actions, and results.

No professional advice

Nothing on the Service constitutes legal, medical, financial, or other professional advice. If you need specific advice, consult a qualified professional.

8. Limitation of Liability

To the maximum extent permitted by law, we will not be liable for any indirect, incidental, special, consequential, or punitive damages, or any loss of profits or revenues, whether incurred directly or indirectly, arising from your use of the Service or Content.

To the maximum extent permitted by law, our total liability for any claim related to the Service will not exceed the amount you paid us for the Service in the 12 months preceding the event giving rise to the claim (or, if greater, the minimum amount permitted by law).

9. Termination

We may suspend or terminate your access to the Service at any time if we believe you violated these Terms, created risk, or used the Service in a way that could cause harm. You may stop using the Service at any time.

Sections that by their nature should survive termination (including intellectual property, disclaimers, limitation of liability, and dispute provisions) will survive.

10. Changes to Terms

We may update these Terms from time to time. The “Last updated” date above indicates when changes were made. Continued use of the Service after changes become effective constitutes your acceptance of the updated Terms.

Version reminder

You can print or save a copy for your records using the “Print / Save PDF” button at the top of this page.

11. Contact

Questions about these Terms can be sent to:

Send a message

This form is for general inquiries about the Terms. Do not submit sensitive information.

Cookie preferences

You can review your cookie choice at any time. Your selection is stored locally in your browser.

'; }) ); }); return Promise.all(tasks); } function tocBehavior() { const tocToggle = d.getElementById('q0z4r'); const tocWrap = d.getElementById('k2b8x'); if (tocToggle && tocWrap) { tocToggle.addEventListener('click', () => { const isHidden = tocWrap.classList.toggle('hidden'); tocToggle.textContent = isHidden ? 'Expand' : 'Collapse'; }); } const links = Array.from(d.querySelectorAll('a.u3c9v')); const sections = links.map(a => d.querySelector(a.getAttribute('href'))).filter(Boolean); const sectionName = d.getElementById('z6y1a'); function setActive(id) { links.forEach(a => { const hit = a.getAttribute('href') === '#' + id; a.classList.toggle('bg-black/5', hit); a.classList.toggle('text-black', hit); a.classList.toggle('text-black/85', !hit); }); if (sectionName) { const map = { overview:'Overview', eligibility:'Eligibility & Account', license:'License & Content', acceptable:'Acceptable Use', payments:'Payments, Refunds & Subscriptions', thirdparty:'Third‑Party Services', disclaimer:'Disclaimers', liability:'Limitation of Liability', termination:'Termination', changes:'Changes to Terms', contact:'Contact' }; sectionName.textContent = 'Section: ' + (map[id] || '—'); } } const io = new IntersectionObserver((entries) => { const visible = entries .filter(e => e.isIntersecting) .sort((a,b)=> b.intersectionRatio - a.intersectionRatio)[0]; if (visible && visible.target && visible.target.id) setActive(visible.target.id); }, { root: null, threshold: [0.15, 0.25, 0.4, 0.6], rootMargin: '-15% 0px -70% 0px' }); sections.forEach(s => io.observe(s)); setActive((sections[0] && sections[0].id) ? sections[0].id : 'overview'); } function progressBar() { const bar = d.getElementById('j9t4w'); const label = d.getElementById('d8k2p'); function calc() { const doc = d.documentElement; const scrollTop = doc.scrollTop || body.scrollTop; const height = doc.scrollHeight - doc.clientHeight; const p = height > 0 ? Math.min(100, Math.max(0, (scrollTop / height) * 100)) : 0; if (bar) bar.style.width = p.toFixed(1) + '%'; if (label) label.textContent = Math.round(p) + '%'; } calc(); window.addEventListener('scroll', calc, { passive: true }); window.addEventListener('resize', calc); } function modalSummary() { const openBtn = d.getElementById('r1n5e'); const modal = d.getElementById('o7k2c'); const closeBtn = d.getElementById('c9a4p'); const okBtn = d.getElementById('x1d6k'); const backdrop = d.getElementById('b0v4n'); const focusablesSel = 'button,[href],input,textarea,select,[tabindex]:not([tabindex="-1"])'; let lastFocus = null; function open() { if (!modal) return; lastFocus = d.activeElement; modal.classList.remove('hidden'); body.style.overflow = 'hidden'; const f = modal.querySelector(focusablesSel); if (f) f.focus(); } function close() { if (!modal) return; modal.classList.add('hidden'); body.style.overflow = ''; if (lastFocus && lastFocus.focus) lastFocus.focus(); } function trap(e) { if (!modal || modal.classList.contains('hidden')) return; if (e.key === 'Escape') return close(); if (e.key !== 'Tab') return; const f = Array.from(modal.querySelectorAll(focusablesSel)).filter(el => !el.hasAttribute('disabled')); if (!f.length) return; const first = f[0]; const last = f[f.length - 1]; if (e.shiftKey && d.activeElement === first) { e.preventDefault(); last.focus(); } else if (!e.shiftKey && d.activeElement === last) { e.preventDefault(); first.focus(); } } if (openBtn) openBtn.addEventListener('click', open); if (closeBtn) closeBtn.addEventListener('click', close); if (okBtn) okBtn.addEventListener('click', close); if (backdrop) backdrop.addEventListener('click', close); d.addEventListener('keydown', trap); } function cookieConsent() { const banner = d.getElementById('p4y7h'); const closeX = d.getElementById('z8c2b'); const acceptAll = d.getElementById('n3w9d'); const reject = d.getElementById('h2p6v'); const customize = d.getElementById('k8q1s'); const panel = d.getElementById('s9j2f'); const cancel = d.getElementById('u0l8c'); const save = d.getElementById('g1n7z'); const openManage = d.getElementById('f5l0s'); const analyticsBtn = d.getElementById('a2u6y'); const analyticsKnob = d.getElementById('m5e1l'); const marketingBtn = d.getElementById('p9t3k'); const marketingKnob = d.getElementById('q7r4d'); function setToggle(btn, knob, on) { if (!btn || !knob) return; btn.classList.toggle('bg-brand', on); btn.classList.toggle('bg-white', !on); knob.classList.toggle('translate-x-6', on); knob.classList.toggle('translate-x-1', !on); knob.classList.toggle('bg-white', on); knob.classList.toggle('bg-black/25', !on); } function readState() { const raw = localStorage.getItem('gg_cookie_consent'); if (!raw) return null; try { const obj = JSON.parse(raw); if (!obj || typeof obj !== 'object') return null; if (typeof obj.choice !== 'string') return null; return obj; } catch { return null; } } function writeState(state) { localStorage.setItem('gg_cookie_consent', JSON.stringify(state)); } function showBanner() { if (!banner) return; banner.classList.remove('hidden'); } function hideBanner() { if (!banner) return; banner.classList.add('hidden'); if (panel) panel.classList.add('hidden'); } function applyStateToUI(state) { const a = !!(state && state.analytics); const m = !!(state && state.marketing); setToggle(analyticsBtn, analyticsKnob, a); setToggle(marketingBtn, marketingKnob, m); } function defaultState() { return { choice: 'custom', analytics: false, marketing: false, ts: Date.now() }; } function ensureConsent() { const state = readState(); if (!state) showBanner(); else applyStateToUI(state); } function openCustomize() { if (!banner) return; banner.classList.remove('hidden'); if (panel) panel.classList.remove('hidden'); const state = readState() || defaultState(); applyStateToUI(state); } function setAll(val) { const state = { choice: val ? 'accept_all' : 'reject_optional', analytics: !!val, marketing: !!val, ts: Date.now() }; writeState(state); applyStateToUI(state); hideBanner(); } function savePrefs() { const state = readState() || defaultState(); state.choice = 'custom'; state.ts = Date.now(); writeState(state); hideBanner(); } function toggleAnalytics() { const state = readState() || defaultState(); state.analytics = !state.analytics; writeState(state); applyStateToUI(state); } function toggleMarketing() { const state = readState() || defaultState(); state.marketing = !state.marketing; writeState(state); applyStateToUI(state); } if (acceptAll) acceptAll.addEventListener('click', () => setAll(true)); if (reject) reject.addEventListener('click', () => setAll(false)); if (customize) customize.addEventListener('click', openCustomize); if (openManage) openManage.addEventListener('click', openCustomize); if (cancel) cancel.addEventListener('click', hideBanner); if (closeX) closeX.addEventListener('click', hideBanner); if (save) save.addEventListener('click', savePrefs); if (analyticsBtn) analyticsBtn.addEventListener('click', toggleAnalytics); if (marketingBtn) marketingBtn.addEventListener('click', toggleMarketing); ensureConsent(); } function printBtn() { const btn = d.getElementById('m9p2d'); if (btn) btn.addEventListener('click', () => window.print()); } function contactForm() { const form = d.getElementById('b7s1u'); if (!form) return; const name = d.getElementById('n1v7c'); const email = d.getElementById('u4k2h'); const msg = d.getElementById('p5d8m'); const ok = d.getElementById('c3x8q'); const errName = d.getElementById('e0r8l'); const errEmail = d.getElementById('w2q9a'); const errMsg = d.getElementById('a9f3t'); const out = d.getElementById('h8j2k'); const clearBtn = d.getElementById('s4h1y'); function setErr(el, box, text) { if (!box) return; if (text) { box.textContent = text; box.classList.remove('hidden'); if (el) el.classList.add('border-red-400'); } else { box.textContent = ''; box.classList.add('hidden'); if (el) el.classList.remove('border-red-400'); } } function validEmail(v) { const s = (v || '').trim(); if (s.length > 254) return false; return /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(s); } function validate() { const n = (name.value || '').trim(); const e = (email.value || '').trim(); const m = (msg.value || '').trim(); let good = true; setErr(name, errName, ''); setErr(email, errEmail, ''); setErr(msg, errMsg, ''); if (out) out.classList.add('hidden'); if (n.length < 2) { setErr(name, errName, 'Please enter your full name (at least 2 characters).'); good = false; } if (!validEmail(e)) { setErr(email, errEmail, 'Please enter a valid email address.'); good = false; } if (m.length < 12) { setErr(msg, errMsg, 'Please enter a message (at least 12 characters).'); good = false; } if (!ok.checked) { good = false; } return good; } form.addEventListener('submit', (ev) => { ev.preventDefault(); if (!validate()) { if (out) { out.textContent = 'Please fix the highlighted fields and confirm the checkbox.'; out.className = 'rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm font-semibold text-red-900'; out.classList.remove('hidden'); } return; } const payload = { name: (name.value || '').trim(), email: (email.value || '').trim(), message: (msg.value || '').trim(), meta: { page: 'terms.html', ts: new Date().toISOString() } }; localStorage.setItem('gg_terms_contact_last', b64(JSON.stringify(payload))); form.reset(); if (out) { out.textContent = 'Message prepared successfully. Please email [email protected] if you need a direct response (this demo stores the request locally).'; out.className = 'rounded-xl border border-emerald-200 bg-emerald-50 px-4 py-3 text-sm font-semibold text-emerald-900'; out.classList.remove('hidden'); } }); if (clearBtn) clearBtn.addEventListener('click', () => { form.reset(); setErr(name, errName, ''); setErr(email, errEmail, ''); setErr(msg, errMsg, ''); if (out) out.classList.add('hidden'); name.focus(); }); [name, email, msg].forEach((el) => { if (!el) return; el.addEventListener('input', () => validate()); }); ok.addEventListener('change', () => validate()); } function bindThemeBtn() { const btn = d.getElementById('xk8a2'); if (btn) btn.addEventListener('click', toggleTheme); } function tocLinkColorFixOnTheme() { const apply = () => { const mode = body.getAttribute('data-theme') === 'dark' ? 'dark' : 'light'; const tocLinks = d.querySelectorAll('a.u3c9v'); tocLinks.forEach(a => { if (mode === 'dark') { a.classList.remove('text-black/85','text-black'); a.classList.add('text-white/85'); } else { a.classList.remove('text-white/85'); a.classList.add('text-black/85'); } }); }; apply(); const obs = new MutationObserver(apply); obs.observe(body, { attributes: true, attributeFilter: ['data-theme'] }); } applyInitialTheme(); bindThemeBtn(); printBtn(); tocBehavior(); progressBar(); modalSummary(); cookieConsent(); contactForm(); tocLinkColorFixOnTheme(); includePartials().then(() => { syncSurface(body.getAttribute('data-theme') === 'dark' ? 'dark' : 'light'); }); })();