{"id":24727,"date":"2026-08-27T03:35:49","date_gmt":"2026-08-27T03:35:49","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24727"},"modified":"2026-08-27T05:05:46","modified_gmt":"2026-08-27T05:05:46","slug":"compression-spring-rate-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/es\/compression-spring-rate-calculator\/","title":{"rendered":"Compression Spring Rate Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Compression Spring Rate Calculator<\/strong> is a practical engineering tool designed to calculate the stiffness, spring rate, force, and deflection of helical compression springs. By entering key parameters such as wire diameter, mean coil diameter, number of active coils, and material shear modulus, users can quickly evaluate spring performance for mechanical design and component selection. The Compression Spring Rate Calculator helps engineers improve spring sizing accuracy, compare design options, and reduce the risk of excessive deflection or unsuitable spring stiffness.<\/p>\n\n\n\n<!-- Copy ALL content below into WordPress Custom HTML block -->\n<!-- Do NOT include DOCTYPE, html, head, or body tags -->\n<style>\n\/* Compression Spring Rate Calculator - WordPress hardened styles *\/\n\/* All rules scoped to #csrc-calculator - does not affect page outside the calculator *\/\n\n#csrc-calculator.csrc-calculator,\n#csrc-calculator.csrc-calculator *,\n#csrc-calculator.csrc-calculator *::before,\n#csrc-calculator.csrc-calculator *::after {\n  box-sizing: border-box;\n}\n\n#csrc-calculator.csrc-calculator {\n  --csrc-bg: #ffffff;\n  --csrc-surface: #ffffff;\n  --csrc-border: #d8dee8;\n  --csrc-text: #1a2332;\n  --csrc-text-muted: #5a6778;\n  --csrc-primary: #1e4d8c;\n  --csrc-primary-light: #2a6cb8;\n  --csrc-primary-bg: #e8f0fa;\n  --csrc-danger: #dc2626;\n  --csrc-danger-bg: #fef2f2;\n  --csrc-warning: #d97706;\n  --csrc-warning-bg: #fffbeb;\n  --csrc-success: #059669;\n  --csrc-success-bg: #ecfdf5;\n  --csrc-radius: 10px;\n  --csrc-shadow: 0 2px 12px rgba(30, 77, 140, 0.08);\n  --csrc-font: 'Segoe UI', system-ui, -apple-system, BlinkMacSystemFont, sans-serif;\n\n  display: block !important;\n  width: 100% !important;\n  max-width: 1000px !important;\n  margin: 0 auto !important;\n  padding: 24px 16px 48px !important;\n  font-family: var(--csrc-font) !important;\n  font-size: 16px !important;\n  line-height: 1.6 !important;\n  color: var(--csrc-text) !important;\n  background: var(--csrc-bg) !important;\n  text-align: left !important;\n  float: none !important;\n  clear: none !important;\n  position: relative !important;\n  isolation: isolate;\n}\n\n#csrc-calculator.csrc-calculator [hidden] {\n  display: none !important;\n}\n\n#csrc-calculator.csrc-calculator h2,\n#csrc-calculator.csrc-calculator h3,\n#csrc-calculator.csrc-calculator p,\n#csrc-calculator.csrc-calculator div,\n#csrc-calculator.csrc-calculator span,\n#csrc-calculator.csrc-calculator sub {\n  font-family: inherit;\n  line-height: inherit;\n}\n\n#csrc-calculator.csrc-calculator h2 {\n  font-family: var(--csrc-font) !important;\n  font-size: 1.1rem !important;\n  font-weight: 700 !important;\n  color: var(--csrc-primary) !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  border: none !important;\n  background: none !important;\n  text-transform: none !important;\n  letter-spacing: normal !important;\n}\n\n#csrc-calculator.csrc-calculator label {\n  display: block;\n  font-family: var(--csrc-font) !important;\n  font-size: 0.9rem !important;\n  font-weight: 500 !important;\n  color: var(--csrc-text) !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  border: none !important;\n  background: none !important;\n  text-transform: none !important;\n  letter-spacing: normal !important;\n  float: none !important;\n  cursor: default;\n}\n\n#csrc-calculator.csrc-calculator input[type=\"number\"],\n#csrc-calculator.csrc-calculator select {\n  display: block !important;\n  width: 100% !important;\n  max-width: 100% !important;\n  padding: 9px 12px !important;\n  border: 1px solid var(--csrc-border) !important;\n  border-radius: 6px !important;\n  font-family: var(--csrc-font) !important;\n  font-size: 0.95rem !important;\n  font-weight: 400 !important;\n  color: var(--csrc-text) !important;\n  background: #fafbfc !important;\n  margin: 0 !important;\n  height: auto !important;\n  min-height: 38px !important;\n  line-height: 1.4 !important;\n  box-shadow: none !important;\n  float: none !important;\n  clear: none !important;\n  text-transform: none !important;\n  letter-spacing: normal !important;\n  appearance: auto !important;\n  -webkit-appearance: auto !important;\n}\n\n#csrc-calculator.csrc-calculator input[type=\"radio\"],\n#csrc-calculator.csrc-calculator input[type=\"checkbox\"] {\n  display: inline-block !important;\n  width: auto !important;\n  min-height: auto !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  border: none !important;\n  background: transparent !important;\n  box-shadow: none !important;\n  float: none !important;\n  vertical-align: middle !important;\n  accent-color: var(--csrc-primary);\n}\n\n#csrc-calculator.csrc-calculator button {\n  display: inline-block !important;\n  font-family: var(--csrc-font) !important;\n  font-size: 0.95rem !important;\n  font-weight: 600 !important;\n  line-height: 1.4 !important;\n  text-transform: none !important;\n  letter-spacing: normal !important;\n  box-shadow: none !important;\n  float: none !important;\n  clear: none !important;\n  margin: 0 !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-layout {\n  display: flex !important;\n  flex-direction: column !important;\n  gap: 24px;\n  width: 100% !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-results-section[hidden] {\n  display: none !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-panel-header {\n  display: flex !important;\n  align-items: center;\n  justify-content: space-between;\n  gap: 16px;\n  margin-bottom: 20px !important;\n  padding-bottom: 10px !important;\n  border-bottom: 2px solid var(--csrc-primary-bg) !important;\n  flex-wrap: wrap;\n}\n\n#csrc-calculator.csrc-calculator .csrc-unit-bar {\n  display: flex !important;\n  align-items: center;\n  gap: 10px;\n  flex-shrink: 0;\n  margin: 0 !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-unit-bar label {\n  font-weight: 600 !important;\n  font-size: 0.88rem !important;\n  white-space: nowrap;\n}\n\n#csrc-calculator.csrc-calculator .csrc-unit-toggle {\n  display: flex !important;\n  background: var(--csrc-surface) !important;\n  border: 1px solid var(--csrc-border) !important;\n  border-radius: 8px !important;\n  overflow: hidden;\n}\n\n#csrc-calculator.csrc-calculator .csrc-unit-toggle button {\n  padding: 6px 16px !important;\n  border: none !important;\n  background: transparent !important;\n  cursor: pointer !important;\n  font-size: 0.85rem !important;\n  font-weight: 500 !important;\n  color: var(--csrc-text-muted) !important;\n  transition: background 0.2s, color 0.2s;\n  border-radius: 0 !important;\n  min-width: 0 !important;\n  width: auto !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-unit-toggle button.csrc-active {\n  background: var(--csrc-primary) !important;\n  color: #fff !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-unit-toggle button:not(.csrc-active):hover {\n  background: var(--csrc-primary-bg) !important;\n  color: var(--csrc-primary) !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-panel {\n  display: block !important;\n  width: 100% !important;\n  background: var(--csrc-surface) !important;\n  border: 1px solid var(--csrc-border) !important;\n  border-radius: var(--csrc-radius) !important;\n  box-shadow: var(--csrc-shadow);\n  padding: 24px !important;\n  margin: 0 !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-panel-title {\n  font-size: 1.1rem !important;\n  font-weight: 700 !important;\n  color: var(--csrc-primary) !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  border: none !important;\n  background: none !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-panel > .csrc-panel-title {\n  margin: 0 0 20px !important;\n  padding-bottom: 10px !important;\n  border-bottom: 2px solid var(--csrc-primary-bg) !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-section-label {\n  display: block !important;\n  font-size: 0.78rem !important;\n  font-weight: 700 !important;\n  text-transform: uppercase;\n  letter-spacing: 0.06em;\n  color: var(--csrc-text-muted) !important;\n  margin: 18px 0 12px !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-section-label:first-of-type {\n  margin-top: 0 !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-form-row {\n  display: block !important;\n  margin-bottom: 14px !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-form-row label {\n  display: flex !important;\n  align-items: center;\n  gap: 6px;\n  font-size: 0.9rem !important;\n  margin-bottom: 5px !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-input-group {\n  display: flex !important;\n  gap: 8px;\n  align-items: stretch;\n  width: 100% !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-input-group input {\n  flex: 1 1 auto;\n  min-width: 0 !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-input-group select,\n#csrc-calculator.csrc-calculator .csrc-unit-tag {\n  flex: 0 0 58px !important;\n  width: 58px !important;\n  min-width: 58px !important;\n  max-width: 58px !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-unit-tag {\n  display: flex !important;\n  align-items: center;\n  justify-content: center;\n  padding: 0 6px !important;\n  background: var(--csrc-primary-bg) !important;\n  border: 1px solid var(--csrc-border) !important;\n  border-radius: 6px !important;\n  font-size: 0.85rem !important;\n  font-weight: 600 !important;\n  color: var(--csrc-primary) !important;\n  min-height: 38px !important;\n  text-align: center !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-input-group select {\n  width: 58px !important;\n  padding: 9px 4px !important;\n  text-align: center !important;\n  text-align-last: center !important;\n  background: var(--csrc-primary-bg) !important;\n  font-size: 0.85rem !important;\n  font-weight: 600 !important;\n  color: var(--csrc-primary) !important;\n  cursor: pointer !important;\n}\n\n#csrc-calculator.csrc-calculator input:focus,\n#csrc-calculator.csrc-calculator select:focus {\n  outline: none !important;\n  border-color: var(--csrc-primary-light) !important;\n  box-shadow: 0 0 0 3px rgba(42, 108, 184, 0.15) !important;\n  background: #fff !important;\n}\n\n#csrc-calculator.csrc-calculator input.csrc-error {\n  border-color: var(--csrc-danger) !important;\n  background: var(--csrc-danger-bg) !important;\n}\n\n#csrc-calculator.csrc-calculator input.csrc-readonly {\n  background: #f1f5f9 !important;\n  color: var(--csrc-text-muted) !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-radio-group {\n  display: flex !important;\n  flex-wrap: wrap;\n  gap: 12px 16px;\n  margin-bottom: 10px !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-radio-group label {\n  display: flex !important;\n  align-items: center;\n  gap: 6px;\n  font-size: 0.85rem !important;\n  cursor: pointer !important;\n  margin: 0 !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-radio-group input {\n  width: auto !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-checkbox-row {\n  display: flex !important;\n  align-items: center;\n  gap: 8px;\n  margin-bottom: 10px !important;\n  font-size: 0.88rem !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-checkbox-row label {\n  display: inline !important;\n  margin: 0 !important;\n  cursor: pointer !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-checkbox-row input {\n  width: auto !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-tooltip-trigger {\n  display: inline-flex !important;\n  align-items: center;\n  justify-content: center;\n  width: 16px;\n  height: 16px;\n  border-radius: 50%;\n  background: var(--csrc-primary-bg) !important;\n  color: var(--csrc-primary) !important;\n  font-size: 0.7rem !important;\n  font-weight: 700 !important;\n  cursor: help !important;\n  position: relative;\n  flex-shrink: 0;\n  border: none !important;\n  padding: 0 !important;\n  margin: 0 !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-tooltip-trigger .csrc-tooltip-text {\n  visibility: hidden;\n  opacity: 0;\n  position: absolute;\n  bottom: calc(100% + 8px);\n  left: 50%;\n  transform: translateX(-50%);\n  background: var(--csrc-text) !important;\n  color: #fff !important;\n  font-size: 0.78rem !important;\n  font-weight: 400 !important;\n  line-height: 1.4 !important;\n  padding: 8px 12px !important;\n  border-radius: 6px !important;\n  width: 240px;\n  z-index: 100;\n  transition: opacity 0.2s;\n  pointer-events: none;\n  text-align: left !important;\n  border: none !important;\n  margin: 0 !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-tooltip-trigger:hover .csrc-tooltip-text,\n#csrc-calculator.csrc-calculator .csrc-tooltip-trigger:focus .csrc-tooltip-text {\n  visibility: visible;\n  opacity: 1;\n}\n\n#csrc-calculator.csrc-calculator .csrc-btn-row {\n  display: flex !important;\n  justify-content: center !important;\n  margin-top: 20px !important;\n  width: 100% !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-btn {\n  padding: 11px 24px !important;\n  border: none !important;\n  border-radius: 8px !important;\n  cursor: pointer !important;\n  transition: background 0.2s;\n}\n\n#csrc-calculator.csrc-calculator .csrc-btn-primary {\n  background: var(--csrc-primary) !important;\n  color: #fff !important;\n  width: 33.333% !important;\n  min-width: 140px !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-btn-primary:hover {\n  background: var(--csrc-primary-light) !important;\n  color: #fff !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-alerts {\n  margin-bottom: 16px !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-alert {\n  padding: 10px 14px !important;\n  border-radius: 6px !important;\n  font-size: 0.88rem !important;\n  margin-bottom: 8px !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-alert-error {\n  background: var(--csrc-danger-bg) !important;\n  color: var(--csrc-danger) !important;\n  border: 1px solid #fecaca !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-alert-warning {\n  background: var(--csrc-warning-bg) !important;\n  color: var(--csrc-warning) !important;\n  border: 1px solid #fde68a !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-result-hero {\n  text-align: center !important;\n  padding: 20px !important;\n  background: linear-gradient(135deg, var(--csrc-primary-bg), #f0f7ff) !important;\n  border-radius: var(--csrc-radius) !important;\n  margin-bottom: 20px !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-result-hero-label {\n  font-size: 0.85rem !important;\n  font-weight: 600 !important;\n  color: var(--csrc-text-muted) !important;\n  text-transform: uppercase;\n  letter-spacing: 0.05em;\n}\n\n#csrc-calculator.csrc-calculator .csrc-result-hero-value {\n  font-size: 2rem !important;\n  font-weight: 800 !important;\n  color: var(--csrc-primary) !important;\n  line-height: 1.2 !important;\n  margin: 4px 0 !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-result-hero-unit {\n  font-size: 0.95rem !important;\n  color: var(--csrc-text-muted) !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-rate-alt-wrap {\n  margin-top: 6px !important;\n  font-size: 0.85rem !important;\n  color: var(--csrc-text-muted) !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-result-grid {\n  display: grid !important;\n  grid-template-columns: 1fr 1fr;\n  gap: 12px;\n  width: 100% !important;\n}\n\n@media (max-width: 520px) {\n  #csrc-calculator.csrc-calculator .csrc-result-grid {\n    grid-template-columns: 1fr !important;\n  }\n}\n\n#csrc-calculator.csrc-calculator .csrc-result-item {\n  padding: 12px 14px !important;\n  background: #f8fafc !important;\n  border-radius: 8px !important;\n  border: 1px solid var(--csrc-border) !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-result-item-full {\n  grid-column: 1 \/ -1;\n  text-align: center !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-status-wrap {\n  margin-top: 6px !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-result-item-label {\n  font-size: 0.78rem !important;\n  font-weight: 600 !important;\n  color: var(--csrc-text-muted) !important;\n  text-transform: uppercase;\n  letter-spacing: 0.04em;\n  margin-bottom: 4px !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-result-item-value {\n  font-size: 1.15rem !important;\n  font-weight: 700 !important;\n  color: var(--csrc-text) !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-result-item-unit {\n  font-size: 0.82rem !important;\n  color: var(--csrc-text-muted) !important;\n  font-weight: 500 !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-status-badge {\n  display: inline-block !important;\n  padding: 6px 14px !important;\n  border-radius: 20px !important;\n  font-size: 0.88rem !important;\n  font-weight: 700 !important;\n  border: none !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-status-badge.csrc-success {\n  background: var(--csrc-success-bg) !important;\n  color: var(--csrc-success) !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-status-badge.csrc-warning {\n  background: var(--csrc-warning-bg) !important;\n  color: var(--csrc-warning) !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-status-badge.csrc-danger {\n  background: var(--csrc-danger-bg) !important;\n  color: var(--csrc-danger) !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-index-hint {\n  font-size: 0.82rem !important;\n  margin-top: 4px !important;\n}\n\n#csrc-calculator.csrc-calculator .csrc-index-hint.csrc-success { color: var(--csrc-success) !important; }\n#csrc-calculator.csrc-calculator .csrc-index-hint.csrc-warning { color: var(--csrc-warning) !important; }\n#csrc-calculator.csrc-calculator .csrc-index-hint.csrc-danger { color: var(--csrc-danger) !important; }\n\n<\/style>\n\n<div id=\"csrc-calculator\" class=\"csrc-calculator\">\n\n  <div class=\"csrc-layout\">\n\n    <!-- INPUTS -->\n    <div class=\"csrc-panel\">\n      <div class=\"csrc-panel-header\">\n        <h2 class=\"csrc-panel-title\">Input Parameters<\/h2>\n        <div class=\"csrc-unit-bar\">\n          <label>Unit System<\/label>\n          <div class=\"csrc-unit-toggle\">\n            <button type=\"button\" id=\"csrc-unit-metric\" class=\"csrc-active\">Metric<\/button>\n            <button type=\"button\" id=\"csrc-unit-imperial\">Imperial<\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"csrc-section-label\">Spring Geometry<\/div>\n\n      <div class=\"csrc-form-row\">\n        <label for=\"csrc-wire-d\">\n          Wire Diameter (d)\n          <span class=\"csrc-tooltip-trigger\" tabindex=\"0\">?\n            <span class=\"csrc-tooltip-text\">Diameter of the spring wire. Must be greater than zero.<\/span>\n          <\/span>\n        <\/label>\n        <div class=\"csrc-input-group\">\n          <input type=\"number\" id=\"csrc-wire-d\" value=\"3\" min=\"0\" step=\"any\">\n          <span class=\"csrc-unit-tag\" data-csrc-unit-len>mm<\/span>\n        <\/div>\n      <\/div>\n\n      <div class=\"csrc-form-row\">\n        <label>Mean Diameter Source<\/label>\n        <div class=\"csrc-radio-group\">\n          <label><input type=\"radio\" name=\"csrc-mean-mode\" id=\"csrc-mean-mode-od\" value=\"od\" checked> From OD (D = OD &#8211; d)<\/label>\n          <label><input type=\"radio\" name=\"csrc-mean-mode\" id=\"csrc-mean-mode-id\" value=\"id\"> From ID (D = ID + d)<\/label>\n          <label><input type=\"radio\" name=\"csrc-mean-mode\" id=\"csrc-mean-mode-manual\" value=\"manual\"> Manual D<\/label>\n        <\/div>\n      <\/div>\n\n      <div class=\"csrc-form-row\">\n        <label for=\"csrc-outer-d\">\n          Outer Coil Diameter (OD)\n          <span class=\"csrc-tooltip-trigger\" tabindex=\"0\">?\n            <span class=\"csrc-tooltip-text\">Optional. Used to calculate mean coil diameter: D = OD &#8211; d.<\/span>\n          <\/span>\n        <\/label>\n        <div class=\"csrc-input-group\">\n          <input type=\"number\" id=\"csrc-outer-d\" value=\"30\" min=\"0\" step=\"any\">\n          <span class=\"csrc-unit-tag\" data-csrc-unit-len>mm<\/span>\n        <\/div>\n      <\/div>\n\n      <div class=\"csrc-form-row\">\n        <label for=\"csrc-inner-d\">\n          Inner Coil Diameter (ID)\n          <span class=\"csrc-tooltip-trigger\" tabindex=\"0\">?\n            <span class=\"csrc-tooltip-text\">Optional. Used to calculate mean coil diameter: D = ID + d.<\/span>\n          <\/span>\n        <\/label>\n        <div class=\"csrc-input-group\">\n          <input type=\"number\" id=\"csrc-inner-d\" value=\"\" min=\"0\" step=\"any\" placeholder=\"Optional\">\n          <span class=\"csrc-unit-tag\" data-csrc-unit-len>mm<\/span>\n        <\/div>\n      <\/div>\n\n      <div class=\"csrc-form-row\">\n        <label for=\"csrc-mean-d\">\n          Mean Coil Diameter (D)\n          <span class=\"csrc-tooltip-trigger\" tabindex=\"0\">?\n            <span class=\"csrc-tooltip-text\">Average diameter of the spring coil centerline. Critical for spring rate calculation.<\/span>\n          <\/span>\n        <\/label>\n        <div class=\"csrc-input-group\">\n          <input type=\"number\" id=\"csrc-mean-d\" value=\"27\" min=\"0\" step=\"any\" class=\"csrc-readonly\" readonly>\n          <span class=\"csrc-unit-tag\" data-csrc-unit-len>mm<\/span>\n        <\/div>\n      <\/div>\n\n      <div class=\"csrc-form-row\">\n        <label for=\"csrc-total-coils\">\n          Total Number of Coils (Nt)\n          <span class=\"csrc-tooltip-trigger\" tabindex=\"0\">?\n            <span class=\"csrc-tooltip-text\">Total coil count including end coils. Used for solid height estimation.<\/span>\n          <\/span>\n        <\/label>\n        <input type=\"number\" id=\"csrc-total-coils\" value=\"10\" min=\"0\" step=\"any\">\n      <\/div>\n\n      <div class=\"csrc-form-row\">\n        <label for=\"csrc-end-type\">\n          Spring End Type\n          <span class=\"csrc-tooltip-trigger\" tabindex=\"0\">?\n            <span class=\"csrc-tooltip-text\">End configuration affects the number of active coils used in the rate formula.<\/span>\n          <\/span>\n        <\/label>\n        <select id=\"csrc-end-type\">\n          <option value=\"plain\">Plain Ends<\/option>\n          <option value=\"plainGround\">Plain and Ground<\/option>\n          <option value=\"squared\">Squared\/Closed Ends<\/option>\n          <option value=\"squaredGround\" selected>Squared and Ground<\/option>\n        <\/select>\n      <\/div>\n\n      <div class=\"csrc-checkbox-row\">\n        <input type=\"checkbox\" id=\"csrc-auto-active\" checked>\n        <label for=\"csrc-auto-active\">Auto-estimate active coils from end type<\/label>\n      <\/div>\n\n      <div class=\"csrc-form-row\">\n        <label for=\"csrc-active-coils\">\n          Number of Active Coils (Na)\n          <span class=\"csrc-tooltip-trigger\" tabindex=\"0\">?\n            <span class=\"csrc-tooltip-text\">Coils that contribute to spring rate. At least one active coil is required.<\/span>\n          <\/span>\n        <\/label>\n        <input type=\"number\" id=\"csrc-active-coils\" value=\"8\" min=\"0\" step=\"any\" class=\"csrc-readonly\" readonly>\n      <\/div>\n\n      <div class=\"csrc-section-label\">Material Properties<\/div>\n\n      <div class=\"csrc-form-row\">\n        <label for=\"csrc-material\">\n          Material\n          <span class=\"csrc-tooltip-trigger\" tabindex=\"0\">?\n            <span class=\"csrc-tooltip-text\">Select a common spring material preset or choose Custom Material to enter your own shear modulus.<\/span>\n          <\/span>\n        <\/label>\n        <select id=\"csrc-material\">\n          <option value=\"musicWire\" selected>Music Wire<\/option>\n          <option value=\"stainless\">Stainless Steel<\/option>\n          <option value=\"chromeSilicon\">Chrome Silicon<\/option>\n          <option value=\"chromeVanadium\">Chrome Vanadium<\/option>\n          <option value=\"oilTempered\">Oil Tempered Wire<\/option>\n          <option value=\"custom\">Custom Material<\/option>\n        <\/select>\n      <\/div>\n\n      <div class=\"csrc-form-row\">\n        <label for=\"csrc-shear-g\">\n          Shear Modulus (G)\n          <span class=\"csrc-tooltip-trigger\" tabindex=\"0\">?\n            <span class=\"csrc-tooltip-text\">Material shear modulus. Override with manufacturer data for critical applications.<\/span>\n          <\/span>\n        <\/label>\n        <div class=\"csrc-input-group\">\n          <input type=\"number\" id=\"csrc-shear-g\" value=\"79\" min=\"0\" step=\"any\">\n          <select id=\"csrc-shear-g-unit\">\n            <option value=\"GPa\" selected>GPa<\/option>\n            <option value=\"MPa\">MPa<\/option>\n          <\/select>\n        <\/div>\n      <\/div>\n\n      <div class=\"csrc-section-label\">Load &amp; Deflection (Optional)<\/div>\n\n      <div class=\"csrc-form-row\">\n        <label for=\"csrc-applied-load\">\n          Applied Load (F)\n          <span class=\"csrc-tooltip-trigger\" tabindex=\"0\">?\n            <span class=\"csrc-tooltip-text\">Axial compression force. Used to calculate spring deflection: d = F \/ k.<\/span>\n          <\/span>\n        <\/label>\n        <div class=\"csrc-input-group\">\n          <input type=\"number\" id=\"csrc-applied-load\" value=\"100\" min=\"0\" step=\"any\">\n          <select id=\"csrc-load-unit\">\n            <option value=\"N\" selected>N<\/option>\n            <option value=\"kN\">kN<\/option>\n          <\/select>\n        <\/div>\n      <\/div>\n\n      <div class=\"csrc-form-row\">\n        <label for=\"csrc-target-deflection\">\n          Target Deflection (d)\n          <span class=\"csrc-tooltip-trigger\" tabindex=\"0\">?\n            <span class=\"csrc-tooltip-text\">Desired compression distance. Used to calculate required force: F = k x d.<\/span>\n          <\/span>\n        <\/label>\n        <div class=\"csrc-input-group\">\n          <input type=\"number\" id=\"csrc-target-deflection\" value=\"\" min=\"0\" step=\"any\" placeholder=\"Optional\">\n          <span class=\"csrc-unit-tag\" data-csrc-unit-len>mm<\/span>\n        <\/div>\n      <\/div>\n\n      <div class=\"csrc-form-row\">\n        <label for=\"csrc-free-length\">\n          Free Length (L<sub>free<\/sub>)\n          <span class=\"csrc-tooltip-trigger\" tabindex=\"0\">?\n            <span class=\"csrc-tooltip-text\">Unloaded spring length. Used to estimate maximum available deflection.<\/span>\n          <\/span>\n        <\/label>\n        <div class=\"csrc-input-group\">\n          <input type=\"number\" id=\"csrc-free-length\" value=\"60\" min=\"0\" step=\"any\">\n          <span class=\"csrc-unit-tag\" data-csrc-unit-len>mm<\/span>\n        <\/div>\n      <\/div>\n\n      <div class=\"csrc-btn-row\">\n        <button type=\"button\" id=\"csrc-btn-calculate\" class=\"csrc-btn csrc-btn-primary\">Calculate<\/button>\n      <\/div>\n    <\/div>\n\n    <!-- RESULTS -->\n    <div id=\"csrc-results-section\" class=\"csrc-results-section\" hidden>\n      <div id=\"csrc-warnings\" class=\"csrc-alerts\" hidden><\/div>\n\n      <div id=\"csrc-results-panel\" class=\"csrc-panel\">\n        <h2 class=\"csrc-panel-title\">Calculation Results<\/h2>\n\n        <div class=\"csrc-result-hero\">\n          <div class=\"csrc-result-hero-label\">Spring Rate \/ Stiffness<\/div>\n          <div class=\"csrc-result-hero-value\" id=\"csrc-res-rate\">&#8211;<\/div>\n          <div class=\"csrc-result-hero-unit\"><span id=\"csrc-rate-unit-label\">N\/mm<\/span><\/div>\n          <div id=\"csrc-res-rate-alt-wrap\" class=\"csrc-rate-alt-wrap\">\n            <span id=\"csrc-res-rate-alt\">&#8211;<\/span> N\/m\n          <\/div>\n        <\/div>\n\n        <div class=\"csrc-result-grid\">\n          <div class=\"csrc-result-item\">\n            <div class=\"csrc-result-item-label\">Calculated Deflection<\/div>\n            <div class=\"csrc-result-item-value\" id=\"csrc-res-deflection\">&#8211;<\/div>\n            <div class=\"csrc-result-item-unit\" data-csrc-unit-len>mm<\/div>\n          <\/div>\n          <div class=\"csrc-result-item\">\n            <div class=\"csrc-result-item-label\">Required Spring Force<\/div>\n            <div class=\"csrc-result-item-value\" id=\"csrc-res-force\">&#8211;<\/div>\n            <div class=\"csrc-result-item-unit\" id=\"csrc-res-force-unit\">N<\/div>\n          <\/div>\n          <div class=\"csrc-result-item\">\n            <div class=\"csrc-result-item-label\">Mean Coil Diameter<\/div>\n            <div class=\"csrc-result-item-value\" id=\"csrc-res-mean-d\">&#8211;<\/div>\n            <div class=\"csrc-result-item-unit\" data-csrc-unit-len>mm<\/div>\n          <\/div>\n          <div class=\"csrc-result-item\">\n            <div class=\"csrc-result-item-label\">Spring Index (C)<\/div>\n            <div class=\"csrc-result-item-value\" id=\"csrc-res-index\">&#8211;<\/div>\n            <div class=\"csrc-index-hint\" id=\"csrc-res-index-hint\"><\/div>\n          <\/div>\n          <div class=\"csrc-result-item\">\n            <div class=\"csrc-result-item-label\">Estimated Solid Height<\/div>\n            <div class=\"csrc-result-item-value\" id=\"csrc-res-solid\">&#8211;<\/div>\n            <div class=\"csrc-result-item-unit\" data-csrc-unit-len>mm<\/div>\n          <\/div>\n          <div class=\"csrc-result-item\">\n            <div class=\"csrc-result-item-label\">Max Available Deflection<\/div>\n            <div class=\"csrc-result-item-value\" id=\"csrc-res-max-def\">&#8211;<\/div>\n            <div class=\"csrc-result-item-unit\" data-csrc-unit-len>mm<\/div>\n          <\/div>\n          <div class=\"csrc-result-item csrc-result-item-full\">\n            <div class=\"csrc-result-item-label\">Design Status<\/div>\n            <div class=\"csrc-status-wrap\">\n              <span class=\"csrc-status-badge csrc-success\" id=\"csrc-res-status\">Acceptable<\/span>\n            <\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n  <\/div>\n<\/div>\n<script type=\"text\/javascript\">(function(){var b=\"ZnVuY3Rpb24gaW5pdENzcmNDYWxjdWxhdG9yKCkgew0KICAgIHZhciByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNzcmMtY2FsY3VsYXRvciIpOw0KICAgIGlmICghcm9vdCkgcmV0dXJuOw0KDQogICAgdmFyIE1NX1RPX0lOID0gMSAvIDI1LjQ7DQogICAgdmFyIElOX1RPX01NID0gMjUuNDsNCiAgICB2YXIgTl9UT19MQkYgPSAxIC8gNC40NDgyMjE2MTUzOw0KICAgIHZhciBMQkZfVE9fTiA9IDQuNDQ4MjIxNjE1MzsNCiAgICB2YXIgR1BBX1RPX01QQSA9IDEwMDA7DQogICAgdmFyIEdQQV9UT19QU0kgPSAxNDUwMzcuNzM4MDA3ODcyMjM7DQogICAgdmFyIE1QQV9UT19QU0kgPSAxNDUuMDM3NzM4MDA3ODcyMjM7DQoNCiAgICB2YXIgTUFURVJJQUxTID0gew0KICAgICAgbXVzaWNXaXJlOiB7IGxhYmVsOiAiTXVzaWMgV2lyZSIsIGdHcGE6IDc5IH0sDQogICAgICBzdGFpbmxlc3M6IHsgbGFiZWw6ICJTdGFpbmxlc3MgU3RlZWwiLCBnR3BhOiA2OSB9LA0KICAgICAgY2hyb21lU2lsaWNvbjogeyBsYWJlbDogIkNocm9tZSBTaWxpY29uIiwgZ0dwYTogNzkuMyB9LA0KICAgICAgY2hyb21lVmFuYWRpdW06IHsgbGFiZWw6ICJDaHJvbWUgVmFuYWRpdW0iLCBnR3BhOiA3OS4zIH0sDQogICAgICBvaWxUZW1wZXJlZDogeyBsYWJlbDogIk9pbCBUZW1wZXJlZCBXaXJlIiwgZ0dwYTogNzcgfSwNCiAgICAgIGN1c3RvbTogeyBsYWJlbDogIkN1c3RvbSBNYXRlcmlhbCIsIGdHcGE6IG51bGwgfQ0KICAgIH07DQoNCiAgICB2YXIgRU5EX1RZUEVTID0gew0KICAgICAgcGxhaW46IHsgbGFiZWw6ICJQbGFpbiBFbmRzIiwgYWN0aXZlT2Zmc2V0OiAwIH0sDQogICAgICBwbGFpbkdyb3VuZDogeyBsYWJlbDogIlBsYWluIGFuZCBHcm91bmQiLCBhY3RpdmVPZmZzZXQ6IC0xIH0sDQogICAgICBzcXVhcmVkOiB7IGxhYmVsOiAiU3F1YXJlZC9DbG9zZWQgRW5kcyIsIGFjdGl2ZU9mZnNldDogLTIgfSwNCiAgICAgIHNxdWFyZWRHcm91bmQ6IHsgbGFiZWw6ICJTcXVhcmVkIGFuZCBHcm91bmQiLCBhY3RpdmVPZmZzZXQ6IC0yIH0NCiAgICB9Ow0KDQogICAgdmFyIHVuaXRTeXN0ZW0gPSAibWV0cmljIjsNCiAgICB2YXIgbWVhbkRNb2RlID0gIm9kIjsNCiAgICB2YXIgZ01hbnVhbGx5RWRpdGVkID0gZmFsc2U7DQoNCiAgICBmdW5jdGlvbiBieUlkKGlkKSB7DQogICAgICByZXR1cm4gcm9vdC5xdWVyeVNlbGVjdG9yKCIjIiArIGlkKTsNCiAgICB9DQoNCiAgICB2YXIgZWxzID0gew0KICAgICAgdW5pdE1ldHJpYzogYnlJZCgiY3NyYy11bml0LW1ldHJpYyIpLA0KICAgICAgdW5pdEltcGVyaWFsOiBieUlkKCJjc3JjLXVuaXQtaW1wZXJpYWwiKSwNCiAgICAgIHdpcmVEOiBieUlkKCJjc3JjLXdpcmUtZCIpLA0KICAgICAgb3V0ZXJEOiBieUlkKCJjc3JjLW91dGVyLWQiKSwNCiAgICAgIGlubmVyRDogYnlJZCgiY3NyYy1pbm5lci1kIiksDQogICAgICBtZWFuRDogYnlJZCgiY3NyYy1tZWFuLWQiKSwNCiAgICAgIG1lYW5ETW9kZU9kOiBieUlkKCJjc3JjLW1lYW4tbW9kZS1vZCIpLA0KICAgICAgbWVhbkRNb2RlSWQ6IGJ5SWQoImNzcmMtbWVhbi1tb2RlLWlkIiksDQogICAgICBtZWFuRE1vZGVNYW51YWw6IGJ5SWQoImNzcmMtbWVhbi1tb2RlLW1hbnVhbCIpLA0KICAgICAgdG90YWxDb2lsczogYnlJZCgiY3NyYy10b3RhbC1jb2lscyIpLA0KICAgICAgYWN0aXZlQ29pbHM6IGJ5SWQoImNzcmMtYWN0aXZlLWNvaWxzIiksDQogICAgICBhdXRvQWN0aXZlOiBieUlkKCJjc3JjLWF1dG8tYWN0aXZlIiksDQogICAgICBlbmRUeXBlOiBieUlkKCJjc3JjLWVuZC10eXBlIiksDQogICAgICBtYXRlcmlhbDogYnlJZCgiY3NyYy1tYXRlcmlhbCIpLA0KICAgICAgc2hlYXJHOiBieUlkKCJjc3JjLXNoZWFyLWciKSwNCiAgICAgIHNoZWFyR1VuaXQ6IGJ5SWQoImNzcmMtc2hlYXItZy11bml0IiksDQogICAgICBhcHBsaWVkTG9hZDogYnlJZCgiY3NyYy1hcHBsaWVkLWxvYWQiKSwNCiAgICAgIGxvYWRVbml0OiBieUlkKCJjc3JjLWxvYWQtdW5pdCIpLA0KICAgICAgdGFyZ2V0RGVmbGVjdGlvbjogYnlJZCgiY3NyYy10YXJnZXQtZGVmbGVjdGlvbiIpLA0KICAgICAgZnJlZUxlbmd0aDogYnlJZCgiY3NyYy1mcmVlLWxlbmd0aCIpLA0KICAgICAgYnRuQ2FsY3VsYXRlOiBieUlkKCJjc3JjLWJ0bi1jYWxjdWxhdGUiKSwNCiAgICAgIHJlc3VsdHNQYW5lbDogYnlJZCgiY3NyYy1yZXN1bHRzLXBhbmVsIiksDQogICAgICByZXN1bHRzU2VjdGlvbjogYnlJZCgiY3NyYy1yZXN1bHRzLXNlY3Rpb24iKSwNCiAgICAgIHdhcm5pbmdzOiBieUlkKCJjc3JjLXdhcm5pbmdzIikNCiAgICB9Ow0KDQogICAgaWYgKCFlbHMuYnRuQ2FsY3VsYXRlKSByZXR1cm47DQoNCiAgICB2YXIgdW5pdExhYmVscyA9IHJvb3QucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtY3NyYy11bml0LWxlbl0iKTsNCiAgICB2YXIgcmF0ZVVuaXRFbCA9IGJ5SWQoImNzcmMtcmF0ZS11bml0LWxhYmVsIik7DQoNCiAgICBmdW5jdGlvbiBwYXJzZU51bShpbnB1dCkgew0KICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIG51bGw7DQogICAgICB2YXIgdiA9IHBhcnNlRmxvYXQoU3RyaW5nKGlucHV0LnZhbHVlKS5yZXBsYWNlKC8sL2csICIiKSk7DQogICAgICByZXR1cm4gaXNOYU4odikgPyBudWxsIDogdjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBmb3JtYXROdW0odmFsdWUsIGRlY2ltYWxzKSB7DQogICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhaXNGaW5pdGUodmFsdWUpKSByZXR1cm4gIi0iOw0KICAgICAgcmV0dXJuIHZhbHVlLnRvTG9jYWxlU3RyaW5nKHVuZGVmaW5lZCwgew0KICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IGRlY2ltYWxzLA0KICAgICAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IGRlY2ltYWxzDQogICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBpc01ldHJpYygpIHsNCiAgICAgIHJldHVybiB1bml0U3lzdGVtID09PSAibWV0cmljIjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnZXRMZW5ndGhVbml0KCkgew0KICAgICAgcmV0dXJuIGlzTWV0cmljKCkgPyAibW0iIDogImluIjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnZXRSYXRlVW5pdCgpIHsNCiAgICAgIHJldHVybiBpc01ldHJpYygpID8gIk4vbW0iIDogImxiZi9pbiI7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0Rm9yY2VVbml0RGlzcGxheSgpIHsNCiAgICAgIHZhciB1ID0gZWxzLmxvYWRVbml0ID8gZWxzLmxvYWRVbml0LnZhbHVlIDogIk4iOw0KICAgICAgaWYgKGlzTWV0cmljKCkpIHJldHVybiB1Ow0KICAgICAgcmV0dXJuIHUgPT09ICJrTiIgPyAia04iIDogImxiZiI7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0TWVhbkRNb2RlKCkgew0KICAgICAgdmFyIGNoZWNrZWQgPSByb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9ImNzcmMtbWVhbi1tb2RlIl06Y2hlY2tlZCcpOw0KICAgICAgcmV0dXJuIGNoZWNrZWQgPyBjaGVja2VkLnZhbHVlIDogIm9kIjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnZXRTaGVhckdVbml0KCkgew0KICAgICAgcmV0dXJuIGVscy5zaGVhckdVbml0ID8gZWxzLnNoZWFyR1VuaXQudmFsdWUgOiAiR1BhIjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjb252ZXJ0SW5wdXRWYWx1ZShpbnB1dCwgZmFjdG9yLCBkZWNpbWFscykgew0KICAgICAgdmFyIHYgPSBwYXJzZU51bShpbnB1dCk7DQogICAgICBpZiAodiAhPT0gbnVsbCAmJiB2ICE9PSAwKSB7DQogICAgICAgIGlucHV0LnZhbHVlID0gZm9ybWF0TnVtKHYgKiBmYWN0b3IsIGRlY2ltYWxzICE9PSB1bmRlZmluZWQgPyBkZWNpbWFscyA6IDQpOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZUxlbmd0aFVuaXRMYWJlbHMoKSB7DQogICAgICB2YXIgdSA9IGdldExlbmd0aFVuaXQoKTsNCiAgICAgIHVuaXRMYWJlbHMuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsNCiAgICAgICAgZWwudGV4dENvbnRlbnQgPSB1Ow0KICAgICAgfSk7DQogICAgICBpZiAocmF0ZVVuaXRFbCkgcmF0ZVVuaXRFbC50ZXh0Q29udGVudCA9IGdldFJhdGVVbml0KCk7DQogICAgICB2YXIgZm9yY2VVbml0RWwgPSBieUlkKCJjc3JjLXJlcy1mb3JjZS11bml0Iik7DQogICAgICBpZiAoZm9yY2VVbml0RWwpIGZvcmNlVW5pdEVsLnRleHRDb250ZW50ID0gZ2V0Rm9yY2VVbml0RGlzcGxheSgpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHN5bmNTaGVhckdVbml0T3B0aW9ucygpIHsNCiAgICAgIGlmICghZWxzLnNoZWFyR1VuaXQpIHJldHVybjsNCiAgICAgIHZhciBjdXJyZW50ID0gZWxzLnNoZWFyR1VuaXQudmFsdWU7DQogICAgICBlbHMuc2hlYXJHVW5pdC5pbm5lckhUTUwgPSAiIjsNCiAgICAgIGlmIChpc01ldHJpYygpKSB7DQogICAgICAgIFsiR1BhIiwgIk1QYSJdLmZvckVhY2goZnVuY3Rpb24gKHUpIHsNCiAgICAgICAgICB2YXIgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7DQogICAgICAgICAgb3B0LnZhbHVlID0gdTsNCiAgICAgICAgICBvcHQudGV4dENvbnRlbnQgPSB1Ow0KICAgICAgICAgIGVscy5zaGVhckdVbml0LmFwcGVuZENoaWxkKG9wdCk7DQogICAgICAgIH0pOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdmFyIG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpOw0KICAgICAgICBvcHQudmFsdWUgPSAicHNpIjsNCiAgICAgICAgb3B0LnRleHRDb250ZW50ID0gInBzaSI7DQogICAgICAgIGVscy5zaGVhckdVbml0LmFwcGVuZENoaWxkKG9wdCk7DQogICAgICB9DQogICAgICBpZiAoZWxzLnNoZWFyR1VuaXQucXVlcnlTZWxlY3Rvcignb3B0aW9uW3ZhbHVlPSInICsgY3VycmVudCArICciXScpKSB7DQogICAgICAgIGVscy5zaGVhckdVbml0LnZhbHVlID0gY3VycmVudDsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGVscy5zaGVhckdVbml0LnZhbHVlID0gaXNNZXRyaWMoKSA\/ICJHUGEiIDogInBzaSI7DQogICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc3luY0xvYWRVbml0T3B0aW9ucygpIHsNCiAgICAgIGlmICghZWxzLmxvYWRVbml0KSByZXR1cm47DQogICAgICB2YXIgY3VycmVudCA9IGVscy5sb2FkVW5pdC52YWx1ZTsNCiAgICAgIGVscy5sb2FkVW5pdC5pbm5lckhUTUwgPSAiIjsNCiAgICAgIGlmIChpc01ldHJpYygpKSB7DQogICAgICAgIFsiTiIsICJrTiJdLmZvckVhY2goZnVuY3Rpb24gKHUpIHsNCiAgICAgICAgICB2YXIgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7DQogICAgICAgICAgb3B0LnZhbHVlID0gdTsNCiAgICAgICAgICBvcHQudGV4dENvbnRlbnQgPSB1Ow0KICAgICAgICAgIGVscy5sb2FkVW5pdC5hcHBlbmRDaGlsZChvcHQpOw0KICAgICAgICB9KTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHZhciBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTsNCiAgICAgICAgb3B0LnZhbHVlID0gImxiZiI7DQogICAgICAgIG9wdC50ZXh0Q29udGVudCA9ICJsYmYiOw0KICAgICAgICBlbHMubG9hZFVuaXQuYXBwZW5kQ2hpbGQob3B0KTsNCiAgICAgIH0NCiAgICAgIGlmIChlbHMubG9hZFVuaXQucXVlcnlTZWxlY3Rvcignb3B0aW9uW3ZhbHVlPSInICsgY3VycmVudCArICciXScpKSB7DQogICAgICAgIGVscy5sb2FkVW5pdC52YWx1ZSA9IGN1cnJlbnQ7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBlbHMubG9hZFVuaXQudmFsdWUgPSBpc01ldHJpYygpID8gIk4iIDogImxiZiI7DQogICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2hlYXJHVG9NcGEodmFsdWUsIHVuaXQpIHsNCiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7DQogICAgICBpZiAodW5pdCA9PT0gIkdQYSIpIHJldHVybiB2YWx1ZSAqIEdQQV9UT19NUEE7DQogICAgICBpZiAodW5pdCA9PT0gIk1QYSIpIHJldHVybiB2YWx1ZTsNCiAgICAgIGlmICh1bml0ID09PSAicHNpIikgcmV0dXJuIHZhbHVlIC8gTVBBX1RPX1BTSTsNCiAgICAgIHJldHVybiB2YWx1ZSAqIEdQQV9UT19NUEE7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gbXBhVG9EaXNwbGF5RyhtcGEpIHsNCiAgICAgIHZhciB1bml0ID0gZ2V0U2hlYXJHVW5pdCgpOw0KICAgICAgaWYgKHVuaXQgPT09ICJHUGEiKSByZXR1cm4gbXBhIC8gR1BBX1RPX01QQTsNCiAgICAgIGlmICh1bml0ID09PSAiTVBhIikgcmV0dXJuIG1wYTsNCiAgICAgIGlmICh1bml0ID09PSAicHNpIikgcmV0dXJuIG1wYSAqIE1QQV9UT19QU0k7DQogICAgICByZXR1cm4gbXBhIC8gR1BBX1RPX01QQTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBmb3JjZVRvTmV3dG9ucyh2YWx1ZSwgdW5pdCkgew0KICAgICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gbnVsbDsNCiAgICAgIGlmICh1bml0ID09PSAiTiIpIHJldHVybiB2YWx1ZTsNCiAgICAgIGlmICh1bml0ID09PSAia04iKSByZXR1cm4gdmFsdWUgKiAxMDAwOw0KICAgICAgaWYgKHVuaXQgPT09ICJsYmYiKSByZXR1cm4gdmFsdWUgKiBMQkZfVE9fTjsNCiAgICAgIHJldHVybiB2YWx1ZTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBuZXd0b25zVG9EaXNwbGF5KG4pIHsNCiAgICAgIGlmIChuID09PSBudWxsKSByZXR1cm4gbnVsbDsNCiAgICAgIHZhciB1ID0gZ2V0Rm9yY2VVbml0RGlzcGxheSgpOw0KICAgICAgaWYgKHUgPT09ICJOIikgcmV0dXJuIG47DQogICAgICBpZiAodSA9PT0gImtOIikgcmV0dXJuIG4gLyAxMDAwOw0KICAgICAgaWYgKHUgPT09ICJsYmYiKSByZXR1cm4gbiAqIE5fVE9fTEJGOw0KICAgICAgcmV0dXJuIG47DQogICAgfQ0KDQogICAgZnVuY3Rpb24gbGVuZ3RoVG9NbSh2YWx1ZSkgew0KICAgICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gbnVsbDsNCiAgICAgIHJldHVybiBpc01ldHJpYygpID8gdmFsdWUgOiB2YWx1ZSAqIElOX1RPX01NOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIG1tVG9EaXNwbGF5KG1tKSB7DQogICAgICBpZiAobW0gPT09IG51bGwpIHJldHVybiBudWxsOw0KICAgICAgcmV0dXJuIGlzTWV0cmljKCkgPyBtbSA6IG1tICogTU1fVE9fSU47DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcmF0ZVRvRGlzcGxheShuUGVyTW0pIHsNCiAgICAgIGlmIChuUGVyTW0gPT09IG51bGwpIHJldHVybiBudWxsOw0KICAgICAgcmV0dXJuIGlzTWV0cmljKCkgPyBuUGVyTW0gOiBuUGVyTW0gKiAoTEJGX1RPX04gLyBJTl9UT19NTSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZXN0aW1hdGVBY3RpdmVDb2lscyh0b3RhbCkgew0KICAgICAgaWYgKHRvdGFsID09PSBudWxsIHx8IHRvdGFsIDw9IDApIHJldHVybiBudWxsOw0KICAgICAgdmFyIGVuZEtleSA9IGVscy5lbmRUeXBlID8gZWxzLmVuZFR5cGUudmFsdWUgOiAic3F1YXJlZEdyb3VuZCI7DQogICAgICB2YXIgb2Zmc2V0ID0gRU5EX1RZUEVTW2VuZEtleV0gPyBFTkRfVFlQRVNbZW5kS2V5XS5hY3RpdmVPZmZzZXQgOiAtMjsNCiAgICAgIHJldHVybiBNYXRoLm1heCh0b3RhbCArIG9mZnNldCwgMCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY29tcHV0ZU1lYW5EaWFtZXRlck1tKHdpcmVNbSwgb3V0ZXJNbSwgaW5uZXJNbSwgbW9kZSkgew0KICAgICAgaWYgKHdpcmVNbSA9PT0gbnVsbCB8fCB3aXJlTW0gPD0gMCkgcmV0dXJuIG51bGw7DQogICAgICBpZiAobW9kZSA9PT0gIm1hbnVhbCIpIHsNCiAgICAgICAgdmFyIGQgPSBwYXJzZU51bShlbHMubWVhbkQpOw0KICAgICAgICByZXR1cm4gZCAhPT0gbnVsbCA\/IGxlbmd0aFRvTW0oZCkgOiBudWxsOw0KICAgICAgfQ0KICAgICAgaWYgKG1vZGUgPT09ICJvZCIgJiYgb3V0ZXJNbSAhPT0gbnVsbCAmJiBvdXRlck1tID4gMCkgew0KICAgICAgICByZXR1cm4gb3V0ZXJNbSAtIHdpcmVNbTsNCiAgICAgIH0NCiAgICAgIGlmIChtb2RlID09PSAiaWQiICYmIGlubmVyTW0gIT09IG51bGwgJiYgaW5uZXJNbSA+PSAwKSB7DQogICAgICAgIHJldHVybiBpbm5lck1tICsgd2lyZU1tOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIG51bGw7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2FsY1NwcmluZ1JhdGUoZ01wYSwgZE1tLCBkTWVhbk1tLCBuYSkgew0KICAgICAgaWYgKCFnTXBhIHx8ICFkTW0gfHwgIWRNZWFuTW0gfHwgIW5hIHx8IGRNbSA8PSAwIHx8IGRNZWFuTW0gPD0gMCB8fCBuYSA8PSAwKSB7DQogICAgICAgIHJldHVybiBudWxsOw0KICAgICAgfQ0KICAgICAgaWYgKGRNZWFuTW0gPD0gZE1tKSByZXR1cm4gbnVsbDsNCiAgICAgIHJldHVybiAoZ01wYSAqIE1hdGgucG93KGRNbSwgNCkpIC8gKDggKiBNYXRoLnBvdyhkTWVhbk1tLCAzKSAqIG5hKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnZXRJbmRleFN0YXR1cyhjKSB7DQogICAgICBpZiAoYyA9PT0gbnVsbCB8fCAhaXNGaW5pdGUoYykpIHJldHVybiB7IHRleHQ6ICItIiwgY2xzOiAiY3NyYy1uZXV0cmFsIiB9Ow0KICAgICAgaWYgKGMgPCA0KSByZXR1cm4geyB0ZXh0OiAiVmVyeSBMb3cgSW5kZXggLSBEaWZmaWN1bHQgdG8gbWFudWZhY3R1cmUiLCBjbHM6ICJjc3JjLWRhbmdlciIgfTsNCiAgICAgIGlmIChjID4gMTIpIHJldHVybiB7IHRleHQ6ICJWZXJ5IEhpZ2ggSW5kZXggLSBNYXkgYmUgdW5zdGFibGUiLCBjbHM6ICJjc3JjLXdhcm5pbmciIH07DQogICAgICByZXR1cm4geyB0ZXh0OiAiTm9ybWFsIFJhbmdlIC0gU3VpdGFibGUgZm9yIHR5cGljYWwgYXBwbGljYXRpb25zIiwgY2xzOiAiY3NyYy1zdWNjZXNzIiB9Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldERlc2lnblN0YXR1cyh3YXJuaW5ncykgew0KICAgICAgdmFyIGNyaXRpY2FsID0gd2FybmluZ3Muc29tZShmdW5jdGlvbiAodykgew0KICAgICAgICByZXR1cm4gdy5sZXZlbCA9PT0gImVycm9yIjsNCiAgICAgIH0pOw0KICAgICAgdmFyIGNhdXRpb24gPSB3YXJuaW5ncy5zb21lKGZ1bmN0aW9uICh3KSB7DQogICAgICAgIHJldHVybiB3LmxldmVsID09PSAid2FybmluZyI7DQogICAgICB9KTsNCiAgICAgIGlmIChjcml0aWNhbCkgcmV0dXJuIHsgdGV4dDogIkNoZWNrIEdlb21ldHJ5IiwgY2xzOiAiY3NyYy1kYW5nZXIiIH07DQogICAgICBpZiAoY2F1dGlvbikgcmV0dXJuIHsgdGV4dDogIkNhdXRpb24iLCBjbHM6ICJjc3JjLXdhcm5pbmciIH07DQogICAgICByZXR1cm4geyB0ZXh0OiAiQWNjZXB0YWJsZSIsIGNsczogImNzcmMtc3VjY2VzcyIgfTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzZXRSZXN1bHQoaWQsIHZhbHVlLCB1bml0KSB7DQogICAgICB2YXIgZWwgPSBieUlkKGlkKTsNCiAgICAgIGlmICghZWwpIHJldHVybjsNCiAgICAgIGVsLnRleHRDb250ZW50ID0gdmFsdWU7DQogICAgICB2YXIgdW5pdEVsID0gYnlJZChpZCArICItdW5pdCIpOw0KICAgICAgaWYgKHVuaXRFbCkgdW5pdEVsLnRleHRDb250ZW50ID0gdW5pdCB8fCAiIjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzaG93V2FybmluZ3MobGlzdCkgew0KICAgICAgaWYgKCFlbHMud2FybmluZ3MpIHJldHVybjsNCiAgICAgIGVscy53YXJuaW5ncy5pbm5lckhUTUwgPSAiIjsNCiAgICAgIGlmICghbGlzdC5sZW5ndGgpIHsNCiAgICAgICAgZWxzLndhcm5pbmdzLmhpZGRlbiA9IHRydWU7DQogICAgICAgIHJldHVybjsNCiAgICAgIH0NCiAgICAgIGVscy53YXJuaW5ncy5oaWRkZW4gPSBmYWxzZTsNCiAgICAgIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAodykgew0KICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgICAgIGRpdi5jbGFzc05hbWUgPSAiY3NyYy1hbGVydCBjc3JjLWFsZXJ0LSIgKyB3LmxldmVsOw0KICAgICAgICBkaXYudGV4dENvbnRlbnQgPSB3Lm1lc3NhZ2U7DQogICAgICAgIGVscy53YXJuaW5ncy5hcHBlbmRDaGlsZChkaXYpOw0KICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlTWVhbkRGcm9tR2VvbWV0cnkoKSB7DQogICAgICB2YXIgbW9kZSA9IGdldE1lYW5ETW9kZSgpOw0KICAgICAgbWVhbkRNb2RlID0gbW9kZTsNCiAgICAgIHZhciB3aXJlID0gcGFyc2VOdW0oZWxzLndpcmVEKTsNCiAgICAgIHZhciBvdXRlciA9IHBhcnNlTnVtKGVscy5vdXRlckQpOw0KICAgICAgdmFyIGlubmVyID0gcGFyc2VOdW0oZWxzLmlubmVyRCk7DQogICAgICB2YXIgd2lyZU1tID0gbGVuZ3RoVG9NbSh3aXJlKTsNCiAgICAgIHZhciBvdXRlck1tID0gbGVuZ3RoVG9NbShvdXRlcik7DQogICAgICB2YXIgaW5uZXJNbSA9IGxlbmd0aFRvTW0oaW5uZXIpOw0KICAgICAgdmFyIG1lYW5NbSA9IGNvbXB1dGVNZWFuRGlhbWV0ZXJNbSh3aXJlTW0sIG91dGVyTW0sIGlubmVyTW0sIG1vZGUpOw0KICAgICAgaWYgKG1vZGUgIT09ICJtYW51YWwiICYmIG1lYW5NbSAhPT0gbnVsbCAmJiBlbHMubWVhbkQpIHsNCiAgICAgICAgZWxzLm1lYW5ELnZhbHVlID0gZm9ybWF0TnVtKG1tVG9EaXNwbGF5KG1lYW5NbSksIDQpOw0KICAgICAgICBlbHMubWVhbkQucmVhZE9ubHkgPSB0cnVlOw0KICAgICAgICBlbHMubWVhbkQuY2xhc3NMaXN0LmFkZCgiY3NyYy1yZWFkb25seSIpOw0KICAgICAgfSBlbHNlIGlmIChlbHMubWVhbkQpIHsNCiAgICAgICAgZWxzLm1lYW5ELnJlYWRPbmx5ID0gZmFsc2U7DQogICAgICAgIGVscy5tZWFuRC5jbGFzc0xpc3QucmVtb3ZlKCJjc3JjLXJlYWRvbmx5Iik7DQogICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlQWN0aXZlQ29pbHNGcm9tRW5kVHlwZSgpIHsNCiAgICAgIGlmICghZWxzLmF1dG9BY3RpdmUgfHwgIWVscy5hdXRvQWN0aXZlLmNoZWNrZWQpIHJldHVybjsNCiAgICAgIHZhciB0b3RhbCA9IHBhcnNlTnVtKGVscy50b3RhbENvaWxzKTsNCiAgICAgIHZhciBuYSA9IGVzdGltYXRlQWN0aXZlQ29pbHModG90YWwpOw0KICAgICAgaWYgKG5hICE9PSBudWxsICYmIGVscy5hY3RpdmVDb2lscykgew0KICAgICAgICBlbHMuYWN0aXZlQ29pbHMudmFsdWUgPSBmb3JtYXROdW0obmEsIDIpOw0KICAgICAgICBlbHMuYWN0aXZlQ29pbHMucmVhZE9ubHkgPSB0cnVlOw0KICAgICAgICBlbHMuYWN0aXZlQ29pbHMuY2xhc3NMaXN0LmFkZCgiY3NyYy1yZWFkb25seSIpOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGFwcGx5TWF0ZXJpYWxQcmVzZXQoKSB7DQogICAgICBpZiAoZ01hbnVhbGx5RWRpdGVkIHx8ICFlbHMubWF0ZXJpYWwgfHwgIWVscy5zaGVhckcpIHJldHVybjsNCiAgICAgIHZhciBrZXkgPSBlbHMubWF0ZXJpYWwudmFsdWU7DQogICAgICB2YXIgbWF0ID0gTUFURVJJQUxTW2tleV07DQogICAgICBpZiAobWF0ICYmIG1hdC5nR3BhICE9PSBudWxsKSB7DQogICAgICAgIHZhciBtcGEgPSBtYXQuZ0dwYSAqIEdQQV9UT19NUEE7DQogICAgICAgIGVscy5zaGVhckcudmFsdWUgPSBmb3JtYXROdW0obXBhVG9EaXNwbGF5RyhtcGEpLCBpc01ldHJpYygpID8gMiA6IDApOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGhpZGVSZXN1bHRzU2VjdGlvbigpIHsNCiAgICAgIGlmIChlbHMucmVzdWx0c1NlY3Rpb24pIGVscy5yZXN1bHRzU2VjdGlvbi5oaWRkZW4gPSB0cnVlOw0KICAgICAgaWYgKGVscy5yZXN1bHRzUGFuZWwpIGVscy5yZXN1bHRzUGFuZWwuaGlkZGVuID0gdHJ1ZTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzaG93UmVzdWx0c1NlY3Rpb24oKSB7DQogICAgICBpZiAoZWxzLnJlc3VsdHNTZWN0aW9uKSBlbHMucmVzdWx0c1NlY3Rpb24uaGlkZGVuID0gZmFsc2U7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2FsY3VsYXRlKCkgew0KICAgICAgc2hvd1Jlc3VsdHNTZWN0aW9uKCk7DQogICAgICB2YXIgd2FybmluZ3MgPSBbXTsNCiAgICAgIHZhciB3aXJlID0gcGFyc2VOdW0oZWxzLndpcmVEKTsNCiAgICAgIHZhciBvdXRlciA9IHBhcnNlTnVtKGVscy5vdXRlckQpOw0KICAgICAgdmFyIGlubmVyID0gcGFyc2VOdW0oZWxzLmlubmVyRCk7DQogICAgICB2YXIgdG90YWwgPSBwYXJzZU51bShlbHMudG90YWxDb2lscyk7DQogICAgICB2YXIgbmFJbnB1dCA9IHBhcnNlTnVtKGVscy5hY3RpdmVDb2lscyk7DQogICAgICB2YXIgZ1ZhbCA9IHBhcnNlTnVtKGVscy5zaGVhckcpOw0KICAgICAgdmFyIGxvYWQgPSBwYXJzZU51bShlbHMuYXBwbGllZExvYWQpOw0KICAgICAgdmFyIHRhcmdldERlZiA9IHBhcnNlTnVtKGVscy50YXJnZXREZWZsZWN0aW9uKTsNCiAgICAgIHZhciBmcmVlTGVuID0gcGFyc2VOdW0oZWxzLmZyZWVMZW5ndGgpOw0KDQogICAgICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5jc3JjLWVycm9yIikuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsNCiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgiY3NyYy1lcnJvciIpOw0KICAgICAgfSk7DQogICAgICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5jc3JjLWVycm9yLW1zZyIpLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7DQogICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoImNzcmMtdmlzaWJsZSIpOw0KICAgICAgfSk7DQoNCiAgICAgIGlmICh3aXJlID09PSBudWxsIHx8IHdpcmUgPD0gMCkgew0KICAgICAgICB3YXJuaW5ncy5wdXNoKHsgbGV2ZWw6ICJlcnJvciIsIG1lc3NhZ2U6ICJXaXJlIGRpYW1ldGVyIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIiB9KTsNCiAgICAgICAgaWYgKGVscy53aXJlRCkgZWxzLndpcmVELmNsYXNzTGlzdC5hZGQoImNzcmMtZXJyb3IiKTsNCiAgICAgIH0NCg0KICAgICAgdmFyIG1vZGUgPSBnZXRNZWFuRE1vZGUoKTsNCiAgICAgIHVwZGF0ZU1lYW5ERnJvbUdlb21ldHJ5KCk7DQogICAgICB2YXIgd2lyZU1tID0gbGVuZ3RoVG9NbSh3aXJlKTsNCiAgICAgIHZhciBtZWFuTW0gPSBjb21wdXRlTWVhbkRpYW1ldGVyTW0oDQogICAgICAgIHdpcmVNbSwNCiAgICAgICAgbGVuZ3RoVG9NbShvdXRlciksDQogICAgICAgIGxlbmd0aFRvTW0oaW5uZXIpLA0KICAgICAgICBtb2RlDQogICAgICApOw0KDQogICAgICBpZiAobWVhbk1tID09PSBudWxsIHx8IG1lYW5NbSA8PSAwKSB7DQogICAgICAgIHdhcm5pbmdzLnB1c2goew0KICAgICAgICAgIGxldmVsOiAiZXJyb3IiLA0KICAgICAgICAgIG1lc3NhZ2U6ICJNZWFuIGNvaWwgZGlhbWV0ZXIgbXVzdCBiZSBwb3NpdGl2ZS4gRW50ZXIgT0QsIElELCBvciBtZWFuIGRpYW1ldGVyIGRpcmVjdGx5LiINCiAgICAgICAgfSk7DQogICAgICAgIGlmIChlbHMubWVhbkQpIGVscy5tZWFuRC5jbGFzc0xpc3QuYWRkKCJjc3JjLWVycm9yIik7DQogICAgICB9DQoNCiAgICAgIGlmICh3aXJlTW0gIT09IG51bGwgJiYgbWVhbk1tICE9PSBudWxsICYmIG1lYW5NbSA8PSB3aXJlTW0pIHsNCiAgICAgICAgd2FybmluZ3MucHVzaCh7DQogICAgICAgICAgbGV2ZWw6ICJlcnJvciIsDQogICAgICAgICAgbWVzc2FnZTogIk1lYW4gY29pbCBkaWFtZXRlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB3aXJlIGRpYW1ldGVyIChEID4gZCkuIg0KICAgICAgICB9KTsNCiAgICAgIH0NCg0KICAgICAgdmFyIG5hID0gbmFJbnB1dDsNCiAgICAgIGlmIChlbHMuYXV0b0FjdGl2ZSAmJiBlbHMuYXV0b0FjdGl2ZS5jaGVja2VkKSB7DQogICAgICAgIG5hID0gZXN0aW1hdGVBY3RpdmVDb2lscyh0b3RhbCk7DQogICAgICB9DQogICAgICBpZiAobmEgPT09IG51bGwgfHwgbmEgPD0gMCkgew0KICAgICAgICB3YXJuaW5ncy5wdXNoKHsgbGV2ZWw6ICJlcnJvciIsIG1lc3NhZ2U6ICJBdCBsZWFzdCBvbmUgYWN0aXZlIGNvaWwgaXMgcmVxdWlyZWQuIiB9KTsNCiAgICAgICAgaWYgKGVscy5hY3RpdmVDb2lscykgZWxzLmFjdGl2ZUNvaWxzLmNsYXNzTGlzdC5hZGQoImNzcmMtZXJyb3IiKTsNCiAgICAgIH0NCg0KICAgICAgdmFyIGdNcGEgPSBzaGVhckdUb01wYShnVmFsLCBnZXRTaGVhckdVbml0KCkpOw0KICAgICAgaWYgKGdNcGEgPT09IG51bGwgfHwgZ01wYSA8PSAwKSB7DQogICAgICAgIHdhcm5pbmdzLnB1c2goeyBsZXZlbDogImVycm9yIiwgbWVzc2FnZTogIlNoZWFyIG1vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iIH0pOw0KICAgICAgICBpZiAoZWxzLnNoZWFyRykgZWxzLnNoZWFyRy5jbGFzc0xpc3QuYWRkKCJjc3JjLWVycm9yIik7DQogICAgICB9DQoNCiAgICAgIHZhciBoYXNDcml0aWNhbCA9IHdhcm5pbmdzLnNvbWUoZnVuY3Rpb24gKHcpIHsNCiAgICAgICAgcmV0dXJuIHcubGV2ZWwgPT09ICJlcnJvciI7DQogICAgICB9KTsNCiAgICAgIGlmIChoYXNDcml0aWNhbCkgew0KICAgICAgICBzaG93V2FybmluZ3Mod2FybmluZ3MpOw0KICAgICAgICBpZiAoZWxzLnJlc3VsdHNQYW5lbCkgZWxzLnJlc3VsdHNQYW5lbC5oaWRkZW4gPSB0cnVlOw0KICAgICAgICByZXR1cm47DQogICAgICB9DQoNCiAgICAgIHZhciBrID0gY2FsY1NwcmluZ1JhdGUoZ01wYSwgd2lyZU1tLCBtZWFuTW0sIG5hKTsNCiAgICAgIHZhciBzcHJpbmdJbmRleCA9IG1lYW5NbSAvIHdpcmVNbTsNCiAgICAgIHZhciBpbmRleFN0YXR1cyA9IGdldEluZGV4U3RhdHVzKHNwcmluZ0luZGV4KTsNCiAgICAgIHZhciBzb2xpZE1tID0gdG90YWwgIT09IG51bGwgJiYgdG90YWwgPiAwID8gdG90YWwgKiB3aXJlTW0gOiBudWxsOw0KICAgICAgdmFyIGZyZWVNbSA9IGxlbmd0aFRvTW0oZnJlZUxlbik7DQogICAgICB2YXIgbWF4RGVmTW0gPSBmcmVlTW0gIT09IG51bGwgJiYgc29saWRNbSAhPT0gbnVsbCA\/IGZyZWVNbSAtIHNvbGlkTW0gOiBudWxsOw0KDQogICAgICBpZiAoc3ByaW5nSW5kZXggPCA0IHx8IHNwcmluZ0luZGV4ID4gMTIpIHsNCiAgICAgICAgd2FybmluZ3MucHVzaCh7IGxldmVsOiAid2FybmluZyIsIG1lc3NhZ2U6IGluZGV4U3RhdHVzLnRleHQgfSk7DQogICAgICB9DQoNCiAgICAgIHZhciBkZWZsZWN0aW9uTW0gPSBudWxsOw0KICAgICAgdmFyIHJlcXVpcmVkRm9yY2VOID0gbnVsbDsNCiAgICAgIHZhciBsb2FkVW5pdCA9IGVscy5sb2FkVW5pdCA\/IGVscy5sb2FkVW5pdC52YWx1ZSA6ICJOIjsNCg0KICAgICAgaWYgKGxvYWQgIT09IG51bGwgJiYgbG9hZCA+IDAgJiYgayAhPT0gbnVsbCAmJiBrID4gMCkgew0KICAgICAgICBkZWZsZWN0aW9uTW0gPSBmb3JjZVRvTmV3dG9ucyhsb2FkLCBsb2FkVW5pdCkgLyBrOw0KICAgICAgfQ0KDQogICAgICBpZiAodGFyZ2V0RGVmICE9PSBudWxsICYmIHRhcmdldERlZiA+IDAgJiYgayAhPT0gbnVsbCkgew0KICAgICAgICByZXF1aXJlZEZvcmNlTiA9IGsgKiBsZW5ndGhUb01tKHRhcmdldERlZik7DQogICAgICB9DQoNCiAgICAgIGlmIChtYXhEZWZNbSAhPT0gbnVsbCAmJiBtYXhEZWZNbSA8PSAwKSB7DQogICAgICAgIHdhcm5pbmdzLnB1c2goew0KICAgICAgICAgIGxldmVsOiAid2FybmluZyIsDQogICAgICAgICAgbWVzc2FnZTogIkZyZWUgbGVuZ3RoIGFwcGVhcnMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGVzdGltYXRlZCBzb2xpZCBoZWlnaHQuIg0KICAgICAgICB9KTsNCiAgICAgIH0NCg0KICAgICAgaWYgKGRlZmxlY3Rpb25NbSAhPT0gbnVsbCAmJiBtYXhEZWZNbSAhPT0gbnVsbCAmJiBkZWZsZWN0aW9uTW0gPiBtYXhEZWZNbSAqIDAuOTUpIHsNCiAgICAgICAgd2FybmluZ3MucHVzaCh7DQogICAgICAgICAgbGV2ZWw6ICJ3YXJuaW5nIiwNCiAgICAgICAgICBtZXNzYWdlOg0KICAgICAgICAgICAgIkNhbGN1bGF0ZWQgZGVmbGVjdGlvbiBhcHByb2FjaGVzIG9yIGV4Y2VlZHMgbWF4aW11bSBhdmFpbGFibGUgZGVmbGVjdGlvbiAoIiArDQogICAgICAgICAgICBmb3JtYXROdW0obW1Ub0Rpc3BsYXkobWF4RGVmTW0pLCAyKSArDQogICAgICAgICAgICAiICIgKw0KICAgICAgICAgICAgZ2V0TGVuZ3RoVW5pdCgpICsNCiAgICAgICAgICAgICIpLiINCiAgICAgICAgfSk7DQogICAgICB9DQoNCiAgICAgIGlmICh0YXJnZXREZWYgIT09IG51bGwgJiYgbWF4RGVmTW0gIT09IG51bGwgJiYgbGVuZ3RoVG9NbSh0YXJnZXREZWYpID4gbWF4RGVmTW0pIHsNCiAgICAgICAgd2FybmluZ3MucHVzaCh7DQogICAgICAgICAgbGV2ZWw6ICJ3YXJuaW5nIiwNCiAgICAgICAgICBtZXNzYWdlOiAiVGFyZ2V0IGRlZmxlY3Rpb24gZXhjZWVkcyBlc3RpbWF0ZWQgbWF4aW11bSBhdmFpbGFibGUgZGVmbGVjdGlvbi4iDQogICAgICAgIH0pOw0KICAgICAgfQ0KDQogICAgICB2YXIgZGVzaWduU3RhdHVzID0gZ2V0RGVzaWduU3RhdHVzKHdhcm5pbmdzKTsNCiAgICAgIHNob3dXYXJuaW5ncyh3YXJuaW5ncyk7DQoNCiAgICAgIHZhciBrRGlzcGxheSA9IHJhdGVUb0Rpc3BsYXkoayk7DQogICAgICBzZXRSZXN1bHQoImNzcmMtcmVzLXJhdGUiLCBmb3JtYXROdW0oa0Rpc3BsYXksIDQpKTsNCiAgICAgIHNldFJlc3VsdCgiY3NyYy1yZXMtcmF0ZS1hbHQiLCBpc01ldHJpYygpID8gZm9ybWF0TnVtKGsgKiAxMDAwLCAyKSA6ICItIik7DQogICAgICBieUlkKCJjc3JjLXJlcy1yYXRlLWFsdC13cmFwIikuaGlkZGVuID0gIWlzTWV0cmljKCk7DQoNCiAgICAgIHNldFJlc3VsdCgiY3NyYy1yZXMtZGVmbGVjdGlvbiIsIGRlZmxlY3Rpb25NbSAhPT0gbnVsbCA\/IGZvcm1hdE51bShtbVRvRGlzcGxheShkZWZsZWN0aW9uTW0pLCA0KSA6ICItIik7DQogICAgICBzZXRSZXN1bHQoDQogICAgICAgICJjc3JjLXJlcy1mb3JjZSIsDQogICAgICAgIHJlcXVpcmVkRm9yY2VOICE9PSBudWxsID8gZm9ybWF0TnVtKG5ld3RvbnNUb0Rpc3BsYXkocmVxdWlyZWRGb3JjZU4pLCA0KSA6ICItIg0KICAgICAgKTsNCiAgICAgIHNldFJlc3VsdCgiY3NyYy1yZXMtbWVhbi1kIiwgZm9ybWF0TnVtKG1tVG9EaXNwbGF5KG1lYW5NbSksIDQpKTsNCiAgICAgIHNldFJlc3VsdCgiY3NyYy1yZXMtaW5kZXgiLCBmb3JtYXROdW0oc3ByaW5nSW5kZXgsIDMpKTsNCiAgICAgIHNldFJlc3VsdCgiY3NyYy1yZXMtc29saWQiLCBzb2xpZE1tICE9PSBudWxsID8gZm9ybWF0TnVtKG1tVG9EaXNwbGF5KHNvbGlkTW0pLCA0KSA6ICItIik7DQogICAgICBzZXRSZXN1bHQoDQogICAgICAgICJjc3JjLXJlcy1tYXgtZGVmIiwNCiAgICAgICAgbWF4RGVmTW0gIT09IG51bGwgJiYgbWF4RGVmTW0gPiAwID8gZm9ybWF0TnVtKG1tVG9EaXNwbGF5KG1heERlZk1tKSwgNCkgOiAiLSINCiAgICAgICk7DQoNCiAgICAgIHZhciBzdGF0dXNFbCA9IGJ5SWQoImNzcmMtcmVzLXN0YXR1cyIpOw0KICAgICAgaWYgKHN0YXR1c0VsKSB7DQogICAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gZGVzaWduU3RhdHVzLnRleHQ7DQogICAgICAgIHN0YXR1c0VsLmNsYXNzTmFtZSA9ICJjc3JjLXN0YXR1cy1iYWRnZSAiICsgZGVzaWduU3RhdHVzLmNsczsNCiAgICAgIH0NCg0KICAgICAgdmFyIGluZGV4SGludCA9IGJ5SWQoImNzcmMtcmVzLWluZGV4LWhpbnQiKTsNCiAgICAgIGlmIChpbmRleEhpbnQpIHsNCiAgICAgICAgaW5kZXhIaW50LnRleHRDb250ZW50ID0gaW5kZXhTdGF0dXMudGV4dDsNCiAgICAgICAgaW5kZXhIaW50LmNsYXNzTmFtZSA9ICJjc3JjLWluZGV4LWhpbnQgIiArIGluZGV4U3RhdHVzLmNsczsNCiAgICAgIH0NCg0KICAgICAgaWYgKGVscy5yZXN1bHRzUGFuZWwpIGVscy5yZXN1bHRzUGFuZWwuaGlkZGVuID0gZmFsc2U7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc3dpdGNoVW5pdHMobmV3U3lzdGVtKSB7DQogICAgICBpZiAobmV3U3lzdGVtID09PSB1bml0U3lzdGVtKSByZXR1cm47DQogICAgICB2YXIgb2xkTWV0cmljID0gdW5pdFN5c3RlbSA9PT0gIm1ldHJpYyI7DQoNCiAgICAgIGlmIChuZXdTeXN0ZW0gPT09ICJpbXBlcmlhbCIpIHsNCiAgICAgICAgY29udmVydElucHV0VmFsdWUoZWxzLndpcmVELCBNTV9UT19JTiwgNCk7DQogICAgICAgIGNvbnZlcnRJbnB1dFZhbHVlKGVscy5vdXRlckQsIE1NX1RPX0lOLCA0KTsNCiAgICAgICAgY29udmVydElucHV0VmFsdWUoZWxzLmlubmVyRCwgTU1fVE9fSU4sIDQpOw0KICAgICAgICBjb252ZXJ0SW5wdXRWYWx1ZShlbHMubWVhbkQsIE1NX1RPX0lOLCA0KTsNCiAgICAgICAgY29udmVydElucHV0VmFsdWUoZWxzLnRhcmdldERlZmxlY3Rpb24sIE1NX1RPX0lOLCA0KTsNCiAgICAgICAgY29udmVydElucHV0VmFsdWUoZWxzLmZyZWVMZW5ndGgsIE1NX1RPX0lOLCA0KTsNCiAgICAgICAgaWYgKGVscy5zaGVhckcgJiYgb2xkTWV0cmljKSB7DQogICAgICAgICAgdmFyIGdNcGEgPSBzaGVhckdUb01wYShwYXJzZU51bShlbHMuc2hlYXJHKSwgZ2V0U2hlYXJHVW5pdCgpKTsNCiAgICAgICAgICBpZiAoZ01wYSAhPT0gbnVsbCkgZWxzLnNoZWFyRy52YWx1ZSA9IGZvcm1hdE51bShnTXBhICogTVBBX1RPX1BTSSwgMCk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGVscy5hcHBsaWVkTG9hZCkgew0KICAgICAgICAgIHZhciB1ID0gZWxzLmxvYWRVbml0ID8gZWxzLmxvYWRVbml0LnZhbHVlIDogIk4iOw0KICAgICAgICAgIHZhciBuID0gZm9yY2VUb05ld3RvbnMocGFyc2VOdW0oZWxzLmFwcGxpZWRMb2FkKSwgdSk7DQogICAgICAgICAgaWYgKG4gIT09IG51bGwpIGVscy5hcHBsaWVkTG9hZC52YWx1ZSA9IGZvcm1hdE51bShuICogTl9UT19MQkYsIDQpOw0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICBjb252ZXJ0SW5wdXRWYWx1ZShlbHMud2lyZUQsIElOX1RPX01NLCA0KTsNCiAgICAgICAgY29udmVydElucHV0VmFsdWUoZWxzLm91dGVyRCwgSU5fVE9fTU0sIDQpOw0KICAgICAgICBjb252ZXJ0SW5wdXRWYWx1ZShlbHMuaW5uZXJELCBJTl9UT19NTSwgNCk7DQogICAgICAgIGNvbnZlcnRJbnB1dFZhbHVlKGVscy5tZWFuRCwgSU5fVE9fTU0sIDQpOw0KICAgICAgICBjb252ZXJ0SW5wdXRWYWx1ZShlbHMudGFyZ2V0RGVmbGVjdGlvbiwgSU5fVE9fTU0sIDQpOw0KICAgICAgICBjb252ZXJ0SW5wdXRWYWx1ZShlbHMuZnJlZUxlbmd0aCwgSU5fVE9fTU0sIDQpOw0KICAgICAgICBpZiAoZWxzLnNoZWFyRyAmJiAhb2xkTWV0cmljKSB7DQogICAgICAgICAgdmFyIGdNcGFJbXAgPSBzaGVhckdUb01wYShwYXJzZU51bShlbHMuc2hlYXJHKSwgInBzaSIpOw0KICAgICAgICAgIGlmIChnTXBhSW1wICE9PSBudWxsKSBlbHMuc2hlYXJHLnZhbHVlID0gZm9ybWF0TnVtKGdNcGFJbXAgLyBHUEFfVE9fTVBBLCAyKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoZWxzLmFwcGxpZWRMb2FkKSB7DQogICAgICAgICAgdmFyIGxiZiA9IHBhcnNlTnVtKGVscy5hcHBsaWVkTG9hZCk7DQogICAgICAgICAgaWYgKGxiZiAhPT0gbnVsbCkgZWxzLmFwcGxpZWRMb2FkLnZhbHVlID0gZm9ybWF0TnVtKGxiZiAqIExCRl9UT19OLCA0KTsNCiAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICB1bml0U3lzdGVtID0gbmV3U3lzdGVtOw0KICAgICAgaWYgKGVscy51bml0TWV0cmljKSBlbHMudW5pdE1ldHJpYy5jbGFzc0xpc3QudG9nZ2xlKCJjc3JjLWFjdGl2ZSIsIG5ld1N5c3RlbSA9PT0gIm1ldHJpYyIpOw0KICAgICAgaWYgKGVscy51bml0SW1wZXJpYWwpIGVscy51bml0SW1wZXJpYWwuY2xhc3NMaXN0LnRvZ2dsZSgiY3NyYy1hY3RpdmUiLCBuZXdTeXN0ZW0gPT09ICJpbXBlcmlhbCIpOw0KICAgICAgc3luY1NoZWFyR1VuaXRPcHRpb25zKCk7DQogICAgICBzeW5jTG9hZFVuaXRPcHRpb25zKCk7DQogICAgICB1cGRhdGVMZW5ndGhVbml0TGFiZWxzKCk7DQogICAgICBhcHBseU1hdGVyaWFsUHJlc2V0KCk7DQogICAgICBoaWRlUmVzdWx0c1NlY3Rpb24oKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBiaW5kSW5wdXRVcGRhdGVzKCkgew0KICAgICAgaGlkZVJlc3VsdHNTZWN0aW9uKCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYmluZEV2ZW50cygpIHsNCiAgICAgIGlmIChlbHMudW5pdE1ldHJpYykgew0KICAgICAgICBlbHMudW5pdE1ldHJpYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICBzd2l0Y2hVbml0cygibWV0cmljIik7DQogICAgICAgIH0pOw0KICAgICAgfQ0KICAgICAgaWYgKGVscy51bml0SW1wZXJpYWwpIHsNCiAgICAgICAgZWxzLnVuaXRJbXBlcmlhbC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICBzd2l0Y2hVbml0cygiaW1wZXJpYWwiKTsNCiAgICAgICAgfSk7DQogICAgICB9DQoNCiAgICAgIFsNCiAgICAgICAgZWxzLndpcmVELA0KICAgICAgICBlbHMub3V0ZXJELA0KICAgICAgICBlbHMuaW5uZXJELA0KICAgICAgICBlbHMubWVhbkQsDQogICAgICAgIGVscy50b3RhbENvaWxzLA0KICAgICAgICBlbHMuYWN0aXZlQ29pbHMsDQogICAgICAgIGVscy5zaGVhckcsDQogICAgICAgIGVscy5hcHBsaWVkTG9hZCwNCiAgICAgICAgZWxzLnRhcmdldERlZmxlY3Rpb24sDQogICAgICAgIGVscy5mcmVlTGVuZ3RoDQogICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGlucHV0KSB7DQogICAgICAgIGlmIChpbnB1dCkgew0KICAgICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdXBkYXRlTWVhbkRGcm9tR2VvbWV0cnkoKTsNCiAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gZWxzLnRvdGFsQ29pbHMpIHVwZGF0ZUFjdGl2ZUNvaWxzRnJvbUVuZFR5cGUoKTsNCiAgICAgICAgICAgIGJpbmRJbnB1dFVwZGF0ZXMoKTsNCiAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgfSk7DQoNCiAgICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbbmFtZT0iY3NyYy1tZWFuLW1vZGUiXScpLmZvckVhY2goZnVuY3Rpb24gKHJhZGlvKSB7DQogICAgICAgIHJhZGlvLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICB1cGRhdGVNZWFuREZyb21HZW9tZXRyeSgpOw0KICAgICAgICAgIGJpbmRJbnB1dFVwZGF0ZXMoKTsNCiAgICAgICAgfSk7DQogICAgICB9KTsNCg0KICAgICAgaWYgKGVscy5lbmRUeXBlKSB7DQogICAgICAgIGVscy5lbmRUeXBlLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICB1cGRhdGVBY3RpdmVDb2lsc0Zyb21FbmRUeXBlKCk7DQogICAgICAgICAgYmluZElucHV0VXBkYXRlcygpOw0KICAgICAgICB9KTsNCiAgICAgIH0NCg0KICAgICAgaWYgKGVscy5hdXRvQWN0aXZlKSB7DQogICAgICAgIGVscy5hdXRvQWN0aXZlLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICBpZiAoZWxzLmFjdGl2ZUNvaWxzKSB7DQogICAgICAgICAgICBlbHMuYWN0aXZlQ29pbHMucmVhZE9ubHkgPSBlbHMuYXV0b0FjdGl2ZS5jaGVja2VkOw0KICAgICAgICAgICAgZWxzLmFjdGl2ZUNvaWxzLmNsYXNzTGlzdC50b2dnbGUoImNzcmMtcmVhZG9ubHkiLCBlbHMuYXV0b0FjdGl2ZS5jaGVja2VkKTsNCiAgICAgICAgICB9DQogICAgICAgICAgdXBkYXRlQWN0aXZlQ29pbHNGcm9tRW5kVHlwZSgpOw0KICAgICAgICAgIGJpbmRJbnB1dFVwZGF0ZXMoKTsNCiAgICAgICAgfSk7DQogICAgICB9DQoNCiAgICAgIGlmIChlbHMubWF0ZXJpYWwpIHsNCiAgICAgICAgZWxzLm1hdGVyaWFsLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICBnTWFudWFsbHlFZGl0ZWQgPSBmYWxzZTsNCiAgICAgICAgICBhcHBseU1hdGVyaWFsUHJlc2V0KCk7DQogICAgICAgICAgYmluZElucHV0VXBkYXRlcygpOw0KICAgICAgICB9KTsNCiAgICAgIH0NCg0KICAgICAgaWYgKGVscy5zaGVhckcpIHsNCiAgICAgICAgZWxzLnNoZWFyRy5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICBnTWFudWFsbHlFZGl0ZWQgPSB0cnVlOw0KICAgICAgICAgIGJpbmRJbnB1dFVwZGF0ZXMoKTsNCiAgICAgICAgfSk7DQogICAgICB9DQoNCiAgICAgIGlmIChlbHMuc2hlYXJHVW5pdCkgew0KICAgICAgICBlbHMuc2hlYXJHVW5pdC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgdmFyIG1wYSA9IHNoZWFyR1RvTXBhKHBhcnNlTnVtKGVscy5zaGVhckcpLCBnZXRTaGVhckdVbml0KCkpOw0KICAgICAgICAgIGlmIChtcGEgIT09IG51bGwpIHsNCiAgICAgICAgICAgIGVscy5zaGVhckcudmFsdWUgPSBmb3JtYXROdW0obXBhVG9EaXNwbGF5RyhtcGEpLCBnZXRTaGVhckdVbml0KCkgPT09ICJwc2kiID8gMCA6IDIpOw0KICAgICAgICAgIH0NCiAgICAgICAgICBiaW5kSW5wdXRVcGRhdGVzKCk7DQogICAgICAgIH0pOw0KICAgICAgfQ0KDQogICAgICBpZiAoZWxzLmxvYWRVbml0KSB7DQogICAgICAgIGVscy5sb2FkVW5pdC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBiaW5kSW5wdXRVcGRhdGVzKTsNCiAgICAgIH0NCg0KICAgICAgaWYgKGVscy5idG5DYWxjdWxhdGUpIGVscy5idG5DYWxjdWxhdGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBjYWxjdWxhdGUpOw0KICAgIH0NCg0KICAgIHN5bmNTaGVhckdVbml0T3B0aW9ucygpOw0KICAgIHN5bmNMb2FkVW5pdE9wdGlvbnMoKTsNCiAgICB1cGRhdGVMZW5ndGhVbml0TGFiZWxzKCk7DQogICAgYmluZEV2ZW50cygpOw0KICAgIHVwZGF0ZUFjdGl2ZUNvaWxzRnJvbUVuZFR5cGUoKTsNCiAgICB1cGRhdGVNZWFuREZyb21HZW9tZXRyeSgpOw0KICAgIGhpZGVSZXN1bHRzU2VjdGlvbigpOw0KICB9DQoNCiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJsb2FkaW5nIikgew0KICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBpbml0Q3NyY0NhbGN1bGF0b3IpOw0KICB9IGVsc2Ugew0KICAgIGluaXRDc3JjQ2FsY3VsYXRvcigpOw0KICB9\";try{(new Function(atob(b)))();}catch(e){console.error(\"CSRC calculator failed:\",e);}})();<\/script>\n","protected":false},"excerpt":{"rendered":"<p>The Compression Spring Rate Calculator is a practical engineering tool designed to calculate the stiffness, spring rate, force, and deflection of helical compression springs. By&#8230;<\/p>","protected":false},"author":2,"featured_media":24728,"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":[8626,3675,8625,3689],"class_list":["post-24727","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mechanical-basic-component-design","tag-compression-spring","tag-spring-design","tag-spring-rate","tag-spring-stiffness","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/08\/Compression-Spring-Rate-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/posts\/24727","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/comments?post=24727"}],"version-history":[{"count":2,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/posts\/24727\/revisions"}],"predecessor-version":[{"id":24730,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/posts\/24727\/revisions\/24730"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/media\/24728"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/media?parent=24727"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/categories?post=24727"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/tags?post=24727"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}