{"id":24849,"date":"2026-09-08T03:22:11","date_gmt":"2026-09-08T03:22:11","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24849"},"modified":"2026-09-08T03:22:14","modified_gmt":"2026-09-08T03:22:14","slug":"cold-work-strengthening-coefficient-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/pt\/cold-work-strengthening-coefficient-calculator\/","title":{"rendered":"Cold Work Strengthening Coefficient Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Cold Work Strengthening Coefficient Calculator<\/strong> is a practical engineering tool designed to evaluate how plastic deformation during cold working affects material strength. It helps engineers calculate cold work percentage, true plastic strain, strength increase, strength gain, and strengthening coefficients using initial and final material properties. The Cold Work Strengthening Coefficient Calculator is useful for cold rolling, wire drawing, stamping, cold forging, sheet metal forming, material comparison, and manufacturing process optimization.<\/p>\n\n\n\n<!-- WordPress \u81ea\u5b9a\u4e49 HTML \u533a\u5757\uff1a\u590d\u5236\u4e0b\u65b9\u5168\u90e8\u5185\u5bb9 -->\n<!-- \u8bf7\u52ff\u5305\u88f9 DOCTYPE\/html\/head\/body\uff0c\u8bf7\u4f7f\u7528\u4ee3\u7801\u7f16\u8f91\u5668\u6a21\u5f0f\u7c98\u8d34 -->\n<!-- \u6837\u5f0f\u4e0e\u811a\u672c\u5747\u9650\u5b9a\u5728 #cwsc-calculator \u5185\uff0c\u4e0d\u4f1a\u5f71\u54cd\u4e3b\u9898\u9875\u7709\u3001\u9875\u811a\u3001\u83dc\u5355\u3001\u4fa7\u8fb9\u680f\u53ca\u5176\u4ed6\u9875\u9762\u5185\u5bb9 -->\n<style>\n\/* Cold Work Strengthening Coefficient Calculator \u2014 WordPress-safe scoped styles\n * Every rule is scoped under #cwsc-calculator.cwsc-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 #cwsc-calculator.cwsc-calculator,\n.wp-block-html #cwsc-calculator.cwsc-calculator,\n.wp-block-group__inner-container #cwsc-calculator.cwsc-calculator,\n.elementor-widget-container #cwsc-calculator.cwsc-calculator,\n.et_pb_module #cwsc-calculator.cwsc-calculator,\n.fl-module-content #cwsc-calculator.cwsc-calculator,\n.site-content #cwsc-calculator.cwsc-calculator,\narticle #cwsc-calculator.cwsc-calculator,\n#cwsc-calculator.cwsc-calculator,\n.entry-content #cwsc-calculator.cwsc-calculator *,\n.wp-block-html #cwsc-calculator.cwsc-calculator *,\n.wp-block-group__inner-container #cwsc-calculator.cwsc-calculator *,\n.elementor-widget-container #cwsc-calculator.cwsc-calculator *,\n.et_pb_module #cwsc-calculator.cwsc-calculator *,\n.fl-module-content #cwsc-calculator.cwsc-calculator *,\n.site-content #cwsc-calculator.cwsc-calculator *,\narticle #cwsc-calculator.cwsc-calculator *,\n#cwsc-calculator.cwsc-calculator *,\n.entry-content #cwsc-calculator.cwsc-calculator *::before,\n.wp-block-html #cwsc-calculator.cwsc-calculator *::before,\n#cwsc-calculator.cwsc-calculator *::before,\n.entry-content #cwsc-calculator.cwsc-calculator *::after,\n.wp-block-html #cwsc-calculator.cwsc-calculator *::after,\n#cwsc-calculator.cwsc-calculator *::after {\n    box-sizing: border-box !important;\n}\n\n.entry-content #cwsc-calculator.cwsc-calculator,\n.wp-block-html #cwsc-calculator.cwsc-calculator,\n.wp-block-group__inner-container #cwsc-calculator.cwsc-calculator,\n.elementor-widget-container #cwsc-calculator.cwsc-calculator,\n.et_pb_module #cwsc-calculator.cwsc-calculator,\n.fl-module-content #cwsc-calculator.cwsc-calculator,\n.site-content #cwsc-calculator.cwsc-calculator,\narticle #cwsc-calculator.cwsc-calculator,\n#cwsc-calculator.cwsc-calculator {\n    all: revert;\n    --cwsc-primary: #1a5276;\n    --cwsc-primary-light: #2471a3;\n    --cwsc-primary-dark: #0e3352;\n    --cwsc-accent: #e67e22;\n    --cwsc-danger: #c0392b;\n    --cwsc-success: #27ae60;\n    --cwsc-neutral: #7f8c8d;\n    --cwsc-bg: #ecf0f1;\n    --cwsc-card-bg: #ffffff;\n    --cwsc-border: #d5dbdb;\n    --cwsc-text: #2c3e50;\n    --cwsc-text-muted: #5d6d7e;\n    --cwsc-shadow: 0 2px 12px rgba(26, 82, 118, 0.08);\n    --cwsc-radius: 8px;\n    --cwsc-font: 'Segoe UI', system-ui, -apple-system, BlinkMacSystemFont, sans-serif;\n    --cwsc-mono: 'Consolas', 'Courier New', monospace;\n\n    box-sizing: border-box !important;\n    display: block !important;\n    max-width: 1000px !important;\n    width: 100% !important;\n    margin: 0 auto !important;\n    padding: 1.5rem 1rem !important;\n    font-family: var(--cwsc-font) !important;\n    color: var(--cwsc-text) !important;\n    line-height: 1.6 !important;\n    font-size: 16px !important;\n    text-align: left !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    box-shadow: none !important;\n    overflow: visible !important;\n}\n\n#cwsc-calculator.cwsc-calculator form,\n#cwsc-calculator.cwsc-calculator fieldset,\n#cwsc-calculator.cwsc-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#cwsc-calculator.cwsc-calculator [hidden] {\n    display: none !important;\n}\n\n#cwsc-calculator.cwsc-calculator h1,\n#cwsc-calculator.cwsc-calculator h2,\n#cwsc-calculator.cwsc-calculator h3,\n#cwsc-calculator.cwsc-calculator h4,\n#cwsc-calculator.cwsc-calculator p,\n#cwsc-calculator.cwsc-calculator ul,\n#cwsc-calculator.cwsc-calculator ol,\n#cwsc-calculator.cwsc-calculator li,\n#cwsc-calculator.cwsc-calculator section,\n#cwsc-calculator.cwsc-calculator div,\n#cwsc-calculator.cwsc-calculator span,\n#cwsc-calculator.cwsc-calculator strong,\n#cwsc-calculator.cwsc-calculator em,\n#cwsc-calculator.cwsc-calculator sub,\n#cwsc-calculator.cwsc-calculator sup {\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#cwsc-calculator.cwsc-calculator button,\n#cwsc-calculator.cwsc-calculator input,\n#cwsc-calculator.cwsc-calculator select,\n#cwsc-calculator.cwsc-calculator label,\n#cwsc-calculator.cwsc-calculator legend {\n    font: inherit !important;\n    font-family: var(--cwsc-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#cwsc-calculator.cwsc-calculator ul,\n#cwsc-calculator.cwsc-calculator ol {\n    list-style: none !important;\n    padding: 0 !important;\n    margin: 0 !important;\n}\n\n#cwsc-calculator.cwsc-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#cwsc-calculator.cwsc-calculator input[type=\"number\"],\n#cwsc-calculator.cwsc-calculator input[type=\"text\"],\n#cwsc-calculator.cwsc-calculator select {\n    display: block !important;\n    width: 100% !important;\n    max-width: 100% !important;\n    padding: 0.55rem 0.75rem !important;\n    border: 1px solid var(--cwsc-border) !important;\n    border-radius: 6px !important;\n    font-size: 0.95rem !important;\n    font-family: var(--cwsc-font) !important;\n    background: #ffffff !important;\n    color: var(--cwsc-text) !important;\n    min-height: 38px !important;\n    outline: none !important;\n    box-shadow: none !important;\n    margin: 0 !important;\n}\n\n#cwsc-calculator.cwsc-calculator input[type=\"number\"]:focus,\n#cwsc-calculator.cwsc-calculator input[type=\"text\"]:focus,\n#cwsc-calculator.cwsc-calculator select:focus {\n    border-color: var(--cwsc-primary-light) !important;\n    box-shadow: 0 0 0 2px rgba(36, 113, 163, 0.15) !important;\n}\n\n#cwsc-calculator.cwsc-calculator svg {\n    display: block !important;\n    max-width: 100% !important;\n    height: auto !important;\n    overflow: visible !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-card {\n    background: var(--cwsc-card-bg) !important;\n    border: 1px solid var(--cwsc-border) !important;\n    border-radius: var(--cwsc-radius) !important;\n    padding: 1.25rem !important;\n    box-shadow: var(--cwsc-shadow) !important;\n    margin-bottom: 1.25rem !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-panel-header {\n    display: flex !important;\n    flex-wrap: wrap !important;\n    align-items: center !important;\n    justify-content: flex-end !important;\n    gap: 0.75rem !important;\n    margin-bottom: 1rem !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-unit-toggle {\n    display: flex !important;\n    border: 1px solid var(--cwsc-border) !important;\n    border-radius: 6px !important;\n    overflow: hidden !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-unit-btn {\n    padding: 0.4rem 0.85rem !important;\n    font-size: 0.85rem !important;\n    font-weight: 600 !important;\n    background: #fff !important;\n    color: var(--cwsc-text-muted) !important;\n    border-right: 1px solid var(--cwsc-border) !important;\n    transition: background 0.15s, color 0.15s !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-unit-btn:last-child {\n    border-right: none !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-unit-btn.cwsc-active {\n    background: var(--cwsc-primary) !important;\n    color: #fff !important;\n}\n\n#cwsc-calculator.cwsc-calculator fieldset {\n    border: 1px solid var(--cwsc-border) !important;\n    border-radius: var(--cwsc-radius) !important;\n    padding: 1rem !important;\n    margin: 0 0 1rem 0 !important;\n    background: #fafbfc !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-form-row {\n    display: grid !important;\n    grid-template-columns: 1fr !important;\n    gap: 0.75rem !important;\n    margin-bottom: 0.75rem !important;\n}\n\n@media (min-width: 540px) {\n    #cwsc-calculator.cwsc-calculator .cwsc-form-row {\n        grid-template-columns: 1fr 1fr !important;\n    }\n}\n\n@media (min-width: 768px) {\n    #cwsc-calculator.cwsc-calculator .cwsc-form-row.cwsc-form-row-3 {\n        grid-template-columns: 1fr 1fr 1fr !important;\n    }\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-form-group label {\n    display: block !important;\n    font-size: 0.85rem !important;\n    font-weight: 600 !important;\n    color: var(--cwsc-text) !important;\n    margin-bottom: 0.35rem !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-input-with-unit {\n    display: flex !important;\n    gap: 0 !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-input-with-unit input {\n    flex: 1 !important;\n    border-radius: 6px 0 0 6px !important;\n    border-right: none !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-inline-unit,\n#cwsc-calculator.cwsc-calculator .cwsc-unit-label {\n    min-width: 58px !important;\n    width: auto !important;\n    flex-shrink: 0 !important;\n    padding: 0.55rem 0.5rem !important;\n    font-size: 0.82rem !important;\n    border: 1px solid var(--cwsc-border) !important;\n    border-radius: 0 6px 6px 0 !important;\n    background: var(--cwsc-bg) !important;\n    color: var(--cwsc-text-muted) !important;\n    text-align: center !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-unit-label {\n    display: flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-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    margin-left: 4px !important;\n    border-radius: 50% !important;\n    background: var(--cwsc-primary-light) !important;\n    color: #fff !important;\n    font-size: 10px !important;\n    font-weight: 700 !important;\n    cursor: help !important;\n    position: relative !important;\n    vertical-align: middle !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-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    min-width: 180px !important;\n    max-width: 260px !important;\n    padding: 0.5rem 0.65rem !important;\n    background: var(--cwsc-primary-dark) !important;\n    color: #fff !important;\n    font-size: 0.75rem !important;\n    font-weight: 400 !important;\n    line-height: 1.4 !important;\n    border-radius: 4px !important;\n    opacity: 0 !important;\n    pointer-events: none !important;\n    transition: opacity 0.15s !important;\n    z-index: 10 !important;\n    white-space: normal !important;\n    text-align: left !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-tooltip:hover::after {\n    opacity: 1 !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-actions {\n    display: flex !important;\n    flex-wrap: wrap !important;\n    justify-content: center !important;\n    align-items: center !important;\n    gap: 0.75rem !important;\n    margin-top: 0.5rem !important;\n    width: 100% !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-btn-primary {\n    padding: 0.65rem 2.5rem !important;\n    min-width: 240px !important;\n    width: auto !important;\n    font-size: 0.95rem !important;\n    font-weight: 600 !important;\n    border-radius: 6px !important;\n    background: var(--cwsc-primary) !important;\n    color: #fff !important;\n    transition: background 0.15s !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-btn-primary:hover {\n    background: var(--cwsc-primary-light) !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-hidden {\n    display: none !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-span-full {\n    grid-column: 1 \/ -1 !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-messages {\n    margin-bottom: 0.75rem !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-alert {\n    padding: 0.85rem 1rem !important;\n    border-radius: 6px !important;\n    font-size: 0.88rem !important;\n    margin-bottom: 0.75rem !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-alert-error {\n    background: rgba(192, 57, 43, 0.08) !important;\n    border: 1px solid rgba(192, 57, 43, 0.3) !important;\n    color: var(--cwsc-danger) !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-alert-warn {\n    background: rgba(230, 126, 34, 0.08) !important;\n    border: 1px solid rgba(230, 126, 34, 0.35) !important;\n    color: #a04000 !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-alert ul {\n    margin-top: 0.4rem !important;\n    padding-left: 1.2rem !important;\n    list-style: disc !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-results-grid {\n    display: grid !important;\n    grid-template-columns: 1fr !important;\n    gap: 0.5rem !important;\n}\n\n@media (min-width: 480px) {\n    #cwsc-calculator.cwsc-calculator .cwsc-results-grid {\n        grid-template-columns: 1fr 1fr !important;\n    }\n}\n\n@media (min-width: 768px) {\n    #cwsc-calculator.cwsc-calculator .cwsc-results-grid {\n        grid-template-columns: 1fr 1fr 1fr !important;\n    }\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-result-item {\n    display: flex !important;\n    flex-direction: column !important;\n    padding: 0.65rem 0.85rem !important;\n    background: var(--cwsc-bg) !important;\n    border-radius: 6px !important;\n    border-left: 3px solid var(--cwsc-border) !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-result-highlight {\n    border-left-color: var(--cwsc-primary) !important;\n    background: rgba(36, 113, 163, 0.06) !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-result-label {\n    font-size: 0.78rem !important;\n    color: var(--cwsc-text-muted) !important;\n    margin-bottom: 0.15rem !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-result-value {\n    font-size: 1rem !important;\n    font-weight: 700 !important;\n    font-family: var(--cwsc-mono) !important;\n    color: var(--cwsc-primary-dark) !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-table-wrap {\n    overflow-x: auto !important;\n    margin-top: 0.5rem !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-data-table {\n    width: 100% !important;\n    border-collapse: collapse !important;\n    font-size: 0.82rem !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-data-table th,\n#cwsc-calculator.cwsc-calculator .cwsc-data-table td {\n    padding: 0.45rem 0.55rem !important;\n    border: 1px solid var(--cwsc-border) !important;\n    text-align: left !important;\n    background: #fff !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-data-table th {\n    background: var(--cwsc-primary) !important;\n    color: #fff !important;\n    font-weight: 600 !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-data-table input {\n    min-height: 32px !important;\n    padding: 0.35rem 0.5rem !important;\n    font-size: 0.82rem !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-material-row {\n    border: 1px solid var(--cwsc-border) !important;\n    border-radius: 6px !important;\n    padding: 0.75rem !important;\n    margin-bottom: 0.75rem !important;\n    background: #fff !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-rank-section {\n    margin-top: 1rem !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-rank-section p {\n    margin-bottom: 0.5rem !important;\n}\n\n#cwsc-calculator.cwsc-calculator svg.cwsc-chart {\n    width: 100% !important;\n    height: auto !important;\n    display: block !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-fit-table {\n    margin-top: 0.75rem !important;\n}\n\n#cwsc-calculator.cwsc-calculator .cwsc-fit-table td:last-child {\n    font-family: var(--cwsc-mono) !important;\n    font-weight: 600 !important;\n}\n\n<\/style>\n\n<div id=\"cwsc-calculator\" class=\"cwsc-calculator\">\n\n    <section class=\"cwsc-card\" aria-label=\"Calculator inputs\">\n        <div class=\"cwsc-panel-header\">\n            <div class=\"cwsc-unit-toggle\" role=\"group\" aria-label=\"Unit system\">\n                <button type=\"button\" class=\"cwsc-unit-btn cwsc-active\" data-unit=\"metric\">Metric<\/button>\n                <button type=\"button\" class=\"cwsc-unit-btn\" data-unit=\"imperial\">Imperial<\/button>\n            <\/div>\n        <\/div>\n\n        <form id=\"cwsc-calcForm\" novalidate>\n            <fieldset>\n                <div class=\"cwsc-form-row\">\n                    <div class=\"cwsc-form-group cwsc-span-full\">\n                        <label for=\"cwsc-calcMode\">Mode<\/label>\n                        <select id=\"cwsc-calcMode\" name=\"calcMode\">\n                            <option value=\"strengthening\" selected>Strengthening Coefficient<\/option>\n                            <option value=\"coldWork\">Cold Work Percentage<\/option>\n                            <option value=\"strengthGain\">Strength Gain Percentage<\/option>\n                            <option value=\"trueStrain\">True Strain from Cold Work<\/option>\n                            <option value=\"empiricalLinear\">Empirical Linear Model<\/option>\n                            <option value=\"empiricalPower\">Power-Law Cold Work Model<\/option>\n                            <option value=\"hollomon\">Hollomon Flow Relation<\/option>\n                            <option value=\"comparison\">Material Comparison<\/option>\n                            <option value=\"curveFit\">Strength vs Cold Work Curve<\/option>\n                        <\/select>\n                    <\/div>\n                <\/div>\n            <\/fieldset>\n\n            <fieldset class=\"cwsc-mode-panel\" data-mode=\"strengthening coldWork strengthGain trueStrain empiricalLinear empiricalPower hollomon\">\n                <div class=\"cwsc-form-row\">\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-materialPreset\">Material Preset<\/label>\n                        <select id=\"cwsc-materialPreset\"><\/select>\n                    <\/div>\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-strengthBasis\">Strength Basis<\/label>\n                        <select id=\"cwsc-strengthBasis\">\n                            <option value=\"yield\" selected>Yield Strength<\/option>\n                            <option value=\"tensile\">Ultimate Tensile Strength<\/option>\n                            <option value=\"hardness\">Hardness-Based Equivalent<\/option>\n                            <option value=\"custom\">Custom Strength<\/option>\n                        <\/select>\n                    <\/div>\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-stressUnit\">Stress Unit<\/label>\n                        <select id=\"cwsc-stressUnit\">\n                            <option value=\"MPa\" selected>MPa<\/option>\n                            <option value=\"psi\">psi<\/option>\n                            <option value=\"ksi\">ksi<\/option>\n                        <\/select>\n                    <\/div>\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-sInitial\">\n                            Initial Strength (S<sub>initial<\/sub>)\n                            <span class=\"cwsc-tooltip\" data-tip=\"Material strength before cold working\">?<\/span>\n                        <\/label>\n                        <div class=\"cwsc-input-with-unit\">\n                            <input type=\"number\" id=\"cwsc-sInitial\" value=\"250\" min=\"0.001\" step=\"any\">\n                            <span class=\"cwsc-unit-label\" data-stress-unit>MPa<\/span>\n                        <\/div>\n                    <\/div>\n                    <div class=\"cwsc-form-group cwsc-field-final-strength\" data-mode=\"strengthening strengthGain empiricalLinear empiricalPower\">\n                        <label for=\"cwsc-sFinal\">\n                            Final Strength (S<sub>final<\/sub>)\n                            <span class=\"cwsc-tooltip\" data-tip=\"Strength after cold working at the same basis\">?<\/span>\n                        <\/label>\n                        <div class=\"cwsc-input-with-unit\">\n                            <input type=\"number\" id=\"cwsc-sFinal\" value=\"360\" min=\"0.001\" step=\"any\">\n                            <span class=\"cwsc-unit-label\" data-stress-unit>MPa<\/span>\n                        <\/div>\n                    <\/div>\n                    <div class=\"cwsc-form-group cwsc-field-sTensile cwsc-hidden\">\n                        <label for=\"cwsc-sTensileInitial\">Initial Tensile Strength<\/label>\n                        <div class=\"cwsc-input-with-unit\">\n                            <input type=\"number\" id=\"cwsc-sTensileInitial\" value=\"400\" min=\"0.001\" step=\"any\">\n                            <span class=\"cwsc-unit-label\" data-stress-unit>MPa<\/span>\n                        <\/div>\n                    <\/div>\n                <\/div>\n            <\/fieldset>\n\n            <fieldset class=\"cwsc-mode-panel\" data-mode=\"strengthening coldWork strengthGain trueStrain empiricalLinear empiricalPower\">\n                <div class=\"cwsc-form-row\">\n                    <div class=\"cwsc-form-group cwsc-span-full\">\n                        <label for=\"cwsc-geomMethod\">Geometry Input Method<\/label>\n                        <select id=\"cwsc-geomMethod\">\n                            <option value=\"area\" selected>Original &amp; Final Area<\/option>\n                            <option value=\"diameter\">Original &amp; Final Diameter<\/option>\n                            <option value=\"thickness\">Thickness Reduction (Sheet Rolling)<\/option>\n                            <option value=\"length\">Length Increase (Volume Conserving)<\/option>\n                            <option value=\"direct\">Direct Cold Work Percentage<\/option>\n                        <\/select>\n                    <\/div>\n                <\/div>\n\n                <div class=\"cwsc-form-row cwsc-geom-area\">\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-a0\">Original Area (A<sub>0<\/sub>)<\/label>\n                        <div class=\"cwsc-input-with-unit\">\n                            <input type=\"number\" id=\"cwsc-a0\" value=\"100\" min=\"0.001\" step=\"any\">\n                            <select id=\"cwsc-areaUnit\" class=\"cwsc-inline-unit\">\n                                <option value=\"mm2\" selected>mm\u00b2<\/option>\n                                <option value=\"cm2\">cm\u00b2<\/option>\n                                <option value=\"in2\">in\u00b2<\/option>\n                            <\/select>\n                        <\/div>\n                    <\/div>\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-af\">Final Area (A<sub>f<\/sub>)<\/label>\n                        <div class=\"cwsc-input-with-unit\">\n                            <input type=\"number\" id=\"cwsc-af\" value=\"75\" min=\"0.001\" step=\"any\">\n                            <span class=\"cwsc-unit-label\" data-area-unit>mm\u00b2<\/span>\n                        <\/div>\n                    <\/div>\n                <\/div>\n\n                <div class=\"cwsc-form-row cwsc-geom-diameter cwsc-hidden\">\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-d0\">Original Diameter (d<sub>0<\/sub>)<\/label>\n                        <div class=\"cwsc-input-with-unit\">\n                            <input type=\"number\" id=\"cwsc-d0\" value=\"11.28\" min=\"0.001\" step=\"any\">\n                            <span class=\"cwsc-unit-label\" data-length-unit>mm<\/span>\n                        <\/div>\n                    <\/div>\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-df\">Final Diameter (d<sub>f<\/sub>)<\/label>\n                        <div class=\"cwsc-input-with-unit\">\n                            <input type=\"number\" id=\"cwsc-df\" value=\"9.77\" min=\"0.001\" step=\"any\">\n                            <span class=\"cwsc-unit-label\" data-length-unit>mm<\/span>\n                        <\/div>\n                    <\/div>\n                <\/div>\n\n                <div class=\"cwsc-form-row cwsc-geom-thickness cwsc-hidden\">\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-t0\">\n                            Initial Thickness (t<sub>0<\/sub>)\n                            <span class=\"cwsc-tooltip\" data-tip=\"Approximation assuming negligible width change during rolling\">?<\/span>\n                        <\/label>\n                        <div class=\"cwsc-input-with-unit\">\n                            <input type=\"number\" id=\"cwsc-t0\" value=\"2.0\" min=\"0.001\" step=\"any\">\n                            <span class=\"cwsc-unit-label\" data-length-unit>mm<\/span>\n                        <\/div>\n                    <\/div>\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-tf\">Final Thickness (t<sub>f<\/sub>)<\/label>\n                        <div class=\"cwsc-input-with-unit\">\n                            <input type=\"number\" id=\"cwsc-tf\" value=\"1.5\" min=\"0.001\" step=\"any\">\n                            <span class=\"cwsc-unit-label\" data-length-unit>mm<\/span>\n                        <\/div>\n                    <\/div>\n                <\/div>\n\n                <div class=\"cwsc-form-row cwsc-geom-length cwsc-hidden\">\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-l0\">Original Length (L<sub>0<\/sub>)<\/label>\n                        <div class=\"cwsc-input-with-unit\">\n                            <input type=\"number\" id=\"cwsc-l0\" value=\"100\" min=\"0.001\" step=\"any\">\n                            <span class=\"cwsc-unit-label\" data-length-unit>mm<\/span>\n                        <\/div>\n                    <\/div>\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-lf\">Final Length (L<sub>f<\/sub>)<\/label>\n                        <div class=\"cwsc-input-with-unit\">\n                            <input type=\"number\" id=\"cwsc-lf\" value=\"133.33\" min=\"0.001\" step=\"any\">\n                            <span class=\"cwsc-unit-label\" data-length-unit>mm<\/span>\n                        <\/div>\n                    <\/div>\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-a0length\">Reference Area (A<sub>0<\/sub>)<\/label>\n                        <div class=\"cwsc-input-with-unit\">\n                            <input type=\"number\" id=\"cwsc-a0length\" value=\"100\" min=\"0.001\" step=\"any\">\n                            <span class=\"cwsc-unit-label\" data-area-unit>mm\u00b2<\/span>\n                        <\/div>\n                    <\/div>\n                <\/div>\n\n                <div class=\"cwsc-form-row cwsc-geom-direct cwsc-hidden\">\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-cwDirect\">\n                            Cold Work Percentage (%CW)\n                            <span class=\"cwsc-tooltip\" data-tip=\"Geometric measure of plastic deformation by area reduction\">?<\/span>\n                        <\/label>\n                        <div class=\"cwsc-input-with-unit\">\n                            <input type=\"number\" id=\"cwsc-cwDirect\" value=\"25\" min=\"0\" max=\"99.99\" step=\"any\">\n                            <span class=\"cwsc-unit-label\">%<\/span>\n                        <\/div>\n                    <\/div>\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-strainDirect\">True Plastic Strain (optional)<\/label>\n                        <input type=\"number\" id=\"cwsc-strainDirect\" value=\"\" min=\"0\" step=\"any\" placeholder=\"Auto from %CW\">\n                    <\/div>\n                <\/div>\n            <\/fieldset>\n\n            <fieldset class=\"cwsc-mode-panel cwsc-hidden\" data-mode=\"empiricalLinear\">\n                <div class=\"cwsc-form-row\">\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-kCW\">Empirical k<sub>CW<\/sub> (MPa or psi per %CW)<\/label>\n                        <input type=\"number\" id=\"cwsc-kCW\" value=\"4.4\" min=\"0\" step=\"any\">\n                    <\/div>\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-cwPredict\">Target %CW for Prediction<\/label>\n                        <input type=\"number\" id=\"cwsc-cwPredict\" value=\"30\" min=\"0\" max=\"99.99\" step=\"any\">\n                    <\/div>\n                <\/div>\n            <\/fieldset>\n\n            <fieldset class=\"cwsc-mode-panel cwsc-hidden\" data-mode=\"empiricalPower\">\n                <div class=\"cwsc-form-row\">\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-kcwPower\">K<sub>cw<\/sub><\/label>\n                        <input type=\"number\" id=\"cwsc-kcwPower\" value=\"180\" min=\"0\" step=\"any\">\n                    <\/div>\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-mExp\">Exponent m<\/label>\n                        <input type=\"number\" id=\"cwsc-mExp\" value=\"0.65\" min=\"0.01\" step=\"any\">\n                    <\/div>\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-strainPredict\">Target \u03b5<sub>p<\/sub> for Prediction<\/label>\n                        <input type=\"number\" id=\"cwsc-strainPredict\" value=\"0.35\" min=\"0\" step=\"any\">\n                    <\/div>\n                <\/div>\n            <\/fieldset>\n\n            <fieldset class=\"cwsc-mode-panel cwsc-hidden\" data-mode=\"hollomon\">\n                <div class=\"cwsc-form-row\">\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-hollomonK\">\n                            Strength Coefficient K\n                            <span class=\"cwsc-tooltip\" data-tip=\"Hollomon strength coefficient \u2014 distinct from cold work strengthening coefficient\">?<\/span>\n                        <\/label>\n                        <input type=\"number\" id=\"cwsc-hollomonK\" value=\"600\" min=\"0.001\" step=\"any\">\n                    <\/div>\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-hollomonN\">\n                            Strain Hardening Exponent n\n                            <span class=\"cwsc-tooltip\" data-tip=\"Describes plastic hardening behavior in constitutive flow equations\">?<\/span>\n                        <\/label>\n                        <input type=\"number\" id=\"cwsc-hollomonN\" value=\"0.20\" min=\"0.001\" step=\"any\">\n                    <\/div>\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-hollomonStrain\">Plastic Strain \u03b5<sub>p<\/sub><\/label>\n                        <input type=\"number\" id=\"cwsc-hollomonStrain\" value=\"0.288\" min=\"0.001\" step=\"any\">\n                    <\/div>\n                <\/div>\n            <\/fieldset>\n\n            <fieldset class=\"cwsc-mode-panel cwsc-hidden\" data-mode=\"comparison\">\n                <div class=\"cwsc-form-row\">\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-numMaterials\">Number of Materials<\/label>\n                        <select id=\"cwsc-numMaterials\">\n                            <option value=\"2\">2<\/option>\n                            <option value=\"3\" selected>3<\/option>\n                            <option value=\"4\">4<\/option>\n                            <option value=\"5\">5<\/option>\n                            <option value=\"6\">6<\/option>\n                        <\/select>\n                    <\/div>\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-compStrengthBasis\">Comparison Strength Basis<\/label>\n                        <select id=\"cwsc-compStrengthBasis\">\n                            <option value=\"yield\" selected>Yield Strength<\/option>\n                            <option value=\"tensile\">Ultimate Tensile Strength<\/option>\n                        <\/select>\n                    <\/div>\n                <\/div>\n                <div id=\"cwsc-comparisonTableWrap\" class=\"cwsc-table-wrap\"><\/div>\n            <\/fieldset>\n\n            <fieldset class=\"cwsc-mode-panel cwsc-hidden\" data-mode=\"curveFit\">\n                <div class=\"cwsc-form-row\">\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-numDataPoints\">Number of Data Points<\/label>\n                        <select id=\"cwsc-numDataPoints\">\n                            <option value=\"3\">3<\/option>\n                            <option value=\"4\" selected>4<\/option>\n                            <option value=\"5\">5<\/option>\n                            <option value=\"6\">6<\/option>\n                            <option value=\"8\">8<\/option>\n                            <option value=\"10\">10<\/option>\n                        <\/select>\n                    <\/div>\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-curveStrengthType\">Strength to Fit<\/label>\n                        <select id=\"cwsc-curveStrengthType\">\n                            <option value=\"yield\" selected>Yield Strength<\/option>\n                            <option value=\"tensile\">Tensile Strength<\/option>\n                        <\/select>\n                    <\/div>\n                    <div class=\"cwsc-form-group\">\n                        <label for=\"cwsc-extrapolateCW\">Extrapolation %CW (optional)<\/label>\n                        <input type=\"number\" id=\"cwsc-extrapolateCW\" value=\"\" min=\"0\" max=\"99.99\" step=\"any\" placeholder=\"e.g. 40\">\n                    <\/div>\n                <\/div>\n                <div id=\"cwsc-curveTableWrap\" class=\"cwsc-table-wrap\"><\/div>\n            <\/fieldset>\n\n            <div id=\"cwsc-messages\" aria-live=\"polite\"><\/div>\n\n            <div class=\"cwsc-actions\">\n                <button type=\"submit\" class=\"cwsc-btn-primary\">Calculate<\/button>\n            <\/div>\n        <\/form>\n    <\/section>\n\n    <section id=\"cwsc-resultsPanel\" class=\"cwsc-card cwsc-hidden\" aria-label=\"Calculation results\">\n        <div id=\"cwsc-resultsContent\"><\/div>\n    <\/section>\n<\/div>\n<script>\n(function(){\n  var r=document.getElementById('cwsc-calculator');\n  if(!r||r.dataset.cwscLoaderDone==='1'){return;}\n  r.dataset.cwscLoaderDone='1';\n  try{\n    var p=[\"LyoqCiAqIENvbGQgV29yayBTdHJlbmd0aGVuaW5nIENvZWZmaWNpZW50IENhbGN1bGF0b3IKICogU2NvcGVkIGZvciBXb3JkUHJlc3MgZW1iZWQg4oCUIGRvZXMgbm90IGFmZmVjdCBlbGVtZW50cyBvdXRzaWRlICNjd3NjLWNhbGN1bGF0b3IKICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGNvbnN0IHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3dzYy1jYWxjdWxhdG9yJyk7CiAgICBpZiAoIXJvb3QgfHwgcm9vdC5kYXRhc2V0LmN3c2NSZWFkeSA9PT0gJzEnKSByZXR1cm47CiAgICByb290LmRhdGFzZXQuY3dzY1JlYWR5ID0gJzEnOwoKICAgIGNvbnN0IFBJID0gTWF0aC5QSTsKICAgIGNvbnN0IFNWR19JRCA9ICdjd3NjLWNhbGN1bGF0b3Itc3ZnLSc7CgogICAgY29uc3QgTUFURVJJQUxTID0gewogICAgICAgIGxvd0NhcmJvblN0ZWVsOiB7CiAgICAgICAgICAgIG5hbWU6ICdMb3cgQ2FyYm9uIFN0ZWVsJywKICAgICAgICAgICAgeWllbGQ6IDI1MCwgdGVuc2lsZTogNDAwLCBrQ1c6IDQuNCwgS2N3OiAxODAsIG06IDAuNjUsIG46IDAuMjAsIGhvbGxvbW9uSzogNjAwCiAgICAgICAgfSwKICAgICAgICBoaWdoU3RyZW5ndGhTdGVlbDogewogICAgICAgICAgICBuYW1lOiAnSGlnaCBTdHJlbmd0aCBTdGVlbCcsCiAgICAgICAgICAgIHlpZWxkOiA1NTAsIHRlbnNpbGU6IDcwMCwga0NXOiAzLjIsIEtjdzogMjIwLCBtOiAwLjU1LCBuOiAwLjE1LCBob2xsb21vbks6IDkwMAogICAgICAgIH0sCiAgICAgICAgc3RhaW5sZXNzU3RlZWw6IHsKICAgICAgICAgICAgbmFtZTogJ1N0YWlubGVzcyBTdGVlbCcsCiAgICAgICAgICAgIHlpZWxkOiAzMTAsIHRlbnNpbGU6IDU4MCwga0NXOiA1LjUsIEtjdzogMjUwLCBtOiAwLjcwLCBuOiAwLjM1LCBob2xsb21vbks6IDc1MAogICAgICAgIH0sCiAgICAgICAgYWx1bWludW06IHsKICAgICAgICAgICAgbmFtZTogJ0FsdW1pbnVtIEFsbG95JywKICAgICAgICAgICAgeWllbGQ6IDI3NSwgdGVuc2lsZTogMzEwLCBrQ1c6IDIuOCwgS2N3OiAxMjAsIG06IDAuNTAsIG46IDAuMTgsIGhvbGxvbW9uSzogNDAwCiAgICAgICAgfSwKICAgICAgICBjb3BwZXI6IHsKICAgICAgICAgICAgbmFtZTogJ0NvcHBlcicsCiAgICAgICAgICAgIHlpZWxkOiA3MCwgdGVuc2lsZTogMjIwLCBrQ1c6IDYuMCwgS2N3OiAyMDAsIG06IDAuNzUsIG46IDAuNDUsIGhvbGxvbW9uSzogMzUwCiAgICAgICAgfSwKICAgICAgICBicmFzczogewogICAgICAgICAgICBuYW1lOiAnQnJhc3MnLAogICAgICAgICAgICB5aWVsZDogMjAwLCB0ZW5zaWxlOiAzNTAsIGtDVzogNC44LCBLY3c6IDE3MCwgbTogMC42MCwgbjogMC40MCwgaG9sbG9tb25LOiA1MDAKICAgICAgICB9LAogICAgICAgIHRpdGFuaXVtOiB7CiAgICAgICAgICAgIG5hbWU6ICdUaXRhbml1bSBBbGxveScsCiAgICAgICAgICAgIHlpZWxkOiA4ODAsIHRlbnNpbGU6IDk1MCwga0NXOiAyLjUsIEtjdzogMzAwLCBtOiAwLjQ1LCBuOiAwLjEyLCBob2xsb21vbks6IDExMDAKICAgICAgICB9LAogICAgICAgIG5pY2tlbDogewogICAgICAgICAgICBuYW1lOiAnTmlja2VsIEFsbG95JywKICAgICAgICAgICAgeWllbGQ6IDQ1MCwgdGVuc2lsZTogNzUwLCBrQ1c6IDMuOCwgS2N3OiAyMTAsIG06IDAuNTgsIG46IDAuMjUsIGhvbGxvbW9uSzogODUwCiAgICAgICAgfSwKICAgICAgICBjdXN0b206IHsKICAgICAgICAgICAgbmFtZTogJ0N1c3RvbSBNYXRlcmlhbCcsCiAgICAgICAgICAgIHlpZWxkOiAyNTAsIHRlbnNpbGU6IDQwMCwga0NXOiA0LjQsIEtjdzogMTgwLCBtOiAwLjY1LCBuOiAwLjIwLCBob2xsb21vbks6IDYwMAogICAgICAgIH0KICAgIH07CgogICAgY29uc3QgREVGQVVMVFMgPSB7CiAgICAgICAgY2FsY01vZGU6ICdzdHJlbmd0aGVuaW5nJywKICAgICAgICBtYXRlcmlhbDogJ2xvd0NhcmJvblN0ZWVsJywKICAgICAgICBzdHJlbmd0aEJhc2lzOiAneWllbGQnLAogICAgICAgIHN0cmVzc1VuaXQ6ICdNUGEnLAogICAgICAgIHNJbml0aWFsOiAyNTAsCiAgICAgICAgc0ZpbmFsOiAzNjAsCiAgICAgICAgZ2VvbU1ldGhvZDogJ2FyZWEnLAogICAgICAgIGEwOiAxMDAsCiAgICAgICAgYWY6IDc1LAogICAgICAgIGQwOiAxMS4yOCwKICAgICAgICBkZjogOS43NywKICAgICAgICB0MDogMi4wLAogICAgICAgIHRmOiAxLjUsCiAgICAgICAgbDA6IDEwMCwKICAgICAgICBsZjogMTMzLjMzLAogICAgICAgIGEwbGVuZ3RoOiAxMDAsCiAgICAgICAgY3dEaXJlY3Q6IDI1LAogICAgICAgIGtDVzogNC40LAogICAgICAgIGN3UHJlZGljdDogMzAsCiAgICAgICAga2N3UG93ZXI6IDE4MCwKICAgICAgICBtRXhwOiAwLjY1LAogICAgICAgIHN0cmFpblByZWRpY3Q6IDAuMzUsCiAgICAgICAgaG9sbG9tb25LOiA2MDAsCiAgICAgICAgaG9sbG9tb25OOiAwLjIwLAogICAgICAgIGhvbGxvbW9uU3RyYWluOiAwLjI4OCwKICAgICAgICBudW1NYXRlcmlhbHM6IDMsCiAgICAgICAgbnVtRGF0YVBvaW50czogNAogICAgfTsKCiAgICBjb25zdCBDVVJWRV9ERUZBVUxUUyA9IFsKICAgICAgICB7IGN3OiAwLCB5aWVsZDogMjUwLCB0ZW5zaWxlOiA0MDAgfSwKICAgICAgICB7IGN3OiAxMCwgeWllbGQ6IDI5MCwgdGVuc2lsZTogNDMwIH0sCiAgICAgICAgeyBjdzogMjAsIHlpZWxkOiAzMzAsIHRlbnNpbGU6IDQ2MCB9LAogICAgICAgIHsgY3c6IDMwLCB5aWVsZDogMzcwLCB0ZW5zaWxlOiA0OTAgfQogICAgXTsKCiAgICBjb25zdCBDT01QX0RFRkFVTFRTID0gWwogICAgICAgIHsgbmFtZTogJ0xvdyBDYXJib24gU3RlZWwnLCBzMDogMjUwLCBzZjogMzYwLCBjdzogMjUgfSwKICAgICAgICB7IG5hbWU6ICdBbHVtaW51bSBBbGxveScsIHMwOiAyNzUsIHNmOiAzMTAsIGN3OiAyNSB9LAogICAgICAgIHsgbmFtZTogJ0NvcHBlcicsIHMwOiA3MCwgc2Y6IDEzMCwgY3c6IDI1IH0KICAgIF07CgogICAgZnVuY3Rpb24gJChpZCkgewogICAgICAgIHJldHVybiByb290LnF1ZXJ5U2VsZWN0b3IoJyNjd3NjLScgKyBpZCk7CiAgICB9CgogICAgZnVuY3Rpb24gJGFsbChzZWwpIHsKICAgICAgICByZXR1cm4gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKHNlbCk7CiAgICB9CgogICAgY29uc3QgQ09OViA9IHsKICAgICAgICBsZW5ndGhUb0ludGVybmFsKHYsIHVuaXQpIHsKICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdpbicpIHJldHVybiB2ICogMjUuNDsKICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgfSwKICAgICAgICBsZW5ndGhGcm9tSW50ZXJuYWwodiwgdW5pdCkgewogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2luJykgcmV0dXJuIHYgLyAyNS40OwogICAgICAgICAgICByZXR1cm4gdjsKICAgICAgICB9LAogICAgICAgIGFyZWFUb0ludGVybmFsKHYsIHVuaXQpIHsKICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdjbTInKSByZXR1cm4gdiAqIDEwMDsKICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdpbjInKSByZXR1cm4gdiAqIDY0NS4xNjsKICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgfSwKICAgICAgICBhcmVhRnJvbUludGVybmFsKHYsIHVuaXQpIHsKICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdjbTInKSByZXR1cm4gdiAvIDEwMDsKICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdpbjInKSByZXR1cm4gdiAvIDY0NS4xNjsKICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgfSwKICAgICAgICBzdHJlc3NUb0ludGVybmFsKHYsIHVuaXQpIHsKICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdwc2knKSByZXR1cm4gdiAqIDAuMDA2ODk0NzY7CiAgICAgICAgICAgIGlmICh1bml0ID09PSAna3NpJykgcmV0dXJuIHYgKiA2Ljg5NDc2OwogICAgICAgICAgICByZXR1cm4gdjsKICAgICAgICB9LAogICAgICAgIHN0cmVzc0Zyb21JbnRlcm5hbCh2LCB1bml0KSB7CiAgICAgICAgICAgIGlmICh1bml0ID09PSAncHNpJykgcmV0dXJuIHYgLyAwLjAwNjg5NDc2OwogICAgICAgICAgICBpZiAodW5pdCA9PT0gJ2tzaScpIHJldHVybiB2IC8gNi44OTQ3NjsKICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgfQogICAgfTsKCiAgICBsZXQgdW5pdFN5c3RlbSA9ICdtZXRyaWMnOwoKICAgIGNvbnN0IGZvcm0gPSAkKCdjYWxjRm9ybScpOwogICAgY29uc3QgY2FsY01vZGUgPSAkKCdjYWxjTW9kZScpOwogICAgY29uc3QgcmVzdWx0c1BhbmVsID0gJCgncmVzdWx0c1BhbmVsJyk7CgogICAgZnVuY3Rpb24gaW5pdCgpIHsKICAgICAgICBwb3B1bGF0ZU1hdGVyaWFsU2VsZWN0KCk7CiAgICAgICAgYnVpbGRDb21wYXJpc29uVGFibGUoKTsKICAgICAgICBidWlsZEN1cnZlVGFibGUoKTsKICAgICAgICBiaW5kRXZlbnRzKCk7CiAgICAgICAgdXBkYXRlRmllbGRWaXNpYmlsaXR5KCk7CiAgICAgICAgdXBkYXRlVW5pdExhYmVscygpOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvcHVsYXRlTWF0ZXJpYWxTZWxlY3QoKSB7CiAgICAgICAgY29uc3Qgc2VsID0gJCgnbWF0ZXJpYWxQcmVzZXQnKTsKICAgICAgICBzZWwuaW5uZXJI\",\"VE1MID0gT2JqZWN0LmVudHJpZXMoTUFURVJJQUxTKS5tYXAoKFtrZXksIG1dKSA9PgogICAgICAgICAgICBgPG9wdGlvbiB2YWx1ZT0iJHtrZXl9Ij4ke20ubmFtZX08L29wdGlvbj5gCiAgICAgICAgKS5qb2luKCcnKTsKICAgICAgICBzZWwudmFsdWUgPSBERUZBVUxUUy5tYXRlcmlhbDsKICAgIH0KCiAgICBmdW5jdGlvbiBiaW5kRXZlbnRzKCkgewogICAgICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgKGUpID0+IHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBjYWxjdWxhdGUoKTsKICAgICAgICB9KTsKCiAgICAgICAgJGFsbCgnLmN3c2MtdW5pdC1idG4nKS5mb3JFYWNoKChidG4pID0+IHsKICAgICAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc3dpdGNoVW5pdFN5c3RlbShidG4uZGF0YXNldC51bml0KSk7CiAgICAgICAgfSk7CgogICAgICAgIGNhbGNNb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgICAgICAgICAgdXBkYXRlRmllbGRWaXNpYmlsaXR5KCk7CiAgICAgICAgICAgIGhpZGVSZXN1bHRzKCk7CiAgICAgICAgfSk7CgogICAgICAgICQoJ2dlb21NZXRob2QnKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7CiAgICAgICAgICAgIHVwZGF0ZUdlb21ldHJ5RmllbGRzKCk7CiAgICAgICAgICAgIGhpZGVSZXN1bHRzKCk7CiAgICAgICAgfSk7CgogICAgICAgICQoJ21hdGVyaWFsUHJlc2V0JykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgYXBwbHlNYXRlcmlhbFByZXNldCk7CgogICAgICAgICQoJ3N0cmVuZ3RoQmFzaXMnKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7CiAgICAgICAgICAgIHVwZGF0ZVN0cmVuZ3RoQmFzaXNGaWVsZHMoKTsKICAgICAgICAgICAgaGlkZVJlc3VsdHMoKTsKICAgICAgICB9KTsKCiAgICAgICAgJCgnbnVtTWF0ZXJpYWxzJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gewogICAgICAgICAgICBidWlsZENvbXBhcmlzb25UYWJsZSgpOwogICAgICAgICAgICBoaWRlUmVzdWx0cygpOwogICAgICAgIH0pOwoKICAgICAgICAkKCdudW1EYXRhUG9pbnRzJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gewogICAgICAgICAgICBidWlsZEN1cnZlVGFibGUoKTsKICAgICAgICAgICAgaGlkZVJlc3VsdHMoKTsKICAgICAgICB9KTsKCiAgICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGhpZGVSZXN1bHRzKTsKICAgICAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7CiAgICAgICAgICAgIGlmIChlLnRhcmdldC5pZCA9PT0gJ2N3c2MtbWF0ZXJpYWxQcmVzZXQnKSByZXR1cm47CiAgICAgICAgICAgIGhpZGVSZXN1bHRzKCk7CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gbGVuVW5pdCgpIHsKICAgICAgICByZXR1cm4gdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/ICdpbicgOiAnbW0nOwogICAgfQoKICAgIGZ1bmN0aW9uIGFyZWFVbml0S2V5KCkgewogICAgICAgIHJldHVybiB1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gJ2luMicgOiAnbW0yJzsKICAgIH0KCiAgICBmdW5jdGlvbiBhcmVhVW5pdExhYmVsKCkgewogICAgICAgIHJldHVybiBhcmVhVW5pdEtleSgpID09PSAnaW4yJyA\/ICdpbsKyJyA6ICdtbcKyJzsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHJlc3NVbml0KCkgewogICAgICAgIHJldHVybiAkKCdzdHJlc3NVbml0JykudmFsdWU7CiAgICB9CgogICAgZnVuY3Rpb24gcmVhZE51bShpZCkgewogICAgICAgIGNvbnN0IGVsID0gJChpZCk7CiAgICAgICAgaWYgKCFlbCB8fCBlbC52YWx1ZSA9PT0gJycpIHJldHVybiBudWxsOwogICAgICAgIGNvbnN0IHYgPSBwYXJzZUZsb2F0KGVsLnZhbHVlKTsKICAgICAgICByZXR1cm4gaXNOYU4odikgPyBudWxsIDogdjsKICAgIH0KCiAgICBmdW5jdGlvbiByZWFkU3RyZXNzKGlkKSB7CiAgICAgICAgY29uc3QgdiA9IHJlYWROdW0oaWQpOwogICAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiBudWxsOwogICAgICAgIHJldHVybiBDT05WLnN0cmVzc1RvSW50ZXJuYWwodiwgc3RyZXNzVW5pdCgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZWFkTGVuZ3RoKGlkKSB7CiAgICAgICAgY29uc3QgdiA9IHJlYWROdW0oaWQpOwogICAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiBudWxsOwogICAgICAgIHJldHVybiBDT05WLmxlbmd0aFRvSW50ZXJuYWwodiwgbGVuVW5pdCgpKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZWFkQXJlYShpZCwgdW5pdFNlbGVjdElkKSB7CiAgICAgICAgY29uc3QgdiA9IHJlYWROdW0oaWQpOwogICAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiBudWxsOwogICAgICAgIGNvbnN0IHVuaXRFbCA9IHVuaXRTZWxlY3RJZCA\/ICQodW5pdFNlbGVjdElkKSA6IG51bGw7CiAgICAgICAgY29uc3QgdW5pdCA9IHVuaXRFbCA\/IHVuaXRFbC52YWx1ZSA6IGFyZWFVbml0S2V5KCk7CiAgICAgICAgcmV0dXJuIENPTlYuYXJlYVRvSW50ZXJuYWwodiwgdW5pdCk7CiAgICB9CgogICAgZnVuY3Rpb24gY2lyY3VsYXJBcmVhKGQpIHsKICAgICAgICByZXR1cm4gUEkgKiBkICogZCAvIDQ7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0TnVtKHYsIGRlYykgewogICAgICAgIGlmICh2ID09IG51bGwgfHwgIWlzRmluaXRlKHYpKSByZXR1cm4gJ+KAlCc7CiAgICAgICAgaWYgKE1hdGguYWJzKHYpID49IDFlNiB8fCAoTWF0aC5hYnModikgPiAwICYmIE1hdGguYWJzKHYpIDwgMC4wMDAxKSkgewogICAgICAgICAgICByZXR1cm4gdi50b0V4cG9uZW50aWFsKGRlYyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2LnRvRml4ZWQoZGVjKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmbXRTdHJlc3ModikgewogICAgICAgIGNvbnN0IHUgPSBzdHJlc3NVbml0KCk7CiAgICAgICAgcmV0dXJuIGZvcm1hdE51bShDT05WLnN0cmVzc0Zyb21JbnRlcm5hbCh2LCB1KSwgMikgKyAnICcgKyB1OwogICAgfQoKICAgIGZ1bmN0aW9uIGZtdFN0cmVzc1JhdGUodikgewogICAgICAgIGNvbnN0IHUgPSBzdHJlc3NVbml0KCk7CiAgICAgICAgcmV0dXJuIGZvcm1hdE51bShDT05WLnN0cmVzc0Zyb21JbnRlcm5hbCh2LCB1KSwgMykgKyAnICcgKyB1ICsgJy8lQ1cnOwogICAgfQoKICAgIGZ1bmN0aW9uIGZtdExlbih2KSB7CiAgICAgICAgY29uc3QgdSA9IGxlblVuaXQoKTsKICAgICAgICByZXR1cm4gZm9ybWF0TnVtKENPTlYubGVuZ3RoRnJvbUludGVybmFsKHYsIHUpLCA0KSArICcgJyArIHU7CiAgICB9CgogICAgZnVuY3Rpb24gZm10QXJlYSh2KSB7CiAgICAgICAgY29uc3QgdSA9IGFyZWFVbml0S2V5KCk7CiAgICAgICAgcmV0dXJuIGZvcm1hdE51bShDT05WLmFyZWFGcm9tSW50ZXJuYWwodiwgdSksIDMpICsgJyAnICsgYXJlYVVuaXRMYWJlbCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHN3aXRjaFVuaXRTeXN0ZW0oc3lzdGVtKSB7CiAgICAgICAgaWYgKHN5c3RlbSA9PT0gdW5pdFN5c3RlbSkgcmV0dXJuOwogICAgICAgIGNvbnN0IG9sZExlbiA9IGxlblVuaXQoKTsKICAgICAgICBjb25zdCBvbGRBcmVhID0gYXJlYVVuaXRLZXkoKTsKICAgICAgICB1bml0U3lzdGVtID0gc3lzdGVtOwoKICAgICAgICAkYWxsKCcuY3dzYy11bml0LWJ0bicpLmZvckVhY2goKGJ0bikgPT4gewogICAgICAgICAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnY3dzYy1hY3RpdmUnLCBidG4uZGF0YXNldC51bml0ID09PSBzeXN0ZW0pOwogICAgICAgIH0pOwoKICAgICAgICBjb25zdCBsZW5GaWVsZHMgPSBbJ2QwJywgJ2RmJywgJ3QwJywgJ3RmJywgJ2wwJywgJ2xmJ107CiAgICAgICAgbGVuRmllbGRzLmZvckVhY2goKGlkKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGVsID0gJChpZCk7CiAgICAgICAgICAgIGlmICghZWwgfHwgZWwudmFsdWUgPT09ICcnKSByZXR1cm47CiAgICAgICAgICAgIGNvbnN0IGludGVybmFsID0gQ09OVi5sZW5ndGhUb0ludGVybmFsKHBhcnNlRmxvYXQoZWwudmFsdWUpLCBvbGRMZW4pOwogICAgICAgICAgICBlbC52YWx1ZSA9IGZvcm1hdE51bShDT05WLmxlbmd0aEZyb21JbnRlcm5hbChpbnRlcm5hbCwgbGVuVW5pdCgpKSwgNCk7CiAgICAgICAgfSk7CgogICAgICAgIFsnYTAnLCAnYWYnLCAnYTBsZW5ndGgnXS5mb3JFYWNoKChpZCkgPT4gewogICAgICAgICAgICBjb25zdCBlbCA9ICQoaWQpOwogICAgICAgICAgICBpZiAoIWVsIHx8IGVsLnZhbHVlID09PSAnJykgcmV0dXJuOwogICAgICAgICAgICBjb25zdCBpbnRlcm5hbCA9IENPTlYuYXJlYVRvSW50ZXJuYWwocGFyc2VGbG9hdChlbC52YWx1ZSksIG9sZEFyZWEpOwogICAgICAgICAgICBlbC52YWx1ZSA9IGZvcm1hdE51bShDT05WLmFyZWFGcm9tSW50ZXJuYWwoaW50ZXJuYWwsIGFyZWFVbml0S2V5KCkpLCAzKTsKICAgICAgICB9KTsKCiAgICAgICAgaWYgKCQoJ2FyZWFVbml0JykpIHsKICAgICAgICAgICAgJCgnYXJlYVVuaXQn\",\"KS52YWx1ZSA9IGFyZWFVbml0S2V5KCk7CiAgICAgICAgfQoKICAgICAgICB1cGRhdGVVbml0TGFiZWxzKCk7CiAgICAgICAgaGlkZVJlc3VsdHMoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVVbml0TGFiZWxzKCkgewogICAgICAgIGNvbnN0IGxlbiA9IGxlblVuaXQoKTsKICAgICAgICBjb25zdCBhcmVhID0gYXJlYVVuaXRMYWJlbCgpOwogICAgICAgICRhbGwoJ1tkYXRhLWxlbmd0aC11bml0XScpLmZvckVhY2goKGVsKSA9PiB7IGVsLnRleHRDb250ZW50ID0gbGVuOyB9KTsKICAgICAgICAkYWxsKCdbZGF0YS1hcmVhLXVuaXRdJykuZm9yRWFjaCgoZWwpID0+IHsgZWwudGV4dENvbnRlbnQgPSBhcmVhOyB9KTsKICAgICAgICAkYWxsKCdbZGF0YS1zdHJlc3MtdW5pdF0nKS5mb3JFYWNoKChlbCkgPT4geyBlbC50ZXh0Q29udGVudCA9IHN0cmVzc1VuaXQoKTsgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlRmllbGRWaXNpYmlsaXR5KCkgewogICAgICAgIGNvbnN0IG1vZGUgPSBjYWxjTW9kZS52YWx1ZTsKCiAgICAgICAgJGFsbCgnLmN3c2MtbW9kZS1wYW5lbCcpLmZvckVhY2goKHBhbmVsKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1vZGVzID0gKHBhbmVsLmRhdGFzZXQubW9kZSB8fCAnJykuc3BsaXQoL1xzKy8pOwogICAgICAgICAgICBwYW5lbC5jbGFzc0xpc3QudG9nZ2xlKCdjd3NjLWhpZGRlbicsICFtb2Rlcy5pbmNsdWRlcyhtb2RlKSk7CiAgICAgICAgfSk7CgogICAgICAgICRhbGwoJ1tkYXRhLW1vZGVdJykuZm9yRWFjaCgoZWwpID0+IHsKICAgICAgICAgICAgaWYgKCFlbC5kYXRhc2V0Lm1vZGUpIHJldHVybjsKICAgICAgICAgICAgY29uc3QgbW9kZXMgPSBlbC5kYXRhc2V0Lm1vZGUuc3BsaXQoL1xzKy8pOwogICAgICAgICAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdjd3NjLWhpZGRlbicsICFtb2Rlcy5pbmNsdWRlcyhtb2RlKSk7CiAgICAgICAgfSk7CgogICAgICAgIGlmIChbJ3N0cmVuZ3RoZW5pbmcnLCAnY29sZFdvcmsnLCAnc3RyZW5ndGhHYWluJywgJ3RydWVTdHJhaW4nLCAnZW1waXJpY2FsTGluZWFyJywgJ2VtcGlyaWNhbFBvd2VyJ10uaW5jbHVkZXMobW9kZSkpIHsKICAgICAgICAgICAgdXBkYXRlR2VvbWV0cnlGaWVsZHMoKTsKICAgICAgICAgICAgdXBkYXRlU3RyZW5ndGhCYXNpc0ZpZWxkcygpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVHZW9tZXRyeUZpZWxkcygpIHsKICAgICAgICBjb25zdCBtZXRob2QgPSAkKCdnZW9tTWV0aG9kJykudmFsdWU7CiAgICAgICAgJGFsbCgnLmN3c2MtZ2VvbS1hcmVhLCAuY3dzYy1nZW9tLWRpYW1ldGVyLCAuY3dzYy1nZW9tLXRoaWNrbmVzcywgLmN3c2MtZ2VvbS1sZW5ndGgsIC5jd3NjLWdlb20tZGlyZWN0JykuZm9yRWFjaCgoZWwpID0+IHsKICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnY3dzYy1oaWRkZW4nKTsKICAgICAgICB9KTsKICAgICAgICBjb25zdCBtYXAgPSB7CiAgICAgICAgICAgIGFyZWE6ICcuY3dzYy1nZW9tLWFyZWEnLAogICAgICAgICAgICBkaWFtZXRlcjogJy5jd3NjLWdlb20tZGlhbWV0ZXInLAogICAgICAgICAgICB0aGlja25lc3M6ICcuY3dzYy1nZW9tLXRoaWNrbmVzcycsCiAgICAgICAgICAgIGxlbmd0aDogJy5jd3NjLWdlb20tbGVuZ3RoJywKICAgICAgICAgICAgZGlyZWN0OiAnLmN3c2MtZ2VvbS1kaXJlY3QnCiAgICAgICAgfTsKICAgICAgICBjb25zdCBzZWwgPSBtYXBbbWV0aG9kXTsKICAgICAgICBpZiAoc2VsKSB7CiAgICAgICAgICAgICRhbGwoc2VsKS5mb3JFYWNoKChlbCkgPT4gZWwuY2xhc3NMaXN0LnJlbW92ZSgnY3dzYy1oaWRkZW4nKSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZVN0cmVuZ3RoQmFzaXNGaWVsZHMoKSB7CiAgICAgICAgY29uc3QgYmFzaXMgPSAkKCdzdHJlbmd0aEJhc2lzJykudmFsdWU7CiAgICAgICAgY29uc3Qgc2hvd1RlbnNpbGUgPSBiYXNpcyA9PT0gJ2hhcmRuZXNzJzsKICAgICAgICAkKCdzVGVuc2lsZUluaXRpYWwnKS5jbG9zZXN0KCcuY3dzYy1mb3JtLWdyb3VwJykuY2xhc3NMaXN0LnRvZ2dsZSgnY3dzYy1oaWRkZW4nLCAhc2hvd1RlbnNpbGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFwcGx5TWF0ZXJpYWxQcmVzZXQoKSB7CiAgICAgICAgY29uc3Qga2V5ID0gJCgnbWF0ZXJpYWxQcmVzZXQnKS52YWx1ZTsKICAgICAgICBjb25zdCBtYXQgPSBNQVRFUklBTFNba2V5XTsKICAgICAgICBpZiAoIW1hdCkgcmV0dXJuOwoKICAgICAgICBjb25zdCBiYXNpcyA9ICQoJ3N0cmVuZ3RoQmFzaXMnKS52YWx1ZTsKICAgICAgICBjb25zdCBzMCA9IGJhc2lzID09PSAndGVuc2lsZScgPyBtYXQudGVuc2lsZSA6IG1hdC55aWVsZDsKICAgICAgICAkKCdzSW5pdGlhbCcpLnZhbHVlID0gczA7CiAgICAgICAgJCgnc0ZpbmFsJykudmFsdWUgPSBmb3JtYXROdW0oczAgKiAxLjQ0LCAxKTsKICAgICAgICAkKCdzVGVuc2lsZUluaXRpYWwnKS52YWx1ZSA9IG1hdC50ZW5zaWxlOwogICAgICAgICQoJ2tDVycpLnZhbHVlID0gbWF0LmtDVzsKICAgICAgICAkKCdrY3dQb3dlcicpLnZhbHVlID0gbWF0LktjdzsKICAgICAgICAkKCdtRXhwJykudmFsdWUgPSBtYXQubTsKICAgICAgICAkKCdob2xsb21vbksnKS52YWx1ZSA9IG1hdC5ob2xsb21vbks7CiAgICAgICAgJCgnaG9sbG9tb25OJykudmFsdWUgPSBtYXQubjsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZENvbXBhcmlzb25UYWJsZSgpIHsKICAgICAgICBjb25zdCBuID0gcGFyc2VJbnQoJCgnbnVtTWF0ZXJpYWxzJykudmFsdWUsIDEwKTsKICAgICAgICBjb25zdCB3cmFwID0gJCgnY29tcGFyaXNvblRhYmxlV3JhcCcpOwogICAgICAgIGxldCBodG1sID0gJyc7CgogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IGQgPSBDT01QX0RFRkFVTFRTW2ldIHx8IHsgbmFtZTogJ01hdGVyaWFsICcgKyAoaSArIDEpLCBzMDogMjAwLCBzZjogMjgwLCBjdzogMjAgfTsKICAgICAgICAgICAgaHRtbCArPSBgPGRpdiBjbGFzcz0iY3dzYy1tYXRlcmlhbC1yb3ciIGRhdGEtaW5kZXg9IiR7aX0iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY3dzYy1mb3JtLXJvdyBjd3NjLWZvcm0tcm93LTMiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImN3c2MtZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5OYW1lPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJjd3NjLWNtcC1uYW1lIiB2YWx1ZT0iJHtkLm5hbWV9Ij4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjd3NjLWZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+UzxzdWI+aW5pdGlhbDwvc3ViPjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJjd3NjLWNtcC1zMCIgdmFsdWU9IiR7ZC5zMH0iIG1pbj0iMC4wMDEiIHN0ZXA9ImFueSI+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY3dzYy1mb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlM8c3ViPmZpbmFsPC9zdWI+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9ImN3c2MtY21wLXNmIiB2YWx1ZT0iJHtkLnNmfSIgbWluPSIwLjAwMSIgc3RlcD0iYW55Ij4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjd3NjLWZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JUNXPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9ImN3c2MtY21wLWN3IiB2YWx1ZT0iJHtkLmN3fSIgbWluPSIwIiBtYXg9Ijk5Ljk5IiBzdGVwPSJhbnkiPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PmA7CiAgICAgICAgfQogICAgICAgIHdyYXAuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZEN1cnZlVGFibGUoKSB7CiAgICAgICAgY29uc3QgbiA9IHBhcnNlSW50KCQoJ251bURhdGFQb2ludHMnKS52YWx1ZSwgMTApOwogICAgICAgIGNvbnN0IHdyYXAgPSAkKCdjdXJ2ZVRhYmxlV3JhcCcpOwogICAgICAgIGxldCBodG1sID0gYDx0YWJsZSBjbGFzcz0iY3dzYy1kYXRhLXRhYmxlIj48dGhlYWQ+PHRyPgogICAgICAgICAgICA8dGg+UG9pbnQ8L3RoPjx0aD4lQ1c8L3RoPjx0aD5ZaWVsZCAoTVBhKTwvdGg+PHRoPlRlbnNpbGUgKE1QYSk8L3RoPgogICAgICAgIDwvdHI+PC90aGVhZD48dGJvZHk+YDsKCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgY29uc3Qg\",\"ZCA9IENVUlZFX0RFRkFVTFRTW2ldIHx8IHsgY3c6IGkgKiAxMCwgeWllbGQ6IDI1MCArIGkgKiA0MCwgdGVuc2lsZTogNDAwICsgaSAqIDMwIH07CiAgICAgICAgICAgIGh0bWwgKz0gYDx0cj4KICAgICAgICAgICAgICAgIDx0ZD4ke2kgKyAxfTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9ImN3c2MtY3VydmUtY3ciIHZhbHVlPSIke2QuY3d9IiBtaW49IjAiIG1heD0iOTkuOTkiIHN0ZXA9ImFueSI+PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0ibnVtYmVyIiBjbGFzcz0iY3dzYy1jdXJ2ZS15aWVsZCIgdmFsdWU9IiR7ZC55aWVsZH0iIG1pbj0iMC4wMDEiIHN0ZXA9ImFueSI+PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0ibnVtYmVyIiBjbGFzcz0iY3dzYy1jdXJ2ZS10ZW5zaWxlIiB2YWx1ZT0iJHtkLnRlbnNpbGV9IiBtaW49IjAuMDAxIiBzdGVwPSJhbnkiPjwvdGQ+CiAgICAgICAgICAgIDwvdHI+YDsKICAgICAgICB9CiAgICAgICAgaHRtbCArPSAnPC90Ym9keT48L3RhYmxlPic7CiAgICAgICAgd3JhcC5pbm5lckhUTUwgPSBodG1sOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbXB1dGVDb2xkV29yayhnZW9tLCBlcnJvcnMsIHdhcm5pbmdzKSB7CiAgICAgICAgbGV0IEEwID0gbnVsbDsKICAgICAgICBsZXQgQWYgPSBudWxsOwogICAgICAgIGxldCBwY3RDVyA9IG51bGw7CiAgICAgICAgbGV0IHN0cmFpbkRpcmVjdCA9IHJlYWROdW0oJ3N0cmFpbkRpcmVjdCcpOwoKICAgICAgICBpZiAoZ2VvbS5tZXRob2QgPT09ICdhcmVhJykgewogICAgICAgICAgICBBMCA9IHJlYWRBcmVhKCdhMCcsICdhcmVhVW5pdCcpOwogICAgICAgICAgICBBZiA9IHJlYWRBcmVhKCdhZicpOwogICAgICAgICAgICBpZiAoQTAgPT0gbnVsbCB8fCBBMCA8PSAwKSBlcnJvcnMucHVzaCgnT3JpZ2luYWwgYXJlYSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOwogICAgICAgICAgICBpZiAoQWYgPT0gbnVsbCB8fCBBZiA8PSAwKSBlcnJvcnMucHVzaCgnRmluYWwgYXJlYSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOwogICAgICAgICAgICBpZiAoQTAgPiAwICYmIEFmID4gMCAmJiBBZiA+IEEwKSB7CiAgICAgICAgICAgICAgICB3YXJuaW5ncy5wdXNoKCdGaW5hbCBhcmVhIGV4Y2VlZHMgb3JpZ2luYWwgYXJlYSDigJQgdmVyaWZ5IHRoaXMgaXMgYSBjb2xkIHJlZHVjdGlvbiBwcm9jZXNzLicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChBMCA+IDAgJiYgQWYgPiAwKSB7CiAgICAgICAgICAgICAgICBwY3RDVyA9ICgoQTAgLSBBZikgLyBBMCkgKiAxMDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGdlb20ubWV0aG9kID09PSAnZGlhbWV0ZXInKSB7CiAgICAgICAgICAgIGNvbnN0IGQwID0gcmVhZExlbmd0aCgnZDAnKTsKICAgICAgICAgICAgY29uc3QgZGYgPSByZWFkTGVuZ3RoKCdkZicpOwogICAgICAgICAgICBpZiAoZDAgPT0gbnVsbCB8fCBkMCA8PSAwKSBlcnJvcnMucHVzaCgnT3JpZ2luYWwgZGlhbWV0ZXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsKICAgICAgICAgICAgaWYgKGRmID09IG51bGwgfHwgZGYgPD0gMCkgZXJyb3JzLnB1c2goJ0ZpbmFsIGRpYW1ldGVyIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7CiAgICAgICAgICAgIGlmIChkMCA+IDAgJiYgZGYgPiAwKSB7CiAgICAgICAgICAgICAgICBpZiAoZGYgPiBkMCkgd2FybmluZ3MucHVzaCgnRmluYWwgZGlhbWV0ZXIgZXhjZWVkcyBvcmlnaW5hbCDigJQgdmVyaWZ5IGNvbGQgcmVkdWN0aW9uIGRpcmVjdGlvbi4nKTsKICAgICAgICAgICAgICAgIEEwID0gY2lyY3VsYXJBcmVhKGQwKTsKICAgICAgICAgICAgICAgIEFmID0gY2lyY3VsYXJBcmVhKGRmKTsKICAgICAgICAgICAgICAgIHBjdENXID0gKDEgLSAoZGYgLyBkMCkgKiogMikgKiAxMDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGdlb20ubWV0aG9kID09PSAndGhpY2tuZXNzJykgewogICAgICAgICAgICBjb25zdCB0MCA9IHJlYWRMZW5ndGgoJ3QwJyk7CiAgICAgICAgICAgIGNvbnN0IHRmID0gcmVhZExlbmd0aCgndGYnKTsKICAgICAgICAgICAgaWYgKHQwID09IG51bGwgfHwgdDAgPD0gMCkgZXJyb3JzLnB1c2goJ0luaXRpYWwgdGhpY2tuZXNzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7CiAgICAgICAgICAgIGlmICh0ZiA9PSBudWxsIHx8IHRmIDw9IDApIGVycm9ycy5wdXNoKCdGaW5hbCB0aGlja25lc3MgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsKICAgICAgICAgICAgaWYgKHQwID4gMCAmJiB0ZiA+IDApIHsKICAgICAgICAgICAgICAgIGlmICh0ZiA+IHQwKSB3YXJuaW5ncy5wdXNoKCdGaW5hbCB0aGlja25lc3MgZXhjZWVkcyBpbml0aWFsIOKAlCBhcHByb3hpbWF0aW9uIGFzc3VtZXMgdGhpY2tuZXNzIHJlZHVjdGlvbi4nKTsKICAgICAgICAgICAgICAgIHBjdENXID0gKCh0MCAtIHRmKSAvIHQwKSAqIDEwMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZ2VvbS5tZXRob2QgPT09ICdsZW5ndGgnKSB7CiAgICAgICAgICAgIGNvbnN0IEwwID0gcmVhZExlbmd0aCgnbDAnKTsKICAgICAgICAgICAgY29uc3QgTGYgPSByZWFkTGVuZ3RoKCdsZicpOwogICAgICAgICAgICBBMCA9IHJlYWRBcmVhKCdhMGxlbmd0aCcpOwogICAgICAgICAgICBpZiAoTDAgPT0gbnVsbCB8fCBMMCA8PSAwKSBlcnJvcnMucHVzaCgnT3JpZ2luYWwgbGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7CiAgICAgICAgICAgIGlmIChMZiA9PSBudWxsIHx8IExmIDw9IDApIGVycm9ycy5wdXNoKCdGaW5hbCBsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsKICAgICAgICAgICAgaWYgKEEwID09IG51bGwgfHwgQTAgPD0gMCkgZXJyb3JzLnB1c2goJ1JlZmVyZW5jZSBhcmVhIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7CiAgICAgICAgICAgIGlmIChMMCA+IDAgJiYgTGYgPiAwICYmIEEwID4gMCkgewogICAgICAgICAgICAgICAgQWYgPSAoQTAgKiBMMCkgLyBMZjsKICAgICAgICAgICAgICAgIHBjdENXID0gKChBMCAtIEFmKSAvIEEwKSAqIDEwMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZ2VvbS5tZXRob2QgPT09ICdkaXJlY3QnKSB7CiAgICAgICAgICAgIHBjdENXID0gcmVhZE51bSgnY3dEaXJlY3QnKTsKICAgICAgICAgICAgaWYgKHBjdENXID09IG51bGwpIGVycm9ycy5wdXNoKCdFbnRlciBjb2xkIHdvcmsgcGVyY2VudGFnZS4nKTsKICAgICAgICAgICAgaWYgKHBjdENXICE9IG51bGwgJiYgKHBjdENXIDwgMCB8fCBwY3RDVyA+PSAxMDApKSB7CiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCgnQ29sZCB3b3JrIHBlcmNlbnRhZ2UgbXVzdCBiZSBiZXR3ZWVuIDAlIGFuZCBsZXNzIHRoYW4gMTAwJS4nKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHBjdENXICE9IG51bGwgJiYgKHBjdENXIDwgMCB8fCBwY3RDVyA+PSAxMDApKSB7CiAgICAgICAgICAgIGVycm9ycy5wdXNoKCdDb21wdXRlZCBjb2xkIHdvcmsgcGVyY2VudGFnZSBtdXN0IGJlIGJldHdlZW4gMCUgYW5kIGxlc3MgdGhhbiAxMDAlLicpOwogICAgICAgIH0KCiAgICAgICAgbGV0IGVwc1AgPSBudWxsOwogICAgICAgIGlmIChzdHJhaW5EaXJlY3QgIT0gbnVsbCAmJiBzdHJhaW5EaXJlY3QgPj0gMCkgewogICAgICAgICAgICBlcHNQID0gc3RyYWluRGlyZWN0OwogICAgICAgIH0gZWxzZSBpZiAocGN0Q1cgIT0gbnVsbCAmJiBwY3RDVyA+PSAwICYmIHBjdENXIDwgMTAwKSB7CiAgICAgICAgICAgIGNvbnN0IGZDVyA9IHBjdENXIC8gMTAwOwogICAgICAgICAgICBlcHNQID0gTWF0aC5sb2coMSAvICgxIC0gZkNXKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAocGN0Q1cgIT0gbnVsbCAmJiBwY3RDVyA+IDAgJiYgcGN0Q1cgPCAxMDAgJiYgQTAgPT0gbnVsbCAmJiBBZiA9PSBudWxsICYmIGdlb20ubWV0aG9kID09PSAnZGlyZWN0JykgewogICAgICAgICAgICBjb25zdCBmQ1cgPSBwY3RDVyAvIDEwMDsKICAgICAgICAgICAgaWYgKGdlb20ucmVmQXJlYSkgewogICAgICAgICAgICAgICAgQTAgPSBnZW9tLnJlZkFyZWE7CiAgICAgICAgICAgICAgICBBZiA9IEEwICogKDEgLSBmQ1cpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4geyBBMCwgQWYsIHBjdENXLCBlcHNQLCBmQ1c6IHBjdENXICE9IG51bGwgPyBwY3RDVyAvIDEwMCA6IG51bGwgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb21wdXRlU3RyZW5ndGhNZXRyaWNzKHMwLCBzZiwgcGN0Q1csIGVwc1ApIHsKICAgICAgICBjb25zdCBkZWx0YVMgPSBzZiAtIHMwOwogICAgICAgIGNvbnN0IGdhaW5QY3QgPSBzMCA+IDAgPyAoZGVsdGFTIC8gczApICogMTAwIDogbnVsbDsKICAgICAgICBjb25zdCBDcyA9IHMwID4gMCA\/IHNmIC8gczAgOiBudWxsOwogICAgICAgIGNvbnN0IHJhdGUg\",\"PSBwY3RDVyA+IDAgPyBkZWx0YVMgLyBwY3RDVyA6IG51bGw7CiAgICAgICAgY29uc3QgZkNXID0gcGN0Q1cgIT0gbnVsbCA\/IHBjdENXIC8gMTAwIDogbnVsbDsKICAgICAgICBjb25zdCBDbiA9IGZDVyA+IDAgJiYgQ3MgIT0gbnVsbCA\/IChDcyAtIDEpIC8gZkNXIDogbnVsbDsKICAgICAgICBjb25zdCBDZSA9IGVwc1AgPiAwICYmIENzID4gMCA\/IE1hdGgubG9nKENzKSAvIGVwc1AgOiBudWxsOwogICAgICAgIHJldHVybiB7IGRlbHRhUywgZ2FpblBjdCwgQ3MsIHJhdGUsIENuLCBDZSB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHJlYWRHZW9tZXRyeUlucHV0KCkgewogICAgICAgIHJldHVybiB7IG1ldGhvZDogJCgnZ2VvbU1ldGhvZCcpLnZhbHVlLCByZWZBcmVhOiByZWFkQXJlYSgnYTBsZW5ndGgnKSB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHZhbGlkYXRlU3RyZW5ndGhzKHMwLCBzZiwgZXJyb3JzLCBsYWJlbCkgewogICAgICAgIGNvbnN0IHByZWZpeCA9IGxhYmVsID8gbGFiZWwgKyAnOiAnIDogJyc7CiAgICAgICAgaWYgKHMwID09IG51bGwgfHwgczAgPD0gMCkgZXJyb3JzLnB1c2gocHJlZml4ICsgJ0luaXRpYWwgc3RyZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsKICAgICAgICBpZiAoc2YgIT0gbnVsbCAmJiBzZiA8PSAwKSBlcnJvcnMucHVzaChwcmVmaXggKyAnRmluYWwgc3RyZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYWxjdWxhdGUoKSB7CiAgICAgICAgaGlkZU1lc3NhZ2VzKCk7CiAgICAgICAgaGlkZVJlc3VsdHMoKTsKCiAgICAgICAgY29uc3QgbW9kZSA9IGNhbGNNb2RlLnZhbHVlOwogICAgICAgIGNvbnN0IGVycm9ycyA9IFtdOwogICAgICAgIGNvbnN0IHdhcm5pbmdzID0gW107CgogICAgICAgIGlmIChtb2RlID09PSAnY29tcGFyaXNvbicpIHsKICAgICAgICAgICAgcnVuQ29tcGFyaXNvbihlcnJvcnMsIHdhcm5pbmdzKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAobW9kZSA9PT0gJ2N1cnZlRml0JykgewogICAgICAgICAgICBydW5DdXJ2ZUZpdChlcnJvcnMsIHdhcm5pbmdzKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAobW9kZSA9PT0gJ2hvbGxvbW9uJykgewogICAgICAgICAgICBydW5Ib2xsb21vbihlcnJvcnMsIHdhcm5pbmdzKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgY29uc3QgZ2VvbSA9IHJlYWRHZW9tZXRyeUlucHV0KCk7CiAgICAgICAgY29uc3QgY3cgPSBjb21wdXRlQ29sZFdvcmsoZ2VvbSwgZXJyb3JzLCB3YXJuaW5ncyk7CgogICAgICAgIGxldCBzMCA9IHJlYWRTdHJlc3MoJ3NJbml0aWFsJyk7CiAgICAgICAgbGV0IHNmID0gcmVhZFN0cmVzcygnc0ZpbmFsJyk7CiAgICAgICAgdmFsaWRhdGVTdHJlbmd0aHMoczAsIHNmLCBlcnJvcnMpOwoKICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkgewogICAgICAgICAgICBzaG93RXJyb3JzKGVycm9ycyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGNvbnN0IGl0ZW1zID0gW107CiAgICAgICAgbGV0IHJlY29tbWVuZGF0aW9ucyA9IFtdOwogICAgICAgIGxldCBjaGFydHMgPSBbXTsKCiAgICAgICAgaWYgKG1vZGUgPT09ICdzdHJlbmd0aGVuaW5nJyB8fCBtb2RlID09PSAnY29sZFdvcmsnIHx8IG1vZGUgPT09ICdzdHJlbmd0aEdhaW4nIHx8IG1vZGUgPT09ICd0cnVlU3RyYWluJykgewogICAgICAgICAgICBjb25zdCBtID0gY29tcHV0ZVN0cmVuZ3RoTWV0cmljcyhzMCwgc2YsIGN3LnBjdENXLCBjdy5lcHNQKTsKCiAgICAgICAgICAgIGlmIChjdy5BMCAhPSBudWxsKSBpdGVtcy5wdXNoKHsgbGFiZWw6ICdPcmlnaW5hbCBBcmVhIChB4oKAKScsIHZhbHVlOiBmbXRBcmVhKGN3LkEwKSB9KTsKICAgICAgICAgICAgaWYgKGN3LkFmICE9IG51bGwpIGl0ZW1zLnB1c2goeyBsYWJlbDogJ0ZpbmFsIEFyZWEgKEE8c3ViPmY8L3N1Yj4pJywgdmFsdWU6IGZtdEFyZWEoY3cuQWYpIH0pOwogICAgICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdDb2xkIFdvcmsgUGVyY2VudGFnZSAoJUNXKScsIHZhbHVlOiBmb3JtYXROdW0oY3cucGN0Q1csIDIpICsgJyAlJywgaGlnaGxpZ2h0OiBtb2RlID09PSAnY29sZFdvcmsnIH0pOwogICAgICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdUcnVlIFBsYXN0aWMgU3RyYWluICjOtTxzdWI+cDwvc3ViPiknLCB2YWx1ZTogZm9ybWF0TnVtKGN3LmVwc1AsIDQpLCBoaWdobGlnaHQ6IG1vZGUgPT09ICd0cnVlU3RyYWluJyB9KTsKICAgICAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnSW5pdGlhbCBTdHJlbmd0aCcsIHZhbHVlOiBmbXRTdHJlc3MoczApIH0pOwogICAgICAgICAgICBpZiAoc2YgIT0gbnVsbCkgaXRlbXMucHVzaCh7IGxhYmVsOiAnRmluYWwgU3RyZW5ndGgnLCB2YWx1ZTogZm10U3RyZXNzKHNmKSB9KTsKICAgICAgICAgICAgaWYgKG0uZGVsdGFTICE9IG51bGwpIGl0ZW1zLnB1c2goeyBsYWJlbDogJ1N0cmVuZ3RoIEluY3JlYXNlICjOlFMpJywgdmFsdWU6IGZtdFN0cmVzcyhtLmRlbHRhUykgfSk7CiAgICAgICAgICAgIGlmIChtLmdhaW5QY3QgIT0gbnVsbCkgaXRlbXMucHVzaCh7IGxhYmVsOiAnU3RyZW5ndGggR2FpbicsIHZhbHVlOiBmb3JtYXROdW0obS5nYWluUGN0LCAyKSArICcgJScsIGhpZ2hsaWdodDogbW9kZSA9PT0gJ3N0cmVuZ3RoR2FpbicgfSk7CiAgICAgICAgICAgIGlmIChtLkNzICE9IG51bGwpIGl0ZW1zLnB1c2goeyBsYWJlbDogJ1N0cmVuZ3RoZW5pbmcgQ29lZmZpY2llbnQgQzxzdWI+czwvc3ViPicsIHZhbHVlOiBmb3JtYXROdW0obS5DcywgNCksIGhpZ2hsaWdodDogbW9kZSA9PT0gJ3N0cmVuZ3RoZW5pbmcnIH0pOwogICAgICAgICAgICBpZiAobS5yYXRlICE9IG51bGwpIGl0ZW1zLnB1c2goeyBsYWJlbDogJ0F2ZXJhZ2UgU3RyZW5ndGhlbmluZyBSYXRlJywgdmFsdWU6IGZtdFN0cmVzc1JhdGUobS5yYXRlKSB9KTsKICAgICAgICAgICAgaWYgKG0uQ24gIT0gbnVsbCkgaXRlbXMucHVzaCh7IGxhYmVsOiAnTm9ybWFsaXplZCBDb2VmZmljaWVudCBDPHN1Yj5uPC9zdWI+JywgdmFsdWU6IGZvcm1hdE51bShtLkNuLCA0KSB9KTsKICAgICAgICAgICAgaWYgKG0uQ2UgIT0gbnVsbCkgaXRlbXMucHVzaCh7IGxhYmVsOiAnVHJ1ZS1TdHJhaW4gQ29lZmZpY2llbnQgQzxzdWI+zrU8L3N1Yj4nLCB2YWx1ZTogZm9ybWF0TnVtKG0uQ2UsIDQpIH0pOwoKICAgICAgICAgICAgcmVjb21tZW5kYXRpb25zID0gYnVpbGRSZWNvbW1lbmRhdGlvbnMoY3cucGN0Q1csIG0uZ2FpblBjdCk7CiAgICAgICAgICAgIGNoYXJ0cyA9IGJ1aWxkTWFpbkNoYXJ0cyhjdy5wY3RDVywgczAsIHNmLCBtKTsKICAgICAgICB9CgogICAgICAgIGlmIChtb2RlID09PSAnZW1waXJpY2FsTGluZWFyJykgewogICAgICAgICAgICBjb25zdCBrQ1cgPSByZWFkTnVtKCdrQ1cnKTsKICAgICAgICAgICAgY29uc3QgY3dQcmVkID0gcmVhZE51bSgnY3dQcmVkaWN0Jyk7CiAgICAgICAgICAgIGlmIChrQ1cgPT0gbnVsbCB8fCBrQ1cgPCAwKSBlcnJvcnMucHVzaCgnRW50ZXIgYSB2YWxpZCBlbXBpcmljYWwgazxzdWI+Q1c8L3N1Yj4gdmFsdWUuJyk7CiAgICAgICAgICAgIGlmIChjd1ByZWQgPT0gbnVsbCB8fCBjd1ByZWQgPCAwIHx8IGN3UHJlZCA+PSAxMDApIHsKICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKCdUYXJnZXQgJUNXIG11c3QgYmUgYmV0d2VlbiAwIGFuZCBsZXNzIHRoYW4gMTAwJS4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkgeyBzaG93RXJyb3JzKGVycm9ycyk7IHJldHVybjsgfQoKICAgICAgICAgICAgY29uc3QgcHJlZGljdGVkID0gczAgKyBDT05WLnN0cmVzc1RvSW50ZXJuYWwoa0NXLCBzdHJlc3NVbml0KCkpICogY3dQcmVkOwogICAgICAgICAgICBjb25zdCBmaXR0ZWRLID0gY3cucGN0Q1cgPiAwID8gKHNmIC0gczApIC8gY3cucGN0Q1cgOiBudWxsOwoKICAgICAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnQ29sZCBXb3JrIFBlcmNlbnRhZ2UnLCB2YWx1ZTogZm9ybWF0TnVtKGN3LnBjdENXLCAyKSArICcgJScgfSk7CiAgICAgICAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ1RydWUgUGxhc3RpYyBTdHJhaW4nLCB2YWx1ZTogZm9ybWF0TnVtKGN3LmVwc1AsIDQpIH0pOwogICAgICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdJbml0aWFsIFN0cmVuZ3RoIFPigoAnLCB2YWx1ZTogZm10U3RyZXNzKHMwKSB9KTsKICAgICAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnTWVhc3VyZWQgRmluYWwgU3RyZW5ndGgnLCB2YWx1ZTogZm10U3RyZXNzKHNmKSB9KTsKICAgICAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnRW1waXJpY2FsIGs8c3ViPkNXPC9zdWI+IChpbnB1dCknLCB2YWx1ZTogZm9ybWF0TnVtKGtDVywgMykgKyAnICcgKyBzdHJlc3NVbml0KCkgKyAnLyVDVycgfSk7CiAgICAgICAgICAg\",\"IGlmIChmaXR0ZWRLICE9IG51bGwpIGl0ZW1zLnB1c2goeyBsYWJlbDogJ0ZpdHRlZCBrPHN1Yj5DVzwvc3ViPiBmcm9tIGRhdGEnLCB2YWx1ZTogZm10U3RyZXNzUmF0ZShmaXR0ZWRLKSB9KTsKICAgICAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnUHJlZGljdGVkIFN0cmVuZ3RoIGF0ICcgKyBjd1ByZWQgKyAnJSBDVycsIHZhbHVlOiBmbXRTdHJlc3MocHJlZGljdGVkKSwgaGlnaGxpZ2h0OiB0cnVlIH0pOwoKICAgICAgICAgICAgY2hhcnRzID0gYnVpbGRQcmVkaWN0aW9uQ2hhcnQoY3cucGN0Q1csIHMwLCBzZiwga0NXLCAnbGluZWFyJywgY3dQcmVkLCBwcmVkaWN0ZWQpOwogICAgICAgICAgICByZWNvbW1lbmRhdGlvbnMgPSBbJ0xpbmVhciBtb2RlbCBTID0gU+KCgCArIGs8c3ViPkNXPC9zdWI+IMOXICVDVyBpcyBhcHByb3hpbWF0ZSDigJQgdmVyaWZ5IG92ZXIgeW91ciBjb2xkIHdvcmsgcmFuZ2UuJ107CiAgICAgICAgfQoKICAgICAgICBpZiAobW9kZSA9PT0gJ2VtcGlyaWNhbFBvd2VyJykgewogICAgICAgICAgICBjb25zdCBLY3cgPSByZWFkU3RyZXNzKCdrY3dQb3dlcicpOwogICAgICAgICAgICBjb25zdCBtRXhwID0gcmVhZE51bSgnbUV4cCcpOwogICAgICAgICAgICBjb25zdCBzdHJhaW5QcmVkID0gcmVhZE51bSgnc3RyYWluUHJlZGljdCcpOwogICAgICAgICAgICBpZiAoS2N3ID09IG51bGwgfHwgS2N3IDw9IDApIGVycm9ycy5wdXNoKCdFbnRlciBhIHZhbGlkIEs8c3ViPmN3PC9zdWI+IHZhbHVlLicpOwogICAgICAgICAgICBpZiAobUV4cCA9PSBudWxsIHx8IG1FeHAgPD0gMCkgZXJyb3JzLnB1c2goJ0V4cG9uZW50IG0gbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsKICAgICAgICAgICAgaWYgKHN0cmFpblByZWQgPT0gbnVsbCB8fCBzdHJhaW5QcmVkIDwgMCkgZXJyb3JzLnB1c2goJ0VudGVyIGEgdmFsaWQgdGFyZ2V0IHBsYXN0aWMgc3RyYWluLicpOwogICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkgeyBzaG93RXJyb3JzKGVycm9ycyk7IHJldHVybjsgfQoKICAgICAgICAgICAgY29uc3QgcHJlZGljdGVkID0gczAgKyBLY3cgKiBNYXRoLnBvdyhzdHJhaW5QcmVkLCBtRXhwKTsKICAgICAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnQ29sZCBXb3JrIFBlcmNlbnRhZ2UnLCB2YWx1ZTogZm9ybWF0TnVtKGN3LnBjdENXLCAyKSArICcgJScgfSk7CiAgICAgICAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ1RydWUgUGxhc3RpYyBTdHJhaW4gKGN1cnJlbnQpJywgdmFsdWU6IGZvcm1hdE51bShjdy5lcHNQLCA0KSB9KTsKICAgICAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnSW5pdGlhbCBTdHJlbmd0aCBT4oKAJywgdmFsdWU6IGZtdFN0cmVzcyhzMCkgfSk7CiAgICAgICAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ01lYXN1cmVkIEZpbmFsIFN0cmVuZ3RoJywgdmFsdWU6IGZtdFN0cmVzcyhzZikgfSk7CiAgICAgICAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ0s8c3ViPmN3PC9zdWI+JywgdmFsdWU6IGZtdFN0cmVzcyhLY3cpIH0pOwogICAgICAgICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6ICdFeHBvbmVudCBtJywgdmFsdWU6IGZvcm1hdE51bShtRXhwLCAzKSB9KTsKICAgICAgICAgICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnUHJlZGljdGVkIFN0cmVuZ3RoIGF0IM61PHN1Yj5wPC9zdWI+PScgKyBzdHJhaW5QcmVkLCB2YWx1ZTogZm10U3RyZXNzKHByZWRpY3RlZCksIGhpZ2hsaWdodDogdHJ1ZSB9KTsKCiAgICAgICAgICAgIGlmIChjdy5wY3RDVyA+IDUwKSB3YXJuaW5ncy5wdXNoKCdQb3dlci1sYXcgc3RyZW5ndGhlbmluZyBpcyBvZnRlbiBub25saW5lYXIg4oCUIHZlcmlmeSBmaXQgb3ZlciBsYXJnZSBjb2xkIHdvcmsgcmFuZ2VzLicpOwogICAgICAgICAgICByZWNvbW1lbmRhdGlvbnMgPSBbJ05vbmxpbmVhciBwb3dlci1sYXcgbW9kZWwgbWF5IGJldHRlciByZXByZXNlbnQgbGFyZ2UgZGVmb3JtYXRpb24gc3RyZW5ndGhlbmluZy4nXTsKICAgICAgICB9CgogICAgICAgIGlmICh3YXJuaW5ncy5sZW5ndGgpIHNob3dXYXJuaW5ncyh3YXJuaW5ncyk7CiAgICAgICAgcmVuZGVyUmVzdWx0cyhpdGVtcywgcmVjb21tZW5kYXRpb25zLCBjaGFydHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJ1bkhvbGxvbW9uKGVycm9ycywgd2FybmluZ3MpIHsKICAgICAgICBjb25zdCBLID0gcmVhZFN0cmVzcygnaG9sbG9tb25LJyk7CiAgICAgICAgY29uc3QgbiA9IHJlYWROdW0oJ2hvbGxvbW9uTicpOwogICAgICAgIGNvbnN0IGVwcyA9IHJlYWROdW0oJ2hvbGxvbW9uU3RyYWluJyk7CiAgICAgICAgaWYgKEsgPT0gbnVsbCB8fCBLIDw9IDApIGVycm9ycy5wdXNoKCdIb2xsb21vbiBzdHJlbmd0aCBjb2VmZmljaWVudCBLIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7CiAgICAgICAgaWYgKG4gPT0gbnVsbCB8fCBuIDw9IDApIGVycm9ycy5wdXNoKCdTdHJhaW4gaGFyZGVuaW5nIGV4cG9uZW50IG4gbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsKICAgICAgICBpZiAoZXBzID09IG51bGwgfHwgZXBzIDw9IDApIGVycm9ycy5wdXNoKCdQbGFzdGljIHN0cmFpbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOwogICAgICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7IHNob3dFcnJvcnMoZXJyb3JzKTsgcmV0dXJuOyB9CgogICAgICAgIGNvbnN0IHNpZ21hID0gSyAqIE1hdGgucG93KGVwcywgbik7CiAgICAgICAgY29uc3QgaXRlbXMgPSBbCiAgICAgICAgICAgIHsgbGFiZWw6ICdTdHJlbmd0aCBDb2VmZmljaWVudCBLIChIb2xsb21vbiknLCB2YWx1ZTogZm10U3RyZXNzKEspLCBoaWdobGlnaHQ6IGZhbHNlIH0sCiAgICAgICAgICAgIHsgbGFiZWw6ICdTdHJhaW4gSGFyZGVuaW5nIEV4cG9uZW50IG4nLCB2YWx1ZTogZm9ybWF0TnVtKG4sIDQpIH0sCiAgICAgICAgICAgIHsgbGFiZWw6ICdQbGFzdGljIFN0cmFpbiDOtTxzdWI+cDwvc3ViPicsIHZhbHVlOiBmb3JtYXROdW0oZXBzLCA0KSB9LAogICAgICAgICAgICB7IGxhYmVsOiAnRmxvdyBTdHJlc3Mgz4MgPSBLIM61PHN1Yj5wPC9zdWI+PHN1cD5uPC9zdXA+JywgdmFsdWU6IGZtdFN0cmVzcyhzaWdtYSksIGhpZ2hsaWdodDogdHJ1ZSB9CiAgICAgICAgXTsKCiAgICAgICAgd2FybmluZ3MucHVzaCgnSG9sbG9tb24gSyBhbmQgbiBkZXNjcmliZSBwbGFzdGljIGZsb3cg4oCUIGRpc3RpbmN0IGZyb20gY29sZCB3b3JrIHN0cmVuZ3RoZW5pbmcgY29lZmZpY2llbnQgQzxzdWI+czwvc3ViPi4nKTsKICAgICAgICBzaG93V2FybmluZ3Mod2FybmluZ3MpOwogICAgICAgIHJlbmRlclJlc3VsdHMoaXRlbXMsIFsKICAgICAgICAgICAgJ0hvbGxvbW9uIHJlbGF0aW9uIM+DID0gSyDOtTxzdWI+cDwvc3ViPjxzdXA+bjwvc3VwPiBtb2RlbHMgY29uc3RpdHV0aXZlIGZsb3cgYmVoYXZpb3IgZHVyaW5nIHBsYXN0aWMgZGVmb3JtYXRpb24uJywKICAgICAgICAgICAgJ0RvIG5vdCBjb25mdXNlIEhvbGxvbW9uIEsgd2l0aCBjYWxjdWxhdG9yIGNvbGQgd29yayBzdHJlbmd0aGVuaW5nIGNvZWZmaWNpZW50cy4nCiAgICAgICAgXSwgW10pOwogICAgfQoKICAgIGZ1bmN0aW9uIHJ1bkNvbXBhcmlzb24oZXJyb3JzLCB3YXJuaW5ncykgewogICAgICAgIGNvbnN0IHJvd3MgPSAkYWxsKCcuY3dzYy1tYXRlcmlhbC1yb3cnKTsKICAgICAgICBjb25zdCBtYXRlcmlhbHMgPSBbXTsKICAgICAgICBjb25zdCBiYXNpcyA9ICQoJ2NvbXBTdHJlbmd0aEJhc2lzJykudmFsdWU7CgogICAgICAgIHJvd3MuZm9yRWFjaCgocm93LCBpZHgpID0+IHsKICAgICAgICAgICAgY29uc3QgbmFtZSA9IHJvdy5xdWVyeVNlbGVjdG9yKCcuY3dzYy1jbXAtbmFtZScpLnZhbHVlIHx8ICgnTWF0ZXJpYWwgJyArIChpZHggKyAxKSk7CiAgICAgICAgICAgIGNvbnN0IHMwID0gQ09OVi5zdHJlc3NUb0ludGVybmFsKHBhcnNlRmxvYXQocm93LnF1ZXJ5U2VsZWN0b3IoJy5jd3NjLWNtcC1zMCcpLnZhbHVlKSB8fCAwLCBzdHJlc3NVbml0KCkpOwogICAgICAgICAgICBjb25zdCBzZiA9IENPTlYuc3RyZXNzVG9JbnRlcm5hbChwYXJzZUZsb2F0KHJvdy5xdWVyeVNlbGVjdG9yKCcuY3dzYy1jbXAtc2YnKS52YWx1ZSkgfHwgMCwgc3RyZXNzVW5pdCgpKTsKICAgICAgICAgICAgY29uc3QgY3cgPSBwYXJzZUZsb2F0KHJvdy5xdWVyeVNlbGVjdG9yKCcuY3dzYy1jbXAtY3cnKS52YWx1ZSk7CgogICAgICAgICAgICBpZiAoczAgPD0gMCkgZXJyb3JzLnB1c2gobmFtZSArICc6IGluaXRpYWwgc3RyZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsKICAgICAgICAgICAgaWYgKHNmIDw9IDApIGVycm9ycy5wdXNoKG5hbWUgKyAnOiBmaW5hbCBzdHJlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOwogICAgICAgICAgICBpZiAoaXNOYU4oY3cpIHx8IGN3IDwgMCB8fCBjdyA+PSAxMDApIGVycm9ycy5wdXNoKG5hbWUgKyAnOiAlQ1cgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIGxlc3MgdGhhbiAxMDAlLicpOwoKICAgICAgICAgICAg\",\"aWYgKHMwID4gMCAmJiBzZiA+IDAgJiYgIWlzTmFOKGN3KSAmJiBjdyA+PSAwICYmIGN3IDwgMTAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBmQ1cgPSBjdyAvIDEwMDsKICAgICAgICAgICAgICAgIGNvbnN0IGVwc1AgPSBNYXRoLmxvZygxIC8gKDEgLSBmQ1cpKTsKICAgICAgICAgICAgICAgIGNvbnN0IG0gPSBjb21wdXRlU3RyZW5ndGhNZXRyaWNzKHMwLCBzZiwgY3csIGVwc1ApOwogICAgICAgICAgICAgICAgbWF0ZXJpYWxzLnB1c2goeyBuYW1lLCBzMCwgc2YsIGN3LCBlcHNQLCBiYXNpcywgLi4ubSB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkgeyBzaG93RXJyb3JzKGVycm9ycyk7IHJldHVybjsgfQogICAgICAgIGlmIChtYXRlcmlhbHMubGVuZ3RoIDwgMikgeyBzaG93RXJyb3JzKFsnQXQgbGVhc3QgdHdvIHZhbGlkIG1hdGVyaWFscyByZXF1aXJlZC4nXSk7IHJldHVybjsgfQoKICAgICAgICBsZXQgdGFibGVIdG1sID0gYDxkaXYgY2xhc3M9ImN3c2MtdGFibGUtd3JhcCI+PHRhYmxlIGNsYXNzPSJjd3NjLWRhdGEtdGFibGUiPgogICAgICAgICAgICA8dGhlYWQ+PHRyPgogICAgICAgICAgICAgICAgPHRoPk1hdGVyaWFsPC90aD48dGg+UzxzdWI+aW5pdGlhbDwvc3ViPjwvdGg+PHRoPlM8c3ViPmZpbmFsPC9zdWI+PC90aD48dGg+JUNXPC90aD4KICAgICAgICAgICAgICAgIDx0aD7OlFM8L3RoPjx0aD5HYWluICU8L3RoPjx0aD5DPHN1Yj5zPC9zdWI+PC90aD48dGg+QzxzdWI+bjwvc3ViPjwvdGg+PHRoPkM8c3ViPs61PC9zdWI+PC90aD4KICAgICAgICAgICAgPC90cj48L3RoZWFkPjx0Ym9keT5gOwoKICAgICAgICBtYXRlcmlhbHMuZm9yRWFjaCgobWF0KSA9PiB7CiAgICAgICAgICAgIHRhYmxlSHRtbCArPSBgPHRyPgogICAgICAgICAgICAgICAgPHRkPiR7bWF0Lm5hbWV9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4ke2ZtdFN0cmVzcyhtYXQuczApfTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JHtmbXRTdHJlc3MobWF0LnNmKX08L3RkPgogICAgICAgICAgICAgICAgPHRkPiR7Zm9ybWF0TnVtKG1hdC5jdywgMil9JTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JHtmbXRTdHJlc3MobWF0LmRlbHRhUyl9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4ke2Zvcm1hdE51bShtYXQuZ2FpblBjdCwgMil9JTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JHtmb3JtYXROdW0obWF0LkNzLCA0KX08L3RkPgogICAgICAgICAgICAgICAgPHRkPiR7Zm9ybWF0TnVtKG1hdC5DbiwgNCl9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4ke2Zvcm1hdE51bShtYXQuQ2UsIDQpfTwvdGQ+CiAgICAgICAgICAgIDwvdHI+YDsKICAgICAgICB9KTsKICAgICAgICB0YWJsZUh0bWwgKz0gJzwvdGJvZHk+PC90YWJsZT48L2Rpdj4nOwoKICAgICAgICBjb25zdCBieUFicyA9IFsuLi5tYXRlcmlhbHNdLnNvcnQoKGEsIGIpID0+IGIuZGVsdGFTIC0gYS5kZWx0YVMpOwogICAgICAgIGNvbnN0IGJ5UmVsID0gWy4uLm1hdGVyaWFsc10uc29ydCgoYSwgYikgPT4gYi5nYWluUGN0IC0gYS5nYWluUGN0KTsKICAgICAgICBjb25zdCBieVJhdGUgPSBbLi4ubWF0ZXJpYWxzXS5zb3J0KChhLCBiKSA9PiAoYi5yYXRlIHx8IDApIC0gKGEucmF0ZSB8fCAwKSk7CgogICAgICAgIGNvbnN0IHJhbmtIdG1sID0gYDxkaXYgY2xhc3M9ImN3c2MtcmFuay1zZWN0aW9uIj4KICAgICAgICAgICAgPHA+PHN0cm9uZz5IaWdoZXN0IGFic29sdXRlIHN0cmVuZ3RoIGluY3JlYXNlOjwvc3Ryb25nPiAke2J5QWJzLm1hcCgobSwgaSkgPT4gKGkgKyAxKSArICcuICcgKyBtLm5hbWUpLmpvaW4oJyDihpIgJyl9PC9wPgogICAgICAgICAgICA8cD48c3Ryb25nPkhpZ2hlc3QgcmVsYXRpdmUgc3RyZW5ndGggaW5jcmVhc2U6PC9zdHJvbmc+ICR7YnlSZWwubWFwKChtLCBpKSA9PiAoaSArIDEpICsgJy4gJyArIG0ubmFtZSkuam9pbignIOKGkiAnKX08L3A+CiAgICAgICAgICAgIDxwPjxzdHJvbmc+SGlnaGVzdCBzdHJlbmd0aGVuaW5nIHBlciB1bml0IGNvbGQgd29yazo8L3N0cm9uZz4gJHtieVJhdGUubWFwKChtLCBpKSA9PiAoaSArIDEpICsgJy4gJyArIG0ubmFtZSkuam9pbignIOKGkiAnKX08L3A+CiAgICAgICAgPC9kaXY+YDsKCiAgICAgICAgY29uc3QgY2hhcnRzID0gW2J1aWxkQ29tcGFyaXNvbkNoYXJ0KG1hdGVyaWFscyldOwogICAgICAgICQoJ3Jlc3VsdHNDb250ZW50JykuaW5uZXJIVE1MID0gdGFibGVIdG1sICsgcmFua0h0bWw7CiAgICAgICAgcmVuZGVyUmVjb21tZW5kYXRpb25zKFsnVXNlIHRoZSBzYW1lIHN0cmVuZ3RoIGRlZmluaXRpb24gKHlpZWxkIG9yIHRlbnNpbGUpIHdoZW4gY29tcGFyaW5nIG1hdGVyaWFscy4nLCAnS2VlcCBkZWZvcm1hdGlvbiBwYXRoIGFuZCB0ZXN0IGNvbmRpdGlvbnMgY29uc2lzdGVudCBhY3Jvc3MgY29tcGFyaXNvbnMuJ10pOwogICAgICAgIHJlbmRlckNoYXJ0cyhjaGFydHMpOwogICAgICAgIHNob3dSZXN1bHRzKCk7CiAgICB9CgogICAgZnVuY3Rpb24gcnVuQ3VydmVGaXQoZXJyb3JzLCB3YXJuaW5ncykgewogICAgICAgIGNvbnN0IHJvd3MgPSAkYWxsKCcjY3dzYy1jdXJ2ZVRhYmxlV3JhcCB0Ym9keSB0cicpOwogICAgICAgIGNvbnN0IHN0cmVuZ3RoVHlwZSA9ICQoJ2N1cnZlU3RyZW5ndGhUeXBlJykudmFsdWU7CiAgICAgICAgY29uc3QgcG9pbnRzID0gW107CgogICAgICAgIHJvd3MuZm9yRWFjaCgocm93LCBpZHgpID0+IHsKICAgICAgICAgICAgY29uc3QgY3cgPSBwYXJzZUZsb2F0KHJvdy5xdWVyeVNlbGVjdG9yKCcuY3dzYy1jdXJ2ZS1jdycpLnZhbHVlKTsKICAgICAgICAgICAgY29uc3Qgc3kgPSBwYXJzZUZsb2F0KHJvdy5xdWVyeVNlbGVjdG9yKCcuY3dzYy1jdXJ2ZS15aWVsZCcpLnZhbHVlKTsKICAgICAgICAgICAgY29uc3Qgc3QgPSBwYXJzZUZsb2F0KHJvdy5xdWVyeVNlbGVjdG9yKCcuY3dzYy1jdXJ2ZS10ZW5zaWxlJykudmFsdWUpOwogICAgICAgICAgICBjb25zdCBzID0gc3RyZW5ndGhUeXBlID09PSAneWllbGQnID8gc3kgOiBzdDsKICAgICAgICAgICAgaWYgKGlzTmFOKGN3KSB8fCBjdyA8IDAgfHwgY3cgPj0gMTAwKSBlcnJvcnMucHVzaCgnUG9pbnQgJyArIChpZHggKyAxKSArICc6IGludmFsaWQgJUNXLicpOwogICAgICAgICAgICBpZiAoaXNOYU4ocykgfHwgcyA8PSAwKSBlcnJvcnMucHVzaCgnUG9pbnQgJyArIChpZHggKyAxKSArICc6IHN0cmVuZ3RoIG11c3QgYmUgcG9zaXRpdmUuJyk7CiAgICAgICAgICAgIGlmICghaXNOYU4oY3cpICYmICFpc05hTihzKSAmJiBzID4gMCAmJiBjdyA+PSAwICYmIGN3IDwgMTAwKSB7CiAgICAgICAgICAgICAgICBwb2ludHMucHVzaCh7IGN3LCBzLCBzeSwgc3QgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHsgc2hvd0Vycm9ycyhlcnJvcnMpOyByZXR1cm47IH0KICAgICAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDMpIHsgc2hvd0Vycm9ycyhbJ0F0IGxlYXN0IHRocmVlIHZhbGlkIGRhdGEgcG9pbnRzIHJlcXVpcmVkIGZvciBjdXJ2ZSBmaXR0aW5nLiddKTsgcmV0dXJuOyB9CgogICAgICAgIHBvaW50cy5zb3J0KChhLCBiKSA9PiBhLmN3IC0gYi5jdyk7CgogICAgICAgIGNvbnN0IGxpbmVhciA9IGZpdExpbmVhcihwb2ludHMpOwogICAgICAgIGNvbnN0IHBvd2VyID0gZml0UG93ZXJMYXcocG9pbnRzKTsKICAgICAgICBjb25zdCBwb2x5ID0gZml0UG9seW5vbWlhbChwb2ludHMpOwoKICAgICAgICBsZXQgZml0SHRtbCA9IGA8ZGl2IGNsYXNzPSJjd3NjLXRhYmxlLXdyYXAgY3dzYy1maXQtdGFibGUiPjx0YWJsZSBjbGFzcz0iY3dzYy1kYXRhLXRhYmxlIj4KICAgICAgICAgICAgPHRoZWFkPjx0cj48dGg+TW9kZWw8L3RoPjx0aD5FcXVhdGlvbjwvdGg+PHRoPlLCsjwvdGg+PHRoPlBhcmFtZXRlcnM8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+CiAgICAgICAgICAgIDx0cj48dGQ+TGluZWFyPC90ZD48dGQ+UyA9IFPigoAgKyBrIMOXICVDVzwvdGQ+PHRkPiR7Zm9ybWF0TnVtKGxpbmVhci5yMiwgNCl9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5T4oKAPSR7Zm9ybWF0TnVtKGxpbmVhci5TMCwgMSl9LCBrPSR7Zm9ybWF0TnVtKGxpbmVhci5rLCAzKX0gTVBhLyVDVzwvdGQ+PC90cj4KICAgICAgICAgICAgPHRyPjx0ZD5Qb3dlciBMYXc8L3RkPjx0ZD5TID0gU+KCgCArIEsgw5cgzrU8c3ViPnA8L3N1Yj48c3VwPm08L3N1cD48L3RkPjx0ZD4ke2Zvcm1hdE51bShwb3dlci5yMiwgNCl9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5T4oKAPSR7Zm9ybWF0TnVtKHBvd2VyLlMwLCAxKX0sIEs9JHtmb3JtYXROdW0ocG93ZXIuSywgMSl9LCBtPSR7Zm9ybWF0TnVtKHBvd2VyLm0sIDMpfTwvdGQ+PC90cj4KICAgICAgICAgICAgPHRyPjx0ZD5Qb2x5bm9taWFsICgybmQpPC90ZD48dGQ+UyA9IGEgKyBiwrclQ1cgKyBjwrclQ1fCsjwvdGQ+PHRkPiR7Zm9ybWF0TnVtKHBvbHkucjIsIDQpfTwvdGQ+CiAg\",\"ICAgICAgICAgICAgICA8dGQ+YT0ke2Zvcm1hdE51bShwb2x5LmEsIDEpfSwgYj0ke2Zvcm1hdE51bShwb2x5LmIsIDMpfSwgYz0ke2Zvcm1hdE51bShwb2x5LmMsIDUpfTwvdGQ+PC90cj4KICAgICAgICAgICAgPC90Ym9keT48L3RhYmxlPjwvZGl2PmA7CgogICAgICAgIGNvbnN0IGV4dHJhcENXID0gcmVhZE51bSgnZXh0cmFwb2xhdGVDVycpOwogICAgICAgIGxldCBleHRyYXBIdG1sID0gJyc7CiAgICAgICAgaWYgKGV4dHJhcENXICE9IG51bGwpIHsKICAgICAgICAgICAgY29uc3QgbWF4Q1cgPSBNYXRoLm1heCguLi5wb2ludHMubWFwKChwKSA9PiBwLmN3KSk7CiAgICAgICAgICAgIGlmIChleHRyYXBDVyA+IG1heENXKSB7CiAgICAgICAgICAgICAgICB3YXJuaW5ncy5wdXNoKCdFeHRyYXBvbGF0aW9uICVDVyAoJyArIGV4dHJhcENXICsgJyUpIGV4Y2VlZHMgbWF4aW11bSBleHBlcmltZW50YWwgZGF0YSAoJyArIG1heENXICsgJyUpLiBQcmVkaWN0aW9ucyBtYXkgYmUgdW5yZWxpYWJsZS4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBzTGluID0gbGluZWFyLnByZWRpY3QoZXh0cmFwQ1cpOwogICAgICAgICAgICBjb25zdCBlcHMgPSBNYXRoLmxvZygxIC8gKDEgLSBleHRyYXBDVyAvIDEwMCkpOwogICAgICAgICAgICBjb25zdCBzUG93ID0gcG93ZXIucHJlZGljdFN0cmFpbihlcHMpOwogICAgICAgICAgICBjb25zdCBzUG9seSA9IHBvbHkucHJlZGljdChleHRyYXBDVyk7CiAgICAgICAgICAgIGV4dHJhcEh0bWwgPSBgPGRpdiBjbGFzcz0iY3dzYy1yZXN1bHRzLWdyaWQiIHN0eWxlPSJtYXJnaW4tdG9wOjAuNzVyZW0iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY3dzYy1yZXN1bHQtaXRlbSI+PHNwYW4gY2xhc3M9ImN3c2MtcmVzdWx0LWxhYmVsIj5MaW5lYXIgcHJlZGljdGlvbiBhdCAke2V4dHJhcENXfSUgQ1c8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImN3c2MtcmVzdWx0LXZhbHVlIj4ke2Zvcm1hdE51bShzTGluLCAxKX0gTVBhPC9zcGFuPjwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY3dzYy1yZXN1bHQtaXRlbSI+PHNwYW4gY2xhc3M9ImN3c2MtcmVzdWx0LWxhYmVsIj5Qb3dlci1sYXcgcHJlZGljdGlvbjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY3dzYy1yZXN1bHQtdmFsdWUiPiR7Zm9ybWF0TnVtKHNQb3csIDEpfSBNUGE8L3NwYW4+PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjd3NjLXJlc3VsdC1pdGVtIGN3c2MtcmVzdWx0LWhpZ2hsaWdodCI+PHNwYW4gY2xhc3M9ImN3c2MtcmVzdWx0LWxhYmVsIj5Qb2x5bm9taWFsIHByZWRpY3Rpb248L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImN3c2MtcmVzdWx0LXZhbHVlIj4ke2Zvcm1hdE51bShzUG9seSwgMSl9IE1QYTwvc3Bhbj48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+YDsKICAgICAgICB9CgogICAgICAgIGNvbnN0IGNoYXJ0cyA9IFtidWlsZEN1cnZlRml0Q2hhcnQocG9pbnRzLCBsaW5lYXIsIHBvd2VyLCBwb2x5LCBzdHJlbmd0aFR5cGUpXTsKICAgICAgICAkKCdyZXN1bHRzQ29udGVudCcpLmlubmVySFRNTCA9IGZpdEh0bWwgKyBleHRyYXBIdG1sOwogICAgICAgIGlmICh3YXJuaW5ncy5sZW5ndGgpIHNob3dXYXJuaW5ncyh3YXJuaW5ncyk7CiAgICAgICAgcmVuZGVyUmVjb21tZW5kYXRpb25zKFsnQ29tcGFyZSBSwrIgdmFsdWVzIHRvIHNlbGVjdCB0aGUgbW9zdCBhcHByb3ByaWF0ZSBtb2RlbCBmb3IgeW91ciBkYXRhIHJhbmdlLicsICdEbyBub3QgYXNzdW1lIGxpbmVhciBzdHJlbmd0aGVuaW5nIG92ZXIgbGFyZ2UgY29sZCB3b3JrIHJhbmdlcy4nXSk7CiAgICAgICAgcmVuZGVyQ2hhcnRzKGNoYXJ0cyk7CiAgICAgICAgc2hvd1Jlc3VsdHMoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmaXRMaW5lYXIocG9pbnRzKSB7CiAgICAgICAgY29uc3QgbiA9IHBvaW50cy5sZW5ndGg7CiAgICAgICAgbGV0IHN1bVggPSAwLCBzdW1ZID0gMCwgc3VtWFkgPSAwLCBzdW1YMiA9IDAsIHN1bVkyID0gMDsKICAgICAgICBwb2ludHMuZm9yRWFjaCgocCkgPT4gewogICAgICAgICAgICBzdW1YICs9IHAuY3c7CiAgICAgICAgICAgIHN1bVkgKz0gcC5zOwogICAgICAgICAgICBzdW1YWSArPSBwLmN3ICogcC5zOwogICAgICAgICAgICBzdW1YMiArPSBwLmN3ICogcC5jdzsKICAgICAgICAgICAgc3VtWTIgKz0gcC5zICogcC5zOwogICAgICAgIH0pOwogICAgICAgIGNvbnN0IGRlbm9tID0gbiAqIHN1bVgyIC0gc3VtWCAqIHN1bVg7CiAgICAgICAgY29uc3QgayA9IGRlbm9tICE9PSAwID8gKG4gKiBzdW1YWSAtIHN1bVggKiBzdW1ZKSAvIGRlbm9tIDogMDsKICAgICAgICBjb25zdCBTMCA9IChzdW1ZIC0gayAqIHN1bVgpIC8gbjsKICAgICAgICBjb25zdCBzc1RvdCA9IHN1bVkyIC0gc3VtWSAqIHN1bVkgLyBuOwogICAgICAgIGxldCBzc1JlcyA9IDA7CiAgICAgICAgcG9pbnRzLmZvckVhY2goKHApID0+IHsgc3NSZXMgKz0gKHAucyAtIChTMCArIGsgKiBwLmN3KSkgKiogMjsgfSk7CiAgICAgICAgY29uc3QgcjIgPSBzc1RvdCA+IDAgPyAxIC0gc3NSZXMgLyBzc1RvdCA6IDE7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgUzAsIGssIHIyLAogICAgICAgICAgICBwcmVkaWN0KGN3KSB7IHJldHVybiBTMCArIGsgKiBjdzsgfQogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZml0UG93ZXJMYXcocG9pbnRzKSB7CiAgICAgICAgY29uc3QgcHRzID0gcG9pbnRzLm1hcCgocCkgPT4gewogICAgICAgICAgICBjb25zdCBlcHMgPSBNYXRoLmxvZygxIC8gKDEgLSBwLmN3IC8gMTAwKSk7CiAgICAgICAgICAgIHJldHVybiB7IGVwcywgczogcC5zLCBjdzogcC5jdyB9OwogICAgICAgIH0pLmZpbHRlcigocCkgPT4gcC5lcHMgPiAwKTsKCiAgICAgICAgaWYgKHB0cy5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgIHJldHVybiB7IFMwOiBwb2ludHNbMF0ucywgSzogMCwgbTogMSwgcjI6IDAsIHByZWRpY3RTdHJhaW4oZSkgeyByZXR1cm4gcG9pbnRzWzBdLnM7IH0gfTsKICAgICAgICB9CgogICAgICAgIGxldCBiZXN0ID0geyBTMDogcHRzWzBdLnMsIEs6IDEwMCwgbTogMC41LCByMjogLUluZmluaXR5IH07CiAgICAgICAgY29uc3QgUzBndWVzcyA9IHB0c1swXS5zOwoKICAgICAgICBmb3IgKGxldCBtID0gMC4yOyBtIDw9IDEuMjsgbSArPSAwLjA1KSB7CiAgICAgICAgICAgIGxldCBzdW1MID0gMCwgc3VtRSA9IDAsIHN1bUxFID0gMCwgc3VtRTIgPSAwOwogICAgICAgICAgICBwdHMuZm9yRWFjaCgocCkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgTCA9IHAucyAtIFMwZ3Vlc3M7CiAgICAgICAgICAgICAgICBpZiAoTCA8PSAwKSByZXR1cm47CiAgICAgICAgICAgICAgICBjb25zdCBFID0gTWF0aC5wb3cocC5lcHMsIG0pOwogICAgICAgICAgICAgICAgc3VtTCArPSBMOwogICAgICAgICAgICAgICAgc3VtRSArPSBFOwogICAgICAgICAgICAgICAgc3VtTEUgKz0gTCAqIEU7CiAgICAgICAgICAgICAgICBzdW1FMiArPSBFICogRTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnN0IGRlbm9tID0gcHRzLmxlbmd0aCAqIHN1bUUyIC0gc3VtRSAqIHN1bUU7CiAgICAgICAgICAgIGNvbnN0IEsgPSBkZW5vbSAhPT0gMCA\/IChwdHMubGVuZ3RoICogc3VtTEUgLSBzdW1MICogc3VtRSkgLyBkZW5vbSA6IDA7CiAgICAgICAgICAgIGxldCBzc1JlcyA9IDAsIHNzVG90ID0gMDsKICAgICAgICAgICAgY29uc3QgbWVhblMgPSBwdHMucmVkdWNlKChhLCBwKSA9PiBhICsgcC5zLCAwKSAvIHB0cy5sZW5ndGg7CiAgICAgICAgICAgIHB0cy5mb3JFYWNoKChwKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBwcmVkID0gUzBndWVzcyArIEsgKiBNYXRoLnBvdyhwLmVwcywgbSk7CiAgICAgICAgICAgICAgICBzc1JlcyArPSAocC5zIC0gcHJlZCkgKiogMjsKICAgICAgICAgICAgICAgIHNzVG90ICs9IChwLnMgLSBtZWFuUykgKiogMjsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnN0IHIyID0gc3NUb3QgPiAwID8gMSAtIHNzUmVzIC8gc3NUb3QgOiAwOwogICAgICAgICAgICBpZiAocjIgPiBiZXN0LnIyKSBiZXN0ID0geyBTMDogUzBndWVzcywgSywgbSwgcjIgfTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIC4uLmJlc3QsCiAgICAgICAgICAgIHByZWRpY3RTdHJhaW4oZXBzKSB7IHJldHVybiBiZXN0LlMwICsgYmVzdC5LICogTWF0aC5wb3coZXBzLCBiZXN0Lm0pOyB9CiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBmaXRQb2x5bm9taWFsKHBvaW50cykgewogICAgICAgIGNvbnN0IG4gPSBwb2ludHMubGVuZ3RoOwogICAgICAgIGNvbnN0IHggPSBwb2ludHMubWFwKChwKSA9PiBwLmN3KTsKICAgICAgICBjb25zdCB5ID0gcG9pbnRzLm1hcCgocCkgPT4gcC5zKTsKCiAgICAgICAgbGV0IHMwMCA9IG4sIHMwMSA9IDAsIHMwMiA9IDAs\",\"IHMwMyA9IDAsIHMwNCA9IDA7CiAgICAgICAgbGV0IHMxMSA9IDAsIHMxMiA9IDAsIHMxMyA9IDAsIHMyMiA9IDAsIHMyMyA9IDAsIHMzMyA9IDA7CiAgICAgICAgbGV0IHQwID0gMCwgdDEgPSAwLCB0MiA9IDA7CgogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IHhpID0geFtpXSwgeWkgPSB5W2ldOwogICAgICAgICAgICBjb25zdCB4aTIgPSB4aSAqIHhpLCB4aTMgPSB4aTIgKiB4aSwgeGk0ID0geGkyICogeGkyOwogICAgICAgICAgICBzMDEgKz0geGk7IHMwMiArPSB4aTI7IHMwMyArPSB4aTM7IHMwNCArPSB4aTQ7CiAgICAgICAgICAgIHMxMSArPSB4aTsgczEyICs9IHhpMjsgczEzICs9IHhpMzsKICAgICAgICAgICAgczIyICs9IHhpMjsgczIzICs9IHhpMzsgczMzICs9IHhpMzsKICAgICAgICAgICAgdDAgKz0geWk7IHQxICs9IHhpICogeWk7IHQyICs9IHhpMiAqIHlpOwogICAgICAgIH0KCiAgICAgICAgY29uc3QgYSA9IHMwMCwgYiA9IHMwMSwgYyA9IHMwMjsKICAgICAgICBjb25zdCBkZXQgPSBhICogKHMyMiAqIHMzMyAtIHMyMyAqIHMyMykgLSBiICogKHMxMiAqIHMzMyAtIHMxMyAqIHMyMykgKyBjICogKHMxMiAqIHMyMyAtIHMxMyAqIHMyMik7CiAgICAgICAgbGV0IGNvZWZBID0gMCwgY29lZkIgPSAwLCBjb2VmQyA9IDA7CgogICAgICAgIGlmIChNYXRoLmFicyhkZXQpID4gMWUtMTIpIHsKICAgICAgICAgICAgY29lZkEgPSAodDAgKiAoczIyICogczMzIC0gczIzICogczIzKSAtIHQxICogKHMxMiAqIHMzMyAtIHMxMyAqIHMyMykgKyB0MiAqIChzMTIgKiBzMjMgLSBzMTMgKiBzMjIpKSAvIGRldDsKICAgICAgICAgICAgY29lZkIgPSAoYSAqICh0MSAqIHMzMyAtIHQyICogczIzKSAtIGIgKiAodDAgKiBzMzMgLSB0MiAqIHMxMykgKyBjICogKHQwICogczIzIC0gdDEgKiBzMTMpKSAvIGRldDsKICAgICAgICAgICAgY29lZkMgPSAoYSAqIChzMjIgKiB0MiAtIHMyMyAqIHQxKSAtIGIgKiAoczEyICogdDIgLSBzMTMgKiB0MSkgKyBjICogKHMxMiAqIHQxIC0gczEzICogdDApKSAvIGRldDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBsaW4gPSBmaXRMaW5lYXIocG9pbnRzKTsKICAgICAgICAgICAgY29lZkEgPSBsaW4uUzA7IGNvZWZCID0gbGluLms7IGNvZWZDID0gMDsKICAgICAgICB9CgogICAgICAgIGNvbnN0IG1lYW5ZID0geS5yZWR1Y2UoKGEsIHYpID0+IGEgKyB2LCAwKSAvIG47CiAgICAgICAgbGV0IHNzVG90ID0gMCwgc3NSZXMgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IHByZWQgPSBjb2VmQSArIGNvZWZCICogeFtpXSArIGNvZWZDICogeFtpXSAqIHhbaV07CiAgICAgICAgICAgIHNzUmVzICs9ICh5W2ldIC0gcHJlZCkgKiogMjsKICAgICAgICAgICAgc3NUb3QgKz0gKHlbaV0gLSBtZWFuWSkgKiogMjsKICAgICAgICB9CiAgICAgICAgY29uc3QgcjIgPSBzc1RvdCA+IDAgPyAxIC0gc3NSZXMgLyBzc1RvdCA6IDE7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGE6IGNvZWZBLCBiOiBjb2VmQiwgYzogY29lZkMsIHIyLAogICAgICAgICAgICBwcmVkaWN0KGN3KSB7IHJldHVybiBjb2VmQSArIGNvZWZCICogY3cgKyBjb2VmQyAqIGN3ICogY3c7IH0KICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGJ1aWxkUmVjb21tZW5kYXRpb25zKHBjdENXLCBnYWluUGN0KSB7CiAgICAgICAgY29uc3QgcmVjID0gWwogICAgICAgICAgICAnVXNlIG1lYXN1cmVkIG1hdGVyaWFsIGRhdGEgd2hlbmV2ZXIgYXZhaWxhYmxlLicsCiAgICAgICAgICAgICdEbyBub3QgYXNzdW1lIGxpbmVhciBzdHJlbmd0aGVuaW5nIG92ZXIgbGFyZ2UgY29sZCB3b3JrIHJhbmdlcy4nLAogICAgICAgICAgICAnVXNlIHRoZSBzYW1lIHN0cmVuZ3RoIGRlZmluaXRpb24gd2hlbiBjb21wYXJpbmcgbWF0ZXJpYWxzLicKICAgICAgICBdOwogICAgICAgIGlmIChwY3RDVyAhPSBudWxsICYmIHBjdENXID4gNDApIHsKICAgICAgICAgICAgcmVjLnB1c2goJ0NvbnNpZGVyIHJlZHVjZWQgZHVjdGlsaXR5IHdoZW4gc3BlY2lmeWluZyBoaWdoIGNvbGQgd29yayBsZXZlbHMgKD40MCUpLicpOwogICAgICAgICAgICByZWMucHVzaCgnQ29uc2lkZXIgaW50ZXJtZWRpYXRlIGFubmVhbGluZyBmb3IgbXVsdGktc3RhZ2UgZm9ybWluZyBvcGVyYXRpb25zLicpOwogICAgICAgIH0KICAgICAgICBpZiAocGN0Q1cgIT0gbnVsbCAmJiBwY3RDVyA+IDYwKSB7CiAgICAgICAgICAgIHJlYy5wdXNoKCdDaGVjayByZXNpZHVhbCBzdHJlc3MgYWZ0ZXIgc2V2ZXJlIGZvcm1pbmcuJyk7CiAgICAgICAgfQogICAgICAgIGlmIChnYWluUGN0ICE9IG51bGwgJiYgZ2FpblBjdCA+IDgwKSB7CiAgICAgICAgICAgIHJlYy5wdXNoKCdMYXJnZSBzdHJlbmd0aCBnYWlucyBtYXkgY29ycmVsYXRlIHdpdGggc2lnbmlmaWNhbnQgZHVjdGlsaXR5IGxvc3Mg4oCUIHZlcmlmeSBmb3JtYWJpbGl0eSBsaW1pdHMuJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWM7CiAgICB9CgogICAgZnVuY3Rpb24gYnVpbGRNYWluQ2hhcnRzKHBjdENXLCBzMCwgc2YsIG1ldHJpY3MpIHsKICAgICAgICBjb25zdCBjaGFydHMgPSBbXTsKICAgICAgICBpZiAocGN0Q1cgIT0gbnVsbCAmJiBzMCAhPSBudWxsICYmIHNmICE9IG51bGwpIHsKICAgICAgICAgICAgY2hhcnRzLnB1c2goewogICAgICAgICAgICAgICAgdGl0bGU6ICdTdHJlbmd0aCB2cyBDb2xkIFdvcmsnLAogICAgICAgICAgICAgICAgc3ZnOiByZW5kZXJMaW5lQ2hhcnQoewogICAgICAgICAgICAgICAgICAgIHhMYWJlbDogJyVDVycsIHlMYWJlbDogc3RyZXNzVW5pdCgpLAogICAgICAgICAgICAgICAgICAgIHBvaW50czogW3sgeDogMCwgeTogQ09OVi5zdHJlc3NGcm9tSW50ZXJuYWwoczAsIHN0cmVzc1VuaXQoKSkgfSwgeyB4OiBwY3RDVywgeTogQ09OVi5zdHJlc3NGcm9tSW50ZXJuYWwoc2YsIHN0cmVzc1VuaXQoKSkgfV0sCiAgICAgICAgICAgICAgICAgICAgY3VydmVzOiBbXSwKICAgICAgICAgICAgICAgICAgICB4TWF4OiBNYXRoLm1heChwY3RDVyAqIDEuMiwgMTApCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKG1ldHJpY3MuZ2FpblBjdCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBjaGFydHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdTdHJlbmd0aCBHYWluIHZzIENvbGQgV29yaycsCiAgICAgICAgICAgICAgICAgICAgc3ZnOiByZW5kZXJMaW5lQ2hhcnQoewogICAgICAgICAgICAgICAgICAgICAgICB4TGFiZWw6ICclQ1cnLCB5TGFiZWw6ICdHYWluICglKScsCiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50czogW3sgeDogMCwgeTogMCB9LCB7IHg6IHBjdENXLCB5OiBtZXRyaWNzLmdhaW5QY3QgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgIHhNYXg6IE1hdGgubWF4KHBjdENXICogMS4yLCAxMCkKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNoYXJ0czsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZFByZWRpY3Rpb25DaGFydChjdywgczAsIHNmLCBrQ1csIHR5cGUsIGN3UHJlZCwgcHJlZGljdGVkKSB7CiAgICAgICAgY29uc3QgczBkID0gQ09OVi5zdHJlc3NGcm9tSW50ZXJuYWwoczAsIHN0cmVzc1VuaXQoKSk7CiAgICAgICAgY29uc3Qgc2ZkID0gQ09OVi5zdHJlc3NGcm9tSW50ZXJuYWwoc2YsIHN0cmVzc1VuaXQoKSk7CiAgICAgICAgY29uc3QgcHJlZCA9IENPTlYuc3RyZXNzRnJvbUludGVybmFsKHByZWRpY3RlZCwgc3RyZXNzVW5pdCgpKTsKICAgICAgICBjb25zdCBwdHMgPSBbeyB4OiAwLCB5OiBzMGQgfV07CiAgICAgICAgaWYgKGN3ID4gMCkgcHRzLnB1c2goeyB4OiBjdywgeTogc2ZkIH0pOwogICAgICAgIGNvbnN0IGN1cnZlUHRzID0gW107CiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPD0gTWF0aC5tYXgoY3dQcmVkLCBjdyB8fCAwKTsgeCArPSAyKSB7CiAgICAgICAgICAgIGN1cnZlUHRzLnB1c2goeyB4LCB5OiBzMGQgKyBrQ1cgKiB4IH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gW3sKICAgICAgICAgICAgdGl0bGU6ICdMaW5lYXIgTW9kZWwg4oCUIE1lYXN1cmVkIHZzIFByZWRpY3RlZCcsCiAgICAgICAgICAgIHN2ZzogcmVuZGVyTGluZUNoYXJ0KHsKICAgICAgICAgICAgICAgIHhMYWJlbDogJyVDVycsIHlMYWJlbDogc3RyZXNzVW5pdCgpLAogICAgICAgICAgICAgICAgcG9pbnRzOiBwdHMsCiAgICAgICAgICAgICAgICBjdXJ2ZXM6IFt7IHBvaW50czogY3VydmVQdHMsIGNvbG9yOiAnI2U2N2UyMicsIGRhc2hlZDogdHJ1ZSB9XSwKICAgICAgICAgICAgICAgIG1hcmtlcnM6IFt7IHg6IGN3UHJlZCwgeTogcHJlZCwgbGFiZWw6ICdQcmVkaWN0ZWQnIH1d\",\"LAogICAgICAgICAgICAgICAgeE1heDogTWF0aC5tYXgoY3dQcmVkICogMS4xLCAxMCkKICAgICAgICAgICAgfSkKICAgICAgICB9XTsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZENvbXBhcmlzb25DaGFydChtYXRlcmlhbHMpIHsKICAgICAgICBjb25zdCBiYXJzID0gbWF0ZXJpYWxzLm1hcCgobSkgPT4gKHsKICAgICAgICAgICAgbGFiZWw6IG0ubmFtZS5sZW5ndGggPiAxMiA\/IG0ubmFtZS5zbGljZSgwLCAxMSkgKyAn4oCmJyA6IG0ubmFtZSwKICAgICAgICAgICAgdmFsdWU6IENPTlYuc3RyZXNzRnJvbUludGVybmFsKG0uZGVsdGFTLCBzdHJlc3NVbml0KCkpLAogICAgICAgICAgICBjb2xvcjogJyMyNDcxYTMnCiAgICAgICAgfSkpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRpdGxlOiAnQWJzb2x1dGUgU3RyZW5ndGggSW5jcmVhc2UgQ29tcGFyaXNvbicsCiAgICAgICAgICAgIHN2ZzogcmVuZGVyQmFyQ2hhcnQoYmFycywgc3RyZXNzVW5pdCgpKQogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYnVpbGRDdXJ2ZUZpdENoYXJ0KHBvaW50cywgbGluZWFyLCBwb3dlciwgcG9seSwgc3RyZW5ndGhUeXBlKSB7CiAgICAgICAgY29uc3QgbGFiZWwgPSBzdHJlbmd0aFR5cGUgPT09ICd5aWVsZCcgPyAnWWllbGQnIDogJ1RlbnNpbGUnOwogICAgICAgIGNvbnN0IHB0cyA9IHBvaW50cy5tYXAoKHApID0+ICh7IHg6IHAuY3csIHk6IHAucyB9KSk7CiAgICAgICAgY29uc3QgbWF4Q1cgPSBNYXRoLm1heCguLi5wb2ludHMubWFwKChwKSA9PiBwLmN3KSkgKiAxLjE7CiAgICAgICAgY29uc3QgbGluQ3VydmUgPSBbXSwgcG93Q3VydmUgPSBbXSwgcG9seUN1cnZlID0gW107CiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPD0gbWF4Q1c7IHggKz0gMSkgewogICAgICAgICAgICBsaW5DdXJ2ZS5wdXNoKHsgeCwgeTogbGluZWFyLnByZWRpY3QoeCkgfSk7CiAgICAgICAgICAgIHBvbHlDdXJ2ZS5wdXNoKHsgeCwgeTogcG9seS5wcmVkaWN0KHgpIH0pOwogICAgICAgICAgICBjb25zdCBlcHMgPSBNYXRoLmxvZygxIC8gKDEgLSB4IC8gMTAwKSk7CiAgICAgICAgICAgIGlmICh4ID4gMCAmJiB4IDwgMTAwKSBwb3dDdXJ2ZS5wdXNoKHsgeCwgeTogcG93ZXIucHJlZGljdFN0cmFpbihlcHMpIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0aXRsZTogbGFiZWwgKyAnIFN0cmVuZ3RoIHZzIENvbGQgV29yayDigJQgRGF0YSAmIEZpdHMnLAogICAgICAgICAgICBzdmc6IHJlbmRlckxpbmVDaGFydCh7CiAgICAgICAgICAgICAgICB4TGFiZWw6ICclQ1cnLCB5TGFiZWw6ICdNUGEnLAogICAgICAgICAgICAgICAgcG9pbnRzOiBwdHMsCiAgICAgICAgICAgICAgICBjdXJ2ZXM6IFsKICAgICAgICAgICAgICAgICAgICB7IHBvaW50czogbGluQ3VydmUsIGNvbG9yOiAnIzI3YWU2MCcsIGRhc2hlZDogZmFsc2UgfSwKICAgICAgICAgICAgICAgICAgICB7IHBvaW50czogcG93Q3VydmUsIGNvbG9yOiAnI2U2N2UyMicsIGRhc2hlZDogdHJ1ZSB9LAogICAgICAgICAgICAgICAgICAgIHsgcG9pbnRzOiBwb2x5Q3VydmUsIGNvbG9yOiAnIzhlNDRhZCcsIGRhc2hlZDogdHJ1ZSB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgeE1heDogbWF4Q1cKICAgICAgICAgICAgfSkKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbmRlckxpbmVDaGFydChvcHRzKSB7CiAgICAgICAgY29uc3QgVyA9IDQ4MCwgSCA9IDI2MCwgcGFkID0geyB0OiAyMCwgcjogMjAsIGI6IDQwLCBsOiA1NSB9OwogICAgICAgIGNvbnN0IHBsb3RXID0gVyAtIHBhZC5sIC0gcGFkLnI7CiAgICAgICAgY29uc3QgcGxvdEggPSBIIC0gcGFkLnQgLSBwYWQuYjsKCiAgICAgICAgbGV0IHlNYXggPSAwOwogICAgICAgIG9wdHMucG9pbnRzLmZvckVhY2goKHApID0+IHsgeU1heCA9IE1hdGgubWF4KHlNYXgsIHAueSk7IH0pOwogICAgICAgIChvcHRzLmN1cnZlcyB8fCBbXSkuZm9yRWFjaCgoYykgPT4gYy5wb2ludHMuZm9yRWFjaCgocCkgPT4geyB5TWF4ID0gTWF0aC5tYXgoeU1heCwgcC55KTsgfSkpOwogICAgICAgIChvcHRzLm1hcmtlcnMgfHwgW10pLmZvckVhY2goKG0pID0+IHsgeU1heCA9IE1hdGgubWF4KHlNYXgsIG0ueSk7IH0pOwogICAgICAgIHlNYXggKj0gMS4xOwogICAgICAgIGlmICh5TWF4IDw9IDApIHlNYXggPSAxMDA7CgogICAgICAgIGNvbnN0IHhNYXggPSBvcHRzLnhNYXggfHwgMTAwOwoKICAgICAgICBmdW5jdGlvbiBzeCh4KSB7IHJldHVybiBwYWQubCArICh4IC8geE1heCkgKiBwbG90VzsgfQogICAgICAgIGZ1bmN0aW9uIHN5KHkpIHsgcmV0dXJuIHBhZC50ICsgcGxvdEggLSAoeSAvIHlNYXgpICogcGxvdEg7IH0KCiAgICAgICAgbGV0IHN2ZyA9IGA8c3ZnIGNsYXNzPSJjd3NjLWNoYXJ0IiB2aWV3Qm94PSIwIDAgJHtXfSAke0h9IiBhcmlhLWhpZGRlbj0idHJ1ZSI+YDsKICAgICAgICBzdmcgKz0gYDxyZWN0IHg9IiR7cGFkLmx9IiB5PSIke3BhZC50fSIgd2lkdGg9IiR7cGxvdFd9IiBoZWlnaHQ9IiR7cGxvdEh9IiBmaWxsPSIjZmFmYmZjIiBzdHJva2U9IiNkNWRiZGIiLz5gOwoKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSA0OyBpKyspIHsKICAgICAgICAgICAgY29uc3QgeSA9ICh5TWF4IC8gNCkgKiBpOwogICAgICAgICAgICBjb25zdCB5eSA9IHN5KHkpOwogICAgICAgICAgICBzdmcgKz0gYDxsaW5lIHgxPSIke3BhZC5sfSIgeTE9IiR7eXl9IiB4Mj0iJHtwYWQubCArIHBsb3RXfSIgeTI9IiR7eXl9IiBzdHJva2U9IiNlY2YwZjEiLz5gOwogICAgICAgICAgICBzdmcgKz0gYDx0ZXh0IHg9IiR7cGFkLmwgLSA2fSIgeT0iJHt5eSArIDR9IiB0ZXh0LWFuY2hvcj0iZW5kIiBmb250LXNpemU9IjkiIGZpbGw9IiM1ZDZkN2UiPiR7Zm9ybWF0TnVtKHksIDApfTwvdGV4dD5gOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSA0OyBpKyspIHsKICAgICAgICAgICAgY29uc3QgeCA9ICh4TWF4IC8gNCkgKiBpOwogICAgICAgICAgICBjb25zdCB4eCA9IHN4KHgpOwogICAgICAgICAgICBzdmcgKz0gYDx0ZXh0IHg9IiR7eHh9IiB5PSIke0ggLSA4fSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI5IiBmaWxsPSIjNWQ2ZDdlIj4ke2Zvcm1hdE51bSh4LCAwKX08L3RleHQ+YDsKICAgICAgICB9CgogICAgICAgIHN2ZyArPSBgPHRleHQgeD0iJHtXIC8gMn0iIHk9IiR7SCAtIDJ9IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEwIiBmaWxsPSIjMmMzZTUwIj4ke29wdHMueExhYmVsfTwvdGV4dD5gOwogICAgICAgIHN2ZyArPSBgPHRleHQgeD0iMTIiIHk9IiR7SCAvIDJ9IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEwIiBmaWxsPSIjMmMzZTUwIiB0cmFuc2Zvcm09InJvdGF0ZSgtOTAgMTIgJHtIIC8gMn0pIj4ke29wdHMueUxhYmVsfTwvdGV4dD5gOwoKICAgICAgICAob3B0cy5jdXJ2ZXMgfHwgW10pLmZvckVhY2goKGN1cnZlKSA9PiB7CiAgICAgICAgICAgIGlmIChjdXJ2ZS5wb2ludHMubGVuZ3RoIDwgMikgcmV0dXJuOwogICAgICAgICAgICBjb25zdCBkID0gY3VydmUucG9pbnRzLm1hcCgocCwgaSkgPT4gKGkgPT09IDAgPyAnTScgOiAnTCcpICsgc3gocC54KS50b0ZpeGVkKDEpICsgJywnICsgc3kocC55KS50b0ZpeGVkKDEpKS5qb2luKCcgJyk7CiAgICAgICAgICAgIHN2ZyArPSBgPHBhdGggZD0iJHtkfSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIke2N1cnZlLmNvbG9yIHx8ICcjZTY3ZTIyJ30iIHN0cm9rZS13aWR0aD0iMiIgJHtjdXJ2ZS5kYXNoZWQgPyAnc3Ryb2tlLWRhc2hhcnJheT0iNiw0IicgOiAnJ30vPmA7CiAgICAgICAgfSk7CgogICAgICAgIG9wdHMucG9pbnRzLmZvckVhY2goKHApID0+IHsKICAgICAgICAgICAgc3ZnICs9IGA8Y2lyY2xlIGN4PSIke3N4KHAueCl9IiBjeT0iJHtzeShwLnkpfSIgcj0iNSIgZmlsbD0iIzFhNTI3NiIvPmA7CiAgICAgICAgfSk7CgogICAgICAgIChvcHRzLm1hcmtlcnMgfHwgW10pLmZvckVhY2goKG0pID0+IHsKICAgICAgICAgICAgc3ZnICs9IGA8Y2lyY2xlIGN4PSIke3N4KG0ueCl9IiBjeT0iJHtzeShtLnkpfSIgcj0iNSIgZmlsbD0iI2U2N2UyMiIvPmA7CiAgICAgICAgfSk7CgogICAgICAgIHN2ZyArPSAnPC9zdmc+JzsKICAgICAgICByZXR1cm4gc3ZnOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbmRlckJhckNoYXJ0KGJhcnMsIHlMYWJlbCkgewogICAgICAgIGNvbnN0IFcgPSA0ODAsIEggPSAyNjAsIHBhZCA9IHsgdDogMjAsIHI6IDIwLCBiOiA1MCwgbDogNTUgfTsKICAgICAgICBjb25zdCBwbG90VyA9IFcgLSBwYWQubCAtIHBhZC5yOwogICAgICAgIGNvbnN0IHBsb3RIID0gSCAtIHBhZC50IC0gcGFkLmI7CiAgICAgICAgY29uc3QgeU1heCA9IE1hdGgubWF4KC4uLmJhcnMubWFwKChiKSA9PiBiLnZhbHVlKSkgKiAxLjE1IHx8IDEwMDsKICAgICAgICBjb25zdCBiYXJXID0gcGxvdFcgLyBiYXJzLmxlbmd0aCAqIDAuNjsKICAg\",\"ICAgICBjb25zdCBnYXAgPSBwbG90VyAvIGJhcnMubGVuZ3RoOwoKICAgICAgICBsZXQgc3ZnID0gYDxzdmcgY2xhc3M9ImN3c2MtY2hhcnQiIHZpZXdCb3g9IjAgMCAke1d9ICR7SH0iIGFyaWEtaGlkZGVuPSJ0cnVlIj5gOwogICAgICAgIHN2ZyArPSBgPHJlY3QgeD0iJHtwYWQubH0iIHk9IiR7cGFkLnR9IiB3aWR0aD0iJHtwbG90V30iIGhlaWdodD0iJHtwbG90SH0iIGZpbGw9IiNmYWZiZmMiIHN0cm9rZT0iI2Q1ZGJkYiIvPmA7CgogICAgICAgIGJhcnMuZm9yRWFjaCgoYmFyLCBpKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGJoID0gKGJhci52YWx1ZSAvIHlNYXgpICogcGxvdEg7CiAgICAgICAgICAgIGNvbnN0IHggPSBwYWQubCArIGdhcCAqIGkgKyAoZ2FwIC0gYmFyVykgLyAyOwogICAgICAgICAgICBjb25zdCB5ID0gcGFkLnQgKyBwbG90SCAtIGJoOwogICAgICAgICAgICBzdmcgKz0gYDxyZWN0IHg9IiR7eH0iIHk9IiR7eX0iIHdpZHRoPSIke2Jhcld9IiBoZWlnaHQ9IiR7Ymh9IiBmaWxsPSIke2Jhci5jb2xvcn0iIHJ4PSIzIi8+YDsKICAgICAgICAgICAgc3ZnICs9IGA8dGV4dCB4PSIke3ggKyBiYXJXIC8gMn0iIHk9IiR7SCAtIDEyfSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI4IiBmaWxsPSIjMmMzZTUwIj4ke2Jhci5sYWJlbH08L3RleHQ+YDsKICAgICAgICB9KTsKCiAgICAgICAgc3ZnICs9IGA8dGV4dCB4PSIxMiIgeT0iJHtIIC8gMn0iIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTAiIGZpbGw9IiMyYzNlNTAiIHRyYW5zZm9ybT0icm90YXRlKC05MCAxMiAke0ggLyAyfSkiPiR7eUxhYmVsfTwvdGV4dD5gOwogICAgICAgIHN2ZyArPSAnPC9zdmc+JzsKICAgICAgICByZXR1cm4gc3ZnOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbmRlclJlc3VsdHMoaXRlbXMsIHJlY29tbWVuZGF0aW9ucywgY2hhcnRzKSB7CiAgICAgICAgY29uc3QgZ3JpZCA9IGl0ZW1zLm1hcCgoaXRlbSkgPT4gYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjd3NjLXJlc3VsdC1pdGVtJHtpdGVtLmhpZ2hsaWdodCA\/ICcgY3dzYy1yZXN1bHQtaGlnaGxpZ2h0JyA6ICcnfSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY3dzYy1yZXN1bHQtbGFiZWwiPiR7aXRlbS5sYWJlbH08L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY3dzYy1yZXN1bHQtdmFsdWUiPiR7aXRlbS52YWx1ZX08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIGApLmpvaW4oJycpOwogICAgICAgICQoJ3Jlc3VsdHNDb250ZW50JykuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9ImN3c2MtcmVzdWx0cy1ncmlkIj4ke2dyaWR9PC9kaXY+YDsKICAgICAgICByZW5kZXJSZWNvbW1lbmRhdGlvbnMocmVjb21tZW5kYXRpb25zKTsKICAgICAgICByZW5kZXJDaGFydHMoY2hhcnRzKTsKICAgICAgICBzaG93UmVzdWx0cygpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbmRlclJlY29tbWVuZGF0aW9ucygpIHt9CgogICAgZnVuY3Rpb24gcmVuZGVyQ2hhcnRzKCkge30KCiAgICBmdW5jdGlvbiBzaG93UmVzdWx0cygpIHsKICAgICAgICByZXN1bHRzUGFuZWwuY2xhc3NMaXN0LnJlbW92ZSgnY3dzYy1oaWRkZW4nKTsKICAgICAgICByZXN1bHRzUGFuZWwuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnbmVhcmVzdCcgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gaGlkZVJlc3VsdHMoKSB7CiAgICAgICAgcmVzdWx0c1BhbmVsLmNsYXNzTGlzdC5hZGQoJ2N3c2MtaGlkZGVuJyk7CiAgICAgICAgJCgncmVzdWx0c0NvbnRlbnQnKS5pbm5lckhUTUwgPSAnJzsKICAgICAgICBoaWRlTWVzc2FnZXMoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBoaWRlTWVzc2FnZXMoKSB7CiAgICAgICAgJCgnbWVzc2FnZXMnKS5pbm5lckhUTUwgPSAnJzsKICAgIH0KCiAgICBmdW5jdGlvbiBzaG93RXJyb3JzKGVycm9ycykgewogICAgICAgICQoJ21lc3NhZ2VzJykuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9ImN3c2MtYWxlcnQgY3dzYy1hbGVydC1lcnJvciI+PHN0cm9uZz5QbGVhc2UgY29ycmVjdCB0aGUgZm9sbG93aW5nOjwvc3Ryb25nPjx1bD5gICsKICAgICAgICAgICAgZXJyb3JzLm1hcCgoZSkgPT4gJzxsaT4nICsgZSArICc8L2xpPicpLmpvaW4oJycpICsgJzwvdWw+PC9kaXY+JzsKICAgIH0KCiAgICBmdW5jdGlvbiBzaG93V2FybmluZ3Mod2FybmluZ3MpIHsKICAgICAgICBjb25zdCBleGlzdGluZyA9ICQoJ21lc3NhZ2VzJykuaW5uZXJIVE1MOwogICAgICAgICQoJ21lc3NhZ2VzJykuaW5uZXJIVE1MID0gZXhpc3RpbmcgKwogICAgICAgICAgICBgPGRpdiBjbGFzcz0iY3dzYy1hbGVydCBjd3NjLWFsZXJ0LXdhcm4iPjxzdHJvbmc+V2FybmluZ3M6PC9zdHJvbmc+PHVsPmAgKwogICAgICAgICAgICB3YXJuaW5ncy5tYXAoKHcpID0+ICc8bGk+JyArIHcgKyAnPC9saT4nKS5qb2luKCcnKSArICc8L3VsPjwvZGl2Pic7CiAgICB9CgogICAgaW5pdCgpOwp9KSgpOwo=\"];\n    var bin=atob(p.join(''));\n    var bytes=new Uint8Array(bin.length);\n    for(var i=0;i<bin.length;i++){bytes[i]=bin.charCodeAt(i);}\n    var src=new TextDecoder('utf-8').decode(bytes);\n    (new Function(src))();\n  }catch(e){\n    console.error('Cold Work Strengthening Coefficient Calculator load error:',e);\n  }\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>The Cold Work Strengthening Coefficient Calculator is a practical engineering tool designed to evaluate how plastic deformation during cold working affects material strength. It helps&#8230;<\/p>","protected":false},"author":2,"featured_media":24850,"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":[8702,2408,8703,8704],"class_list":["post-24849","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-materials-science-and-properties","tag-cold-work","tag-metal-forming","tag-strengthening-coefficient","tag-work-hardening","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/09\/Cold-Work-Strengthening-Coefficient-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts\/24849","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/comments?post=24849"}],"version-history":[{"count":1,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts\/24849\/revisions"}],"predecessor-version":[{"id":24851,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/posts\/24849\/revisions\/24851"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/media\/24850"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/media?parent=24849"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/categories?post=24849"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/pt\/wp-json\/wp\/v2\/tags?post=24849"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}