{"id":24546,"date":"2026-07-21T05:35:39","date_gmt":"2026-07-21T05:35:39","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24546"},"modified":"2026-07-21T05:57:59","modified_gmt":"2026-07-21T05:57:59","slug":"spur-gear-module-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/ru\/spur-gear-module-calculator\/","title":{"rendered":"Spur Gear Module Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Spur Gear Module Calculator<\/strong> is a free online engineering tool that helps mechanical engineers, gear designers, and manufacturers accurately calculate the module of spur gears for efficient power transmission. By entering parameters such as pitch diameter, number of teeth, or circular pitch, the <strong>Spur Gear Module Calculator<\/strong> quickly determines the correct gear module, ensuring proper gear meshing, smooth operation, and optimal performance. This calculator simplifies gear design, reduces calculation errors, and supports the selection of standardized gear sizes for industrial machinery, automotive systems, and precision mechanical equipment. Whether you&#8217;re designing a new gear set or verifying an existing one, this browser-based calculator delivers fast, accurate results without requiring any software installation.<\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Spur Gear Module Calculator<\/title>\n  <style>\n    \/* All styles scoped under .sgmc-root - safe for WordPress embed *\/\n    .sgmc-root {\n      --sgmc-bg-panel: #ffffff;\n      --sgmc-bg-input: #ffffff;\n      --sgmc-border: #d1d5db;\n      --sgmc-border-focus: #3b82f6;\n      --sgmc-text: #1f2937;\n      --sgmc-text-muted: #6b7280;\n      --sgmc-accent: #3b82f6;\n      --sgmc-accent-dim: rgba(59, 130, 246, 0.1);\n      --sgmc-success: #16a34a;\n      --sgmc-error: #dc2626;\n      --sgmc-gear-gold: #b45309;\n      --sgmc-radius: 10px;\n      --sgmc-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n      --sgmc-font-mono: \"Consolas\", \"SF Mono\", \"Cascadia Code\", monospace;\n      --sgmc-font-sans: \"Segoe UI\", system-ui, -apple-system, sans-serif;\n\n      display: block;\n      box-sizing: border-box;\n      max-width: 640px;\n      margin: 0 auto;\n      padding: 1.5rem;\n      font-family: var(--sgmc-font-sans);\n      font-size: 16px;\n      line-height: 1.5;\n      color: var(--sgmc-text);\n      background: #ffffff;\n    }\n\n    .sgmc-root *,\n    .sgmc-root *::before,\n    .sgmc-root *::after {\n      box-sizing: border-box;\n    }\n\n    .sgmc-root .sgmc-toolbar {\n      margin-bottom: 1.5rem;\n    }\n\n    .sgmc-root .sgmc-unit-toggle {\n      display: inline-flex;\n      background: var(--sgmc-bg-panel);\n      border: 1px solid var(--sgmc-border);\n      border-radius: var(--sgmc-radius);\n      overflow: hidden;\n    }\n\n    .sgmc-root .sgmc-unit-toggle button {\n      padding: 0.5rem 1.25rem;\n      border: none;\n      background: transparent;\n      color: var(--sgmc-text-muted);\n      font-family: var(--sgmc-font-sans);\n      font-size: 0.875rem;\n      font-weight: 600;\n      cursor: pointer;\n      transition: background 0.2s, color 0.2s;\n      line-height: 1.5;\n      margin: 0;\n    }\n\n    .sgmc-root .sgmc-unit-toggle button.sgmc-active {\n      background: var(--sgmc-accent);\n      color: #fff;\n    }\n\n    .sgmc-root .sgmc-unit-toggle button:not(.sgmc-active):hover {\n      background: var(--sgmc-accent-dim);\n      color: var(--sgmc-text);\n    }\n\n    .sgmc-root .sgmc-stack {\n      display: flex;\n      flex-direction: column;\n      gap: 1.5rem;\n    }\n\n    .sgmc-root .sgmc-panel {\n      background: var(--sgmc-bg-panel);\n      border: 1px solid var(--sgmc-border);\n      border-radius: calc(var(--sgmc-radius) + 2px);\n      box-shadow: var(--sgmc-shadow);\n      overflow: hidden;\n      margin: 0;\n    }\n\n    .sgmc-root .sgmc-panel-header {\n      padding: 1rem 1.25rem;\n      border-bottom: 1px solid var(--sgmc-border);\n      display: flex;\n      align-items: center;\n      gap: 0.5rem;\n      margin: 0;\n    }\n\n    .sgmc-root .sgmc-panel-header h2 {\n      font-size: 1rem;\n      font-weight: 600;\n      text-transform: uppercase;\n      letter-spacing: 0.06em;\n      color: var(--sgmc-text-muted);\n      margin: 0;\n      padding: 0;\n      line-height: 1.5;\n    }\n\n    .sgmc-root .sgmc-dot {\n      width: 8px;\n      height: 8px;\n      border-radius: 50%;\n      background: var(--sgmc-accent);\n      flex-shrink: 0;\n    }\n\n    .sgmc-root .sgmc-dot.sgmc-success { background: var(--sgmc-success); }\n\n    .sgmc-root .sgmc-panel-body { padding: 1.25rem; }\n\n    .sgmc-root .sgmc-mode-tabs {\n      display: flex;\n      margin-bottom: 1.25rem;\n      border: 1px solid var(--sgmc-border);\n      border-radius: var(--sgmc-radius);\n      overflow: hidden;\n    }\n\n    .sgmc-root .sgmc-mode-tab {\n      flex: 1;\n      padding: 0.65rem 0.75rem;\n      border: none;\n      background: #ffffff;\n      color: var(--sgmc-text-muted);\n      font-family: var(--sgmc-font-sans);\n      font-size: 0.8rem;\n      font-weight: 600;\n      cursor: pointer;\n      transition: background 0.2s, color 0.2s;\n      text-align: center;\n      line-height: 1.3;\n      margin: 0;\n    }\n\n    .sgmc-root .sgmc-mode-tab + .sgmc-mode-tab {\n      border-left: 1px solid var(--sgmc-border);\n    }\n\n    .sgmc-root .sgmc-mode-tab.sgmc-active {\n      background: var(--sgmc-accent-dim);\n      color: var(--sgmc-accent);\n    }\n\n    .sgmc-root .sgmc-mode-tab:not(.sgmc-active):hover {\n      color: var(--sgmc-text);\n    }\n\n    .sgmc-root .sgmc-mode-desc {\n      font-size: 0.82rem;\n      color: var(--sgmc-text-muted);\n      margin: 0 0 1.25rem;\n      padding: 0.75rem;\n      background: #ffffff;\n      border-radius: var(--sgmc-radius);\n      border: 1px solid var(--sgmc-border);\n      border-left: 3px solid var(--sgmc-gear-gold);\n    }\n\n    .sgmc-root .sgmc-mode-desc code {\n      font-family: var(--sgmc-font-mono);\n      color: var(--sgmc-gear-gold);\n      font-size: 0.85rem;\n      background: none;\n      padding: 0;\n    }\n\n    .sgmc-root .sgmc-field-group { margin-bottom: 1rem; }\n    .sgmc-root .sgmc-field-group:last-child { margin-bottom: 0; }\n\n    .sgmc-root .sgmc-field-group label {\n      display: block;\n      font-size: 0.82rem;\n      font-weight: 600;\n      color: var(--sgmc-text-muted);\n      margin: 0 0 0.35rem;\n      padding: 0;\n      text-transform: uppercase;\n      letter-spacing: 0.04em;\n      line-height: 1.5;\n    }\n\n    .sgmc-root .sgmc-field-group label .sgmc-symbol {\n      font-family: var(--sgmc-font-mono);\n      color: var(--sgmc-gear-gold);\n      margin-left: 0.25rem;\n    }\n\n    .sgmc-root .sgmc-input-wrap { position: relative; }\n\n    .sgmc-root .sgmc-input-wrap input[type=\"number\"] {\n      width: 100%;\n      padding: 0.65rem 2.75rem 0.65rem 0.85rem;\n      background: var(--sgmc-bg-input);\n      border: 1px solid var(--sgmc-border);\n      border-radius: var(--sgmc-radius);\n      color: var(--sgmc-text);\n      font-family: var(--sgmc-font-mono);\n      font-size: 1rem;\n      line-height: 1.5;\n      height: auto;\n      margin: 0;\n      transition: border-color 0.2s, box-shadow 0.2s;\n      -moz-appearance: textfield;\n      appearance: textfield;\n    }\n\n    .sgmc-root .sgmc-input-wrap input[type=\"number\"]::-webkit-outer-spin-button,\n    .sgmc-root .sgmc-input-wrap input[type=\"number\"]::-webkit-inner-spin-button {\n      -webkit-appearance: none;\n      margin: 0;\n    }\n\n    .sgmc-root .sgmc-input-wrap input[type=\"number\"]:focus {\n      outline: none;\n      border-color: var(--sgmc-border-focus);\n      box-shadow: 0 0 0 3px rgba(74, 158, 255, 0.2);\n    }\n\n    .sgmc-root .sgmc-input-wrap input[type=\"number\"].sgmc-invalid {\n      border-color: var(--sgmc-error);\n      box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.15);\n    }\n\n    .sgmc-root .sgmc-unit-tag {\n      position: absolute;\n      right: 0.75rem;\n      top: 50%;\n      transform: translateY(-50%);\n      font-size: 0.75rem;\n      color: var(--sgmc-text-muted);\n      font-weight: 600;\n      pointer-events: none;\n    }\n\n    .sgmc-root .sgmc-error-msg {\n      display: none;\n      font-size: 0.78rem;\n      color: var(--sgmc-error);\n      margin: 0.3rem 0 0;\n      padding: 0;\n    }\n\n    .sgmc-root .sgmc-error-msg.sgmc-visible { display: block; }\n\n    .sgmc-root .sgmc-mode-panel { display: none; }\n    .sgmc-root .sgmc-mode-panel.sgmc-active { display: block; }\n\n    .sgmc-root .sgmc-btn-calculate-wrap {\n      display: flex;\n      justify-content: center;\n      margin-top: 1.25rem;\n    }\n\n    .sgmc-root .sgmc-btn-calculate {\n      width: 50%;\n      padding: 0.85rem 1.5rem;\n      border: none;\n      border-radius: var(--sgmc-radius);\n      background: var(--sgmc-accent);\n      color: #fff;\n      font-family: var(--sgmc-font-sans);\n      font-size: 1rem;\n      font-weight: 700;\n      letter-spacing: 0.04em;\n      cursor: pointer;\n      transition: background 0.2s, transform 0.1s;\n      line-height: 1.5;\n      margin: 0;\n    }\n\n    .sgmc-root .sgmc-btn-calculate:hover { background: #2563eb; }\n    .sgmc-root .sgmc-btn-calculate:active { transform: scale(0.99); }\n\n    .sgmc-root .sgmc-results-panel { display: none; }\n    .sgmc-root .sgmc-results-panel.sgmc-visible { display: block; }\n\n    .sgmc-root .sgmc-result-hero {\n      text-align: center;\n      padding: 1.5rem;\n      background: #ffffff;\n      border-radius: var(--sgmc-radius);\n      margin-bottom: 1.25rem;\n      border: 1px solid var(--sgmc-border);\n    }\n\n    .sgmc-root .sgmc-result-hero .sgmc-hero-label {\n      font-size: 0.75rem;\n      text-transform: uppercase;\n      letter-spacing: 0.1em;\n      color: var(--sgmc-text-muted);\n      margin-bottom: 0.25rem;\n    }\n\n    .sgmc-root .sgmc-result-hero .sgmc-hero-value {\n      font-family: var(--sgmc-font-mono);\n      font-size: clamp(2rem, 6vw, 2.75rem);\n      font-weight: 700;\n      color: var(--sgmc-success);\n      line-height: 1.1;\n      margin: 0;\n    }\n\n    .sgmc-root .sgmc-result-hero .sgmc-hero-unit {\n      font-size: 0.85rem;\n      color: var(--sgmc-text-muted);\n      margin-top: 0.25rem;\n    }\n\n    .sgmc-root .sgmc-result-section-title {\n      font-size: 0.78rem;\n      text-transform: uppercase;\n      letter-spacing: 0.08em;\n      color: var(--sgmc-text-muted);\n      margin: 1.25rem 0 0.75rem;\n      padding-bottom: 0.4rem;\n      border-bottom: 1px solid var(--sgmc-border);\n    }\n\n    .sgmc-root .sgmc-result-section-title:first-of-type { margin-top: 0; }\n\n    .sgmc-root .sgmc-result-grid {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 0.5rem;\n    }\n\n    @media (max-width: 480px) {\n      .sgmc-root .sgmc-result-grid { grid-template-columns: 1fr; }\n    }\n\n    .sgmc-root .sgmc-result-item {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: 0.55rem 0.75rem;\n      background: #ffffff;\n      border-radius: 6px;\n      border: 1px solid var(--sgmc-border);\n      margin: 0;\n    }\n\n    .sgmc-root .sgmc-result-item .sgmc-ri-label {\n      font-size: 0.8rem;\n      color: var(--sgmc-text-muted);\n    }\n\n    .sgmc-root .sgmc-result-item .sgmc-ri-label .sgmc-sym {\n      font-family: var(--sgmc-font-mono);\n      color: var(--sgmc-gear-gold);\n    }\n\n    .sgmc-root .sgmc-result-item .sgmc-ri-value {\n      font-family: var(--sgmc-font-mono);\n      font-size: 0.9rem;\n      font-weight: 600;\n      color: var(--sgmc-text);\n    }\n  <\/style>\n<\/head>\n<body>\n  <!-- WordPress: paste style + this div + script into a Custom HTML block (use Code Editor, not Visual) -->\n  <div id=\"sgmc-root\" class=\"sgmc-root\">\n    <div class=\"sgmc-toolbar\">\n      <div class=\"sgmc-unit-toggle\" role=\"group\" aria-label=\"Unit selection\">\n        <button type=\"button\" id=\"sgmc-btn-mm\" class=\"sgmc-active\" aria-pressed=\"true\">Millimeters (mm)<\/button>\n        <button type=\"button\" id=\"sgmc-btn-in\" aria-pressed=\"false\">Inches (in)<\/button>\n      <\/div>\n    <\/div>\n\n    <div class=\"sgmc-stack\">\n      <section class=\"sgmc-panel\" aria-label=\"Input parameters\">\n        <div class=\"sgmc-panel-header\">\n          <span class=\"sgmc-dot\"><\/span>\n          <h2>Input Parameters<\/h2>\n        <\/div>\n        <div class=\"sgmc-panel-body\">\n          <div class=\"sgmc-mode-tabs\" role=\"tablist\">\n            <button type=\"button\" class=\"sgmc-mode-tab sgmc-active\" role=\"tab\" aria-selected=\"true\" data-mode=\"A\" id=\"sgmc-tab-a\">\n              Mode A<br>Geometry\n            <\/button>\n            <button type=\"button\" class=\"sgmc-mode-tab\" role=\"tab\" aria-selected=\"false\" data-mode=\"B\" id=\"sgmc-tab-b\">\n              Mode B<br>Center Distance\n            <\/button>\n          <\/div>\n\n          <div class=\"sgmc-mode-panel sgmc-active\" id=\"sgmc-mode-a\" role=\"tabpanel\" aria-labelledby=\"sgmc-tab-a\">\n            <p class=\"sgmc-mode-desc\">\n              Calculate module from pitch diameter and tooth count:<br>\n              <code>m = d \/ z<\/code>\n            <\/p>\n            <div class=\"sgmc-field-group\">\n              <label for=\"sgmc-a-d\">Pitch Diameter <span class=\"sgmc-symbol\">(d)<\/span><\/label>\n              <div class=\"sgmc-input-wrap\">\n                <input type=\"number\" id=\"sgmc-a-d\" step=\"any\" min=\"0\" placeholder=\"e.g. 50\" value=\"50\">\n                <span class=\"sgmc-unit-tag sgmc-length-unit\">mm<\/span>\n              <\/div>\n              <p class=\"sgmc-error-msg\" id=\"sgmc-err-a-d\"><\/p>\n            <\/div>\n            <div class=\"sgmc-field-group\">\n              <label for=\"sgmc-a-z\">Number of Teeth <span class=\"sgmc-symbol\">(z)<\/span><\/label>\n              <div class=\"sgmc-input-wrap\">\n                <input type=\"number\" id=\"sgmc-a-z\" step=\"1\" min=\"1\" placeholder=\"e.g. 20\" value=\"20\">\n                <span class=\"sgmc-unit-tag\">\u2014<\/span>\n              <\/div>\n              <p class=\"sgmc-error-msg\" id=\"sgmc-err-a-z\"><\/p>\n            <\/div>\n          <\/div>\n\n          <div class=\"sgmc-mode-panel\" id=\"sgmc-mode-b\" role=\"tabpanel\" aria-labelledby=\"sgmc-tab-b\">\n            <p class=\"sgmc-mode-desc\">\n              Calculate module from center distance and two gear tooth counts:<br>\n              <code>m = 2a \/ (z\u2081 + z\u2082)<\/code>\n            <\/p>\n            <div class=\"sgmc-field-group\">\n              <label for=\"sgmc-b-a\">Center Distance <span class=\"sgmc-symbol\">(a)<\/span><\/label>\n              <div class=\"sgmc-input-wrap\">\n                <input type=\"number\" id=\"sgmc-b-a\" step=\"any\" min=\"0\" placeholder=\"e.g. 75\" value=\"75\">\n                <span class=\"sgmc-unit-tag sgmc-length-unit\">mm<\/span>\n              <\/div>\n              <p class=\"sgmc-error-msg\" id=\"sgmc-err-b-a\"><\/p>\n            <\/div>\n            <div class=\"sgmc-field-group\">\n              <label for=\"sgmc-b-z1\">Teeth \u2014 Gear 1 <span class=\"sgmc-symbol\">(z\u2081)<\/span><\/label>\n              <div class=\"sgmc-input-wrap\">\n                <input type=\"number\" id=\"sgmc-b-z1\" step=\"1\" min=\"1\" placeholder=\"e.g. 20\" value=\"20\">\n                <span class=\"sgmc-unit-tag\">\u2014<\/span>\n              <\/div>\n              <p class=\"sgmc-error-msg\" id=\"sgmc-err-b-z1\"><\/p>\n            <\/div>\n            <div class=\"sgmc-field-group\">\n              <label for=\"sgmc-b-z2\">Teeth \u2014 Gear 2 <span class=\"sgmc-symbol\">(z\u2082)<\/span><\/label>\n              <div class=\"sgmc-input-wrap\">\n                <input type=\"number\" id=\"sgmc-b-z2\" step=\"1\" min=\"1\" placeholder=\"e.g. 30\" value=\"30\">\n                <span class=\"sgmc-unit-tag\">\u2014<\/span>\n              <\/div>\n              <p class=\"sgmc-error-msg\" id=\"sgmc-err-b-z2\"><\/p>\n            <\/div>\n          <\/div>\n\n          <div class=\"sgmc-btn-calculate-wrap\">\n            <button type=\"button\" class=\"sgmc-btn-calculate\" id=\"sgmc-btn-calculate\" onclick=\"if(window.sgmcCalculate){window.sgmcCalculate();}return false;\">Calculate<\/button>\n          <\/div>\n        <\/div>\n      <\/section>\n\n      <section class=\"sgmc-panel sgmc-results-panel\" id=\"sgmc-results-panel\" aria-label=\"Calculated results\">\n        <div class=\"sgmc-panel-header\">\n          <span class=\"sgmc-dot sgmc-success\"><\/span>\n          <h2>Calculated Results<\/h2>\n        <\/div>\n        <div class=\"sgmc-panel-body\">\n          <div class=\"sgmc-result-hero\" id=\"sgmc-hero-module\">\n            <div class=\"sgmc-hero-label\">Module<\/div>\n            <div class=\"sgmc-hero-value\" id=\"sgmc-out-module\">\u2014<\/div>\n            <div class=\"sgmc-hero-unit\" id=\"sgmc-module-unit-label\">mm per tooth<\/div>\n          <\/div>\n          <div id=\"sgmc-results-content\"><\/div>\n        <\/div>\n      <\/section>\n    <\/div>\n  <\/div>\n\n  <script type=\"text\/javascript\">\neval(atob('ZnVuY3Rpb24gc2dtY0luaXRDYWxjdWxhdG9yKCkgew0KICAgICAgdmFyIHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2dtYy1yb290Jyk7DQogICAgICBpZiAoIXJvb3QpIHJldHVybjsNCg0KICAgICAgdmFyIE1NX1BFUl9JTiA9IDI1LjQ7DQogICAgICB2YXIgUEkgPSBNYXRoLlBJOw0KICAgICAgdmFyIFBSRUNJU0lPTiA9IDM7DQogICAgICB2YXIgY3VycmVudE1vZGUgPSAnQSc7DQogICAgICB2YXIgY3VycmVudFVuaXQgPSAnbW0nOw0KDQogICAgICBmdW5jdGlvbiBxKHNlbCkgeyByZXR1cm4gcm9vdC5xdWVyeVNlbGVjdG9yKHNlbCk7IH0NCiAgICAgIGZ1bmN0aW9uIHFhKHNlbCkgeyByZXR1cm4gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKHNlbCk7IH0NCg0KICAgICAgdmFyIGVscyA9IHsNCiAgICAgICAgYnRuTW06IHEoJyNzZ21jLWJ0bi1tbScpLA0KICAgICAgICBidG5JbjogcSgnI3NnbWMtYnRuLWluJyksDQogICAgICAgIGJ0bkNhbGN1bGF0ZTogcSgnI3NnbWMtYnRuLWNhbGN1bGF0ZScpLA0KICAgICAgICByZXN1bHRzUGFuZWw6IHEoJyNzZ21jLXJlc3VsdHMtcGFuZWwnKSwNCiAgICAgICAgdGFiczogcWEoJy5zZ21jLW1vZGUtdGFiJyksDQogICAgICAgIG1vZGVQYW5lbHM6IHFhKCcuc2dtYy1tb2RlLXBhbmVsJyksDQogICAgICAgIGxlbmd0aFVuaXRzOiBxYSgnLnNnbWMtbGVuZ3RoLXVuaXQnKSwNCiAgICAgICAgb3V0TW9kdWxlOiBxKCcjc2dtYy1vdXQtbW9kdWxlJyksDQogICAgICAgIG1vZHVsZVVuaXRMYWJlbDogcSgnI3NnbWMtbW9kdWxlLXVuaXQtbGFiZWwnKSwNCiAgICAgICAgcmVzdWx0c0NvbnRlbnQ6IHEoJyNzZ21jLXJlc3VsdHMtY29udGVudCcpLA0KICAgICAgICBpbnB1dHM6IHsNCiAgICAgICAgICBhRDogcSgnI3NnbWMtYS1kJyksDQogICAgICAgICAgYVo6IHEoJyNzZ21jLWEteicpLA0KICAgICAgICAgIGJBOiBxKCcjc2dtYy1iLWEnKSwNCiAgICAgICAgICBiWjE6IHEoJyNzZ21jLWItejEnKSwNCiAgICAgICAgICBiWjI6IHEoJyNzZ21jLWItejInKQ0KICAgICAgICB9DQogICAgICB9Ow0KDQogICAgICBpZiAoIWVscy5idG5DYWxjdWxhdGUgfHwgIWVscy5yZXN1bHRzUGFuZWwpIHJldHVybjsNCg0KICAgICAgZnVuY3Rpb24gZm10KHZhbCkgew0KICAgICAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkIHx8ICFpc0Zpbml0ZSh2YWwpKSByZXR1cm4gJy0nOw0KICAgICAgICByZXR1cm4gdmFsLnRvRml4ZWQoUFJFQ0lTSU9OKTsNCiAgICAgIH0NCg0KICAgICAgZnVuY3Rpb24gdG9NbSh2YWx1ZSwgdW5pdCkgew0KICAgICAgICB1bml0ID0gdW5pdCB8fCBjdXJyZW50VW5pdDsNCiAgICAgICAgcmV0dXJuIHVuaXQgPT09ICdpbicgPyB2YWx1ZSAqIE1NX1BFUl9JTiA6IHZhbHVlOw0KICAgICAgfQ0KDQogICAgICBmdW5jdGlvbiBmcm9tTW0odmFsdWVNbSwgdW5pdCkgew0KICAgICAgICB1bml0ID0gdW5pdCB8fCBjdXJyZW50VW5pdDsNCiAgICAgICAgcmV0dXJuIHVuaXQgPT09ICdpbicgPyB2YWx1ZU1tIC8gTU1fUEVSX0lOIDogdmFsdWVNbTsNCiAgICAgIH0NCg0KICAgICAgZnVuY3Rpb24gbGVuZ3RoU3VmZml4KCkgew0KICAgICAgICByZXR1cm4gY3VycmVudFVuaXQgPT09ICdpbicgPyAnaW4nIDogJ21tJzsNCiAgICAgIH0NCg0KICAgICAgZnVuY3Rpb24gbW9kdWxlU3VmZml4KCkgew0KICAgICAgICByZXR1cm4gY3VycmVudFVuaXQgPT09ICdpbicgPyAnaW4gcGVyIHRvb3RoJyA6ICdtbSBwZXIgdG9vdGgnOw0KICAgICAgfQ0KDQogICAgICBmdW5jdGlvbiB2YWxpZGF0ZU51bWJlcihyYXcsIG9wdHMpIHsNCiAgICAgICAgdmFyIG5hbWUgPSBvcHRzLm5hbWU7DQogICAgICAgIHZhciBtaW4gPSBvcHRzLm1pbjsNCiAgICAgICAgdmFyIGFsbG93WmVybyA9IG9wdHMuYWxsb3daZXJvIHx8IGZhbHNlOw0KICAgICAgICB2YXIgaW50ZWdlciA9IG9wdHMuaW50ZWdlciB8fCBmYWxzZTsNCiAgICAgICAgdmFyIHRyaW1tZWQgPSBTdHJpbmcocmF3KS50cmltKCk7DQogICAgICAgIHZhciBudW07DQoNCiAgICAgICAgaWYgKHRyaW1tZWQgPT09ICcnKSB7DQogICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCB2YWx1ZTogbnVsbCwgbWVzc2FnZTogJ1BsZWFzZSBlbnRlciBhIHZhbHVlIGZvciAnICsgbmFtZSArICcuJyB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgbnVtID0gTnVtYmVyKHRyaW1tZWQpOw0KDQogICAgICAgIGlmICghaXNGaW5pdGUobnVtKSkgew0KICAgICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgdmFsdWU6IG51bGwsIG1lc3NhZ2U6IG5hbWUgKyAnIG11c3QgYmUgYSB2YWxpZCBudW1iZXIuJyB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGludGVnZXIgJiYgTWF0aC5mbG9vcihudW0pICE9PSBudW0pIHsNCiAgICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIHZhbHVlOiBudWxsLCBtZXNzYWdlOiBuYW1lICsgJyBtdXN0IGJlIGEgd2hvbGUgbnVtYmVyLicgfTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChudW0gPCAwKSB7DQogICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCB2YWx1ZTogbnVsbCwgbWVzc2FnZTogbmFtZSArICcgY2Fubm90IGJlIG5lZ2F0aXZlLicgfTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghYWxsb3daZXJvICYmIG51bSA9PT0gMCkgew0KICAgICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgdmFsdWU6IG51bGwsIG1lc3NhZ2U6IG5hbWUgKyAnIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG1pbiAhPT0gdW5kZWZpbmVkICYmIG51bSA8IG1pbikgew0KICAgICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgdmFsdWU6IG51bGwsIG1lc3NhZ2U6IG5hbWUgKyAnIG11c3QgYmUgYXQgbGVhc3QgJyArIG1pbiArICcuJyB9Ow0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIHZhbHVlOiBudW0sIG1lc3NhZ2U6ICcnIH07DQogICAgICB9DQoNCiAgICAgIGZ1bmN0aW9uIGRlcml2ZUdlYXJQYXJhbXMobU1tLCB6KSB7DQogICAgICAgIHZhciBkID0gbU1tICogejsNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICB6OiB6LA0KICAgICAgICAgIGQ6IGQsDQogICAgICAgICAgaGE6IG1NbSwNCiAgICAgICAgICBoZjogMS4yNSAqIG1NbSwNCiAgICAgICAgICBoOiAyLjI1ICogbU1tLA0KICAgICAgICAgIHA6IFBJICogbU1tLA0KICAgICAgICAgIGRhOiBkICsgMiAqIG1NbSwNCiAgICAgICAgICBkZjogZCAtIDIuNSAqIG1NbQ0KICAgICAgICB9Ow0KICAgICAgfQ0KDQogICAgICBmdW5jdGlvbiBhcHBlbmRSZXN1bHRSb3coZ3JpZCwgbGFiZWwsIHN5bSwgdmFsLCB1bml0KSB7DQogICAgICAgIHZhciBpdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogICAgICAgIGl0ZW0uY2xhc3NOYW1lID0gJ3NnbWMtcmVzdWx0LWl0ZW0nOw0KDQogICAgICAgIHZhciBsYWJlbEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KICAgICAgICBsYWJlbEVsLmNsYXNzTmFtZSA9ICdzZ21jLXJpLWxhYmVsJzsNCiAgICAgICAgbGFiZWxFbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsYWJlbCArICcgJykpOw0KICAgICAgICB2YXIgc3ltRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQogICAgICAgIHN5bUVsLmNsYXNzTmFtZSA9ICdzZ21jLXN5bSc7DQogICAgICAgIHN5bUVsLnRleHRDb250ZW50ID0gJygnICsgc3ltICsgJyknOw0KICAgICAgICBsYWJlbEVsLmFwcGVuZENoaWxkKHN5bUVsKTsNCg0KICAgICAgICB2YXIgdmFsdWVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCiAgICAgICAgdmFsdWVFbC5jbGFzc05hbWUgPSAnc2dtYy1yaS12YWx1ZSc7DQogICAgICAgIHZhbHVlRWwudGV4dENvbnRlbnQgPSBmbXQodmFsKSArICcgJyArIHVuaXQ7DQoNCiAgICAgICAgaXRlbS5hcHBlbmRDaGlsZChsYWJlbEVsKTsNCiAgICAgICAgaXRlbS5hcHBlbmRDaGlsZCh2YWx1ZUVsKTsNCiAgICAgICAgZ3JpZC5hcHBlbmRDaGlsZChpdGVtKTsNCiAgICAgIH0NCg0KICAgICAgZnVuY3Rpb24gcmVuZGVyR2VhckJsb2NrKHRpdGxlLCBwYXJhbXMpIHsNCiAgICAgICAgdmFyIHUgPSBsZW5ndGhTdWZmaXgoKTsNCiAgICAgICAgdmFyIHdyYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgICAgICAgdmFyIGhlYWRpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgICAgICAgdmFyIGdyaWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCg0KICAgICAgICBoZWFkaW5nLmNsYXNzTmFtZSA9ICdzZ21jLXJlc3VsdC1zZWN0aW9uLXRpdGxlJzsNCiAgICAgICAgaGVhZGluZy50ZXh0Q29udGVudCA9IHRpdGxlICsgJyAtIHogPSAnICsgcGFyYW1zLno7DQogICAgICAgIGdyaWQuY2xhc3NOYW1lID0gJ3NnbWMtcmVzdWx0LWdyaWQnOw0KDQogICAgICAgIGFwcGVuZFJlc3VsdFJvdyhncmlkLCAnUGl0Y2ggRGlhbWV0ZXInLCAnZCcsIGZyb21NbShwYXJhbXMuZCksIHUpOw0KICAgICAgICBhcHBlbmRSZXN1bHRSb3coZ3JpZCwgJ0FkZGVuZHVtJywgJ2hfYScsIGZyb21NbShwYXJhbXMuaGEpLCB1KTsNCiAgICAgICAgYXBwZW5kUmVzdWx0Um93KGdyaWQsICdEZWRlbmR1bScsICdoX2YnLCBmcm9tTW0ocGFyYW1zLmhmKSwgdSk7DQogICAgICAgIGFwcGVuZFJlc3VsdFJvdyhncmlkLCAnVG90YWwgVG9vdGggRGVwdGgnLCAnaCcsIGZyb21NbShwYXJhbXMuaCksIHUpOw0KICAgICAgICBhcHBlbmRSZXN1bHRSb3coZ3JpZCwgJ0NpcmN1bGFyIFBpdGNoJywgJ3AnLCBmcm9tTW0ocGFyYW1zLnApLCB1KTsNCiAgICAgICAgYXBwZW5kUmVzdWx0Um93KGdyaWQsICdPdXRzaWRlIERpYW1ldGVyJywgJ2RfYScsIGZyb21NbShwYXJhbXMuZGEpLCB1KTsNCiAgICAgICAgYXBwZW5kUmVzdWx0Um93KGdyaWQsICdSb290IERpYW1ldGVyJywgJ2RfZicsIGZyb21NbShwYXJhbXMuZGYpLCB1KTsNCg0KICAgICAgICB3cmFwLmFwcGVuZENoaWxkKGhlYWRpbmcpOw0KICAgICAgICB3cmFwLmFwcGVuZENoaWxkKGdyaWQpOw0KICAgICAgICByZXR1cm4gd3JhcDsNCiAgICAgIH0NCg0KICAgICAgZnVuY3Rpb24gc2V0RmllbGRFcnJvcihpbnB1dEVsLCBlcnJFbCwgcmVzdWx0KSB7DQogICAgICAgIGlmICghaW5wdXRFbCB8fCAhZXJyRWwpIHJldHVybjsNCiAgICAgICAgaWYgKHJlc3VsdC52YWxpZCkgew0KICAgICAgICAgIGlucHV0RWwuY2xhc3NMaXN0LnJlbW92ZSgnc2dtYy1pbnZhbGlkJyk7DQogICAgICAgICAgZXJyRWwudGV4dENvbnRlbnQgPSAnJzsNCiAgICAgICAgICBlcnJFbC5jbGFzc0xpc3QucmVtb3ZlKCdzZ21jLXZpc2libGUnKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBpbnB1dEVsLmNsYXNzTGlzdC5hZGQoJ3NnbWMtaW52YWxpZCcpOw0KICAgICAgICAgIGVyckVsLnRleHRDb250ZW50ID0gcmVzdWx0Lm1lc3NhZ2U7DQogICAgICAgICAgZXJyRWwuY2xhc3NMaXN0LmFkZCgnc2dtYy12aXNpYmxlJyk7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgZnVuY3Rpb24gaGlkZVJlc3VsdHMoKSB7DQogICAgICAgIGVscy5yZXN1bHRzUGFuZWwuY2xhc3NMaXN0LnJlbW92ZSgnc2dtYy12aXNpYmxlJyk7DQogICAgICB9DQoNCiAgICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZSgpIHsNCiAgICAgICAgdmFyIG1vZHVsZU1tID0gbnVsbDsNCiAgICAgICAgdmFyIGdlYXJzID0gW107DQogICAgICAgIHZhciBoYXNFcnJvciA9IGZhbHNlOw0KICAgICAgICB2YXIgaTsNCg0KICAgICAgICBpZiAoY3VycmVudE1vZGUgPT09ICdBJykgew0KICAgICAgICAgIHZhciByRCA9IHZhbGlkYXRlTnVtYmVyKGVscy5pbnB1dHMuYUQudmFsdWUsIHsgbmFtZTogJ1BpdGNoIGRpYW1ldGVyJywgbWluOiAwLCBhbGxvd1plcm86IGZhbHNlIH0pOw0KICAgICAgICAgIHZhciByWiA9IHZhbGlkYXRlTnVtYmVyKGVscy5pbnB1dHMuYVoudmFsdWUsIHsgbmFtZTogJ051bWJlciBvZiB0ZWV0aCcsIG1pbjogMSwgaW50ZWdlcjogdHJ1ZSB9KTsNCg0KICAgICAgICAgIHNldEZpZWxkRXJyb3IoZWxzLmlucHV0cy5hRCwgcSgnI3NnbWMtZXJyLWEtZCcpLCByRCk7DQogICAgICAgICAgc2V0RmllbGRFcnJvcihlbHMuaW5wdXRzLmFaLCBxKCcjc2dtYy1lcnItYS16JyksIHJaKTsNCg0KICAgICAgICAgIGlmICghckQudmFsaWQgfHwgIXJaLnZhbGlkKSB7DQogICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIG1vZHVsZU1tID0gdG9NbShyRC52YWx1ZSkgLyByWi52YWx1ZTsNCiAgICAgICAgICAgIGdlYXJzLnB1c2goZGVyaXZlR2VhclBhcmFtcyhtb2R1bGVNbSwgcloudmFsdWUpKTsNCiAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgdmFyIHJBID0gdmFsaWRhdGVOdW1iZXIoZWxzLmlucHV0cy5iQS52YWx1ZSwgeyBuYW1lOiAnQ2VudGVyIGRpc3RhbmNlJywgbWluOiAwLCBhbGxvd1plcm86IGZhbHNlIH0pOw0KICAgICAgICAgIHZhciByWjEgPSB2YWxpZGF0ZU51bWJlcihlbHMuaW5wdXRzLmJaMS52YWx1ZSwgeyBuYW1lOiAnR2VhciAxIHRlZXRoJywgbWluOiAxLCBpbnRlZ2VyOiB0cnVlIH0pOw0KICAgICAgICAgIHZhciByWjIgPSB2YWxpZGF0ZU51bWJlcihlbHMuaW5wdXRzLmJaMi52YWx1ZSwgeyBuYW1lOiAnR2VhciAyIHRlZXRoJywgbWluOiAxLCBpbnRlZ2VyOiB0cnVlIH0pOw0KDQogICAgICAgICAgc2V0RmllbGRFcnJvcihlbHMuaW5wdXRzLmJBLCBxKCcjc2dtYy1lcnItYi1hJyksIHJBKTsNCiAgICAgICAgICBzZXRGaWVsZEVycm9yKGVscy5pbnB1dHMuYloxLCBxKCcjc2dtYy1lcnItYi16MScpLCByWjEpOw0KICAgICAgICAgIHNldEZpZWxkRXJyb3IoZWxzLmlucHV0cy5iWjIsIHEoJyNzZ21jLWVyci1iLXoyJyksIHJaMik7DQoNCiAgICAgICAgICBpZiAoIXJBLnZhbGlkIHx8ICFyWjEudmFsaWQgfHwgIXJaMi52YWxpZCkgew0KICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB2YXIgelN1bSA9IHJaMS52YWx1ZSArIHJaMi52YWx1ZTsNCiAgICAgICAgICAgIG1vZHVsZU1tID0gKDIgKiB0b01tKHJBLnZhbHVlKSkgLyB6U3VtOw0KICAgICAgICAgICAgZ2VhcnMucHVzaChkZXJpdmVHZWFyUGFyYW1zKG1vZHVsZU1tLCByWjEudmFsdWUpKTsNCiAgICAgICAgICAgIGdlYXJzLnB1c2goZGVyaXZlR2VhclBhcmFtcyhtb2R1bGVNbSwgcloyLnZhbHVlKSk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGhhc0Vycm9yIHx8IG1vZHVsZU1tID09PSBudWxsIHx8IG1vZHVsZU1tIDw9IDApIHsNCiAgICAgICAgICBoaWRlUmVzdWx0cygpOw0KICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGVscy5tb2R1bGVVbml0TGFiZWwudGV4dENvbnRlbnQgPSBtb2R1bGVTdWZmaXgoKTsNCiAgICAgICAgZWxzLm91dE1vZHVsZS50ZXh0Q29udGVudCA9IGZtdChmcm9tTW0obW9kdWxlTW0pKTsNCg0KICAgICAgICBlbHMucmVzdWx0c0NvbnRlbnQuaW5uZXJIVE1MID0gJyc7DQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZWFycy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgIHZhciBibG9ja1RpdGxlID0gZ2VhcnMubGVuZ3RoID09PSAxID8gJ0dlYXIgUGFyYW1ldGVycycgOiAnR2VhciAnICsgKGkgKyAxKTsNCiAgICAgICAgICBlbHMucmVzdWx0c0NvbnRlbnQuYXBwZW5kQ2hpbGQocmVuZGVyR2VhckJsb2NrKGJsb2NrVGl0bGUsIGdlYXJzW2ldKSk7DQogICAgICAgIH0NCg0KICAgICAgICBlbHMucmVzdWx0c1BhbmVsLmNsYXNzTGlzdC5hZGQoJ3NnbWMtdmlzaWJsZScpOw0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgIH0NCg0KICAgICAgZnVuY3Rpb24gc2V0TW9kZShtb2RlKSB7DQogICAgICAgIHZhciBqOw0KICAgICAgICBjdXJyZW50TW9kZSA9IG1vZGU7DQogICAgICAgIGZvciAoaiA9IDA7IGogPCBlbHMudGFicy5sZW5ndGg7IGorKykgew0KICAgICAgICAgIHZhciB0YWIgPSBlbHMudGFic1tqXTsNCiAgICAgICAgICB2YXIgYWN0aXZlID0gdGFiLmdldEF0dHJpYnV0ZSgnZGF0YS1tb2RlJykgPT09IG1vZGU7DQogICAgICAgICAgaWYgKGFjdGl2ZSkgew0KICAgICAgICAgICAgdGFiLmNsYXNzTGlzdC5hZGQoJ3NnbWMtYWN0aXZlJyk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRhYi5jbGFzc0xpc3QucmVtb3ZlKCdzZ21jLWFjdGl2ZScpOw0KICAgICAgICAgIH0NCiAgICAgICAgICB0YWIuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgYWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJyk7DQogICAgICAgIH0NCiAgICAgICAgZm9yIChqID0gMDsgaiA8IGVscy5tb2RlUGFuZWxzLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgdmFyIHBhbmVsID0gZWxzLm1vZGVQYW5lbHNbal07DQogICAgICAgICAgaWYgKHBhbmVsLmlkID09PSAnc2dtYy1tb2RlLScgKyBtb2RlLnRvTG93ZXJDYXNlKCkpIHsNCiAgICAgICAgICAgIHBhbmVsLmNsYXNzTGlzdC5hZGQoJ3NnbWMtYWN0aXZlJyk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHBhbmVsLmNsYXNzTGlzdC5yZW1vdmUoJ3NnbWMtYWN0aXZlJyk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGhpZGVSZXN1bHRzKCk7DQogICAgICB9DQoNCiAgICAgIGZ1bmN0aW9uIHNldFVuaXQodW5pdCkgew0KICAgICAgICB2YXIgcHJldlVuaXQgPSBjdXJyZW50VW5pdDsNCiAgICAgICAgdmFyIGs7DQogICAgICAgIGN1cnJlbnRVbml0ID0gdW5pdDsNCg0KICAgICAgICBpZiAocHJldlVuaXQgIT09IHVuaXQpIHsNCiAgICAgICAgICBpZiAoY3VycmVudE1vZGUgPT09ICdBJykgew0KICAgICAgICAgICAgdmFyIHJEMiA9IHZhbGlkYXRlTnVtYmVyKGVscy5pbnB1dHMuYUQudmFsdWUsIHsgbmFtZTogJ2QnLCBtaW46IDAsIGFsbG93WmVybzogZmFsc2UgfSk7DQogICAgICAgICAgICBpZiAockQyLnZhbGlkKSB7DQogICAgICAgICAgICAgIGVscy5pbnB1dHMuYUQudmFsdWUgPSBmbXQoZnJvbU1tKHRvTW0ockQyLnZhbHVlLCBwcmV2VW5pdCksIHVuaXQpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdmFyIHJBMiA9IHZhbGlkYXRlTnVtYmVyKGVscy5pbnB1dHMuYkEudmFsdWUsIHsgbmFtZTogJ2EnLCBtaW46IDAsIGFsbG93WmVybzogZmFsc2UgfSk7DQogICAgICAgICAgICBpZiAockEyLnZhbGlkKSB7DQogICAgICAgICAgICAgIGVscy5pbnB1dHMuYkEudmFsdWUgPSBmbXQoZnJvbU1tKHRvTW0ockEyLnZhbHVlLCBwcmV2VW5pdCksIHVuaXQpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodW5pdCA9PT0gJ21tJykgew0KICAgICAgICAgIGVscy5idG5NbS5jbGFzc0xpc3QuYWRkKCdzZ21jLWFjdGl2ZScpOw0KICAgICAgICAgIGVscy5idG5Jbi5jbGFzc0xpc3QucmVtb3ZlKCdzZ21jLWFjdGl2ZScpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGVscy5idG5NbS5jbGFzc0xpc3QucmVtb3ZlKCdzZ21jLWFjdGl2ZScpOw0KICAgICAgICAgIGVscy5idG5Jbi5jbGFzc0xpc3QuYWRkKCdzZ21jLWFjdGl2ZScpOw0KICAgICAgICB9DQogICAgICAgIGVscy5idG5NbS5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIHVuaXQgPT09ICdtbScgPyAndHJ1ZScgOiAnZmFsc2UnKTsNCiAgICAgICAgZWxzLmJ0bkluLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgdW5pdCA9PT0gJ2luJyA\/ICd0cnVlJyA6ICdmYWxzZScpOw0KICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZWxzLmxlbmd0aFVuaXRzLmxlbmd0aDsgaysrKSB7DQogICAgICAgICAgZWxzLmxlbmd0aFVuaXRzW2tdLnRleHRDb250ZW50ID0gbGVuZ3RoU3VmZml4KCk7DQogICAgICAgIH0NCiAgICAgICAgaGlkZVJlc3VsdHMoKTsNCiAgICAgIH0NCg0KICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBlbHMudGFicy5sZW5ndGg7IHQrKykgew0KICAgICAgICBlbHMudGFic1t0XS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICBzZXRNb2RlKHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLW1vZGUnKSk7DQogICAgICAgIH0pOw0KICAgICAgfQ0KDQogICAgICBlbHMuYnRuTW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7IHNldFVuaXQoJ21tJyk7IH0pOw0KICAgICAgZWxzLmJ0bkluLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBzZXRVbml0KCdpbicpOyB9KTsNCiAgICAgIGVscy5idG5DYWxjdWxhdGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjYWxjdWxhdGUpOw0KDQogICAgICB2YXIgaW5wdXRLZXlzID0gWydhRCcsICdhWicsICdiQScsICdiWjEnLCAnYloyJ107DQogICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGlucHV0S2V5cy5sZW5ndGg7IG4rKykgew0KICAgICAgICBpZiAoZWxzLmlucHV0c1tpbnB1dEtleXNbbl1dKSB7DQogICAgICAgICAgZWxzLmlucHV0c1tpbnB1dEtleXNbbl1dLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgaGlkZVJlc3VsdHMpOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIHdpbmRvdy5zZ21jQ2FsY3VsYXRlID0gY2FsY3VsYXRlOw0KICAgIH0NCg0KICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHsNCiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBzZ21jSW5pdENhbGN1bGF0b3IpOw0KICAgIH0gZWxzZSB7DQogICAgICBzZ21jSW5pdENhbGN1bGF0b3IoKTsNCiAgICB9'));\n<\/script>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>The Spur Gear Module Calculator is a free online engineering tool that helps mechanical engineers, gear designers, and manufacturers accurately calculate the module of spur&#8230;<\/p>","protected":false},"author":2,"featured_media":24547,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"pmpro_default_level":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[8520],"tags":[3673,8540,2234,8541],"class_list":["post-24546","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mechanical-basic-component-design","tag-gear-calculator","tag-gear-module","tag-mechanical-design","tag-spur-gear","pmpro-has-access"],"acf":[],"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/07\/Spur-Gear-Module-Calculator.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24546","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/comments?post=24546"}],"version-history":[{"count":3,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24546\/revisions"}],"predecessor-version":[{"id":24550,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24546\/revisions\/24550"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/media\/24547"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/media?parent=24546"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/categories?post=24546"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/tags?post=24546"}],"curies":[{"name":"WP","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}