{"id":24734,"date":"2026-08-27T05:49:11","date_gmt":"2026-08-27T05:49:11","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24734"},"modified":"2026-08-27T05:49:15","modified_gmt":"2026-08-27T05:49:15","slug":"spring-maximum-allowable-load-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/pt\/spring-maximum-allowable-load-calculator\/","title":{"rendered":"Spring Maximum Allowable Load Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Spring Maximum Allowable Load Calculator<\/strong> is a practical engineering tool designed to determine the maximum safe load a compression spring can withstand without exceeding its allowable stress or deflection limits. By analyzing spring geometry, wire diameter, coil diameter, material strength, spring rate, and safety factor, it helps engineers quickly evaluate spring load capacity and operating safety. The Spring Maximum Allowable Load Calculator supports spring design, component selection, and mechanical verification while helping reduce the risk of excessive deformation, coil bind, and premature spring failure.<\/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<!-- Styles and scripts are scoped to #smalc-calculator only -->\n<style>\n\/* Spring Maximum Allowable Load Calculator - WordPress hardened styles *\/\n\/*\n * WordPress-safe: every rule is scoped under #smalc-calculator.\n * Will not restyle theme header, footer, sidebar, or content outside the calculator.\n * No html, body, or unscoped universal selectors.\n *\/\n\n#smalc-calculator.smalc-calculator,\n#smalc-calculator.smalc-calculator *,\n#smalc-calculator.smalc-calculator *::before,\n#smalc-calculator.smalc-calculator *::after {\n  box-sizing: border-box;\n}\n\n#smalc-calculator.smalc-calculator {\n  --smalc-bg: #ffffff;\n  --smalc-surface: #ffffff;\n  --smalc-border: #d8dee8;\n  --smalc-text: #1a2332;\n  --smalc-text-muted: #5a6778;\n  --smalc-primary: #1e4d8c;\n  --smalc-primary-light: #2a6cb8;\n  --smalc-primary-bg: #e8f0fa;\n  --smalc-danger: #dc2626;\n  --smalc-danger-bg: #fef2f2;\n  --smalc-warning: #d97706;\n  --smalc-warning-bg: #fffbeb;\n  --smalc-success: #059669;\n  --smalc-success-bg: #ecfdf5;\n  --smalc-radius: 10px;\n  --smalc-shadow: 0 2px 12px rgba(30, 77, 140, 0.08);\n  --smalc-font: 'Segoe UI', system-ui, -apple-system, BlinkMacSystemFont, sans-serif;\n\n  all: revert;\n  display: block !important;\n  width: 100% !important;\n  max-width: 1100px !important;\n  margin: 0 auto !important;\n  padding: 24px 16px 48px !important;\n  font-family: var(--smalc-font) !important;\n  font-size: 16px !important;\n  line-height: 1.6 !important;\n  color: var(--smalc-text) !important;\n  background: var(--smalc-bg) !important;\n  text-align: left !important;\n  float: none !important;\n  clear: none !important;\n  position: relative !important;\n  isolation: isolate;\n  contain: layout style;\n  letter-spacing: normal !important;\n  text-transform: none !important;\n  box-shadow: none !important;\n  border: none !important;\n}\n\n#smalc-calculator.smalc-calculator h2,\n#smalc-calculator.smalc-calculator h3,\n#smalc-calculator.smalc-calculator p,\n#smalc-calculator.smalc-calculator ul,\n#smalc-calculator.smalc-calculator ol,\n#smalc-calculator.smalc-calculator li,\n#smalc-calculator.smalc-calculator div,\n#smalc-calculator.smalc-calculator span,\n#smalc-calculator.smalc-calculator strong,\n#smalc-calculator.smalc-calculator sub,\n#smalc-calculator.smalc-calculator sup {\n  font-family: inherit;\n  line-height: inherit;\n  float: none !important;\n  text-transform: none !important;\n  letter-spacing: normal !important;\n}\n\n#smalc-calculator.smalc-calculator button,\n#smalc-calculator.smalc-calculator input,\n#smalc-calculator.smalc-calculator select,\n#smalc-calculator.smalc-calculator textarea,\n#smalc-calculator.smalc-calculator label {\n  font: inherit;\n  color: inherit;\n  margin: 0;\n  max-width: none;\n  min-width: 0;\n  float: none !important;\n}\n\n#smalc-calculator.smalc-calculator ul,\n#smalc-calculator.smalc-calculator ol {\n  list-style: none;\n  padding: 0;\n  margin: 0;\n}\n\n#smalc-calculator.smalc-calculator [hidden] {\n  display: none !important;\n}\n\n#smalc-calculator.smalc-calculator h2 {\n  font-family: var(--smalc-font) !important;\n  font-size: 1.1rem !important;\n  font-weight: 700 !important;\n  color: var(--smalc-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#smalc-calculator.smalc-calculator label {\n  display: block;\n  font-family: var(--smalc-font) !important;\n  font-size: 0.9rem !important;\n  font-weight: 500 !important;\n  color: var(--smalc-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#smalc-calculator.smalc-calculator input[type=\"number\"],\n#smalc-calculator.smalc-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(--smalc-border) !important;\n  border-radius: 6px !important;\n  font-family: var(--smalc-font) !important;\n  font-size: 0.95rem !important;\n  font-weight: 400 !important;\n  color: var(--smalc-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#smalc-calculator.smalc-calculator input[type=\"radio\"],\n#smalc-calculator.smalc-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(--smalc-primary);\n}\n\n#smalc-calculator.smalc-calculator button {\n  display: inline-block !important;\n  font-family: var(--smalc-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#smalc-calculator.smalc-calculator .smalc-layout {\n  display: flex !important;\n  flex-direction: column !important;\n  gap: 24px;\n  width: 100% !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-panel {\n  display: block !important;\n  width: 100% !important;\n  background: var(--smalc-surface) !important;\n  border: 1px solid var(--smalc-border) !important;\n  border-radius: var(--smalc-radius) !important;\n  box-shadow: var(--smalc-shadow);\n  padding: 24px !important;\n  margin: 0 !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-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(--smalc-primary-bg) !important;\n  flex-wrap: wrap;\n}\n\n#smalc-calculator.smalc-calculator .smalc-unit-bar {\n  display: flex !important;\n  align-items: center;\n  gap: 10px;\n  flex-shrink: 0;\n  margin: 0 !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-unit-bar label {\n  font-weight: 600 !important;\n  font-size: 0.88rem !important;\n  white-space: nowrap;\n}\n\n#smalc-calculator.smalc-calculator .smalc-unit-toggle {\n  display: flex !important;\n  background: var(--smalc-surface) !important;\n  border: 1px solid var(--smalc-border) !important;\n  border-radius: 8px !important;\n  overflow: hidden;\n}\n\n#smalc-calculator.smalc-calculator .smalc-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(--smalc-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#smalc-calculator.smalc-calculator .smalc-unit-toggle button.smalc-active {\n  background: var(--smalc-primary) !important;\n  color: #fff !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-unit-toggle button:not(.smalc-active):hover {\n  background: var(--smalc-primary-bg) !important;\n  color: var(--smalc-primary) !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-section-label {\n  display: flex !important;\n  align-items: center;\n  gap: 8px;\n  font-size: 0.78rem !important;\n  font-weight: 700 !important;\n  text-transform: uppercase;\n  letter-spacing: 0.06em;\n  color: var(--smalc-text-muted) !important;\n  margin: 18px 0 12px !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-section-label:first-of-type {\n  margin-top: 0 !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-badge {\n  display: inline-flex !important;\n  align-items: center;\n  justify-content: center;\n  width: 20px;\n  height: 20px;\n  border-radius: 50%;\n  background: var(--smalc-primary) !important;\n  color: #fff !important;\n  font-size: 0.7rem !important;\n  font-weight: 700 !important;\n  flex-shrink: 0;\n}\n\n#smalc-calculator.smalc-calculator .smalc-form-row {\n  display: block !important;\n  margin-bottom: 14px !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-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#smalc-calculator.smalc-calculator .smalc-grid-2 {\n  display: grid !important;\n  grid-template-columns: 1fr 1fr;\n  gap: 12px;\n}\n\n@media (max-width: 520px) {\n  #smalc-calculator.smalc-calculator .smalc-grid-2 {\n    grid-template-columns: 1fr !important;\n  }\n}\n\n#smalc-calculator.smalc-calculator .smalc-input-group {\n  display: flex !important;\n  gap: 8px;\n  align-items: stretch;\n  width: 100% !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-input-group input {\n  flex: 1 1 auto;\n  min-width: 0 !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-input-group select,\n#smalc-calculator.smalc-calculator .smalc-unit-tag {\n  flex: 0 0 58px !important;\n  width: 58px !important;\n  min-width: 58px !important;\n  max-width: 72px !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-unit-tag {\n  display: flex !important;\n  align-items: center;\n  justify-content: center;\n  padding: 0 6px !important;\n  background: var(--smalc-primary-bg) !important;\n  border: 1px solid var(--smalc-border) !important;\n  border-radius: 6px !important;\n  font-size: 0.85rem !important;\n  font-weight: 600 !important;\n  color: var(--smalc-primary) !important;\n  min-height: 38px !important;\n  text-align: center !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-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(--smalc-primary-bg) !important;\n  font-size: 0.85rem !important;\n  font-weight: 600 !important;\n  color: var(--smalc-primary) !important;\n  cursor: pointer !important;\n}\n\n#smalc-calculator.smalc-calculator input:focus,\n#smalc-calculator.smalc-calculator select:focus {\n  outline: none !important;\n  border-color: var(--smalc-primary-light) !important;\n  box-shadow: 0 0 0 3px rgba(42, 108, 184, 0.15) !important;\n  background: #fff !important;\n}\n\n#smalc-calculator.smalc-calculator input.smalc-error {\n  border-color: var(--smalc-danger) !important;\n  background: var(--smalc-danger-bg) !important;\n}\n\n#smalc-calculator.smalc-calculator input.smalc-readonly {\n  background: #f1f5f9 !important;\n  color: var(--smalc-text-muted) !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-radio-group {\n  display: flex !important;\n  flex-wrap: wrap;\n  gap: 10px 14px;\n  margin-bottom: 10px !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-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#smalc-calculator.smalc-calculator .smalc-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#smalc-calculator.smalc-calculator .smalc-checkbox-row label {\n  display: inline !important;\n  margin: 0 !important;\n  cursor: pointer !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-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(--smalc-primary-bg) !important;\n  color: var(--smalc-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#smalc-calculator.smalc-calculator .smalc-tooltip-trigger .smalc-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(--smalc-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: 260px;\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#smalc-calculator.smalc-calculator .smalc-tooltip-trigger:hover .smalc-tooltip-text,\n#smalc-calculator.smalc-calculator .smalc-tooltip-trigger:focus .smalc-tooltip-text {\n  visibility: visible;\n  opacity: 1;\n}\n\n#smalc-calculator.smalc-calculator .smalc-btn-row {\n  display: flex !important;\n  justify-content: center !important;\n  gap: 12px;\n  margin-top: 20px !important;\n  width: 100% !important;\n  flex-wrap: wrap;\n}\n\n#smalc-calculator.smalc-calculator .smalc-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#smalc-calculator.smalc-calculator .smalc-btn-primary {\n  background: var(--smalc-primary) !important;\n  color: #fff !important;\n  min-width: 180px !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-btn-primary:hover {\n  background: var(--smalc-primary-light) !important;\n  color: #fff !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-alerts {\n  margin-bottom: 16px !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-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#smalc-calculator.smalc-calculator .smalc-alert-error {\n  background: var(--smalc-danger-bg) !important;\n  color: var(--smalc-danger) !important;\n  border: 1px solid #fecaca !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-alert-warning {\n  background: var(--smalc-warning-bg) !important;\n  color: var(--smalc-warning) !important;\n  border: 1px solid #fde68a !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-alert-info {\n  background: var(--smalc-primary-bg) !important;\n  color: var(--smalc-primary) !important;\n  border: 1px solid #bfdbfe !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-results-section[hidden] {\n  display: none !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-result-hero {\n  text-align: center !important;\n  padding: 20px !important;\n  background: linear-gradient(135deg, var(--smalc-primary-bg), #f0f7ff) !important;\n  border-radius: var(--smalc-radius) !important;\n  margin-bottom: 20px !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-result-hero-label {\n  font-size: 0.85rem !important;\n  font-weight: 600 !important;\n  color: var(--smalc-text-muted) !important;\n  text-transform: uppercase;\n  letter-spacing: 0.05em;\n}\n\n#smalc-calculator.smalc-calculator .smalc-result-hero-value {\n  font-size: 2rem !important;\n  font-weight: 800 !important;\n  color: var(--smalc-primary) !important;\n  line-height: 1.2 !important;\n  margin: 4px 0 !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-result-hero-unit {\n  font-size: 0.95rem !important;\n  color: var(--smalc-text-muted) !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-governing {\n  margin-top: 8px !important;\n  font-size: 0.88rem !important;\n  font-weight: 600 !important;\n  color: var(--smalc-text-muted) !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-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  #smalc-calculator.smalc-calculator .smalc-result-grid {\n    grid-template-columns: 1fr !important;\n  }\n}\n\n#smalc-calculator.smalc-calculator .smalc-result-item {\n  padding: 12px 14px !important;\n  background: #f8fafc !important;\n  border-radius: 8px !important;\n  border: 1px solid var(--smalc-border) !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-result-item-full {\n  grid-column: 1 \/ -1;\n}\n\n#smalc-calculator.smalc-calculator .smalc-result-item-label {\n  font-size: 0.78rem !important;\n  font-weight: 600 !important;\n  color: var(--smalc-text-muted) !important;\n  text-transform: uppercase;\n  letter-spacing: 0.04em;\n  margin-bottom: 4px !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-result-item-value {\n  font-size: 1.15rem !important;\n  font-weight: 700 !important;\n  color: var(--smalc-text) !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-result-item-unit {\n  font-size: 0.82rem !important;\n  color: var(--smalc-text-muted) !important;\n  font-weight: 500 !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-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#smalc-calculator.smalc-calculator .smalc-status-badge.smalc-success {\n  background: var(--smalc-success-bg) !important;\n  color: var(--smalc-success) !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-status-badge.smalc-warning {\n  background: var(--smalc-warning-bg) !important;\n  color: var(--smalc-warning) !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-status-badge.smalc-danger {\n  background: var(--smalc-danger-bg) !important;\n  color: var(--smalc-danger) !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-index-hint {\n  font-size: 0.82rem !important;\n  margin-top: 4px !important;\n}\n\n#smalc-calculator.smalc-calculator .smalc-index-hint.smalc-success { color: var(--smalc-success) !important; }\n#smalc-calculator.smalc-calculator .smalc-index-hint.smalc-warning { color: var(--smalc-warning) !important; }\n#smalc-calculator.smalc-calculator .smalc-index-hint.smalc-danger { color: var(--smalc-danger) !important; }\n\n<\/style>\n\n<div id=\"smalc-calculator\" class=\"smalc-calculator\">\n\n  <div class=\"smalc-layout\">\n\n    <!-- INPUTS -->\n    <div class=\"smalc-panel\">\n      <div class=\"smalc-panel-header\">\n        <h2>Input Parameters<\/h2>\n        <div class=\"smalc-unit-bar\">\n          <label>Unit System<\/label>\n          <div class=\"smalc-unit-toggle\">\n            <button type=\"button\" id=\"smalc-unit-metric\" class=\"smalc-active\">Metric<\/button>\n            <button type=\"button\" id=\"smalc-unit-imperial\">Imperial<\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"smalc-section-label\"><span class=\"smalc-badge\">1<\/span> Spring Geometry<\/div>\n\n      <div class=\"smalc-form-row\">\n        <label for=\"smalc-spring-type\">Spring Type\n          <span class=\"smalc-tooltip-trigger\" tabindex=\"0\">?\n            <span class=\"smalc-tooltip-text\">Helical compression spring configuration. Calculations use Wahl-corrected shear stress for axial loading.<\/span>\n          <\/span>\n        <\/label>\n        <select id=\"smalc-spring-type\">\n          <option value=\"compression\" selected>Compression Spring<\/option>\n          <option value=\"custom\">Custom Helical Spring<\/option>\n        <\/select>\n      <\/div>\n\n      <div class=\"smalc-grid-2\">\n        <div class=\"smalc-form-row\">\n          <label for=\"smalc-wire-d\">Wire Diameter (d)\n            <span class=\"smalc-tooltip-trigger\" tabindex=\"0\">?\n              <span class=\"smalc-tooltip-text\">Diameter of the spring wire. Must be greater than zero.<\/span>\n            <\/span>\n          <\/label>\n          <div class=\"smalc-input-group\">\n            <input type=\"number\" id=\"smalc-wire-d\" value=\"4\" min=\"0\" step=\"any\">\n            <span class=\"smalc-unit-tag\" data-smalc-unit-len>mm<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"smalc-form-row\">\n          <label for=\"smalc-mean-d\">Mean Coil Diameter (D)\n            <span class=\"smalc-tooltip-trigger\" tabindex=\"0\">?\n              <span class=\"smalc-tooltip-text\">Average diameter of the spring coil centerline: C = D \/ d.<\/span>\n            <\/span>\n          <\/label>\n          <div class=\"smalc-input-group\">\n            <input type=\"number\" id=\"smalc-mean-d\" value=\"32\" min=\"0\" step=\"any\">\n            <span class=\"smalc-unit-tag\" data-smalc-unit-len>mm<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"smalc-form-row\">\n        <label>Mean Diameter Source<\/label>\n        <div class=\"smalc-radio-group\">\n          <label><input type=\"radio\" name=\"smalc-mean-mode\" id=\"smalc-mean-mode-manual\" value=\"manual\" checked> Manual D<\/label>\n          <label><input type=\"radio\" name=\"smalc-mean-mode\" id=\"smalc-mean-mode-od\" value=\"od\"> From OD (D = OD \u2212 d)<\/label>\n          <label><input type=\"radio\" name=\"smalc-mean-mode\" id=\"smalc-mean-mode-id\" value=\"id\"> From ID (D = ID + d)<\/label>\n        <\/div>\n      <\/div>\n\n      <div class=\"smalc-grid-2\">\n        <div class=\"smalc-form-row\">\n          <label for=\"smalc-outer-d\">Outer Diameter (optional)<\/label>\n          <div class=\"smalc-input-group\">\n            <input type=\"number\" id=\"smalc-outer-d\" value=\"40\" min=\"0\" step=\"any\" placeholder=\"Optional\">\n            <span class=\"smalc-unit-tag\" data-smalc-unit-len>mm<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"smalc-form-row\">\n          <label for=\"smalc-inner-d\">Inner Diameter (optional)<\/label>\n          <div class=\"smalc-input-group\">\n            <input type=\"number\" id=\"smalc-inner-d\" value=\"\" min=\"0\" step=\"any\" placeholder=\"Optional\">\n            <span class=\"smalc-unit-tag\" data-smalc-unit-len>mm<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"smalc-grid-2\">\n        <div class=\"smalc-form-row\">\n          <label for=\"smalc-active-coils\">Active Coils (Na)\n            <span class=\"smalc-tooltip-trigger\" tabindex=\"0\">?\n              <span class=\"smalc-tooltip-text\">Coils contributing to spring rate. Used in k = Gd\u2074 \/ (8D\u00b3Na).<\/span>\n            <\/span>\n          <\/label>\n          <input type=\"number\" id=\"smalc-active-coils\" value=\"8\" min=\"0\" step=\"any\" class=\"smalc-readonly\" readonly>\n        <\/div>\n        <div class=\"smalc-form-row\">\n          <label for=\"smalc-total-coils\">Total Coils (Nt)<\/label>\n          <input type=\"number\" id=\"smalc-total-coils\" value=\"10\" min=\"0\" step=\"any\">\n        <\/div>\n      <\/div>\n\n      <div class=\"smalc-form-row\">\n        <label for=\"smalc-end-type\">Spring End Type<\/label>\n        <select id=\"smalc-end-type\">\n          <option value=\"plain\">Plain Ends<\/option>\n          <option value=\"plainGround\">Plain and Ground<\/option>\n          <option value=\"squared\">Squared Ends<\/option>\n          <option value=\"squaredGround\" selected>Squared and Ground<\/option>\n        <\/select>\n      <\/div>\n\n      <div class=\"smalc-checkbox-row\">\n        <input type=\"checkbox\" id=\"smalc-auto-active\" checked>\n        <label for=\"smalc-auto-active\">Auto-estimate active coils from end type<\/label>\n      <\/div>\n\n      <div class=\"smalc-grid-2\">\n        <div class=\"smalc-form-row\">\n          <label for=\"smalc-free-length\">Free Length (L<sub>free<\/sub>)<\/label>\n          <div class=\"smalc-input-group\">\n            <input type=\"number\" id=\"smalc-free-length\" value=\"80\" min=\"0\" step=\"any\">\n            <span class=\"smalc-unit-tag\" data-smalc-unit-len>mm<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"smalc-form-row\">\n          <label for=\"smalc-solid-height\">Solid Height (H<sub>s<\/sub>)\n            <span class=\"smalc-tooltip-trigger\" tabindex=\"0\">?\n              <span class=\"smalc-tooltip-text\">Estimated as Nt \u00d7 d when auto-estimate is enabled.<\/span>\n            <\/span>\n          <\/label>\n          <div class=\"smalc-input-group\">\n            <input type=\"number\" id=\"smalc-solid-height\" value=\"\" min=\"0\" step=\"any\" class=\"smalc-readonly\" readonly>\n            <span class=\"smalc-unit-tag\" data-smalc-unit-len>mm<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"smalc-checkbox-row\">\n        <input type=\"checkbox\" id=\"smalc-auto-solid\" checked>\n        <label for=\"smalc-auto-solid\">Auto-estimate solid height (H<sub>s<\/sub> \u2248 N<sub>t<\/sub> \u00d7 d)<\/label>\n      <\/div>\n\n      <div class=\"smalc-form-row\">\n        <label for=\"smalc-clearance\">Coil Bind Clearance\n          <span class=\"smalc-tooltip-trigger\" tabindex=\"0\">?\n            <span class=\"smalc-tooltip-text\">Reserved clearance before solid height. \u03b4<sub>available<\/sub> = L<sub>free<\/sub> \u2212 H<sub>s<\/sub> \u2212 Clearance.<\/span>\n          <\/span>\n        <\/label>\n        <div class=\"smalc-input-group\">\n          <input type=\"number\" id=\"smalc-clearance\" value=\"5\" min=\"0\" step=\"any\">\n          <span class=\"smalc-unit-tag\" data-smalc-unit-len>mm<\/span>\n        <\/div>\n      <\/div>\n\n      <div class=\"smalc-section-label\"><span class=\"smalc-badge\">2<\/span> Material &amp; Strength<\/div>\n\n      <div class=\"smalc-form-row\">\n        <label for=\"smalc-material\">Spring Material<\/label>\n        <select id=\"smalc-material\">\n          <option value=\"musicWire\">Music Wire<\/option>\n          <option value=\"stainless\">Stainless Steel<\/option>\n          <option value=\"chromeSilicon\" selected>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=\"smalc-form-row\">\n        <label for=\"smalc-shear-g\">Shear Modulus (G)<\/label>\n        <div class=\"smalc-input-group\">\n          <input type=\"number\" id=\"smalc-shear-g\" value=\"79\" min=\"0\" step=\"any\">\n          <select id=\"smalc-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=\"smalc-grid-2\">\n        <div class=\"smalc-form-row\">\n          <label for=\"smalc-tau-yield\">Shear Yield Strength<\/label>\n          <div class=\"smalc-input-group\">\n            <input type=\"number\" id=\"smalc-tau-yield\" value=\"900\" min=\"0\" step=\"any\">\n            <span class=\"smalc-unit-tag\" data-smalc-unit-stress>MPa<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"smalc-form-row\">\n          <label for=\"smalc-tau-ult\">Ultimate Shear Strength (optional)<\/label>\n          <div class=\"smalc-input-group\">\n            <input type=\"number\" id=\"smalc-tau-ult\" value=\"1270\" min=\"0\" step=\"any\">\n            <span class=\"smalc-unit-tag\" data-smalc-unit-stress>MPa<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"smalc-section-label\"><span class=\"smalc-badge\">3<\/span> Safety &amp; Verification<\/div>\n\n      <div class=\"smalc-form-row\">\n        <label for=\"smalc-stress-method\">Allowable Stress Method<\/label>\n        <select id=\"smalc-stress-method\">\n          <option value=\"yield\" selected>Based on Shear Yield Strength<\/option>\n          <option value=\"custom\">Based on Custom Allowable Stress<\/option>\n        <\/select>\n      <\/div>\n\n      <div class=\"smalc-form-row\" id=\"smalc-custom-allowable-row\" hidden>\n        <label for=\"smalc-custom-allowable\">Custom Allowable Shear Stress<\/label>\n        <div class=\"smalc-input-group\">\n          <input type=\"number\" id=\"smalc-custom-allowable\" value=\"\" min=\"0\" step=\"any\" placeholder=\"Enter allowable stress\">\n          <span class=\"smalc-unit-tag\" data-smalc-unit-stress>MPa<\/span>\n        <\/div>\n      <\/div>\n\n      <div class=\"smalc-grid-2\">\n        <div class=\"smalc-form-row\">\n          <label for=\"smalc-safety-factor\">Design Safety Factor (SF)\n            <span class=\"smalc-tooltip-trigger\" tabindex=\"0\">?\n              <span class=\"smalc-tooltip-text\">\u03c4<sub>allow<\/sub> = \u03c4<sub>strength<\/sub> \/ SF. Default: 1.5.<\/span>\n            <\/span>\n          <\/label>\n          <input type=\"number\" id=\"smalc-safety-factor\" value=\"1.5\" min=\"0\" step=\"any\">\n        <\/div>\n        <div class=\"smalc-form-row\">\n          <label for=\"smalc-applied-load\">Applied Load (optional)\n            <span class=\"smalc-tooltip-trigger\" tabindex=\"0\">?\n              <span class=\"smalc-tooltip-text\">Working load for verification \u2014 calculates utilization, actual safety factor, and deflection.<\/span>\n            <\/span>\n          <\/label>\n          <div class=\"smalc-input-group\">\n            <input type=\"number\" id=\"smalc-applied-load\" value=\"\" min=\"0\" step=\"any\" placeholder=\"Optional\">\n            <select id=\"smalc-load-unit\">\n              <option value=\"N\" selected>N<\/option>\n              <option value=\"kN\">kN<\/option>\n            <\/select>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"smalc-btn-row\">\n        <button type=\"button\" id=\"smalc-btn-calculate\" class=\"smalc-btn smalc-btn-primary\">Calculate<\/button>\n      <\/div>\n    <\/div>\n\n    <!-- RESULTS -->\n    <div id=\"smalc-results-section\" class=\"smalc-results-section\" hidden>\n      <div id=\"smalc-warnings\" class=\"smalc-alerts\" hidden><\/div>\n\n      <div id=\"smalc-results-panel\" class=\"smalc-panel\">\n        <h2>Calculation Results<\/h2>\n\n        <div class=\"smalc-result-hero\">\n          <div class=\"smalc-result-hero-label\">Maximum Allowable Spring Load<\/div>\n          <div class=\"smalc-result-hero-value\" id=\"smalc-res-fmax\">&#8211;<\/div>\n          <div class=\"smalc-result-hero-unit\"><span data-smalc-unit-force>N<\/span><\/div>\n          <div class=\"smalc-governing\">Governing Limit: <span id=\"smalc-res-governing\">\u2014<\/span><\/div>\n        <\/div>\n\n        <div class=\"smalc-result-grid\">\n          <div class=\"smalc-result-item\">\n            <div class=\"smalc-result-item-label\">Stress-Limited Load<\/div>\n            <div class=\"smalc-result-item-value\" id=\"smalc-res-fstress\">&#8211;<\/div>\n            <div class=\"smalc-result-item-unit\" data-smalc-unit-force>N<\/div>\n          <\/div>\n          <div class=\"smalc-result-item\">\n            <div class=\"smalc-result-item-label\">Deflection-Limited Load<\/div>\n            <div class=\"smalc-result-item-value\" id=\"smalc-res-fdeflection\">&#8211;<\/div>\n            <div class=\"smalc-result-item-unit\" data-smalc-unit-force>N<\/div>\n          <\/div>\n          <div class=\"smalc-result-item\">\n            <div class=\"smalc-result-item-label\">Allowable Shear Stress<\/div>\n            <div class=\"smalc-result-item-value\" id=\"smalc-res-tau-allow\">&#8211;<\/div>\n            <div class=\"smalc-result-item-unit\" data-smalc-unit-stress>MPa<\/div>\n          <\/div>\n          <div class=\"smalc-result-item\">\n            <div class=\"smalc-result-item-label\">Wahl Factor (K<sub>w<\/sub>)<\/div>\n            <div class=\"smalc-result-item-value\" id=\"smalc-res-kw\">&#8211;<\/div>\n            <div class=\"smalc-result-item-unit\">\u2014<\/div>\n          <\/div>\n          <div class=\"smalc-result-item\">\n            <div class=\"smalc-result-item-label\">Spring Index (C)<\/div>\n            <div class=\"smalc-result-item-value\" id=\"smalc-res-index\">&#8211;<\/div>\n            <div class=\"smalc-index-hint\" id=\"smalc-res-index-hint\"><\/div>\n          <\/div>\n          <div class=\"smalc-result-item\">\n            <div class=\"smalc-result-item-label\">Spring Rate<\/div>\n            <div class=\"smalc-result-item-value\" id=\"smalc-res-rate\">&#8211;<\/div>\n            <div class=\"smalc-result-item-unit\" id=\"smalc-rate-unit-label\">N\/mm<\/div>\n          <\/div>\n          <div class=\"smalc-result-item\">\n            <div class=\"smalc-result-item-label\">Max Available Deflection<\/div>\n            <div class=\"smalc-result-item-value\" id=\"smalc-res-delta-avail\">&#8211;<\/div>\n            <div class=\"smalc-result-item-unit\" data-smalc-unit-len>mm<\/div>\n          <\/div>\n          <div class=\"smalc-result-item\">\n            <div class=\"smalc-result-item-label\">Estimated Solid Height<\/div>\n            <div class=\"smalc-result-item-value\" id=\"smalc-res-solid\">&#8211;<\/div>\n            <div class=\"smalc-result-item-unit\" data-smalc-unit-len>mm<\/div>\n          <\/div>\n          <div class=\"smalc-result-item\">\n            <div class=\"smalc-result-item-label\">Load Utilization<\/div>\n            <div class=\"smalc-result-item-value\" id=\"smalc-res-utilization\">\u2014<\/div>\n          <\/div>\n          <div class=\"smalc-result-item\">\n            <div class=\"smalc-result-item-label\">Actual Safety Factor<\/div>\n            <div class=\"smalc-result-item-value\" id=\"smalc-res-actual-sf\">\u2014<\/div>\n          <\/div>\n          <div class=\"smalc-result-item\">\n            <div class=\"smalc-result-item-label\">Deflection at Applied Load<\/div>\n            <div class=\"smalc-result-item-value\" id=\"smalc-res-deflection\">\u2014<\/div>\n            <div class=\"smalc-result-item-unit\" data-smalc-unit-len>mm<\/div>\n          <\/div>\n          <div class=\"smalc-result-item\">\n            <div class=\"smalc-result-item-label\">Remaining Travel<\/div>\n            <div class=\"smalc-result-item-value\" id=\"smalc-res-remaining\">\u2014<\/div>\n            <div class=\"smalc-result-item-unit\" data-smalc-unit-len>mm<\/div>\n          <\/div>\n          <div class=\"smalc-result-item\">\n            <div class=\"smalc-result-item-label\">Shear Stress at Applied Load<\/div>\n            <div class=\"smalc-result-item-value\" id=\"smalc-res-tau-applied\">\u2014<\/div>\n            <div class=\"smalc-result-item-unit\" data-smalc-unit-stress>MPa<\/div>\n          <\/div>\n          <div class=\"smalc-result-item smalc-result-item-full\">\n            <div class=\"smalc-result-item-label\">Safety Status<\/div>\n            <div style=\"margin-top:6px\">\n              <span class=\"smalc-status-badge smalc-success\" id=\"smalc-res-status\">\u2014<\/span>\n            <\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n  <\/div>\n<\/div>\n<script type=\"text\/javascript\">(function(){var b=\"ZnVuY3Rpb24gaW5pdFNtYWxjQ2FsY3VsYXRvcihyb290KSB7DQogICAgaWYgKCFyb290IHx8IHJvb3QuZ2V0QXR0cmlidXRlKCJkYXRhLXNtYWxjLXJlYWR5IikgPT09ICIxIikgcmV0dXJuOw0KICAgIHJvb3Quc2V0QXR0cmlidXRlKCJkYXRhLXNtYWxjLXJlYWR5IiwgIjEiKTsNCg0KICAgIHZhciBNTV9UT19JTiA9IDEgLyAyNS40Ow0KICAgIHZhciBJTl9UT19NTSA9IDI1LjQ7DQogICAgdmFyIE5fVE9fTEJGID0gMSAvIDQuNDQ4MjIxNjE1MzsNCiAgICB2YXIgTEJGX1RPX04gPSA0LjQ0ODIyMTYxNTM7DQogICAgdmFyIEdQQV9UT19NUEEgPSAxMDAwOw0KICAgIHZhciBNUEFfVE9fUFNJID0gMTQ1LjAzNzczODAwNzg3MjIzOw0KDQogICAgdmFyIE1BVEVSSUFMUyA9IHsNCiAgICAgIG11c2ljV2lyZTogeyBsYWJlbDogIk11c2ljIFdpcmUiLCBnR3BhOiA3OSwgdGF1WWllbGRNcGE6IDg1MCwgdGF1VWx0TXBhOiAxMzQwIH0sDQogICAgICBzdGFpbmxlc3M6IHsgbGFiZWw6ICJTdGFpbmxlc3MgU3RlZWwiLCBnR3BhOiA2OSwgdGF1WWllbGRNcGE6IDc1MCwgdGF1VWx0TXBhOiAxMTcwIH0sDQogICAgICBjaHJvbWVTaWxpY29uOiB7IGxhYmVsOiAiQ2hyb21lIFNpbGljb24iLCBnR3BhOiA3OSwgdGF1WWllbGRNcGE6IDkwMCwgdGF1VWx0TXBhOiAxMjcwIH0sDQogICAgICBjaHJvbWVWYW5hZGl1bTogeyBsYWJlbDogIkNocm9tZSBWYW5hZGl1bSIsIGdHcGE6IDc5LjMsIHRhdVlpZWxkTXBhOiA4NTAsIHRhdVVsdE1wYTogMTIwMCB9LA0KICAgICAgb2lsVGVtcGVyZWQ6IHsgbGFiZWw6ICJPaWwgVGVtcGVyZWQgV2lyZSIsIGdHcGE6IDc3LCB0YXVZaWVsZE1wYTogODAwLCB0YXVVbHRNcGE6IDEwNzAgfSwNCiAgICAgIGN1c3RvbTogeyBsYWJlbDogIkN1c3RvbSBNYXRlcmlhbCIsIGdHcGE6IG51bGwsIHRhdVlpZWxkTXBhOiBudWxsLCB0YXVVbHRNcGE6IG51bGwgfQ0KICAgIH07DQoNCiAgICB2YXIgRU5EX1RZUEVTID0gew0KICAgICAgcGxhaW46IHsgbGFiZWw6ICJQbGFpbiBFbmRzIiwgYWN0aXZlT2Zmc2V0OiAwIH0sDQogICAgICBwbGFpbkdyb3VuZDogeyBsYWJlbDogIlBsYWluIGFuZCBHcm91bmQiLCBhY3RpdmVPZmZzZXQ6IC0xIH0sDQogICAgICBzcXVhcmVkOiB7IGxhYmVsOiAiU3F1YXJlZCBFbmRzIiwgYWN0aXZlT2Zmc2V0OiAtMiB9LA0KICAgICAgc3F1YXJlZEdyb3VuZDogeyBsYWJlbDogIlNxdWFyZWQgYW5kIEdyb3VuZCIsIGFjdGl2ZU9mZnNldDogLTIgfQ0KICAgIH07DQoNCiAgICB2YXIgdW5pdFN5c3RlbSA9ICJtZXRyaWMiOw0KICAgIHZhciBnTWFudWFsbHlFZGl0ZWQgPSBmYWxzZTsNCiAgICB2YXIgc3RyZW5ndGhNYW51YWxseUVkaXRlZCA9IGZhbHNlOw0KDQogICAgZnVuY3Rpb24gYnlJZChpZCkgew0KICAgICAgcmV0dXJuIHJvb3QucXVlcnlTZWxlY3RvcigiIyIgKyBpZCk7DQogICAgfQ0KDQogICAgdmFyIGVscyA9IHsNCiAgICAgIHVuaXRNZXRyaWM6IGJ5SWQoInNtYWxjLXVuaXQtbWV0cmljIiksDQogICAgICB1bml0SW1wZXJpYWw6IGJ5SWQoInNtYWxjLXVuaXQtaW1wZXJpYWwiKSwNCiAgICAgIHNwcmluZ1R5cGU6IGJ5SWQoInNtYWxjLXNwcmluZy10eXBlIiksDQogICAgICB3aXJlRDogYnlJZCgic21hbGMtd2lyZS1kIiksDQogICAgICBvdXRlckQ6IGJ5SWQoInNtYWxjLW91dGVyLWQiKSwNCiAgICAgIGlubmVyRDogYnlJZCgic21hbGMtaW5uZXItZCIpLA0KICAgICAgbWVhbkQ6IGJ5SWQoInNtYWxjLW1lYW4tZCIpLA0KICAgICAgYWN0aXZlQ29pbHM6IGJ5SWQoInNtYWxjLWFjdGl2ZS1jb2lscyIpLA0KICAgICAgdG90YWxDb2lsczogYnlJZCgic21hbGMtdG90YWwtY29pbHMiKSwNCiAgICAgIGF1dG9BY3RpdmU6IGJ5SWQoInNtYWxjLWF1dG8tYWN0aXZlIiksDQogICAgICBlbmRUeXBlOiBieUlkKCJzbWFsYy1lbmQtdHlwZSIpLA0KICAgICAgZnJlZUxlbmd0aDogYnlJZCgic21hbGMtZnJlZS1sZW5ndGgiKSwNCiAgICAgIGF1dG9Tb2xpZDogYnlJZCgic21hbGMtYXV0by1zb2xpZCIpLA0KICAgICAgc29saWRIZWlnaHQ6IGJ5SWQoInNtYWxjLXNvbGlkLWhlaWdodCIpLA0KICAgICAgY2xlYXJhbmNlOiBieUlkKCJzbWFsYy1jbGVhcmFuY2UiKSwNCiAgICAgIG1hdGVyaWFsOiBieUlkKCJzbWFsYy1tYXRlcmlhbCIpLA0KICAgICAgc2hlYXJHOiBieUlkKCJzbWFsYy1zaGVhci1nIiksDQogICAgICBzaGVhckdVbml0OiBieUlkKCJzbWFsYy1zaGVhci1nLXVuaXQiKSwNCiAgICAgIHRhdVlpZWxkOiBieUlkKCJzbWFsYy10YXUteWllbGQiKSwNCiAgICAgIHRhdVVsdDogYnlJZCgic21hbGMtdGF1LXVsdCIpLA0KICAgICAgc3RyZXNzTWV0aG9kOiBieUlkKCJzbWFsYy1zdHJlc3MtbWV0aG9kIiksDQogICAgICBjdXN0b21BbGxvd2FibGU6IGJ5SWQoInNtYWxjLWN1c3RvbS1hbGxvd2FibGUiKSwNCiAgICAgIGN1c3RvbUFsbG93YWJsZVJvdzogYnlJZCgic21hbGMtY3VzdG9tLWFsbG93YWJsZS1yb3ciKSwNCiAgICAgIHNhZmV0eUZhY3RvcjogYnlJZCgic21hbGMtc2FmZXR5LWZhY3RvciIpLA0KICAgICAgYXBwbGllZExvYWQ6IGJ5SWQoInNtYWxjLWFwcGxpZWQtbG9hZCIpLA0KICAgICAgbG9hZFVuaXQ6IGJ5SWQoInNtYWxjLWxvYWQtdW5pdCIpLA0KICAgICAgYnRuQ2FsY3VsYXRlOiBieUlkKCJzbWFsYy1idG4tY2FsY3VsYXRlIiksDQogICAgICByZXN1bHRzU2VjdGlvbjogYnlJZCgic21hbGMtcmVzdWx0cy1zZWN0aW9uIiksDQogICAgICB3YXJuaW5nczogYnlJZCgic21hbGMtd2FybmluZ3MiKSwNCiAgICAgIHJlc3VsdHNQYW5lbDogYnlJZCgic21hbGMtcmVzdWx0cy1wYW5lbCIpDQogICAgfTsNCg0KICAgIGlmICghZWxzLmJ0bkNhbGN1bGF0ZSkgcmV0dXJuOw0KDQogICAgdmFyIHVuaXRMZW5MYWJlbHMgPSByb290LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLXNtYWxjLXVuaXQtbGVuXSIpOw0KICAgIHZhciB1bml0U3RyZXNzTGFiZWxzID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1zbWFsYy11bml0LXN0cmVzc10iKTsNCg0KICAgIGZ1bmN0aW9uIHBhcnNlTnVtKGlucHV0KSB7DQogICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDsNCiAgICAgIHZhciB2ID0gcGFyc2VGbG9hdChTdHJpbmcoaW5wdXQudmFsdWUpLnJlcGxhY2UoLywvZywgIiIpKTsNCiAgICAgIHJldHVybiBpc05hTih2KSA\/IG51bGwgOiB2Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZvcm1hdE51bSh2YWx1ZSwgZGVjaW1hbHMpIHsNCiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8ICFpc0Zpbml0ZSh2YWx1ZSkpIHJldHVybiAiLSI7DQogICAgICByZXR1cm4gdmFsdWUudG9Mb2NhbGVTdHJpbmcodW5kZWZpbmVkLCB7DQogICAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogZGVjaW1hbHMsDQogICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogZGVjaW1hbHMNCiAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGlzTWV0cmljKCkgew0KICAgICAgcmV0dXJuIHVuaXRTeXN0ZW0gPT09ICJtZXRyaWMiOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldExlbmd0aFVuaXQoKSB7DQogICAgICByZXR1cm4gaXNNZXRyaWMoKSA\/ICJtbSIgOiAiaW4iOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldFN0cmVzc1VuaXQoKSB7DQogICAgICByZXR1cm4gaXNNZXRyaWMoKSA\/ICJNUGEiIDogInBzaSI7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0UmF0ZVVuaXQoKSB7DQogICAgICByZXR1cm4gaXNNZXRyaWMoKSA\/ICJOL21tIiA6ICJsYmYvaW4iOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldEZvcmNlVW5pdERpc3BsYXkoKSB7DQogICAgICB2YXIgdSA9IGVscy5sb2FkVW5pdCA\/IGVscy5sb2FkVW5pdC52YWx1ZSA6ICJOIjsNCiAgICAgIGlmIChpc01ldHJpYygpKSByZXR1cm4gdTsNCiAgICAgIHJldHVybiB1ID09PSAia04iID8gImtOIiA6ICJsYmYiOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldE1lYW5ETW9kZSgpIHsNCiAgICAgIHZhciBjaGVja2VkID0gcm9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPSJzbWFsYy1tZWFuLW1vZGUiXTpjaGVja2VkJyk7DQogICAgICByZXR1cm4gY2hlY2tlZCA\/IGNoZWNrZWQudmFsdWUgOiAibWFudWFsIjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnZXRTaGVhckdVbml0KCkgew0KICAgICAgcmV0dXJuIGVscy5zaGVhckdVbml0ID8gZWxzLnNoZWFyR1VuaXQudmFsdWUgOiAiR1BhIjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjb252ZXJ0SW5wdXRWYWx1ZShpbnB1dCwgZmFjdG9yLCBkZWNpbWFscykgew0KICAgICAgdmFyIHYgPSBwYXJzZU51bShpbnB1dCk7DQogICAgICBpZiAodiAhPT0gbnVsbCAmJiB2ICE9PSAwKSB7DQogICAgICAgIGlucHV0LnZhbHVlID0gZm9ybWF0TnVtKHYgKiBmYWN0b3IsIGRlY2ltYWxzICE9PSB1bmRlZmluZWQgPyBkZWNpbWFscyA6IDQpOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZUxlbmd0aFVuaXRMYWJlbHMoKSB7DQogICAgICB2YXIgdSA9IGdldExlbmd0aFVuaXQoKTsNCiAgICAgIHVuaXRMZW5MYWJlbHMuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsNCiAgICAgICAgZWwudGV4dENvbnRlbnQgPSB1Ow0KICAgICAgfSk7DQogICAgICB1bml0U3RyZXNzTGFiZWxzLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7DQogICAgICAgIGVsLnRleHRDb250ZW50ID0gZ2V0U3RyZXNzVW5pdCgpOw0KICAgICAgfSk7DQogICAgICB2YXIgcmF0ZVVuaXRFbCA9IGJ5SWQoInNtYWxjLXJhdGUtdW5pdC1sYWJlbCIpOw0KICAgICAgaWYgKHJhdGVVbml0RWwpIHJhdGVVbml0RWwudGV4dENvbnRlbnQgPSBnZXRSYXRlVW5pdCgpOw0KICAgICAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1zbWFsYy11bml0LWZvcmNlXSIpLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7DQogICAgICAgIGVsLnRleHRDb250ZW50ID0gZ2V0Rm9yY2VVbml0RGlzcGxheSgpOw0KICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc3luY1NoZWFyR1VuaXRPcHRpb25zKCkgew0KICAgICAgaWYgKCFlbHMuc2hlYXJHVW5pdCkgcmV0dXJuOw0KICAgICAgdmFyIGN1cnJlbnQgPSBlbHMuc2hlYXJHVW5pdC52YWx1ZTsNCiAgICAgIGVscy5zaGVhckdVbml0LmlubmVySFRNTCA9ICIiOw0KICAgICAgaWYgKGlzTWV0cmljKCkpIHsNCiAgICAgICAgWyJHUGEiLCAiTVBhIl0uZm9yRWFjaChmdW5jdGlvbiAodSkgew0KICAgICAgICAgIHZhciBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTsNCiAgICAgICAgICBvcHQudmFsdWUgPSB1Ow0KICAgICAgICAgIG9wdC50ZXh0Q29udGVudCA9IHU7DQogICAgICAgICAgZWxzLnNoZWFyR1VuaXQuYXBwZW5kQ2hpbGQob3B0KTsNCiAgICAgICAgfSk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB2YXIgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7DQogICAgICAgIG9wdC52YWx1ZSA9ICJwc2kiOw0KICAgICAgICBvcHQudGV4dENvbnRlbnQgPSAicHNpIjsNCiAgICAgICAgZWxzLnNoZWFyR1VuaXQuYXBwZW5kQ2hpbGQob3B0KTsNCiAgICAgIH0NCiAgICAgIGlmIChlbHMuc2hlYXJHVW5pdC5xdWVyeVNlbGVjdG9yKCdvcHRpb25bdmFsdWU9IicgKyBjdXJyZW50ICsgJyJdJykpIHsNCiAgICAgICAgZWxzLnNoZWFyR1VuaXQudmFsdWUgPSBjdXJyZW50Ow0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgZWxzLnNoZWFyR1VuaXQudmFsdWUgPSBpc01ldHJpYygpID8gIkdQYSIgOiAicHNpIjsNCiAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzeW5jTG9hZFVuaXRPcHRpb25zKCkgew0KICAgICAgaWYgKCFlbHMubG9hZFVuaXQpIHJldHVybjsNCiAgICAgIHZhciBjdXJyZW50ID0gZWxzLmxvYWRVbml0LnZhbHVlOw0KICAgICAgZWxzLmxvYWRVbml0LmlubmVySFRNTCA9ICIiOw0KICAgICAgaWYgKGlzTWV0cmljKCkpIHsNCiAgICAgICAgWyJOIiwgImtOIl0uZm9yRWFjaChmdW5jdGlvbiAodSkgew0KICAgICAgICAgIHZhciBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTsNCiAgICAgICAgICBvcHQudmFsdWUgPSB1Ow0KICAgICAgICAgIG9wdC50ZXh0Q29udGVudCA9IHU7DQogICAgICAgICAgZWxzLmxvYWRVbml0LmFwcGVuZENoaWxkKG9wdCk7DQogICAgICAgIH0pOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdmFyIG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpOw0KICAgICAgICBvcHQudmFsdWUgPSAibGJmIjsNCiAgICAgICAgb3B0LnRleHRDb250ZW50ID0gImxiZiI7DQogICAgICAgIGVscy5sb2FkVW5pdC5hcHBlbmRDaGlsZChvcHQpOw0KICAgICAgfQ0KICAgICAgaWYgKGVscy5sb2FkVW5pdC5xdWVyeVNlbGVjdG9yKCdvcHRpb25bdmFsdWU9IicgKyBjdXJyZW50ICsgJyJdJykpIHsNCiAgICAgICAgZWxzLmxvYWRVbml0LnZhbHVlID0gY3VycmVudDsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGVscy5sb2FkVW5pdC52YWx1ZSA9IGlzTWV0cmljKCkgPyAiTiIgOiAibGJmIjsNCiAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzaGVhckdUb01wYSh2YWx1ZSwgdW5pdCkgew0KICAgICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gbnVsbDsNCiAgICAgIGlmICh1bml0ID09PSAiR1BhIikgcmV0dXJuIHZhbHVlICogR1BBX1RPX01QQTsNCiAgICAgIGlmICh1bml0ID09PSAiTVBhIikgcmV0dXJuIHZhbHVlOw0KICAgICAgaWYgKHVuaXQgPT09ICJwc2kiKSByZXR1cm4gdmFsdWUgLyBNUEFfVE9fUFNJOw0KICAgICAgcmV0dXJuIHZhbHVlICogR1BBX1RPX01QQTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBtcGFUb0Rpc3BsYXlHKG1wYSkgew0KICAgICAgdmFyIHVuaXQgPSBnZXRTaGVhckdVbml0KCk7DQogICAgICBpZiAodW5pdCA9PT0gIkdQYSIpIHJldHVybiBtcGEgLyBHUEFfVE9fTVBBOw0KICAgICAgaWYgKHVuaXQgPT09ICJNUGEiKSByZXR1cm4gbXBhOw0KICAgICAgaWYgKHVuaXQgPT09ICJwc2kiKSByZXR1cm4gbXBhICogTVBBX1RPX1BTSTsNCiAgICAgIHJldHVybiBtcGEgLyBHUEFfVE9fTVBBOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHN0cmVzc1RvTXBhKHZhbHVlKSB7DQogICAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBudWxsOw0KICAgICAgcmV0dXJuIGlzTWV0cmljKCkgPyB2YWx1ZSA6IHZhbHVlIC8gTVBBX1RPX1BTSTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBtcGFUb0Rpc3BsYXlTdHJlc3MobXBhKSB7DQogICAgICBpZiAobXBhID09PSBudWxsKSByZXR1cm4gbnVsbDsNCiAgICAgIHJldHVybiBpc01ldHJpYygpID8gbXBhIDogbXBhICogTVBBX1RPX1BTSTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBmb3JjZVRvTmV3dG9ucyh2YWx1ZSwgdW5pdCkgew0KICAgICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gbnVsbDsNCiAgICAgIGlmICh1bml0ID09PSAiTiIpIHJldHVybiB2YWx1ZTsNCiAgICAgIGlmICh1bml0ID09PSAia04iKSByZXR1cm4gdmFsdWUgKiAxMDAwOw0KICAgICAgaWYgKHVuaXQgPT09ICJsYmYiKSByZXR1cm4gdmFsdWUgKiBMQkZfVE9fTjsNCiAgICAgIHJldHVybiB2YWx1ZTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBuZXd0b25zVG9EaXNwbGF5KG4pIHsNCiAgICAgIGlmIChuID09PSBudWxsKSByZXR1cm4gbnVsbDsNCiAgICAgIHZhciB1ID0gZ2V0Rm9yY2VVbml0RGlzcGxheSgpOw0KICAgICAgaWYgKHUgPT09ICJOIikgcmV0dXJuIG47DQogICAgICBpZiAodSA9PT0gImtOIikgcmV0dXJuIG4gLyAxMDAwOw0KICAgICAgaWYgKHUgPT09ICJsYmYiKSByZXR1cm4gbiAqIE5fVE9fTEJGOw0KICAgICAgcmV0dXJuIG47DQogICAgfQ0KDQogICAgZnVuY3Rpb24gbGVuZ3RoVG9NbSh2YWx1ZSkgew0KICAgICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gbnVsbDsNCiAgICAgIHJldHVybiBpc01ldHJpYygpID8gdmFsdWUgOiB2YWx1ZSAqIElOX1RPX01NOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIG1tVG9EaXNwbGF5KG1tKSB7DQogICAgICBpZiAobW0gPT09IG51bGwpIHJldHVybiBudWxsOw0KICAgICAgcmV0dXJuIGlzTWV0cmljKCkgPyBtbSA6IG1tICogTU1fVE9fSU47DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcmF0ZVRvRGlzcGxheShuUGVyTW0pIHsNCiAgICAgIGlmIChuUGVyTW0gPT09IG51bGwpIHJldHVybiBudWxsOw0KICAgICAgcmV0dXJuIGlzTWV0cmljKCkgPyBuUGVyTW0gOiBuUGVyTW0gKiAoTEJGX1RPX04gLyBJTl9UT19NTSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2FsY1dhaGxGYWN0b3IoYykgew0KICAgICAgaWYgKGMgPT09IG51bGwgfHwgYyA8PSAwKSByZXR1cm4gbnVsbDsNCiAgICAgIGlmIChNYXRoLmFicyg0ICogYyAtIDQpIDwgMWUtMTIpIHJldHVybiBudWxsOw0KICAgICAgcmV0dXJuICg0ICogYyAtIDEpIC8gKDQgKiBjIC0gNCkgKyAwLjYxNSAvIGM7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2FsY1NwcmluZ1JhdGUoZ01wYSwgZE1tLCBkTWVhbk1tLCBuYSkgew0KICAgICAgaWYgKCFnTXBhIHx8ICFkTW0gfHwgIWRNZWFuTW0gfHwgIW5hIHx8IGRNbSA8PSAwIHx8IGRNZWFuTW0gPD0gMCB8fCBuYSA8PSAwKSByZXR1cm4gbnVsbDsNCiAgICAgIGlmIChkTWVhbk1tIDw9IGRNbSkgcmV0dXJuIG51bGw7DQogICAgICByZXR1cm4gKGdNcGEgKiBNYXRoLnBvdyhkTW0sIDQpKSAvICg4ICogTWF0aC5wb3coZE1lYW5NbSwgMykgKiBuYSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2FsY1N0cmVzc0xpbWl0ZWRMb2FkKHRhdUFsbG93TXBhLCBkTW0sIGRNZWFuTW0sIGt3KSB7DQogICAgICBpZiAoIXRhdUFsbG93TXBhIHx8ICFkTW0gfHwgIWRNZWFuTW0gfHwgIWt3IHx8IGRNbSA8PSAwIHx8IGRNZWFuTW0gPD0gMCB8fCBrdyA8PSAwKSByZXR1cm4gbnVsbDsNCiAgICAgIHJldHVybiAodGF1QWxsb3dNcGEgKiBNYXRoLlBJICogTWF0aC5wb3coZE1tLCAzKSkgLyAoOCAqIGt3ICogZE1lYW5NbSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2FsY1NoZWFyU3RyZXNzKGxvYWROLCBkTW0sIGRNZWFuTW0sIGt3KSB7DQogICAgICBpZiAoIWxvYWROIHx8ICFkTW0gfHwgIWRNZWFuTW0gfHwgIWt3IHx8IGRNbSA8PSAwKSByZXR1cm4gbnVsbDsNCiAgICAgIHJldHVybiAoa3cgKiA4ICogbG9hZE4gKiBkTWVhbk1tKSAvIChNYXRoLlBJICogTWF0aC5wb3coZE1tLCAzKSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZXN0aW1hdGVBY3RpdmVDb2lscyh0b3RhbCkgew0KICAgICAgaWYgKHRvdGFsID09PSBudWxsIHx8IHRvdGFsIDw9IDApIHJldHVybiBudWxsOw0KICAgICAgdmFyIGVuZEtleSA9IGVscy5lbmRUeXBlID8gZWxzLmVuZFR5cGUudmFsdWUgOiAic3F1YXJlZEdyb3VuZCI7DQogICAgICB2YXIgb2Zmc2V0ID0gRU5EX1RZUEVTW2VuZEtleV0gPyBFTkRfVFlQRVNbZW5kS2V5XS5hY3RpdmVPZmZzZXQgOiAtMjsNCiAgICAgIHJldHVybiBNYXRoLm1heCh0b3RhbCArIG9mZnNldCwgMCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY29tcHV0ZU1lYW5EaWFtZXRlck1tKHdpcmVNbSwgb3V0ZXJNbSwgaW5uZXJNbSwgbW9kZSkgew0KICAgICAgaWYgKHdpcmVNbSA9PT0gbnVsbCB8fCB3aXJlTW0gPD0gMCkgcmV0dXJuIG51bGw7DQogICAgICBpZiAobW9kZSA9PT0gIm1hbnVhbCIpIHsNCiAgICAgICAgdmFyIGQgPSBwYXJzZU51bShlbHMubWVhbkQpOw0KICAgICAgICByZXR1cm4gZCAhPT0gbnVsbCA\/IGxlbmd0aFRvTW0oZCkgOiBudWxsOw0KICAgICAgfQ0KICAgICAgaWYgKG1vZGUgPT09ICJvZCIgJiYgb3V0ZXJNbSAhPT0gbnVsbCAmJiBvdXRlck1tID4gMCkgcmV0dXJuIG91dGVyTW0gLSB3aXJlTW07DQogICAgICBpZiAobW9kZSA9PT0gImlkIiAmJiBpbm5lck1tICE9PSBudWxsICYmIGlubmVyTW0gPj0gMCkgcmV0dXJuIGlubmVyTW0gKyB3aXJlTW07DQogICAgICByZXR1cm4gbnVsbDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnZXRJbmRleFN0YXR1cyhjKSB7DQogICAgICBpZiAoYyA9PT0gbnVsbCB8fCAhaXNGaW5pdGUoYykpIHJldHVybiB7IHRleHQ6ICItIiwgY2xzOiAic21hbGMtbmV1dHJhbCIgfTsNCiAgICAgIGlmIChjIDwgNCkgcmV0dXJuIHsgdGV4dDogIkxvdyBzcHJpbmcgaW5kZXgg4oCUIG1hbnVmYWN0dXJpbmcgYW5kIHN0cmVzcyBjb25jZW50cmF0aW9uIGNvbmNlcm5zLiIsIGNsczogInNtYWxjLWRhbmdlciIgfTsNCiAgICAgIGlmIChjID4gMTIpIHJldHVybiB7IHRleHQ6ICJIaWdoIHNwcmluZyBpbmRleCDigJQgcG90ZW50aWFsIGluc3RhYmlsaXR5IG9yIG1hbnVmYWN0dXJpbmcgY29uY2VybnMuIiwgY2xzOiAic21hbGMtd2FybmluZyIgfTsNCiAgICAgIHJldHVybiB7IHRleHQ6ICJOb3JtYWwgcmFuZ2Ug4oCUIGdlbmVyYWxseSBzdWl0YWJsZSBnZW9tZXRyeS4iLCBjbHM6ICJzbWFsYy1zdWNjZXNzIiB9Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldEdvdmVybmluZ0xpbWl0KGZTdHJlc3MsIGZEZWZsZWN0aW9uKSB7DQogICAgICBpZiAoZlN0cmVzcyA9PT0gbnVsbCAmJiBmRGVmbGVjdGlvbiA9PT0gbnVsbCkgcmV0dXJuIHsgbW9kZTogImludmFsaWQiLCBsYWJlbDogIkludmFsaWQgR2VvbWV0cnkiIH07DQogICAgICBpZiAoZlN0cmVzcyA9PT0gbnVsbCkgcmV0dXJuIHsgbW9kZTogImRlZmxlY3Rpb24iLCBsYWJlbDogIkNvaWwgQmluZCBMaW1pdCIgfTsNCiAgICAgIGlmIChmRGVmbGVjdGlvbiA9PT0gbnVsbCkgcmV0dXJuIHsgbW9kZTogInN0cmVzcyIsIGxhYmVsOiAiU3RyZXNzIExpbWl0IiB9Ow0KICAgICAgaWYgKGZEZWZsZWN0aW9uIDw9IDAgJiYgZlN0cmVzcyA+IDApIHJldHVybiB7IG1vZGU6ICJkZWZsZWN0aW9uIiwgbGFiZWw6ICJJbnN1ZmZpY2llbnQgRnJlZSBUcmF2ZWwiIH07DQogICAgICBpZiAoZlN0cmVzcyA8PSBmRGVmbGVjdGlvbikgcmV0dXJuIHsgbW9kZTogInN0cmVzcyIsIGxhYmVsOiAiTWF0ZXJpYWwgU3RyZXNzIExpbWl0IiB9Ow0KICAgICAgcmV0dXJuIHsgbW9kZTogImRlZmxlY3Rpb24iLCBsYWJlbDogIlNvbGlkIEhlaWdodCAvIENvaWwgQmluZCBMaW1pdCIgfTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnZXRTYWZldHlTdGF0dXMoYXBwbGllZE4sIGZNYXgsIGRlZmxlY3Rpb25NbSwgZGVsdGFBdmFpbE1tLCByZW1haW5pbmdNbSkgew0KICAgICAgaWYgKGZNYXggPT09IG51bGwgfHwgZk1heCA8PSAwKSByZXR1cm4geyB0ZXh0OiAiSW52YWxpZCIsIGNsczogInNtYWxjLWRhbmdlciIgfTsNCiAgICAgIGlmIChhcHBsaWVkTiA9PT0gbnVsbCB8fCBhcHBsaWVkTiA8PSAwKSB7DQogICAgICAgIHJldHVybiB7IHRleHQ6ICJObyBBcHBsaWVkIExvYWQiLCBjbHM6ICJzbWFsYy1zdWNjZXNzIiB9Ow0KICAgICAgfQ0KICAgICAgdmFyIHV0aWxpemF0aW9uID0gYXBwbGllZE4gLyBmTWF4Ow0KICAgICAgdmFyIGNvaWxCaW5kID0gZGVmbGVjdGlvbk1tICE9PSBudWxsICYmIGRlbHRhQXZhaWxNbSAhPT0gbnVsbCAmJiBkZWZsZWN0aW9uTW0gPj0gZGVsdGFBdmFpbE1tOw0KICAgICAgaWYgKHV0aWxpemF0aW9uID4gMSB8fCBjb2lsQmluZCkgcmV0dXJuIHsgdGV4dDogIk92ZXJsb2FkZWQiLCBjbHM6ICJzbWFsYy1kYW5nZXIiIH07DQogICAgICBpZiAodXRpbGl6YXRpb24gPj0gMC44NSB8fCAocmVtYWluaW5nTW0gIT09IG51bGwgJiYgcmVtYWluaW5nTW0gPCBkZWx0YUF2YWlsTW0gKiAwLjE1KSkgew0KICAgICAgICByZXR1cm4geyB0ZXh0OiAiQ2F1dGlvbiIsIGNsczogInNtYWxjLXdhcm5pbmciIH07DQogICAgICB9DQogICAgICByZXR1cm4geyB0ZXh0OiAiU2FmZSIsIGNsczogInNtYWxjLXN1Y2Nlc3MiIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2hvd1dhcm5pbmdzKGxpc3QpIHsNCiAgICAgIGlmICghZWxzLndhcm5pbmdzKSByZXR1cm47DQogICAgICBlbHMud2FybmluZ3MuaW5uZXJIVE1MID0gIiI7DQogICAgICBpZiAoIWxpc3QubGVuZ3RoKSB7DQogICAgICAgIGVscy53YXJuaW5ncy5oaWRkZW4gPSB0cnVlOw0KICAgICAgICByZXR1cm47DQogICAgICB9DQogICAgICBlbHMud2FybmluZ3MuaGlkZGVuID0gZmFsc2U7DQogICAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKHcpIHsNCiAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgICBkaXYuY2xhc3NOYW1lID0gInNtYWxjLWFsZXJ0IHNtYWxjLWFsZXJ0LSIgKyB3LmxldmVsOw0KICAgICAgICBkaXYudGV4dENvbnRlbnQgPSB3Lm1lc3NhZ2U7DQogICAgICAgIGVscy53YXJuaW5ncy5hcHBlbmRDaGlsZChkaXYpOw0KICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlTWVhbkRGcm9tR2VvbWV0cnkoKSB7DQogICAgICB2YXIgbW9kZSA9IGdldE1lYW5ETW9kZSgpOw0KICAgICAgdmFyIHdpcmUgPSBwYXJzZU51bShlbHMud2lyZUQpOw0KICAgICAgdmFyIG91dGVyID0gcGFyc2VOdW0oZWxzLm91dGVyRCk7DQogICAgICB2YXIgaW5uZXIgPSBwYXJzZU51bShlbHMuaW5uZXJEKTsNCiAgICAgIHZhciB3aXJlTW0gPSBsZW5ndGhUb01tKHdpcmUpOw0KICAgICAgdmFyIG1lYW5NbSA9IGNvbXB1dGVNZWFuRGlhbWV0ZXJNbSh3aXJlTW0sIGxlbmd0aFRvTW0ob3V0ZXIpLCBsZW5ndGhUb01tKGlubmVyKSwgbW9kZSk7DQogICAgICBpZiAobW9kZSAhPT0gIm1hbnVhbCIgJiYgbWVhbk1tICE9PSBudWxsICYmIGVscy5tZWFuRCkgew0KICAgICAgICBlbHMubWVhbkQudmFsdWUgPSBmb3JtYXROdW0obW1Ub0Rpc3BsYXkobWVhbk1tKSwgNCk7DQogICAgICAgIGVscy5tZWFuRC5yZWFkT25seSA9IHRydWU7DQogICAgICAgIGVscy5tZWFuRC5jbGFzc0xpc3QuYWRkKCJzbWFsYy1yZWFkb25seSIpOw0KICAgICAgfSBlbHNlIGlmIChlbHMubWVhbkQpIHsNCiAgICAgICAgZWxzLm1lYW5ELnJlYWRPbmx5ID0gZmFsc2U7DQogICAgICAgIGVscy5tZWFuRC5jbGFzc0xpc3QucmVtb3ZlKCJzbWFsYy1yZWFkb25seSIpOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZUFjdGl2ZUNvaWxzRnJvbUVuZFR5cGUoKSB7DQogICAgICBpZiAoIWVscy5hdXRvQWN0aXZlIHx8ICFlbHMuYXV0b0FjdGl2ZS5jaGVja2VkKSByZXR1cm47DQogICAgICB2YXIgdG90YWwgPSBwYXJzZU51bShlbHMudG90YWxDb2lscyk7DQogICAgICB2YXIgbmEgPSBlc3RpbWF0ZUFjdGl2ZUNvaWxzKHRvdGFsKTsNCiAgICAgIGlmIChuYSAhPT0gbnVsbCAmJiBlbHMuYWN0aXZlQ29pbHMpIHsNCiAgICAgICAgZWxzLmFjdGl2ZUNvaWxzLnZhbHVlID0gZm9ybWF0TnVtKG5hLCAyKTsNCiAgICAgICAgZWxzLmFjdGl2ZUNvaWxzLnJlYWRPbmx5ID0gdHJ1ZTsNCiAgICAgICAgZWxzLmFjdGl2ZUNvaWxzLmNsYXNzTGlzdC5hZGQoInNtYWxjLXJlYWRvbmx5Iik7DQogICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlU29saWRIZWlnaHRGcm9tQ29pbHMoKSB7DQogICAgICBpZiAoIWVscy5hdXRvU29saWQgfHwgIWVscy5hdXRvU29saWQuY2hlY2tlZCkgcmV0dXJuOw0KICAgICAgdmFyIHRvdGFsID0gcGFyc2VOdW0oZWxzLnRvdGFsQ29pbHMpOw0KICAgICAgdmFyIHdpcmUgPSBwYXJzZU51bShlbHMud2lyZUQpOw0KICAgICAgaWYgKHRvdGFsICE9PSBudWxsICYmIHdpcmUgIT09IG51bGwgJiYgdG90YWwgPiAwICYmIHdpcmUgPiAwICYmIGVscy5zb2xpZEhlaWdodCkgew0KICAgICAgICB2YXIgc29saWRNbSA9IHRvdGFsICogbGVuZ3RoVG9NbSh3aXJlKTsNCiAgICAgICAgZWxzLnNvbGlkSGVpZ2h0LnZhbHVlID0gZm9ybWF0TnVtKG1tVG9EaXNwbGF5KHNvbGlkTW0pLCA0KTsNCiAgICAgICAgZWxzLnNvbGlkSGVpZ2h0LnJlYWRPbmx5ID0gdHJ1ZTsNCiAgICAgICAgZWxzLnNvbGlkSGVpZ2h0LmNsYXNzTGlzdC5hZGQoInNtYWxjLXJlYWRvbmx5Iik7DQogICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYXBwbHlNYXRlcmlhbFByZXNldCgpIHsNCiAgICAgIGlmICghZWxzLm1hdGVyaWFsKSByZXR1cm47DQogICAgICB2YXIga2V5ID0gZWxzLm1hdGVyaWFsLnZhbHVlOw0KICAgICAgdmFyIG1hdCA9IE1BVEVSSUFMU1trZXldOw0KICAgICAgaWYgKCFtYXQgfHwga2V5ID09PSAiY3VzdG9tIikgcmV0dXJuOw0KICAgICAgaWYgKCFnTWFudWFsbHlFZGl0ZWQgJiYgZWxzLnNoZWFyRyAmJiBtYXQuZ0dwYSAhPT0gbnVsbCkgew0KICAgICAgICB2YXIgbXBhID0gbWF0LmdHcGEgKiBHUEFfVE9fTVBBOw0KICAgICAgICBlbHMuc2hlYXJHLnZhbHVlID0gZm9ybWF0TnVtKG1wYVRvRGlzcGxheUcobXBhKSwgaXNNZXRyaWMoKSA\/IDIgOiAwKTsNCiAgICAgIH0NCiAgICAgIGlmICghc3RyZW5ndGhNYW51YWxseUVkaXRlZCkgew0KICAgICAgICBpZiAoZWxzLnRhdVlpZWxkICYmIG1hdC50YXVZaWVsZE1wYSAhPT0gbnVsbCkgew0KICAgICAgICAgIGVscy50YXVZaWVsZC52YWx1ZSA9IGZvcm1hdE51bShtcGFUb0Rpc3BsYXlTdHJlc3MobWF0LnRhdVlpZWxkTXBhKSwgaXNNZXRyaWMoKSA\/IDAgOiAwKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoZWxzLnRhdVVsdCAmJiBtYXQudGF1VWx0TXBhICE9PSBudWxsKSB7DQogICAgICAgICAgZWxzLnRhdVVsdC52YWx1ZSA9IGZvcm1hdE51bShtcGFUb0Rpc3BsYXlTdHJlc3MobWF0LnRhdVVsdE1wYSksIGlzTWV0cmljKCkgPyAwIDogMCk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiB0b2dnbGVDdXN0b21BbGxvd2FibGVSb3coKSB7DQogICAgICBpZiAoIWVscy5zdHJlc3NNZXRob2QgfHwgIWVscy5jdXN0b21BbGxvd2FibGVSb3cpIHJldHVybjsNCiAgICAgIHZhciBpc0N1c3RvbSA9IGVscy5zdHJlc3NNZXRob2QudmFsdWUgPT09ICJjdXN0b20iOw0KICAgICAgZWxzLmN1c3RvbUFsbG93YWJsZVJvdy5oaWRkZW4gPSAhaXNDdXN0b207DQogICAgfQ0KDQogICAgZnVuY3Rpb24gaGlkZVJlc3VsdHNTZWN0aW9uKCkgew0KICAgICAgaWYgKGVscy5yZXN1bHRzU2VjdGlvbikgZWxzLnJlc3VsdHNTZWN0aW9uLmhpZGRlbiA9IHRydWU7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2hvd1Jlc3VsdHNTZWN0aW9uKCkgew0KICAgICAgaWYgKGVscy5yZXN1bHRzU2VjdGlvbikgZWxzLnJlc3VsdHNTZWN0aW9uLmhpZGRlbiA9IGZhbHNlOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZSgpIHsNCiAgICAgIHNob3dSZXN1bHRzU2VjdGlvbigpOw0KICAgICAgdmFyIHdhcm5pbmdzID0gW107DQoNCiAgICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgiLnNtYWxjLWVycm9yIikuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsNCiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgic21hbGMtZXJyb3IiKTsNCiAgICAgIH0pOw0KDQogICAgICB2YXIgd2lyZSA9IHBhcnNlTnVtKGVscy53aXJlRCk7DQogICAgICB2YXIgb3V0ZXIgPSBwYXJzZU51bShlbHMub3V0ZXJEKTsNCiAgICAgIHZhciBpbm5lciA9IHBhcnNlTnVtKGVscy5pbm5lckQpOw0KICAgICAgdmFyIHRvdGFsID0gcGFyc2VOdW0oZWxzLnRvdGFsQ29pbHMpOw0KICAgICAgdmFyIG5hSW5wdXQgPSBwYXJzZU51bShlbHMuYWN0aXZlQ29pbHMpOw0KICAgICAgdmFyIGdWYWwgPSBwYXJzZU51bShlbHMuc2hlYXJHKTsNCiAgICAgIHZhciBmcmVlTGVuID0gcGFyc2VOdW0oZWxzLmZyZWVMZW5ndGgpOw0KICAgICAgdmFyIHNvbGlkSW5wdXQgPSBwYXJzZU51bShlbHMuc29saWRIZWlnaHQpOw0KICAgICAgdmFyIGNsZWFyYW5jZSA9IHBhcnNlTnVtKGVscy5jbGVhcmFuY2UpOw0KICAgICAgdmFyIHNmID0gcGFyc2VOdW0oZWxzLnNhZmV0eUZhY3Rvcik7DQogICAgICB2YXIgYXBwbGllZCA9IHBhcnNlTnVtKGVscy5hcHBsaWVkTG9hZCk7DQogICAgICB2YXIgbG9hZFVuaXQgPSBlbHMubG9hZFVuaXQgPyBlbHMubG9hZFVuaXQudmFsdWUgOiAiTiI7DQoNCiAgICAgIGlmICh3aXJlID09PSBudWxsIHx8IHdpcmUgPD0gMCkgew0KICAgICAgICB3YXJuaW5ncy5wdXNoKHsgbGV2ZWw6ICJlcnJvciIsIG1lc3NhZ2U6ICJXaXJlIGRpYW1ldGVyIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIiB9KTsNCiAgICAgICAgaWYgKGVscy53aXJlRCkgZWxzLndpcmVELmNsYXNzTGlzdC5hZGQoInNtYWxjLWVycm9yIik7DQogICAgICB9DQoNCiAgICAgIHVwZGF0ZU1lYW5ERnJvbUdlb21ldHJ5KCk7DQogICAgICB2YXIgd2lyZU1tID0gbGVuZ3RoVG9NbSh3aXJlKTsNCiAgICAgIHZhciBtZWFuTW0gPSBjb21wdXRlTWVhbkRpYW1ldGVyTW0od2lyZU1tLCBsZW5ndGhUb01tKG91dGVyKSwgbGVuZ3RoVG9NbShpbm5lciksIGdldE1lYW5ETW9kZSgpKTsNCg0KICAgICAgaWYgKG1lYW5NbSA9PT0gbnVsbCB8fCBtZWFuTW0gPD0gMCkgew0KICAgICAgICB3YXJuaW5ncy5wdXNoKHsgbGV2ZWw6ICJlcnJvciIsIG1lc3NhZ2U6ICJNZWFuIGNvaWwgZGlhbWV0ZXIgbXVzdCBiZSBwb3NpdGl2ZS4gRW50ZXIgT0QsIElELCBvciBtZWFuIGRpYW1ldGVyIGRpcmVjdGx5LiIgfSk7DQogICAgICAgIGlmIChlbHMubWVhbkQpIGVscy5tZWFuRC5jbGFzc0xpc3QuYWRkKCJzbWFsYy1lcnJvciIpOw0KICAgICAgfQ0KDQogICAgICBpZiAod2lyZU1tICE9PSBudWxsICYmIG1lYW5NbSAhPT0gbnVsbCAmJiBtZWFuTW0gPD0gd2lyZU1tKSB7DQogICAgICAgIHdhcm5pbmdzLnB1c2goeyBsZXZlbDogImVycm9yIiwgbWVzc2FnZTogIk1lYW4gY29pbCBkaWFtZXRlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB3aXJlIGRpYW1ldGVyIChEID4gZCkuIiB9KTsNCiAgICAgIH0NCg0KICAgICAgdmFyIG5hID0gbmFJbnB1dDsNCiAgICAgIGlmIChlbHMuYXV0b0FjdGl2ZSAmJiBlbHMuYXV0b0FjdGl2ZS5jaGVja2VkKSBuYSA9IGVzdGltYXRlQWN0aXZlQ29pbHModG90YWwpOw0KICAgICAgaWYgKG5hID09PSBudWxsIHx8IG5hIDw9IDApIHsNCiAgICAgICAgd2FybmluZ3MucHVzaCh7IGxldmVsOiAiZXJyb3IiLCBtZXNzYWdlOiAiQXQgbGVhc3Qgb25lIGFjdGl2ZSBjb2lsIGlzIHJlcXVpcmVkLiIgfSk7DQogICAgICAgIGlmIChlbHMuYWN0aXZlQ29pbHMpIGVscy5hY3RpdmVDb2lscy5jbGFzc0xpc3QuYWRkKCJzbWFsYy1lcnJvciIpOw0KICAgICAgfQ0KDQogICAgICBpZiAodG90YWwgPT09IG51bGwgfHwgdG90YWwgPD0gMCkgew0KICAgICAgICB3YXJuaW5ncy5wdXNoKHsgbGV2ZWw6ICJlcnJvciIsIG1lc3NhZ2U6ICJUb3RhbCBudW1iZXIgb2YgY29pbHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iIH0pOw0KICAgICAgICBpZiAoZWxzLnRvdGFsQ29pbHMpIGVscy50b3RhbENvaWxzLmNsYXNzTGlzdC5hZGQoInNtYWxjLWVycm9yIik7DQogICAgICB9DQoNCiAgICAgIHZhciBnTXBhID0gc2hlYXJHVG9NcGEoZ1ZhbCwgZ2V0U2hlYXJHVW5pdCgpKTsNCiAgICAgIGlmIChnTXBhID09PSBudWxsIHx8IGdNcGEgPD0gMCkgew0KICAgICAgICB3YXJuaW5ncy5wdXNoKHsgbGV2ZWw6ICJlcnJvciIsIG1lc3NhZ2U6ICJTaGVhciBtb2R1bHVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIiB9KTsNCiAgICAgICAgaWYgKGVscy5zaGVhckcpIGVscy5zaGVhckcuY2xhc3NMaXN0LmFkZCgic21hbGMtZXJyb3IiKTsNCiAgICAgIH0NCg0KICAgICAgaWYgKHNmID09PSBudWxsIHx8IHNmIDw9IDApIHsNCiAgICAgICAgd2FybmluZ3MucHVzaCh7IGxldmVsOiAiZXJyb3IiLCBtZXNzYWdlOiAiRGVzaWduIHNhZmV0eSBmYWN0b3IgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iIH0pOw0KICAgICAgICBpZiAoZWxzLnNhZmV0eUZhY3RvcikgZWxzLnNhZmV0eUZhY3Rvci5jbGFzc0xpc3QuYWRkKCJzbWFsYy1lcnJvciIpOw0KICAgICAgfQ0KDQogICAgICBpZiAoZnJlZUxlbiA9PT0gbnVsbCB8fCBmcmVlTGVuIDw9IDApIHsNCiAgICAgICAgd2FybmluZ3MucHVzaCh7IGxldmVsOiAiZXJyb3IiLCBtZXNzYWdlOiAiRnJlZSBsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iIH0pOw0KICAgICAgICBpZiAoZWxzLmZyZWVMZW5ndGgpIGVscy5mcmVlTGVuZ3RoLmNsYXNzTGlzdC5hZGQoInNtYWxjLWVycm9yIik7DQogICAgICB9DQoNCiAgICAgIHZhciBoYXNDcml0aWNhbCA9IHdhcm5pbmdzLnNvbWUoZnVuY3Rpb24gKHcpIHsgcmV0dXJuIHcubGV2ZWwgPT09ICJlcnJvciI7IH0pOw0KICAgICAgaWYgKGhhc0NyaXRpY2FsKSB7DQogICAgICAgIHNob3dXYXJuaW5ncyh3YXJuaW5ncyk7DQogICAgICAgIGlmIChlbHMucmVzdWx0c1BhbmVsKSBlbHMucmVzdWx0c1BhbmVsLmhpZGRlbiA9IHRydWU7DQogICAgICAgIHJldHVybjsNCiAgICAgIH0NCg0KICAgICAgdXBkYXRlU29saWRIZWlnaHRGcm9tQ29pbHMoKTsNCiAgICAgIHZhciBzb2xpZE1tID0gc29saWRJbnB1dCAhPT0gbnVsbCA\/IGxlbmd0aFRvTW0oc29saWRJbnB1dCkgOiAodG90YWwgKiB3aXJlTW0pOw0KICAgICAgdmFyIGNsZWFyYW5jZU1tID0gY2xlYXJhbmNlICE9PSBudWxsID8gbGVuZ3RoVG9NbShjbGVhcmFuY2UpIDogMDsNCiAgICAgIGlmIChjbGVhcmFuY2VNbSA8IDApIGNsZWFyYW5jZU1tID0gMDsNCg0KICAgICAgdmFyIHNwcmluZ0luZGV4ID0gbWVhbk1tIC8gd2lyZU1tOw0KICAgICAgdmFyIGt3ID0gY2FsY1dhaGxGYWN0b3Ioc3ByaW5nSW5kZXgpOw0KICAgICAgdmFyIGluZGV4U3RhdHVzID0gZ2V0SW5kZXhTdGF0dXMoc3ByaW5nSW5kZXgpOw0KDQogICAgICBpZiAoa3cgPT09IG51bGwpIHsNCiAgICAgICAgd2FybmluZ3MucHVzaCh7IGxldmVsOiAiZXJyb3IiLCBtZXNzYWdlOiAiSW52YWxpZCBzcHJpbmcgZ2VvbWV0cnkg4oCUIFdhaGwgZmFjdG9yIGNhbm5vdCBiZSBjYWxjdWxhdGVkLiIgfSk7DQogICAgICAgIHNob3dXYXJuaW5ncyh3YXJuaW5ncyk7DQogICAgICAgIGlmIChlbHMucmVzdWx0c1BhbmVsKSBlbHMucmVzdWx0c1BhbmVsLmhpZGRlbiA9IHRydWU7DQogICAgICAgIHJldHVybjsNCiAgICAgIH0NCg0KICAgICAgdmFyIHN0cmVzc01ldGhvZCA9IGVscy5zdHJlc3NNZXRob2QgPyBlbHMuc3RyZXNzTWV0aG9kLnZhbHVlIDogInlpZWxkIjsNCiAgICAgIHZhciB0YXVTdHJlbmd0aE1wYTsNCiAgICAgIGlmIChzdHJlc3NNZXRob2QgPT09ICJjdXN0b20iKSB7DQogICAgICAgIHZhciBjdXN0b21WYWwgPSBwYXJzZU51bShlbHMuY3VzdG9tQWxsb3dhYmxlKTsNCiAgICAgICAgdGF1U3RyZW5ndGhNcGEgPSBzdHJlc3NUb01wYShjdXN0b21WYWwpOw0KICAgICAgICBpZiAodGF1U3RyZW5ndGhNcGEgPT09IG51bGwgfHwgdGF1U3RyZW5ndGhNcGEgPD0gMCkgew0KICAgICAgICAgIHdhcm5pbmdzLnB1c2goeyBsZXZlbDogImVycm9yIiwgbWVzc2FnZTogIkN1c3RvbSBhbGxvd2FibGUgc3RyZXNzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIiB9KTsNCiAgICAgICAgICBpZiAoZWxzLmN1c3RvbUFsbG93YWJsZSkgZWxzLmN1c3RvbUFsbG93YWJsZS5jbGFzc0xpc3QuYWRkKCJzbWFsYy1lcnJvciIpOw0KICAgICAgICAgIHNob3dXYXJuaW5ncyh3YXJuaW5ncyk7DQogICAgICAgICAgaWYgKGVscy5yZXN1bHRzUGFuZWwpIGVscy5yZXN1bHRzUGFuZWwuaGlkZGVuID0gdHJ1ZTsNCiAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRhdVN0cmVuZ3RoTXBhID0gc3RyZXNzVG9NcGEocGFyc2VOdW0oZWxzLnRhdVlpZWxkKSk7DQogICAgICAgIGlmICh0YXVTdHJlbmd0aE1wYSA9PT0gbnVsbCB8fCB0YXVTdHJlbmd0aE1wYSA8PSAwKSB7DQogICAgICAgICAgd2FybmluZ3MucHVzaCh7IGxldmVsOiAiZXJyb3IiLCBtZXNzYWdlOiAiU2hlYXIgeWllbGQgc3RyZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iIH0pOw0KICAgICAgICAgIGlmIChlbHMudGF1WWllbGQpIGVscy50YXVZaWVsZC5jbGFzc0xpc3QuYWRkKCJzbWFsYy1lcnJvciIpOw0KICAgICAgICAgIHNob3dXYXJuaW5ncyh3YXJuaW5ncyk7DQogICAgICAgICAgaWYgKGVscy5yZXN1bHRzUGFuZWwpIGVscy5yZXN1bHRzUGFuZWwuaGlkZGVuID0gdHJ1ZTsNCiAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgdmFyIHRhdUFsbG93TXBhID0gdGF1U3RyZW5ndGhNcGEgLyBzZjsNCiAgICAgIHZhciBmU3RyZXNzID0gY2FsY1N0cmVzc0xpbWl0ZWRMb2FkKHRhdUFsbG93TXBhLCB3aXJlTW0sIG1lYW5NbSwga3cpOw0KICAgICAgdmFyIGsgPSBjYWxjU3ByaW5nUmF0ZShnTXBhLCB3aXJlTW0sIG1lYW5NbSwgbmEpOw0KICAgICAgdmFyIGZyZWVNbSA9IGxlbmd0aFRvTW0oZnJlZUxlbik7DQogICAgICB2YXIgZGVsdGFBdmFpbE1tID0gZnJlZU1tICE9PSBudWxsICYmIHNvbGlkTW0gIT09IG51bGwgPyBmcmVlTW0gLSBzb2xpZE1tIC0gY2xlYXJhbmNlTW0gOiBudWxsOw0KDQogICAgICBpZiAoZnJlZU1tICE9PSBudWxsICYmIHNvbGlkTW0gIT09IG51bGwgJiYgZnJlZUxlbiAhPT0gbnVsbCAmJiBzb2xpZE1tID49IGZyZWVNbSkgew0KICAgICAgICB3YXJuaW5ncy5wdXNoKHsgbGV2ZWw6ICJ3YXJuaW5nIiwgbWVzc2FnZTogIkZyZWUgbGVuZ3RoIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBzb2xpZCBoZWlnaHQuIiB9KTsNCiAgICAgIH0NCg0KICAgICAgaWYgKGRlbHRhQXZhaWxNbSAhPT0gbnVsbCAmJiBkZWx0YUF2YWlsTW0gPD0gMCkgew0KICAgICAgICB3YXJuaW5ncy5wdXNoKHsgbGV2ZWw6ICJ3YXJuaW5nIiwgbWVzc2FnZTogIkNvaWwgYmluZCBjbGVhcmFuY2UgbGVhdmVzIG5vIGF2YWlsYWJsZSBjb21wcmVzc2lvbiB0cmF2ZWwuIiB9KTsNCiAgICAgIH0NCg0KICAgICAgaWYgKHNwcmluZ0luZGV4IDwgNCB8fCBzcHJpbmdJbmRleCA+IDEyKSB7DQogICAgICAgIHdhcm5pbmdzLnB1c2goeyBsZXZlbDogIndhcm5pbmciLCBtZXNzYWdlOiBpbmRleFN0YXR1cy50ZXh0IH0pOw0KICAgICAgfQ0KDQogICAgICB2YXIgZkRlZmxlY3Rpb24gPSBrICE9PSBudWxsICYmIGRlbHRhQXZhaWxNbSAhPT0gbnVsbCAmJiBkZWx0YUF2YWlsTW0gPiAwID8gayAqIGRlbHRhQXZhaWxNbSA6IChkZWx0YUF2YWlsTW0gIT09IG51bGwgJiYgZGVsdGFBdmFpbE1tIDw9IDAgPyAwIDogbnVsbCk7DQogICAgICB2YXIgZ292ZXJuaW5nID0gZ2V0R292ZXJuaW5nTGltaXQoZlN0cmVzcywgZkRlZmxlY3Rpb24pOw0KDQogICAgICB2YXIgZk1heCA9IG51bGw7DQogICAgICBpZiAoZlN0cmVzcyAhPT0gbnVsbCAmJiBmRGVmbGVjdGlvbiAhPT0gbnVsbCkgew0KICAgICAgICBmTWF4ID0gTWF0aC5taW4oZlN0cmVzcywgZkRlZmxlY3Rpb24pOw0KICAgICAgfSBlbHNlIGlmIChmU3RyZXNzICE9PSBudWxsKSB7DQogICAgICAgIGZNYXggPSBmU3RyZXNzOw0KICAgICAgfSBlbHNlIGlmIChmRGVmbGVjdGlvbiAhPT0gbnVsbCkgew0KICAgICAgICBmTWF4ID0gZkRlZmxlY3Rpb247DQogICAgICB9DQoNCiAgICAgIGlmIChmTWF4ICE9PSBudWxsICYmIGZNYXggPD0gMCkgew0KICAgICAgICB3YXJuaW5ncy5wdXNoKHsgbGV2ZWw6ICJ3YXJuaW5nIiwgbWVzc2FnZTogIk1heGltdW0gYWxsb3dhYmxlIGxvYWQgaXMgemVybyBvciBuZWdhdGl2ZSDigJQgY2hlY2sgZ2VvbWV0cnkgYW5kIG1hdGVyaWFsIGlucHV0cy4iIH0pOw0KICAgICAgfQ0KDQogICAgICB2YXIgYXBwbGllZE4gPSBhcHBsaWVkICE9PSBudWxsICYmIGFwcGxpZWQgPiAwID8gZm9yY2VUb05ld3RvbnMoYXBwbGllZCwgbG9hZFVuaXQpIDogbnVsbDsNCiAgICAgIHZhciBkZWZsZWN0aW9uTW0gPSBhcHBsaWVkTiAhPT0gbnVsbCAmJiBrICE9PSBudWxsICYmIGsgPiAwID8gYXBwbGllZE4gLyBrIDogbnVsbDsNCiAgICAgIHZhciByZW1haW5pbmdNbSA9IGRlbHRhQXZhaWxNbSAhPT0gbnVsbCAmJiBkZWZsZWN0aW9uTW0gIT09IG51bGwgPyBkZWx0YUF2YWlsTW0gLSBkZWZsZWN0aW9uTW0gOiBudWxsOw0KICAgICAgdmFyIHV0aWxpemF0aW9uID0gYXBwbGllZE4gIT09IG51bGwgJiYgZk1heCAhPT0gbnVsbCAmJiBmTWF4ID4gMCA\/IChhcHBsaWVkTiAvIGZNYXgpICogMTAwIDogbnVsbDsNCiAgICAgIHZhciBhY3R1YWxTZiA9IGFwcGxpZWROICE9PSBudWxsICYmIGFwcGxpZWROID4gMCAmJiBmTWF4ICE9PSBudWxsID8gZk1heCAvIGFwcGxpZWROIDogbnVsbDsNCiAgICAgIHZhciB0YXVBcHBsaWVkID0gYXBwbGllZE4gIT09IG51bGwgPyBjYWxjU2hlYXJTdHJlc3MoYXBwbGllZE4sIHdpcmVNbSwgbWVhbk1tLCBrdykgOiBudWxsOw0KICAgICAgdmFyIHN0cmVzc1V0aWwgPSB0YXVBcHBsaWVkICE9PSBudWxsICYmIHRhdUFsbG93TXBhID4gMCA\/ICh0YXVBcHBsaWVkIC8gdGF1QWxsb3dNcGEpICogMTAwIDogbnVsbDsNCg0KICAgICAgaWYgKGFwcGxpZWROICE9PSBudWxsICYmIGZNYXggIT09IG51bGwgJiYgYXBwbGllZE4gPiBmTWF4KSB7DQogICAgICAgIHdhcm5pbmdzLnB1c2goeyBsZXZlbDogIndhcm5pbmciLCBtZXNzYWdlOiAiQXBwbGllZCBsb2FkIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2FibGUgc3ByaW5nIGxvYWQuIiB9KTsNCiAgICAgIH0NCg0KICAgICAgaWYgKGRlZmxlY3Rpb25NbSAhPT0gbnVsbCAmJiBkZWx0YUF2YWlsTW0gIT09IG51bGwgJiYgZGVmbGVjdGlvbk1tID4gZGVsdGFBdmFpbE1tKSB7DQogICAgICAgIHdhcm5pbmdzLnB1c2goeyBsZXZlbDogIndhcm5pbmciLCBtZXNzYWdlOiAiQXBwbGllZCBsb2FkIGNhdXNlcyBkZWZsZWN0aW9uIGJleW9uZCBhdmFpbGFibGUgdHJhdmVsIOKAlCBjb2lsIGJpbmQgcmlzay4iIH0pOw0KICAgICAgfQ0KDQogICAgICB2YXIgc2FmZXR5U3RhdHVzID0gZ2V0U2FmZXR5U3RhdHVzKGFwcGxpZWROLCBmTWF4LCBkZWZsZWN0aW9uTW0sIGRlbHRhQXZhaWxNbSwgcmVtYWluaW5nTW0pOw0KDQogICAgICBzaG93V2FybmluZ3Mod2FybmluZ3MpOw0KDQogICAgICBieUlkKCJzbWFsYy1yZXMtZm1heCIpLnRleHRDb250ZW50ID0gZk1heCAhPT0gbnVsbCA\/IGZvcm1hdE51bShuZXd0b25zVG9EaXNwbGF5KGZNYXgpLCAyKSA6ICItIjsNCiAgICAgIGJ5SWQoInNtYWxjLXJlcy1mc3RyZXNzIikudGV4dENvbnRlbnQgPSBmU3RyZXNzICE9PSBudWxsID8gZm9ybWF0TnVtKG5ld3RvbnNUb0Rpc3BsYXkoZlN0cmVzcyksIDIpIDogIi0iOw0KICAgICAgYnlJZCgic21hbGMtcmVzLWZkZWZsZWN0aW9uIikudGV4dENvbnRlbnQgPSBmRGVmbGVjdGlvbiAhPT0gbnVsbCA\/IGZvcm1hdE51bShuZXd0b25zVG9EaXNwbGF5KGZEZWZsZWN0aW9uKSwgMikgOiAiLSI7DQogICAgICBieUlkKCJzbWFsYy1yZXMtdGF1LWFsbG93IikudGV4dENvbnRlbnQgPSBmb3JtYXROdW0obXBhVG9EaXNwbGF5U3RyZXNzKHRhdUFsbG93TXBhKSwgaXNNZXRyaWMoKSA\/IDEgOiAwKTsNCiAgICAgIGJ5SWQoInNtYWxjLXJlcy1rdyIpLnRleHRDb250ZW50ID0gZm9ybWF0TnVtKGt3LCA0KTsNCiAgICAgIGJ5SWQoInNtYWxjLXJlcy1pbmRleCIpLnRleHRDb250ZW50ID0gZm9ybWF0TnVtKHNwcmluZ0luZGV4LCAzKTsNCiAgICAgIGJ5SWQoInNtYWxjLXJlcy1yYXRlIikudGV4dENvbnRlbnQgPSBrICE9PSBudWxsID8gZm9ybWF0TnVtKHJhdGVUb0Rpc3BsYXkoayksIDQpIDogIi0iOw0KICAgICAgYnlJZCgic21hbGMtcmVzLWRlbHRhLWF2YWlsIikudGV4dENvbnRlbnQgPSBkZWx0YUF2YWlsTW0gIT09IG51bGwgJiYgZGVsdGFBdmFpbE1tID4gMCA\/IGZvcm1hdE51bShtbVRvRGlzcGxheShkZWx0YUF2YWlsTW0pLCAzKSA6ICItIjsNCiAgICAgIGJ5SWQoInNtYWxjLXJlcy1zb2xpZCIpLnRleHRDb250ZW50ID0gc29saWRNbSAhPT0gbnVsbCA\/IGZvcm1hdE51bShtbVRvRGlzcGxheShzb2xpZE1tKSwgMykgOiAiLSI7DQogICAgICBieUlkKCJzbWFsYy1yZXMtZ292ZXJuaW5nIikudGV4dENvbnRlbnQgPSBnb3Zlcm5pbmcubGFiZWw7DQoNCiAgICAgIHZhciBpbmRleEhpbnQgPSBieUlkKCJzbWFsYy1yZXMtaW5kZXgtaGludCIpOw0KICAgICAgaWYgKGluZGV4SGludCkgew0KICAgICAgICBpbmRleEhpbnQudGV4dENvbnRlbnQgPSBpbmRleFN0YXR1cy50ZXh0Ow0KICAgICAgICBpbmRleEhpbnQuY2xhc3NOYW1lID0gInNtYWxjLWluZGV4LWhpbnQgIiArIGluZGV4U3RhdHVzLmNsczsNCiAgICAgIH0NCg0KICAgICAgYnlJZCgic21hbGMtcmVzLXV0aWxpemF0aW9uIikudGV4dENvbnRlbnQgPSB1dGlsaXphdGlvbiAhPT0gbnVsbCA\/IGZvcm1hdE51bSh1dGlsaXphdGlvbiwgMSkgKyAiJSIgOiAi4oCUIjsNCiAgICAgIGJ5SWQoInNtYWxjLXJlcy1hY3R1YWwtc2YiKS50ZXh0Q29udGVudCA9IGFjdHVhbFNmICE9PSBudWxsID8gZm9ybWF0TnVtKGFjdHVhbFNmLCAyKSA6ICLigJQiOw0KICAgICAgYnlJZCgic21hbGMtcmVzLWRlZmxlY3Rpb24iKS50ZXh0Q29udGVudCA9IGRlZmxlY3Rpb25NbSAhPT0gbnVsbCA\/IGZvcm1hdE51bShtbVRvRGlzcGxheShkZWZsZWN0aW9uTW0pLCAzKSA6ICLigJQiOw0KICAgICAgYnlJZCgic21hbGMtcmVzLXJlbWFpbmluZyIpLnRleHRDb250ZW50ID0gcmVtYWluaW5nTW0gIT09IG51bGwgPyBmb3JtYXROdW0obW1Ub0Rpc3BsYXkocmVtYWluaW5nTW0pLCAzKSA6ICLigJQiOw0KICAgICAgYnlJZCgic21hbGMtcmVzLXRhdS1hcHBsaWVkIikudGV4dENvbnRlbnQgPSB0YXVBcHBsaWVkICE9PSBudWxsID8gZm9ybWF0TnVtKG1wYVRvRGlzcGxheVN0cmVzcyh0YXVBcHBsaWVkKSwgaXNNZXRyaWMoKSA\/IDEgOiAwKSA6ICLigJQiOw0KDQogICAgICB2YXIgc3RhdHVzRWwgPSBieUlkKCJzbWFsYy1yZXMtc3RhdHVzIik7DQogICAgICBpZiAoc3RhdHVzRWwpIHsNCiAgICAgICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBzYWZldHlTdGF0dXMudGV4dDsNCiAgICAgICAgc3RhdHVzRWwuY2xhc3NOYW1lID0gInNtYWxjLXN0YXR1cy1iYWRnZSAiICsgc2FmZXR5U3RhdHVzLmNsczsNCiAgICAgIH0NCg0KICAgICAgaWYgKGVscy5yZXN1bHRzUGFuZWwpIGVscy5yZXN1bHRzUGFuZWwuaGlkZGVuID0gZmFsc2U7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc3dpdGNoVW5pdHMobmV3U3lzdGVtKSB7DQogICAgICBpZiAobmV3U3lzdGVtID09PSB1bml0U3lzdGVtKSByZXR1cm47DQogICAgICB2YXIgb2xkTWV0cmljID0gdW5pdFN5c3RlbSA9PT0gIm1ldHJpYyI7DQoNCiAgICAgIGlmIChuZXdTeXN0ZW0gPT09ICJpbXBlcmlhbCIpIHsNCiAgICAgICAgY29udmVydElucHV0VmFsdWUoZWxzLndpcmVELCBNTV9UT19JTiwgNCk7DQogICAgICAgIGNvbnZlcnRJbnB1dFZhbHVlKGVscy5vdXRlckQsIE1NX1RPX0lOLCA0KTsNCiAgICAgICAgY29udmVydElucHV0VmFsdWUoZWxzLmlubmVyRCwgTU1fVE9fSU4sIDQpOw0KICAgICAgICBjb252ZXJ0SW5wdXRWYWx1ZShlbHMubWVhbkQsIE1NX1RPX0lOLCA0KTsNCiAgICAgICAgY29udmVydElucHV0VmFsdWUoZWxzLmZyZWVMZW5ndGgsIE1NX1RPX0lOLCA0KTsNCiAgICAgICAgY29udmVydElucHV0VmFsdWUoZWxzLnNvbGlkSGVpZ2h0LCBNTV9UT19JTiwgNCk7DQogICAgICAgIGNvbnZlcnRJbnB1dFZhbHVlKGVscy5jbGVhcmFuY2UsIE1NX1RPX0lOLCA0KTsNCiAgICAgICAgaWYgKGVscy5zaGVhckcgJiYgb2xkTWV0cmljKSB7DQogICAgICAgICAgdmFyIGdNcGEgPSBzaGVhckdUb01wYShwYXJzZU51bShlbHMuc2hlYXJHKSwgZ2V0U2hlYXJHVW5pdCgpKTsNCiAgICAgICAgICBpZiAoZ01wYSAhPT0gbnVsbCkgZWxzLnNoZWFyRy52YWx1ZSA9IGZvcm1hdE51bShnTXBhICogTVBBX1RPX1BTSSwgMCk7DQogICAgICAgIH0NCiAgICAgICAgWyJ0YXVZaWVsZCIsICJ0YXVVbHQiLCAiY3VzdG9tQWxsb3dhYmxlIl0uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7DQogICAgICAgICAgdmFyIGlucHV0ID0gZWxzW2tleV07DQogICAgICAgICAgaWYgKGlucHV0ICYmIG9sZE1ldHJpYykgew0KICAgICAgICAgICAgdmFyIG1wYSA9IHN0cmVzc1RvTXBhKHBhcnNlTnVtKGlucHV0KSk7DQogICAgICAgICAgICBpZiAobXBhICE9PSBudWxsKSBpbnB1dC52YWx1ZSA9IGZvcm1hdE51bShtcGEgKiBNUEFfVE9fUFNJLCAwKTsNCiAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICBpZiAoZWxzLmFwcGxpZWRMb2FkKSB7DQogICAgICAgICAgdmFyIHUgPSBlbHMubG9hZFVuaXQgPyBlbHMubG9hZFVuaXQudmFsdWUgOiAiTiI7DQogICAgICAgICAgdmFyIG4gPSBmb3JjZVRvTmV3dG9ucyhwYXJzZU51bShlbHMuYXBwbGllZExvYWQpLCB1KTsNCiAgICAgICAgICBpZiAobiAhPT0gbnVsbCkgZWxzLmFwcGxpZWRMb2FkLnZhbHVlID0gZm9ybWF0TnVtKG4gKiBOX1RPX0xCRiwgNCk7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGNvbnZlcnRJbnB1dFZhbHVlKGVscy53aXJlRCwgSU5fVE9fTU0sIDQpOw0KICAgICAgICBjb252ZXJ0SW5wdXRWYWx1ZShlbHMub3V0ZXJELCBJTl9UT19NTSwgNCk7DQogICAgICAgIGNvbnZlcnRJbnB1dFZhbHVlKGVscy5pbm5lckQsIElOX1RPX01NLCA0KTsNCiAgICAgICAgY29udmVydElucHV0VmFsdWUoZWxzLm1lYW5ELCBJTl9UT19NTSwgNCk7DQogICAgICAgIGNvbnZlcnRJbnB1dFZhbHVlKGVscy5mcmVlTGVuZ3RoLCBJTl9UT19NTSwgNCk7DQogICAgICAgIGNvbnZlcnRJbnB1dFZhbHVlKGVscy5zb2xpZEhlaWdodCwgSU5fVE9fTU0sIDQpOw0KICAgICAgICBjb252ZXJ0SW5wdXRWYWx1ZShlbHMuY2xlYXJhbmNlLCBJTl9UT19NTSwgNCk7DQogICAgICAgIGlmIChlbHMuc2hlYXJHICYmICFvbGRNZXRyaWMpIHsNCiAgICAgICAgICB2YXIgZ01wYUltcCA9IHNoZWFyR1RvTXBhKHBhcnNlTnVtKGVscy5zaGVhckcpLCAicHNpIik7DQogICAgICAgICAgaWYgKGdNcGFJbXAgIT09IG51bGwpIGVscy5zaGVhckcudmFsdWUgPSBmb3JtYXROdW0oZ01wYUltcCAvIEdQQV9UT19NUEEsIDIpOw0KICAgICAgICB9DQogICAgICAgIFsidGF1WWllbGQiLCAidGF1VWx0IiwgImN1c3RvbUFsbG93YWJsZSJdLmZvckVhY2goZnVuY3Rpb24gKGtleSkgew0KICAgICAgICAgIHZhciBpbnB1dCA9IGVsc1trZXldOw0KICAgICAgICAgIGlmIChpbnB1dCAmJiAhb2xkTWV0cmljKSB7DQogICAgICAgICAgICB2YXIgbXBhVmFsID0gc3RyZXNzVG9NcGEocGFyc2VOdW0oaW5wdXQpKTsNCiAgICAgICAgICAgIGlmIChtcGFWYWwgIT09IG51bGwpIGlucHV0LnZhbHVlID0gZm9ybWF0TnVtKG1wYVZhbCwgMCk7DQogICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgaWYgKGVscy5hcHBsaWVkTG9hZCkgew0KICAgICAgICAgIHZhciBsYmYgPSBwYXJzZU51bShlbHMuYXBwbGllZExvYWQpOw0KICAgICAgICAgIGlmIChsYmYgIT09IG51bGwpIGVscy5hcHBsaWVkTG9hZC52YWx1ZSA9IGZvcm1hdE51bShsYmYgKiBMQkZfVE9fTiwgNCk7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgdW5pdFN5c3RlbSA9IG5ld1N5c3RlbTsNCiAgICAgIGlmIChlbHMudW5pdE1ldHJpYykgZWxzLnVuaXRNZXRyaWMuY2xhc3NMaXN0LnRvZ2dsZSgic21hbGMtYWN0aXZlIiwgbmV3U3lzdGVtID09PSAibWV0cmljIik7DQogICAgICBpZiAoZWxzLnVuaXRJbXBlcmlhbCkgZWxzLnVuaXRJbXBlcmlhbC5jbGFzc0xpc3QudG9nZ2xlKCJzbWFsYy1hY3RpdmUiLCBuZXdTeXN0ZW0gPT09ICJpbXBlcmlhbCIpOw0KICAgICAgc3luY1NoZWFyR1VuaXRPcHRpb25zKCk7DQogICAgICBzeW5jTG9hZFVuaXRPcHRpb25zKCk7DQogICAgICB1cGRhdGVMZW5ndGhVbml0TGFiZWxzKCk7DQogICAgICBhcHBseU1hdGVyaWFsUHJlc2V0KCk7DQogICAgICBoaWRlUmVzdWx0c1NlY3Rpb24oKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBiaW5kRXZlbnRzKCkgew0KICAgICAgaWYgKGVscy51bml0TWV0cmljKSBlbHMudW5pdE1ldHJpYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsgc3dpdGNoVW5pdHMoIm1ldHJpYyIpOyB9KTsNCiAgICAgIGlmIChlbHMudW5pdEltcGVyaWFsKSBlbHMudW5pdEltcGVyaWFsLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgeyBzd2l0Y2hVbml0cygiaW1wZXJpYWwiKTsgfSk7DQoNCiAgICAgIFsNCiAgICAgICAgZWxzLndpcmVELCBlbHMub3V0ZXJELCBlbHMuaW5uZXJELCBlbHMubWVhbkQsIGVscy50b3RhbENvaWxzLCBlbHMuYWN0aXZlQ29pbHMsDQogICAgICAgIGVscy5zaGVhckcsIGVscy50YXVZaWVsZCwgZWxzLnRhdVVsdCwgZWxzLmN1c3RvbUFsbG93YWJsZSwgZWxzLnNhZmV0eUZhY3RvciwNCiAgICAgICAgZWxzLmFwcGxpZWRMb2FkLCBlbHMuZnJlZUxlbmd0aCwgZWxzLnNvbGlkSGVpZ2h0LCBlbHMuY2xlYXJhbmNlDQogICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGlucHV0KSB7DQogICAgICAgIGlmICghaW5wdXQpIHJldHVybjsNCiAgICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgdXBkYXRlTWVhbkRGcm9tR2VvbWV0cnkoKTsNCiAgICAgICAgICBpZiAoaW5wdXQgPT09IGVscy50b3RhbENvaWxzKSB7DQogICAgICAgICAgICB1cGRhdGVBY3RpdmVDb2lsc0Zyb21FbmRUeXBlKCk7DQogICAgICAgICAgICB1cGRhdGVTb2xpZEhlaWdodEZyb21Db2lscygpOw0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAoaW5wdXQgPT09IGVscy53aXJlRCkgdXBkYXRlU29saWRIZWlnaHRGcm9tQ29pbHMoKTsNCiAgICAgICAgICBoaWRlUmVzdWx0c1NlY3Rpb24oKTsNCiAgICAgICAgfSk7DQogICAgICB9KTsNCg0KICAgICAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPSJzbWFsYy1tZWFuLW1vZGUiXScpLmZvckVhY2goZnVuY3Rpb24gKHJhZGlvKSB7DQogICAgICAgIHJhZGlvLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICB1cGRhdGVNZWFuREZyb21HZW9tZXRyeSgpOw0KICAgICAgICAgIGhpZGVSZXN1bHRzU2VjdGlvbigpOw0KICAgICAgICB9KTsNCiAgICAgIH0pOw0KDQogICAgICBpZiAoZWxzLmVuZFR5cGUpIHsNCiAgICAgICAgZWxzLmVuZFR5cGUuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gKCkgew0KICAgICAgICAgIHVwZGF0ZUFjdGl2ZUNvaWxzRnJvbUVuZFR5cGUoKTsNCiAgICAgICAgICBoaWRlUmVzdWx0c1NlY3Rpb24oKTsNCiAgICAgICAgfSk7DQogICAgICB9DQoNCiAgICAgIGlmIChlbHMuYXV0b0FjdGl2ZSkgew0KICAgICAgICBlbHMuYXV0b0FjdGl2ZS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgaWYgKGVscy5hY3RpdmVDb2lscykgew0KICAgICAgICAgICAgZWxzLmFjdGl2ZUNvaWxzLnJlYWRPbmx5ID0gZWxzLmF1dG9BY3RpdmUuY2hlY2tlZDsNCiAgICAgICAgICAgIGVscy5hY3RpdmVDb2lscy5jbGFzc0xpc3QudG9nZ2xlKCJzbWFsYy1yZWFkb25seSIsIGVscy5hdXRvQWN0aXZlLmNoZWNrZWQpOw0KICAgICAgICAgIH0NCiAgICAgICAgICB1cGRhdGVBY3RpdmVDb2lsc0Zyb21FbmRUeXBlKCk7DQogICAgICAgICAgaGlkZVJlc3VsdHNTZWN0aW9uKCk7DQogICAgICAgIH0pOw0KICAgICAgfQ0KDQogICAgICBpZiAoZWxzLmF1dG9Tb2xpZCkgew0KICAgICAgICBlbHMuYXV0b1NvbGlkLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICBpZiAoZWxzLnNvbGlkSGVpZ2h0KSB7DQogICAgICAgICAgICBlbHMuc29saWRIZWlnaHQucmVhZE9ubHkgPSBlbHMuYXV0b1NvbGlkLmNoZWNrZWQ7DQogICAgICAgICAgICBlbHMuc29saWRIZWlnaHQuY2xhc3NMaXN0LnRvZ2dsZSgic21hbGMtcmVhZG9ubHkiLCBlbHMuYXV0b1NvbGlkLmNoZWNrZWQpOw0KICAgICAgICAgIH0NCiAgICAgICAgICB1cGRhdGVTb2xpZEhlaWdodEZyb21Db2lscygpOw0KICAgICAgICAgIGhpZGVSZXN1bHRzU2VjdGlvbigpOw0KICAgICAgICB9KTsNCiAgICAgIH0NCg0KICAgICAgaWYgKGVscy5tYXRlcmlhbCkgew0KICAgICAgICBlbHMubWF0ZXJpYWwuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gKCkgew0KICAgICAgICAgIGdNYW51YWxseUVkaXRlZCA9IGZhbHNlOw0KICAgICAgICAgIHN0cmVuZ3RoTWFudWFsbHlFZGl0ZWQgPSBmYWxzZTsNCiAgICAgICAgICBhcHBseU1hdGVyaWFsUHJlc2V0KCk7DQogICAgICAgICAgaGlkZVJlc3VsdHNTZWN0aW9uKCk7DQogICAgICAgIH0pOw0KICAgICAgfQ0KDQogICAgICBpZiAoZWxzLnNoZWFyRykgew0KICAgICAgICBlbHMuc2hlYXJHLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwgZnVuY3Rpb24gKCkgew0KICAgICAgICAgIGdNYW51YWxseUVkaXRlZCA9IHRydWU7DQogICAgICAgICAgaGlkZVJlc3VsdHNTZWN0aW9uKCk7DQogICAgICAgIH0pOw0KICAgICAgfQ0KDQogICAgICBpZiAoZWxzLnRhdVlpZWxkKSB7DQogICAgICAgIGVscy50YXVZaWVsZC5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICBzdHJlbmd0aE1hbnVhbGx5RWRpdGVkID0gdHJ1ZTsNCiAgICAgICAgICBoaWRlUmVzdWx0c1NlY3Rpb24oKTsNCiAgICAgICAgfSk7DQogICAgICB9DQoNCiAgICAgIGlmIChlbHMuc3RyZXNzTWV0aG9kKSB7DQogICAgICAgIGVscy5zdHJlc3NNZXRob2QuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gKCkgew0KICAgICAgICAgIHRvZ2dsZUN1c3RvbUFsbG93YWJsZVJvdygpOw0KICAgICAgICAgIGhpZGVSZXN1bHRzU2VjdGlvbigpOw0KICAgICAgICB9KTsNCiAgICAgIH0NCg0KICAgICAgaWYgKGVscy5zaGVhckdVbml0KSB7DQogICAgICAgIGVscy5zaGVhckdVbml0LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICB2YXIgbXBhID0gc2hlYXJHVG9NcGEocGFyc2VOdW0oZWxzLnNoZWFyRyksIGdldFNoZWFyR1VuaXQoKSk7DQogICAgICAgICAgaWYgKG1wYSAhPT0gbnVsbCkgew0KICAgICAgICAgICAgZWxzLnNoZWFyRy52YWx1ZSA9IGZvcm1hdE51bShtcGFUb0Rpc3BsYXlHKG1wYSksIGdldFNoZWFyR1VuaXQoKSA9PT0gInBzaSIgPyAwIDogMik7DQogICAgICAgICAgfQ0KICAgICAgICAgIGhpZGVSZXN1bHRzU2VjdGlvbigpOw0KICAgICAgICB9KTsNCiAgICAgIH0NCg0KICAgICAgaWYgKGVscy5sb2FkVW5pdCkgZWxzLmxvYWRVbml0LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGhpZGVSZXN1bHRzU2VjdGlvbik7DQoNCiAgICAgIGlmIChlbHMuYnRuQ2FsY3VsYXRlKSBlbHMuYnRuQ2FsY3VsYXRlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgY2FsY3VsYXRlKTsNCiAgICB9DQoNCiAgICBzeW5jU2hlYXJHVW5pdE9wdGlvbnMoKTsNCiAgICBzeW5jTG9hZFVuaXRPcHRpb25zKCk7DQogICAgdXBkYXRlTGVuZ3RoVW5pdExhYmVscygpOw0KICAgIHRvZ2dsZUN1c3RvbUFsbG93YWJsZVJvdygpOw0KICAgIGJpbmRFdmVudHMoKTsNCiAgICB1cGRhdGVBY3RpdmVDb2lsc0Zyb21FbmRUeXBlKCk7DQogICAgdXBkYXRlTWVhbkRGcm9tR2VvbWV0cnkoKTsNCiAgICB1cGRhdGVTb2xpZEhlaWdodEZyb21Db2lscygpOw0KICAgIGFwcGx5TWF0ZXJpYWxQcmVzZXQoKTsNCiAgICBoaWRlUmVzdWx0c1NlY3Rpb24oKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGJvb3QoKSB7DQogICAgdmFyIG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiI3NtYWxjLWNhbGN1bGF0b3Iuc21hbGMtY2FsY3VsYXRvciIpOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgIGluaXRTbWFsY0NhbGN1bGF0b3Iobm9kZXNbaV0pOw0KICAgIH0NCiAgfQ0KDQogIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAibG9hZGluZyIpIHsNCiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgYm9vdCwgeyBvbmNlOiB0cnVlIH0pOw0KICB9IGVsc2Ugew0KICAgIGJvb3QoKTsNCiAgfQ==\";try{(new Function(atob(b)))();}catch(e){console.error(\"SMALC calculator failed:\",e);}})();<\/script>\n","protected":false},"excerpt":{"rendered":"<p>The Spring Maximum Allowable Load Calculator is a practical engineering tool designed to determine the maximum safe load a compression spring can withstand without exceeding&#8230;<\/p>","protected":false},"author":2,"featured_media":24735,"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,8531,3675,8627],"class_list":["post-24734","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mechanical-basic-component-design","tag-compression-spring","tag-load-capacity","tag-spring-design","tag-spring-load","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/08\/Spring-Maximum-Allowable-Load-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts\/24734","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/comments?post=24734"}],"version-history":[{"count":1,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts\/24734\/revisions"}],"predecessor-version":[{"id":24736,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts\/24734\/revisions\/24736"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/media\/24735"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/media?parent=24734"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/categories?post=24734"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/tags?post=24734"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}