{"id":14440,"date":"2026-09-29T13:07:32","date_gmt":"2026-09-29T11:07:32","guid":{"rendered":"https:\/\/geopard.tech\/?page_id=14440"},"modified":"2026-09-29T13:27:31","modified_gmt":"2026-09-29T11:27:31","slug":"calculateur-de-taux-de-semis","status":"publish","type":"page","link":"https:\/\/geopard.tech\/fr\/seeding-rate-calculator\/","title":{"rendered":"Calculateur de taux de semis"},"content":{"rendered":"\n<!--\n  Inline hero for \/seeding-rate-calculator\/, pasted as the FIRST block of the\n  page. Not the shared block 13098: that block's copy is Field Data Explorer\n  specific despite the generic name.\n\n  Written to root CLAUDE.md rule 24 (Roboto 400\/700, radii on the 2\/4\/6\/8\n  scale, no decorative gradient or shadow, brand colours only), rule 14\n  (centred) and rule 7 (hides the theme's bare page-title h1).\n-->\n<div class=\"gp-lead\">\n<style>\n\/* Rule 7: the geopard child theme renders the page title as a bare h1 inside\n   #simple_page > .container, so the standard .entry-title \/ .page-title \/\n   .wp-block-post-title selectors never reach it. The tool page opens with\n   this hero, so the duplicate title is hidden. *\/\n#simple_page > .container > h1{display:none !important}\n.gp-lead .srch{--f:\"Roboto\",-apple-system,\"Segoe UI\",Helvetica,Arial,sans-serif;font-family:var(--f);text-align:center;background:#f4f7ea;border:1px solid #d6e2c5;border-radius:8px;padding:28px 28px 24px;margin:6px 0 20px}\n.gp-lead .srch-eyebrow{display:inline-block;font-family:var(--f);font-size:.76rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:#15701e;background:#ffffff;border:1px solid #d6e2c5;border-radius:4px;padding:5px 11px;margin:0 0 14px}\n.gp-lead .srch-title{font-family:var(--f);font-size:1.95rem;font-weight:700;line-height:1.18;color:#145328;margin:0 auto 12px;max-width:820px}\n.gp-lead .srch .lede{font-family:var(--f);font-size:1.04rem;font-weight:400;line-height:1.55;color:#4c6066;margin:0 auto;max-width:820px}\n.gp-lead .srch-features{display:flex;flex-wrap:wrap;gap:8px;margin:18px 0 0;justify-content:center}\n.gp-lead .srch-feat{display:inline-flex;align-items:center;font-family:var(--f);font-size:.86rem;font-weight:400;color:#212121;background:#ffffff;border:1px solid #e3e7da;border-radius:4px;padding:6px 12px}\n@media (max-width:820px){\n  .gp-lead .srch{padding:22px 18px 20px}\n  .gp-lead .srch-title{font-size:1.5rem}\n  .gp-lead .srch .lede{font-size:.98rem}\n}\n@media (max-width:480px){\n  .gp-lead .srch{padding:18px 14px 16px}\n  .gp-lead .srch-title{font-size:1.3rem}\n}\n<\/style>\n  <div class=\"srch\">\n    <div class=\"srch-eyebrow\">Seeding rate calculator<\/div>\n    <h1 class=\"srch-title\">Seed for the stand you want, not the rate you used last year.<\/h1>\n    <p class=\"lede\">Enter the plants you want standing, the thousand kernel weight off this year&#8217;s bag and the emergence your drill really gets. Read the rate in pounds per acre or kilograms per hectare, the seeds landing in every foot of row, and the tonnes to order.<\/p>\n    <div class=\"srch-features\">\n      <span class=\"srch-feat\">23 crops<\/span>\n      <span class=\"srch-feat\">Metric and imperial<\/span>\n      <span class=\"srch-feat\">Row spacing and seed spacing<\/span>\n      <span class=\"srch-feat\">Rate per zone<\/span>\n      <span class=\"srch-feat\">Nothing leaves your browser<\/span>\n    <\/div>\n  <\/div>\n<\/div>\n\n\n\n<div class=\"gp-seed\" id=\"gp-seed\" data-theme=\"light\">\n<style>\n@font-face{font-family:\"Roboto\";font-style:normal;font-weight:100 900;font-display:swap;src:url(https:\/\/fonts.wp.com\/s\/roboto\/v51\/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBHMdazTgWw.woff2) format(\"woff2\");unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}\n@font-face{font-family:\"Roboto\";font-style:normal;font-weight:100 900;font-display:swap;src:url(https:\/\/fonts.wp.com\/s\/roboto\/v51\/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBHMdazQ.woff2) format(\"woff2\");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}\n.gp-seed{\n  --f:\"Roboto\",-apple-system,\"Segoe UI\",Helvetica,Arial,sans-serif;\n  --ink:#212121; --ink2:#2c3a30; --dim:#4c6066; --faint:#8a9a8e;\n  --accent:#145328; --accent-mid:#15701e; --accent-soft:#1b7a2a; --amber:#b0741f; --logo-red:#b2060f; --logo-red-bright:#fd4d48;\n  --panel:#ffffff; --paper:#fcfdf9; --paper2:#f6f9f0; --wash:#eef4e8; --wash2:#e4eedd;\n  --hair:#eef2e8; --line:#e3e7da; --mute:#c3cdbf;\n  --r-panel:8px; --r-card:6px; --r-ctl:4px; --r-bar:2px;\n  color:var(--ink2);background:var(--paper);font-family:var(--f);font-size:16px;line-height:1.55;font-variant-numeric:tabular-nums;position:relative\n}\n.gp-seed *{box-sizing:border-box}\n.gp-seed [hidden]{display:none !important}\n.gp-seed p{margin:0}\n.gp-seed .sd-wrap{max-width:1320px;margin:0 auto;padding:18px 16px;display:flex;flex-direction:column;gap:12px}\n.gp-seed .sd-card{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:14px 16px}\n.gp-seed .sd-h{font-size:1.05rem;font-weight:700;letter-spacing:-.01em;line-height:1.15;color:var(--ink);margin:0 0 4px}\n.gp-seed .sd-sub{font-size:.92rem;color:var(--dim);margin:0 0 12px;max-width:68ch}\n\n\/* region bar *\/\n.gp-seed .sd-loc{display:flex;flex-wrap:wrap;align-items:center;gap:10px;font-size:.92rem;color:var(--dim)}\n.gp-seed .sd-loc label{color:var(--faint);font-size:.86rem}\n.gp-seed .sd-via{font-size:.84rem;color:var(--faint)}\n.gp-seed .sd-sel{font-family:var(--f);font-size:.95rem;font-weight:400;color:var(--ink);background:var(--panel);border:1px solid var(--line);border-radius:4px;padding:8px 10px;min-height:44px;max-width:100%}\n.gp-seed .sd-seg{display:inline-flex;border:1px solid var(--line);border-radius:4px;overflow:hidden}\n.gp-seed .sd-seg-b{font-family:var(--f);font-size:.88rem;font-weight:400;min-height:44px;padding:0 14px;background:var(--panel);border:0;color:var(--dim);cursor:pointer}\n.gp-seed .sd-seg-b + .sd-seg-b{border-left:1px solid var(--line)}\n.gp-seed .sd-seg-b.on{background:var(--accent);color:#ffffff;font-weight:700}\n\n\/* input grid *\/\n.gp-seed .sd-grid{display:grid;grid-template-columns:minmax(0,1fr);gap:12px}\n.gp-seed .sd-field{display:flex;flex-direction:column;gap:4px;margin-bottom:12px;min-width:0}\n.gp-seed .sd-field:last-child{margin-bottom:0}\n.gp-seed .sd-lab{font-size:.84rem;color:var(--faint)}\n.gp-seed .sd-inrow{display:flex;gap:6px;align-items:stretch;min-width:0}\n.gp-seed .sd-in{font-family:var(--f);font-size:16px;font-weight:400;color:var(--ink);min-height:44px;padding:6px 10px;background:var(--panel);border:1px solid var(--line);border-radius:4px;width:100%;min-width:0}\n.gp-seed .sd-in:focus{outline:2px solid var(--accent-soft);outline-offset:-2px}\n.gp-seed .sd-unit{font-family:var(--f);font-size:.9rem;font-weight:400;color:var(--dim);background:var(--panel);border:1px solid var(--line);border-radius:4px;min-height:44px;padding:6px 6px;flex:0 0 auto;max-width:46%}\n.gp-seed .sd-fixed{display:inline-flex;align-items:center;font-size:.9rem;color:var(--faint);padding:0 8px;background:var(--wash);border:1px solid var(--line);border-radius:4px;flex:0 0 auto;white-space:nowrap}\n.gp-seed .sd-hint{font-size:.82rem;color:var(--faint)}\n.gp-seed .sd-hint b{color:var(--accent-mid);font-weight:700}\n.gp-seed .sd-warn{font-size:.84rem;color:var(--logo-red)}\n\n\/* result panel *\/\n.gp-seed .sd-res{background:var(--wash);border-color:var(--mute);display:flex;flex-direction:column}\n.gp-seed .sd-res .sd-o{background:var(--panel);border-color:var(--hair)}\n.gp-seed .sd-res .sd-tot{border-top-color:var(--mute)}\n.gp-seed .sd-big{font-size:clamp(2.3rem,4.2vw,3rem);font-weight:700;line-height:1.02;letter-spacing:-.03em;color:var(--accent);margin:6px 0 0}\n.gp-seed .sd-big-u{font-size:1rem;font-weight:400;letter-spacing:0;color:var(--dim)}\n.gp-seed .sd-alt{font-size:.95rem;color:var(--dim);margin-top:4px}\n.gp-seed .sd-alt b{color:var(--ink);font-weight:700}\n.gp-seed .sd-out{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:14px 0 12px}\n.gp-seed .sd-o{background:var(--panel);border:1px solid var(--line);border-radius:4px;padding:7px 9px;min-width:0}\n.gp-seed .sd-o-l{display:block;font-size:.78rem;color:var(--faint);line-height:1.25}\n.gp-seed .sd-o-v{display:block;font-size:1.05rem;font-weight:700;letter-spacing:-.01em;color:var(--ink);word-break:break-word}\n.gp-seed .sd-tot{margin-top:auto;padding-top:12px;border-top:1px solid var(--mute);font-size:.92rem;color:var(--dim)}\n.gp-seed .sd-tot div{margin-bottom:3px}\n.gp-seed .sd-tot b{color:var(--ink);font-weight:700}\n\n\/* habit check *\/\n.gp-seed .sd-hb-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:12px}\n.gp-seed .sd-hb-row .sd-field{margin-bottom:0;width:260px;max-width:100%}\n.gp-seed .sd-verdict{margin-top:12px;font-size:1rem;color:var(--ink)}\n.gp-seed .sd-verdict b{color:var(--accent);font-weight:700}\n.gp-seed .sd-chip{display:inline-block;padding:2px 8px;border-radius:2px;font-size:.8rem;font-weight:700;color:#ffffff}\n.gp-seed .sd-chip[data-v=\"under\"]{background:var(--logo-red)}\n.gp-seed .sd-chip[data-v=\"over\"]{background:#b98a55}\n.gp-seed .sd-chip[data-v=\"on\"]{background:var(--accent)}\n.gp-seed .sd-bars{margin-top:12px;display:flex;flex-direction:column;gap:7px}\n.gp-seed .sd-bar-row{display:grid;grid-template-columns:130px minmax(0,1fr) 92px;gap:10px;align-items:center;font-size:.88rem}\n.gp-seed .sd-bar-l{color:var(--dim)}\n.gp-seed .sd-bar-t{display:block;height:16px;background:var(--paper2);border:1px solid var(--line);border-radius:2px;overflow:hidden}\n.gp-seed .sd-bar-f{display:block;height:100%;background:var(--accent);border-radius:2px 0 0 2px}\n.gp-seed .sd-bar-f[data-k=\"habit\"]{background:var(--faint)}\n.gp-seed .sd-bar-v{text-align:right;font-weight:700;color:var(--ink)}\n\n\/* chart *\/\n.gp-seed .sd-chart{margin-top:4px}\n.gp-seed .sd-chart{background:var(--paper2);border:1px solid var(--hair);border-radius:6px;padding:10px 8px 4px}\n.gp-seed .sd-chart svg{display:block;width:100%;height:auto;max-width:100%;overflow:visible}\n.gp-seed .sd-ax{font-size:10px;fill:#8a9a8e}\n.gp-seed .sd-cb{fill:#a0c489;cursor:pointer}\n.gp-seed .sd-cb.now{fill:#145328}\n.gp-seed .sd-cb:hover{fill:#1b7a2a}\n.gp-seed .sd-cap{margin-top:8px;font-size:.86rem;color:var(--faint)}\n\n\/* zones *\/\n.gp-seed .sd-z-head,.gp-seed .sd-z-row{display:grid;grid-template-columns:minmax(0,1.3fr) 92px 96px minmax(0,1fr) minmax(0,1fr);gap:10px;align-items:center}\n.gp-seed .sd-z-head{font-size:.78rem;color:var(--faint);padding-bottom:6px}\n.gp-seed .sd-z-row{padding:8px 0;border-top:1px solid var(--line);font-size:.92rem}\n.gp-seed .sd-z-name{font-weight:700;color:var(--ink)}\n.gp-seed .sd-z-note{display:block;font-weight:400;font-size:.8rem;color:var(--faint)}\n.gp-seed .sd-z-in{font-family:var(--f);font-size:16px;font-weight:400;color:var(--ink);min-height:44px;padding:6px 8px;background:var(--panel);border:1px solid var(--line);border-radius:4px;width:100%}\n.gp-seed .sd-z-cell{display:block;min-width:0}\n.gp-seed .sd-z-il{display:none;font-size:.78rem;color:var(--faint);line-height:1.3}\n.gp-seed .sd-z-out b{color:var(--accent);font-weight:700}\n.gp-seed .sd-z-sum{margin-top:10px;padding-top:10px;border-top:1px solid var(--mute);font-size:.95rem;color:var(--dim)}\n.gp-seed .sd-z-sum b{color:var(--ink);font-weight:700}\n.gp-seed .sd-z-sum .sd-save{color:var(--accent-mid);font-weight:700}\n.gp-seed .sd-acts{margin-top:12px;display:flex;flex-wrap:wrap;gap:10px;align-items:center}\n.gp-seed .sd-btn2{font-family:var(--f);min-height:44px;padding:0 14px;background:var(--panel);border:1px solid var(--accent);border-radius:4px;color:var(--accent);font-weight:700;font-size:.9rem;cursor:pointer}\n.gp-seed .sd-btn2:hover{background:var(--wash)}\n.gp-seed .sd-copied{font-size:.84rem;color:var(--accent-mid)}\n.gp-seed .sd-eq{margin-top:10px;background:var(--wash2);border:1px solid var(--mute);border-radius:4px;padding:10px 12px;font-size:.86rem;color:var(--ink);white-space:pre-wrap;word-break:break-word;line-height:1.5}\n.gp-seed .sd-layers{margin-top:10px;font-size:.9rem;color:var(--dim)}\n.gp-seed .sd-layers p{padding-left:1.7em;text-indent:-1.7em;margin:0 0 4px}\n.gp-seed .sd-mark{color:var(--accent-mid);font-weight:700;margin-right:.5em}\n\n\/* stand check + math *\/\n.gp-seed .sd-inline{display:flex;flex-wrap:wrap;gap:12px;align-items:flex-end}\n.gp-seed .sd-inline .sd-field{margin-bottom:0;width:190px;max-width:100%}\n.gp-seed .sd-math{background:var(--paper2);border:1px solid var(--line);border-radius:6px;padding:12px 14px;font-size:.92rem;color:var(--dim);line-height:1.7}\n.gp-seed .sd-math b{color:var(--ink);font-weight:700}\n.gp-seed .sd-math div{margin-bottom:4px}\n.gp-seed .sd-link{font-family:var(--f);background:transparent;border:0;padding:8px 0;min-height:44px;color:var(--accent-mid);text-decoration:underline;text-underline-offset:2px;font-size:.92rem;font-weight:400;cursor:pointer}\n\n\/* CTA *\/\n.gp-seed .sd-cta{background:var(--wash);border:1px solid var(--mute);border-radius:8px;padding:16px 18px;display:flex;flex-direction:column;gap:10px}\n.gp-seed .sd-cta p{color:var(--dim);font-size:.95rem}\n\/* The theme styles anchors inside a post body with an ID-weighted rule that\n   outranks any class selector we can write; force the button colour. *\/\n.gp-seed .sd-btn{display:inline-flex;align-items:center;min-height:44px;padding:0 20px;background:var(--accent);color:#ffffff !important;font-weight:700;font-size:.95rem;border-radius:4px;text-decoration:none;width:max-content;max-width:100%}\n.gp-seed .sd-btn:hover{background:var(--accent-mid);color:#ffffff !important}\n.gp-seed .sd-link2{display:inline-flex;align-items:center;min-height:44px;color:var(--accent-mid);font-size:.92rem;text-decoration:underline;text-underline-offset:2px}\n\n\/* the one floating element, so the one shadow *\/\n.gp-seed .sd-tip{position:absolute;z-index:20;pointer-events:none;background:var(--panel);border:1px solid var(--mute);border-radius:4px;padding:7px 10px;font-size:.84rem;color:var(--dim);max-width:250px;box-shadow:0 2px 8px rgba(20,83,40,0.14)}\n.gp-seed .sd-tip b{color:var(--ink);font-weight:700}\n\n\/* In a blog post the widget sits in body copy set at 18px on 29px. The tool\n   page wants density; inside an article the same markup has to read at the\n   rhythm of the prose around it or it looks cramped. *\/\n.gp-seed.gp-post{font-size:17px}\n.gp-seed.gp-post .sd-wrap{max-width:100%;padding:14px 0}\n.gp-seed.gp-post .sd-big{font-size:2.1rem}\n\n\/* Rule 13: fill the width with content, not whitespace. Three columns of\n   inputs and result at widescreen, two at laptop, one on a phone. *\/\n@media (min-width:900px){\n  .gp-seed .sd-grid{grid-template-columns:repeat(2,minmax(0,1fr))}\n}\n@media (min-width:1200px){\n  .gp-seed .sd-grid{grid-template-columns:minmax(0,1fr) minmax(0,1fr) minmax(0,1.05fr)}\n  .gp-seed .sd-out{grid-template-columns:repeat(2,minmax(0,1fr))}\n}\n@media (max-width:820px){\n  .gp-seed .sd-wrap{padding:14px 12px;gap:10px}\n  .gp-seed .sd-big{font-size:2.05rem}\n  .gp-seed .sd-z-head{display:none}\n  .gp-seed .sd-z-row{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 10px;padding:12px 0}\n  .gp-seed .sd-z-row .sd-z-name{grid-column:1 \/ -1}\n  .gp-seed .sd-z-il{display:block}\n  .gp-seed .sd-z-out{display:block}\n  .gp-seed .sd-bar-row{grid-template-columns:106px minmax(0,1fr) 78px;gap:8px;font-size:.84rem}\n}\n@media (max-width:480px){\n  .gp-seed .sd-card{padding:12px 13px}\n  .gp-seed .sd-big{font-size:1.85rem}\n  .gp-seed .sd-out{grid-template-columns:minmax(0,1fr)}\n  .gp-seed .sd-inline .sd-field,.gp-seed .sd-hb-row .sd-field{width:100%}\n}\n@media print{\n  .gp-seed .sd-cta,.gp-seed .sd-acts,.gp-seed .sd-link{display:none !important}\n  .gp-seed .sd-card{break-inside:avoid}\n}\n<\/style>\n\n<div class=\"sd-wrap\">\n\n  <!-- \u2500\u2500 region + units \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n  <div class=\"sd-card\">\n    <div class=\"sd-loc\">\n      <span>Showing typical figures for<\/span>\n      <select class=\"sd-sel\" id=\"sd-region\" aria-label=\"Region\">\n        <option value=\"na-north\">Canadian Prairies and Northern Plains<\/option>\n        <option value=\"na-corn\">US Corn Belt and Midwest<\/option>\n        <option value=\"na-south\">US Southern Plains and Delta<\/option>\n        <option value=\"na-west\">US Pacific Northwest<\/option>\n        <option value=\"uk-ie\">UK and Ireland<\/option>\n        <option value=\"eu-nw\">Northern and Western Europe<\/option>\n        <option value=\"eu-c\">Central Europe<\/option>\n        <option value=\"eu-med\">Mediterranean<\/option>\n        <option value=\"eu-e\">Eastern Europe and the Black Sea<\/option>\n        <option value=\"ru-kz\">Russia and Central Asia<\/option>\n        <option value=\"au\">Australia<\/option>\n        <option value=\"nz\">New Zealand<\/option>\n        <option value=\"br\">Brazil<\/option>\n        <option value=\"sa-s\">Argentina and the Southern Cone<\/option>\n        <option value=\"af-s\">Southern Africa<\/option>\n        <option value=\"as-s\">South Asia<\/option>\n        <option value=\"as-e\">East Asia<\/option>\n        <option value=\"row\">Rest of world<\/option>\n      <\/select>\n      <span class=\"sd-seg\" role=\"group\" aria-label=\"Unit system\">\n        <button class=\"sd-seg-b\" type=\"button\" data-sys=\"imperial\">lb\/ac<\/button>\n        <button class=\"sd-seg-b\" type=\"button\" data-sys=\"metric\">kg\/ha<\/button>\n      <\/span>\n      <span class=\"sd-via\">\n        <span data-v=\"saved\" hidden>your saved choice<\/span>\n        <span data-v=\"server\" hidden>detected from your connection<\/span>\n        <span data-v=\"ip\" hidden>via IP geolocation<\/span>\n        <span data-v=\"ipok\" hidden>confirmed via IP geolocation<\/span>\n        <span data-v=\"lang\" hidden>from your browser language<\/span>\n        <span data-v=\"tz\" hidden>from your time zone<\/span>\n        <span data-v=\"default\" hidden>a global default<\/span>\n      <\/span>\n    <\/div>\n  <\/div>\n\n  <!-- \u2500\u2500 inputs + result \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n  <div class=\"sd-grid\">\n\n    <div class=\"sd-card\">\n      <p class=\"sd-h\">The seed lot<\/p>\n      <div class=\"sd-field\">\n        <label class=\"sd-lab\" for=\"sd-crop\">Crop<\/label>\n        <select class=\"sd-sel\" id=\"sd-crop\">\n          <optgroup label=\"Cereals\">\n            <option value=\"wheat-spring\">Spring wheat<\/option>\n            <option value=\"wheat-durum\">Durum<\/option>\n            <option value=\"wheat-winter\">Winter wheat<\/option>\n            <option value=\"barley-malt\">Malting barley<\/option>\n            <option value=\"barley-feed\">Feed barley<\/option>\n            <option value=\"barley-spring\">Spring barley (Europe)<\/option>\n            <option value=\"barley-winter\">Winter barley (Europe)<\/option>\n            <option value=\"oats\">Oats<\/option>\n            <option value=\"rye-hybrid\">Hybrid fall rye<\/option>\n            <option value=\"triticale\">Triticale<\/option>\n          <\/optgroup>\n          <optgroup label=\"Oilseeds\">\n            <option value=\"canola\">Canola \/ spring oilseed rape<\/option>\n            <option value=\"osr-winter\">Winter oilseed rape<\/option>\n            <option value=\"flax\">Flax<\/option>\n            <option value=\"mustard\">Mustard<\/option>\n            <option value=\"sunflower\">Sunflower<\/option>\n          <\/optgroup>\n          <optgroup label=\"Pulses\">\n            <option value=\"pea\">Field pea<\/option>\n            <option value=\"lentil-red\">Red lentil (small)<\/option>\n            <option value=\"lentil-green\">Large green lentil<\/option>\n            <option value=\"chickpea\">Chickpea<\/option>\n            <option value=\"faba\">Faba bean<\/option>\n            <option value=\"soybean\">Soybean<\/option>\n            <option value=\"dry-bean\">Dry bean<\/option>\n          <\/optgroup>\n          <optgroup label=\"Row crops\">\n            <option value=\"corn\">Corn (grain)<\/option>\n          <\/optgroup>\n        <\/select>\n      <\/div>\n\n      <div class=\"sd-field\">\n        <label class=\"sd-lab\" for=\"sd-seedsize\">Seed size, from the tag<\/label>\n        <div class=\"sd-inrow\">\n          <input class=\"sd-in\" id=\"sd-seedsize\" type=\"number\" min=\"0\" step=\"0.1\" inputmode=\"decimal\">\n          <select class=\"sd-unit\" id=\"sd-seedsize-u\" aria-label=\"Seed size unit\">\n            <option value=\"g\">g per 1000 seeds<\/option>\n            <option value=\"oz\">oz per 1000 seeds<\/option>\n            <option value=\"seeds-lb\">seeds per lb<\/option>\n            <option value=\"seeds-kg\">seeds per kg<\/option>\n          <\/select>\n        <\/div>\n        <span class=\"sd-hint\">Typical for this crop <b class=\"sd-tkw-range\">&#8212;<\/b>. A lot two grams heavier needs a heavier rate for the same stand.<\/span>\n      <\/div>\n\n      <div class=\"sd-field\">\n        <label class=\"sd-lab\" for=\"sd-germ\">Germination on the tag, percent<\/label>\n        <input class=\"sd-in\" id=\"sd-germ\" type=\"number\" min=\"1\" max=\"100\" step=\"1\" inputmode=\"decimal\">\n      <\/div>\n\n      <div class=\"sd-field\">\n        <label class=\"sd-lab\" for=\"sd-emerg\">Field emergence, percent<\/label>\n        <input class=\"sd-in\" id=\"sd-emerg\" type=\"number\" min=\"1\" max=\"100\" step=\"1\" inputmode=\"decimal\">\n        <span class=\"sd-hint\">Of the seed that would germinate in a laboratory, the share that reaches the surface in your furrow. Count a stand after emergence and this number stops being a guess.<\/span>\n      <\/div>\n\n      <div class=\"sd-field\">\n        <span class=\"sd-lab\">Seedling survival, both together<\/span>\n        <span class=\"sd-hint\"><b class=\"sd-surv\">&#8212;<\/b> &#183; <span class=\"sd-sl-imp\">one pound of this seed holds<\/span><span class=\"sd-sl-met\" hidden>one kilogram of this seed holds<\/span> <b class=\"sd-seedcount\">&#8212;<\/b> seeds<\/span>\n      <\/div>\n    <\/div>\n\n    <div class=\"sd-card\">\n      <p class=\"sd-h\">The target and the drill<\/p>\n\n      <div class=\"sd-field\">\n        <label class=\"sd-lab\" for=\"sd-target\">Plants you want standing<\/label>\n        <div class=\"sd-inrow\">\n          <input class=\"sd-in\" id=\"sd-target\" type=\"number\" min=\"0\" step=\"0.1\" inputmode=\"decimal\">\n          <select class=\"sd-unit\" id=\"sd-target-u\" aria-label=\"Target unit\">\n            <option value=\"ft2\">per sq ft<\/option>\n            <option value=\"m2\">per sq m<\/option>\n            <option value=\"ac\">per acre<\/option>\n            <option value=\"ha\">per hectare<\/option>\n          <\/select>\n        <\/div>\n        <span class=\"sd-hint\">Extension range for this crop <b class=\"sd-target-range\">&#8212;<\/b>.<\/span>\n      <\/div>\n\n      <div class=\"sd-field\">\n        <label class=\"sd-lab\" for=\"sd-row\">Row spacing<\/label>\n        <div class=\"sd-inrow\">\n          <input class=\"sd-in\" id=\"sd-row\" type=\"number\" min=\"0\" step=\"0.5\" inputmode=\"decimal\">\n          <span class=\"sd-fixed sd-row-imp\">inches<\/span>\n          <span class=\"sd-fixed sd-row-met\" hidden>cm<\/span>\n        <\/div>\n        <span class=\"sd-hint\">Narrow the rows and the same rate crowds more seed into every foot of furrow.<\/span>\n      <\/div>\n\n      <div class=\"sd-field\">\n        <label class=\"sd-lab\" for=\"sd-area\">Field size<\/label>\n        <div class=\"sd-inrow\">\n          <input class=\"sd-in\" id=\"sd-area\" type=\"number\" min=\"0\" step=\"1\" inputmode=\"decimal\">\n          <span class=\"sd-fixed sd-area-imp\">acres<\/span>\n          <span class=\"sd-fixed sd-area-met\" hidden>hectares<\/span>\n        <\/div>\n      <\/div>\n\n      <div class=\"sd-field\">\n        <label class=\"sd-lab\" for=\"sd-price\">Seed price, yours<\/label>\n        <div class=\"sd-inrow\">\n          <select class=\"sd-unit\" id=\"sd-cur\" aria-label=\"Currency\">\n            <option value=\"$\">$<\/option>\n            <option value=\"C$\">C$<\/option>\n            <option value=\"A$\">A$<\/option>\n            <option value=\"NZ$\">NZ$<\/option>\n            <option value=\"R\">R<\/option>\n            <option value=\"&#8364;\">&#8364;<\/option>\n            <option value=\"&#163;\">&#163;<\/option>\n            <option value=\"R$\">R$<\/option>\n            <option value=\"&#8372;\">&#8372;<\/option>\n          <\/select>\n          <input class=\"sd-in\" id=\"sd-price\" type=\"number\" min=\"0\" step=\"0.01\" inputmode=\"decimal\" placeholder=\"0.00\">\n          <select class=\"sd-unit\" id=\"sd-price-u\" aria-label=\"Price unit\">\n            <option value=\"lb\">per lb<\/option>\n            <option value=\"bu\">per bushel<\/option>\n            <option value=\"kg\">per kg<\/option>\n            <option value=\"t\">per tonne<\/option>\n          <\/select>\n        <\/div>\n      <\/div>\n\n      <div class=\"sd-field sd-bu-field\">\n        <label class=\"sd-lab\" for=\"sd-bu\">Pounds in a bushel<\/label>\n        <input class=\"sd-in\" id=\"sd-bu\" type=\"number\" min=\"1\" step=\"1\" inputmode=\"decimal\">\n      <\/div>\n    <\/div>\n\n    <div class=\"sd-card sd-res\">\n      <p class=\"sd-h\">Seed this much<\/p>\n      <p class=\"sd-big\"><span class=\"sd-rate\">&#8212;<\/span> <span class=\"sd-big-u sd-u-imp\">lb\/ac<\/span><span class=\"sd-big-u sd-u-met\" hidden>kg\/ha<\/span><\/p>\n      <p class=\"sd-alt\">\n        <span class=\"sd-u-imp\">which is <b class=\"sd-rate-alt\">&#8212;<\/b> kg\/ha<\/span>\n        <span class=\"sd-u-met\" hidden>which is <b class=\"sd-rate-alt2\">&#8212;<\/b> lb\/ac<\/span>\n        <span class=\"sd-bu-line\"> &#183; <b class=\"sd-rate-bu\">&#8212;<\/b> bu\/ac<\/span>\n      <\/p>\n      <p class=\"sd-warn sd-bad\" hidden>Fill in seed size, germination, emergence and a target above.<\/p>\n\n      <div class=\"sd-out\">\n        <div class=\"sd-o\"><span class=\"sd-o-l\">Seeds dropped<span class=\"sd-u-imp\"> per acre<\/span><span class=\"sd-u-met\" hidden> per sq m<\/span><\/span><span class=\"sd-o-v sd-seeds-area\">&#8212;<\/span><\/div>\n        <div class=\"sd-o\"><span class=\"sd-o-l\">Seeds per<span class=\"sd-u-imp\"> foot<\/span><span class=\"sd-u-met\" hidden> metre<\/span> of row<\/span><span class=\"sd-o-v sd-seeds-row\">&#8212;<\/span><\/div>\n        <div class=\"sd-o\"><span class=\"sd-o-l\">Seed spacing in the row<\/span><span class=\"sd-o-v sd-spacing\">&#8212;<\/span><\/div>\n        <div class=\"sd-o\"><span class=\"sd-o-l\">Plants per<span class=\"sd-u-imp\"> foot<\/span><span class=\"sd-u-met\" hidden> metre<\/span> of row<\/span><span class=\"sd-o-v sd-plants-row\">&#8212;<\/span><\/div>\n      <\/div>\n\n      <div class=\"sd-tot\">\n        <div>Seed for the whole field <b class=\"sd-tot-mass\">&#8212;<\/b><\/div>\n        <div class=\"sd-tot-bu-line\">In bushels <b class=\"sd-tot-bu\">&#8212;<\/b><\/div>\n        <div class=\"sd-tot-cost-line\" hidden>Seed bill <b class=\"sd-tot-cost\">&#8212;<\/b>, which is <b class=\"sd-tot-cost-area\">&#8212;<\/b><\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- \u2500\u2500 the bushel habit \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n  <div class=\"sd-card\">\n    <p class=\"sd-h\">The rate you have always run<\/p>\n    <p class=\"sd-sub\">A rate set once in bushels per acre stays put while seed size moves. Put last year&#8217;s number in and see what this lot actually puts on the ground.<\/p>\n    <div class=\"sd-hb-row\">\n      <div class=\"sd-field\">\n        <label class=\"sd-lab\" for=\"sd-habit\">Your usual rate<\/label>\n        <div class=\"sd-inrow\">\n          <input class=\"sd-in\" id=\"sd-habit\" type=\"number\" min=\"0\" step=\"0.1\" inputmode=\"decimal\" placeholder=\"0\">\n          <select class=\"sd-unit\" id=\"sd-habit-u\" aria-label=\"Usual rate unit\">\n            <option value=\"bu\">bu\/ac<\/option>\n            <option value=\"lbac\">lb\/ac<\/option>\n            <option value=\"kgha\">kg\/ha<\/option>\n            <option value=\"seeds-ac\">seeds\/ac<\/option>\n            <option value=\"seeds-ha\">seeds\/ha<\/option>\n          <\/select>\n        <\/div>\n      <\/div>\n    <\/div>\n    <div class=\"sd-verdict\" hidden>\n      <p>At <b class=\"sd-hb-rate\">&#8212;<\/b> this lot stands up <b class=\"sd-hb-got\">&#8212;<\/b> plants<span class=\"sd-u-imp\"> per square foot<\/span><span class=\"sd-u-met\" hidden> per square metre<\/span> against the <b class=\"sd-hb-want\">&#8212;<\/b> you asked for.\n      <span class=\"sd-chip\" data-v=\"under\" hidden>under target<\/span><span class=\"sd-chip\" data-v=\"over\" hidden>over target<\/span><span class=\"sd-chip\" data-v=\"on\" hidden>on target<\/span><\/p>\n      <div class=\"sd-bars\">\n        <div class=\"sd-bar-row\">\n          <span class=\"sd-bar-l\">Your usual rate<\/span>\n          <span class=\"sd-bar-t\"><span class=\"sd-bar-f\" data-k=\"habit\" style=\"width:0\"><\/span><\/span>\n          <span class=\"sd-bar-v sd-bar-habit\">&#8212;<\/span>\n        <\/div>\n        <div class=\"sd-bar-row\">\n          <span class=\"sd-bar-l\">Rate for the target<\/span>\n          <span class=\"sd-bar-t\"><span class=\"sd-bar-f\" data-k=\"calc\" style=\"width:0\"><\/span><\/span>\n          <span class=\"sd-bar-v sd-bar-calc\">&#8212;<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- \u2500\u2500 seed size sensitivity \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n  <div class=\"sd-card\">\n    <p class=\"sd-h\">What a change of seed size costs you<\/p>\n    <p class=\"sd-sub\">Same target stand, same survival, every seed size this crop arrives at. The bar in dark green is your lot.<\/p>\n    <div class=\"sd-chart\" id=\"sd-chart\"><\/div>\n    <p class=\"sd-cap\">Across this range the rate runs from <b class=\"sd-spread\">&#8212;<\/b>. Hover a bar for the rate and the difference from your lot.<\/p>\n  <\/div>\n\n  <!-- \u2500\u2500 zone plan \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n  <div class=\"sd-card\">\n    <p class=\"sd-h\">One field, three rates<\/p>\n    <p class=\"sd-sub\">Thin ground and heavy ground carry different stands. Set the share of the field in each band and how far the target moves there.<\/p>\n\n    <div class=\"sd-acts\" style=\"margin-top:0;margin-bottom:6px\">\n      <button class=\"sd-btn2\" type=\"button\" id=\"sd-flip\">Push the strong ground<\/button>\n      <span class=\"sd-hint\" id=\"sd-flip-note\">Rate rises where the field carries more. Switch it to even out a stand that runs thin on the hilltops instead.<\/span>\n    <\/div>\n\n    <div class=\"sd-z-head\">\n      <span>Band<\/span><span>Share, pct<\/span><span>Target, pct<\/span><span>Stand<\/span><span>Rate<\/span>\n    <\/div>\n    <div class=\"sd-z-row\" data-z=\"0\">\n      <span class=\"sd-z-name\">Thin ground<span class=\"sd-z-note\">eroded knolls, shallow topsoil<\/span><\/span>\n      <span class=\"sd-z-cell\"><span class=\"sd-z-il\">Share, pct<\/span><input class=\"sd-z-in\" type=\"number\" min=\"0\" step=\"1\" inputmode=\"decimal\" data-f=\"share\" aria-label=\"Thin ground share of field, percent\"><\/span>\n      <span class=\"sd-z-cell\"><span class=\"sd-z-il\">Target, pct<\/span><input class=\"sd-z-in\" type=\"number\" step=\"1\" inputmode=\"decimal\" data-f=\"adj\" aria-label=\"Thin ground target adjustment, percent\"><\/span>\n      <span class=\"sd-z-out\"><span class=\"sd-z-il\">Stand<\/span><b class=\"sd-z-stand\">&#8212;<\/b><\/span>\n      <span class=\"sd-z-out\"><span class=\"sd-z-il\">Rate<\/span><b class=\"sd-z-rate\">&#8212;<\/b><\/span>\n    <\/div>\n    <div class=\"sd-z-row\" data-z=\"1\">\n      <span class=\"sd-z-name\">Average ground<span class=\"sd-z-note\">the bulk of the field<\/span><\/span>\n      <span class=\"sd-z-cell\"><span class=\"sd-z-il\">Share, pct<\/span><input class=\"sd-z-in\" type=\"number\" min=\"0\" step=\"1\" inputmode=\"decimal\" data-f=\"share\" aria-label=\"Average ground share of field, percent\"><\/span>\n      <span class=\"sd-z-cell\"><span class=\"sd-z-il\">Target, pct<\/span><input class=\"sd-z-in\" type=\"number\" step=\"1\" inputmode=\"decimal\" data-f=\"adj\" aria-label=\"Average ground target adjustment, percent\"><\/span>\n      <span class=\"sd-z-out\"><span class=\"sd-z-il\">Stand<\/span><b class=\"sd-z-stand\">&#8212;<\/b><\/span>\n      <span class=\"sd-z-out\"><span class=\"sd-z-il\">Rate<\/span><b class=\"sd-z-rate\">&#8212;<\/b><\/span>\n    <\/div>\n    <div class=\"sd-z-row\" data-z=\"2\">\n      <span class=\"sd-z-name\">Strong ground<span class=\"sd-z-note\">draws and low spots that hold water<\/span><\/span>\n      <span class=\"sd-z-cell\"><span class=\"sd-z-il\">Share, pct<\/span><input class=\"sd-z-in\" type=\"number\" min=\"0\" step=\"1\" inputmode=\"decimal\" data-f=\"share\" aria-label=\"Strong ground share of field, percent\"><\/span>\n      <span class=\"sd-z-cell\"><span class=\"sd-z-il\">Target, pct<\/span><input class=\"sd-z-in\" type=\"number\" step=\"1\" inputmode=\"decimal\" data-f=\"adj\" aria-label=\"Strong ground target adjustment, percent\"><\/span>\n      <span class=\"sd-z-out\"><span class=\"sd-z-il\">Stand<\/span><b class=\"sd-z-stand\">&#8212;<\/b><\/span>\n      <span class=\"sd-z-out\"><span class=\"sd-z-il\">Rate<\/span><b class=\"sd-z-rate\">&#8212;<\/b><\/span>\n    <\/div>\n\n    <div class=\"sd-z-sum\">\n      <div>The field averages <b class=\"sd-z-avg\">&#8212;<\/b> against a flat <b class=\"sd-z-flat\">&#8212;<\/b>.<\/div>\n      <div class=\"sd-z-diff\">Seed to order <b class=\"sd-z-mass\">&#8212;<\/b>, a change of <b class=\"sd-save sd-z-delta\">&#8212;<\/b> against seeding it flat.<\/div>\n      <div class=\"sd-z-same\" hidden>Seed to order <b class=\"sd-z-mass\">&#8212;<\/b>, the same as seeding it flat. The plan changes where the seed goes, not how much you buy.<\/div>\n    <\/div>\n\n    <div class=\"sd-acts\">\n      <button class=\"sd-btn2\" type=\"button\" id=\"sd-copy-eq\">Copy as GeoPard equation<\/button>\n      <span class=\"sd-copied\" id=\"sd-copied\" hidden>Copied<\/span>\n      <button class=\"sd-link\" type=\"button\" id=\"sd-eq-toggle\">Show the equation<\/button>\n    <\/div>\n    <div class=\"sd-eq\" id=\"sd-eq\" hidden>&#8212;<\/div>\n\n    <div class=\"sd-layers\">\n      <p><span class=\"sd-mark\">&#10003;<\/span>Where the bands fall on the ground is the part this page cannot know. Nothing you type here leaves the browser, and no field data is asked for.<\/p>\n      <p><span class=\"sd-mark\">&#10003;<\/span>In GeoPard the productivity index comes from layers you already have: multi-year satellite growth, elevation with slope and curvature, yield maps and soil tests. The equation above reads that index and writes the rate.<\/p>\n    <\/div>\n  <\/div>\n\n  <!-- \u2500\u2500 stand check \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n  <div class=\"sd-card\">\n    <p class=\"sd-h\">Check the stand, fix next year&#8217;s number<\/p>\n    <p class=\"sd-sub\">Three weeks after seeding, count the plants over a measured length of one row. That count turns field emergence from a guess into your number for this drill on this farm.<\/p>\n    <div class=\"sd-inline\">\n      <div class=\"sd-field\">\n        <label class=\"sd-lab\" for=\"sd-sc-n\">Plants counted<\/label>\n        <input class=\"sd-in\" id=\"sd-sc-n\" type=\"number\" min=\"0\" step=\"1\" inputmode=\"decimal\" placeholder=\"0\">\n      <\/div>\n      <div class=\"sd-field\">\n        <label class=\"sd-lab\" for=\"sd-sc-len\">Length of row<\/label>\n        <div class=\"sd-inrow\">\n          <input class=\"sd-in\" id=\"sd-sc-len\" type=\"number\" min=\"0\" step=\"0.1\" inputmode=\"decimal\">\n          <span class=\"sd-fixed sd-len-imp\">feet<\/span>\n          <span class=\"sd-fixed sd-len-met\" hidden>metres<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n    <div class=\"sd-verdict sd-sc-out\" hidden>\n      <p>That is <b class=\"sd-sc-stand\">&#8212;<\/b> plants<span class=\"sd-u-imp\"> per square foot<\/span><span class=\"sd-u-met\" hidden> per square metre<\/span>, so the seed you dropped came up at <b class=\"sd-sc-est\">&#8212;<\/b>, and field emergence on this drill was <b class=\"sd-sc-emerg\">&#8212;<\/b>.<\/p>\n      <div class=\"sd-acts\">\n        <button class=\"sd-btn2\" type=\"button\" id=\"sd-sc-use\">Use this emergence above<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- \u2500\u2500 show the math \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n  <div class=\"sd-card\">\n    <button class=\"sd-link\" type=\"button\" id=\"sd-math-toggle\">Show the arithmetic<\/button>\n    <div class=\"sd-math\" id=\"sd-math\" hidden>\n      <div>Plants wanted, per square metre <b class=\"sd-m-target\">&#8212;<\/b><\/div>\n      <div>Seedling survival, germination times field emergence <b class=\"sd-m-surv\">&#8212;<\/b><\/div>\n      <div>Seeds to drop, per square metre, target divided by survival <b class=\"sd-m-seeds\">&#8212;<\/b><\/div>\n      <div>Weight of 1000 seeds <b class=\"sd-m-tkw\">&#8212;<\/b><\/div>\n      <div>Kilograms per hectare, seeds per square metre times seed weight divided by 100 <b class=\"sd-m-kg\">&#8212;<\/b><\/div>\n      <div>Pounds per acre, the same figure in the other units <b class=\"sd-m-lb\">&#8212;<\/b><\/div>\n      <div class=\"sd-m-note\">In pounds per acre the whole thing collapses to plants per square foot times seed weight in grams, divided by survival as a decimal, times 0.096. That constant is 43,560 square feet in an acre divided by 453,592 grams in a pound.<\/div>\n    <\/div>\n  <\/div>\n\n  <!-- \u2500\u2500 CTA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n  <div class=\"sd-cta\">\n    <p>A rate per zone needs a map of the zones. GeoPard builds one from your satellite history, elevation, yield maps and soil tests, runs the equation over it, and exports the prescription your terminal reads.<\/p>\n    <a class=\"sd-btn\" href=\"https:\/\/app.geopard.tech\/auth\/sign-up?utm_source=geopard.tech&amp;utm_medium=tool&amp;utm_campaign=seeding-rate-calculator\">Build the seeding map<\/a>\n    <p><a class=\"sd-link2\" href=\"https:\/\/geopard.tech\/ai\/?utm_source=geopard.tech&amp;utm_medium=tool&amp;utm_campaign=seeding-rate-calculator\">Ask the GeoPard assistant about variable-rate seeding<\/a><\/p>\n  <\/div>\n\n  <div class=\"sd-tip\" id=\"sd-tip\" hidden><\/div>\n<\/div>\n\n<script nowprocket data-no-optimize=\"1\" data-no-defer=\"1\" data-no-minify=\"1\">\n\/* GSR-SEED-CORE BEGIN \u2014 generated from seed-core.js by scripts\/rebuild.sh. DO NOT EDIT HERE. *\/\n\/* Seeding Rate Calculator core.\n *\n * SOURCE OF TRUTH. scripts\/rebuild.sh injects this file verbatim into\n * source.html between the GSR-SEED-CORE markers, so edit here and never the\n * generated section. tests.js requires this file directly, so the maths the\n * tests exercise is the maths that ships.\n *\n * Root CLAUDE.md rule 1: not one ampersand character anywhere below. This file\n * is injected into an inline script on the page, where WordPress encodes a bare\n * ampersand to a numeric entity the browser will not decode back, so the script\n * dies with a syntax error. Short-circuits are written as ternaries, and no\n * string may carry one either, which is why every region name says \"and\".\n *\n * Nothing here may contain a literal script tag either: the injected text lands\n * inside one, and a closing tag in a comment would end it early.\n *\n * Target plant stands and seed weights are extension midpoints: Saskatchewan\n * Ministry of Agriculture and Manitoba Agriculture crop pages, Saskatchewan\n * Pulse Growers target plant density tables, Canola Council of Canada plant\n * population guidance, AHDB establishment guidance for the UK and northern\n * Europe, and university extension small-grain seeding rate publications.\n *\/\nvar GSR = (function () {\n  \/* \u2500\u2500 unit constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     One acre is 43,560 square feet and 4,046.8564224 square metres. One pound\n     is 453.59237 grams. Everything else is derived so a rounding choice is\n     never baked into two places. *\/\n  var FT2_PER_AC = 43560;\n  var M2_PER_AC = 4046.8564224;\n  var M2_PER_HA = 10000;\n  var G_PER_LB = 453.59237;\n  var G_PER_OZ = 28.349523125;\n  var M2_IN_FT2 = FT2_PER_AC \/ M2_PER_AC;       \/* 10.76391: square feet in one square metre *\/\n  var LBAC_PER_KGHA = (1 \/ 0.45359237) * 0.40468564224;  \/* 0.8921791 *\/\n  var CM_PER_IN = 2.54;\n  \/* The imperial shortcut every seed tag conversation uses: pounds per acre is\n     plants per square foot times thousand kernel weight in grams divided by\n     seedling survival, times this constant. It is 43,560 \/ 453,592.37, so the\n     familiar \"times 9.6, divided by survival as a percent\" and the equally\n     familiar \"divide by 10.4\" are both rounded forms of the same number. *\/\n  var K_LBAC = FT2_PER_AC \/ (G_PER_LB * 1000);  \/* 0.09603... *\/\n  \/* \u2500\u2500 crops \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     m2:   target ESTABLISHED plants per square metre, [low, typical, high].\n     tkw:  thousand kernel weight in grams, [low, typical, high]. The range is\n           what a grower sees across lots, which is the whole reason a rate set\n           in bushels drifts.\n     bu:   pounds in a bushel, or null where the crop is not sold by the bushel.\n     germ: typical laboratory germination on the tag.\n     emerg: share of germinable seed that becomes an established plant.\n     rowIn \/ rowCm: the row spacing the crop is usually drilled at. *\/\n  var CROPS = [\n    {key: 'wheat-spring', name: 'Spring wheat', group: 'Cereals',\n     m2: [215, 250, 300], tkw: [26, 34, 46], bu: 60, germ: 95, emerg: 88, rowIn: 10, rowCm: 19},\n    {key: 'wheat-durum', name: 'Durum', group: 'Cereals',\n     m2: [215, 250, 300], tkw: [33, 42, 52], bu: 60, germ: 95, emerg: 88, rowIn: 10, rowCm: 19},\n    {key: 'wheat-winter', name: 'Winter wheat', group: 'Cereals',\n     m2: [200, 260, 350], tkw: [35, 45, 58], bu: 60, germ: 95, emerg: 85, rowIn: 7.5, rowCm: 12.5},\n    {key: 'barley-malt', name: 'Malting barley', group: 'Cereals',\n     m2: [195, 240, 280], tkw: [36, 44, 52], bu: 48, germ: 95, emerg: 88, rowIn: 10, rowCm: 19},\n    {key: 'barley-feed', name: 'Feed barley', group: 'Cereals',\n     m2: [215, 255, 320], tkw: [36, 45, 54], bu: 48, germ: 95, emerg: 88, rowIn: 10, rowCm: 19},\n    {key: 'barley-spring', name: 'Spring barley (Europe)', group: 'Cereals',\n     m2: [280, 310, 360], tkw: [38, 45, 52], bu: 48, germ: 95, emerg: 88, rowIn: 6, rowCm: 12.5},\n    {key: 'barley-winter', name: 'Winter barley (Europe)', group: 'Cereals',\n     m2: [250, 300, 350], tkw: [40, 48, 56], bu: 48, germ: 95, emerg: 85, rowIn: 6, rowCm: 12.5},\n    {key: 'oats', name: 'Oats', group: 'Cereals',\n     m2: [215, 270, 330], tkw: [26, 35, 45], bu: 32, germ: 95, emerg: 88, rowIn: 10, rowCm: 19},\n    {key: 'rye-hybrid', name: 'Hybrid fall rye', group: 'Cereals',\n     m2: [150, 180, 230], tkw: [24, 30, 38], bu: 56, germ: 95, emerg: 85, rowIn: 10, rowCm: 15},\n    {key: 'triticale', name: 'Triticale', group: 'Cereals',\n     m2: [215, 255, 310], tkw: [36, 45, 55], bu: 50, germ: 95, emerg: 85, rowIn: 10, rowCm: 15},\n    {key: 'canola', name: 'Canola \/ spring oilseed rape', group: 'Oilseeds',\n     m2: [50, 65, 85], tkw: [3.5, 5.0, 7.0], bu: 50, germ: 95, emerg: 60, rowIn: 12, rowCm: 25},\n    {key: 'osr-winter', name: 'Winter oilseed rape', group: 'Oilseeds',\n     m2: [25, 35, 55], tkw: [4.0, 5.5, 7.0], bu: 50, germ: 95, emerg: 65, rowIn: 12, rowCm: 25},\n    {key: 'flax', name: 'Flax', group: 'Oilseeds',\n     m2: [350, 420, 520], tkw: [4.5, 6.0, 8.0], bu: 56, germ: 90, emerg: 80, rowIn: 10, rowCm: 19},\n    {key: 'mustard', name: 'Mustard', group: 'Oilseeds',\n     m2: [75, 95, 115], tkw: [2.0, 3.0, 6.0], bu: 50, germ: 92, emerg: 70, rowIn: 10, rowCm: 19},\n    {key: 'sunflower', name: 'Sunflower', group: 'Oilseeds',\n     m2: [4.5, 5.4, 6.5], tkw: [45, 65, 95], bu: null, germ: 92, emerg: 90, rowIn: 30, rowCm: 70},\n    {key: 'pea', name: 'Field pea', group: 'Pulses',\n     m2: [75, 85, 100], tkw: [150, 220, 300], bu: 60, germ: 92, emerg: 90, rowIn: 10, rowCm: 19},\n    {key: 'lentil-red', name: 'Red lentil (small)', group: 'Pulses',\n     m2: [130, 150, 240], tkw: [28, 38, 48], bu: 60, germ: 92, emerg: 90, rowIn: 10, rowCm: 19},\n    {key: 'lentil-green', name: 'Large green lentil', group: 'Pulses',\n     m2: [110, 130, 180], tkw: [55, 70, 85], bu: 60, germ: 92, emerg: 90, rowIn: 10, rowCm: 19},\n    {key: 'chickpea', name: 'Chickpea', group: 'Pulses',\n     m2: [33, 42, 46], tkw: [250, 420, 550], bu: 60, germ: 90, emerg: 85, rowIn: 12, rowCm: 25},\n    {key: 'faba', name: 'Faba bean', group: 'Pulses',\n     m2: [40, 44, 65], tkw: [350, 500, 750], bu: 60, germ: 92, emerg: 88, rowIn: 12, rowCm: 25},\n    {key: 'soybean', name: 'Soybean', group: 'Pulses',\n     m2: [44, 50, 57], tkw: [120, 160, 200], bu: 60, germ: 90, emerg: 90, rowIn: 15, rowCm: 45},\n    {key: 'dry-bean', name: 'Dry bean', group: 'Pulses',\n     m2: [25, 35, 50], tkw: [180, 300, 450], bu: 60, germ: 88, emerg: 85, rowIn: 22, rowCm: 55},\n    {key: 'corn', name: 'Corn (grain)', group: 'Row crops',\n     m2: [7.0, 8.4, 9.5], tkw: [220, 300, 380], bu: 56, germ: 95, emerg: 95, rowIn: 30, rowCm: 75}\n  ];\n  \/* \u2500\u2500 regions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     Rule 12: the visitor lands on numbers that fit their farming context, not\n     on a global midpoint. A region carries everything that differs by where you\n     farm and not by which crop you grow: the unit system, the crop the page\n     opens on, the field size that reads as normal, the currency, and a row\n     spacing where local practice overrides the crop default (Australian dryland\n     cereals on wide rows, Southern African maize at 76 cm).\n     Two regions only exist separately when at least one of those differs. No\n     ampersands in any name: these strings ship inside a script body. *\/\n  var REGIONS = [\n    {key: 'na-north', name: 'Canadian Prairies and Northern Plains', sys: 'imperial', crop: 'wheat-spring', area: 160, cur: 'C$'},\n    {key: 'na-corn', name: 'US Corn Belt and Midwest', sys: 'imperial', crop: 'corn', area: 80, cur: '$'},\n    {key: 'na-south', name: 'US Southern Plains and Delta', sys: 'imperial', crop: 'wheat-winter', area: 160, cur: '$', rowIn: 7.5},\n    {key: 'na-west', name: 'US Pacific Northwest', sys: 'imperial', crop: 'wheat-winter', area: 160, cur: '$', rowIn: 7},\n    {key: 'uk-ie', name: 'UK and Ireland', sys: 'metric', crop: 'wheat-winter', area: 20, cur: '\\u00a3'},\n    {key: 'eu-nw', name: 'Northern and Western Europe', sys: 'metric', crop: 'wheat-winter', area: 20, cur: '\\u20ac'},\n    {key: 'eu-c', name: 'Central Europe', sys: 'metric', crop: 'wheat-winter', area: 30, cur: '\\u20ac'},\n    {key: 'eu-med', name: 'Mediterranean', sys: 'metric', crop: 'wheat-durum', area: 20, cur: '\\u20ac', rowCm: 15},\n    {key: 'eu-e', name: 'Eastern Europe and the Black Sea', sys: 'metric', crop: 'wheat-winter', area: 80, cur: '\\u20ac', rowCm: 15},\n    {key: 'ru-kz', name: 'Russia and Central Asia', sys: 'metric', crop: 'wheat-spring', area: 150, cur: '$', rowCm: 15},\n    {key: 'au', name: 'Australia', sys: 'metric', crop: 'wheat-spring', area: 100, cur: 'A$', rowCm: 30},\n    {key: 'nz', name: 'New Zealand', sys: 'metric', crop: 'wheat-winter', area: 20, cur: 'NZ$'},\n    {key: 'br', name: 'Brazil', sys: 'metric', crop: 'soybean', area: 100, cur: 'R$', rowCm: 45},\n    {key: 'sa-s', name: 'Argentina and the Southern Cone', sys: 'metric', crop: 'soybean', area: 80, cur: '$', rowCm: 52},\n    {key: 'af-s', name: 'Southern Africa', sys: 'metric', crop: 'corn', area: 50, cur: 'R', rowCm: 76},\n    {key: 'as-s', name: 'South Asia', sys: 'metric', crop: 'wheat-winter', area: 5, cur: '$', rowCm: 20},\n    {key: 'as-e', name: 'East Asia', sys: 'metric', crop: 'corn', area: 10, cur: '$', rowCm: 60},\n    {key: 'row', name: 'Rest of world', sys: 'metric', crop: 'wheat-spring', area: 40, cur: '$'}\n  ];\n  var COUNTRY_REGION = {\n    CA: 'na-north', US: 'na-corn', MX: 'na-south',\n    GB: 'uk-ie', IE: 'uk-ie',\n    FR: 'eu-nw', DE: 'eu-nw', DK: 'eu-nw', NL: 'eu-nw', BE: 'eu-nw', LU: 'eu-nw',\n    SE: 'eu-nw', NO: 'eu-nw', FI: 'eu-nw', IS: 'eu-nw',\n    AT: 'eu-c', CH: 'eu-c', CZ: 'eu-c', SK: 'eu-c', PL: 'eu-c', HU: 'eu-c', SI: 'eu-c',\n    ES: 'eu-med', IT: 'eu-med', PT: 'eu-med', GR: 'eu-med', MT: 'eu-med', CY: 'eu-med',\n    TR: 'eu-med', MA: 'eu-med', DZ: 'eu-med', TN: 'eu-med', IL: 'eu-med',\n    UA: 'eu-e', RO: 'eu-e', BG: 'eu-e', HR: 'eu-e', RS: 'eu-e', BA: 'eu-e', MK: 'eu-e',\n    AL: 'eu-e', ME: 'eu-e', MD: 'eu-e', LT: 'eu-e', LV: 'eu-e', EE: 'eu-e',\n    RU: 'ru-kz', KZ: 'ru-kz', BY: 'ru-kz', UZ: 'ru-kz', KG: 'ru-kz', TJ: 'ru-kz',\n    TM: 'ru-kz', AZ: 'ru-kz', GE: 'ru-kz', AM: 'ru-kz', MN: 'ru-kz',\n    AU: 'au', NZ: 'nz',\n    BR: 'br',\n    AR: 'sa-s', UY: 'sa-s', PY: 'sa-s', CL: 'sa-s', BO: 'sa-s', PE: 'sa-s',\n    CO: 'sa-s', EC: 'sa-s', VE: 'sa-s',\n    ZA: 'af-s', ZW: 'af-s', ZM: 'af-s', MW: 'af-s', MZ: 'af-s', BW: 'af-s',\n    NA: 'af-s', TZ: 'af-s', KE: 'af-s', UG: 'af-s', ET: 'af-s', NG: 'af-s', GH: 'af-s',\n    IN: 'as-s', PK: 'as-s', BD: 'as-s', NP: 'as-s', LK: 'as-s',\n    CN: 'as-e', JP: 'as-e', KR: 'as-e', TW: 'as-e', VN: 'as-e', TH: 'as-e',\n    ID: 'as-e', MY: 'as-e', PH: 'as-e'\n  };\n  \/* A country code is as much as IP geolocation gives, and for the two biggest\n     countries it is not enough: North Dakota and Iowa are not the same crop.\n     The time zone splits them, and it is already in the browser. *\/\n  var TZ_REGION = {\n    'America\/Winnipeg': 'na-north', 'America\/Regina': 'na-north', 'America\/Edmonton': 'na-north',\n    'America\/Vancouver': 'na-north', 'America\/Toronto': 'na-north', 'America\/Halifax': 'na-north',\n    'America\/Denver': 'na-north', 'America\/Boise': 'na-north',\n    'America\/Chicago': 'na-corn', 'America\/New_York': 'na-corn', 'America\/Detroit': 'na-corn',\n    'America\/Indiana\/Indianapolis': 'na-corn', 'America\/Kentucky\/Louisville': 'na-corn',\n    'America\/Los_Angeles': 'na-west', 'America\/Phoenix': 'na-south'\n  };\n  \/* When nothing identifies the visitor, guess from the language family rather\n     than dropping everyone on the rest of the world. *\/\n  var LANG_REGION = {\n    de: 'eu-nw', nl: 'eu-nw', da: 'eu-nw', sv: 'eu-nw', nb: 'eu-nw', no: 'eu-nw', fi: 'eu-nw', fr: 'eu-nw',\n    cs: 'eu-c', sk: 'eu-c', pl: 'eu-c', hu: 'eu-c', sl: 'eu-c',\n    es: 'eu-med', it: 'eu-med', pt: 'eu-med', el: 'eu-med', tr: 'eu-med',\n    uk: 'eu-e', ro: 'eu-e', bg: 'eu-e', hr: 'eu-e', sr: 'eu-e', lt: 'eu-e', lv: 'eu-e', et: 'eu-e',\n    ru: 'ru-kz', kk: 'ru-kz', be: 'ru-kz', az: 'ru-kz', hy: 'ru-kz', ka: 'ru-kz',\n    hi: 'as-s', bn: 'as-s', ur: 'as-s', pa: 'as-s', ta: 'as-s',\n    zh: 'as-e', ja: 'as-e', ko: 'as-e', vi: 'as-e', th: 'as-e', id: 'as-e', ms: 'as-e',\n    af: 'af-s', sw: 'af-s', zu: 'af-s'\n  };\n  function cropByKey(key) {\n    for (var i = 0; i < CROPS.length; i++) { if (CROPS[i].key === key) { return CROPS[i]; } }\n    return CROPS[0];\n  }\n  function regionByKey(key) {\n    for (var i = 0; i < REGIONS.length; i++) { if (REGIONS[i].key === key) { return REGIONS[i]; } }\n    return REGIONS[REGIONS.length - 1];\n  }\n  function regionForCountry(cc) {\n    return COUNTRY_REGION[cc] ? COUNTRY_REGION[cc] : null;\n  }\n  function regionForZone(tz) {\n    return TZ_REGION[tz] ? TZ_REGION[tz] : null;\n  }\n  \/* Last step of the chain. A language tag with no country still says a lot:\n     somebody browsing in Ukrainian farms nothing like somebody browsing in\n     Portuguese. Only when even that is absent does the rest of the world win. *\/\n  function regionForLanguage(tag) {\n    if (!tag) { return null; }\n    var base = String(tag).toLowerCase().split(\/[-_]\/)[0];\n    return LANG_REGION[base] ? LANG_REGION[base] : null;\n  }\n  \/* \u2500\u2500 seed size \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     A tag states seed size one of four ways. All four are the same number. *\/\n  function tkwFrom(value, unit) {\n    var v = Number(value);\n    if (!(v > 0)) { return 0; }\n    if (unit === 'g') { return v; }\n    if (unit === 'oz') { return v * G_PER_OZ; }\n    if (unit === 'seeds-lb') { return (G_PER_LB * 1000) \/ v; }\n    if (unit === 'seeds-kg') { return 1000000 \/ v; }\n    return v;\n  }\n  function seedsPerLb(tkw) { return tkw > 0 ? (G_PER_LB * 1000) \/ tkw : 0; }\n  function seedsPerKg(tkw) { return tkw > 0 ? 1000000 \/ tkw : 0; }\n  \/* \u2500\u2500 target stand \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     Canonical inside the core is plants per square metre. Everything the user\n     can type converts into it. *\/\n  function targetToM2(value, unit) {\n    var v = Number(value);\n    if (!(v > 0)) { return 0; }\n    if (unit === 'm2') { return v; }\n    if (unit === 'ft2') { return v * M2_IN_FT2; }\n    if (unit === 'ac') { return v \/ M2_PER_AC; }\n    if (unit === 'ha') { return v \/ M2_PER_HA; }\n    return v;\n  }\n  function targetFromM2(m2, unit) {\n    if (unit === 'm2') { return m2; }\n    if (unit === 'ft2') { return m2 \/ M2_IN_FT2; }\n    if (unit === 'ac') { return m2 * M2_PER_AC; }\n    if (unit === 'ha') { return m2 * M2_PER_HA; }\n    return m2;\n  }\n  \/* A target of 0.78 plants per square foot is a corn stand written in the wrong\n     unit: rounded for display it becomes 0.8, which is two and a half percent of\n     the rate. Row crops are stated per acre or per hectare, where the number is\n     large enough to survive being rounded. *\/\n  function pickTargetUnit(m2, sys) {\n    if (sys === 'imperial') { return targetFromM2(m2, 'ft2') < 2 ? 'ac' : 'ft2'; }\n    return m2 < 2 ? 'ha' : 'm2';\n  }\n  function displayTarget(m2, unit) {\n    var v = targetFromM2(m2, unit);\n    return v >= 1000 ? Math.round(v) : v >= 10 ? round(v, 1) : round(v, 2);\n  }\n  \/* Combined seedling survival. Germination is what the laboratory found;\n     field emergence is the share of that germinable seed which actually\n     becomes a plant in the furrow. A single \"mortality\" figure hides which of\n     the two moved, and it is nearly always the second one. *\/\n  function survival(germPct, emergPct) {\n    var g = Number(germPct), e = Number(emergPct);\n    if (!(g > 0)) { g = 0; }\n    if (!(e > 0)) { e = 0; }\n    return (g \/ 100) * (e \/ 100);\n  }\n  \/* \u2500\u2500 the calculation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     in: {targetM2, tkw, germ, emerg, rowIn, rowCm, buWeight}\n     Everything downstream reads this one object, so a unit switch in the page\n     never re-derives a number. *\/\n  function compute(inp) {\n    var surv = survival(inp.germ, inp.emerg);\n    var out = {survival: surv, ok: surv > 0 ? inp.targetM2 > 0 ? inp.tkw > 0 : false : false};\n    if (!out.ok) {\n      out.seedsM2 = 0; out.seedsFt2 = 0; out.seedsAc = 0; out.seedsHa = 0;\n      out.kgHa = 0; out.lbAc = 0; out.buAc = null;\n      out.seedsPerFtRow = 0; out.seedsPerMRow = 0; out.spacingIn = 0; out.spacingCm = 0;\n      return out;\n    }\n    out.seedsM2 = inp.targetM2 \/ surv;\n    out.seedsFt2 = out.seedsM2 \/ M2_IN_FT2;\n    out.seedsAc = out.seedsM2 * M2_PER_AC;\n    out.seedsHa = out.seedsM2 * M2_PER_HA;\n    out.kgHa = out.seedsM2 * inp.tkw \/ 100;\n    out.lbAc = out.kgHa * LBAC_PER_KGHA;\n    out.buAc = inp.buWeight > 0 ? out.lbAc \/ inp.buWeight : null;\n    \/* Row geometry. A drill puts every seed of a square foot into the length\n       of row that square foot contains, so the narrower the row the more seeds\n       fall per foot of it, and the tighter they sit in the furrow. *\/\n    var rowIn = Number(inp.rowIn) > 0 ? Number(inp.rowIn) : 0;\n    var rowCm = Number(inp.rowCm) > 0 ? Number(inp.rowCm) : rowIn * CM_PER_IN;\n    out.seedsPerFtRow = rowIn > 0 ? out.seedsFt2 * (rowIn \/ 12) : 0;\n    out.seedsPerMRow = rowCm > 0 ? out.seedsM2 * (rowCm \/ 100) : 0;\n    out.spacingIn = out.seedsPerFtRow > 0 ? 12 \/ out.seedsPerFtRow : 0;\n    out.spacingCm = out.seedsPerMRow > 0 ? 100 \/ out.seedsPerMRow : 0;\n    \/* Plants per foot of row is what an agronomist counts behind the drill. *\/\n    out.plantsPerFtRow = out.seedsPerFtRow * surv;\n    out.plantsPerMRow = out.seedsPerMRow * surv;\n    return out;\n  }\n  \/* \u2500\u2500 the reverse question \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     A rate carried over from last year, run through this year's seed lot: what\n     stand does it actually put on the ground? This is the reason a rate set in\n     bushels drifts with no one noticing. *\/\n  function standFromRate(rate, unitSys, tkw, germ, emerg, buWeight) {\n    var r = Number(rate);\n    if (!(r > 0)) { return null; }\n    if (!(tkw > 0)) { return null; }\n    var kgHa;\n    \/* Cereals and pulses are set in weight; corn, sunflower and soybeans are set\n       in seeds, which is the same statement once the seed is weighed. *\/\n    if (unitSys === 'seeds-ac') { kgHa = (r \/ M2_PER_AC) * tkw \/ 100; }\n    else if (unitSys === 'seeds-ha') { kgHa = (r \/ M2_PER_HA) * tkw \/ 100; }\n    else if (unitSys === 'bu') {\n      if (!(buWeight > 0)) { return null; }\n      kgHa = (r * buWeight) \/ LBAC_PER_KGHA;\n    } else if (unitSys === 'lbac') {\n      kgHa = r \/ LBAC_PER_KGHA;\n    } else {\n      kgHa = r;\n    }\n    var seedsM2 = kgHa * 100 \/ tkw;\n    var surv = survival(germ, emerg);\n    return {\n      kgHa: kgHa,\n      lbAc: kgHa * LBAC_PER_KGHA,\n      seedsM2: seedsM2,\n      seedsFt2: seedsM2 \/ M2_IN_FT2,\n      plantsM2: seedsM2 * surv,\n      plantsFt2: (seedsM2 * surv) \/ M2_IN_FT2\n    };\n  }\n  \/* \u2500\u2500 sensitivity to seed size \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     Rate is linear in thousand kernel weight, so the shape is a straight line;\n     the point of drawing it is that the line is STEEP. Across a crop's normal\n     lot-to-lot range the rate needed moves by tens of percent. *\/\n  function tkwCurve(inp, lo, hi, steps) {\n    var n = steps > 1 ? steps : 9;\n    var pts = [];\n    for (var i = 0; i < n; i++) {\n      var t = lo + (hi - lo) * (i \/ (n - 1));\n      var r = compute({targetM2: inp.targetM2, tkw: t, germ: inp.germ, emerg: inp.emerg,\n                       rowIn: inp.rowIn, rowCm: inp.rowCm, buWeight: inp.buWeight});\n      pts.push({tkw: t, lbAc: r.lbAc, kgHa: r.kgHa});\n    }\n    return pts;\n  }\n  \/* \u2500\u2500 field totals \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     areaAc \/ areaHa are the same field; the caller passes whichever it holds\n     and reads whichever it shows. *\/\n  function fieldTotals(res, areaHa, pricePerUnit, priceUnit) {\n    var t = {};\n    t.areaHa = areaHa;\n    t.areaAc = areaHa \/ 0.40468564224;\n    t.kg = res.kgHa * areaHa;\n    t.lb = t.kg \/ 0.45359237;\n    t.tonnes = t.kg \/ 1000;\n    t.shortTons = t.lb \/ 2000;\n    t.bu = res.buAc !== null ? res.buAc * t.areaAc : null;\n    t.cost = null; t.costPerHa = null; t.costPerAc = null;\n    var p = Number(pricePerUnit);\n    if (p > 0) {\n      if (priceUnit === 'kg') { t.cost = t.kg * p; }\n      else if (priceUnit === 'lb') { t.cost = t.lb * p; }\n      else if (priceUnit === 't') { t.cost = t.tonnes * p; }\n      else if (priceUnit === 'bu') { t.cost = t.bu !== null ? t.bu * p : null; }\n      if (t.cost !== null ? areaHa > 0 : false) {\n        t.costPerHa = t.cost \/ areaHa;\n        t.costPerAc = t.cost \/ t.areaAc;\n      }\n    }\n    return t;\n  }\n  \/* \u2500\u2500 zone plan \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     A flat rate is one number for ground that is not one thing. The plan takes\n     the share of the field in each of three productivity bands and an\n     adjustment to the target stand in each, and returns the rate per band, the\n     rate the field averages out at, and what that does to the seed order.\n     The tool has no field data and asks for none: it never sees elevation, a\n     yield map or a boundary. Where the bands actually fall on the ground is\n     what a productivity layer answers, and equationFor() writes the expression\n     that reads one. *\/\n  function zonePlan(inp, zones, areaHa) {\n    var flat = compute(inp);\n    var shareSum = 0, i;\n    for (i = 0; i < zones.length; i++) { shareSum += Number(zones[i].share) > 0 ? Number(zones[i].share) : 0; }\n    if (!(shareSum > 0)) { return null; }\n    var rows = [], seedKg = 0;\n    for (i = 0; i < zones.length; i++) {\n      var share = (Number(zones[i].share) > 0 ? Number(zones[i].share) : 0) \/ shareSum;\n      var adj = Number(zones[i].adj);\n      if (!isFinite(adj)) { adj = 0; }\n      var tm2 = inp.targetM2 * (1 + adj \/ 100);\n      var r = compute({targetM2: tm2, tkw: inp.tkw, germ: inp.germ, emerg: inp.emerg,\n                       rowIn: inp.rowIn, rowCm: inp.rowCm, buWeight: inp.buWeight});\n      var zoneHa = areaHa * share;\n      seedKg += r.kgHa * zoneHa;\n      rows.push({name: zones[i].name, share: share, adj: adj, targetM2: tm2,\n                 kgHa: r.kgHa, lbAc: r.lbAc, areaHa: zoneHa, areaAc: zoneHa \/ 0.40468564224,\n                 seedKg: r.kgHa * zoneHa, plantsM2: tm2, plantsFt2: tm2 \/ M2_IN_FT2});\n    }\n    var flatKg = flat.kgHa * areaHa;\n    return {\n      rows: rows,\n      flatKgHa: flat.kgHa, flatLbAc: flat.lbAc,\n      blendedKgHa: areaHa > 0 ? seedKg \/ areaHa : 0,\n      blendedLbAc: areaHa > 0 ? (seedKg \/ areaHa) * LBAC_PER_KGHA : 0,\n      seedKg: seedKg, flatKg: flatKg,\n      deltaKg: seedKg - flatKg,\n      deltaLb: (seedKg - flatKg) \/ 0.45359237\n    };\n  }\n  \/* The expression a grower pastes into GeoPard's equation analytics.\n     GeoPard runs Python-style formulas over field layers under a geopard.\n     namespace, and build_zones_by_intervals cuts a layer into bands at given\n     percentiles. The shares set on the page become those percentiles, so the\n     zone map it builds is the split the grower just described, and each band is\n     multiplied by its own rate. Rule 21: the text names the layers and the\n     output, never a method. *\/\n  function equationFor(inp, zones, sys, names) {\n    var plan = zonePlan(inp, zones, 1);\n    if (!plan) { return ''; }\n    var unit = sys === 'imperial' ? 'lb\/ac' : 'kg\/ha';\n    var rate = function (r) { return round(sys === 'imperial' ? r.lbAc : r.kgHa, 1); };\n    var i, cum = 0, cuts = [];\n    for (i = 0; i < plan.rows.length - 1; i++) {\n      cum += plan.rows[i].share * 100;\n      cuts.push(round(cum, 0));\n    }\n    var L = [];\n    L.push('# Seeding rate by productivity zone, ' + unit);\n    L.push('# seed lot: ' + round(inp.tkw, 1) + ' g per 1000 seeds, '\n           + round(inp.germ, 0) + ' pct germination, ' + round(inp.emerg, 0) + ' pct field emergence');\n    L.push('# average ground: ' + round(inp.targetM2, 0) + ' plants\/m2 ('\n           + round(inp.targetM2 \/ M2_IN_FT2, 1) + ' plants\/ft2) at ' + rate({lbAc: plan.flatLbAc, kgHa: plan.flatKgHa}) + ' ' + unit);\n    for (i = 0; i < plan.rows.length; i++) {\n      L.push('#   zone ' + (i + 1) + ', ' + (names ? names[i] : plan.rows[i].name) + ': '\n             + round(plan.rows[i].share * 100, 0) + ' pct of the field, target '\n             + (plan.rows[i].adj >= 0 ? '+' : '\\u2212') + Math.abs(round(plan.rows[i].adj, 0)) + ' pct, '\n             + rate(plan.rows[i]) + ' ' + unit);\n    }\n    L.push('');\n    L.push('zones = geopard.build_zones_by_intervals(productivity_layer, [' + cuts.join(', ') + '])');\n    var terms = [];\n    for (i = 0; i < plan.rows.length; i++) {\n      terms.push(rate(plan.rows[i]) + ' * (zones == ' + (i + 1) + ')');\n    }\n    L.push('seed_rate = ' + terms.join(' + '));\n    return L.join('\\n');\n  }\n  \/* \u2500\u2500 stand check \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     Counted plants over a measured length of row, turned back into the two\n     numbers the calculation asked for. The emergence it returns is the honest\n     one for this drill on this farm, and it is the input worth replacing. *\/\n  function standCheck(count, lengthVal, lengthUnit, rowVal, rowUnit, seedsM2Applied, germPct) {\n    var n = Number(count), L = Number(lengthVal), R = Number(rowVal);\n    if (!(n >= 0) ? true : !(L > 0) ? true : !(R > 0)) { return null; }\n    var lengthM = lengthUnit === 'ft' ? L * 0.3048 : L;\n    var rowM = rowUnit === 'in' ? R * 0.0254 : R \/ 100;\n    var areaM2 = lengthM * rowM;\n    var plantsM2 = n \/ areaM2;\n    var out = {plantsM2: plantsM2, plantsFt2: plantsM2 \/ M2_IN_FT2, areaM2: areaM2};\n    if (seedsM2Applied > 0) {\n      out.establishmentPct = 100 * plantsM2 \/ seedsM2Applied;\n      out.emergencePct = germPct > 0 ? out.establishmentPct \/ (germPct \/ 100) : null;\n    } else {\n      out.establishmentPct = null; out.emergencePct = null;\n    }\n    return out;\n  }\n  function round(v, d) {\n    var m = Math.pow(10, d);\n    return Math.round(v * m) \/ m;\n  }\n  return {\n    CROPS: CROPS, REGIONS: REGIONS, COUNTRY_REGION: COUNTRY_REGION,\n    K_LBAC: K_LBAC, M2_IN_FT2: M2_IN_FT2, M2_PER_AC: M2_PER_AC,\n    LBAC_PER_KGHA: LBAC_PER_KGHA, G_PER_LB: G_PER_LB, CM_PER_IN: CM_PER_IN,\n    TZ_REGION: TZ_REGION, LANG_REGION: LANG_REGION,\n    cropByKey: cropByKey, regionByKey: regionByKey, regionForCountry: regionForCountry,\n    regionForZone: regionForZone, regionForLanguage: regionForLanguage,\n    tkwFrom: tkwFrom, seedsPerLb: seedsPerLb, seedsPerKg: seedsPerKg,\n    targetToM2: targetToM2, targetFromM2: targetFromM2, survival: survival,\n    pickTargetUnit: pickTargetUnit, displayTarget: displayTarget,\n    compute: compute, standFromRate: standFromRate, tkwCurve: tkwCurve,\n    fieldTotals: fieldTotals, zonePlan: zonePlan, equationFor: equationFor,\n    standCheck: standCheck, round: round\n  };\n})();\n\/* GSR-SEED-CORE END *\/\n<\/script>\n\n<script nowprocket data-no-optimize=\"1\" data-no-defer=\"1\" data-no-minify=\"1\">\n(function () {\n  var root = document.getElementById('gp-seed');\n  if (!root) { return; }\n  function $(s) { return root.querySelector(s); }\n  function all(s) { return root.querySelectorAll(s); }\n  function setText(sel, v) { var n = all(sel); for (var i = 0; i < n.length; i++) { n[i].textContent = v; } }\n  function show(sel, on) { var n = all(sel); for (var i = 0; i < n.length; i++) { n[i].hidden = !on; } }\n  function num(el) { var v = Number(el.value); return isFinite(v) ? v : 0; }\n  \/* Rule 12: the visitor lands on numbers that fit their farming context.\n     Same chain as \/2026-pricing\/: a saved choice beats everything, then the\n     server-injected country, then the browser's own hints, and only then a\n     guess from the language family. Every step reports HOW it decided, because\n     a number tuned to the wrong continent is worse than a generic one. *\/\n  function tz() {\n    try { return Intl.DateTimeFormat().resolvedOptions().timeZone; } catch (e) { return ''; }\n  }\n  \/* A country code alone puts every American on one region, and Iowa is not\n     North Dakota. Where the time zone splits a country we know, it wins. *\/\n  function refine(region, zone) {\n    var z = GSR.regionForZone(zone);\n    if (!z) { return region; }\n    var NA = {'na-north': 1, 'na-corn': 1, 'na-south': 1, 'na-west': 1};\n    return NA[region] ? (NA[z] ? z : region) : region;\n  }\n  function detect() {\n    var z = tz(), cc, r;\n    try {\n      var saved = localStorage.getItem('gsr-region');\n      if (saved ? GSR.REGIONS.some(function (x) { return x.key === saved; }) : false) {\n        return {region: saved, via: 'saved', saved: true};\n      }\n    } catch (e) { \/* private mode: carry on *\/ }\n    try {\n      var gp = window.__GP_GEO;\n      cc = gp ? gp.country : null;\n      r = cc ? GSR.regionForCountry(String(cc).toUpperCase()) : null;\n      if (r) { return {region: refine(r, z), via: 'server'}; }\n    } catch (e) { \/* nothing injected *\/ }\n    try {\n      var langs = [];\n      if (navigator.languages ? navigator.languages.length : false) {\n        langs = Array.prototype.slice.call(navigator.languages);\n      }\n      if (navigator.language) { langs.push(navigator.language); }\n      for (var i = 0; i < langs.length; i++) {\n        var m = \/[-_]([A-Za-z]{2})(?:$|[-_])\/.exec(langs[i]);\n        r = m ? GSR.regionForCountry(m[1].toUpperCase()) : null;\n        if (r) {\n          \/* en-GB is the default locale on a lot of machines outside the UK.\n             If the time zone disagrees, the time zone is the better witness. *\/\n          if (r === 'uk-ie') {\n            var zr = GSR.regionForZone(z);\n            if (zr ? zr !== 'uk-ie' : false) { return {region: zr, via: 'tz'}; }\n          }\n          return {region: refine(r, z), via: 'lang'};\n        }\n      }\n      for (var j = 0; j < langs.length; j++) {\n        r = GSR.regionForLanguage(langs[j]);\n        if (r) { return {region: r, via: 'lang'}; }\n      }\n    } catch (e) { \/* carry on *\/ }\n    r = GSR.regionForZone(z);\n    if (r) { return {region: r, via: 'tz'}; }\n    return {region: 'row', via: 'default'};\n  }\n  \/* Rule 4 allows exactly one anonymous GET for this: api.country.is returns\n     {country:\"XX\"} and receives nothing but the IP the request already carries.\n     It never runs once the visitor has chosen for themselves, and the banner\n     says so, so the trade is visible rather than silent. *\/\n  function ipRefine() {\n    if (state.userChose) { return; }\n    try { if (localStorage.getItem('gsr-region')) { return; } } catch (e) { \/* carry on *\/ }\n    try {\n      fetch('https:\/\/api.country.is\/', {credentials: 'omit'})\n        .then(function (r) { return r.ok ? r.json() : null; })\n        .then(function (d) {\n          if (state.userChose ? true : !d) { return; }\n          var r = GSR.regionForCountry(String(d.country).toUpperCase());\n          if (!r) { return; }\n          r = refine(r, tz());\n          if (r === state.region) { setVia('ipok'); return; }\n          el.region.value = r;\n          applyRegion(r, true);\n          setVia('ip');\n        })\n        .catch(function () { \/* offline, or blocked: the guess already stands *\/ });\n    } catch (e) { \/* no fetch: the guess already stands *\/ }\n  }\n  function setVia(v) {\n    var n = all('.sd-via span');\n    for (var i = 0; i < n.length; i++) { n[i].hidden = n[i].getAttribute('data-v') !== v; }\n  }\n  var el = {\n    region: $('#sd-region'), crop: $('#sd-crop'),\n    size: $('#sd-seedsize'), sizeU: $('#sd-seedsize-u'),\n    germ: $('#sd-germ'), emerg: $('#sd-emerg'),\n    target: $('#sd-target'), targetU: $('#sd-target-u'),\n    row: $('#sd-row'), area: $('#sd-area'),\n    cur: $('#sd-cur'), price: $('#sd-price'), priceU: $('#sd-price-u'), bu: $('#sd-bu'),\n    habit: $('#sd-habit'), habitU: $('#sd-habit-u'),\n    scN: $('#sd-sc-n'), scLen: $('#sd-sc-len'),\n    chart: $('#sd-chart'), tip: $('#sd-tip'),\n    eq: $('#sd-eq'), flip: $('#sd-flip')\n  };\n  var state = {sys: 'imperial', flipped: false, region: 'row', userChose: false};\n  function fmt(v, d) {\n    if (!isFinite(v)) { return '\u2014'; }\n    var s = v.toFixed(d);\n    var parts = s.split('.');\n    parts[0] = parts[0].replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, ',');\n    return parts.join('.');\n  }\n  function fmtAuto(v) {\n    var a = Math.abs(v);\n    return a >= 1000 ? fmt(v, 0) : a >= 100 ? fmt(v, 0) : a >= 10 ? fmt(v, 1) : fmt(v, 2);\n  }\n  \/* \u2500\u2500 defaults \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     A region sets the units and the opening crop; a crop sets the rest. Both\n     fire on load so the page never shows a blank result. *\/\n  \/* A region carries more than a unit system: the crop the page should open on,\n     a field size that reads as normal there, the currency, and a row spacing\n     where local practice overrides the crop default. *\/\n  function applyRegion(key, alsoCrop) {\n    var r = GSR.regionByKey(key);\n    state.region = r.key;\n    state.sys = r.sys;\n    el.cur.value = r.cur ? r.cur : '$';\n    if (alsoCrop) {\n      el.crop.value = r.crop;\n      el.area.value = r.area;\n    }\n    syncUnits();\n    applyCrop(true);\n    \/* The region's row spacing wins over the crop's, where it has one. *\/\n    if (alsoCrop) {\n      if (state.sys === 'imperial' ? r.rowIn : false) { el.row.value = r.rowIn; }\n      if (state.sys === 'metric' ? r.rowCm : false) { el.row.value = r.rowCm; }\n      render();\n    }\n  }\n  function syncUnits() {\n    var imp = state.sys === 'imperial';\n    show('.sd-u-imp', imp); show('.sd-u-met', !imp);\n    show('.sd-row-imp', imp); show('.sd-row-met', !imp);\n    show('.sd-area-imp', imp); show('.sd-area-met', !imp);\n    show('.sd-len-imp', imp); show('.sd-len-met', !imp);\n    show('.sd-sl-imp', imp); show('.sd-sl-met', !imp);\n    var segs = all('.sd-seg-b');\n    for (var i = 0; i < segs.length; i++) {\n      var on = segs[i].getAttribute('data-sys') === state.sys;\n      if (on) { segs[i].classList.add('on'); } else { segs[i].classList.remove('on'); }\n    }\n    el.priceU.value = imp ? 'lb' : 'kg';\n    el.sizeU.value = 'g';\n  }\n  var TARGET_UNIT_WORD = {ft2: 'per sq ft', m2: 'per sq m', ac: 'per acre', ha: 'per hectare'};\n  \/* One place decides how the target is stated, so the input, the range hint and\n     the habit card can never fall out of step. *\/\n  function setTarget(m2) {\n    var u = GSR.pickTargetUnit(m2, state.sys);\n    el.targetU.value = u;\n    el.target.value = GSR.displayTarget(m2, u);\n    var seedy = u === 'ac' ? true : u === 'ha';\n    el.habitU.value = state.sys === 'imperial'\n      ? (seedy ? 'seeds-ac' : 'bu')\n      : (seedy ? 'seeds-ha' : 'kgha');\n  }\n  function applyCrop(resetNumbers) {\n    var c = GSR.cropByKey(el.crop.value);\n    var imp = state.sys === 'imperial';\n    if (resetNumbers) {\n      el.size.value = c.tkw[1];\n      el.germ.value = c.germ;\n      el.emerg.value = c.emerg;\n      setTarget(c.m2[1]);\n      el.row.value = imp ? c.rowIn : c.rowCm;\n      el.bu.value = c.bu ? c.bu : '';\n    }\n    show('.sd-bu-field', !!c.bu);\n    show('.sd-bu-line', !!c.bu);\n    show('.sd-tot-bu-line', !!c.bu);\n    setText('.sd-tkw-range', c.tkw[0] + ' to ' + c.tkw[2] + ' g');\n    var u = el.targetU.value;\n    setText('.sd-target-range', fmtAuto(GSR.targetFromM2(c.m2[0], u)) + ' to '\n      + fmtAuto(GSR.targetFromM2(c.m2[2], u)) + ' ' + TARGET_UNIT_WORD[u]);\n    render();\n  }\n  \/* \u2500\u2500 one read of the form, used by everything below \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  function readInputs() {\n    var imp = state.sys === 'imperial';\n    var rowV = num(el.row);\n    return {\n      crop: GSR.cropByKey(el.crop.value),\n      targetM2: GSR.targetToM2(num(el.target), el.targetU.value),\n      tkw: GSR.tkwFrom(num(el.size), el.sizeU.value),\n      germ: num(el.germ), emerg: num(el.emerg),\n      rowIn: imp ? rowV : rowV \/ GSR.CM_PER_IN,\n      rowCm: imp ? rowV * GSR.CM_PER_IN : rowV,\n      buWeight: num(el.bu),\n      areaHa: imp ? num(el.area) * 0.40468564224 : num(el.area)\n    };\n  }\n  function render() {\n    var imp = state.sys === 'imperial';\n    var inp = readInputs();\n    var res = GSR.compute(inp);\n    show('.sd-bad', !res.ok);\n    if (!res.ok) {\n      setText('.sd-rate', '\u2014');\n      return;\n    }\n    setText('.sd-rate', fmtAuto(imp ? res.lbAc : res.kgHa));\n    setText('.sd-rate-alt', fmtAuto(res.kgHa));\n    setText('.sd-rate-alt2', fmtAuto(res.lbAc));\n    setText('.sd-rate-bu', res.buAc !== null ? fmtAuto(res.buAc) : '\u2014');\n    setText('.sd-surv', fmt(res.survival * 100, 0) + ' percent');\n    setText('.sd-seedcount', fmt(imp ? GSR.seedsPerLb(inp.tkw) : GSR.seedsPerKg(inp.tkw), 0));\n    setText('.sd-seeds-area', imp ? fmt(res.seedsAc, 0) : fmt(res.seedsM2, 0));\n    setText('.sd-seeds-row', fmtAuto(imp ? res.seedsPerFtRow : res.seedsPerMRow));\n    setText('.sd-spacing', imp ? fmt(res.spacingIn, 1) + ' in' : fmt(res.spacingCm, 1) + ' cm');\n    setText('.sd-plants-row', fmtAuto(imp ? res.plantsPerFtRow : res.plantsPerMRow));\n    var tot = GSR.fieldTotals(res, inp.areaHa, num(el.price), el.priceU.value);\n    setText('.sd-tot-mass', imp ? fmt(tot.lb, 0) + ' lb (' + fmt(tot.shortTons, 1) + ' short tons)'\n                                : fmt(tot.kg, 0) + ' kg (' + fmt(tot.tonnes, 1) + ' t)');\n    setText('.sd-tot-bu', tot.bu !== null ? fmt(tot.bu, 0) : '\u2014');\n    var cur = el.cur.value;\n    show('.sd-tot-cost-line', tot.cost !== null);\n    if (tot.cost !== null) {\n      setText('.sd-tot-cost', cur + fmt(tot.cost, 0));\n      setText('.sd-tot-cost-area', cur + fmt(imp ? tot.costPerAc : tot.costPerHa, 2) + (imp ? ' per acre' : ' per hectare'));\n    }\n    renderHabit(inp, res);\n    renderChart(inp, res);\n    renderZones(inp, res);\n    renderStand(inp, res);\n    renderMath(inp, res);\n  }\n  var HABIT_WORD = {bu: ' bu\/ac', lbac: ' lb\/ac', kgha: ' kg\/ha', 'seeds-ac': ' seeds\/ac', 'seeds-ha': ' seeds\/ha'};\n  \/* \u2500\u2500 the habitual rate \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  function renderHabit(inp, res) {\n    var imp = state.sys === 'imperial';\n    var v = num(el.habit);\n    if (!(v > 0)) { show('.sd-verdict:not(.sd-sc-out)', false); return; }\n    var got = GSR.standFromRate(v, el.habitU.value, inp.tkw, inp.germ, inp.emerg, inp.buWeight);\n    if (!got) { show('.sd-verdict:not(.sd-sc-out)', false); return; }\n    show('.sd-verdict:not(.sd-sc-out)', true);\n    var unitLabel = HABIT_WORD[el.habitU.value] ? HABIT_WORD[el.habitU.value] : '';\n    setText('.sd-hb-rate', fmtAuto(v) + unitLabel);\n    setText('.sd-hb-got', fmtAuto(imp ? got.plantsFt2 : got.plantsM2));\n    setText('.sd-hb-want', fmtAuto(imp ? inp.targetM2 \/ GSR.M2_IN_FT2 : inp.targetM2));\n    var ratio = inp.targetM2 > 0 ? got.plantsM2 \/ inp.targetM2 : 1;\n    show('.sd-chip[data-v=\"under\"]', ratio < 0.95);\n    show('.sd-chip[data-v=\"over\"]', ratio > 1.05);\n    show('.sd-chip[data-v=\"on\"]', ratio >= 0.95 ? ratio <= 1.05 : false);\n    var mine = imp ? got.lbAc : got.kgHa, calc = imp ? res.lbAc : res.kgHa;\n    var top = Math.max(mine, calc);\n    var f = all('.sd-bar-f');\n    for (var i = 0; i < f.length; i++) {\n      var k = f[i].getAttribute('data-k');\n      f[i].style.width = top > 0 ? (100 * (k === 'habit' ? mine : calc) \/ top) + '%' : '0';\n    }\n    setText('.sd-bar-habit', fmtAuto(mine));\n    setText('.sd-bar-calc', fmtAuto(calc));\n  }\n  \/* \u2500\u2500 seed size sensitivity \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     Rule 17: every bar answers on hover, and on tap, with the value and what\n     it means next to the lot in hand. *\/\n  function renderChart(inp, res) {\n    var imp = state.sys === 'imperial';\n    var c = inp.crop;\n    var pts = GSR.tkwCurve(inp, c.tkw[0], c.tkw[2], 9);\n    var W = 720, H = 200, padL = 6, padB = 38, padT = 8;\n    var top = 0, i;\n    for (i = 0; i < pts.length; i++) { var vv = imp ? pts[i].lbAc : pts[i].kgHa; if (vv > top) { top = vv; } }\n    if (!(top > 0)) { el.chart.textContent = ''; return; }\n    var n = pts.length, gap = 10;\n    var bw = (W - padL * 2 - gap * (n - 1)) \/ n;\n    var s = '<svg viewBox=\"0 0 ' + W + ' ' + H + '\" role=\"img\" aria-label=\"Seeding rate needed across the seed sizes this crop arrives at\">';\n    var nearest = 0, best = 1e9;\n    for (i = 0; i < n; i++) { var d = Math.abs(pts[i].tkw - inp.tkw); if (d < best) { best = d; nearest = i; } }\n    for (i = 0; i < n; i++) {\n      var val = imp ? pts[i].lbAc : pts[i].kgHa;\n      var h = (H - padB - padT) * (val \/ top);\n      var x = padL + i * (bw + gap), y = H - padB - h;\n      s += '<rect class=\"sd-cb' + (i === nearest ? ' now' : '') + '\" x=\"' + x.toFixed(1) + '\" y=\"' + y.toFixed(1)\n         + '\" width=\"' + bw.toFixed(1) + '\" height=\"' + h.toFixed(1) + '\" rx=\"2\"'\n         + ' data-t=\"' + pts[i].tkw.toFixed(1) + '\" data-v=\"' + val.toFixed(1) + '\"><\/rect>';\n      s += '<text class=\"sd-ax\" x=\"' + (x + bw \/ 2).toFixed(1) + '\" y=\"' + (H - 22) + '\" text-anchor=\"middle\">'\n         + pts[i].tkw.toFixed(1) + '<\/text>';\n    }\n    s += '<text class=\"sd-ax\" x=\"' + (W \/ 2) + '\" y=\"' + (H - 4) + '\" text-anchor=\"middle\">grams per 1000 seeds<\/text>';\n    s += '<\/svg>';\n    el.chart.innerHTML = s;\n    var loV = imp ? pts[0].lbAc : pts[0].kgHa, hiV = imp ? pts[n - 1].lbAc : pts[n - 1].kgHa;\n    setText('.sd-spread', fmtAuto(loV) + ' to ' + fmtAuto(hiV) + (imp ? ' lb\/ac' : ' kg\/ha'));\n    var mineVal = imp ? res.lbAc : res.kgHa, unit = imp ? ' lb\/ac' : ' kg\/ha';\n    var bars = el.chart.querySelectorAll('.sd-cb');\n    for (i = 0; i < bars.length; i++) {\n      bars[i].addEventListener('mouseenter', onBar);\n      bars[i].addEventListener('mousemove', moveTip);\n      bars[i].addEventListener('mouseleave', hideTip);\n      bars[i].addEventListener('click', onBar);\n    }\n    function onBar(ev) {\n      var t = ev.currentTarget, v = Number(t.getAttribute('data-v'));\n      var diff = v - mineVal;\n      var tail = Math.abs(diff) < 0.05 ? 'the lot you have' :\n        fmtAuto(Math.abs(diff)) + unit + (diff > 0 ? ' more' : ' less') + ' than your lot';\n      el.tip.innerHTML = '<b>' + t.getAttribute('data-t') + ' g<\/b> per 1000 seeds needs <b>'\n        + fmtAuto(v) + unit + '<\/b><br>' + tail;\n      el.tip.hidden = false;\n      moveTip(ev);\n    }\n    function moveTip(ev) {\n      var r = root.getBoundingClientRect();\n      var x = ev.clientX - r.left + 14, y = ev.clientY - r.top + 14;\n      if (x + 260 > r.width) { x = r.width - 262; }\n      el.tip.style.left = x + 'px';\n      el.tip.style.top = y + 'px';\n    }\n    function hideTip() { el.tip.hidden = true; }\n  }\n  \/* \u2500\u2500 zone plan \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  var ZONE_NAMES = ['thin ground', 'average ground', 'strong ground'];\n  function zoneInputs() {\n    var rows = all('.sd-z-row'), z = [], names = ZONE_NAMES;\n    for (var i = 0; i < rows.length; i++) {\n      z.push({name: names[i],\n              share: Number(rows[i].querySelector('[data-f=\"share\"]').value),\n              adj: Number(rows[i].querySelector('[data-f=\"adj\"]').value)});\n    }\n    return z;\n  }\n  function renderZones(inp, res) {\n    var imp = state.sys === 'imperial';\n    var zones = zoneInputs();\n    var plan = GSR.zonePlan(inp, zones, inp.areaHa);\n    var rows = all('.sd-z-row');\n    if (!plan) { return; }\n    for (var i = 0; i < plan.rows.length; i++) {\n      var r = plan.rows[i];\n      rows[i].querySelector('.sd-z-stand').textContent =\n        fmtAuto(imp ? r.plantsFt2 : r.plantsM2) + (imp ? ' \/sq ft' : ' \/sq m');\n      rows[i].querySelector('.sd-z-rate').textContent =\n        fmtAuto(imp ? r.lbAc : r.kgHa) + (imp ? ' lb\/ac' : ' kg\/ha');\n    }\n    setText('.sd-z-avg', fmtAuto(imp ? plan.blendedLbAc : plan.blendedKgHa) + (imp ? ' lb\/ac' : ' kg\/ha'));\n    setText('.sd-z-flat', fmtAuto(imp ? plan.flatLbAc : plan.flatKgHa) + (imp ? ' lb\/ac' : ' kg\/ha'));\n    setText('.sd-z-mass', imp ? fmt(plan.seedKg \/ 0.45359237, 0) + ' lb' : fmt(plan.seedKg, 0) + ' kg');\n    var d = imp ? plan.deltaLb : plan.deltaKg;\n    var cur = el.cur.value, priceTail = '';\n    var pv = num(el.price);\n    if (pv > 0) {\n      var dKg = plan.deltaKg, money = null;\n      if (el.priceU.value === 'kg') { money = dKg * pv; }\n      else if (el.priceU.value === 'lb') { money = (dKg \/ 0.45359237) * pv; }\n      else if (el.priceU.value === 't') { money = (dKg \/ 1000) * pv; }\n      else if (el.priceU.value === 'bu') { money = inp.buWeight > 0 ? (dKg \/ 0.45359237 \/ inp.buWeight) * pv : null; }\n      if (money !== null) { priceTail = ', ' + cur + fmt(Math.abs(money), 0) + (money >= 0 ? ' more' : ' less'); }\n    }\n    \/* A symmetric split moves seed between the bands without changing the\n       order. Reporting that as \"a change of +0 lb\" is worse than saying it. *\/\n    var same = Math.abs(d) < 1;\n    show('.sd-z-diff', !same);\n    show('.sd-z-same', same);\n    setText('.sd-z-delta', (d >= 0 ? '+' : '\u2212') + fmt(Math.abs(d), 0) + (imp ? ' lb' : ' kg') + priceTail);\n    el.eq.textContent = GSR.equationFor(inp, zones, state.sys, ZONE_NAMES);\n  }\n  \/* \u2500\u2500 stand check \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  function renderStand(inp, res) {\n    var imp = state.sys === 'imperial';\n    var n = num(el.scN), L = num(el.scLen);\n    if (!(n > 0) ? true : !(L > 0)) { show('.sd-sc-out', false); return; }\n    var sc = GSR.standCheck(n, L, imp ? 'ft' : 'm', imp ? inp.rowIn : inp.rowCm, imp ? 'in' : 'cm',\n                            res.seedsM2, inp.germ);\n    if (!sc) { show('.sd-sc-out', false); return; }\n    show('.sd-sc-out', true);\n    setText('.sd-sc-stand', fmtAuto(imp ? sc.plantsFt2 : sc.plantsM2));\n    setText('.sd-sc-est', sc.establishmentPct !== null ? fmt(sc.establishmentPct, 0) + ' percent' : '\u2014');\n    setText('.sd-sc-emerg', sc.emergencePct !== null ? fmt(sc.emergencePct, 0) + ' percent' : '\u2014');\n    root.setAttribute('data-emerg-found', sc.emergencePct !== null ? String(Math.round(sc.emergencePct)) : '');\n  }\n  \/* \u2500\u2500 show the arithmetic \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  function renderMath(inp, res) {\n    setText('.sd-m-target', fmt(inp.targetM2, 0) + ' plants');\n    setText('.sd-m-surv', fmt(inp.germ, 0) + ' percent times ' + fmt(inp.emerg, 0) + ' percent, so '\n      + fmt(res.survival * 100, 0) + ' percent');\n    setText('.sd-m-seeds', fmt(res.seedsM2, 0) + ' seeds');\n    setText('.sd-m-tkw', fmt(inp.tkw, 1) + ' g');\n    setText('.sd-m-kg', fmt(res.kgHa, 1) + ' kg\/ha');\n    setText('.sd-m-lb', fmt(res.lbAc, 1) + ' lb\/ac');\n  }\n  \/* \u2500\u2500 wiring \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  var watched = [el.size, el.sizeU, el.germ, el.emerg, el.target, el.targetU, el.row, el.area,\n                 el.cur, el.price, el.priceU, el.bu, el.habit, el.habitU, el.scN, el.scLen];\n  for (var w = 0; w < watched.length; w++) {\n    watched[w].addEventListener('input', render);\n    watched[w].addEventListener('change', render);\n  }\n  var zi = all('.sd-z-in');\n  for (var q = 0; q < zi.length; q++) { zi[q].addEventListener('input', render); }\n  el.crop.addEventListener('change', function () { applyCrop(true); });\n  el.region.addEventListener('change', function () {\n    state.userChose = true;\n    try { localStorage.setItem('gsr-region', el.region.value); } catch (e) { \/* private mode *\/ }\n    setVia('saved');\n    applyRegion(el.region.value, true);\n  });\n  var segs = all('.sd-seg-b');\n  for (var sgi = 0; sgi < segs.length; sgi++) {\n    segs[sgi].addEventListener('click', function (ev) {\n      var prevImp = state.sys === 'imperial';\n      state.sys = ev.currentTarget.getAttribute('data-sys');\n      var nowImp = state.sys === 'imperial';\n      \/* Carry the numbers across rather than resetting them: a target and a\n         row spacing typed in one system mean the same field in the other. *\/\n      if (prevImp !== nowImp) {\n        var t = GSR.targetToM2(num(el.target), el.targetU.value);\n        setTarget(t);\n        el.row.value = GSR.round(nowImp ? num(el.row) \/ GSR.CM_PER_IN : num(el.row) * GSR.CM_PER_IN, 1);\n        el.area.value = GSR.round(nowImp ? num(el.area) \/ 0.40468564224 : num(el.area) * 0.40468564224, 1);\n        el.scLen.value = GSR.round(nowImp ? num(el.scLen) \/ 0.3048 : num(el.scLen) * 0.3048, 1);\n      }\n      syncUnits();\n      applyCrop(false);\n    });\n  }\n  var FLIP_PUSH = 'Push the strong ground', FLIP_EVEN = 'Even out the stand';\n  el.flip.addEventListener('click', function () {\n    state.flipped = !state.flipped;\n    var rows = all('.sd-z-row');\n    var adj = state.flipped ? [12, 0, -8] : [-10, 0, 10];\n    for (var i = 0; i < rows.length; i++) { rows[i].querySelector('[data-f=\"adj\"]').value = adj[i]; }\n    el.flip.textContent = state.flipped ? FLIP_EVEN : FLIP_PUSH;\n    render();\n  });\n  $('#sd-eq-toggle').addEventListener('click', function () {\n    el.eq.hidden = !el.eq.hidden;\n  });\n  $('#sd-copy-eq').addEventListener('click', function () {\n    var text = el.eq.textContent;\n    var done = function () {\n      var c = $('#sd-copied');\n      c.hidden = false;\n      setTimeout(function () { c.hidden = true; }, 1800);\n    };\n    if (navigator.clipboard ? navigator.clipboard.writeText : null) {\n      navigator.clipboard.writeText(text).then(done, done);\n    } else {\n      var ta = document.createElement('textarea');\n      ta.value = text; root.appendChild(ta); ta.select();\n      try { document.execCommand('copy'); } catch (e) { \/* nothing to do *\/ }\n      root.removeChild(ta); done();\n    }\n  });\n  $('#sd-sc-use').addEventListener('click', function () {\n    var v = root.getAttribute('data-emerg-found');\n    if (v) {\n      el.emerg.value = Math.min(100, Math.max(1, Number(v)));\n      render();\n    }\n  });\n  var MATH_SHOW = 'Show the arithmetic', MATH_HIDE = 'Hide the arithmetic';\n  $('#sd-math-toggle').addEventListener('click', function () {\n    var m = $('#sd-math');\n    m.hidden = !m.hidden;\n    this.textContent = m.hidden ? MATH_SHOW : MATH_HIDE;\n  });\n  \/* \u2500\u2500 start \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  (function init() {\n    var rows = all('.sd-z-row');\n    var share = [25, 50, 25], adj = [-10, 0, 10];\n    for (var i = 0; i < rows.length; i++) {\n      rows[i].querySelector('[data-f=\"share\"]').value = share[i];\n      rows[i].querySelector('[data-f=\"adj\"]').value = adj[i];\n    }\n    el.scLen.value = 10;\n    var d = detect();\n    state.userChose = !!d.saved;\n    el.region.value = d.region;\n    applyRegion(d.region, true);\n    setVia(d.via);\n    ipRefine();\n  })();\n})();\n<\/script>\n<\/div>\n\n\n\n<div class=\"gp-lead\">\n<style>\n.gp-lead .srcx{--f:\"Roboto\",-apple-system,\"Segoe UI\",Helvetica,Arial,sans-serif;font-family:var(--f);color:#212121;max-width:820px;margin:28px auto 8px;padding:0 4px;line-height:1.6}\n.gp-lead .srcx h2{font-family:var(--f);font-size:1.35rem;font-weight:700;color:#145328;margin:26px 0 8px}\n.gp-lead .srcx p{margin:0 0 12px;font-size:1.02rem;color:#212121}\n.gp-lead .srcx-fig{margin:18px 0 0;padding:14px;background:#f4f7ea;border:1px solid #e3e7da;border-radius:8px}\n.gp-lead .srcx-fig svg,.gp-lead .srcx-fig img{display:block;width:100%;height:auto;max-width:100%;border-radius:6px}\n.gp-lead .srcx-fig figcaption{margin-top:8px;font-size:.88rem;color:#4c6066;text-align:center}\n.gp-lead .srcx .bx{fill:#ffffff;stroke:#d6e2c5;stroke-width:1}\n.gp-lead .srcx .bx2{fill:#f4f7ea;stroke:#d6e2c5;stroke-width:1}\n.gp-lead .srcx .tx{font-family:var(--f);font-size:11px;fill:#212121}\n.gp-lead .srcx .th{font-family:var(--f);font-size:11px;font-weight:700;fill:#145328}\n.gp-lead .srcx .tn{font-family:var(--f);font-size:15px;font-weight:700;fill:#145328}\n.gp-lead .srcx .ts{font-family:var(--f);font-size:10px;fill:#708086}\n.gp-lead .srcx .ar{stroke:#708086;stroke-width:1.6;fill:none}\n.gp-lead .srcx .z1{fill:#c6dcae}.gp-lead .srcx .z2{fill:#93bd79}.gp-lead .srcx .z3{fill:#3f7d36}\n.gp-lead .srcx .thw{fill:#ffffff}\n<\/style>\n<div class=\"srcx\">\n  <h2>How a seeding rate is worked out<\/h2>\n  <p>A seeding rate is not a habit, it is an answer to one question: how much seed must I drop so that the number of plants I want is standing there in three weeks. Work backwards from the plants, not forwards from last year's setting.<\/p>\n  <p>Start with the stand. Spring wheat wants about 23 plants on a square foot, canola 5 to 8, red lentils 14, field peas 8. Then take off what you will lose. The tag gives laboratory germination, say 95 percent; your furrow takes another slice off that, call it 88 percent for cereals into decent moisture. Together 84 percent of the seed becomes a plant, so to stand 23 you must drop 28.<\/p>\n  <p>Now weigh them. Twenty-eight seeds per square foot at 34 grams per thousand seeds is 90 pounds an acre. Change nothing except the bag, to a lot at 42 grams, and the same 23 plants now cost 111 pounds an acre. On a 160 acre field that is over a ton and a half of extra seed for an identical stand, and it is the single reason a rate carried over in bushels quietly stops doing what it did.<\/p>\n  <figure class=\"srcx-fig\">\n    <svg viewBox=\"0 0 760 150\" role=\"img\" aria-labelledby=\"srcx-t\">\n      <title id=\"srcx-t\">Plants wanted divided by survival gives seeds to drop, multiplied by seed weight gives pounds per acre, and the same target at a heavier seed lot costs more seed<\/title>\n      <rect class=\"bx\" x=\"8\" y=\"20\" width=\"150\" height=\"86\" rx=\"6\"\/>\n      <text class=\"th\" x=\"20\" y=\"40\">Plants wanted<\/text>\n      <text class=\"tn\" x=\"20\" y=\"68\">23<\/text><text class=\"ts\" x=\"48\" y=\"68\">per sq ft<\/text>\n      <text class=\"ts\" x=\"20\" y=\"90\">spring wheat target<\/text>\n      <path class=\"ar\" d=\"M166 63 L200 63 M194 57 L200 63 L194 69\"\/>\n      <rect class=\"bx\" x=\"208\" y=\"20\" width=\"150\" height=\"86\" rx=\"6\"\/>\n      <text class=\"th\" x=\"220\" y=\"40\">Seeds to drop<\/text>\n      <text class=\"tn\" x=\"220\" y=\"68\">28<\/text><text class=\"ts\" x=\"248\" y=\"68\">per sq ft<\/text>\n      <text class=\"ts\" x=\"220\" y=\"90\">84 pct survive<\/text>\n      <path class=\"ar\" d=\"M366 63 L400 63 M394 57 L400 63 L394 69\"\/>\n      <rect class=\"bx\" x=\"408\" y=\"20\" width=\"164\" height=\"86\" rx=\"6\"\/>\n      <text class=\"th\" x=\"420\" y=\"40\">At 34 g per 1000<\/text>\n      <text class=\"tn\" x=\"420\" y=\"68\">90<\/text><text class=\"ts\" x=\"446\" y=\"68\">lb\/ac<\/text>\n      <text class=\"ts\" x=\"420\" y=\"90\">101 kg\/ha<\/text>\n      <path class=\"ar\" d=\"M580 63 L604 63 M598 57 L604 63 L598 69\"\/>\n      <rect class=\"bx2\" x=\"612\" y=\"20\" width=\"140\" height=\"86\" rx=\"6\"\/>\n      <text class=\"th\" x=\"624\" y=\"40\">At 42 g per 1000<\/text>\n      <text class=\"tn\" x=\"624\" y=\"68\">111<\/text><text class=\"ts\" x=\"658\" y=\"68\">lb\/ac<\/text>\n      <text class=\"ts\" x=\"624\" y=\"90\">same 23 plants<\/text>\n      <text class=\"ts\" x=\"8\" y=\"136\">Target stand, seedling survival and thousand kernel weight. Change any one and the rate moves.<\/text>\n    <\/svg>\n    <figcaption>The same target stand, two seed lots, twenty-one pounds an acre apart.<\/figcaption>\n  <\/figure>\n\n  <h2>Row spacing changes the furrow, not the acre<\/h2>\n  <p>Widen from 10 inch rows to 15 and the pounds per acre do not move, because an acre is still an acre. What moves is the crowding: the same square foot of seed now falls into fewer inches of furrow, so seeds per foot of row rises by half and the gap between neighbours closes. That is the figure to watch when you change openers or row spacing, because it decides whether plants are competing with each other for the same moisture and the same fertiliser band.<\/p>\n\n  <h2>One field is not one rate<\/h2>\n  <p>An eroded knoll and a draw that holds water are not the same field, and a single number treats them as though they were. Split the target: take ten percent off where moisture runs out, put ten percent on where the ground carries a crop. With a quarter of the field at each end the seed order hardly changes. What changes is where the seed goes.<\/p>\n  <p>The part a calculator cannot do is tell you where those bands fall. That comes from the field's own record. GeoPard builds a productivity index from several years of satellite growth, from elevation with its slope and curvature, and from harvest maps and soil tests, then runs the rate equation over it and exports a prescription the terminal reads, so the drill changes rate as it crosses the knoll.<\/p>\n  <figure class=\"srcx-fig\">\n    <img data-recalc-dims=\"1\" loading=\"lazy\" src=\"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2021\/09\/GeoPard_seeding_rate.png?resize=810%2C336&#038;ssl=1\"\n         width=\"810\" height=\"336\" loading=\"lazy\" decoding=\"async\"\n         alt=\"A seeding prescription in GeoPard: five rate zones from 25,000 to 45,000 seeds per acre drawn over a field, each with its own acreage, and an average rate of 37,968 seeds per acre for the field.\">\n    <figcaption>The same three bands, taken further: five seeding rates on one field, 25,000 seeds per acre on the red ground and 45,000 on the dark green, averaging 37,968 across the 75 acres. The rate per zone is what the calculator gives you. The zones are what the field's own record gives you.<\/figcaption>\n  <\/figure>\n<\/div>\n<\/div>\n\n\n\n<!-- GENERATED by scripts\/make_faq.py from tools\/seeding-rate-calculator\/faq.json. Do not hand-edit. -->\n<div class=\"gp-lead\">\n<style>\n.gp-lead .gpx-faq{margin:36px 0 8px}\n.gp-lead .gpx-faq h2{text-align:center;margin:0 0 20px;font-size:1.6rem}\n.gp-lead .gpx-tabs{border:1px solid #e8ebe2;border-radius:16px;overflow:hidden;background:#fff}\n.gp-lead .gpx-tablist{display:flex;gap:0;background:#f6f7f1;border-bottom:1px solid #e8ebe2;overflow-x:auto;scrollbar-width:none}\n.gp-lead .gpx-tablist::-webkit-scrollbar{display:none}\n.gp-lead .gpx-tab{flex:1 1 auto;min-width:max-content;background:transparent;border:0;padding:16px 22px;font-family:inherit;font-size:.95rem;font-weight:700;color:#4c6066;cursor:pointer;border-bottom:3px solid transparent;white-space:nowrap}\n.gp-lead .gpx-tab:hover{color:#145328;background:#f0f4ea}\n.gp-lead .gpx-tab[aria-selected=\"true\"]{color:#145328;border-bottom-color:#15701e;background:#fff}\n.gp-lead .gpx-tab:focus{outline:2px solid #15701e;outline-offset:-2px}\n.gp-lead .gpx-panel{padding:28px 32px;display:none}\n.gp-lead .gpx-panel.is-active{display:block}\n.gp-lead .gpx-panel h3{margin:0 0 10px;font-size:1.12rem;color:#212121}\n.gp-lead .gpx-panel p{margin:0;line-height:1.7;color:#243024;font-size:1rem}\n.gp-lead .gpx-panel p+p{margin-top:10px}\n@media (max-width:760px){\n  .gp-lead .gpx-panel{padding:22px 20px}\n  .gp-lead .gpx-tab{padding:14px 16px;font-size:.9rem}\n}\n<\/style>\n<section class=\"gpx-faq\" aria-labelledby=\"gpx-faq-h\">\n  <h2 id=\"gpx-faq-h\">Frequently asked questions<\/h2>\n  <div class=\"gpx-tabs\">\n    <div class=\"gpx-tablist\" role=\"tablist\" aria-label=\"Seeding Rate Calculator FAQ\">\n      <button class=\"gpx-tab\" role=\"tab\" id=\"gpx-tab-1\" aria-controls=\"gpx-panel-1\" aria-selected=\"true\" tabindex=\"0\">Germination vs emergence<\/button>\n      <button class=\"gpx-tab\" role=\"tab\" id=\"gpx-tab-2\" aria-controls=\"gpx-panel-2\" aria-selected=\"false\" tabindex=\"-1\">Picking an emergence<\/button>\n      <button class=\"gpx-tab\" role=\"tab\" id=\"gpx-tab-3\" aria-controls=\"gpx-panel-3\" aria-selected=\"false\" tabindex=\"-1\">Rate changed by itself<\/button>\n      <button class=\"gpx-tab\" role=\"tab\" id=\"gpx-tab-4\" aria-controls=\"gpx-panel-4\" aria-selected=\"false\" tabindex=\"-1\">Row spacing<\/button>\n      <button class=\"gpx-tab\" role=\"tab\" id=\"gpx-tab-5\" aria-controls=\"gpx-panel-5\" aria-selected=\"false\" tabindex=\"-1\">Thin ground<\/button>\n      <button class=\"gpx-tab\" role=\"tab\" id=\"gpx-tab-6\" aria-controls=\"gpx-panel-6\" aria-selected=\"false\" tabindex=\"-1\">One rate per zone<\/button>\n    <\/div>\n    <div class=\"gpx-panel is-active\" role=\"tabpanel\" id=\"gpx-panel-1\" aria-labelledby=\"gpx-tab-1\">\n      <h3>My tag says 95 percent germination. Why ask for an emergence number as well?<\/h3>\n      <p>Germination is what the seed did on wet paper in a laboratory at an even temperature. Emergence is what it does in your furrow, at your seeding depth, in the soil temperature and moisture you had that week, behind your openers.<\/p>\n      <p>The gap between them is where stands are lost. Cereals into good moisture lose little, so 85 to 90 percent of the germinable seed comes up. Canola into a dry, cloddy seedbed regularly comes up at 50 to 60 percent, which is why canola rates look so high next to the plant count. Multiply the two and you have the share of seed that becomes a plant.<\/p>\n    <\/div>\n    <div class=\"gpx-panel\" role=\"tabpanel\" id=\"gpx-panel-2\" aria-labelledby=\"gpx-tab-2\">\n      <h3>I have never counted a stand. What emergence should I put in?<\/h3>\n      <p>Use the number the page fills in for the crop, then change it for the seedbed in front of you. Drop it five to ten points for a dry or lumpy seedbed, seeding deeper than you want to, cold soil, heavy residue, or seed-placed fertiliser close to the seed. Add a few points for warm moist soil and a well levelled field.<\/p>\n      <p>Then settle it this spring. Count the plants over ten feet of one row three weeks after seeding, put the count into the stand check, and the page hands back the emergence your drill actually achieved. Carry that number into next year and the rate stops being an estimate.<\/p>\n    <\/div>\n    <div class=\"gpx-panel\" role=\"tabpanel\" id=\"gpx-panel-3\" aria-labelledby=\"gpx-tab-3\">\n      <h3>Same crop, same target, and the rate came out higher than last year. Why?<\/h3>\n      <p>The seed got bigger. Rate follows the weight of a thousand seeds almost exactly, and that weight swings from lot to lot with the season the seed was grown in. Wheat arrives anywhere from 26 to 46 grams, red lentils from 28 to 48, canola from 3.5 to 7.<\/p>\n      <p>A rate held at 1.5 bushels an acre is really a rate that moves with the bag. At 30 grams that bushel and a half puts about 26 plants on a square foot; at 42 grams the same weight puts about 19 there. The chart on the page shows the swing for the crop you picked.<\/p>\n    <\/div>\n    <div class=\"gpx-panel\" role=\"tabpanel\" id=\"gpx-panel-4\" aria-labelledby=\"gpx-tab-4\">\n      <h3>I moved to wider rows. Does the seeding rate change?<\/h3>\n      <p>Not the rate. Pounds per acre covers an acre however you cut it into rows, so the target stand and the rate stay where they are.<\/p>\n      <p>What changes is how crowded the row is. Every seed for that square foot now goes into fewer inches of furrow, so seeds per foot of row rises and the spacing between them tightens. The page shows both. Watch the spacing figure when you widen rows or narrow the opener: once neighbours sit close enough to compete for the same moisture and fertiliser band, the answer is usually to lift the target stand a little on the good ground rather than to change the arithmetic.<\/p>\n    <\/div>\n    <div class=\"gpx-panel\" role=\"tabpanel\" id=\"gpx-panel-5\" aria-labelledby=\"gpx-tab-5\">\n      <h3>On a hilltop that always runs light, do I seed more or less?<\/h3>\n      <p>Both are defensible and they answer different problems, which is why the page carries a switch rather than a rule.<\/p>\n      <p>Seed less on thin ground when the ground is thin because of moisture. There is only so much water on that knoll, more plants compete for it, and the seed is cheaper in your shed than on the hill. Seed more on thin ground when the ground is thin because the stand fails there: shallow topsoil, crusting, eroded knolls that dry out before the seed chits. There you are buying back the plants you know you will lose.<\/p>\n      <p>Look at last year's harvest map over that knoll. If it yielded low with a full stand, take the rate off. If it yielded low with gaps in it, put the rate on.<\/p>\n    <\/div>\n    <div class=\"gpx-panel\" role=\"tabpanel\" id=\"gpx-panel-6\" aria-labelledby=\"gpx-tab-6\">\n      <h3>How do I get a different rate on each part of the field?<\/h3>\n      <p>You need two things: the rate per band, which the page gives you, and a map of where the bands are, which comes from the field's own history.<\/p>\n      <p>In GeoPard that map is built from layers you already have: several years of satellite growth to find the ground that consistently carries more, elevation with slope and curvature to find the knolls and the draws, harvest maps, and soil tests. The equation on the page reads that productivity index, applies the same target adjustments you set here, and writes a rate for every point in the field. Export it in the format your terminal reads and the drill changes rate on the move.<\/p>\n    <\/div>\n  <\/div>\n<\/section>\n<script type=\"application\/ld+json\" data-no-optimize=\"1\" data-no-minify=\"1\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"My tag says 95 percent germination. Why ask for an emergence number as well?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Germination is what the seed did on wet paper in a laboratory at an even temperature. Emergence is what it does in your furrow, at your seeding depth, in the soil temperature and moisture you had that week, behind your openers. The gap between them is where stands are lost. Cereals into good moisture lose little, so 85 to 90 percent of the germinable seed comes up. Canola into a dry, cloddy seedbed regularly comes up at 50 to 60 percent, which is why canola rates look so high next to the plant count. Multiply the two and you have the share of seed that becomes a plant.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"I have never counted a stand. What emergence should I put in?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Use the number the page fills in for the crop, then change it for the seedbed in front of you. Drop it five to ten points for a dry or lumpy seedbed, seeding deeper than you want to, cold soil, heavy residue, or seed-placed fertiliser close to the seed. Add a few points for warm moist soil and a well levelled field. Then settle it this spring. Count the plants over ten feet of one row three weeks after seeding, put the count into the stand check, and the page hands back the emergence your drill actually achieved. Carry that number into next year and the rate stops being an estimate.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Same crop, same target, and the rate came out higher than last year. Why?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"The seed got bigger. Rate follows the weight of a thousand seeds almost exactly, and that weight swings from lot to lot with the season the seed was grown in. Wheat arrives anywhere from 26 to 46 grams, red lentils from 28 to 48, canola from 3.5 to 7. A rate held at 1.5 bushels an acre is really a rate that moves with the bag. At 30 grams that bushel and a half puts about 26 plants on a square foot; at 42 grams the same weight puts about 19 there. The chart on the page shows the swing for the crop you picked.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"I moved to wider rows. Does the seeding rate change?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Not the rate. Pounds per acre covers an acre however you cut it into rows, so the target stand and the rate stay where they are. What changes is how crowded the row is. Every seed for that square foot now goes into fewer inches of furrow, so seeds per foot of row rises and the spacing between them tightens. The page shows both. Watch the spacing figure when you widen rows or narrow the opener: once neighbours sit close enough to compete for the same moisture and fertiliser band, the answer is usually to lift the target stand a little on the good ground rather than to change the arithmetic.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"On a hilltop that always runs light, do I seed more or less?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Both are defensible and they answer different problems, which is why the page carries a switch rather than a rule. Seed less on thin ground when the ground is thin because of moisture. There is only so much water on that knoll, more plants compete for it, and the seed is cheaper in your shed than on the hill. Seed more on thin ground when the ground is thin because the stand fails there: shallow topsoil, crusting, eroded knolls that dry out before the seed chits. There you are buying back the plants you know you will lose. Look at last year's harvest map over that knoll. If it yielded low with a full stand, take the rate off. If it yielded low with gaps in it, put the rate on.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How do I get a different rate on each part of the field?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"You need two things: the rate per band, which the page gives you, and a map of where the bands are, which comes from the field's own history. In GeoPard that map is built from layers you already have: several years of satellite growth to find the ground that consistently carries more, elevation with slope and curvature to find the knolls and the draws, harvest maps, and soil tests. The equation on the page reads that productivity index, applies the same target adjustments you set here, and writes a rate for every point in the field. Export it in the format your terminal reads and the drill changes rate on the move.\"\n      }\n    }\n  ]\n}\n<\/script>\n<\/div>\n<script nowprocket data-no-optimize=\"1\" data-no-defer=\"1\" data-no-minify=\"1\">\n(function(){\n  var root = document.querySelector('.gp-lead .gpx-faq');\n  if (!root) { return; }\n  var tabs = root.querySelectorAll('.gpx-tab');\n  var panels = root.querySelectorAll('.gpx-panel');\n  function activate(idx){\n    for (var i = 0; i < tabs.length; i++) {\n      var on = i === idx;\n      tabs[i].setAttribute('aria-selected', on ? 'true' : 'false');\n      tabs[i].setAttribute('tabindex', on ? '0' : '-1');\n      if (on) { panels[i].classList.add('is-active'); } else { panels[i].classList.remove('is-active'); }\n    }\n  }\n  for (var i = 0; i < tabs.length; i++) {\n    (function(n){\n      tabs[n].addEventListener('click', function(){ activate(n); });\n      tabs[n].addEventListener('keydown', function(ev){\n        var d = ev.key === 'ArrowRight' ? 1 : (ev.key === 'ArrowLeft' ? -1 : 0);\n        if (d === 0) { return; }\n        var t = (n + d + tabs.length) % tabs.length;\n        activate(t); tabs[t].focus(); ev.preventDefault();\n      });\n    })(i);\n  }\n})();\n<\/script>\n\n\n\n<!-- GeoPard Tool Wrapper - CTA only (CTA band + AI Assistant band, NO FAQ).\n     Pages pair this with their OWN faq.html, because the FAQ in block 13099 is\n     Field Data Explorer specific and answers questions nobody asked on another\n     tool's page. Block 13099 stays as it is for the legacy pages. -->\n<div class=\"gp-lead\">\n<style>\n\/* Shared CTA, integration chips and FAQ tab styling. These classes are USED by\n   this block but were only DEFINED in wrapper-top block 13098, so any page that\n   uses this block without 13098 (a tool page with an inline hero) rendered the\n   CTA and FAQ completely unstyled. Copied verbatim from 13098, so pages that\n   carry both blocks are byte-identical in effect. *\/\n.gp-lead{font-family:var(--wp--preset--font-family--nunito,\"Nunito\",system-ui,-apple-system,Segoe UI,sans-serif);color:#212121;max-width:1600px;margin:0 auto;padding:0 16px}\n.gp-lead .gpx-cta{background:linear-gradient(135deg,#145328 0%,#1b7a2a 65%,#1a7951 100%);border-radius:18px;padding:38px 40px;margin:36px 0 24px;color:#fafbf4;text-align:center;position:relative;overflow:hidden}\n.gp-lead .gpx-cta::before{content:\"\";position:absolute;inset:auto -40px -60px auto;width:200px;height:200px;background:radial-gradient(circle,rgba(178,6,15,0.26),transparent 70%);pointer-events:none}\n.gp-lead .gpx-cta h2{color:#fff;margin:0 0 12px;font-size:1.6rem}\n.gp-lead .gpx-cta p{color:rgba(255,255,255,0.95);font-size:1.05rem;max-width:740px;margin:0 auto 22px}\n.gp-lead .gpx-btn{display:inline-block;background:#b2060f;color:#fff;font-family:var(--wp--preset--font-family--poppins,\"Poppins\",sans-serif);font-weight:600;font-size:1rem;padding:14px 30px;border-radius:999px;text-decoration:none;transition:transform .15s,box-shadow .15s,background .15s;box-shadow:none}\n.gp-lead .gpx-btn:hover{transform:translateY(-1px);background:#fd4d48;color:#fff;box-shadow:none}\n.gp-lead .gpx-faq{margin:36px 0 8px}\n.gp-lead .gpx-faq h2{text-align:center;margin:0 0 20px;font-size:1.6rem}\n.gp-lead .gpx-tabs{border:1px solid #e8ebe2;border-radius:16px;overflow:hidden;background:#fff;box-shadow:0 2px 14px rgba(20,83,40,0.06)}\n.gp-lead .gpx-tablist{display:flex;gap:0;background:#f6f7f1;border-bottom:1px solid #e8ebe2;overflow-x:auto;scrollbar-width:none}\n.gp-lead .gpx-tablist::-webkit-scrollbar{display:none}\n.gp-lead .gpx-tab{flex:1 1 auto;min-width:max-content;background:transparent;border:0;padding:16px 22px;font-family:var(--wp--preset--font-family--poppins,\"Poppins\",sans-serif);font-size:.95rem;font-weight:600;color:#4c6066;cursor:pointer;border-bottom:3px solid transparent;transition:color .15s,border-color .15s,background .15s;white-space:nowrap;letter-spacing:.01em}\n.gp-lead .gpx-tab:hover{color:#145328;background:rgba(123,220,181,0.14)}\n.gp-lead .gpx-tab[aria-selected=\"true\"]{color:#145328;border-bottom-color:#15701e;background:#fff}\n.gp-lead .gpx-tab:focus{outline:2px solid #15701e;outline-offset:-2px}\n.gp-lead .gpx-panel{padding:28px 32px;display:none;animation:gpxfade .25s ease}\n.gp-lead .gpx-panel.is-active{display:block}\n.gp-lead .gpx-panel p{margin:0;line-height:1.7;color:#243024;font-size:1rem}\n.gp-lead .gpx-panel p+p{margin-top:10px}\n.gp-lead .gpx-panel kbd,.gp-lead .gpx-panel code{background:#f0f3ec;padding:2px 6px;border-radius:4px;font-family:var(--wp--preset--font-family--dm-mono,\"DM Mono\",ui-monospace,monospace);font-size:.88em;color:#145328}\n.gp-lead .gpx-integ{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;margin:10px 0 20px}\n.gp-lead .gpx-integ-label{font-size:.86rem;color:rgba(255,255,255,0.86);margin:0 0 8px;font-weight:500;letter-spacing:.01em}\n.gp-lead .gpx-integ-chip{background:rgba(255,255,255,0.16);border:1px solid rgba(255,255,255,0.32);color:#fff;padding:6px 14px;border-radius:999px;font-size:.85rem;font-weight:600;letter-spacing:.02em}\n@media (max-width:760px){\n  .gp-lead .gpx-cta{padding:24px 22px}\n  .gp-lead .gpx-panel{padding:22px 20px}\n  .gp-lead .gpx-tab{padding:14px 16px;font-size:.9rem}\n}\n@keyframes gpxfade{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}\n<\/style>\n\n<section class=\"gpx-cta\">\n  <h2>Bigger picture? GeoPard turns the data into prescriptions.<\/h2>\n  <p>This page reads one file at a time. The full GeoPard platform combines multi-year yield, NDVI, soil, and topography into management zones, generates variable rate prescriptions, and pushes them to your machine.<\/p>\n  <div class=\"gpx-integ-label\">Push prescriptions and pull as-applied data with:<\/div>\n  <div class=\"gpx-integ\">\n    <span class=\"gpx-integ-chip\">John Deere Operations Center<\/span>\n    <span class=\"gpx-integ-chip\">CNH FieldOps<\/span>\n    <span class=\"gpx-integ-chip\">AGCO \/ PTx FarmEngage<\/span>\n  <\/div>\n  <a class=\"gpx-btn\" href=\"https:\/\/app.geopard.tech\/signup?utm_source=geopard.tech&amp;utm_medium=lead-magnet&amp;utm_campaign=field-data-explorer&amp;utm_content=below-tool-cta\">Register free in GeoPard &rarr;<\/a>\n  <p style=\"margin:16px auto 0;max-width:740px;font-size:.95rem;color:rgba(255,255,255,.92)\">Already harvested? <a style=\"color:#ffffff;text-decoration:underline;text-underline-offset:3px\" href=\"https:\/\/geopard.tech\/yield-report\/\">See whether the variable rate paid off in the Automated Yield Report<\/a>.<\/p>\n<\/section>\n\n<section class=\"gpx-aiband\">\n  <style>\n    .gp-lead .gpx-aiband{display:flex;align-items:center;gap:24px;flex-wrap:wrap;background:#f2f7ee;border:1px solid #d6e2c5;border-radius:14px;padding:22px 26px;margin:26px 0}\n    .gp-lead .gpx-aiband-txt{flex:1 1 380px}\n    .gp-lead .gpx-aiband-new{display:inline-block;font-size:11px;font-weight:700;letter-spacing:.05em;color:#ffffff;background:#b2060f;border-radius:999px;padding:3px 9px;vertical-align:3px;margin-left:10px}\n    .gp-lead .gpx-aiband h2{margin:0;font-size:1.3rem}\n    .gp-lead .gpx-aiband p{margin:8px 0 0;color:#4c6066;font-size:.98rem;line-height:1.55}\n    .gp-lead .gpx-aiband-btn{flex:0 0 auto;display:inline-flex;align-items:center;min-height:46px;background:#15701e;color:#ffffff;font-weight:600;padding:0 22px;border-radius:999px;text-decoration:none}\n    .gp-lead .gpx-aiband-btn:hover{background:#145328;color:#ffffff}\n    @media (max-width:640px){ .gp-lead .gpx-aiband{padding:18px} .gp-lead .gpx-aiband-btn{width:100%;justify-content:center} }\n  <\/style>\n  <div class=\"gpx-aiband-txt\">\n    <h2>Meet the GeoPard AI Assistant<span class=\"gpx-aiband-new\">NEW<\/span><\/h2>\n    <p>Reasoning AI for precision agriculture: it asks the right agronomic questions, shows its math, and builds dry-run validated prescriptions from your data. You approve every step.<\/p>\n  <\/div>\n  <a class=\"gpx-aiband-btn\" href=\"https:\/\/geopard.tech\/ai\/\">Watch how the AI thinks &rarr;<\/a>\n<\/section>\n<\/div>\n\n","protected":false},"excerpt":{"rendered":"<p>Calculateur de densit\u00e9 de semis\u00a0: semez pour obtenir la densit\u00e9 souhait\u00e9e, et non la densit\u00e9 utilis\u00e9e l\u2019an dernier. Indiquez le nombre de plants souhait\u00e9, le nombre de grains par millier\u2026<\/p>","protected":false},"author":210157960,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_eb_attr":"","content-type":"","_wpcom_ai_launchpad_about_page":false,"_wpcom_ai_launchpad_gallery_page":false,"_wpcom_ai_launchpad_contact_page":false,"_wpcom_ai_launchpad_events_page":false,"_wpcom_ai_launchpad_video_page":false,"_wpcom_ai_launchpad_portfolio_piece":false,"footnotes":"","big_sky_generated":false},"class_list":["post-14440","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Seeding Rate Calculator: TKW, Plants per Square Foot - GeoPard<\/title>\n<meta name=\"description\" content=\"Set the plants you want standing, the thousand kernel weight off the bag and your field emergence. Get lb\/ac or kg\/ha, seeds per foot of row, tonnes to order.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/geopard.tech\/fr\/calculateur-de-taux-de-semis\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Seeding Rate Calculator: TKW, Plants per Square Foot - GeoPard\" \/>\n<meta property=\"og:description\" content=\"Set the plants you want standing, the thousand kernel weight off the bag and your field emergence. Get lb\/ac or kg\/ha, seeds per foot of row, tonnes to order.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/geopard.tech\/fr\/calculateur-de-taux-de-semis\/\" \/>\n<meta property=\"og:site_name\" content=\"GeoPard - Precision agriculture Mapping software\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/geopardAgriculture\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-29T11:27:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/geopard.tech\/wp-content\/uploads\/2021\/09\/GeoPard_seeding_rate.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@geopardagri\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/seeding-rate-calculator\\\/\",\"url\":\"https:\\\/\\\/geopard.tech\\\/seeding-rate-calculator\\\/\",\"name\":\"Seeding Rate Calculator: TKW, Plants per Square Foot - GeoPard\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/seeding-rate-calculator\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/seeding-rate-calculator\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/geopard.tech\\\/wp-content\\\/uploads\\\/2021\\\/09\\\/GeoPard_seeding_rate.png\",\"datePublished\":\"2026-09-29T11:07:32+00:00\",\"dateModified\":\"2026-09-29T11:27:31+00:00\",\"description\":\"Set the plants you want standing, the thousand kernel weight off the bag and your field emergence. Get lb\\\/ac or kg\\\/ha, seeds per foot of row, tonnes to order.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/seeding-rate-calculator\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/geopard.tech\\\/seeding-rate-calculator\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/seeding-rate-calculator\\\/#primaryimage\",\"url\":\"https:\\\/\\\/geopard.tech\\\/wp-content\\\/uploads\\\/2021\\\/09\\\/GeoPard_seeding_rate.png\",\"contentUrl\":\"https:\\\/\\\/geopard.tech\\\/wp-content\\\/uploads\\\/2021\\\/09\\\/GeoPard_seeding_rate.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/seeding-rate-calculator\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/geopard.tech\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Seeding Rate Calculator\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/#website\",\"url\":\"https:\\\/\\\/geopard.tech\\\/\",\"name\":\"GeoPard - Precision agriculture software\",\"description\":\"Precision agriculture Mapping software\",\"publisher\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/#organization\"},\"alternateName\":\"GeoPard\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/geopard.tech\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/#organization\",\"name\":\"GeoPard Agriculture\",\"alternateName\":\"GeoPard\",\"url\":\"https:\\\/\\\/geopard.tech\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/geopard.tech\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/geopard_logo_transparentbackground.png?fit=512%2C68&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/geopard.tech\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/geopard_logo_transparentbackground.png?fit=512%2C68&ssl=1\",\"width\":512,\"height\":68,\"caption\":\"GeoPard Agriculture\"},\"image\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/geopardAgriculture\\\/\",\"https:\\\/\\\/x.com\\\/geopardagri\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/geopard-agriculture\\\/\",\"https:\\\/\\\/www.instagram.com\\\/geopardagriculture\\\/\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCiaPGLAhRPNh-s85dXdC-Sw\",\"https:\\\/\\\/www.g2.com\\\/products\\\/geopard-agriculture-precision-farming-software\\\/reviews\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Calculateur de densit\u00e9 de semis\u00a0: TKW, plantes par pied carr\u00e9 - GeoPard","description":"D\u00e9finissez la hauteur de plantation souhait\u00e9e, le poids de mille grains par sac et la lev\u00e9e au champ. Obtenez des quantit\u00e9s en lb\/ac ou kg\/ha, en graines par pied de rang ou en tonnes \u00e0 commander.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/geopard.tech\/fr\/calculateur-de-taux-de-semis\/","og_locale":"fr_FR","og_type":"article","og_title":"Seeding Rate Calculator: TKW, Plants per Square Foot - GeoPard","og_description":"Set the plants you want standing, the thousand kernel weight off the bag and your field emergence. Get lb\/ac or kg\/ha, seeds per foot of row, tonnes to order.","og_url":"https:\/\/geopard.tech\/fr\/calculateur-de-taux-de-semis\/","og_site_name":"GeoPard - Precision agriculture Mapping software","article_publisher":"https:\/\/www.facebook.com\/geopardAgriculture\/","article_modified_time":"2026-09-29T11:27:31+00:00","og_image":[{"url":"https:\/\/geopard.tech\/wp-content\/uploads\/2021\/09\/GeoPard_seeding_rate.png","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_site":"@geopardagri","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/geopard.tech\/seeding-rate-calculator\/","url":"https:\/\/geopard.tech\/seeding-rate-calculator\/","name":"Calculateur de densit\u00e9 de semis\u00a0: TKW, plantes par pied carr\u00e9 - GeoPard","isPartOf":{"@id":"https:\/\/geopard.tech\/#website"},"primaryImageOfPage":{"@id":"https:\/\/geopard.tech\/seeding-rate-calculator\/#primaryimage"},"image":{"@id":"https:\/\/geopard.tech\/seeding-rate-calculator\/#primaryimage"},"thumbnailUrl":"https:\/\/geopard.tech\/wp-content\/uploads\/2021\/09\/GeoPard_seeding_rate.png","datePublished":"2026-09-29T11:07:32+00:00","dateModified":"2026-09-29T11:27:31+00:00","description":"D\u00e9finissez la hauteur de plantation souhait\u00e9e, le poids de mille grains par sac et la lev\u00e9e au champ. Obtenez des quantit\u00e9s en lb\/ac ou kg\/ha, en graines par pied de rang ou en tonnes \u00e0 commander.","breadcrumb":{"@id":"https:\/\/geopard.tech\/seeding-rate-calculator\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/geopard.tech\/seeding-rate-calculator\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/geopard.tech\/seeding-rate-calculator\/#primaryimage","url":"https:\/\/geopard.tech\/wp-content\/uploads\/2021\/09\/GeoPard_seeding_rate.png","contentUrl":"https:\/\/geopard.tech\/wp-content\/uploads\/2021\/09\/GeoPard_seeding_rate.png"},{"@type":"BreadcrumbList","@id":"https:\/\/geopard.tech\/seeding-rate-calculator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/geopard.tech\/"},{"@type":"ListItem","position":2,"name":"Seeding Rate Calculator"}]},{"@type":"WebSite","@id":"https:\/\/geopard.tech\/#website","url":"https:\/\/geopard.tech\/","name":"GeoPard - Logiciel d'agriculture de pr\u00e9cision","description":"Logiciel de cartographie pour l'agriculture de pr\u00e9cision","publisher":{"@id":"https:\/\/geopard.tech\/#organization"},"alternateName":"GeoPard","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/geopard.tech\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/geopard.tech\/#organization","name":"GeoPard Agriculture","alternateName":"GeoPard","url":"https:\/\/geopard.tech\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/geopard.tech\/#\/schema\/logo\/image\/","url":"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/07\/geopard_logo_transparentbackground.png?fit=512%2C68&ssl=1","contentUrl":"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/07\/geopard_logo_transparentbackground.png?fit=512%2C68&ssl=1","width":512,"height":68,"caption":"GeoPard Agriculture"},"image":{"@id":"https:\/\/geopard.tech\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/geopardAgriculture\/","https:\/\/x.com\/geopardagri","https:\/\/www.linkedin.com\/company\/geopard-agriculture\/","https:\/\/www.instagram.com\/geopardagriculture\/","https:\/\/www.youtube.com\/channel\/UCiaPGLAhRPNh-s85dXdC-Sw","https:\/\/www.g2.com\/products\/geopard-agriculture-precision-farming-software\/reviews"]}]}},"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/PdiCPa-3KU","_links":{"self":[{"href":"https:\/\/geopard.tech\/fr\/wp-json\/wp\/v2\/pages\/14440","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geopard.tech\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/geopard.tech\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/geopard.tech\/fr\/wp-json\/wp\/v2\/users\/210157960"}],"replies":[{"embeddable":true,"href":"https:\/\/geopard.tech\/fr\/wp-json\/wp\/v2\/comments?post=14440"}],"version-history":[{"count":2,"href":"https:\/\/geopard.tech\/fr\/wp-json\/wp\/v2\/pages\/14440\/revisions"}],"predecessor-version":[{"id":14450,"href":"https:\/\/geopard.tech\/fr\/wp-json\/wp\/v2\/pages\/14440\/revisions\/14450"}],"wp:attachment":[{"href":"https:\/\/geopard.tech\/fr\/wp-json\/wp\/v2\/media?parent=14440"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}