Background of Messages

(This tool is difficult to use on Safari, impossible on a mobile device.)

Html 060426

<style>

.mc-card {max-width: 960px;margin: 1.5rem auto;padding: 1.25rem 1.5rem;border: 1px solid #ccc;border-radius: 8px;font-family: system-ui, -apple-system, BlinkMacSystemFont, “Segoe UI”, sans-serif;background: #fafafa;}

.mc-intro-box {margin-bottom: 1rem;padding: 0.9rem 1rem 1rem;border-radius: 8px;background: #003d80;border: 1px solid #002b5a;color: #fff;}

.mc-intro-box h2 {color: #fff;}

.mc-card h2 {margin-top: 0;margin-bottom: 0.6rem;font-size: 1.9rem;text-align: center;}

.mc-small {font-size: 1.1rem;color: #555;margin-bottom: 0.6rem;}

.mc-intro-box .mc-small {color: #f5f5f5;}

.mc-hint {font-size: 0.8rem;color: #666;}

.mc-warning {color: #c00;margin-top: 0.25rem;}

.mc-field {margin-bottom: 0.75rem;display: flex;flex-direction: column;}

.mc-field label {font-weight: 600;margin-bottom: 0.25rem;font-size: 0.9rem;color: #444;}

.mc-grid {display: grid;grid-template-columns: 2fr 1fr 1fr;gap: 0.75rem;}

@media (max-width: 640px) {.mc-grid {grid-template-columns: 1fr;}}

input[type=”text”],input[type=”email”],input[type=”tel”],textarea {padding: 0.4rem 0.5rem;border-radius: 4px;border: 1px solid #bbb;font-size: 0.95rem;}

textarea {resize: vertical;}

.mc-button-row {display: flex;flex-wrap: wrap;gap: 0.5rem;margin-top: 0.25rem;align-items: center;}

.mc-button-row–top {margin-bottom: 0.35rem;}

.mc-button {padding: 0.5rem 0.9rem;font-size: 0.95rem;border-radius: 4px;border: none;background: #0077cc;color: #fff;cursor: pointer;}

.mc-button:hover {background: #005fa3;}

.mc-button[disabled] {opacity: 0.5;cursor: not-allowed;}

.mc-button–secondary {background: #eee;color: #000;border: 1px solid #666;font-weight: 800;}

.mc-button–secondary:hover {background: #ddd;}

.mc-status {margin-top: 0.4rem;font-size: 0.9rem;}

.mc-status–ok {color: #0a7a12;}

.mc-status–error {color: #c00;}

.mc-profile-switcher[hidden] {display: none;}

.mc-profiles-list {list-style: none;padding-left: 0;margin: 0.5rem 0 0;}

.mc-profiles-list li {padding: 0.35rem 0.5rem;margin-bottom: 0.25rem;border-radius: 4px;border: 1px solid #ddd;cursor: pointer;display: flex;align-items: center;gap: 0.5rem;background: #fff;font-size: 0.9rem;}

.mc-profiles-list li.mc-profile-current {border-color: #0077cc;background: #e9f3ff;}

.mc-profile-delete {margin-left: auto;border: none;background: transparent;color: #b00;cursor: pointer;font-size: 0.85rem;}

.mc-messages-list {display: grid;grid-template-columns: 1fr 1fr;gap: 0.4rem;margin-top: 0.5rem;}

@media (max-width: 600px) {.mc-messages-list {grid-template-columns: 1fr;}}

.mc-message-option {display: flex;align-items: center;gap: 0.35rem;padding: 0.35rem 0.5rem;border-radius: 4px;border: 1px solid #ddd;cursor: pointer;background: #fff;font-size: 0.9rem;}

.mc-message-option input[type=”radio”] {margin: 0;}

.mc-recipients {display: flex;flex-wrap: wrap;gap: 0.5rem;margin-top: 0.75rem;}

.mc-recipient-row {flex: 1 1 260px;padding: 0.45rem 0.6rem;border-radius: 4px;border: 1px solid #0077cc;background: #fff;display: flex;flex-direction: column;gap: 0.35rem;}

.mc-recipient {display: block;width: 100%;padding: 0.45rem 0.6rem;font-size: 0.9rem;border-radius: 4px;border: 1px solid #cfe5f8;background: #fff;color: #004c7f;cursor: pointer;text-align: center;text-decoration: none;}

.mc-recipient:hover {background: #e9f3ff;}

.mc-recipient.mc-recipient–used {background: #2d8a1f;color: #fff;border-color:#2d8a1f;}

.mc-step-label {font-size: 1.25rem;font-weight: 700;}

.mc-section h3 {margin-top: 1.4rem;font-size: 1.1rem;display: flex;align-items: baseline;gap: 0.4rem;}

.mc-copy-row {display:flex;flex-wrap:wrap;gap:0.5rem;margin:0.35rem 0 0.2rem;align-items:center;}

.mc-dark-copy {color:#000;font-weight:800;}

.mc-link-row {display:flex;flex-wrap:wrap;gap:0.4rem;align-items:center;justify-content:space-between;}

.mc-link-row small {font-size:0.8rem;color:#555;word-break:break-word;}

.mc-link-actions {display:flex;gap:0.35rem;flex-wrap:wrap;}

.mc-mini-btn{padding:0.25rem 0.5rem;border-radius:4px;border:1px solid #bbb;background:#f3f3f3;color:#333;cursor:pointer;font-size:0.8rem;}

.mc-mini-btn:hover{background:#e6e6e6;}

</style>

<div class=”mc-card” id=”us-sos-message-congress-app”>

  <div class=”mc-intro-box”>

    <h2>Message Congress</h2>

<div style=”text-align:center; margin-bottom:10px;”>

  <a href=”https://us-sos.info/how-to-fix-the-nation-2/” target=”_blank” rel=”noopener noreferrer”>

    Context of Messages

  </a>

</div>

    <p class=”mc-small mc-intro-lead”>This tool makes it easy to send messages to your members of Congress. It allows you to:</p>

    <ol class=”mc-small mc-intro-list” type=”a”>

      <li><strong>Select from suggested messages (and optionally edit them)</strong> or create your own.</li>

      <li><strong>Choose which member of Congress receives your message.</strong></li>

      <li><strong>Automatically personalize the message</strong> with a salutation to the recipient and a closing from you.</li>

      <li><strong>Send one message to all of your Congress members, then send a different one.</strong></li>

    </ol>

    <p class=”mc-small”>

      <strong>Privacy note:</strong> your address and ZIP Code are sent to Geocodio to identify your members of Congress.

      Everything else stays in your browser and on this device.

    </p>

  </div>

  <section class=”mc-section” id=”mc-step-1″>

    <h4>Step 1. Get voter information</h4>

    <div class=”mc-button-row mc-button-row–top”>

      <span class=”mc-small”>You can input your information below or select a saved profile:</span>

      <button type=”button” class=”mc-button mc-button–secondary” id=”mc-change-user-button”>Select or change user</button>

    </div>

    <div id=”mc-profile-switcher” class=”mc-profile-switcher” hidden=””>

      <p class=”mc-small”>Choose a saved profile or make a new one. Saved profiles are stored only in this browser on this device.</p>

      <ul id=”mc-profile-list” class=”mc-profiles-list”></ul>

    </div>

    <div class=”mc-subsection”>

      <p class=”mc-small”>

        <a href=”https://us-sos.info/browser-autofill/” target=”_blank” rel=”noopener”>Most browsers will autofill your voter information. You can edit it here</a>.

        (Be sure to use your official name.) This tool uses the information to sign your message and to find your members of Congress.

        You can save it as a profile so this device remembers it.

      </p>

      <form id=”us-sos-voter-info-form” autocomplete=”on”>

        <div class=”mc-field”>

          <label for=”voter-name”>Your full name</label>

          <input type=”text” id=”voter-name” name=”name” autocomplete=”name” placeholder=”Example: John Doe” autocapitalize=”words”>

        </div>

        <div class=”mc-field”>

          <label for=”voter-street”>Street address</label>

          <input type=”text” id=”voter-street” name=”street-address” autocomplete=”street-address” autocapitalize=”words”>

        </div>

        <div class=”mc-grid”>

          <div class=”mc-field”>

            <label for=”voter-city”>City</label>

            <input type=”text” id=”voter-city” name=”address-level2″ autocomplete=”address-level2″ autocapitalize=”words”>

          </div>

          <div class=”mc-field”>

            <label for=”voter-state”>State (2-letter code)</label>

            <input type=”text” id=”voter-state” name=”address-level1″ autocomplete=”address-level1″ maxlength=”2″ autocapitalize=”characters” spellcheck=”false”>

          </div>

          <div class=”mc-field”>

            <label for=”voter-zip”>ZIP code</label>

            <input type=”text” id=”voter-zip” name=”postal-code” autocomplete=”postal-code” maxlength=”10″ inputmode=”numeric” spellcheck=”false”>

          </div>

        </div>

        <div class=”mc-field mc-field-email”>

          <label for=”voter-email”>Email</label>

          <input type=”email” id=”voter-email” name=”email” autocomplete=”email” inputmode=”email” autocapitalize=”none” spellcheck=”false”>

        </div>

        <div class=”mc-field mc-field-phone”>

          <label for=”voter-phone”>Phone</label>

          <input type=”tel” id=”voter-phone” name=”tel” autocomplete=”tel” inputmode=”tel” placeholder=”Example: 206-555-1212″ autocapitalize=”none” spellcheck=”false”>

        </div>

        <div class=”mc-field”>

          <label for=”voter-handle”>Profile handle (for saving and switching)</label>

          <input type=”text” id=”voter-handle” name=”nickname” autocomplete=”nickname” placeholder=”Example: john-seattle-98101″ autocapitalize=”none” spellcheck=”false”>

        </div>

        <small class=”mc-hint”>

          If you leave the “handle” field blank, the tool will create a handle automatically from your name and location.

        </small>

        <p id=”mc-required-info-warning” class=”mc-small mc-warning” hidden=””>

          Please enter your name and either your ZIP code or your city and state above.

        </p>

        <div class=”mc-button-row”>

          <button type=”button” class=”mc-button” id=”mc-save-profile-button”>

            Save this info as a profile on this device

          </button>

        </div>

        <div id=”voter-info-status” class=”mc-status” aria-live=”polite”></div>

      </form>

    </div>

    <div class=”mc-subsection”>

      <h4>Step 2. Prepare the message</h4>

      <p class=”mc-small”>Pick a message, or write your own. You can edit the subject and text before sending it.</p>

      <div class=”mc-messages-list”>

<label class=”mc-message-option”>

  <input type=”radio” name=”mc-message-choice” value=”end_iran_war”>

  <span>End the Iran War</span>

</label>

<label class=”mc-message-option”>

  <input type=”radio” name=”mc-message-choice” value=”end_trickle_down”>

  <span>End Trickle-Down Economics</span>

</label>

        <label class=”mc-message-option”><input type=”radio” name=”mc-message-choice” value=”overrule_citizens_united”><span>Overrule Citizens United</span></label>

        <label class=”mc-message-option”><input type=”radio” name=”mc-message-choice” value=”impeach_convict_trump”><span>Impeach and Convict Donald Trump</span></label>

<label class=”mc-message-option”><input type=”radio” name=”mc-message-choice” value=”disqualify_trickle_down_successors”><span>Anyone who supported trickle-down economics should not succeed Trump</span></label>

<label class=”mc-message-option”><input type=”radio” name=”mc-message-choice” value=”restore_voting_rights_act”><span>Restore the Voting Rights Act</span></label>

<label class=”mc-message-option”><input type=”radio” name=”mc-message-choice” value=”reparations_to_iran”><span>Show our nation’s greatness and give reparations to Iran</span></label>

        <label class=”mc-message-option”><input type=”radio” name=”mc-message-choice” value=”humanistic_authoritarian_ai”><span>    Require Strong Safety Standards for AI</span></label>

        <label class=”mc-message-option”><input type=”radio” name=”mc-message-choice” value=”protect_social_security”><span>Protect Social Security and Medicare</span></label>

        <label class=”mc-message-option”><input type=”radio” name=”mc-message-choice” value=”tax_hyper_rich_climate”><span>Tax the Hyper-Rich to Fight Climate Change</span></label>

        <label class=”mc-message-option”><input type=”radio” name=”mc-message-choice” value=”abolish_electoral_college”><span>Abolish the Electoral College</span></label>

        <label class=”mc-message-option”><input type=”radio” name=”mc-message-choice” value=”protect_reproductive_freedom”><span>Protect reproductive freedom nationwide</span></label>

        <label class=”mc-message-option”><input type=”radio” name=”mc-message-choice” value=”icc_accountability_netanyahu”><span>Condemn Netanyahu for his war crimes and crimes against humanity — align U.S. policy with humanitarian law</span></label>

        <label class=”mc-message-option”><input type=”radio” name=”mc-message-choice” value=”humanitarian_aid_palestinians”><span>Humanitarian aid for Palestinians</span></label>

        <label class=”mc-message-option”><input type=”radio” name=”mc-message-choice” value=”condition_offensive_weapons_ceasefire”><span>Condition offensive weapons transfers on verified ceasefire compliance</span></label>

        <label class=”mc-message-option”><input type=”radio” name=”mc-message-choice” value=”write_own”><span>Write your own message</span></label>

      </div>

      <div class=”mc-field”>

        <label for=”mc-subject”>Subject line (for official forms)</label>

        <input type=”text” id=”mc-subject”>

      </div>

      <div class=”mc-copy-row”>

        <button type=”button” class=”mc-button mc-button–secondary” id=”mc-copy-subject-btn”>Copy subject</button>

        <button type=”button” class=”mc-button mc-button–secondary” id=”mc-copy-message-btn”>Copy message</button>

      </div>

      <div id=”mc-copy-status” class=”mc-status” aria-live=”polite”></div>

      <div class=”mc-field”>

        <label for=”mc-body”>Message text</label>

        <textarea id=”mc-body” rows=”10″></textarea>

      </div>

    </div>

  </section>

  <section class=”mc-section” id=”mc-step-2″>

    <h4>Step 3. Open the official’s message form:</h4>

    <div class=”mc-subsection”>

      <button type=”button” class=”mc-button” id=”mc-find-reps-button” disabled=””>Find my U.S. Representative and Senators</button>

      <div id=”mc-geo-status” class=”mc-status” aria-live=”polite”></div>

      <p class=”mc-small” id=”mc-side-by-side-tip”>

        <strong>Note:</strong> When you click on an official’s name, the official’s contact form will cover this tool.

        To make both visible, click and drag the official’s browser tab down and to the right in order to make a separate window,

        then click and drag the left edge of the page to place the windows side by side. To move a whole page, click and drag on an empty space at the top of the browser window.

      </p>

<p class=”mc-small”>

  The official’s page that comes up may not be the form that you want, but it should help you find it.

  Look for words like <strong>“contact”</strong> or <strong>“email.”</strong>

  There may be a message icon in the upper right corner. Try clicking on that.</p>

<p class=”mc-small”>

If there’s nothing helpful on the page, try making the page bigger by clicking and dragging on its edge. Sometimes important information is hidden if the page is too small. </p>

<p class=”mc-small”>

  When you find the form, click the <strong>“Fix link”</strong> button, erase the address in the <strong>New URL:</strong> box, paste the correct address into the box, and click <strong>OK</strong>. You won’t have to hunt for the form again.

</p>

<p class=”mc-small”>

  It’s even possible that you’ve been given the wrong Congress member.

  If all else fails,

  <a href=”https://www.usa.gov/elected-officials” _blank”=”” rel=”noopener”>

    Find your member on www.usa.gov/elected-officials

  </a>

  will provide the form. </p>

      <div id=”mc-personal-recipients” class=”mc-recipients”></div>

    </div>

  </section>

  <!– Added Step 4 after Step 3 (no existing text changed) –>

<section class=”mc-section” id=”mc-step-3″>

  <h4>Step 4. Send the message.</h4>

  <ol class=”mc-small” type=”a”>

    <li>Input your voter information by starting to type your name into the form, then clicking on the suggested autofill. If the autofill doesn’t work correctly, you’ll may want to copy and paste from Step 1, above, or enter the information manually. (As far as I can tell, Firefox always works.)</li>

    <li>If the official’s site uses a “topic” or “category” dropdown, choose the closest matching topic.</li>

    <li><strong><span style=”color:#000; font-weight:900;”>Click twice</span></strong> on <strong><span style=”color:#000; font-weight:900;”>Copy subject</span></strong>, then <strong><span style=”color:#000; font-weight:900;”>click twice</span></strong> on where it should go, and paste it into place.</li>

    <li><strong><span style=”color:#000; font-weight:900;”>Click twice</span></strong> on <strong><span style=”color:#000; font-weight:900;”>Copy message</span></strong>, then <strong><span style=”color:#000; font-weight:900;”>click twice</span></strong> on where it should go, and paste it into place.</li>

    <li>Click <strong>Send</strong> on the message form.</li> 

    <li>Close the official’s form.</li> 

  </ol>

  <p> To send the message to another congress member, repeat from Step 3. For a different message, repeat from Step 2.</p>

</section>

<script>

(function () {

  function markDebug(msg, ok) {

    var el = document.getElementById(“voter-info-status”);

    if (!el) return;

    el.textContent = msg || “”;

    el.classList.remove(“mc-status–ok”, “mc-status–error”);

    if (!msg) return;

    el.classList.add(ok ? “mc-status–ok” : “mc-status–error”);

  }

  const US_SOS_GEOCODIO_API_KEY = “6c69565ee96c9ec92b55c65f2ce2b9ecbd96e5e”;

  const US_SOS_STORAGE_KEY_PROFILES = “us_sos_voter_profiles_v1”;

  const US_SOS_STORAGE_KEY_CURRENT  = “us_sos_current_voter_handle_v1”;

  const US_SOS_STORAGE_KEY_URL_OVERRIDES = “us_sos_recipient_url_overrides_v1”;

  function usSosSafeGetLocalStorage(key, fallback) {

    try {

      const raw = window.localStorage.getItem(key);

      if (!raw) return fallback;

      return JSON.parse(raw);

    } catch (e) {

      return fallback;

    }

  }

  function usSosSafeSetLocalStorage(key, value) {

    try {

      window.localStorage.setItem(key, JSON.stringify(value));

      return true;

    } catch (e) {

      console.error(“localStorage error”, e);

      return false;

    }

  }

  function usSosGetProfiles() {

    const profiles = usSosSafeGetLocalStorage(US_SOS_STORAGE_KEY_PROFILES, []);

    return Array.isArray(profiles) ? profiles : [];

  }

  function usSosSetProfiles(profiles) {

    return usSosSafeSetLocalStorage(US_SOS_STORAGE_KEY_PROFILES, profiles);

  }

  function usSosGetCurrentHandle() {

    const handle = usSosSafeGetLocalStorage(US_SOS_STORAGE_KEY_CURRENT, “”);

    return typeof handle === “string” ? handle : “”;

  }

  function usSosSetCurrentHandle(handle) {

    return usSosSafeSetLocalStorage(US_SOS_STORAGE_KEY_CURRENT, handle || “”);

  }

  function usSosFindProfileByHandle(handle) {

    const profiles = usSosGetProfiles();

    return profiles.find(function (p) { return p.handle === handle; }) || null;

  }

  function usSosUpsertProfile(profile) {

    if (!profile || !profile.handle) return;

    const profiles = usSosGetProfiles();

    const idx = profiles.findIndex(function (p) { return p.handle === profile.handle; });

    if (idx >= 0) profiles[idx] = profile;

    else profiles.push(profile);

    usSosSetProfiles(profiles);

  }

  function usSosGetUrlOverrides() {

    const m = usSosSafeGetLocalStorage(US_SOS_STORAGE_KEY_URL_OVERRIDES, {});

    return (m && typeof m === “object”) ? m : {};

  }

  function usSosSetUrlOverrides(map) {

    return usSosSafeSetLocalStorage(US_SOS_STORAGE_KEY_URL_OVERRIDES, map || {});

  }

  async function usSosCopyToClipboard(text) {

    const t = (text || “”).toString();

    if (!t) throw new Error(“Nothing to copy.”);

    if (navigator.clipboard && typeof navigator.clipboard.writeText === “function”) {

      await navigator.clipboard.writeText(t);

      return true;

    }

    const ta = document.createElement(“textarea”);

    ta.value = t;

    ta.setAttribute(“readonly”, “”);

    ta.style.position = “fixed”;

    ta.style.left = “-9999px”;

    ta.style.top = “0”;

    document.body.appendChild(ta);

    ta.select();

    ta.setSelectionRange(0, ta.value.length);

    const ok = document.execCommand(“copy”);

    document.body.removeChild(ta);

    if (!ok) throw new Error(“execCommand(copy) failed.”);

    return true;

  }

  function selectAll(el) {

    if (!el) return;

    try {

      el.focus();

      if (typeof el.select === “function”) el.select();

    } catch (e) {}

  }

  function setCopyStatus(msg, ok) {

    const el = document.getElementById(“mc-copy-status”);

    if (!el) return;

    el.textContent = msg || “”;

    el.classList.remove(“mc-status–ok”, “mc-status–error”);

    if (!msg) return;

    el.classList.add(ok ? “mc-status–ok” : “mc-status–error”);

  }

  function usSosInitMessageCongressApp() {

    const root = document.getElementById(“us-sos-message-congress-app”);

    if (!root) return;

    let usSosCurrentRecipient = null;

    let usSosBackgroundBody = “”;

    let usSosInPersonalizedPreview = false;

    function setProfileStatus(message, ok) {

      const el = document.getElementById(“voter-info-status”);

      if (!el) return;

      el.textContent = message || “”;

      el.classList.remove(“mc-status–ok”, “mc-status–error”);

      if (!message) return;

      el.classList.add(ok ? “mc-status–ok” : “mc-status–error”);

    }

    function setGeoStatus(msg, ok) {

      const el = document.getElementById(“mc-geo-status”);

      if (!el) return;

      el.textContent = msg || “”;

      el.classList.remove(“mc-status–ok”, “mc-status–error”);

      if (!msg) return;

      el.classList.add(ok ? “mc-status–ok” : “mc-status–error”);

    }

    function collectIdentityFromForm() {

      function v(id) {

        const el = document.getElementById(id);

        return el ? el.value.trim() : “”;

      }

      return {

        handle: v(“voter-handle”),

        name: v(“voter-name”),

        email: v(“voter-email”),

        phone: v(“voter-phone”),

        street: v(“voter-street”),

        city: v(“voter-city”),

        state: v(“voter-state”).toUpperCase(),

        zip: v(“voter-zip”)

      };

    }

    function fillIdentityForm(profile) {

      if (!profile) return;

      function set(id, val) {

        const el = document.getElementById(id);

        if (el) el.value = val || “”;

      }

      set(“voter-handle”, profile.handle || “”);

      set(“voter-name”, profile.name || “”);

      set(“voter-email”, profile.email || “”);

      set(“voter-phone”, profile.phone || “”);

      set(“voter-street”, profile.street || “”);

      set(“voter-city”, profile.city || “”);

      set(“voter-state”, profile.state || “”);

      set(“voter-zip”, profile.zip || “”);

    }

    function hasRequiredIdentity() {

      const d = collectIdentityFromForm();

      const hasLocation = !!d.zip || (!!d.city && !!d.state);

      return !!(d.name && hasLocation);

    }

    function getActiveIdentity() {

      const currentHandle = usSosGetCurrentHandle();

      if (currentHandle) {

        const profile = usSosFindProfileByHandle(currentHandle);

        if (profile) return profile;

      }

      const d = collectIdentityFromForm();

      if (!d.name && !d.city && !d.state && !d.zip) return null;

      return d;

    }

    function updateIdentityDependentUI() {

      const hasId = hasRequiredIdentity();

      const findBtn = document.getElementById(“mc-find-reps-button”);

      const warn = document.getElementById(“mc-required-info-warning”);

      if (findBtn) findBtn.disabled = !hasId;

      if (warn) warn.hidden = hasId;

    }

    function autoSyncProfileFromForm() {

      const handle = usSosGetCurrentHandle();

      if (!handle) return;

      const profile = usSosFindProfileByHandle(handle);

      if (!profile) return;

      const data = collectIdentityFromForm();

      profile.name = data.name;

      profile.email = data.email;

      profile.phone = data.phone;

      profile.street = data.street;

      profile.city = data.city;

      profile.state = data.state;

      profile.zip = data.zip;

      usSosUpsertProfile(profile);

    }

    function renderProfileList() {

      const listEl = document.getElementById(“mc-profile-list”);

      if (!listEl) return;

      const profiles = usSosGetProfiles();

      const currentHandle = usSosGetCurrentHandle();

      listEl.innerHTML = “”;

      if (!profiles.length) {

        const li = document.createElement(“li”);

        li.textContent = “No saved profiles yet. Enter your info above and click “Save this info as a profile” to create one.”;

        li.style.cursor = “default”;

        listEl.appendChild(li);

        return;

      }

      profiles.forEach(function (p) {

        const li = document.createElement(“li”);

        li.dataset.handle = p.handle || “”;

        const nameSpan = document.createElement(“span”);

        nameSpan.className = “mc-profile-name”;

        nameSpan.textContent = p.handle || “(no handle)”;

        const metaSpan = document.createElement(“span”);

        metaSpan.className = “mc-profile-meta”;

        metaSpan.textContent = p.name || “”;

        const delBtn = document.createElement(“button”);

        delBtn.type = “button”;

        delBtn.className = “mc-profile-delete”;

        delBtn.textContent = “Remove”;

        li.appendChild(nameSpan);

        li.appendChild(metaSpan);

        li.appendChild(delBtn);

        if (p.handle === currentHandle) li.classList.add(“mc-profile-current”);

        li.addEventListener(“click”, function () {

          if (!p.handle) return;

          usSosSetCurrentHandle(p.handle);

          fillIdentityForm(p);

          usSosCurrentRecipient = null;

          usSosInPersonalizedPreview = false;

          renderProfileList();

          setProfileStatus(‘Loaded profile “‘ + (p.handle || “”) + ‘” and made it active.’, true);

          updateIdentityDependentUI();

          const switcher = document.getElementById(“mc-profile-switcher”);

          if (switcher) switcher.setAttribute(“hidden”, “hidden”);

        });

        delBtn.addEventListener(“click”, function (evt) {

          evt.stopPropagation();

          const updated = usSosGetProfiles().filter(function (q) { return q.handle !== p.handle; });

          usSosSetProfiles(updated);

          if (usSosGetCurrentHandle() === p.handle) usSosSetCurrentHandle(“”);

          renderProfileList();

          setProfileStatus(‘Removed profile “‘ + (p.handle || “”) + ‘”.’, true);

          updateIdentityDependentUI();

        });

        listEl.appendChild(li);

      });

      const newLi = document.createElement(“li”);

      newLi.textContent = “➕ New profile…”;

      newLi.style.fontStyle = “italic”;

      newLi.addEventListener(“click”, function () {

        fillIdentityForm({ handle:””, name:””, email:””, phone:””, street:””, city:””, state:””, zip:”” });

        usSosSetCurrentHandle(“”);

        usSosCurrentRecipient = null;

        usSosInPersonalizedPreview = false;

        renderProfileList();

        setProfileStatus(“Enter new information above and click “Save this info as a profile on this device”.”, true);

        updateIdentityDependentUI();

      });

      listEl.appendChild(newLi);

    }

    function initProfileSection() {

      [“voter-name”,”voter-street”,”voter-city”,”voter-state”,”voter-zip”,”voter-email”,”voter-phone”].forEach(function (id) {

        const el = document.getElementById(id);

        if (!el) return;

        el.addEventListener(“input”, function () {

          updateIdentityDependentUI();

          autoSyncProfileFromForm();

        });

      });

      const saveBtn = document.getElementById(“mc-save-profile-button”);

      if (saveBtn) {

        saveBtn.addEventListener(“click”, function () {

          setProfileStatus(“”, true);

          const data = collectIdentityFromForm();

          const hasLocation = !!data.zip || (!!data.city && !!data.state);

          if (!data.name || !hasLocation) {

            setProfileStatus(“Please enter your name and either your ZIP code or your city and state before saving a profile.”, false);

            return;

          }

          if (!data.handle) {

            const base =

              (data.name + “-” + (data.city || “”) + “-” + (data.state || “”))

                .toLowerCase()

                .replace(/[^a-z0-9]+/g, “-“)

                .replace(/^-+|-+$/g, “”) || “profile”;

            data.handle = base;

            const handleInput = document.getElementById(“voter-handle”);

            if (handleInput) handleInput.value = data.handle;

          }

          usSosUpsertProfile(data);

          usSosSetCurrentHandle(data.handle);

          renderProfileList();

          setProfileStatus(“Voter profile saved on this device and set as the active profile.”, true);

          updateIdentityDependentUI();

          const switcher = document.getElementById(“mc-profile-switcher”);

          if (switcher) switcher.setAttribute(“hidden”, “hidden”);

        });

      }

      const changeBtn = document.getElementById(“mc-change-user-button”);

      const switcher = document.getElementById(“mc-profile-switcher”);

      if (changeBtn && switcher) {

        changeBtn.addEventListener(“click”, function () {

          renderProfileList();

          switcher.removeAttribute(“hidden”);

        });

      }

      const currentHandle = usSosGetCurrentHandle();

      if (currentHandle) {

        const profile = usSosFindProfileByHandle(currentHandle);

        if (profile) fillIdentityForm(profile);

      }

      updateIdentityDependentUI();

    }

    const MESSAGE_TEMPLATES = {

end_iran_war: {

  subject: “End the Iran War”,

  body: 

    “I am writing as your constituent to urge you to act immediately to end the Iran war and prevent further escalation.\n\n” +

    “This war risks a wider regional conflict, threatens American service members, harms civilians, and undermines international stability. Congress must not allow any president to continue or expand war without clear authorization, accountability, and a serious diplomatic strategy.\n\n” +

    “Please:\n” +

    “• Support legislation to end unauthorized hostilities against Iran.\n” +

    “• Oppose any funding or authorization that expands the war or ccontinues the blockade.\n” +

    “• Reassert Congress’s constitutional war powers.\n” +

    “• Support diplomacy, de-escalation, and humanitarian protections for civilians.\n\n” +

    “Please tell me what specific actions you will take to end this war and prevent further escalation.”

},

      end_trickle_down: {

        subject: “End Trickle-Down Economics and Restore Highly Progressive Taxes”,

        body:

          “For decades, we have been told that tax cuts and special breaks for the wealthy and large corporations would eventually “trickle down” ” +

          “to everyone else. That promise has not been kept. Inequality has grown, while many families struggle with wages that do not keep up with costs.\n\n” +

          “Trickle-down economics has shifted an enormous share of national income and wealth upward, so that half the people now have only 3% of the nation’s wealth.\n\n” +

          “Please:\n” +

          “• Restore strongly progressive income tax rates on very high incomes.\n” +

          “• Close loopholes and shelters that let the ultra-wealthy and large corporations avoid paying their share.\n” +

          “• Strengthen taxes on large inheritances, capital gains, and wealth at the very top.\n” +

          “• Enforce existing tax law with adequate IRS resources.\n” +

          “• Use the revenue to invest in education, health care, infrastructure, clean energy, and good jobs.\n\n” +

          “Broad prosperity fueled by highly progressive taxation is better for our democracy and our economy than concentrated wealth at the top. ” +

          “Please tell me which specific bills you support (or will introduce) to end trickle-down policy and restore a fair tax system.”

      },

      overrule_citizens_united: {

        subject: “Overrule Citizens United and end rule by money”,

        body:

          “I am writing as a constituent to urge you to support a constitutional amendment and any practical steps necessary to overrule the Supreme Court’s ” +

          “Citizens United decision and related doctrines that equate money with speech.\n\n” +

          “Unlimited (and often opaque) campaign spending by corporations and billionaires distorts representative government, drowns out ordinary voters, ” +

          “and turns elections into auctions.\n\n” +

          “Please:\n” +

          “• Support legislation and constitutional amendments that clarify: money is not speech, and corporations are not people for political spending purposes.\n” +

          “• Back strong disclosure rules so voters can see who is funding political advertising and “dark money” groups.\n” +

          “• Strengthen public financing and anti-corruption safeguards that amplify ordinary citizens.\n” +

          “• Support reforms that reduce dependency on large donors (including stronger limits and enforcement where constitutionally permissible).\n\n” +

          “We need a democracy of, by, and for the people — not of, by, and for the biggest donors. Please reply with your position and the actions you will take.”

      },

     impeach_convict_trump: {

  subject: “Impeach and Convict Donald Trump”,

  body:

    “Trump’s trade war and the Iran war are endangering the postwar system of international cooperation that the United States helped create after World War II — a system built to encourage trade, restrain aggression, stabilize the world economy, and prevent another global catastrope. He must be stopped and removed from office.\n\n” + 

    “I ask you to:\n” +

    “• Support and advance Articles of Impeachment in the House; or\n” +

    “• Vote to convict in the Senate to make accountability real and durable.\n\n” +

    “Please reply with your position and the specific actions you will take.”

},

           disqualify_trickle_down_successors: {

        subject: “e_voting_rights_act:”,

        body: “”

      },

restore_voting_rights_act: {

  subject: “Restore the Voting Rights Act”,

  body: “”

},

impeach_vra_justices: {

  subject: “Impeach the justices who voted to gut the Voting Rights Act”,

  body: “”

},

reparations_to_iran: {

  subject: “”,

  body: “”

},

            humanistic_authoritarian_ai: {

        subject: “AI must not become a propaganda tool”,

        body:

          “Artificial intelligence is becoming a powerful force in public life. It can help people learn, work, and communicate. But it can also be used to shape opinion in hidden and dangerous ways.\n\n” +

          “When AI gives slanted answers, leaves out important facts, favors the powerful, or presents bias as neutral truth, it becomes a propaganda tool. That is a threat to democracy, education, and free thought.\n\n” +

          “People have a right to know when information systems are influencing beliefs instead of serving truth. AI systems that affect public understanding should be subject to transparency, independent review, and clear public standards. We need safeguards against manipulation, hidden bias, and the quiet steering of public opinion.\n\n” +

          “Please support strong public protections for transparency and accountability in artificial intelligence. AI should help people think more clearly, not mislead them or manage what they believe.”

      },

      protect_social_security: {

        subject: “Protect Social Security and Medicare”,

        body:

          “I am writing to urge you to protect and strengthen Social Security and Medicare — not cut them.\n\n” +

          “Please:\n” +

          “• Oppose any cuts, privatization schemes, or attempts to raise the retirement age.\n” +

          “• Support fair revenue measures so the programs remain strong for current and future beneficiaries.\n” +

          “• Protect Medicare benefits and improve access and affordability.\n\n” +

          “I ask you to stand firmly on the side of seniors, disabled people, and working families.”

      },

      tax_hyper_rich_climate: {

        subject: “Tax the Hyper-Rich to Fight Climate Change and Rebuild America”,

        body:

          “The climate crisis is already harming communities across the country. We need rapid emissions reductions and resilient infrastructure — and we must fund it responsibly.\n\n” +

          “Please:\n” +

          “• Support fair taxes on the ultra-wealthy and large corporations to fund climate solutions.\n” +

          “• Invest in clean energy, grid modernization, energy efficiency, and public transit that create good jobs.\n” +

          “• Fund disaster preparedness, climate adaptation, and recovery — prioritizing frontline and low-income communities.\n\n” +

          “Please tell me what specific legislation you support to fund climate action with equitable, progressive revenue.”

      },

      abolish_electoral_college: {

        subject: “Abolish the Electoral College — let the national popular vote decide”,

        body:

          “I am writing to urge you to support abolishing the Electoral College and establishing direct election of the President by national popular vote.\n\n” +

          “Please:\n” +

          “• Support a constitutional amendment providing for election by national popular vote; and\n” +

          “• Support practical steps that move us toward the principle that every vote should count equally.\n\n” +

          “A democracy should treat each citizen’s vote as equal, regardless of state.”

      },

      protect_reproductive_freedom: {

        subject: “Protect reproductive freedom nationwide”,

        body:

          “I am writing to urge you to protect reproductive freedom nationwide.\n\n” +

          “Religious freedom and pluralism: Americans hold sincere, conflicting religious beliefs about when personhood begins and what moral duties pregnancy imposes. ” +

          “Government should not impose one sectarian doctrine as law in a religiously diverse nation.\n\n” +

          “Public health and human rights: Health care decisions should be made by patients in consultation with clinicians — not politicians. ” +

          “It makes no sense to jeopardize the physical or mental health of a woman for the welfare of a potential person.\n\n” +

          “A workable national standard is to protect access to abortion at least until viability, and later when necessary to protect the life or health of the patient.\n\n” +

          “Please support federal legislation that establishes clear nationwide protections, including contraception access and emergency care for pregnancy complications. ” +

          “Please tell me what specific bills you will support and what actions you will take.”

      },

      icc_accountability_netanyahu: {

        subject: “Condemn Netanyahu for his war crimes and crimes against humanity. Align U.S. policy with international humanitarian law”,

        body:

          “Please condemn Netanyahu for his war crimes and crimes against humanity. Do not undermine the legitimate processes of the International Criminal Court.\n\n” +

          “In addition, please require U.S. policy — especially arms transfers — to comply with international humanitarian law and credible end-use monitoring.\n\n” +

          “Please oppose efforts to obstruct investigations or accountability, and support transparent reporting to Congress on compliance and civilian-protection measures.”

      },

      humanitarian_aid_palestinians: {

        subject: “Ensure urgent humanitarian aid reaches Palestinians”,

        body:

          “Please use U.S. diplomatic and oversight leverage to ensure sustained humanitarian access for Palestinian civilians — food, clean water, medical supplies, ” +

          “shelter support, and protection for aid workers.\n\n” +

          “Support robust monitoring and clear, verifiable benchmarks to ensure that aid reaches people quickly, at scale, and without political delay.\n\n” +

          “Please tell me what concrete steps you will take to expand humanitarian access and protect civilians.”

      },

      condition_offensive_weapons_ceasefire: {

        subject: “Condition offensive weapons transfers on verified ceasefire compliance and protection of civilians”,

        body:

          “Please suspend transfers of offensive weapons and munitions unless there is a verified, durable ceasefire framework being followed by all parties and ” +

          “credible compliance with international humanitarian law.\n\n” +

          “Maintain only narrowly tailored defensive support as appropriate, and require transparent end-use monitoring and public reporting to Congress.\n\n” +

          “Please tell me what standards you will require, how compliance will be verified, and what enforcement triggers you support.”

      },

      write_own: { subject: “”, body: “” }

    };

    function getSelectedMessageId() {

      const checked = document.querySelector(‘input[name=”mc-message-choice”]:checked’);

      return checked ? checked.value : “”;

    }

    function applyTemplate(id) {

      const subj = document.getElementById(“mc-subject”);

      const bodyEl = document.getElementById(“mc-body”);

      if (!subj || !bodyEl) return;

      const t = MESSAGE_TEMPLATES[id];

      if (!t) return;

      subj.value = t.subject || “”;

      usSosBackgroundBody = t.body || “”;

      usSosInPersonalizedPreview = false;

      bodyEl.value = usSosBackgroundBody;

      setCopyStatus(“”, true);

    }

    function clearRecipientUsage() {

      usSosCurrentRecipient = null;

      usSosInPersonalizedPreview = false;

      document.querySelectorAll(“.mc-recipient.mc-recipient–used”).forEach(function (el) {

        el.classList.remove(“mc-recipient–used”);

      });

    }

    function buildSalutation(identity, recipient) {

      let label = recipient && recipient.label ? recipient.label.trim() : “”;

      if (label) return “Dear ” + label + “,\n\n”;

      return “Dear Elected Official,\n\n”;

    }

    function buildClosing(identity) {

      const name = identity.name || “”;

      const city = identity.city || “”;

      const state = identity.state || “”;

      const zip = identity.zip || “”;

      const cityStateZip = [city, state].filter(Boolean).join(“, “) + (zip ? ” ” + zip : “”);

      if (!name && !cityStateZip) return “”;

      let closing = “\n\nSincerely,\n” + (name || “”);

      if (cityStateZip) closing += “\n” + cityStateZip;

      return closing;

    }

    function buildPersonalizedText(coreText, identity, recipient) {

      const body = (coreText || “”).trim();

      const salutation = buildSalutation(identity, recipient);

      const closing = buildClosing(identity);

      let text = body ? (salutation + body + closing) : (salutation + closing);

      text = text.replace(/\n{3,}/g, “\n\n”).replace(/^\s+|\s+$/g, “”);

      return text;

    }

    function updatePersonalizedPreview() {

      const bodyEl = document.getElementById(“mc-body”);

      if (!bodyEl || !usSosCurrentRecipient) return;

      const identity = getActiveIdentity() || {};

      const core = (usSosBackgroundBody || bodyEl.value || “”).trim();

      if (!core) return;

      const full = buildPersonalizedText(core, identity, usSosCurrentRecipient);

      usSosInPersonalizedPreview = true;

      bodyEl.value = full;

    }

    function initMessageTemplates() {

      document.addEventListener(“change”, function (evt) {

        const t = evt.target;

        if (!t || t.name !== “mc-message-choice”) return;

        if (!t.checked) return;

        clearRecipientUsage();

        applyTemplate(t.value);

      });

      const bodyEl = document.getElementById(“mc-body”);

      if (bodyEl) {

        usSosBackgroundBody = bodyEl.value || “”;

        bodyEl.addEventListener(“input”, function () {

          if (!usSosInPersonalizedPreview || !usSosCurrentRecipient) {

            usSosBackgroundBody = bodyEl.value;

          }

        });

      }

    }

    function initCopyButtons() {

      const subj = document.getElementById(“mc-subject”);

      const body = document.getElementById(“mc-body”);

      const btnSubj = document.getElementById(“mc-copy-subject-btn”);

      const btnBody = document.getElementById(“mc-copy-message-btn”);

      if (btnSubj) {

        btnSubj.addEventListener(“click”, async function () {

          setCopyStatus(“”, true);

          const selectedId = getSelectedMessageId();

          if (!selectedId) { setCopyStatus(“Step 2: please select a message first.”, false); return; }

          const text = (subj && subj.value ? subj.value.trim() : “”);

          if (!text) { setCopyStatus(“No subject to copy.”, false); return; }

          try {

            await usSosCopyToClipboard(text);

            setCopyStatus(“Copied subject. Paste into the official’s subject field.”, true);

          } catch (e) {

            console.error(“Subject copy failed:”, e);

            selectAll(subj);

            setCopyStatus(“Subject selected. Press Ctrl/Cmd+C to copy.”, true);

          }

        });

      }

      if (btnBody) {

        btnBody.addEventListener(“click”, async function () {

          setCopyStatus(“”, true);

          const selectedId = getSelectedMessageId();

          if (!selectedId) { setCopyStatus(“Step 2: please select a message first.”, false); return; }

          const text = (body && body.value ? body.value.trim() : “”);

          if (!text) { setCopyStatus(“No message text to copy.”, false); return; }

          try {

            await usSosCopyToClipboard(text);

            setCopyStatus(“Copied message. Paste into the official’s message box.”, true);

          } catch (e) {

            console.error(“Message copy failed:”, e);

            selectAll(body);

            setCopyStatus(“Message selected. Press Ctrl/Cmd+C to copy.”, true);

          }

        });

      }

    }

    function clearPersonalRecipients() {

      const container = document.getElementById(“mc-personal-recipients”);

      if (container) container.innerHTML = “”;

    }

    function getOfficialName(leg) {

      const bio = leg.bio || {};

      const first = bio.first_name || “”;

      const last = bio.last_name || “”;

      const name = (first + ” ” + last).trim();

      return name || “Member of Congress”;

    }

    function getAutomaticContactUrl(leg) {

      const contact = leg.contact || {};

      if (contact.contact_form) return contact.contact_form;

      if (contact.url) return contact.url;

      const name = getOfficialName(leg);

      return “https://www.google.com/search?q=” + encodeURIComponent(name + ” official contact form”);

    }

    function getRecipientKey(leg) {

      const bio = leg.bio || {};

      const type = (leg.type || “”).toLowerCase() || “official”;

      const bioguide = (bio.bioguide_id || bio.bioguide || “”).toString().trim();

      if (bioguide) return type + “|bioguide|” + bioguide;

      const first = (bio.first_name || “”).toString().trim().toLowerCase();

      const last  = (bio.last_name  || “”).toString().trim().toLowerCase();

      const state = (bio.state || bio.state_abbr || “”).toString().trim().toLowerCase();

      return type + “|name|” + [first,last,state].filter(Boolean).join(“-“);

    }

    function getResolvedContactUrl(leg) {

      const key = getRecipientKey(leg);

      const overrides = usSosGetUrlOverrides();

      const overrideUrl = overrides[key];

      return overrideUrl || getAutomaticContactUrl(leg);

    }

    function isPlausibleHttpUrl(u) {

      try {

        const x = new URL(u);

        return x.protocol === “http:” || x.protocol === “https:”;

      } catch (e) {

        return false;

      }

    }

    let usSosLastLegs = [];

    function initRecipientButtons() {

      const openButtons = document.querySelectorAll(“.mc-recipient”);

      openButtons.forEach(function (btn) {

        if (btn.dataset.usSosBound === “1”) return;

        btn.dataset.usSosBound = “1”;

        btn.addEventListener(“click”, function () {

          const url = btn.getAttribute(“data-url”);

          if (!url) return;

          const label = (btn.getAttribute(“data-label”) || btn.textContent || “”).trim();

          usSosCurrentRecipient = { label: label };

          window.open(url, “_blank”, “noopener”);

          btn.classList.add(“mc-recipient–used”);

          updatePersonalizedPreview();

          setGeoStatus(“Form opened. Return here to Copy subject / Copy message. Use Fix link if needed.”, true);

        });

      });

      const fixButtons = document.querySelectorAll(“[data-action=’fix-link’]”);

      fixButtons.forEach(function (b) {

        if (b.dataset.usSosBound === “1”) return;

        b.dataset.usSosBound = “1”;

        b.addEventListener(“click”, function (evt) {

          evt.preventDefault();

          evt.stopPropagation();

          const key = b.getAttribute(“data-key”);

          const currentUrl = b.getAttribute(“data-current-url”) || “”;

          const label = b.getAttribute(“data-label”) || “this official”;

          const entered = window.prompt(

            ‘Paste the correct official contact-form URL for:\n\n’ + label + ‘\n\nCurrent:\n’ + currentUrl + ‘\n\nNew URL:’,

            currentUrl

          );

          if (entered === null) return;

          const trimmed = (entered || “”).trim();

          if (!trimmed) {

            setGeoStatus(“No URL entered. Nothing changed.”, false);

            return;

          }

          if (!isPlausibleHttpUrl(trimmed)) {

            setGeoStatus(“That does not look like a valid http/https URL.”, false);

            return;

          }

          const overrides = usSosGetUrlOverrides();

          overrides[key] = trimmed;

          usSosSetUrlOverrides(overrides);

          setGeoStatus(“Saved a fixed contact-form URL for ” + label + “. Re-open the official to use it.”, true);

          renderPersonalRecipients(usSosLastLegs || []);

        });

      });

      const resetButtons = document.querySelectorAll(“[data-action=’reset-link’]”);

      resetButtons.forEach(function (b) {

        if (b.dataset.usSosBound === “1”) return;

        b.dataset.usSosBound = “1”;

        b.addEventListener(“click”, function (evt) {

          evt.preventDefault();

          evt.stopPropagation();

          const key = b.getAttribute(“data-key”);

          const label = b.getAttribute(“data-label”) || “this official”;

          const overrides = usSosGetUrlOverrides();

          if (overrides && overrides[key]) {

            delete overrides[key];

            usSosSetUrlOverrides(overrides);

            setGeoStatus(“Reset the URL override for ” + label + “.”, true);

          } else {

            setGeoStatus(“No saved override existed for ” + label + “.”, false);

          }

          renderPersonalRecipients(usSosLastLegs || []);

        });

      });

    }

    function renderPersonalRecipients(legs) {

      const container = document.getElementById(“mc-personal-recipients”);

      if (!container) return;

      clearPersonalRecipients();

      usSosLastLegs = Array.isArray(legs) ? legs : [];

      if (!legs || !legs.length) {

        const p = document.createElement(“p”);

        p.className = “mc-small”;

        p.textContent = “No specific members of Congress were found for that address. Please check your address.”;

        container.appendChild(p);

        return;

      }

      legs.forEach(function (leg) {

        const row = document.createElement(“div”);

        row.className = “mc-recipient-row”;

        const openBtn = document.createElement(“button”);

        openBtn.type = “button”;

        openBtn.className = “mc-recipient”;

        const name = getOfficialName(leg);

        const type = (leg.type || “”).toLowerCase();

        let label = name;

        if (type === “senator”) label = “Senator ” + name;

        else if (type === “representative”) label = “Representative ” + name;

        const key = getRecipientKey(leg);

        const url = getResolvedContactUrl(leg);

        const hasOverride = !!(usSosGetUrlOverrides()[key]);

        openBtn.textContent = label;

        openBtn.setAttribute(“data-url”, url);

        openBtn.setAttribute(“data-label”, label);

        const linkRow = document.createElement(“div”);

        linkRow.className = “mc-link-row”;

        const urlSmall = document.createElement(“small”);

        urlSmall.innerHTML =

          (hasOverride ? “<strong>Fixed link:</strong> ” : “<strong>Link:</strong> “) +

          ‘<a href=”‘ + url.replace(/”/g, “&quot;”) + ‘” target=”_blank” rel=”noopener”>open</a>’;

        const actions = document.createElement(“div”);

        actions.className = “mc-link-actions”;

        const fixBtn = document.createElement(“button”);

        fixBtn.type = “button”;

        fixBtn.className = “mc-mini-btn”;

        fixBtn.textContent = “Fix link”;

        fixBtn.setAttribute(“data-action”, “fix-link”);

        fixBtn.setAttribute(“data-key”, key);

        fixBtn.setAttribute(“data-current-url”, url);

        fixBtn.setAttribute(“data-label”, label);

        const resetBtn = document.createElement(“button”);

        resetBtn.type = “button”;

        resetBtn.className = “mc-mini-btn”;

        resetBtn.textContent = “Reset”;

        resetBtn.setAttribute(“data-action”, “reset-link”);

        resetBtn.setAttribute(“data-key”, key);

        resetBtn.setAttribute(“data-label”, label);

        actions.appendChild(fixBtn);

        actions.appendChild(resetBtn);

        linkRow.appendChild(urlSmall);

        linkRow.appendChild(actions);

        row.appendChild(openBtn);

        row.appendChild(linkRow);

        container.appendChild(row);

      });

      initRecipientButtons();

    }

    function initGeocodioLookup() {

      const btn = document.getElementById(“mc-find-reps-button”);

      if (!btn) return;

      btn.addEventListener(“click”, function () {

        setGeoStatus(“”, true);

        clearPersonalRecipients();

        if (!hasRequiredIdentity()) {

          setGeoStatus(“Please enter your name and either your ZIP code or your city and state in Step 1 before using this lookup.”, false);

          return;

        }

        if (!US_SOS_GEOCODIO_API_KEY) {

          setGeoStatus(“Geocodio API key is not configured.”, false);

          return;

        }

        const id = collectIdentityFromForm();

        const parts = [];

        if (id.street) parts.push(id.street);

        if (id.city) parts.push(id.city);

        if (id.state) parts.push(id.state);

        if (id.zip) parts.push(id.zip);

        const query = parts.join(“, “);

        const url =

          “https://api.geocod.io/v1.7/geocode?q=” +

          encodeURIComponent(query) +

          “&fields=cd&api_key=” +

          encodeURIComponent(US_SOS_GEOCODIO_API_KEY);

        setGeoStatus(“Looking up your members of Congress…”, true);

        fetch(url)

          .then(function (response) {

            if (!response.ok) throw new Error(“Geocodio request failed with status ” + response.status);

            return response.json();

          })

          .then(function (data) {

            const results = (data && data.results) || [];

            if (!results.length) {

              setGeoStatus(“No results from Geocodio for that location. Please check your address.”, false);

              return;

            }

            const district =

              (((results[0] || {}).fields || {}).congressional_districts || [])[0] || null;

            const legs = district ? district.current_legislators || [] : [];

            if (!legs.length) {

              setGeoStatus(“No current legislators returned for that location.”, false);

              return;

            }

            setGeoStatus(“Found your current members of Congress.”, true);

            renderPersonalRecipients(legs);

          })

          .catch(function (err) {

            console.error(“Geocodio error:”, err);

            setGeoStatus(“There was a problem contacting Geocodio. Please try again later.”, false);

          });

      });

    }

    initProfileSection();

    initMessageTemplates();

    initCopyButtons();

    initGeocodioLookup();

    initRecipientButtons();

    // Initialize Step 2 with the currently checked message (if any)

    const initial = getSelectedMessageId();

    if (initial) applyTemplate(initial);

  }

  function usSosStart() {

    usSosInitMessageCongressApp();

    markDebug(“Message Congress tool is ready.”, true);

  }

  if (document.readyState === “loading”) {

    document.addEventListener(“DOMContentLoaded”, usSosStart);

  } else {

    usSosStart();

  }

})();

</script></div>

We have the power: we have the vote.

…………………………………………

Our most urgent priorities are:

……………………………………….

Unity – So Congress listens

We can quickly take the government back from special interests and billionaire-funded influence.


We have the numbers — now let’s show our power. Imagine if just 50 people today each email their members of Congress and then forward this message to 50 friends and tomorrow, every recipient follows suit, and the process repeats, by the end of the week Congress would be flooded with hundreds of millions of messages


Even if some people share it with fewer contacts, the exponential growth will still send an unmistakable message.

Please share this information using social media, email, flyers, conversations and rally signs:

No kings — Overrule Citizens United — End Trickle-Down

Let’s make it happen in time to

turn the next “No Kings” rally

into a celebration!