{"id":24825,"date":"2026-09-04T08:41:30","date_gmt":"2026-09-04T08:41:30","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24825"},"modified":"2026-09-04T08:45:30","modified_gmt":"2026-09-04T08:45:30","slug":"bending-springback-rate-estimator-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/ar\/bending-springback-rate-estimator-calculator\/","title":{"rendered":"Bending Springback Rate Estimator Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Bending Springback Rate Estimator Calculator<\/strong> is a practical engineering tool designed to estimate springback after sheet metal bending based on material properties, thickness, inside bend radius, bend angle, and forming method. It helps engineers calculate springback angle, springback rate, final unloaded angle, and approximate overbend compensation. The Bending Springback Rate Estimator Calculator is useful for press brake setup, sheet metal fabrication, tooling selection, bend angle optimization, and reducing trial-and-error during production.<\/p>\n\n\n\n<!-- WordPress: paste this entire block into a Custom HTML block -->\n<!-- Do NOT paste into Visual editor; use Code Editor \/ Custom HTML block -->\n<style>\n\/* Bending Springback Rate Estimator \u2014 WordPress-safe scoped styles\n * Every rule is scoped under #bsre-calculator.bsre-calculator.\n * Will NOT affect theme header, footer, sidebar, menus, or other page content.\n * No html, body, :root, or unscoped universal selectors.\n *\/\n\n.entry-content #bsre-calculator.bsre-calculator,\n.wp-block-html #bsre-calculator.bsre-calculator,\n.wp-block-group__inner-container #bsre-calculator.bsre-calculator,\n.elementor-widget-container #bsre-calculator.bsre-calculator,\n.et_pb_module #bsre-calculator.bsre-calculator,\n.fl-module-content #bsre-calculator.bsre-calculator,\n.site-content #bsre-calculator.bsre-calculator,\narticle #bsre-calculator.bsre-calculator,\n#bsre-calculator.bsre-calculator,\n.entry-content #bsre-calculator.bsre-calculator *,\n.wp-block-html #bsre-calculator.bsre-calculator *,\n.wp-block-group__inner-container #bsre-calculator.bsre-calculator *,\n.elementor-widget-container #bsre-calculator.bsre-calculator *,\n.et_pb_module #bsre-calculator.bsre-calculator *,\n.fl-module-content #bsre-calculator.bsre-calculator *,\n.site-content #bsre-calculator.bsre-calculator *,\narticle #bsre-calculator.bsre-calculator *,\n#bsre-calculator.bsre-calculator *,\n.entry-content #bsre-calculator.bsre-calculator *::before,\n.wp-block-html #bsre-calculator.bsre-calculator *::before,\n#bsre-calculator.bsre-calculator *::before,\n.entry-content #bsre-calculator.bsre-calculator *::after,\n.wp-block-html #bsre-calculator.bsre-calculator *::after,\n#bsre-calculator.bsre-calculator *::after {\n    box-sizing: border-box !important;\n}\n\n.entry-content #bsre-calculator.bsre-calculator,\n.wp-block-html #bsre-calculator.bsre-calculator,\n.wp-block-group__inner-container #bsre-calculator.bsre-calculator,\n.elementor-widget-container #bsre-calculator.bsre-calculator,\n.et_pb_module #bsre-calculator.bsre-calculator,\n.fl-module-content #bsre-calculator.bsre-calculator,\n.site-content #bsre-calculator.bsre-calculator,\narticle #bsre-calculator.bsre-calculator,\n#bsre-calculator.bsre-calculator {\n    all: revert;\n    --bsre-bg: #f0f2f5;\n    --bsre-surface: #ffffff;\n    --bsre-border: #dde3ea;\n    --bsre-text: #1a2332;\n    --bsre-text-muted: #5a6578;\n    --bsre-primary: #1e5a8a;\n    --bsre-primary-hover: #164a72;\n    --bsre-warning: #c47a0a;\n    --bsre-danger: #c0392b;\n    --bsre-success: #2d8a6e;\n    --bsre-radius: 10px;\n    --bsre-shadow: 0 2px 12px rgba(26, 35, 50, 0.08);\n    --bsre-font: \"Segoe UI\", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;\n\n    box-sizing: border-box !important;\n    display: block !important;\n    width: 100% !important;\n    max-width: 1200px !important;\n    margin: 0 auto !important;\n    padding: 0 1.25rem 1.25rem !important;\n    font-family: var(--bsre-font) !important;\n    font-size: 15px !important;\n    line-height: 1.6 !important;\n    color: var(--bsre-text) !important;\n    background: transparent !important;\n    border: none !important;\n    float: none !important;\n    clear: both !important;\n    position: relative !important;\n    isolation: isolate !important;\n    contain: layout style paint !important;\n    z-index: auto !important;\n    letter-spacing: normal !important;\n    text-transform: none !important;\n    text-align: left !important;\n    box-shadow: none !important;\n    overflow: visible !important;\n}\n\n#bsre-calculator.bsre-calculator form,\n#bsre-calculator.bsre-calculator fieldset,\n#bsre-calculator.bsre-calculator table {\n    all: revert !important;\n    box-sizing: border-box !important;\n    margin: 0 !important;\n    padding: 0 !important;\n    border: none !important;\n    background: none !important;\n    box-shadow: none !important;\n    float: none !important;\n    width: auto !important;\n    max-width: none !important;\n    font-family: inherit !important;\n    color: inherit !important;\n}\n\n#bsre-calculator.bsre-calculator [hidden] {\n    display: none !important;\n}\n\n#bsre-calculator.bsre-calculator h1,\n#bsre-calculator.bsre-calculator h2,\n#bsre-calculator.bsre-calculator h3,\n#bsre-calculator.bsre-calculator h4,\n#bsre-calculator.bsre-calculator p,\n#bsre-calculator.bsre-calculator ul,\n#bsre-calculator.bsre-calculator ol,\n#bsre-calculator.bsre-calculator li,\n#bsre-calculator.bsre-calculator section,\n#bsre-calculator.bsre-calculator div,\n#bsre-calculator.bsre-calculator span,\n#bsre-calculator.bsre-calculator strong,\n#bsre-calculator.bsre-calculator em,\n#bsre-calculator.bsre-calculator sub,\n#bsre-calculator.bsre-calculator sup,\n#bsre-calculator.bsre-calculator canvas {\n    margin: 0 !important;\n    padding: 0 !important;\n    border: none !important;\n    background: none !important;\n    box-shadow: none !important;\n    font-family: inherit !important;\n    font-size: inherit !important;\n    font-weight: inherit !important;\n    font-style: inherit !important;\n    line-height: inherit !important;\n    color: inherit !important;\n    letter-spacing: inherit !important;\n    text-transform: none !important;\n    text-decoration: none !important;\n    float: none !important;\n}\n\n#bsre-calculator.bsre-calculator button,\n#bsre-calculator.bsre-calculator input,\n#bsre-calculator.bsre-calculator select,\n#bsre-calculator.bsre-calculator label,\n#bsre-calculator.bsre-calculator legend {\n    font: inherit !important;\n    font-family: var(--bsre-font) !important;\n    color: inherit !important;\n    margin: 0 !important;\n    max-width: none !important;\n    min-width: 0 !important;\n    float: none !important;\n    text-transform: none !important;\n    letter-spacing: normal !important;\n}\n\n#bsre-calculator.bsre-calculator ul,\n#bsre-calculator.bsre-calculator ol {\n    list-style: none !important;\n    padding: 0 !important;\n    margin: 0 !important;\n}\n\n#bsre-calculator.bsre-calculator button {\n    cursor: pointer !important;\n    background: transparent !important;\n    border: none !important;\n    padding: 0 !important;\n    box-shadow: none !important;\n    text-decoration: none !important;\n    appearance: none !important;\n    -webkit-appearance: none !important;\n    text-transform: none !important;\n    min-height: unset !important;\n    height: auto !important;\n    width: auto !important;\n}\n\n#bsre-calculator.bsre-calculator p,\n#bsre-calculator.bsre-calculator small {\n    margin: 0 0 0.75rem !important;\n    padding: 0 !important;\n    font-family: inherit !important;\n    color: inherit !important;\n}\n\n#bsre-calculator.bsre-calculator p:last-child {\n    margin-bottom: 0 !important;\n}\n\n#bsre-calculator.bsre-calculator sub {\n    font-size: 0.75em !important;\n    vertical-align: sub !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-title {\n    margin: 0 0 1.25rem !important;\n    padding: 0 0 1rem !important;\n    font-size: 1.35rem !important;\n    font-weight: 700 !important;\n    line-height: 1.25 !important;\n    color: var(--bsre-primary) !important;\n    background: none !important;\n    border: none !important;\n    border-bottom: 1px solid var(--bsre-border) !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-layout {\n    display: flex !important;\n    flex-direction: column !important;\n    gap: 1.25rem !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-results:not(.bsre-hidden) {\n    animation: bsre-fade-in 0.3s ease;\n}\n\n@keyframes bsre-fade-in {\n    from { opacity: 0; transform: translateY(8px); }\n    to { opacity: 1; transform: translateY(0); }\n}\n\n#bsre-calculator.bsre-calculator .bsre-card {\n    background: var(--bsre-surface) !important;\n    border: 1px solid var(--bsre-border) !important;\n    border-radius: var(--bsre-radius) !important;\n    padding: 1.25rem 1.5rem !important;\n    margin: 0 0 1.25rem !important;\n    box-shadow: var(--bsre-shadow) !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-card h2 {\n    margin: 0 0 1rem !important;\n    padding: 0 !important;\n    font-size: 1.15rem !important;\n    font-weight: 700 !important;\n    line-height: 1.3 !important;\n    color: var(--bsre-primary) !important;\n    background: none !important;\n    border: none !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-card h3 {\n    margin: 1.25rem 0 0.5rem !important;\n    padding: 0 !important;\n    font-size: 0.95rem !important;\n    font-weight: 700 !important;\n    line-height: 1.3 !important;\n    color: var(--bsre-text) !important;\n    background: none !important;\n    border: none !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-inputs-card {\n    padding-bottom: 1.5rem !important;\n    margin-bottom: 0 !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-section {\n    padding-top: 1.25rem !important;\n    margin-top: 1.25rem !important;\n    border-top: 1px solid var(--bsre-border) !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-section:first-child {\n    padding-top: 0 !important;\n    margin-top: 0 !important;\n    border-top: none !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-section > h2 {\n    margin: 0 0 1rem !important;\n    display: flex !important;\n    align-items: center !important;\n    justify-content: space-between !important;\n    gap: 0.5rem !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-actions {\n    margin-top: 1.5rem !important;\n    padding-top: 1.25rem !important;\n    border-top: 1px solid var(--bsre-border) !important;\n    display: flex !important;\n    flex-wrap: wrap !important;\n    gap: 0.75rem !important;\n    justify-content: center !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-form-grid {\n    display: grid !important;\n    grid-template-columns: 1fr 1fr !important;\n    gap: 1rem !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-field.bsre-full {\n    grid-column: 1 \/ -1 !important;\n}\n\n@media (max-width: 600px) {\n    #bsre-calculator.bsre-calculator .bsre-form-grid {\n        grid-template-columns: 1fr !important;\n    }\n}\n\n#bsre-calculator.bsre-calculator .bsre-field label {\n    display: block !important;\n    font-weight: 600 !important;\n    font-size: 0.875rem !important;\n    margin: 0 0 0.35rem !important;\n    color: var(--bsre-text) !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-optional {\n    font-weight: 400 !important;\n    color: var(--bsre-text-muted) !important;\n    font-size: 0.8rem !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-hint {\n    display: block !important;\n    font-size: 0.78rem !important;\n    color: var(--bsre-text-muted) !important;\n    margin-top: 0.25rem !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-field.bsre-full select {\n    margin-top: 0.5rem !important;\n}\n\n#bsre-calculator.bsre-calculator input[type=\"text\"],\n#bsre-calculator.bsre-calculator input[type=\"number\"],\n#bsre-calculator.bsre-calculator input[type=\"search\"],\n#bsre-calculator.bsre-calculator input[type=\"checkbox\"],\n#bsre-calculator.bsre-calculator select {\n    display: block !important;\n    width: 100% !important;\n    max-width: 100% !important;\n    height: auto !important;\n    min-height: 38px !important;\n    margin: 0 !important;\n    padding: 0.55rem 0.7rem !important;\n    border: 1px solid var(--bsre-border) !important;\n    border-radius: 6px !important;\n    font-size: 0.9rem !important;\n    font-family: var(--bsre-font) !important;\n    line-height: 1.4 !important;\n    color: var(--bsre-text) !important;\n    background: #fafbfc !important;\n    box-shadow: none !important;\n    appearance: auto !important;\n    -webkit-appearance: auto !important;\n    transition: border-color 0.15s !important;\n    float: none !important;\n    outline: none !important;\n}\n\n#bsre-calculator.bsre-calculator input[type=\"checkbox\"] {\n    display: inline-block !important;\n    width: auto !important;\n    min-width: 16px !important;\n    min-height: unset !important;\n    padding: 0 !important;\n    margin: 0 !important;\n    accent-color: var(--bsre-primary) !important;\n}\n\n#bsre-calculator.bsre-calculator input:focus,\n#bsre-calculator.bsre-calculator select:focus {\n    outline: none !important;\n    border-color: var(--bsre-primary) !important;\n    box-shadow: 0 0 0 3px rgba(30, 90, 138, 0.12) !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-input-unit {\n    display: flex !important;\n    align-items: center !important;\n    gap: 0.5rem !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-input-unit input {\n    flex: 1 !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-input-unit span {\n    font-size: 0.85rem !important;\n    color: var(--bsre-text-muted) !important;\n    white-space: nowrap !important;\n    min-width: 2.5rem !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-computed {\n    padding: 0.55rem 0.7rem !important;\n    background: #eef2f6 !important;\n    border: 1px solid var(--bsre-border) !important;\n    border-radius: 6px !important;\n    font-weight: 600 !important;\n    font-size: 0.9rem !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-check label {\n    display: flex !important;\n    align-items: center !important;\n    gap: 0.5rem !important;\n    font-weight: 500 !important;\n    cursor: pointer !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-check input {\n    width: auto !important;\n    margin: 0 !important;\n}\n\n#bsre-calculator.bsre-calculator button.bsre-btn {\n    display: inline-flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n    margin: 0 !important;\n    padding: 0.65rem 1.4rem !important;\n    border: none !important;\n    border-radius: 6px !important;\n    font-size: 0.95rem !important;\n    font-weight: 600 !important;\n    font-family: var(--bsre-font) !important;\n    line-height: 1.2 !important;\n    text-decoration: none !important;\n    text-transform: none !important;\n    letter-spacing: normal !important;\n    cursor: pointer !important;\n    box-shadow: none !important;\n    transition: background 0.15s, transform 0.1s !important;\n    float: none !important;\n    width: auto !important;\n    height: auto !important;\n    min-height: 0 !important;\n    min-width: 140px !important;\n}\n\n#bsre-calculator.bsre-calculator button.bsre-btn:active {\n    transform: scale(0.98) !important;\n}\n\n#bsre-calculator.bsre-calculator button.bsre-btn-primary {\n    background: var(--bsre-primary) !important;\n    color: #fff !important;\n}\n\n#bsre-calculator.bsre-calculator button.bsre-btn-primary:hover {\n    background: var(--bsre-primary-hover) !important;\n    color: #fff !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-toggle-btn {\n    padding: 0.25rem 0.6rem !important;\n    font-size: 0.75rem !important;\n    min-width: auto !important;\n    background: #eef2f6 !important;\n    color: var(--bsre-text-muted) !important;\n    border: 1px solid var(--bsre-border) !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-collapsed {\n    display: none !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-collapsed.bsre-expanded {\n    display: block !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-tooltip {\n    display: inline-flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n    width: 16px !important;\n    height: 16px !important;\n    border-radius: 50% !important;\n    background: #dde3ea !important;\n    color: var(--bsre-text-muted) !important;\n    font-size: 0.7rem !important;\n    font-weight: 700 !important;\n    cursor: help !important;\n    position: relative !important;\n    vertical-align: middle !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-tooltip::after {\n    content: attr(data-tip) !important;\n    position: absolute !important;\n    bottom: calc(100% + 6px) !important;\n    left: 50% !important;\n    transform: translateX(-50%) !important;\n    background: var(--bsre-text) !important;\n    color: #fff !important;\n    padding: 0.4rem 0.6rem !important;\n    border-radius: 4px !important;\n    font-size: 0.75rem !important;\n    font-weight: 400 !important;\n    white-space: normal !important;\n    width: max-content !important;\n    max-width: 240px !important;\n    opacity: 0 !important;\n    pointer-events: none !important;\n    transition: opacity 0.15s !important;\n    z-index: 100 !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-tooltip:hover::after {\n    opacity: 1 !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-diagram-wrap {\n    margin-bottom: 1.25rem !important;\n    text-align: center !important;\n    background: #f7f9fb !important;\n    border: 1px solid var(--bsre-border) !important;\n    border-radius: 8px !important;\n    padding: 0.75rem !important;\n    overflow: hidden !important;\n}\n\n#bsre-calculator.bsre-calculator #bsre-bendDiagram {\n    max-width: 100% !important;\n    height: auto !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-results-grid {\n    display: grid !important;\n    grid-template-columns: 1fr 1fr !important;\n    gap: 0.75rem !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-result.bsre-full {\n    grid-column: 1 \/ -1 !important;\n}\n\n@media (max-width: 500px) {\n    #bsre-calculator.bsre-calculator .bsre-results-grid {\n        grid-template-columns: 1fr !important;\n    }\n}\n\n#bsre-calculator.bsre-calculator .bsre-result {\n    background: #f7f9fb !important;\n    border: 1px solid var(--bsre-border) !important;\n    border-radius: 8px !important;\n    padding: 0.75rem !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-result-label {\n    display: block !important;\n    font-size: 0.78rem !important;\n    color: var(--bsre-text-muted) !important;\n    margin-bottom: 0.25rem !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-result-val {\n    display: block !important;\n    font-size: 1.05rem !important;\n    font-weight: 700 !important;\n    color: var(--bsre-text) !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-result-val.bsre-highlight {\n    color: var(--bsre-primary) !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-result-val.bsre-badge {\n    display: inline-block !important;\n    padding: 0.2rem 0.6rem !important;\n    border-radius: 4px !important;\n    font-size: 0.85rem !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-badge-low { background: #d4edda !important; color: #155724 !important; }\n#bsre-calculator.bsre-calculator .bsre-badge-moderate { background: #fff3cd !important; color: #856404 !important; }\n#bsre-calculator.bsre-calculator .bsre-badge-high { background: #f8d7da !important; color: #721c24 !important; }\n\n#bsre-calculator.bsre-calculator .bsre-warnings:empty {\n    display: none !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-warning {\n    padding: 0.6rem 0.85rem !important;\n    border-radius: 6px !important;\n    margin-bottom: 0.5rem !important;\n    font-size: 0.85rem !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-warning.error {\n    background: #fdecea !important;\n    border-left: 3px solid var(--bsre-danger) !important;\n    color: #922b21 !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-warning.warn {\n    background: #fef9e7 !important;\n    border-left: 3px solid var(--bsre-warning) !important;\n    color: #7d6608 !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-warning.info {\n    background: #ebf5fb !important;\n    border-left: 3px solid var(--bsre-primary) !important;\n    color: #1a5276 !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-recommendations {\n    margin-top: 1rem !important;\n    padding: 0.85rem 1rem !important;\n    background: #ebf5fb !important;\n    border-radius: 8px !important;\n    border: 1px solid #bdd7ea !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-recommendations:empty {\n    display: none !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-recommendations h3 {\n    margin: 0 0 0.5rem !important;\n    font-size: 0.9rem !important;\n    color: var(--bsre-primary) !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-recommendations ul {\n    margin: 0 !important;\n    padding-left: 1.25rem !important;\n    font-size: 0.85rem !important;\n    color: var(--bsre-text) !important;\n    list-style: disc !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-recommendations li {\n    margin-bottom: 0.35rem !important;\n    list-style: inherit !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-chart-wrap {\n    margin-top: 1.25rem !important;\n    padding: 0.75rem !important;\n    background: #f7f9fb !important;\n    border: 1px solid var(--bsre-border) !important;\n    border-radius: 8px !important;\n}\n\n#bsre-calculator.bsre-calculator #bsre-sensitivityChart {\n    max-width: 100% !important;\n    height: auto !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-table-wrap {\n    overflow-x: auto !important;\n    margin: 0.5rem 0 !important;\n}\n\n#bsre-calculator.bsre-calculator table.bsre-table {\n    width: 100% !important;\n    border-collapse: collapse !important;\n    font-size: 0.85rem !important;\n    margin: 0 !important;\n    background: transparent !important;\n    border: none !important;\n}\n\n#bsre-calculator.bsre-calculator table.bsre-table th,\n#bsre-calculator.bsre-calculator table.bsre-table td {\n    padding: 0.5rem 0.65rem !important;\n    border: 1px solid var(--bsre-border) !important;\n    text-align: left !important;\n    vertical-align: middle !important;\n    background: transparent !important;\n}\n\n#bsre-calculator.bsre-calculator table.bsre-table th {\n    background: #eef2f6 !important;\n    font-weight: 600 !important;\n    color: var(--bsre-text) !important;\n}\n\n#bsre-calculator.bsre-calculator table.bsre-table input[type=\"number\"] {\n    width: 70px !important;\n    padding: 0.3rem 0.4rem !important;\n    min-height: unset !important;\n}\n\n#bsre-calculator.bsre-calculator table.bsre-table tbody tr:nth-child(even) {\n    background: #fafbfc !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-compare-list {\n    display: grid !important;\n    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)) !important;\n    gap: 0.5rem !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-compare-list label {\n    display: flex !important;\n    align-items: center !important;\n    gap: 0.4rem !important;\n    font-size: 0.875rem !important;\n    cursor: pointer !important;\n    margin: 0 !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-compare-list input {\n    width: auto !important;\n    margin: 0 !important;\n    min-height: unset !important;\n}\n\n#bsre-calculator.bsre-calculator #bsre-comparisonResults {\n    margin-top: 1rem !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-rank-1 {\n    font-weight: 700 !important;\n    color: var(--bsre-success) !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-bar-chart {\n    margin-top: 1rem !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-bar-row {\n    display: flex !important;\n    align-items: center !important;\n    gap: 0.5rem !important;\n    margin-bottom: 0.4rem !important;\n    font-size: 0.82rem !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-bar-label {\n    width: 120px !important;\n    flex-shrink: 0 !important;\n    text-align: right !important;\n    color: var(--bsre-text-muted) !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-bar-track {\n    flex: 1 !important;\n    height: 18px !important;\n    background: #eef2f6 !important;\n    border-radius: 3px !important;\n    overflow: hidden !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-bar-fill {\n    height: 100% !important;\n    background: var(--bsre-primary) !important;\n    border-radius: 3px !important;\n    transition: width 0.3s ease !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-bar-value {\n    width: 50px !important;\n    flex-shrink: 0 !important;\n    font-weight: 600 !important;\n}\n\n#bsre-calculator.bsre-calculator .bsre-hidden {\n    display: none !important;\n}\n\n<\/style>\n<div id=\"bsre-calculator\" class=\"bsre-calculator\">\n        <div class=\"bsre-layout\">\n            <section class=\"bsre-card bsre-inputs-card\">\n                <h1 class=\"bsre-title\">Bending Springback Rate Estimator Calculator<\/h1>\n\n                <div class=\"bsre-section\">\n                    <h2>Calculator Settings<\/h2>\n                    <div class=\"bsre-form-grid\">\n                        <div class=\"bsre-field bsre-full\">\n                            <label for=\"bsre-calcMode\">Calculation Mode<\/label>\n                            <select id=\"bsre-calcMode\">\n                                <option value=\"springbackAngle\">Springback Angle Estimation<\/option>\n                                <option value=\"springbackRate\">Springback Rate Calculation<\/option>\n                                <option value=\"finalAngle\">Final Bend Angle Calculation<\/option>\n                                <option value=\"overbend\">Required Overbend Angle<\/option>\n                                <option value=\"measured\">Measured Springback from Test Data<\/option>\n                                <option value=\"comparison\">Material Comparison<\/option>\n                                <option value=\"sensitivity\">Radius-to-Thickness Sensitivity<\/option>\n                            <\/select>\n                        <\/div>\n\n                        <div class=\"bsre-field\">\n                            <label for=\"bsre-unitSystem\">Unit System<\/label>\n                            <select id=\"bsre-unitSystem\">\n                                <option value=\"metric\">Metric (mm, MPa, GPa)<\/option>\n                                <option value=\"imperial\">Imperial (inch, ksi)<\/option>\n                            <\/select>\n                        <\/div>\n\n                        <div class=\"bsre-field\">\n                            <label for=\"bsre-angleConvention\">\n                                Angle Convention\n                                <span class=\"bsre-tooltip\" data-tip=\"Included angle: springback opens the bend (\u03b8final = \u03b8form + \u0394\u03b8). Bend rotation from flat: springback reduces rotation (\u03b8final = \u03b8form \u2212 \u0394\u03b8).\">?<\/span>\n                            <\/label>\n                            <select id=\"bsre-angleConvention\">\n                                <option value=\"included\">Included Angle (springback opens bend)<\/option>\n                                <option value=\"rotation\">Bend Rotation from Flat<\/option>\n                            <\/select>\n                        <\/div>\n                    <\/div>\n                <\/div>\n\n                <div class=\"bsre-section\" id=\"bsre-sectionMaterial\">\n                    <h2>Material<\/h2>\n                    <div class=\"bsre-form-grid\">\n                        <div class=\"bsre-field bsre-full\">\n                            <label for=\"bsre-materialSearch\">Material Type<\/label>\n                            <input type=\"search\" id=\"bsre-materialSearch\" placeholder=\"Search materials...\" autocomplete=\"off\">\n                            <select id=\"bsre-materialType\" size=\"1\"><\/select>\n                        <\/div>\n\n                        <div class=\"bsre-field\">\n                            <label for=\"bsre-materialGrade\">Material Grade <span class=\"bsre-optional\">(optional)<\/span><\/label>\n                            <input type=\"text\" id=\"bsre-materialGrade\" placeholder=\"e.g. AISI 1018, 5052-H32\">\n                        <\/div>\n\n                        <div class=\"bsre-field\">\n                            <label for=\"bsre-yieldStrength\">\n                                Yield Strength (Sy)\n                                <span class=\"bsre-tooltip\" data-tip=\"Higher yield strength generally increases springback tendency.\">?<\/span>\n                            <\/label>\n                            <div class=\"bsre-input-unit\">\n                                <input type=\"number\" id=\"bsre-yieldStrength\" step=\"any\" min=\"0\">\n                                <span id=\"bsre-yieldUnit\">MPa<\/span>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"bsre-field\">\n                            <label for=\"bsre-youngModulus\">\n                                Young&#8217;s Modulus (E)\n                                <span class=\"bsre-tooltip\" data-tip=\"Elastic modulus in tension. Lower E relative to Sy increases springback.\">?<\/span>\n                            <\/label>\n                            <div class=\"bsre-input-unit\">\n                                <input type=\"number\" id=\"bsre-youngModulus\" step=\"any\" min=\"0\">\n                                <span id=\"bsre-modulusUnit\">GPa<\/span>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"bsre-field\">\n                            <label for=\"bsre-tensileStrength\">Ultimate Tensile Strength <span class=\"bsre-optional\">(optional)<\/span><\/label>\n                            <div class=\"bsre-input-unit\">\n                                <input type=\"number\" id=\"bsre-tensileStrength\" step=\"any\" min=\"0\" placeholder=\"Optional\">\n                                <span id=\"bsre-tensileUnit\">MPa<\/span>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"bsre-field\">\n                            <label for=\"bsre-elongation\">Elongation <span class=\"bsre-optional\">(optional)<\/span><\/label>\n                            <div class=\"bsre-input-unit\">\n                                <input type=\"number\" id=\"bsre-elongation\" step=\"any\" min=\"0\" max=\"100\" placeholder=\"%\">\n                                <span>%<\/span>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"bsre-field\">\n                            <label for=\"bsre-hardness\">Hardness \/ Temper <span class=\"bsre-optional\">(optional)<\/span><\/label>\n                            <input type=\"text\" id=\"bsre-hardness\" placeholder=\"e.g. H32, half hard\">\n                        <\/div>\n\n                        <div class=\"bsre-field\">\n                            <label for=\"bsre-empiricalC\">\n                                Empirical Coefficient (C)\n                                <span class=\"bsre-tooltip\" data-tip=\"Editable correction factor. Calibrate from bend test data for your tooling and process.\">?<\/span>\n                            <\/label>\n                            <input type=\"number\" id=\"bsre-empiricalC\" step=\"any\" min=\"0.01\" value=\"1.0\">\n                        <\/div>\n                    <\/div>\n                <\/div>\n\n                <div class=\"bsre-section\" id=\"bsre-sectionGeometry\">\n                    <h2>Geometry<\/h2>\n                    <div class=\"bsre-form-grid\">\n                        <div class=\"bsre-field\">\n                            <label for=\"bsre-thickness\">\n                                Sheet Thickness (t)\n                                <span class=\"bsre-tooltip\" data-tip=\"Thinner sheet generally shows higher springback tendency for the same R\/t.\">?<\/span>\n                            <\/label>\n                            <div class=\"bsre-input-unit\">\n                                <input type=\"number\" id=\"bsre-thickness\" step=\"any\" min=\"0\" value=\"2.0\">\n                                <span id=\"bsre-thicknessUnit\">mm<\/span>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"bsre-field\">\n                            <label for=\"bsre-insideRadius\">\n                                Inside Bend Radius (R)\n                                <span class=\"bsre-tooltip\" data-tip=\"Inside radius at the inner surface of the bend. Larger R\/t increases springback.\">?<\/span>\n                            <\/label>\n                            <div class=\"bsre-input-unit\">\n                                <input type=\"number\" id=\"bsre-insideRadius\" step=\"any\" min=\"0\" value=\"2.0\">\n                                <span id=\"bsre-radiusUnit\">mm<\/span>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"bsre-field bsre-readonly\">\n                            <label>R\/t Ratio<\/label>\n                            <div class=\"bsre-computed\" id=\"bsre-rtDisplay\">1.00<\/div>\n                        <\/div>\n\n                        <div class=\"bsre-field bsre-readonly\">\n                            <label>Sy\/E Ratio<\/label>\n                            <div class=\"bsre-computed\" id=\"bsre-syEDisplay\">\u2014<\/div>\n                        <\/div>\n\n                        <div class=\"bsre-field bsre-mode-field\" data-modes=\"springbackAngle,springbackRate,finalAngle,overbend,comparison,sensitivity\">\n                            <label for=\"bsre-formingAngle\">\n                                Forming Angle (\u03b8<sub>form<\/sub>)\n                                <span class=\"bsre-tooltip\" data-tip=\"Loaded or commanded angle during forming, in degrees.\">?<\/span>\n                            <\/label>\n                            <div class=\"bsre-input-unit\">\n                                <input type=\"number\" id=\"bsre-formingAngle\" step=\"any\" min=\"0.1\" max=\"180\" value=\"90\">\n                                <span>\u00b0<\/span>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"bsre-field bsre-mode-field\" data-modes=\"overbend\">\n                            <label for=\"bsre-targetAngle\">\n                                Target Final Angle (\u03b8<sub>target<\/sub>)\n                                <span class=\"bsre-tooltip\" data-tip=\"Desired angle after springback recovery.\">?<\/span>\n                            <\/label>\n                            <div class=\"bsre-input-unit\">\n                                <input type=\"number\" id=\"bsre-targetAngle\" step=\"any\" min=\"0.1\" max=\"180\" value=\"90\">\n                                <span>\u00b0<\/span>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"bsre-field bsre-mode-field bsre-hidden\" data-modes=\"measured\">\n                            <label for=\"bsre-formedBeforeUnload\">Formed Angle Before Unloading<\/label>\n                            <div class=\"bsre-input-unit\">\n                                <input type=\"number\" id=\"bsre-formedBeforeUnload\" step=\"any\" min=\"0.1\" max=\"180\" value=\"88\">\n                                <span>\u00b0<\/span>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"bsre-field bsre-mode-field bsre-hidden\" data-modes=\"measured\">\n                            <label for=\"bsre-finalAfterUnload\">Final Angle After Unloading<\/label>\n                            <div class=\"bsre-input-unit\">\n                                <input type=\"number\" id=\"bsre-finalAfterUnload\" step=\"any\" min=\"0.1\" max=\"180\" value=\"90\">\n                                <span>\u00b0<\/span>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"bsre-field\">\n                            <label for=\"bsre-springbackLimit\">Practical Springback Limit <span class=\"bsre-optional\">(optional)<\/span><\/label>\n                            <div class=\"bsre-input-unit\">\n                                <input type=\"number\" id=\"bsre-springbackLimit\" step=\"any\" min=\"0\" placeholder=\"e.g. 5\">\n                                <span>\u00b0<\/span>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n                <\/div>\n\n                <div class=\"bsre-section\" id=\"bsre-sectionProcess\">\n                    <h2>Forming Process<\/h2>\n                    <div class=\"bsre-form-grid\">\n                        <div class=\"bsre-field\">\n                            <label for=\"bsre-formingMethod\">Forming Method<\/label>\n                            <select id=\"bsre-formingMethod\">\n                                <option value=\"airBending\">Air Bending<\/option>\n                                <option value=\"bottomBending\">Bottom Bending<\/option>\n                                <option value=\"coining\">Coining<\/option>\n                                <option value=\"rollBending\">Roll Bending<\/option>\n                                <option value=\"wipeBending\">Wipe Bending<\/option>\n                                <option value=\"customProcess\">Custom<\/option>\n                            <\/select>\n                        <\/div>\n\n                        <div class=\"bsre-field\">\n                            <label for=\"bsre-rollingDirection\">Rolling Direction<\/label>\n                            <select id=\"bsre-rollingDirection\">\n                                <option value=\"perpendicular\">Perpendicular to Rolling Direction<\/option>\n                                <option value=\"parallel\">Parallel to Rolling Direction<\/option>\n                                <option value=\"unknown\">Unknown<\/option>\n                            <\/select>\n                        <\/div>\n\n                        <div class=\"bsre-field\">\n                            <label for=\"bsre-processFactor\">Process Factor (C<sub>process<\/sub>)<\/label>\n                            <input type=\"number\" id=\"bsre-processFactor\" step=\"any\" min=\"0.01\" value=\"1.00\">\n                        <\/div>\n\n                        <div class=\"bsre-field\">\n                            <label for=\"bsre-dirFactor\">Direction Factor (C<sub>direction<\/sub>)<\/label>\n                            <input type=\"number\" id=\"bsre-dirFactor\" step=\"any\" min=\"0.01\" value=\"1.00\">\n                        <\/div>\n                    <\/div>\n                <\/div>\n\n                <div class=\"bsre-section\" id=\"bsre-sectionTooling\">\n                    <h2>\n                        Tooling\n                        <button type=\"button\" class=\"bsre-toggle-btn\" id=\"bsre-toggleTooling\" aria-expanded=\"false\">Show<\/button>\n                    <\/h2>\n                    <div id=\"bsre-toolingPanel\" class=\"bsre-collapsed\">\n                        <div class=\"bsre-form-grid\">\n                            <div class=\"bsre-field\">\n                                <label for=\"bsre-vDieOpening\">\n                                    V-Die Opening (V)\n                                    <span class=\"bsre-tooltip\" data-tip=\"For air bending: Rinside \u2248 Cv \u00d7 V. Overrides manual radius if enabled.\">?<\/span>\n                                <\/label>\n                                <div class=\"bsre-input-unit\">\n                                    <input type=\"number\" id=\"bsre-vDieOpening\" step=\"any\" min=\"0\" placeholder=\"Optional\">\n                                    <span id=\"bsre-vDieUnit\">mm<\/span>\n                                <\/div>\n                            <\/div>\n\n                            <div class=\"bsre-field bsre-check\">\n                                <label>\n                                    <input type=\"checkbox\" id=\"bsre-useVDieRadius\">\n                                    Estimate inside radius from V-die (R \u2248 Cv \u00d7 V)\n                                <\/label>\n                            <\/div>\n\n                            <div class=\"bsre-field\">\n                                <label for=\"bsre-cvFactor\">V-Die Coefficient (C<sub>v<\/sub>)<\/label>\n                                <input type=\"number\" id=\"bsre-cvFactor\" step=\"any\" min=\"0.01\" value=\"0.16\">\n                            <\/div>\n\n                            <div class=\"bsre-field\">\n                                <label for=\"bsre-punchRadius\">Punch Nose Radius <span class=\"bsre-optional\">(optional)<\/span><\/label>\n                                <div class=\"bsre-input-unit\">\n                                    <input type=\"number\" id=\"bsre-punchRadius\" step=\"any\" min=\"0\" placeholder=\"Optional\">\n                                    <span id=\"bsre-punchUnit\">mm<\/span>\n                                <\/div>\n                            <\/div>\n\n                            <div class=\"bsre-field\">\n                                <label for=\"bsre-dieShoulder\">Die Shoulder Radius <span class=\"bsre-optional\">(optional)<\/span><\/label>\n                                <div class=\"bsre-input-unit\">\n                                    <input type=\"number\" id=\"bsre-dieShoulder\" step=\"any\" min=\"0\" placeholder=\"Optional\">\n                                    <span id=\"bsre-shoulderUnit\">mm<\/span>\n                                <\/div>\n                            <\/div>\n\n                            <div class=\"bsre-field\">\n                                <label for=\"bsre-toolingType\">Tooling Type <span class=\"bsre-optional\">(optional)<\/span><\/label>\n                                <input type=\"text\" id=\"bsre-toolingType\" placeholder=\"e.g. acute punch, gooseneck\">\n                            <\/div>\n                        <\/div>\n                    <\/div>\n                <\/div>\n\n                <div class=\"bsre-section bsre-hidden\" id=\"bsre-sectionComparison\">\n                    <h2>Material Comparison<\/h2>\n                    <p class=\"bsre-hint\">Compare 2\u20136 materials at the same thickness, radius, angle, and forming conditions.<\/p>\n                    <div id=\"bsre-comparisonMaterials\" class=\"bsre-compare-list\"><\/div>\n                <\/div>\n\n                <div class=\"bsre-section bsre-hidden\" id=\"bsre-sectionSensitivity\">\n                    <h2>Sensitivity Analysis<\/h2>\n                    <div class=\"bsre-form-grid\">\n                        <div class=\"bsre-field\">\n                            <label for=\"bsre-sensParameter\">Vary Parameter<\/label>\n                            <select id=\"bsre-sensParameter\">\n                                <option value=\"radius\">Inside Bend Radius (R\/t)<\/option>\n                                <option value=\"yield\">Yield Strength<\/option>\n                                <option value=\"modulus\">Young&#8217;s Modulus<\/option>\n                                <option value=\"thickness\">Sheet Thickness<\/option>\n                                <option value=\"vDie\">V-Die Opening<\/option>\n                            <\/select>\n                        <\/div>\n                        <div class=\"bsre-field\">\n                            <label for=\"bsre-sensSteps\">Chart Points<\/label>\n                            <input type=\"number\" id=\"bsre-sensSteps\" min=\"5\" max=\"30\" value=\"15\">\n                        <\/div>\n                    <\/div>\n                <\/div>\n\n                <div class=\"bsre-actions\">\n                    <button type=\"button\" id=\"bsre-btnCalculate\" class=\"bsre-btn bsre-btn-primary\">Calculate<\/button>\n                <\/div>\n            <\/section>\n\n            <div class=\"bsre-results bsre-hidden\" id=\"bsre-calculatorResults\">\n                <section class=\"bsre-card bsre-results-card\">\n                    <h2>Results<\/h2>\n                    <div id=\"bsre-warnings\" class=\"bsre-warnings\" role=\"alert\"><\/div>\n\n                    <div class=\"bsre-diagram-wrap\">\n                        <canvas id=\"bsre-bendDiagram\" width=\"420\" height=\"280\" aria-label=\"Bend springback diagram\"><\/canvas>\n                    <\/div>\n\n                    <div id=\"bsre-resultsGrid\" class=\"bsre-results-grid\">\n                        <div class=\"bsre-result\">\n                            <span class=\"bsre-result-label\">Springback Index<\/span>\n                            <span class=\"bsre-result-val\" id=\"bsre-resIndex\">\u2014<\/span>\n                        <\/div>\n                        <div class=\"bsre-result\">\n                            <span class=\"bsre-result-label\">Estimated Springback Angle (\u0394\u03b8)<\/span>\n                            <span class=\"bsre-result-val bsre-highlight\" id=\"bsre-resSpringbackAngle\">\u2014<\/span>\n                        <\/div>\n                        <div class=\"bsre-result\">\n                            <span class=\"bsre-result-label\">Springback Rate<\/span>\n                            <span class=\"bsre-result-val\" id=\"bsre-resSpringbackRate\">\u2014<\/span>\n                        <\/div>\n                        <div class=\"bsre-result\">\n                            <span class=\"bsre-result-label\">Final Unloaded Angle<\/span>\n                            <span class=\"bsre-result-val\" id=\"bsre-resFinalAngle\">\u2014<\/span>\n                        <\/div>\n                        <div class=\"bsre-result\">\n                            <span class=\"bsre-result-label\">Required Overbend Angle<\/span>\n                            <span class=\"bsre-result-val\" id=\"bsre-resOverbend\">\u2014<\/span>\n                        <\/div>\n                        <div class=\"bsre-result\">\n                            <span class=\"bsre-result-label\">R\/t Ratio<\/span>\n                            <span class=\"bsre-result-val\" id=\"bsre-resRt\">\u2014<\/span>\n                        <\/div>\n                        <div class=\"bsre-result\">\n                            <span class=\"bsre-result-label\">Springback Classification<\/span>\n                            <span class=\"bsre-result-val bsre-badge\" id=\"bsre-resClassification\">\u2014<\/span>\n                        <\/div>\n                        <div class=\"bsre-result bsre-mode-result bsre-hidden\" data-modes=\"measured\">\n                            <span class=\"bsre-result-label\">Measured Springback (\u0394\u03b8)<\/span>\n                            <span class=\"bsre-result-val\" id=\"bsre-resMeasured\">\u2014<\/span>\n                        <\/div>\n                        <div class=\"bsre-result bsre-mode-result bsre-hidden\" data-modes=\"measured\">\n                            <span class=\"bsre-result-label\">Calibrated Coefficient (C)<\/span>\n                            <span class=\"bsre-result-val bsre-highlight\" id=\"bsre-resCalibratedC\">\u2014<\/span>\n                        <\/div>\n                    <\/div>\n\n                    <div id=\"bsre-recommendations\" class=\"bsre-recommendations\"><\/div>\n\n                    <div class=\"bsre-chart-wrap bsre-hidden\" id=\"bsre-chartSection\">\n                        <h3 id=\"bsre-chartTitle\">Springback vs R\/t Ratio<\/h3>\n                        <canvas id=\"bsre-sensitivityChart\" width=\"600\" height=\"280\" aria-label=\"Sensitivity chart\"><\/canvas>\n                    <\/div>\n\n                    <div class=\"bsre-table-wrap bsre-hidden\" id=\"bsre-comparisonResults\">\n                        <h3>Material Springback Comparison<\/h3>\n                        <table class=\"bsre-table\" id=\"bsre-comparisonTable\">\n                            <thead>\n                                <tr>\n                                    <th>Rank<\/th>\n                                    <th>Material<\/th>\n                                    <th>Sy<\/th>\n                                    <th>E<\/th>\n                                    <th>Sy\/E<\/th>\n                                    <th>R\/t<\/th>\n                                    <th>Index<\/th>\n                                    <th>\u0394\u03b8<\/th>\n                                    <th>Rate<\/th>\n                                    <th>Overbend<\/th>\n                                <\/tr>\n                            <\/thead>\n                            <tbody><\/tbody>\n                        <\/table>\n                    <\/div>\n\n                    <div class=\"bsre-bar-chart bsre-hidden\" id=\"bsre-comparisonBars\"><\/div>\n                <\/section>\n            <\/div>\n        <\/div>\n    <\/div>\n<script src=\"data:application\/javascript;base64,LyoqDQogKiBCZW5kaW5nIFNwcmluZ2JhY2sgUmF0ZSBFc3RpbWF0b3INCiAqIFNjb3BlZCBmb3IgV29yZFByZXNzIGVtYmVkIOKAlCBhbGwgRE9NIGFjY2VzcyBzdGF5cyBpbnNpZGUgI2JzcmUtY2FsY3VsYXRvcg0KICovDQooZnVuY3Rpb24gKCkgew0KICAgICd1c2Ugc3RyaWN0JzsNCg0KICAgIGNvbnN0IHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnNyZS1jYWxjdWxhdG9yJyk7DQogICAgaWYgKCFyb290KSByZXR1cm47DQoNCiAgICBjb25zdCBNTV9QRVJfSU5DSCA9IDI1LjQ7DQogICAgY29uc3QgTVBBX1BFUl9LU0kgPSA2Ljg5NDc2Ow0KICAgIGNvbnN0IE1QQV9QRVJfUFNJID0gMC4wMDY4OTQ3NjsNCiAgICBjb25zdCBHUEFfVE9fTVBBID0gMTAwMDsNCg0KICAgIGNvbnN0IERFRkFVTFRfTUFURVJJQUxTID0gWw0KICAgICAgICB7IGlkOiAnbG93Q2FyYm9uU3RlZWwnLCBuYW1lOiAnTG93IENhcmJvbiBTdGVlbCAoTWlsZCBTdGVlbCknLCB5aWVsZE1QYTogMjUwLCBtb2R1bHVzR1BhOiAyMDAsIGM6IDEuMCwgY3Y6IDAuMTYsIHBhcmFsbGVsR3JhaW46IDEuMTUsIGVsb25nYXRpb246IDI1IH0sDQogICAgICAgIHsgaWQ6ICdoaWdoU3RyZW5ndGhTdGVlbCcsIG5hbWU6ICdIaWdoIFN0cmVuZ3RoIFN0ZWVsJywgeWllbGRNUGE6IDU1MCwgbW9kdWx1c0dQYTogMjAwLCBjOiAxLjEsIGN2OiAwLjE4LCBwYXJhbGxlbEdyYWluOiAxLjI1LCBlbG9uZ2F0aW9uOiAxMiB9LA0KICAgICAgICB7IGlkOiAnc3RhaW5sZXNzU3RlZWwnLCBuYW1lOiAnU3RhaW5sZXNzIFN0ZWVsJywgeWllbGRNUGE6IDMxMCwgbW9kdWx1c0dQYTogMjAwLCBjOiAxLjA1LCBjdjogMC4xNywgcGFyYWxsZWxHcmFpbjogMS4yMCwgZWxvbmdhdGlvbjogNDAgfSwNCiAgICAgICAgeyBpZDogJ2FsdW1pbnVtNTA1MicsIG5hbWU6ICdBbHVtaW51bSA1MDUyJywgeWllbGRNUGE6IDE5MywgbW9kdWx1c0dQYTogNjksIGM6IDEuMCwgY3Y6IDAuMTUsIHBhcmFsbGVsR3JhaW46IDEuMTIsIGVsb25nYXRpb246IDEyIH0sDQogICAgICAgIHsgaWQ6ICdhbHVtaW51bTYwNjEnLCBuYW1lOiAnQWx1bWludW0gNjA2MS1UNicsIHlpZWxkTVBhOiAyNzYsIG1vZHVsdXNHUGE6IDY5LCBjOiAxLjE1LCBjdjogMC4xNiwgcGFyYWxsZWxHcmFpbjogMS4xOCwgZWxvbmdhdGlvbjogMTAgfSwNCiAgICAgICAgeyBpZDogJ2NvcHBlcicsIG5hbWU6ICdDb3BwZXInLCB5aWVsZE1QYTogNzAsIG1vZHVsdXNHUGE6IDEyMCwgYzogMC45LCBjdjogMC4xNCwgcGFyYWxsZWxHcmFpbjogMS4xMCwgZWxvbmdhdGlvbjogMzAgfSwNCiAgICAgICAgeyBpZDogJ2JyYXNzJywgbmFtZTogJ0JyYXNzJywgeWllbGRNUGE6IDEyNSwgbW9kdWx1c0dQYTogMTA1LCBjOiAwLjk1LCBjdjogMC4xNCwgcGFyYWxsZWxHcmFpbjogMS4xMiwgZWxvbmdhdGlvbjogMzUgfSwNCiAgICAgICAgeyBpZDogJ3RpdGFuaXVtJywgbmFtZTogJ1RpdGFuaXVtIEFsbG95JywgeWllbGRNUGE6IDg4MCwgbW9kdWx1c0dQYTogMTE0LCBjOiAxLjIsIGN2OiAwLjIwLCBwYXJhbGxlbEdyYWluOiAxLjMwLCBlbG9uZ2F0aW9uOiAxMCB9LA0KICAgICAgICB7IGlkOiAnY3VzdG9tJywgbmFtZTogJ0N1c3RvbSBNYXRlcmlhbCcsIHlpZWxkTVBhOiAyNTAsIG1vZHVsdXNHUGE6IDIwMCwgYzogMS4wLCBjdjogMC4xNiwgcGFyYWxsZWxHcmFpbjogMS4xNSwgZWxvbmdhdGlvbjogMjAgfQ0KICAgIF07DQoNCiAgICBjb25zdCBQUk9DRVNTX0RFRkFVTFRTID0gew0KICAgICAgICBhaXJCZW5kaW5nOiAxLjAwLA0KICAgICAgICBib3R0b21CZW5kaW5nOiAwLjc1LA0KICAgICAgICBjb2luaW5nOiAwLjQwLA0KICAgICAgICByb2xsQmVuZGluZzogMS4xMCwNCiAgICAgICAgd2lwZUJlbmRpbmc6IDAuOTAsDQogICAgICAgIGN1c3RvbVByb2Nlc3M6IDEuMDANCiAgICB9Ow0KDQogICAgY29uc3QgUFJPQ0VTU19MQUJFTFMgPSB7DQogICAgICAgIGFpckJlbmRpbmc6ICdBaXIgQmVuZGluZycsDQogICAgICAgIGJvdHRvbUJlbmRpbmc6ICdCb3R0b20gQmVuZGluZycsDQogICAgICAgIGNvaW5pbmc6ICdDb2luaW5nJywNCiAgICAgICAgcm9sbEJlbmRpbmc6ICdSb2xsIEJlbmRpbmcnLA0KICAgICAgICB3aXBlQmVuZGluZzogJ1dpcGUgQmVuZGluZycsDQogICAgICAgIGN1c3RvbVByb2Nlc3M6ICdDdXN0b20nDQogICAgfTsNCg0KICAgIGNvbnN0IERJUkVDVElPTl9ERUZBVUxUUyA9IHsgcGVycGVuZGljdWxhcjogMS4wMCwgcGFyYWxsZWw6IG51bGwsIHVua25vd246IDEuMDUgfTsNCg0KICAgIGxldCBtYXRlcmlhbHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KERFRkFVTFRfTUFURVJJQUxTKSk7DQogICAgbGV0IHByb2Nlc3NGYWN0b3JzID0gT2JqZWN0LmFzc2lnbih7fSwgUFJPQ0VTU19ERUZBVUxUUyk7DQoNCiAgICBjb25zdCAkID0gKGlkKSA9PiByb290LnF1ZXJ5U2VsZWN0b3IoJyMnICsgaWQpOw0KDQogICAgY29uc3QgZWxzID0gew0KICAgICAgICBjYWxjTW9kZTogJCgnYnNyZS1jYWxjTW9kZScpLA0KICAgICAgICB1bml0U3lzdGVtOiAkKCdic3JlLXVuaXRTeXN0ZW0nKSwNCiAgICAgICAgYW5nbGVDb252ZW50aW9uOiAkKCdic3JlLWFuZ2xlQ29udmVudGlvbicpLA0KICAgICAgICBtYXRlcmlhbFNlYXJjaDogJCgnYnNyZS1tYXRlcmlhbFNlYXJjaCcpLA0KICAgICAgICBtYXRlcmlhbFR5cGU6ICQoJ2JzcmUtbWF0ZXJpYWxUeXBlJyksDQogICAgICAgIG1hdGVyaWFsR3JhZGU6ICQoJ2JzcmUtbWF0ZXJpYWxHcmFkZScpLA0KICAgICAgICB5aWVsZFN0cmVuZ3RoOiAkKCdic3JlLXlpZWxkU3RyZW5ndGgnKSwNCiAgICAgICAgeWllbGRVbml0OiAkKCdic3JlLXlpZWxkVW5pdCcpLA0KICAgICAgICB5b3VuZ01vZHVsdXM6ICQoJ2JzcmUteW91bmdNb2R1bHVzJyksDQogICAgICAgIG1vZHVsdXNVbml0OiAkKCdic3JlLW1vZHVsdXNVbml0JyksDQogICAgICAgIHRlbnNpbGVTdHJlbmd0aDogJCgnYnNyZS10ZW5zaWxlU3RyZW5ndGgnKSwNCiAgICAgICAgdGVuc2lsZVVuaXQ6ICQoJ2JzcmUtdGVuc2lsZVVuaXQnKSwNCiAgICAgICAgZWxvbmdhdGlvbjogJCgnYnNyZS1lbG9uZ2F0aW9uJyksDQogICAgICAgIGhhcmRuZXNzOiAkKCdic3JlLWhhcmRuZXNzJyksDQogICAgICAgIGVtcGlyaWNhbEM6ICQoJ2JzcmUtZW1waXJpY2FsQycpLA0KICAgICAgICB0aGlja25lc3M6ICQoJ2JzcmUtdGhpY2tuZXNzJyksDQogICAgICAgIHRoaWNrbmVzc1VuaXQ6ICQoJ2JzcmUtdGhpY2tuZXNzVW5pdCcpLA0KICAgICAgICBpbnNpZGVSYWRpdXM6ICQoJ2JzcmUtaW5zaWRlUmFkaXVzJyksDQogICAgICAgIHJhZGl1c1VuaXQ6ICQoJ2JzcmUtcmFkaXVzVW5pdCcpLA0KICAgICAgICBydERpc3BsYXk6ICQoJ2JzcmUtcnREaXNwbGF5JyksDQogICAgICAgIHN5RURpc3BsYXk6ICQoJ2JzcmUtc3lFRGlzcGxheScpLA0KICAgICAgICBmb3JtaW5nQW5nbGU6ICQoJ2JzcmUtZm9ybWluZ0FuZ2xlJyksDQogICAgICAgIHRhcmdldEFuZ2xlOiAkKCdic3JlLXRhcmdldEFuZ2xlJyksDQogICAgICAgIGZvcm1lZEJlZm9yZVVubG9hZDogJCgnYnNyZS1mb3JtZWRCZWZvcmVVbmxvYWQnKSwNCiAgICAgICAgZmluYWxBZnRlclVubG9hZDogJCgnYnNyZS1maW5hbEFmdGVyVW5sb2FkJyksDQogICAgICAgIHNwcmluZ2JhY2tMaW1pdDogJCgnYnNyZS1zcHJpbmdiYWNrTGltaXQnKSwNCiAgICAgICAgZm9ybWluZ01ldGhvZDogJCgnYnNyZS1mb3JtaW5nTWV0aG9kJyksDQogICAgICAgIHJvbGxpbmdEaXJlY3Rpb246ICQoJ2JzcmUtcm9sbGluZ0RpcmVjdGlvbicpLA0KICAgICAgICBwcm9jZXNzRmFjdG9yOiAkKCdic3JlLXByb2Nlc3NGYWN0b3InKSwNCiAgICAgICAgZGlyRmFjdG9yOiAkKCdic3JlLWRpckZhY3RvcicpLA0KICAgICAgICB2RGllT3BlbmluZzogJCgnYnNyZS12RGllT3BlbmluZycpLA0KICAgICAgICB2RGllVW5pdDogJCgnYnNyZS12RGllVW5pdCcpLA0KICAgICAgICB1c2VWRGllUmFkaXVzOiAkKCdic3JlLXVzZVZEaWVSYWRpdXMnKSwNCiAgICAgICAgY3ZGYWN0b3I6ICQoJ2JzcmUtY3ZGYWN0b3InKSwNCiAgICAgICAgcHVuY2hSYWRpdXM6ICQoJ2JzcmUtcHVuY2hSYWRpdXMnKSwNCiAgICAgICAgcHVuY2hVbml0OiAkKCdic3JlLXB1bmNoVW5pdCcpLA0KICAgICAgICBkaWVTaG91bGRlcjogJCgnYnNyZS1kaWVTaG91bGRlcicpLA0KICAgICAgICBzaG91bGRlclVuaXQ6ICQoJ2JzcmUtc2hvdWxkZXJVbml0JyksDQogICAgICAgIHRvb2xpbmdUeXBlOiAkKCdic3JlLXRvb2xpbmdUeXBlJyksDQogICAgICAgIHRvZ2dsZVRvb2xpbmc6ICQoJ2JzcmUtdG9nZ2xlVG9vbGluZycpLA0KICAgICAgICB0b29saW5nUGFuZWw6ICQoJ2JzcmUtdG9vbGluZ1BhbmVsJyksDQogICAgICAgIHNlY3Rpb25Db21wYXJpc29uOiAkKCdic3JlLXNlY3Rpb25Db21wYXJpc29uJyksDQogICAgICAgIGNvbXBhcmlzb25NYXRlcmlhbHM6ICQoJ2JzcmUtY29tcGFyaXNvbk1hdGVyaWFscycpLA0KICAgICAgICBzZWN0aW9uU2Vuc2l0aXZpdHk6ICQoJ2JzcmUtc2VjdGlvblNlbnNpdGl2aXR5JyksDQogICAgICAgIHNlbnNQYXJhbWV0ZXI6ICQoJ2JzcmUtc2Vuc1BhcmFtZXRlcicpLA0KICAgICAgICBzZW5zU3RlcHM6ICQoJ2JzcmUtc2Vuc1N0ZXBzJyksDQogICAgICAgIGJ0bkNhbGN1bGF0ZTogJCgnYnNyZS1idG5DYWxjdWxhdGUnKSwNCiAgICAgICAgY2FsY3VsYXRvclJlc3VsdHM6ICQoJ2JzcmUtY2FsY3VsYXRvclJlc3VsdHMnKSwNCiAgICAgICAgd2FybmluZ3M6ICQoJ2JzcmUtd2FybmluZ3MnKSwNCiAgICAgICAgYmVuZERpYWdyYW06ICQoJ2JzcmUtYmVuZERpYWdyYW0nKSwNCiAgICAgICAgcmVzdWx0c0dyaWQ6ICQoJ2JzcmUtcmVzdWx0c0dyaWQnKSwNCiAgICAgICAgcmVjb21tZW5kYXRpb25zOiAkKCdic3JlLXJlY29tbWVuZGF0aW9ucycpLA0KICAgICAgICBjaGFydFNlY3Rpb246ICQoJ2JzcmUtY2hhcnRTZWN0aW9uJyksDQogICAgICAgIGNoYXJ0VGl0bGU6ICQoJ2JzcmUtY2hhcnRUaXRsZScpLA0KICAgICAgICBzZW5zaXRpdml0eUNoYXJ0OiAkKCdic3JlLXNlbnNpdGl2aXR5Q2hhcnQnKSwNCiAgICAgICAgY29tcGFyaXNvblJlc3VsdHM6ICQoJ2JzcmUtY29tcGFyaXNvblJlc3VsdHMnKSwNCiAgICAgICAgY29tcGFyaXNvblRhYmxlOiAkKCdic3JlLWNvbXBhcmlzb25UYWJsZScpLA0KICAgICAgICBjb21wYXJpc29uQmFyczogJCgnYnNyZS1jb21wYXJpc29uQmFycycpDQogICAgfTsNCg0KICAgIGNvbnN0IHJlc3VsdEVscyA9IHsNCiAgICAgICAgaW5kZXg6ICQoJ2JzcmUtcmVzSW5kZXgnKSwNCiAgICAgICAgc3ByaW5nYmFja0FuZ2xlOiAkKCdic3JlLXJlc1NwcmluZ2JhY2tBbmdsZScpLA0KICAgICAgICBzcHJpbmdiYWNrUmF0ZTogJCgnYnNyZS1yZXNTcHJpbmdiYWNrUmF0ZScpLA0KICAgICAgICBmaW5hbEFuZ2xlOiAkKCdic3JlLXJlc0ZpbmFsQW5nbGUnKSwNCiAgICAgICAgb3ZlcmJlbmQ6ICQoJ2JzcmUtcmVzT3ZlcmJlbmQnKSwNCiAgICAgICAgcnQ6ICQoJ2JzcmUtcmVzUnQnKSwNCiAgICAgICAgY2xhc3NpZmljYXRpb246ICQoJ2JzcmUtcmVzQ2xhc3NpZmljYXRpb24nKSwNCiAgICAgICAgbWVhc3VyZWQ6ICQoJ2JzcmUtcmVzTWVhc3VyZWQnKSwNCiAgICAgICAgY2FsaWJyYXRlZEM6ICQoJ2JzcmUtcmVzQ2FsaWJyYXRlZEMnKQ0KICAgIH07DQoNCiAgICBmdW5jdGlvbiBpc01ldHJpYygpIHsNCiAgICAgICAgcmV0dXJuIGVscy51bml0U3lzdGVtLnZhbHVlID09PSAnbWV0cmljJzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBpc0luY2x1ZGVkQW5nbGUoKSB7DQogICAgICAgIHJldHVybiBlbHMuYW5nbGVDb252ZW50aW9uLnZhbHVlID09PSAnaW5jbHVkZWQnOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHRvTU0odmFsdWUpIHsNCiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnKSByZXR1cm4gbnVsbDsNCiAgICAgICAgY29uc3QgbiA9IHBhcnNlRmxvYXQodmFsdWUpOw0KICAgICAgICBpZiAoaXNOYU4obikpIHJldHVybiBudWxsOw0KICAgICAgICByZXR1cm4gaXNNZXRyaWMoKSA\/IG4gOiBuICogTU1fUEVSX0lOQ0g7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZnJvbU1NKG1tKSB7DQogICAgICAgIHJldHVybiBpc01ldHJpYygpID8gbW0gOiBtbSAvIE1NX1BFUl9JTkNIOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHRvTVBhKHZhbHVlKSB7DQogICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJykgcmV0dXJuIG51bGw7DQogICAgICAgIGNvbnN0IG4gPSBwYXJzZUZsb2F0KHZhbHVlKTsNCiAgICAgICAgaWYgKGlzTmFOKG4pKSByZXR1cm4gbnVsbDsNCiAgICAgICAgaWYgKGlzTWV0cmljKCkpIHJldHVybiBuOw0KICAgICAgICBjb25zdCB1bml0ID0gZWxzLnlpZWxkVW5pdC50ZXh0Q29udGVudDsNCiAgICAgICAgaWYgKHVuaXQgPT09ICdrc2knKSByZXR1cm4gbiAqIE1QQV9QRVJfS1NJOw0KICAgICAgICByZXR1cm4gbiAqIE1QQV9QRVJfUFNJOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHRvR1BhKHZhbHVlKSB7DQogICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJykgcmV0dXJuIG51bGw7DQogICAgICAgIGNvbnN0IG4gPSBwYXJzZUZsb2F0KHZhbHVlKTsNCiAgICAgICAgaWYgKGlzTmFOKG4pKSByZXR1cm4gbnVsbDsNCiAgICAgICAgaWYgKGlzTWV0cmljKCkpIHsNCiAgICAgICAgICAgIGNvbnN0IHVuaXQgPSBlbHMubW9kdWx1c1VuaXQudGV4dENvbnRlbnQ7DQogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ0dQYScpIHJldHVybiBuOw0KICAgICAgICAgICAgcmV0dXJuIG4gLyBHUEFfVE9fTVBBOw0KICAgICAgICB9DQogICAgICAgIGNvbnN0IHVuaXQgPSBlbHMubW9kdWx1c1VuaXQudGV4dENvbnRlbnQ7DQogICAgICAgIGlmICh1bml0ID09PSAna3NpJykgcmV0dXJuIChuICogTVBBX1BFUl9LU0kpIC8gR1BBX1RPX01QQTsNCiAgICAgICAgcmV0dXJuIChuICogTVBBX1BFUl9QU0kpIC8gR1BBX1RPX01QQTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBmb3JtYXRMZW5ndGgobW0pIHsNCiAgICAgICAgY29uc3QgdmFsID0gZnJvbU1NKG1tKTsNCiAgICAgICAgY29uc3QgdW5pdCA9IGlzTWV0cmljKCkgPyAnbW0nIDogJ2luJzsNCiAgICAgICAgY29uc3QgZGVjaW1hbHMgPSBpc01ldHJpYygpID8gMiA6IDQ7DQogICAgICAgIHJldHVybiB2YWwudG9GaXhlZChkZWNpbWFscykgKyAnICcgKyB1bml0Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZvcm1hdFN0cmVuZ3RoKG1wYSkgew0KICAgICAgICBpZiAoaXNNZXRyaWMoKSkgcmV0dXJuIG1wYS50b0ZpeGVkKDApICsgJyBNUGEnOw0KICAgICAgICByZXR1cm4gKG1wYSAvIE1QQV9QRVJfS1NJKS50b0ZpeGVkKDEpICsgJyBrc2knOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZvcm1hdE1vZHVsdXMoZ3BhKSB7DQogICAgICAgIGlmIChpc01ldHJpYygpKSByZXR1cm4gZ3BhLnRvRml4ZWQoMCkgKyAnIEdQYSc7DQogICAgICAgIHJldHVybiAoKGdwYSAqIEdQQV9UT19NUEEpIC8gTVBBX1BFUl9LU0kpLnRvRml4ZWQoMSkgKyAnIGtzaSc7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0TWF0ZXJpYWwoaWQpIHsNCiAgICAgICAgcmV0dXJuIG1hdGVyaWFscy5maW5kKChtKSA9PiBtLmlkID09PSBpZCkgfHwgbWF0ZXJpYWxzW21hdGVyaWFscy5sZW5ndGggLSAxXTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBwb3B1bGF0ZU1hdGVyaWFsU2VsZWN0KGZpbHRlcikgew0KICAgICAgICBjb25zdCBxID0gKGZpbHRlciB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCk7DQogICAgICAgIGNvbnN0IGZpbHRlcmVkID0gbWF0ZXJpYWxzLmZpbHRlcigobSkgPT4gbS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpOw0KICAgICAgICBlbHMubWF0ZXJpYWxUeXBlLmlubmVySFRNTCA9IGZpbHRlcmVkLm1hcCgobSkgPT4NCiAgICAgICAgICAgICc8b3B0aW9uIHZhbHVlPSInICsgbS5pZCArICciPicgKyBtLm5hbWUgKyAnPC9vcHRpb24+Jw0KICAgICAgICApLmpvaW4oJycpOw0KICAgICAgICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7DQogICAgICAgICAgICBlbHMubWF0ZXJpYWxUeXBlLmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSJjdXN0b20iPkN1c3RvbSBNYXRlcmlhbDwvb3B0aW9uPic7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBwb3B1bGF0ZUNvbXBhcmlzb25DaGVja2JveGVzKCkgew0KICAgICAgICBlbHMuY29tcGFyaXNvbk1hdGVyaWFscy5pbm5lckhUTUwgPSBtYXRlcmlhbHMNCiAgICAgICAgICAgIC5maWx0ZXIoKG0pID0+IG0uaWQgIT09ICdjdXN0b20nKQ0KICAgICAgICAgICAgLm1hcCgobSwgaSkgPT4NCiAgICAgICAgICAgICAgICAnPGxhYmVsPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iYnNyZS1jb21wYXJlTWF0IiB2YWx1ZT0iJyArIG0uaWQgKyAnIiAnICsNCiAgICAgICAgICAgICAgICAoaSA8IDQgPyAnY2hlY2tlZCcgOiAnJykgKyAnPiAnICsgbS5uYW1lICsgJzwvbGFiZWw+Jw0KICAgICAgICAgICAgKS5qb2luKCcnKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBoaWRlUmVzdWx0cygpIHsNCiAgICAgICAgZWxzLmNhbGN1bGF0b3JSZXN1bHRzLmNsYXNzTGlzdC5hZGQoJ2JzcmUtaGlkZGVuJyk7DQogICAgICAgIGVscy53YXJuaW5ncy5pbm5lckhUTUwgPSAnJzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBhcHBseU1hdGVyaWFsUHJlc2V0KG1hdCkgew0KICAgICAgICBpZiAoaXNNZXRyaWMoKSkgew0KICAgICAgICAgICAgZWxzLnlpZWxkU3RyZW5ndGgudmFsdWUgPSBtYXQueWllbGRNUGE7DQogICAgICAgICAgICBlbHMueW91bmdNb2R1bHVzLnZhbHVlID0gbWF0Lm1vZHVsdXNHUGE7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBlbHMueWllbGRTdHJlbmd0aC52YWx1ZSA9IChtYXQueWllbGRNUGEgLyBNUEFfUEVSX0tTSSkudG9GaXhlZCgxKTsNCiAgICAgICAgICAgIGVscy55b3VuZ01vZHVsdXMudmFsdWUgPSAoKG1hdC5tb2R1bHVzR1BhICogR1BBX1RPX01QQSkgLyBNUEFfUEVSX0tTSSkudG9GaXhlZCgxKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHMuZW1waXJpY2FsQy52YWx1ZSA9IG1hdC5jOw0KICAgICAgICBlbHMuY3ZGYWN0b3IudmFsdWUgPSBtYXQuY3Y7DQogICAgICAgIGlmIChtYXQuZWxvbmdhdGlvbikgZWxzLmVsb25nYXRpb24udmFsdWUgPSBtYXQuZWxvbmdhdGlvbjsNCiAgICAgICAgdXBkYXRlQ29tcHV0ZWRSYXRpb3MoKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVVbml0TGFiZWxzKCkgew0KICAgICAgICBpZiAoaXNNZXRyaWMoKSkgew0KICAgICAgICAgICAgZWxzLnRoaWNrbmVzc1VuaXQudGV4dENvbnRlbnQgPSAnbW0nOw0KICAgICAgICAgICAgZWxzLnJhZGl1c1VuaXQudGV4dENvbnRlbnQgPSAnbW0nOw0KICAgICAgICAgICAgZWxzLnZEaWVVbml0LnRleHRDb250ZW50ID0gJ21tJzsNCiAgICAgICAgICAgIGVscy5wdW5jaFVuaXQudGV4dENvbnRlbnQgPSAnbW0nOw0KICAgICAgICAgICAgZWxzLnNob3VsZGVyVW5pdC50ZXh0Q29udGVudCA9ICdtbSc7DQogICAgICAgICAgICBlbHMueWllbGRVbml0LnRleHRDb250ZW50ID0gJ01QYSc7DQogICAgICAgICAgICBlbHMubW9kdWx1c1VuaXQudGV4dENvbnRlbnQgPSAnR1BhJzsNCiAgICAgICAgICAgIGVscy50ZW5zaWxlVW5pdC50ZXh0Q29udGVudCA9ICdNUGEnOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZWxzLnRoaWNrbmVzc1VuaXQudGV4dENvbnRlbnQgPSAnaW4nOw0KICAgICAgICAgICAgZWxzLnJhZGl1c1VuaXQudGV4dENvbnRlbnQgPSAnaW4nOw0KICAgICAgICAgICAgZWxzLnZEaWVVbml0LnRleHRDb250ZW50ID0gJ2luJzsNCiAgICAgICAgICAgIGVscy5wdW5jaFVuaXQudGV4dENvbnRlbnQgPSAnaW4nOw0KICAgICAgICAgICAgZWxzLnNob3VsZGVyVW5pdC50ZXh0Q29udGVudCA9ICdpbic7DQogICAgICAgICAgICBlbHMueWllbGRVbml0LnRleHRDb250ZW50ID0gJ2tzaSc7DQogICAgICAgICAgICBlbHMubW9kdWx1c1VuaXQudGV4dENvbnRlbnQgPSAna3NpJzsNCiAgICAgICAgICAgIGVscy50ZW5zaWxlVW5pdC50ZXh0Q29udGVudCA9ICdrc2knOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY29udmVydElucHV0VmFsdWVzT25Vbml0Q2hhbmdlKCkgew0KICAgICAgICBjb25zdCBtYXQgPSBnZXRNYXRlcmlhbChlbHMubWF0ZXJpYWxUeXBlLnZhbHVlKTsNCiAgICAgICAgYXBwbHlNYXRlcmlhbFByZXNldChtYXQpOw0KICAgICAgICBjb25zdCB0TU0gPSB0b01NKGVscy50aGlja25lc3MudmFsdWUpOw0KICAgICAgICBjb25zdCByTU0gPSB0b01NKGVscy5pbnNpZGVSYWRpdXMudmFsdWUpOw0KICAgICAgICBpZiAodE1NKSBlbHMudGhpY2tuZXNzLnZhbHVlID0gZnJvbU1NKHRNTSkudG9GaXhlZChpc01ldHJpYygpID8gMiA6IDQpOw0KICAgICAgICBpZiAock1NKSBlbHMuaW5zaWRlUmFkaXVzLnZhbHVlID0gZnJvbU1NKHJNTSkudG9GaXhlZChpc01ldHJpYygpID8gMiA6IDQpOw0KICAgICAgICBjb25zdCB2TU0gPSB0b01NKGVscy52RGllT3BlbmluZy52YWx1ZSk7DQogICAgICAgIGlmICh2TU0pIGVscy52RGllT3BlbmluZy52YWx1ZSA9IGZyb21NTSh2TU0pLnRvRml4ZWQoaXNNZXRyaWMoKSA\/IDIgOiA0KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVDb21wdXRlZFJhdGlvcygpIHsNCiAgICAgICAgY29uc3Qgc3kgPSB0b01QYShlbHMueWllbGRTdHJlbmd0aC52YWx1ZSk7DQogICAgICAgIGNvbnN0IGVHUGEgPSB0b0dQYShlbHMueW91bmdNb2R1bHVzLnZhbHVlKTsNCiAgICAgICAgY29uc3QgdCA9IHRvTU0oZWxzLnRoaWNrbmVzcy52YWx1ZSk7DQogICAgICAgIGxldCByID0gdG9NTShlbHMuaW5zaWRlUmFkaXVzLnZhbHVlKTsNCg0KICAgICAgICBpZiAoZWxzLnVzZVZEaWVSYWRpdXMuY2hlY2tlZCkgew0KICAgICAgICAgICAgY29uc3QgdiA9IHRvTU0oZWxzLnZEaWVPcGVuaW5nLnZhbHVlKTsNCiAgICAgICAgICAgIGNvbnN0IGN2ID0gcGFyc2VGbG9hdChlbHMuY3ZGYWN0b3IudmFsdWUpOw0KICAgICAgICAgICAgaWYgKHYgJiYgY3YpIHIgPSBjdiAqIHY7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodCAmJiB0ID4gMCAmJiByICE9PSBudWxsICYmIHIgPj0gMCkgew0KICAgICAgICAgICAgZWxzLnJ0RGlzcGxheS50ZXh0Q29udGVudCA9IChyIC8gdCkudG9GaXhlZCgyKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGVscy5ydERpc3BsYXkudGV4dENvbnRlbnQgPSAn4oCUJzsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChzeSAmJiBlR1BhICYmIGVHUGEgPiAwKSB7DQogICAgICAgICAgICBjb25zdCBzeUUgPSAoc3kgLyAoZUdQYSAqIEdQQV9UT19NUEEpKS50b0V4cG9uZW50aWFsKDMpOw0KICAgICAgICAgICAgZWxzLnN5RURpc3BsYXkudGV4dENvbnRlbnQgPSBzeUU7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBlbHMuc3lFRGlzcGxheS50ZXh0Q29udGVudCA9ICfigJQnOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlTW9kZVZpc2liaWxpdHkoKSB7DQogICAgICAgIGNvbnN0IG1vZGUgPSBlbHMuY2FsY01vZGUudmFsdWU7DQogICAgICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgnLmJzcmUtbW9kZS1maWVsZCcpLmZvckVhY2goKGVsKSA9PiB7DQogICAgICAgICAgICBjb25zdCBtb2RlcyA9IChlbC5kYXRhc2V0Lm1vZGVzIHx8ICcnKS5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnYnNyZS1oaWRkZW4nLCAhbW9kZXMuaW5jbHVkZXMobW9kZSkpOw0KICAgICAgICB9KTsNCiAgICAgICAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCcuYnNyZS1tb2RlLXJlc3VsdCcpLmZvckVhY2goKGVsKSA9PiB7DQogICAgICAgICAgICBjb25zdCBtb2RlcyA9IChlbC5kYXRhc2V0Lm1vZGVzIHx8ICcnKS5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnYnNyZS1oaWRkZW4nLCAhbW9kZXMuaW5jbHVkZXMobW9kZSkpOw0KICAgICAgICB9KTsNCiAgICAgICAgZWxzLnNlY3Rpb25Db21wYXJpc29uLmNsYXNzTGlzdC50b2dnbGUoJ2JzcmUtaGlkZGVuJywgbW9kZSAhPT0gJ2NvbXBhcmlzb24nKTsNCiAgICAgICAgZWxzLnNlY3Rpb25TZW5zaXRpdml0eS5jbGFzc0xpc3QudG9nZ2xlKCdic3JlLWhpZGRlbicsIG1vZGUgIT09ICdzZW5zaXRpdml0eScpOw0KICAgICAgICBlbHMuY2hhcnRTZWN0aW9uLmNsYXNzTGlzdC50b2dnbGUoJ2JzcmUtaGlkZGVuJywgbW9kZSAhPT0gJ3NlbnNpdGl2aXR5Jyk7DQogICAgICAgIGVscy5jb21wYXJpc29uUmVzdWx0cy5jbGFzc0xpc3QudG9nZ2xlKCdic3JlLWhpZGRlbicsIG1vZGUgIT09ICdjb21wYXJpc29uJyk7DQogICAgICAgIGVscy5jb21wYXJpc29uQmFycy5jbGFzc0xpc3QudG9nZ2xlKCdic3JlLWhpZGRlbicsIG1vZGUgIT09ICdjb21wYXJpc29uJyk7DQogICAgICAgIGhpZGVSZXN1bHRzKCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0RWZmZWN0aXZlUmFkaXVzTU0oKSB7DQogICAgICAgIGlmIChlbHMudXNlVkRpZVJhZGl1cy5jaGVja2VkKSB7DQogICAgICAgICAgICBjb25zdCB2ID0gdG9NTShlbHMudkRpZU9wZW5pbmcudmFsdWUpOw0KICAgICAgICAgICAgY29uc3QgY3YgPSBwYXJzZUZsb2F0KGVscy5jdkZhY3Rvci52YWx1ZSk7DQogICAgICAgICAgICBpZiAodiAmJiBjdiAmJiB2ID4gMCkgcmV0dXJuIGN2ICogdjsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gdG9NTShlbHMuaW5zaWRlUmFkaXVzLnZhbHVlKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjb21wdXRlU3ByaW5nYmFjayhwYXJhbXMpIHsNCiAgICAgICAgY29uc3Qgc3kgPSBwYXJhbXMuc3lNUGE7DQogICAgICAgIGNvbnN0IGVNUGEgPSBwYXJhbXMubW9kdWx1c0dQYSAqIEdQQV9UT19NUEE7DQogICAgICAgIGNvbnN0IHQgPSBwYXJhbXMudGhpY2tuZXNzTU07DQogICAgICAgIGNvbnN0IHIgPSBwYXJhbXMucmFkaXVzTU07DQogICAgICAgIGNvbnN0IHRoZXRhRm9ybSA9IHBhcmFtcy50aGV0YUZvcm07DQogICAgICAgIGNvbnN0IGMgPSBwYXJhbXMuYzsNCiAgICAgICAgY29uc3QgY1Byb2Nlc3MgPSBwYXJhbXMuY1Byb2Nlc3M7DQogICAgICAgIGNvbnN0IGNEaXJlY3Rpb24gPSBwYXJhbXMuY0RpcmVjdGlvbjsNCg0KICAgICAgICBpZiAoIXN5IHx8ICFlTVBhIHx8ICF0IHx8IHQgPD0gMCB8fCByID09PSBudWxsIHx8IHIgPCAwIHx8ICF0aGV0YUZvcm0gfHwgdGhldGFGb3JtIDw9IDApIHsNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgcnQgPSByIC8gdDsNCiAgICAgICAgY29uc3Qgc3lFID0gc3kgLyBlTVBhOw0KICAgICAgICBjb25zdCBpbmRleCA9IHN5RSAqIHJ0Ow0KICAgICAgICBjb25zdCBkZWx0YUJhc2UgPSBjICogc3lFICogcnQgKiB0aGV0YUZvcm07DQogICAgICAgIGNvbnN0IGRlbHRhVGhldGEgPSBkZWx0YUJhc2UgKiBjUHJvY2VzcyAqIGNEaXJlY3Rpb247DQogICAgICAgIGNvbnN0IHJhdGUgPSAoZGVsdGFUaGV0YSAvIHRoZXRhRm9ybSkgKiAxMDA7DQoNCiAgICAgICAgbGV0IGZpbmFsQW5nbGU7DQogICAgICAgIGxldCBvdmVyYmVuZDsNCiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcGFyYW1zLnRhcmdldEFuZ2xlIHx8IHRoZXRhRm9ybTsNCg0KICAgICAgICBpZiAoaXNJbmNsdWRlZEFuZ2xlKCkpIHsNCiAgICAgICAgICAgIGZpbmFsQW5nbGUgPSB0aGV0YUZvcm0gKyBkZWx0YVRoZXRhOw0KICAgICAgICAgICAgb3ZlcmJlbmQgPSB0YXJnZXQgLSBkZWx0YVRoZXRhOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZmluYWxBbmdsZSA9IHRoZXRhRm9ybSAtIGRlbHRhVGhldGE7DQogICAgICAgICAgICBvdmVyYmVuZCA9IHRhcmdldCArIGRlbHRhVGhldGE7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgc3ksIGVNUGEsIHQsIHIsIHJ0LCBzeUUsIGluZGV4LCBkZWx0YVRoZXRhLCByYXRlLCBmaW5hbEFuZ2xlLCBvdmVyYmVuZCwgdGhldGFGb3JtLCBjDQogICAgICAgIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2xhc3NpZnlTcHJpbmdiYWNrKHJhdGUpIHsNCiAgICAgICAgaWYgKHJhdGUgPCAzKSByZXR1cm4geyBsYWJlbDogJ0xvdycsIGNsYXNzOiAnYnNyZS1iYWRnZS1sb3cnIH07DQogICAgICAgIGlmIChyYXRlIDwgOCkgcmV0dXJuIHsgbGFiZWw6ICdNb2RlcmF0ZScsIGNsYXNzOiAnYnNyZS1iYWRnZS1tb2RlcmF0ZScgfTsNCiAgICAgICAgcmV0dXJuIHsgbGFiZWw6ICdIaWdoJywgY2xhc3M6ICdic3JlLWJhZGdlLWhpZ2gnIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdmFsaWRhdGVJbnB1dHMod2FybmluZ3MpIHsNCiAgICAgICAgY29uc3QgZXJyb3JzID0gW107DQogICAgICAgIGNvbnN0IHQgPSB0b01NKGVscy50aGlja25lc3MudmFsdWUpOw0KICAgICAgICBjb25zdCByID0gZ2V0RWZmZWN0aXZlUmFkaXVzTU0oKTsNCiAgICAgICAgY29uc3Qgc3kgPSB0b01QYShlbHMueWllbGRTdHJlbmd0aC52YWx1ZSk7DQogICAgICAgIGNvbnN0IGVHUGEgPSB0b0dQYShlbHMueW91bmdNb2R1bHVzLnZhbHVlKTsNCiAgICAgICAgY29uc3QgYyA9IHBhcnNlRmxvYXQoZWxzLmVtcGlyaWNhbEMudmFsdWUpOw0KICAgICAgICBjb25zdCBjUHJvY2VzcyA9IHBhcnNlRmxvYXQoZWxzLnByb2Nlc3NGYWN0b3IudmFsdWUpOw0KICAgICAgICBjb25zdCBjRGlyID0gcGFyc2VGbG9hdChlbHMuZGlyRmFjdG9yLnZhbHVlKTsNCg0KICAgICAgICBpZiAoIXQgfHwgdCA8PSAwKSBlcnJvcnMucHVzaCgnU2hlZXQgdGhpY2tuZXNzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7DQogICAgICAgIGlmIChyID09PSBudWxsIHx8IHIgPCAwKSBlcnJvcnMucHVzaCgnSW5zaWRlIGJlbmQgcmFkaXVzIGNhbm5vdCBiZSBuZWdhdGl2ZS4nKTsNCiAgICAgICAgaWYgKCFzeSB8fCBzeSA8PSAwKSBlcnJvcnMucHVzaCgnWWllbGQgc3RyZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsNCiAgICAgICAgaWYgKCFlR1BhIHx8IGVHUGEgPD0gMCkgZXJyb3JzLnB1c2goIllvdW5nJ3MgbW9kdWx1cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpOw0KICAgICAgICBpZiAoYyA8PSAwKSBlcnJvcnMucHVzaCgnRW1waXJpY2FsIGNvZWZmaWNpZW50IEMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsNCiAgICAgICAgaWYgKGNQcm9jZXNzIDw9IDApIGVycm9ycy5wdXNoKCdQcm9jZXNzIGNvcnJlY3Rpb24gZmFjdG9yIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7DQogICAgICAgIGlmIChjRGlyIDw9IDApIGVycm9ycy5wdXNoKCdEaXJlY3Rpb24gY29ycmVjdGlvbiBmYWN0b3IgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsNCg0KICAgICAgICBjb25zdCBtb2RlID0gZWxzLmNhbGNNb2RlLnZhbHVlOw0KICAgICAgICBjb25zdCB0aGV0YUZvcm0gPSBwYXJzZUZsb2F0KGVscy5mb3JtaW5nQW5nbGUudmFsdWUpOw0KICAgICAgICBjb25zdCB0YXJnZXQgPSBwYXJzZUZsb2F0KGVscy50YXJnZXRBbmdsZS52YWx1ZSk7DQoNCiAgICAgICAgaWYgKG1vZGUgIT09ICdtZWFzdXJlZCcgJiYgbW9kZSAhPT0gJ2NvbXBhcmlzb24nKSB7DQogICAgICAgICAgICBpZiAoIXRoZXRhRm9ybSB8fCB0aGV0YUZvcm0gPD0gMCB8fCB0aGV0YUZvcm0gPiAxODApIHsNCiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCgnRm9ybWluZyBhbmdsZSBtdXN0IGJlIGJldHdlZW4gMC4xwrAgYW5kIDE4MMKwLicpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChtb2RlID09PSAnb3ZlcmJlbmQnICYmICghdGFyZ2V0IHx8IHRhcmdldCA8PSAwIHx8IHRhcmdldCA+IDE4MCkpIHsNCiAgICAgICAgICAgIGVycm9ycy5wdXNoKCdUYXJnZXQgYW5nbGUgbXVzdCBiZSBiZXR3ZWVuIDAuMcKwIGFuZCAxODDCsC4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICh0ICYmIHIgIT09IG51bGwgJiYgciA+PSAwICYmIHQgPiAwKSB7DQogICAgICAgICAgICBjb25zdCBydCA9IHIgLyB0Ow0KICAgICAgICAgICAgaWYgKHJ0IDwgMC41KSB7DQogICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaCh7IHR5cGU6ICd3YXJuJywgdGV4dDogJ1IvdCBpcyB2ZXJ5IHNtYWxsICgnICsgcnQudG9GaXhlZCgyKSArICcpLiBDcmFja2luZyByaXNrIG1heSBkb21pbmF0ZSBvdmVyIHNwcmluZ2JhY2sgcHJlZGljdGlvbi4nIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHJ0ID4gMjApIHsNCiAgICAgICAgICAgICAgICB3YXJuaW5ncy5wdXNoKHsgdHlwZTogJ3dhcm4nLCB0ZXh0OiAnUi90IGlzIHZlcnkgbGFyZ2UgKCcgKyBydC50b0ZpeGVkKDIpICsgJykuIFNwcmluZ2JhY2sgZXN0aW1hdGlvbiBtYXkgYmUgZXh0cmFwb2xhdGVkIGJleW9uZCB0eXBpY2FsIGNhbGlicmF0ZWQgZGF0YS4nIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGMgPiAzKSB7DQogICAgICAgICAgICB3YXJuaW5ncy5wdXNoKHsgdHlwZTogJ2luZm8nLCB0ZXh0OiAnRW1waXJpY2FsIGNvZWZmaWNpZW50IEMgaXMgdW51c3VhbGx5IGhpZ2guIFZlcmlmeSBjYWxpYnJhdGlvbiB3aXRoIGJlbmQgdGVzdCBkYXRhLicgfSk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gZXJyb3JzOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldEJhc2VQYXJhbXMoKSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICBzeU1QYTogdG9NUGEoZWxzLnlpZWxkU3RyZW5ndGgudmFsdWUpLA0KICAgICAgICAgICAgbW9kdWx1c0dQYTogdG9HUGEoZWxzLnlvdW5nTW9kdWx1cy52YWx1ZSksDQogICAgICAgICAgICB0aGlja25lc3NNTTogdG9NTShlbHMudGhpY2tuZXNzLnZhbHVlKSwNCiAgICAgICAgICAgIHJhZGl1c01NOiBnZXRFZmZlY3RpdmVSYWRpdXNNTSgpLA0KICAgICAgICAgICAgdGhldGFGb3JtOiBwYXJzZUZsb2F0KGVscy5mb3JtaW5nQW5nbGUudmFsdWUpIHx8IDkwLA0KICAgICAgICAgICAgdGFyZ2V0QW5nbGU6IHBhcnNlRmxvYXQoZWxzLnRhcmdldEFuZ2xlLnZhbHVlKSB8fCA5MCwNCiAgICAgICAgICAgIGM6IHBhcnNlRmxvYXQoZWxzLmVtcGlyaWNhbEMudmFsdWUpIHx8IDEuMCwNCiAgICAgICAgICAgIGNQcm9jZXNzOiBwYXJzZUZsb2F0KGVscy5wcm9jZXNzRmFjdG9yLnZhbHVlKSB8fCAxLjAsDQogICAgICAgICAgICBjRGlyZWN0aW9uOiBwYXJzZUZsb2F0KGVscy5kaXJGYWN0b3IudmFsdWUpIHx8IDEuMA0KICAgICAgICB9Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdlbmVyYXRlUmVjb21tZW5kYXRpb25zKHJlc3VsdCwgbW9kZSkgew0KICAgICAgICBjb25zdCByZWNzID0gW107DQogICAgICAgIGNvbnN0IGNscyA9IGNsYXNzaWZ5U3ByaW5nYmFjayhyZXN1bHQucmF0ZSk7DQoNCiAgICAgICAgaWYgKGNscy5sYWJlbCA9PT0gJ0hpZ2gnKSB7DQogICAgICAgICAgICByZWNzLnB1c2goJ1N1YnN0YW50aWFsIG92ZXJiZW5kIG9yIHByb2Nlc3MgYWRqdXN0bWVudCBsaWtlbHkgcmVxdWlyZWQuIENvbnNpZGVyIGluY3JlYXNpbmcgY29tbWFuZGVkIG92ZXJiZW5kIGFuZ2xlLicpOw0KICAgICAgICAgICAgcmVjcy5wdXNoKCdVc2UgYm90dG9taW5nIG9yIGNvaW5pbmcgd2hlbiB0aWdodGVyIGFuZ3VsYXIgY29udHJvbCBpcyByZXF1aXJlZC4nKTsNCiAgICAgICAgfSBlbHNlIGlmIChjbHMubGFiZWwgPT09ICdNb2RlcmF0ZScpIHsNCiAgICAgICAgICAgIHJlY3MucHVzaCgnTm90aWNlYWJsZSBzcHJpbmdiYWNrIGNvcnJlY3Rpb24gbGlrZWx5IHJlcXVpcmVkLiBWZXJpZnkgd2l0aCB0cmlhbCBiZW5kcy4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChyZXN1bHQucnQgPiAzKSB7DQogICAgICAgICAgICByZWNzLnB1c2goJ1JlZHVjZSBpbnNpZGUgcmFkaXVzIHdoZXJlIHByb2Nlc3MgbGltaXRzIGFsbG93IHRvIHJlZHVjZSBzcHJpbmdiYWNrIHRlbmRlbmN5LicpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGVscy5mb3JtaW5nTWV0aG9kLnZhbHVlID09PSAnYWlyQmVuZGluZycpIHsNCiAgICAgICAgICAgIHJlY3MucHVzaCgnQWlyIGJlbmRpbmcgc2hvd3MgaGlnaGVzdCBzcHJpbmdiYWNrIHRlbmRlbmN5LiBCb3R0b20gYmVuZGluZyBvciBjb2luaW5nIG1heSBpbXByb3ZlIGFuZ3VsYXIgY29udHJvbC4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IHN5ID0gcmVzdWx0LnN5Ow0KICAgICAgICBpZiAoc3kgPiA0MDApIHsNCiAgICAgICAgICAgIHJlY3MucHVzaCgnRXhwZWN0IGdyZWF0ZXIgc3ByaW5nYmFjayBmcm9tIGhpZ2gtc3RyZW5ndGggc3RlZWwuIENhbGlicmF0ZSB3aXRoIGFjdHVhbCBiZW5kIHRlc3QgZGF0YS4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJlY3MucHVzaCgnVmVyaWZ5IHRvb2xpbmcgZ2VvbWV0cnkgYW5kIGFjdHVhbCBmb3JtZWQgcmFkaXVzIG9uIHRoZSBwcmVzcyBicmFrZS4nKTsNCiAgICAgICAgcmVjcy5wdXNoKCdDaGVjayByb2xsaW5nIGRpcmVjdGlvbiBhbmQgbWF0ZXJpYWwgYmF0Y2ggdmFyaWF0aW9uLicpOw0KICAgICAgICByZWNzLnB1c2goJ0V4YWN0IGNvbXBlbnNhdGlvbiBhbmdsZSBzaG91bGQgYmUgdmVyaWZpZWQgdGhyb3VnaCB0cmlhbCBiZW5kaW5nLicpOw0KDQogICAgICAgIGlmIChtb2RlID09PSAnbWVhc3VyZWQnKSB7DQogICAgICAgICAgICByZWNzLnB1c2goJ0FwcGx5IHRoZSBjYWxpYnJhdGVkIEMgY29lZmZpY2llbnQgZm9yIHNpbWlsYXIgbWF0ZXJpYWwsIHRvb2xpbmcsIGFuZCBiZW5kaW5nIGNvbmRpdGlvbnMuJyk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gcmVjczsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkaXNwbGF5V2FybmluZ3MoZXJyb3JzLCB3YXJuaW5ncykgew0KICAgICAgICBlbHMud2FybmluZ3MuaW5uZXJIVE1MID0gJyc7DQogICAgICAgIGVycm9ycy5mb3JFYWNoKCh0ZXh0KSA9PiB7DQogICAgICAgICAgICBlbHMud2FybmluZ3MuaW5uZXJIVE1MICs9ICc8ZGl2IGNsYXNzPSJic3JlLXdhcm5pbmcgZXJyb3IiPicgKyB0ZXh0ICsgJzwvZGl2Pic7DQogICAgICAgIH0pOw0KICAgICAgICB3YXJuaW5ncy5mb3JFYWNoKCh3KSA9PiB7DQogICAgICAgICAgICBlbHMud2FybmluZ3MuaW5uZXJIVE1MICs9ICc8ZGl2IGNsYXNzPSJic3JlLXdhcm5pbmcgJyArIHcudHlwZSArICciPicgKyB3LnRleHQgKyAnPC9kaXY+JzsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZGlzcGxheVJlc3VsdHMocmVzdWx0LCBtb2RlKSB7DQogICAgICAgIGNvbnN0IGNscyA9IGNsYXNzaWZ5U3ByaW5nYmFjayhyZXN1bHQucmF0ZSk7DQogICAgICAgIHJlc3VsdEVscy5pbmRleC50ZXh0Q29udGVudCA9IHJlc3VsdC5pbmRleC50b0ZpeGVkKDQpOw0KICAgICAgICByZXN1bHRFbHMuc3ByaW5nYmFja0FuZ2xlLnRleHRDb250ZW50ID0gcmVzdWx0LmRlbHRhVGhldGEudG9GaXhlZCgyKSArICfCsCc7DQogICAgICAgIHJlc3VsdEVscy5zcHJpbmdiYWNrUmF0ZS50ZXh0Q29udGVudCA9IHJlc3VsdC5yYXRlLnRvRml4ZWQoMikgKyAnJSc7DQogICAgICAgIHJlc3VsdEVscy5maW5hbEFuZ2xlLnRleHRDb250ZW50ID0gcmVzdWx0LmZpbmFsQW5nbGUudG9GaXhlZCgyKSArICfCsCc7DQogICAgICAgIHJlc3VsdEVscy5vdmVyYmVuZC50ZXh0Q29udGVudCA9IHJlc3VsdC5vdmVyYmVuZC50b0ZpeGVkKDIpICsgJ8KwJzsNCiAgICAgICAgcmVzdWx0RWxzLnJ0LnRleHRDb250ZW50ID0gcmVzdWx0LnJ0LnRvRml4ZWQoMik7DQogICAgICAgIHJlc3VsdEVscy5jbGFzc2lmaWNhdGlvbi50ZXh0Q29udGVudCA9IGNscy5sYWJlbDsNCiAgICAgICAgcmVzdWx0RWxzLmNsYXNzaWZpY2F0aW9uLmNsYXNzTmFtZSA9ICdic3JlLXJlc3VsdC12YWwgYnNyZS1iYWRnZSAnICsgY2xzLmNsYXNzOw0KDQogICAgICAgIGNvbnN0IGxpbWl0ID0gcGFyc2VGbG9hdChlbHMuc3ByaW5nYmFja0xpbWl0LnZhbHVlKTsNCiAgICAgICAgaWYgKGxpbWl0ICYmIHJlc3VsdC5kZWx0YVRoZXRhID4gbGltaXQpIHsNCiAgICAgICAgICAgIGRpc3BsYXlXYXJuaW5ncyhbXSwgW3sgdHlwZTogJ3dhcm4nLCB0ZXh0OiAnRXN0aW1hdGVkIHNwcmluZ2JhY2sgKCcgKyByZXN1bHQuZGVsdGFUaGV0YS50b0ZpeGVkKDIpICsgJ8KwKSBleGNlZWRzIHlvdXIgcHJhY3RpY2FsIGxpbWl0IG9mICcgKyBsaW1pdCArICfCsC4nIH1dKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IHJlY3MgPSBnZW5lcmF0ZVJlY29tbWVuZGF0aW9ucyhyZXN1bHQsIG1vZGUpOw0KICAgICAgICBlbHMucmVjb21tZW5kYXRpb25zLmlubmVySFRNTCA9ICc8aDM+RW5naW5lZXJpbmcgUmVjb21tZW5kYXRpb25zPC9oMz48dWw+JyArDQogICAgICAgICAgICByZWNzLm1hcCgocikgPT4gJzxsaT4nICsgciArICc8L2xpPicpLmpvaW4oJycpICsgJzwvdWw+JzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjYWxjdWxhdGVNZWFzdXJlZCgpIHsNCiAgICAgICAgY29uc3QgZm9ybWVkID0gcGFyc2VGbG9hdChlbHMuZm9ybWVkQmVmb3JlVW5sb2FkLnZhbHVlKTsNCiAgICAgICAgY29uc3QgZmluYWwgPSBwYXJzZUZsb2F0KGVscy5maW5hbEFmdGVyVW5sb2FkLnZhbHVlKTsNCiAgICAgICAgY29uc3QgcGFyYW1zID0gZ2V0QmFzZVBhcmFtcygpOw0KDQogICAgICAgIGlmICghZm9ybWVkIHx8IGZvcm1lZCA8PSAwKSB7DQogICAgICAgICAgICBkaXNwbGF5V2FybmluZ3MoWydGb3JtZWQgYW5nbGUgYmVmb3JlIHVubG9hZGluZyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiddLCBbXSk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICBjb25zdCBkZWx0YU1lYXN1cmVkID0gTWF0aC5hYnMoZmluYWwgLSBmb3JtZWQpOw0KICAgICAgICBjb25zdCByYXRlID0gKGRlbHRhTWVhc3VyZWQgLyBmb3JtZWQpICogMTAwOw0KDQogICAgICAgIGNvbnN0IHN5ID0gcGFyYW1zLnN5TVBhOw0KICAgICAgICBjb25zdCBlTVBhID0gcGFyYW1zLm1vZHVsdXNHUGEgKiBHUEFfVE9fTVBBOw0KICAgICAgICBjb25zdCB0ID0gcGFyYW1zLnRoaWNrbmVzc01NOw0KICAgICAgICBjb25zdCByID0gcGFyYW1zLnJhZGl1c01NOw0KICAgICAgICBsZXQgY0NhbGlicmF0ZWQgPSBudWxsOw0KDQogICAgICAgIGlmIChzeSAmJiBlTVBhICYmIHQgJiYgciAhPT0gbnVsbCAmJiB0ID4gMCAmJiBmb3JtZWQgPiAwKSB7DQogICAgICAgICAgICBjb25zdCBkZW5vbSA9IChzeSAvIGVNUGEpICogKHIgLyB0KSAqIGZvcm1lZCAqIHBhcmFtcy5jUHJvY2VzcyAqIHBhcmFtcy5jRGlyZWN0aW9uOw0KICAgICAgICAgICAgaWYgKGRlbm9tID4gMCkgY0NhbGlicmF0ZWQgPSBkZWx0YU1lYXN1cmVkIC8gZGVub207DQogICAgICAgIH0NCg0KICAgICAgICBjb25zdCBwcmVkaWN0ZWQgPSBjb21wdXRlU3ByaW5nYmFjayhPYmplY3QuYXNzaWduKHt9LCBwYXJhbXMsIHsgdGhldGFGb3JtOiBmb3JtZWQgfSkpOw0KICAgICAgICBjb25zdCByZXN1bHQgPSBwcmVkaWN0ZWQgfHwgew0KICAgICAgICAgICAgaW5kZXg6IDAsIGRlbHRhVGhldGE6IGRlbHRhTWVhc3VyZWQsIHJhdGUsIGZpbmFsQW5nbGU6IGZpbmFsLA0KICAgICAgICAgICAgb3ZlcmJlbmQ6IGZvcm1lZCwgcnQ6IDAsIHN5OiBzeSB8fCAwDQogICAgICAgIH07DQoNCiAgICAgICAgcmVzdWx0LmRlbHRhVGhldGEgPSBkZWx0YU1lYXN1cmVkOw0KICAgICAgICByZXN1bHQucmF0ZSA9IHJhdGU7DQogICAgICAgIHJlc3VsdC5maW5hbEFuZ2xlID0gZmluYWw7DQoNCiAgICAgICAgZGlzcGxheVJlc3VsdHMocmVzdWx0LCAnbWVhc3VyZWQnKTsNCiAgICAgICAgcmVzdWx0RWxzLm1lYXN1cmVkLnRleHRDb250ZW50ID0gZGVsdGFNZWFzdXJlZC50b0ZpeGVkKDIpICsgJ8KwJzsNCiAgICAgICAgcmVzdWx0RWxzLmNhbGlicmF0ZWRDLnRleHRDb250ZW50ID0gY0NhbGlicmF0ZWQgIT09IG51bGwgPyBjQ2FsaWJyYXRlZC50b0ZpeGVkKDQpIDogJ+KAlCc7DQoNCiAgICAgICAgaWYgKGNDYWxpYnJhdGVkICE9PSBudWxsKSB7DQogICAgICAgICAgICBlbHMucmVjb21tZW5kYXRpb25zLmlubmVySFRNTCArPSAnPHAgY2xhc3M9ImJzcmUtaGludCI+Q2FsaWJyYXRlZCBDID0gJyArIGNDYWxpYnJhdGVkLnRvRml4ZWQoNCkgKw0KICAgICAgICAgICAgICAgICcuIENvcHkgdGhpcyB2YWx1ZSB0byB0aGUgRW1waXJpY2FsIENvZWZmaWNpZW50IGZpZWxkIGZvciBzaW1pbGFyIGNvbmRpdGlvbnMuPC9wPic7DQogICAgICAgIH0NCg0KICAgICAgICBkcmF3QmVuZERpYWdyYW0oZm9ybWVkLCBmaW5hbCwgZGVsdGFNZWFzdXJlZCk7DQogICAgICAgIGlmIChwcmVkaWN0ZWQpIGRyYXdQcmVkaWN0ZWRWc01lYXN1cmVkKHByZWRpY3RlZC5kZWx0YVRoZXRhLCBkZWx0YU1lYXN1cmVkKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjYWxjdWxhdGVDb21wYXJpc29uKCkgew0KICAgICAgICBjb25zdCBjaGVja2VkID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPSJic3JlLWNvbXBhcmVNYXQiXTpjaGVja2VkJyk7DQogICAgICAgIGlmIChjaGVja2VkLmxlbmd0aCA8IDIpIHsNCiAgICAgICAgICAgIGRpc3BsYXlXYXJuaW5ncyhbJ1NlbGVjdCBhdCBsZWFzdCAyIG1hdGVyaWFscyBmb3IgY29tcGFyaXNvbi4nXSwgW10pOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGlmIChjaGVja2VkLmxlbmd0aCA+IDYpIHsNCiAgICAgICAgICAgIGRpc3BsYXlXYXJuaW5ncyhbJ1NlbGVjdCBubyBtb3JlIHRoYW4gNiBtYXRlcmlhbHMgZm9yIGNvbXBhcmlzb24uJ10sIFtdKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IGJhc2VQYXJhbXMgPSBnZXRCYXNlUGFyYW1zKCk7DQogICAgICAgIGNvbnN0IHJvd3MgPSBbXTsNCg0KICAgICAgICBjaGVja2VkLmZvckVhY2goKGNiKSA9PiB7DQogICAgICAgICAgICBjb25zdCBtYXQgPSBnZXRNYXRlcmlhbChjYi52YWx1ZSk7DQogICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBPYmplY3QuYXNzaWduKHt9LCBiYXNlUGFyYW1zLCB7DQogICAgICAgICAgICAgICAgc3lNUGE6IG1hdC55aWVsZE1QYSwNCiAgICAgICAgICAgICAgICBtb2R1bHVzR1BhOiBtYXQubW9kdWx1c0dQYSwNCiAgICAgICAgICAgICAgICBjOiBtYXQuYw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wdXRlU3ByaW5nYmFjayhwYXJhbXMpOw0KICAgICAgICAgICAgaWYgKHJlc3VsdCkgew0KICAgICAgICAgICAgICAgIHJvd3MucHVzaCh7IG1hdCwgcmVzdWx0IH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICByb3dzLnNvcnQoKGEsIGIpID0+IGEucmVzdWx0LmRlbHRhVGhldGEgLSBiLnJlc3VsdC5kZWx0YVRoZXRhKTsNCg0KICAgICAgICBlbHMuY29tcGFyaXNvblRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5JykuaW5uZXJIVE1MID0gcm93cy5tYXAoKHJvdywgaSkgPT4gew0KICAgICAgICAgICAgY29uc3QgciA9IHJvdy5yZXN1bHQ7DQogICAgICAgICAgICBjb25zdCByYW5rQ2xhc3MgPSBpID09PSAwID8gJyBjbGFzcz0iYnNyZS1yYW5rLTEiJyA6ICcnOw0KICAgICAgICAgICAgcmV0dXJuICc8dHInICsgcmFua0NsYXNzICsgJz4nICsNCiAgICAgICAgICAgICAgICAnPHRkPicgKyAoaSArIDEpICsgJzwvdGQ+JyArDQogICAgICAgICAgICAgICAgJzx0ZD4nICsgcm93Lm1hdC5uYW1lICsgJzwvdGQ+JyArDQogICAgICAgICAgICAgICAgJzx0ZD4nICsgZm9ybWF0U3RyZW5ndGgoci5zeSkgKyAnPC90ZD4nICsNCiAgICAgICAgICAgICAgICAnPHRkPicgKyBmb3JtYXRNb2R1bHVzKHIuZU1QYSAvIEdQQV9UT19NUEEpICsgJzwvdGQ+JyArDQogICAgICAgICAgICAgICAgJzx0ZD4nICsgci5zeUUudG9FeHBvbmVudGlhbCgyKSArICc8L3RkPicgKw0KICAgICAgICAgICAgICAgICc8dGQ+JyArIHIucnQudG9GaXhlZCgyKSArICc8L3RkPicgKw0KICAgICAgICAgICAgICAgICc8dGQ+JyArIHIuaW5kZXgudG9GaXhlZCg0KSArICc8L3RkPicgKw0KICAgICAgICAgICAgICAgICc8dGQ+JyArIHIuZGVsdGFUaGV0YS50b0ZpeGVkKDIpICsgJ8KwPC90ZD4nICsNCiAgICAgICAgICAgICAgICAnPHRkPicgKyByLnJhdGUudG9GaXhlZCgyKSArICclPC90ZD4nICsNCiAgICAgICAgICAgICAgICAnPHRkPicgKyByLm92ZXJiZW5kLnRvRml4ZWQoMikgKyAnwrA8L3RkPicgKw0KICAgICAgICAgICAgJzwvdHI+JzsNCiAgICAgICAgfSkuam9pbignJyk7DQoNCiAgICAgICAgY29uc3QgbWF4RGVsdGEgPSBNYXRoLm1heCguLi5yb3dzLm1hcCgocikgPT4gci5yZXN1bHQuZGVsdGFUaGV0YSksIDAuMDEpOw0KICAgICAgICBlbHMuY29tcGFyaXNvbkJhcnMuaW5uZXJIVE1MID0gJzxoMz5TcHJpbmdiYWNrIGJ5IE1hdGVyaWFsPC9oMz4nICsNCiAgICAgICAgICAgIHJvd3MubWFwKChyb3cpID0+IHsNCiAgICAgICAgICAgICAgICBjb25zdCBwY3QgPSAocm93LnJlc3VsdC5kZWx0YVRoZXRhIC8gbWF4RGVsdGEpICogMTAwOw0KICAgICAgICAgICAgICAgIHJldHVybiAnPGRpdiBjbGFzcz0iYnNyZS1iYXItcm93Ij4nICsNCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJic3JlLWJhci1sYWJlbCI+JyArIHJvdy5tYXQubmFtZS5zcGxpdCgnICcpWzBdICsgJzwvc3Bhbj4nICsNCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImJzcmUtYmFyLXRyYWNrIj48ZGl2IGNsYXNzPSJic3JlLWJhci1maWxsIiBzdHlsZT0id2lkdGg6JyArIHBjdCArICclIj48L2Rpdj48L2Rpdj4nICsNCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJic3JlLWJhci12YWx1ZSI+JyArIHJvdy5yZXN1bHQuZGVsdGFUaGV0YS50b0ZpeGVkKDEpICsgJ8KwPC9zcGFuPicgKw0KICAgICAgICAgICAgICAgICc8L2Rpdj4nOw0KICAgICAgICAgICAgfSkuam9pbignJyk7DQoNCiAgICAgICAgaWYgKHJvd3MubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgZGlzcGxheVJlc3VsdHMocm93c1swXS5yZXN1bHQsICdjb21wYXJpc29uJyk7DQogICAgICAgICAgICBkcmF3QmVuZERpYWdyYW0oYmFzZVBhcmFtcy50aGV0YUZvcm0sIHJvd3NbMF0ucmVzdWx0LmZpbmFsQW5nbGUsIHJvd3NbMF0ucmVzdWx0LmRlbHRhVGhldGEpOw0KICAgICAgICB9DQoNCiAgICAgICAgZWxzLnJlY29tbWVuZGF0aW9ucy5pbm5lckhUTUwgPSAnPGgzPkNvbXBhcmlzb24gU3VtbWFyeTwvaDM+PHVsPicgKw0KICAgICAgICAgICAgJzxsaT5Mb3dlc3Qgc3ByaW5nYmFjazogPHN0cm9uZz4nICsgcm93c1swXS5tYXQubmFtZSArICc8L3N0cm9uZz4gKCcgKyByb3dzWzBdLnJlc3VsdC5kZWx0YVRoZXRhLnRvRml4ZWQoMikgKyAnwrApPC9saT4nICsNCiAgICAgICAgICAgICc8bGk+SGlnaGVzdCBzcHJpbmdiYWNrOiA8c3Ryb25nPicgKyByb3dzW3Jvd3MubGVuZ3RoIC0gMV0ubWF0Lm5hbWUgKyAnPC9zdHJvbmc+ICgnICsgcm93c1tyb3dzLmxlbmd0aCAtIDFdLnJlc3VsdC5kZWx0YVRoZXRhLnRvRml4ZWQoMikgKyAnwrApPC9saT4nICsNCiAgICAgICAgICAgICc8bGk+UmFuayBtYXRlcmlhbHMgZnJvbSBsb3dlc3QgdG8gaGlnaGVzdCBzcHJpbmdiYWNrIHRlbmRlbmN5IGFzIHNob3duIGluIHRoZSB0YWJsZS48L2xpPicgKw0KICAgICAgICAgICAgJzwvdWw+JzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjYWxjdWxhdGVTZW5zaXRpdml0eSgpIHsNCiAgICAgICAgY29uc3QgYmFzZVBhcmFtcyA9IGdldEJhc2VQYXJhbXMoKTsNCiAgICAgICAgY29uc3QgcGFyYW0gPSBlbHMuc2Vuc1BhcmFtZXRlci52YWx1ZTsNCiAgICAgICAgY29uc3Qgc3RlcHMgPSBNYXRoLm1pbigzMCwgTWF0aC5tYXgoNSwgcGFyc2VJbnQoZWxzLnNlbnNTdGVwcy52YWx1ZSwgMTApIHx8IDE1KSk7DQogICAgICAgIGNvbnN0IGRhdGFQb2ludHMgPSBbXTsNCg0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ZXBzOyBpKyspIHsNCiAgICAgICAgICAgIGNvbnN0IGZyYWMgPSBpIC8gKHN0ZXBzIC0gMSk7DQogICAgICAgICAgICBjb25zdCBtdWx0ID0gMC4zICsgZnJhYyAqIDEuNDsNCiAgICAgICAgICAgIGNvbnN0IHAgPSBPYmplY3QuYXNzaWduKHt9LCBiYXNlUGFyYW1zKTsNCg0KICAgICAgICAgICAgaWYgKHBhcmFtID09PSAncmFkaXVzJykgcC5yYWRpdXNNTSA9IGJhc2VQYXJhbXMucmFkaXVzTU0gKiBtdWx0Ow0KICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0gPT09ICd5aWVsZCcpIHAuc3lNUGEgPSBiYXNlUGFyYW1zLnN5TVBhICogbXVsdDsNCiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtID09PSAnbW9kdWx1cycpIHAubW9kdWx1c0dQYSA9IGJhc2VQYXJhbXMubW9kdWx1c0dQYSAqIG11bHQ7DQogICAgICAgICAgICBlbHNlIGlmIChwYXJhbSA9PT0gJ3RoaWNrbmVzcycpIHAudGhpY2tuZXNzTU0gPSBiYXNlUGFyYW1zLnRoaWNrbmVzc01NICogbXVsdDsNCiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtID09PSAndkRpZScpIHsNCiAgICAgICAgICAgICAgICBjb25zdCB2ID0gdG9NTShlbHMudkRpZU9wZW5pbmcudmFsdWUpIHx8IGJhc2VQYXJhbXMudGhpY2tuZXNzTU0gKiA4Ow0KICAgICAgICAgICAgICAgIHAucmFkaXVzTU0gPSAocGFyc2VGbG9hdChlbHMuY3ZGYWN0b3IudmFsdWUpIHx8IDAuMTYpICogdiAqIG11bHQ7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXB1dGVTcHJpbmdiYWNrKHApOw0KICAgICAgICAgICAgaWYgKHJlc3VsdCkgew0KICAgICAgICAgICAgICAgIGxldCB4TGFiZWw7DQogICAgICAgICAgICAgICAgaWYgKHBhcmFtID09PSAncmFkaXVzJykgeExhYmVsID0gcmVzdWx0LnJ0Ow0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtID09PSAneWllbGQnKSB4TGFiZWwgPSByZXN1bHQuc3k7DQogICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0gPT09ICdtb2R1bHVzJykgeExhYmVsID0gcmVzdWx0LmVNUGEgLyBHUEFfVE9fTVBBOw0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtID09PSAndGhpY2tuZXNzJykgeExhYmVsID0gcmVzdWx0LnQ7DQogICAgICAgICAgICAgICAgZWxzZSB4TGFiZWwgPSBtdWx0ICogKHRvTU0oZWxzLnZEaWVPcGVuaW5nLnZhbHVlKSB8fCBiYXNlUGFyYW1zLnRoaWNrbmVzc01NICogOCk7DQoNCiAgICAgICAgICAgICAgICBkYXRhUG9pbnRzLnB1c2goeyB4OiB4TGFiZWwsIHk6IHJlc3VsdC5kZWx0YVRoZXRhLCBydDogcmVzdWx0LnJ0IH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgbWlkUmVzdWx0ID0gY29tcHV0ZVNwcmluZ2JhY2soYmFzZVBhcmFtcyk7DQogICAgICAgIGlmIChtaWRSZXN1bHQpIHsNCiAgICAgICAgICAgIGRpc3BsYXlSZXN1bHRzKG1pZFJlc3VsdCwgJ3NlbnNpdGl2aXR5Jyk7DQogICAgICAgICAgICBkcmF3QmVuZERpYWdyYW0oYmFzZVBhcmFtcy50aGV0YUZvcm0sIG1pZFJlc3VsdC5maW5hbEFuZ2xlLCBtaWRSZXN1bHQuZGVsdGFUaGV0YSk7DQogICAgICAgIH0NCg0KICAgICAgICBjb25zdCB0aXRsZXMgPSB7DQogICAgICAgICAgICByYWRpdXM6ICdTcHJpbmdiYWNrIEFuZ2xlIHZzIFIvdCBSYXRpbycsDQogICAgICAgICAgICB5aWVsZDogJ1NwcmluZ2JhY2sgQW5nbGUgdnMgWWllbGQgU3RyZW5ndGgnLA0KICAgICAgICAgICAgbW9kdWx1czogIlNwcmluZ2JhY2sgQW5nbGUgdnMgWW91bmcncyBNb2R1bHVzIiwNCiAgICAgICAgICAgIHRoaWNrbmVzczogJ1NwcmluZ2JhY2sgQW5nbGUgdnMgU2hlZXQgVGhpY2tuZXNzJywNCiAgICAgICAgICAgIHZEaWU6ICdTcHJpbmdiYWNrIEFuZ2xlIHZzIFYtRGllIE9wZW5pbmcnDQogICAgICAgIH07DQogICAgICAgIGVscy5jaGFydFRpdGxlLnRleHRDb250ZW50ID0gdGl0bGVzW3BhcmFtXSB8fCAnU2Vuc2l0aXZpdHkgQ2hhcnQnOw0KICAgICAgICBkcmF3U2Vuc2l0aXZpdHlDaGFydChkYXRhUG9pbnRzLCBwYXJhbSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2FsY3VsYXRlKCkgew0KICAgICAgICBjb25zdCB3YXJuaW5ncyA9IFtdOw0KICAgICAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZUlucHV0cyh3YXJuaW5ncyk7DQogICAgICAgIGRpc3BsYXlXYXJuaW5ncyhlcnJvcnMsIHdhcm5pbmdzKTsNCiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICBlbHMuY2FsY3VsYXRvclJlc3VsdHMuY2xhc3NMaXN0LmFkZCgnYnNyZS1oaWRkZW4nKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIGVscy5jYWxjdWxhdG9yUmVzdWx0cy5jbGFzc0xpc3QucmVtb3ZlKCdic3JlLWhpZGRlbicpOw0KICAgICAgICBjb25zdCBtb2RlID0gZWxzLmNhbGNNb2RlLnZhbHVlOw0KDQogICAgICAgIGlmIChtb2RlID09PSAnbWVhc3VyZWQnKSB7DQogICAgICAgICAgICBjYWxjdWxhdGVNZWFzdXJlZCgpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGlmIChtb2RlID09PSAnY29tcGFyaXNvbicpIHsNCiAgICAgICAgICAgIGNhbGN1bGF0ZUNvbXBhcmlzb24oKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICBpZiAobW9kZSA9PT0gJ3NlbnNpdGl2aXR5Jykgew0KICAgICAgICAgICAgY2FsY3VsYXRlU2Vuc2l0aXZpdHkoKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IHBhcmFtcyA9IGdldEJhc2VQYXJhbXMoKTsNCiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcHV0ZVNwcmluZ2JhY2socGFyYW1zKTsNCiAgICAgICAgaWYgKCFyZXN1bHQpIHsNCiAgICAgICAgICAgIGRpc3BsYXlXYXJuaW5ncyhbJ1VuYWJsZSB0byBjb21wdXRlIHNwcmluZ2JhY2sgd2l0aCBjdXJyZW50IGlucHV0cy4nXSwgW10pOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgZGlzcGxheVJlc3VsdHMocmVzdWx0LCBtb2RlKTsNCiAgICAgICAgZHJhd0JlbmREaWFncmFtKHBhcmFtcy50aGV0YUZvcm0sIHJlc3VsdC5maW5hbEFuZ2xlLCByZXN1bHQuZGVsdGFUaGV0YSwgcmVzdWx0Lm92ZXJiZW5kKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkcmF3QmVuZERpYWdyYW0odGhldGFGb3JtLCB0aGV0YUZpbmFsLCBkZWx0YVRoZXRhLCBvdmVyYmVuZCkgew0KICAgICAgICBjb25zdCBjYW52YXMgPSBlbHMuYmVuZERpYWdyYW07DQogICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICBjb25zdCB3ID0gY2FudmFzLndpZHRoOw0KICAgICAgICBjb25zdCBoID0gY2FudmFzLmhlaWdodDsNCiAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3LCBoKTsNCg0KICAgICAgICBjb25zdCBjeCA9IHcgKiAwLjM1Ow0KICAgICAgICBjb25zdCBjeSA9IGggKiAwLjU1Ow0KICAgICAgICBjb25zdCBhcm1MZW4gPSA5MDsNCiAgICAgICAgY29uc3QgY29udiA9IGlzSW5jbHVkZWRBbmdsZSgpOw0KDQogICAgICAgIGN0eC5maWxsU3R5bGUgPSAnI2Y3ZjlmYic7DQogICAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCB3LCBoKTsNCg0KICAgICAgICBmdW5jdGlvbiBkcmF3QXJtKGFuZ2xlRGVnLCBjb2xvciwgbGFiZWwsIGRhc2hlZCkgew0KICAgICAgICAgICAgY29uc3QgcmFkID0gKGFuZ2xlRGVnICogTWF0aC5QSSkgLyAxODA7DQogICAgICAgICAgICBjb25zdCBleCA9IGN4ICsgYXJtTGVuICogTWF0aC5jb3MocmFkKTsNCiAgICAgICAgICAgIGNvbnN0IGV5ID0gY3kgLSBhcm1MZW4gKiBNYXRoLnNpbihyYWQpOw0KICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpOw0KICAgICAgICAgICAgY3R4Lm1vdmVUbyhjeCwgY3kpOw0KICAgICAgICAgICAgY3R4LmxpbmVUbyhleCwgZXkpOw0KICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gY29sb3I7DQogICAgICAgICAgICBjdHgubGluZVdpZHRoID0gZGFzaGVkID8gMiA6IDM7DQogICAgICAgICAgICBpZiAoZGFzaGVkKSBjdHguc2V0TGluZURhc2goWzYsIDRdKTsNCiAgICAgICAgICAgIGVsc2UgY3R4LnNldExpbmVEYXNoKFtdKTsNCiAgICAgICAgICAgIGN0eC5zdHJva2UoKTsNCiAgICAgICAgICAgIGN0eC5zZXRMaW5lRGFzaChbXSk7DQogICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sb3I7DQogICAgICAgICAgICBjdHguZm9udCA9ICcxMXB4IFNlZ29lIFVJLCBzYW5zLXNlcmlmJzsNCiAgICAgICAgICAgIGN0eC5maWxsVGV4dChsYWJlbCwgZXggKyA1LCBleSk7DQogICAgICAgIH0NCg0KICAgICAgICBkcmF3QXJtKDAsICcjODg4JywgJ0ZsYXQnLCBmYWxzZSk7DQogICAgICAgIGNvbnN0IGZvcm1EaXNwbGF5ID0gY29udiA\/IDE4MCAtIHRoZXRhRm9ybSA6IHRoZXRhRm9ybTsNCiAgICAgICAgY29uc3QgZmluYWxEaXNwbGF5ID0gY29udiA\/IDE4MCAtIHRoZXRhRmluYWwgOiB0aGV0YUZpbmFsOw0KICAgICAgICBkcmF3QXJtKGZvcm1EaXNwbGF5LCAnIzFlNWE4YScsICdGb3JtZWQnLCBmYWxzZSk7DQogICAgICAgIGRyYXdBcm0oZmluYWxEaXNwbGF5LCAnIzJkOGE2ZScsICdGaW5hbCcsIHRydWUpOw0KDQogICAgICAgIGN0eC5iZWdpblBhdGgoKTsNCiAgICAgICAgY3R4LmFyYyhjeCwgY3ksIDMwLCAwLCAoZm9ybURpc3BsYXkgKiBNYXRoLlBJKSAvIDE4MCwgZm9ybURpc3BsYXkgPiAwKTsNCiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gJyNjNDdhMGEnOw0KICAgICAgICBjdHgubGluZVdpZHRoID0gMjsNCiAgICAgICAgY3R4LnN0cm9rZSgpOw0KICAgICAgICBjdHguZmlsbFN0eWxlID0gJyNjNDdhMGEnOw0KICAgICAgICBjdHguZm9udCA9ICdib2xkIDEycHggU2Vnb2UgVUksIHNhbnMtc2VyaWYnOw0KICAgICAgICBjdHguZmlsbFRleHQoJ86Uzrg9JyArIGRlbHRhVGhldGEudG9GaXhlZCgxKSArICfCsCcsIGN4ICsgMzUsIGN5IC0gMTUpOw0KDQogICAgICAgIGN0eC5maWxsU3R5bGUgPSAnIzFhMjMzMic7DQogICAgICAgIGN0eC5mb250ID0gJzEycHggU2Vnb2UgVUksIHNhbnMtc2VyaWYnOw0KICAgICAgICBjdHguZmlsbFRleHQoJ0Zvcm1lZDogJyArIHRoZXRhRm9ybS50b0ZpeGVkKDEpICsgJ8KwJywgdyAqIDAuNTUsIDMwKTsNCiAgICAgICAgY3R4LmZpbGxUZXh0KCdGaW5hbDogJyArIHRoZXRhRmluYWwudG9GaXhlZCgxKSArICfCsCcsIHcgKiAwLjU1LCA1MCk7DQogICAgICAgIGlmIChvdmVyYmVuZCAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICBjdHguZmlsbFRleHQoJ092ZXJiZW5kIHJlcS46ICcgKyBvdmVyYmVuZC50b0ZpeGVkKDEpICsgJ8KwJywgdyAqIDAuNTUsIDcwKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IHRNTSA9IHRvTU0oZWxzLnRoaWNrbmVzcy52YWx1ZSkgfHwgMjsNCiAgICAgICAgY29uc3Qgck1NID0gZ2V0RWZmZWN0aXZlUmFkaXVzTU0oKSB8fCAyOw0KICAgICAgICBjdHguZmlsbFN0eWxlID0gJyM1YTY1NzgnOw0KICAgICAgICBjdHguZm9udCA9ICcxMHB4IFNlZ29lIFVJLCBzYW5zLXNlcmlmJzsNCiAgICAgICAgY3R4LmZpbGxUZXh0KCd0PScgKyBmb3JtYXRMZW5ndGgodE1NKSArICcsIFI9JyArIGZvcm1hdExlbmd0aChyTU0pLCB3ICogMC41NSwgaCAtIDIwKTsNCg0KICAgICAgICBkcmF3UHJlc3NCcmFrZVRvb2xpbmcoY3R4LCBjeCwgY3ksIGFybUxlbiwgZm9ybURpc3BsYXkpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRyYXdQcmVzc0JyYWtlVG9vbGluZyhjdHgsIGN4LCBjeSwgYXJtTGVuLCBhbmdsZSkgew0KICAgICAgICBjb25zdCByYWQgPSAoYW5nbGUgKiBNYXRoLlBJKSAvIDE4MDsNCiAgICAgICAgY29uc3QgcHggPSBjeCArIGFybUxlbiAqIDAuNCAqIE1hdGguY29zKHJhZCk7DQogICAgICAgIGNvbnN0IHB5ID0gY3kgLSBhcm1MZW4gKiAwLjQgKiBNYXRoLnNpbihyYWQpOw0KDQogICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICcjOTk5JzsNCiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDEuNTsNCiAgICAgICAgY3R4LmJlZ2luUGF0aCgpOw0KICAgICAgICBjdHgubW92ZVRvKHB4IC0gMTUsIHB5ICsgMjUpOw0KICAgICAgICBjdHgubGluZVRvKHB4ICsgMTUsIHB5ICsgMjUpOw0KICAgICAgICBjdHgubGluZVRvKHB4LCBweSAtIDUpOw0KICAgICAgICBjdHguY2xvc2VQYXRoKCk7DQogICAgICAgIGN0eC5zdHJva2UoKTsNCg0KICAgICAgICBjdHguYmVnaW5QYXRoKCk7DQogICAgICAgIGN0eC5tb3ZlVG8oY3ggLSA0MCwgY3kgKyAzMCk7DQogICAgICAgIGN0eC5saW5lVG8oY3ggKyA0MCwgY3kgKyAzMCk7DQogICAgICAgIGN0eC5zdHJva2UoKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkcmF3U2Vuc2l0aXZpdHlDaGFydChkYXRhUG9pbnRzLCBwYXJhbSkgew0KICAgICAgICBjb25zdCBjYW52YXMgPSBlbHMuc2Vuc2l0aXZpdHlDaGFydDsNCiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7DQogICAgICAgIGNvbnN0IHcgPSBjYW52YXMud2lkdGg7DQogICAgICAgIGNvbnN0IGggPSBjYW52YXMuaGVpZ2h0Ow0KICAgICAgICBjb25zdCBwYWQgPSB7IHRvcDogMjUsIHJpZ2h0OiAyNSwgYm90dG9tOiA0NSwgbGVmdDogNTUgfTsNCiAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3LCBoKTsNCg0KICAgICAgICBpZiAoZGF0YVBvaW50cy5sZW5ndGggPCAyKSByZXR1cm47DQoNCiAgICAgICAgY29uc3QgeHMgPSBkYXRhUG9pbnRzLm1hcCgoZCkgPT4gZC54KTsNCiAgICAgICAgY29uc3QgeXMgPSBkYXRhUG9pbnRzLm1hcCgoZCkgPT4gZC55KTsNCiAgICAgICAgY29uc3QgeE1pbiA9IE1hdGgubWluKC4uLnhzKTsNCiAgICAgICAgY29uc3QgeE1heCA9IE1hdGgubWF4KC4uLnhzKTsNCiAgICAgICAgY29uc3QgeU1pbiA9IDA7DQogICAgICAgIGNvbnN0IHlNYXggPSBNYXRoLm1heCguLi55cykgKiAxLjE1Ow0KDQogICAgICAgIGZ1bmN0aW9uIG1hcFgoeCkgew0KICAgICAgICAgICAgcmV0dXJuIHBhZC5sZWZ0ICsgKCh4IC0geE1pbikgLyAoeE1heCAtIHhNaW4gfHwgMSkpICogKHcgLSBwYWQubGVmdCAtIHBhZC5yaWdodCk7DQogICAgICAgIH0NCiAgICAgICAgZnVuY3Rpb24gbWFwWSh5KSB7DQogICAgICAgICAgICByZXR1cm4gaCAtIHBhZC5ib3R0b20gLSAoeSAvICh5TWF4IHx8IDEpKSAqIChoIC0gcGFkLnRvcCAtIHBhZC5ib3R0b20pOw0KICAgICAgICB9DQoNCiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjZmZmJzsNCiAgICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIHcsIGgpOw0KDQogICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICcjZGRlM2VhJzsNCiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDE7DQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDU7IGkrKykgew0KICAgICAgICAgICAgY29uc3QgeSA9IHlNaW4gKyAoaSAvIDUpICogeU1heDsNCiAgICAgICAgICAgIGNvbnN0IHB5ID0gbWFwWSh5KTsNCiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTsNCiAgICAgICAgICAgIGN0eC5tb3ZlVG8ocGFkLmxlZnQsIHB5KTsNCiAgICAgICAgICAgIGN0eC5saW5lVG8odyAtIHBhZC5yaWdodCwgcHkpOw0KICAgICAgICAgICAgY3R4LnN0cm9rZSgpOw0KICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjNWE2NTc4JzsNCiAgICAgICAgICAgIGN0eC5mb250ID0gJzEwcHggU2Vnb2UgVUksIHNhbnMtc2VyaWYnOw0KICAgICAgICAgICAgY3R4LnRleHRBbGlnbiA9ICdyaWdodCc7DQogICAgICAgICAgICBjdHguZmlsbFRleHQoeS50b0ZpeGVkKDEpLCBwYWQubGVmdCAtIDUsIHB5ICsgMyk7DQogICAgICAgIH0NCg0KICAgICAgICBjdHguYmVnaW5QYXRoKCk7DQogICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICcjMWU1YThhJzsNCiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDI7DQogICAgICAgIGRhdGFQb2ludHMuZm9yRWFjaCgoZCwgaSkgPT4gew0KICAgICAgICAgICAgY29uc3QgcHggPSBtYXBYKGQueCk7DQogICAgICAgICAgICBjb25zdCBweSA9IG1hcFkoZC55KTsNCiAgICAgICAgICAgIGlmIChpID09PSAwKSBjdHgubW92ZVRvKHB4LCBweSk7DQogICAgICAgICAgICBlbHNlIGN0eC5saW5lVG8ocHgsIHB5KTsNCiAgICAgICAgfSk7DQogICAgICAgIGN0eC5zdHJva2UoKTsNCg0KICAgICAgICBkYXRhUG9pbnRzLmZvckVhY2goKGQpID0+IHsNCiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTsNCiAgICAgICAgICAgIGN0eC5hcmMobWFwWChkLngpLCBtYXBZKGQueSksIDMsIDAsIE1hdGguUEkgKiAyKTsNCiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSAnIzFlNWE4YSc7DQogICAgICAgICAgICBjdHguZmlsbCgpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBjb25zdCB4TGFiZWxzID0geyByYWRpdXM6ICdSL3QnLCB5aWVsZDogJ1N5IChNUGEpJywgbW9kdWx1czogJ0UgKEdQYSknLCB0aGlja25lc3M6ICd0IChtbSknLCB2RGllOiAnViAobW0pJyB9Ow0KICAgICAgICBjdHguZmlsbFN0eWxlID0gJyMxYTIzMzInOw0KICAgICAgICBjdHguZm9udCA9ICcxMXB4IFNlZ29lIFVJLCBzYW5zLXNlcmlmJzsNCiAgICAgICAgY3R4LnRleHRBbGlnbiA9ICdjZW50ZXInOw0KICAgICAgICBjdHguZmlsbFRleHQoeExhYmVsc1twYXJhbV0gfHwgJ1BhcmFtZXRlcicsIHcgLyAyLCBoIC0gOCk7DQogICAgICAgIGN0eC5zYXZlKCk7DQogICAgICAgIGN0eC50cmFuc2xhdGUoMTIsIGggLyAyKTsNCiAgICAgICAgY3R4LnJvdGF0ZSgtTWF0aC5QSSAvIDIpOw0KICAgICAgICBjdHguZmlsbFRleHQoJ1NwcmluZ2JhY2sgzpTOuCAowrApJywgMCwgMCk7DQogICAgICAgIGN0eC5yZXN0b3JlKCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZHJhd1ByZWRpY3RlZFZzTWVhc3VyZWQocHJlZGljdGVkLCBtZWFzdXJlZCkgew0KICAgICAgICBlbHMuY2hhcnRTZWN0aW9uLmNsYXNzTGlzdC5yZW1vdmUoJ2JzcmUtaGlkZGVuJyk7DQogICAgICAgIGVscy5jaGFydFRpdGxlLnRleHRDb250ZW50ID0gJ1ByZWRpY3RlZCB2cyBNZWFzdXJlZCBTcHJpbmdiYWNrJzsNCiAgICAgICAgY29uc3QgY2FudmFzID0gZWxzLnNlbnNpdGl2aXR5Q2hhcnQ7DQogICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpOw0KICAgICAgICBjb25zdCB3ID0gY2FudmFzLndpZHRoOw0KICAgICAgICBjb25zdCBoID0gY2FudmFzLmhlaWdodDsNCiAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3LCBoKTsNCg0KICAgICAgICBjb25zdCBtYXhWYWwgPSBNYXRoLm1heChwcmVkaWN0ZWQsIG1lYXN1cmVkLCAxKSAqIDEuMzsNCiAgICAgICAgY29uc3QgYmFyVyA9IDgwOw0KICAgICAgICBjb25zdCBiYXNlWSA9IGggLSA2MDsNCg0KICAgICAgICBjdHguZmlsbFN0eWxlID0gJyNmZmYnOw0KICAgICAgICBjdHguZmlsbFJlY3QoMCwgMCwgdywgaCk7DQoNCiAgICAgICAgW3sgbGFiZWw6ICdQcmVkaWN0ZWQnLCB2YWw6IHByZWRpY3RlZCwgY29sb3I6ICcjMWU1YThhJywgeDogdyAqIDAuMyB9LA0KICAgICAgICAgeyBsYWJlbDogJ01lYXN1cmVkJywgdmFsOiBtZWFzdXJlZCwgY29sb3I6ICcjMmQ4YTZlJywgeDogdyAqIDAuNiB9XS5mb3JFYWNoKChiYXIpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IGJhckggPSAoYmFyLnZhbCAvIG1heFZhbCkgKiAoaCAtIDEwMCk7DQogICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gYmFyLmNvbG9yOw0KICAgICAgICAgICAgY3R4LmZpbGxSZWN0KGJhci54IC0gYmFyVyAvIDIsIGJhc2VZIC0gYmFySCwgYmFyVywgYmFySCk7DQogICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gJyMxYTIzMzInOw0KICAgICAgICAgICAgY3R4LmZvbnQgPSAnMTJweCBTZWdvZSBVSSwgc2Fucy1zZXJpZic7DQogICAgICAgICAgICBjdHgudGV4dEFsaWduID0gJ2NlbnRlcic7DQogICAgICAgICAgICBjdHguZmlsbFRleHQoYmFyLmxhYmVsLCBiYXIueCwgYmFzZVkgKyAyMCk7DQogICAgICAgICAgICBjdHguZmlsbFRleHQoYmFyLnZhbC50b0ZpeGVkKDIpICsgJ8KwJywgYmFyLngsIGJhc2VZIC0gYmFySCAtIDgpOw0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBvbk1hdGVyaWFsQ2hhbmdlKCkgew0KICAgICAgICBjb25zdCBtYXQgPSBnZXRNYXRlcmlhbChlbHMubWF0ZXJpYWxUeXBlLnZhbHVlKTsNCiAgICAgICAgYXBwbHlNYXRlcmlhbFByZXNldChtYXQpOw0KICAgICAgICBlbHMuY3ZGYWN0b3IudmFsdWUgPSBtYXQuY3Y7DQoNCiAgICAgICAgY29uc3QgZGlyID0gZWxzLnJvbGxpbmdEaXJlY3Rpb24udmFsdWU7DQogICAgICAgIGlmIChkaXIgPT09ICdwYXJhbGxlbCcpIHsNCiAgICAgICAgICAgIGVscy5kaXJGYWN0b3IudmFsdWUgPSBtYXQucGFyYWxsZWxHcmFpbi50b0ZpeGVkKDIpOw0KICAgICAgICB9IGVsc2UgaWYgKGRpciA9PT0gJ3BlcnBlbmRpY3VsYXInKSB7DQogICAgICAgICAgICBlbHMuZGlyRmFjdG9yLnZhbHVlID0gRElSRUNUSU9OX0RFRkFVTFRTLnBlcnBlbmRpY3VsYXIudG9GaXhlZCgyKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGVscy5kaXJGYWN0b3IudmFsdWUgPSBESVJFQ1RJT05fREVGQVVMVFMudW5rbm93bi50b0ZpeGVkKDIpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gb25Gb3JtaW5nTWV0aG9kQ2hhbmdlKCkgew0KICAgICAgICBjb25zdCBrZXkgPSBlbHMuZm9ybWluZ01ldGhvZC52YWx1ZTsNCiAgICAgICAgaWYgKHByb2Nlc3NGYWN0b3JzW2tleV0gIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgZWxzLnByb2Nlc3NGYWN0b3IudmFsdWUgPSBwcm9jZXNzRmFjdG9yc1trZXldLnRvRml4ZWQoMik7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBvblJvbGxpbmdEaXJlY3Rpb25DaGFuZ2UoKSB7DQogICAgICAgIGNvbnN0IGRpciA9IGVscy5yb2xsaW5nRGlyZWN0aW9uLnZhbHVlOw0KICAgICAgICBjb25zdCBtYXQgPSBnZXRNYXRlcmlhbChlbHMubWF0ZXJpYWxUeXBlLnZhbHVlKTsNCiAgICAgICAgaWYgKGRpciA9PT0gJ3BhcmFsbGVsJykgew0KICAgICAgICAgICAgZWxzLmRpckZhY3Rvci52YWx1ZSA9IG1hdC5wYXJhbGxlbEdyYWluLnRvRml4ZWQoMik7DQogICAgICAgIH0gZWxzZSBpZiAoZGlyID09PSAncGVycGVuZGljdWxhcicpIHsNCiAgICAgICAgICAgIGVscy5kaXJGYWN0b3IudmFsdWUgPSBESVJFQ1RJT05fREVGQVVMVFMucGVycGVuZGljdWxhci50b0ZpeGVkKDIpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZWxzLmRpckZhY3Rvci52YWx1ZSA9IERJUkVDVElPTl9ERUZBVUxUUy51bmtub3duLnRvRml4ZWQoMik7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBpbml0KCkgew0KICAgICAgICBwb3B1bGF0ZU1hdGVyaWFsU2VsZWN0KCcnKTsNCiAgICAgICAgcG9wdWxhdGVDb21wYXJpc29uQ2hlY2tib3hlcygpOw0KICAgICAgICBlbHMubWF0ZXJpYWxUeXBlLnZhbHVlID0gJ2xvd0NhcmJvblN0ZWVsJzsNCiAgICAgICAgYXBwbHlNYXRlcmlhbFByZXNldChnZXRNYXRlcmlhbCgnbG93Q2FyYm9uU3RlZWwnKSk7DQogICAgICAgIGVscy5wcm9jZXNzRmFjdG9yLnZhbHVlID0gcHJvY2Vzc0ZhY3RvcnMuYWlyQmVuZGluZy50b0ZpeGVkKDIpOw0KICAgICAgICB1cGRhdGVVbml0TGFiZWxzKCk7DQogICAgICAgIHVwZGF0ZU1vZGVWaXNpYmlsaXR5KCk7DQogICAgICAgIHVwZGF0ZUNvbXB1dGVkUmF0aW9zKCk7DQoNCiAgICAgICAgZWxzLm1hdGVyaWFsU2VhcmNoLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4gew0KICAgICAgICAgICAgcG9wdWxhdGVNYXRlcmlhbFNlbGVjdChlbHMubWF0ZXJpYWxTZWFyY2gudmFsdWUpOw0KICAgICAgICAgICAgaGlkZVJlc3VsdHMoKTsNCiAgICAgICAgfSk7DQogICAgICAgIGVscy5tYXRlcmlhbFR5cGUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gew0KICAgICAgICAgICAgb25NYXRlcmlhbENoYW5nZSgpOw0KICAgICAgICAgICAgaGlkZVJlc3VsdHMoKTsNCiAgICAgICAgfSk7DQogICAgICAgIGVscy51bml0U3lzdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsNCiAgICAgICAgICAgIHVwZGF0ZVVuaXRMYWJlbHMoKTsNCiAgICAgICAgICAgIGNvbnZlcnRJbnB1dFZhbHVlc09uVW5pdENoYW5nZSgpOw0KICAgICAgICAgICAgdXBkYXRlQ29tcHV0ZWRSYXRpb3MoKTsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRzKCk7DQogICAgICAgIH0pOw0KICAgICAgICBlbHMuYW5nbGVDb252ZW50aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGhpZGVSZXN1bHRzKTsNCiAgICAgICAgZWxzLmNhbGNNb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHVwZGF0ZU1vZGVWaXNpYmlsaXR5KTsNCiAgICAgICAgZWxzLmZvcm1pbmdNZXRob2QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gew0KICAgICAgICAgICAgb25Gb3JtaW5nTWV0aG9kQ2hhbmdlKCk7DQogICAgICAgICAgICBoaWRlUmVzdWx0cygpOw0KICAgICAgICB9KTsNCiAgICAgICAgZWxzLnJvbGxpbmdEaXJlY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gew0KICAgICAgICAgICAgb25Sb2xsaW5nRGlyZWN0aW9uQ2hhbmdlKCk7DQogICAgICAgICAgICBoaWRlUmVzdWx0cygpOw0KICAgICAgICB9KTsNCg0KICAgICAgICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QnKS5mb3JFYWNoKChlbCkgPT4gew0KICAgICAgICAgICAgaWYgKGVsLmlkID09PSAnYnNyZS1tYXRlcmlhbFNlYXJjaCcpIHJldHVybjsNCiAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGhpZGVSZXN1bHRzKTsNCiAgICAgICAgICAgIGlmIChlbC50eXBlID09PSAnbnVtYmVyJyB8fCBlbC50eXBlID09PSAndGV4dCcgfHwgZWwudHlwZSA9PT0gJ3NlYXJjaCcpIHsNCiAgICAgICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGhpZGVSZXN1bHRzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQoNCiAgICAgICAgWydic3JlLXlpZWxkU3RyZW5ndGgnLCAnYnNyZS15b3VuZ01vZHVsdXMnLCAnYnNyZS10aGlja25lc3MnLCAnYnNyZS1pbnNpZGVSYWRpdXMnLA0KICAgICAgICAgJ2JzcmUtdkRpZU9wZW5pbmcnLCAnYnNyZS1jdkZhY3RvciddLmZvckVhY2goKGlkKSA9PiB7DQogICAgICAgICAgICAkKGlkKS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIHVwZGF0ZUNvbXB1dGVkUmF0aW9zKTsNCiAgICAgICAgfSk7DQogICAgICAgIGVscy51c2VWRGllUmFkaXVzLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHVwZGF0ZUNvbXB1dGVkUmF0aW9zKTsNCg0KICAgICAgICBlbHMudG9nZ2xlVG9vbGluZy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IGV4cGFuZGVkID0gZWxzLnRvb2xpbmdQYW5lbC5jbGFzc0xpc3QudG9nZ2xlKCdic3JlLWV4cGFuZGVkJyk7DQogICAgICAgICAgICBlbHMudG9nZ2xlVG9vbGluZy50ZXh0Q29udGVudCA9IGV4cGFuZGVkID8gJ0hpZGUnIDogJ1Nob3cnOw0KICAgICAgICAgICAgZWxzLnRvZ2dsZVRvb2xpbmcuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgZXhwYW5kZWQpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBlbHMuYnRuQ2FsY3VsYXRlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2FsY3VsYXRlKTsNCiAgICB9DQoNCiAgICBpbml0KCk7DQp9KSgpOw0K\"><\/script>\n","protected":false},"excerpt":{"rendered":"<p>The Bending Springback Rate Estimator Calculator is a practical engineering tool designed to estimate springback after sheet metal bending based on material properties, thickness, inside&#8230;<\/p>","protected":false},"author":2,"featured_media":24827,"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":[8647],"tags":[8691,8692,287,8690],"class_list":["post-24825","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-materials-science-and-properties","tag-bend-compensation","tag-bending-springback","tag-press-brake","tag-springback-rate","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/09\/Bending-Springback-Rate-Estimator-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/posts\/24825","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/comments?post=24825"}],"version-history":[{"count":0,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/posts\/24825\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/media\/24827"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/media?parent=24825"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/categories?post=24825"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/ar\/wp-json\/wp\/v2\/tags?post=24825"}],"curies":[{"name":"\u0648\u0648\u0631\u062f\u0628\u0631\u064a\u0633","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}