{"id":64,"date":"2026-06-14T17:38:27","date_gmt":"2026-06-14T16:38:27","guid":{"rendered":"https:\/\/syncfinanceng.com\/internal\/register\/"},"modified":"2026-06-14T17:38:27","modified_gmt":"2026-06-14T16:38:27","slug":"register","status":"publish","type":"page","link":"https:\/\/syncfinanceng.com\/internal\/register\/","title":{"rendered":"Start Free Trial"},"content":{"rendered":"<div class=\"collab-page-guide\" data-collab-page-guide=\"sc-collab_register\" data-authored=\"0\" role=\"region\" aria-label=\"How to use this page\"><style>.collab-page-guide{background:#f0f7ff;border:1px solid #c7d8f1;border-radius:12px;margin:14px 0 18px;max-width:1100px;font-size:13.5px;line-height:1.55;color:#0a1838}.collab-page-guide summary{cursor:pointer;list-style:none;padding:12px 16px;font-weight:700;display:flex;gap:8px;align-items:center}.collab-page-guide summary::-webkit-details-marker{display:none}.collab-page-guide summary small{font-weight:500;color:#475569;margin-left:4px}.collab-page-guide summary .cpg-t{margin-left:auto;font-size:11px;color:#1e40af;font-weight:700}.collab-page-guide ol{margin:0;padding:0 18px 14px 38px}.collab-page-guide li{margin:4px 0}<\/style><details open data-key=\"collab_page_guide_sc-collab_register\"><summary><span aria-hidden=\"true\">\ud83d\udcd8<\/span><span>Register Now \u2014 how to use this page<\/span><small>What you can do on this page.<\/small><span class=\"cpg-t\">\u25be show \/ hide<\/span><\/summary><ol><li>To start something, click <b>Add another company<\/b>, <b>Create workspace &amp; sign in<\/b>.<\/li><li>Missing a button or section you expected? You may need to sign in, or this page may not be open to you \u2014 contact the organisation that gave you this link.<\/li><li>This guide remembers whether you collapsed it; click its heading to hide or show it.<\/li><\/ol><\/details><script>(function(){try{var d=document.querySelector('[data-key=\"collab_page_guide_sc-collab_register\"]');if(!d)return;if(localStorage.getItem(d.dataset.key)===\"0\")d.removeAttribute(\"open\");d.addEventListener(\"toggle\",function(){try{localStorage.setItem(d.dataset.key,d.open?\"1\":\"0\")}catch(e){}})}catch(e){}})();<\/script><\/div><div class=\"collab-register-app\" id=\"collab-register-app\" style=\"--r-brand:#770303\">\n\n  <style>\n    \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 Registration \u2014 self-contained design system (scoped to #collab-register-app) \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n    #collab-register-app, #collab-register-app *, #collab-register-app *::before, #collab-register-app *::after { box-sizing: border-box; }\n    #collab-register-app {\n      --r-ink:#0a1838; --r-text:#26365c; --r-muted:#5b6b8c; --r-line:#e1e8f5; --r-line2:#c5d1ea; --r-soft:#f4f7fd; --r-soft2:#eaf1fc;\n      --r-blue:#2563eb; --r-blue-d:#1d4ed8; --r-sky:#38b6ff; --r-orange:#ff8c2a; --r-green:#12a150; --r-green-t:#0b7a3e; --r-red:#c42b3b; --r-amber:#9a5b00;\n      --r-radius:20px; --r-shadow:0 18px 50px rgba(10,24,56,.10);\n      --c-text:var(--r-ink); --c-text-3:var(--r-muted); --c-border:var(--r-line); --c-brand:var(--r-blue); --c-elevated:var(--r-soft); --c-card:#fff; --c-red:var(--r-red); --c-green:var(--r-green);\n      font-family:'Plus Jakarta Sans','Segoe UI',system-ui,-apple-system,Roboto,'Helvetica Neue',Arial,sans-serif;\n      font-size:15px; line-height:1.55; color:var(--r-text);\n      \/* v4.9.414 \u2014 full-width page. WHY: the old 1160px cap (plus the theme's own content column wrapping the shortcode) left the\n         registration page as a narrow strip on wide screens. width:100vw + the calc() margin breaks out of ANY parent container\n         without needing a theme template change; the body:has() rule below stops the 100vw scrollbar-width overshoot from\n         producing a horizontal scrollbar. *\/\n      width:100vw; max-width:100vw; margin:0 0 0 calc(50% - 50vw); padding:32px clamp(16px,3.2vw,56px) 72px; overflow-x:hidden; text-align:left;\n      -webkit-font-smoothing:antialiased;\n    }\n    body:has(#collab-register-app) { overflow-x:clip; }\n    \/* The auto-inserted page guide sits just above the app inside the theme column \u2014 break it out to the same full width and\n       padding so the two edges line up instead of the guide floating as a narrow box over a wide page. *\/\n    body:has(#collab-register-app) .collab-page-guide { max-width:none; width:100vw; margin:14px 0 18px calc(50% - 50vw); border-radius:0; border-left:0; border-right:0; padding-left:clamp(16px,3.2vw,56px); padding-right:clamp(16px,3.2vw,56px); box-sizing:border-box; }\n    #collab-register-app h1, #collab-register-app h2, #collab-register-app h3, #collab-register-app p, #collab-register-app ul, #collab-register-app ol { margin:0; padding:0; font-family:inherit; }\n    #collab-register-app ul, #collab-register-app ol { list-style:none; }\n    #collab-register-app a { color:var(--r-blue); }\n    #collab-register-app .ico { flex:none; display:inline-block; vertical-align:middle; }\n    @keyframes collabPulseReg { 0%,100%{box-shadow:0 8px 24px rgba(56,139,255,.3),0 0 0 1px rgba(255,255,255,.14)} 50%{box-shadow:0 8px 32px rgba(56,139,255,.5),0 0 0 1px rgba(56,139,255,.45)} }\n    @keyframes regRise { from{opacity:0;transform:translateY(12px)} to{opacity:1;transform:none} }\n    @keyframes regSpin { to{transform:rotate(360deg)} }\n\n    \/* \u2500\u2500 Hero \u2500\u2500 *\/\n    #collab-register-app .reg-hero { position:relative; overflow:hidden; border-radius:26px; color:#fff; padding:38px 44px 74px; display:flex; justify-content:space-between; align-items:flex-start; gap:28px;\n      background:radial-gradient(900px 340px at 12% -10%, rgba(56,139,255,.40), transparent 60%), radial-gradient(700px 300px at 100% 110%, rgba(255,140,42,.30), transparent 60%), radial-gradient(500px 240px at 60% 120%, rgba(18,161,80,.22), transparent 60%),\n        linear-gradient(135deg,#071229 0%, var(--r-brand) 58%, #17306a 100%); animation:regRise .5s both; }\n    #collab-register-app .reg-hero::after { content:''; position:absolute; inset:0; pointer-events:none; opacity:.5;\n      background-image:linear-gradient(rgba(255,255,255,.05) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,.05) 1px, transparent 1px); background-size:44px 44px; -webkit-mask-image:linear-gradient(180deg,#000 0%,transparent 85%); mask-image:linear-gradient(180deg,#000 0%,transparent 85%); }\n    #collab-register-app .reg-hero > * { position:relative; z-index:1; }\n    #collab-register-app .reg-logo { display:flex; width:max-content; margin-bottom:18px; color:#fff !important; text-decoration:none !important; font-weight:800; }\n    #collab-register-app .reg-logo img { width:58px; height:58px; border-radius:15px; object-fit:contain; background:#050d1a; animation:collabPulseReg 3s ease-in-out infinite; }\n    #collab-register-app .reg-eyebrow { display:inline-flex; align-items:center; gap:7px; font-size:12px; font-weight:800; letter-spacing:.09em; text-transform:uppercase; color:#ffd2a6; margin-bottom:10px; }\n    #collab-register-app .reg-eyebrow::before { content:''; width:7px; height:7px; border-radius:50%; background:var(--r-orange); box-shadow:0 0 0 4px rgba(255,140,42,.25); }\n    #collab-register-app .reg-title { font-size:clamp(28px,4.2vw,42px); line-height:1.12; font-weight:800; letter-spacing:-.025em; color:#fff; margin:0 0 12px; }\n    #collab-register-app .reg-tagline { font-size:15.5px; color:#d3def5; max-width:620px; }\n    #collab-register-app .reg-chips { display:flex; flex-wrap:wrap; gap:8px 10px; margin-top:18px; }\n    #collab-register-app .reg-chips li { display:inline-flex; align-items:center; gap:7px; padding:7px 13px; border-radius:99px; font-size:12.5px; font-weight:600; color:#fff; background:rgba(255,255,255,.10); border:1px solid rgba(255,255,255,.22); }\n    #collab-register-app .reg-chips li .ico { color:#4be3a5; }\n    #collab-register-app .reg-hero-side { text-align:right; flex:none; padding-top:6px; }\n    #collab-register-app .reg-hero-side span { display:block; font-size:13px; color:#c3d2f0; margin-bottom:8px; }\n    #collab-register-app .reg-signin { display:inline-flex; align-items:center; gap:8px; padding:11px 20px; border-radius:12px; font-weight:700; font-size:14px; text-decoration:none; color:#fff !important; background:rgba(255,255,255,.12); border:1px solid rgba(255,255,255,.34); transition:background .15s,transform .15s; }\n    #collab-register-app .reg-signin:hover { background:rgba(255,255,255,.22); transform:translateY(-1px); }\n\n    \/* \u2500\u2500 Layout \u2500\u2500 *\/\n    #collab-register-app .reg-layout { display:grid; grid-template-columns:minmax(0,1fr) clamp(330px,26vw,420px); gap:clamp(22px,2.2vw,36px); margin-top:-46px; position:relative; z-index:2; align-items:start; }\n    #collab-register-app .reg-main { min-width:0; }\n    #collab-register-app .reg-aside { position:sticky; top:20px; display:flex; flex-direction:column; gap:18px; min-width:0; animation:regRise .6s .1s both; }\n\n    \/* \u2500\u2500 Stepper \u2500\u2500 *\/\n    #collab-register-app .register-steps { scroll-margin-top:20px; display:flex; background:#fff; border:1px solid var(--r-line); border-radius:var(--r-radius) var(--r-radius) 0 0; border-bottom:0; padding:22px 28px 18px; box-shadow:var(--r-shadow); animation:regRise .55s .05s both; counter-reset:none; }\n    #collab-register-app .step-indicator { position:relative; flex:1; display:flex; align-items:center; gap:12px; min-width:0; }\n    #collab-register-app .step-indicator:not(:last-child)::after { content:''; flex:1; height:3px; margin:0 14px; border-radius:3px; background:var(--r-line); transition:background .3s; }\n    #collab-register-app .step-indicator.done:not(:last-child)::after { background:linear-gradient(90deg,var(--r-green),var(--r-green)); }\n    #collab-register-app .step-circle { flex:none; width:40px; height:40px; border-radius:50%; display:grid; place-items:center; font-weight:800; font-size:15px; color:var(--r-muted); background:#fff; border:2px solid var(--r-line2); transition:all .25s; }\n    #collab-register-app .step-indicator.active .step-circle { color:#fff; background:var(--r-blue); border-color:var(--r-blue); box-shadow:0 0 0 5px rgba(37,99,235,.16); }\n    #collab-register-app .step-indicator.done .step-circle { font-size:0; background:var(--r-green); border-color:var(--r-green); }\n    #collab-register-app .step-indicator.done .step-circle::after { content:''; width:11px; height:6px; margin-top:-3px; border-left:2.5px solid #fff; border-bottom:2.5px solid #fff; transform:rotate(-45deg); }\n    #collab-register-app .step-text { display:flex; flex-direction:column; min-width:0; overflow:hidden; }\n    #collab-register-app .step-label { font-weight:700; font-size:14px; color:var(--r-muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }\n    #collab-register-app .step-sub { font-size:12px; color:var(--r-muted); white-space:nowrap; }\n    #collab-register-app .step-indicator.active .step-label, #collab-register-app .step-indicator.done .step-label { color:var(--r-ink); }\n\n    \/* \u2500\u2500 Cards & sections \u2500\u2500 *\/\n    #collab-register-app .card { background:#fff; border:1px solid var(--r-line); border-radius:0 0 var(--r-radius) var(--r-radius); box-shadow:var(--r-shadow); padding:8px 30px 30px; animation:regRise .55s .08s both; }\n    #collab-register-app .card-head { padding:22px 0 20px; border-bottom:1px solid var(--r-line); margin-bottom:6px; }\n    #collab-register-app .kicker { display:block; font-size:12px; font-weight:800; letter-spacing:.09em; text-transform:uppercase; color:var(--r-blue); margin-bottom:6px; }\n    #collab-register-app .card-head h2 { font-size:25px; line-height:1.2; font-weight:800; letter-spacing:-.02em; color:var(--r-ink); margin:0 0 8px; }\n    #collab-register-app .card-head p { color:var(--r-muted); max-width:660px; }\n    #collab-register-app .card-head p strong { color:var(--r-text); }\n    #collab-register-app .reg-section { padding:24px 0 4px; }\n    #collab-register-app .reg-section + .reg-section { border-top:1px solid var(--r-line); margin-top:12px; }\n    #collab-register-app .reg-section-head { display:flex; align-items:center; gap:12px; margin-bottom:18px; }\n    #collab-register-app .reg-section-head .badge { flex:none; width:38px; height:38px; border-radius:11px; display:grid; place-items:center; color:var(--r-blue); background:var(--r-soft2); }\n    #collab-register-app .reg-section-head h3 { font-size:16px; font-weight:800; color:var(--r-ink); letter-spacing:-.01em; }\n    #collab-register-app .reg-section-head p { font-size:13px; color:var(--r-muted); }\n    #collab-register-app .grid-2 { display:grid; grid-template-columns:1fr 1fr; gap:0 20px; }\n\n    \/* \u2500\u2500 Fields \u2500\u2500 *\/\n    #collab-register-app .form-group { margin:0 0 18px; min-width:0; }\n    #collab-register-app .form-label { display:block; margin:0 0 7px; font-size:13.5px; font-weight:700; color:var(--r-ink); }\n    #collab-register-app .form-label .opt { font-weight:500; color:var(--r-muted); }\n    #collab-register-app .req { color:var(--r-red); font-weight:800; }\n    #collab-register-app .form-control { display:block; width:100%; height:48px; margin:0; padding:0 14px; font:inherit; font-size:15px; color:var(--r-ink); background-color:#fff; border:1.5px solid var(--r-line2); border-radius:12px; box-shadow:none; outline:0; -webkit-appearance:none; appearance:none; transition:border-color .15s, box-shadow .15s, background-color .15s; }\n    #collab-register-app select.form-control { padding-right:42px; cursor:pointer; background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24' fill='none' stroke='%235b6b8c' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'\/%3E%3C\/svg%3E\"); background-repeat:no-repeat; background-position:right 14px center; background-size:16px; }\n    #collab-register-app .form-control::placeholder { color:#74829f; opacity:1; }\n    #collab-register-app .form-control:hover { border-color:#97aad3; }\n    #collab-register-app .form-control:focus { border-color:var(--r-blue); box-shadow:0 0 0 4px rgba(37,99,235,.16); }\n    #collab-register-app .form-control.is-invalid { border-color:var(--r-red); background-color:#fff8f8; }\n    #collab-register-app .form-control.is-invalid:focus { box-shadow:0 0 0 4px rgba(196,43,59,.16); }\n    #collab-register-app .field-error { display:flex; align-items:flex-start; gap:6px; margin-top:7px; font-size:12.5px; font-weight:600; color:var(--r-red); }\n    #collab-register-app .field-error::before { content:'!'; flex:none; width:16px; height:16px; margin-top:1px; border-radius:50%; background:var(--r-red); color:#fff; font-size:11px; font-weight:800; display:grid; place-items:center; }\n    #collab-register-app .form-hint { margin:7px 0 0; font-size:12.5px; color:var(--r-muted); }\n    #collab-register-app .form-hint code { font-size:11.5px; background:var(--r-soft); border:1px solid var(--r-line); border-radius:6px; padding:1px 6px; color:var(--r-text); }\n\n    \/* company-type cards *\/\n    #collab-register-app .choice-grid { display:grid; grid-template-columns:1fr 1fr; gap:14px; margin-top:2px; }\n    #collab-register-app .choice { position:relative; display:block; cursor:pointer; margin:0; }\n    #collab-register-app .choice input { position:absolute; opacity:0; width:1px; height:1px; }\n    #collab-register-app .choice-body { display:flex; gap:13px; align-items:flex-start; height:100%; padding:16px; border:1.5px solid var(--r-line2); border-radius:14px; background:#fff; transition:border-color .15s, box-shadow .15s, background .15s; }\n    #collab-register-app .choice-body .badge { flex:none; width:40px; height:40px; border-radius:12px; display:grid; place-items:center; background:var(--r-soft2); color:var(--r-blue); }\n    #collab-register-app .choice-body strong { display:block; color:var(--r-ink); font-size:14.5px; }\n    #collab-register-app .choice-body small { display:block; margin-top:2px; font-size:12.5px; color:var(--r-muted); line-height:1.45; }\n    #collab-register-app .choice-body::after { content:''; flex:none; margin-left:auto; width:20px; height:20px; border-radius:50%; border:2px solid var(--r-line2); background:#fff; transition:all .15s; }\n    #collab-register-app .choice:hover .choice-body { border-color:#97aad3; }\n    #collab-register-app .choice input:checked + .choice-body { border-color:var(--r-blue); background:var(--r-soft); box-shadow:0 0 0 4px rgba(37,99,235,.12); }\n    #collab-register-app .choice input:checked + .choice-body::after { border-color:var(--r-blue); background:var(--r-blue) radial-gradient(circle,#fff 0 3px,transparent 3.5px); }\n    #collab-register-app .choice input:focus-visible + .choice-body { outline:3px solid #7aa7ff; outline-offset:2px; }\n    #collab-register-app #reg-group-setup { background:var(--r-soft); border:1px dashed var(--r-line2); border-radius:14px; padding:16px 18px; margin:0 0 20px; }\n    #collab-register-app #reg-subcompany-list input { margin-top:8px; }\n    #collab-register-app #reg-subcompany-list > div { align-items:center; }\n    #collab-register-app #reg-subcompany-list .btn { width:40px; padding:0; flex:none; }\n\n    \/* workspace address *\/\n    #collab-register-app .reg-slug-row { display:flex; align-items:stretch; border:1.5px solid var(--r-line2); border-radius:12px; background:#fff; overflow:hidden; transition:border-color .15s, box-shadow .15s; }\n    #collab-register-app .reg-slug-row:focus-within { border-color:var(--r-blue); box-shadow:0 0 0 4px rgba(37,99,235,.16); }\n    #collab-register-app .reg-slug-row.is-invalid { border-color:var(--r-red); }\n    #collab-register-app .reg-slug-prefix { display:inline-flex; align-items:center; gap:7px; padding:0 12px; flex:none; background:var(--r-soft); border-right:1.5px solid var(--r-line); color:var(--r-muted); font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; font-size:12.5px; white-space:nowrap; }\n    #collab-register-app .reg-slug-input.form-control { border:0 !important; border-radius:0 !important; box-shadow:none !important; flex:1; min-width:0; background:transparent; }\n    #collab-register-app .reg-status { display:flex; align-items:center; gap:7px; min-height:20px; margin-top:7px; font-size:12.5px; font-weight:600; color:var(--r-muted); overflow-wrap:anywhere; }\n    #collab-register-app .reg-status.is-ok { color:var(--r-green-t); } #collab-register-app .reg-status.is-bad { color:var(--r-red); } #collab-register-app .reg-status.is-warn { color:var(--r-amber); }\n    #collab-register-app .reg-status .dot { flex:none; width:8px; height:8px; border-radius:50%; background:currentColor; } #collab-register-app .reg-status.is-busy .dot { width:12px; height:12px; background:none; border:2px solid var(--r-line2); border-top-color:var(--r-blue); animation:regSpin .7s linear infinite; }\n\n    \/* password *\/\n    #collab-register-app .password-field-wrap { position:relative; }\n    #collab-register-app .pw-toggle-btn { position:absolute; right:6px; top:50%; transform:translateY(-50%); width:38px; height:38px; display:grid; place-items:center; border:0; border-radius:9px; background:transparent; color:var(--r-muted); cursor:pointer; }\n    #collab-register-app .pw-toggle-btn:hover { background:var(--r-soft2); color:var(--r-ink); } #collab-register-app .pw-toggle-btn:focus-visible { outline:3px solid #7aa7ff; }\n    #collab-register-app .pw-toggle-btn .off { display:none; } #collab-register-app .pw-toggle-btn.is-shown .on { display:none; } #collab-register-app .pw-toggle-btn.is-shown .off { display:inline-block; }\n    #collab-register-app .pw-meter { display:grid; grid-template-columns:repeat(4,1fr); gap:5px; margin-top:10px; } #collab-register-app .pw-meter i { height:5px; border-radius:5px; background:var(--r-line); transition:background .2s; }\n    #collab-register-app .pw-meter[data-score=\"1\"] i:nth-child(-n+1) { background:#d9485a; } #collab-register-app .pw-meter[data-score=\"2\"] i:nth-child(-n+2) { background:#e8890c; }\n    #collab-register-app .pw-meter[data-score=\"3\"] i:nth-child(-n+3) { background:#2f9e5b; } #collab-register-app .pw-meter[data-score=\"4\"] i:nth-child(-n+4) { background:#12a150; }\n    #collab-register-app .pw-note { display:flex; justify-content:space-between; gap:10px; margin-top:7px; font-size:12.5px; color:var(--r-muted); font-weight:600; } #collab-register-app .pw-note .good { color:var(--r-green-t); } #collab-register-app .pw-note .bad { color:var(--r-red); }\n\n    \/* opt-in card, terms, callouts *\/\n    #collab-register-app .opt-card { display:flex; gap:14px; align-items:flex-start; padding:16px 18px; border:1.5px solid var(--r-line2); border-radius:14px; background:var(--r-soft); cursor:pointer; margin:0; transition:border-color .15s, background .15s; }\n    #collab-register-app .opt-card:hover { border-color:#97aad3; } #collab-register-app .opt-card:has(input:checked) { border-color:var(--r-blue); background:var(--r-soft2); }\n    #collab-register-app .opt-card input { flex:none; width:20px; height:20px; margin-top:2px; accent-color:var(--r-blue); }\n    #collab-register-app .opt-card strong { display:block; color:var(--r-ink); } #collab-register-app .opt-card small { display:block; margin-top:2px; font-size:12.5px; color:var(--r-muted); }\n    #collab-register-app .alert { display:flex; gap:12px; align-items:flex-start; padding:14px 16px; border-radius:14px; border:1px solid; font-size:13.5px; line-height:1.55; margin:0 0 18px; }\n    #collab-register-app .alert > span:first-child { flex:none; font-size:18px; line-height:1.3; }\n    #collab-register-app .alert-info { background:#eef5ff; border-color:#cfe0ff; color:var(--r-ink); }\n    #collab-register-app .alert-danger { background:#fff1f2; border-color:#fbc7cd; color:#7a1522; }\n    #collab-register-app .alert-success { background:#ecfdf3; border-color:#a7e8c3; color:#0b4a2b; }\n    #collab-register-app .alert .sub { display:block; margin-top:4px; font-size:12.5px; color:var(--r-muted); }\n    #collab-register-app .ndpa { background:var(--r-soft); border:1px solid var(--r-line); border-radius:14px; padding:14px 16px; margin:0 0 16px; font-size:12.5px; color:var(--r-text); line-height:1.6; }\n    #collab-register-app .terms-box { background:var(--r-soft); border:1.5px solid var(--r-line2); border-radius:14px; padding:16px 18px; margin:0 0 6px; transition:border-color .15s; }\n    #collab-register-app .terms-box label { display:flex; align-items:flex-start; gap:12px; cursor:pointer; margin:0; font-size:13.5px; }\n    #collab-register-app .terms-box input { flex:none; width:20px; height:20px; margin-top:2px; accent-color:var(--r-blue); }\n    #collab-register-app .terms-box.is-invalid { border-color:var(--r-red); background:#fff8f8; }\n    #collab-register-app #terms-error { display:none; margin-top:9px; color:var(--r-red); font-size:12.5px; font-weight:700; }\n    #collab-register-app .panel-alert { display:none; margin-bottom:6px; } #collab-register-app .panel-alert.show { display:flex; margin-top:18px; }\n\n    \/* review summary *\/\n    #collab-register-app #order-summary { margin:22px 0 20px; display:grid; gap:14px; }\n    #collab-register-app .sum-card { border:1px solid var(--r-line); border-radius:16px; overflow:hidden; background:#fff; }\n    #collab-register-app .sum-card header { display:flex; align-items:center; justify-content:space-between; gap:12px; padding:12px 16px; background:var(--r-soft); border-bottom:1px solid var(--r-line); }\n    #collab-register-app .sum-card header h3 { display:flex; align-items:center; gap:9px; font-size:14px; font-weight:800; color:var(--r-ink); } #collab-register-app .sum-card header h3 .ico { color:var(--r-blue); }\n    #collab-register-app .sum-edit { border:0; background:none; color:var(--r-blue); font:inherit; font-size:13px; font-weight:700; cursor:pointer; padding:4px 8px; border-radius:8px; } #collab-register-app .sum-edit:hover { background:var(--r-soft2); }\n    #collab-register-app .sum-row { display:grid; grid-template-columns:150px 1fr; gap:14px; padding:11px 16px; font-size:14px; } #collab-register-app .sum-row + .sum-row { border-top:1px solid var(--r-line); }\n    #collab-register-app .sum-row dt { color:var(--r-muted); font-weight:600; } #collab-register-app .sum-row dd { margin:0; color:var(--r-ink); font-weight:700; overflow-wrap:anywhere; }\n    #collab-register-app .sum-row dd.mono { font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; font-size:13px; }\n    #collab-register-app .sum-est { display:flex; align-items:center; justify-content:space-between; gap:14px; flex-wrap:wrap; padding:16px 18px; border-radius:16px; background:linear-gradient(135deg,var(--r-brand),#17306a); color:#fff; }\n    #collab-register-app .sum-est small { display:block; color:#c3d2f0; font-size:12.5px; } #collab-register-app .sum-est strong { font-size:24px; font-weight:800; letter-spacing:-.02em; } #collab-register-app .sum-est em { font-style:normal; color:#ffd2a6; font-weight:700; }\n    #collab-register-app .free-list { display:flex; flex-wrap:wrap; gap:8px; margin-top:8px; } #collab-register-app .free-list li { padding:4px 11px; border-radius:99px; background:#fff; border:1px solid #cfe0ff; font-size:12.5px; font-weight:700; color:var(--r-ink); }\n\n    \/* buttons *\/\n    #collab-register-app .btn { display:inline-flex; align-items:center; justify-content:center; gap:9px; min-height:48px; padding:0 24px; border-radius:12px; border:1.5px solid transparent; font:inherit; font-size:15px; font-weight:700; line-height:1; cursor:pointer; text-decoration:none; transition:transform .12s, background .15s, border-color .15s, box-shadow .15s; }\n    #collab-register-app .btn:focus-visible { outline:3px solid #7aa7ff; outline-offset:3px; } #collab-register-app .btn:active { transform:translateY(1px); }\n    #collab-register-app .btn-primary { background:var(--r-blue); color:#fff; box-shadow:0 10px 24px rgba(37,99,235,.28); } #collab-register-app .btn-primary:hover { background:var(--r-blue-d); transform:translateY(-1px); }\n    #collab-register-app .btn-secondary, #collab-register-app .btn-outline { background:#fff; color:var(--r-ink); border-color:var(--r-line2); } #collab-register-app .btn-secondary:hover, #collab-register-app .btn-outline:hover { border-color:var(--r-blue); background:var(--r-soft); }\n    #collab-register-app .btn-gradient { background:linear-gradient(135deg,#ffa24d,var(--r-orange)); color:var(--r-ink); box-shadow:0 12px 28px rgba(255,140,42,.38); } #collab-register-app .btn-gradient:hover { transform:translateY(-1px); filter:saturate(1.08); }\n    #collab-register-app .btn-sm { min-height:38px; padding:0 14px; font-size:13.5px; } #collab-register-app .btn-lg { min-height:52px; padding:0 28px; } #collab-register-app .btn-xl { min-height:56px; padding:0 32px; font-size:16px; }\n    #collab-register-app .btn[disabled] { opacity:.75; cursor:progress; pointer-events:none; }\n    #collab-register-app .spinner { width:18px; height:18px; border-radius:50%; border:2.5px solid rgba(10,24,56,.25); border-top-color:var(--r-ink); animation:regSpin .7s linear infinite; display:inline-block; }\n    #collab-register-app .actions { display:flex; align-items:center; gap:14px; flex-wrap:wrap; margin-top:26px; padding-top:22px; border-top:1px solid var(--r-line); }\n    #collab-register-app .actions .push { margin-left:auto; } #collab-register-app .actions .note { font-size:12.5px; color:var(--r-muted); }\n\n    \/* \u2500\u2500 Aside \u2500\u2500 *\/\n    #collab-register-app .aside-card { background:#fff; border:1px solid var(--r-line); border-radius:var(--r-radius); box-shadow:var(--r-shadow); padding:22px; }\n    #collab-register-app .aside-card h3 { font-size:15px; font-weight:800; color:var(--r-ink); margin-bottom:14px; letter-spacing:-.01em; }\n    #collab-register-app .perks li { display:flex; gap:12px; align-items:flex-start; font-size:13.5px; color:var(--r-text); } #collab-register-app .perks li + li { margin-top:14px; }\n    #collab-register-app .perks .badge { flex:none; width:34px; height:34px; border-radius:10px; display:grid; place-items:center; background:var(--r-soft2); color:var(--r-blue); } #collab-register-app .perks strong { display:block; color:var(--r-ink); font-size:14px; }\n    #collab-register-app .aside-card.dark { color:#d3def5; border:0; background:radial-gradient(400px 200px at 100% 0, rgba(56,139,255,.35), transparent 60%), linear-gradient(135deg,#071229,var(--r-brand)); }\n    #collab-register-app .aside-card.dark h3 { color:#fff; } #collab-register-app .aside-card.dark .perks li { color:#d3def5; } #collab-register-app .aside-card.dark .perks strong { color:#fff; } #collab-register-app .aside-card.dark .perks .badge { background:rgba(255,255,255,.12); color:#4be3a5; }\n    #collab-register-app .aside-help { font-size:13px; color:var(--r-muted); text-align:center; padding:0 6px; }\n\n    \/* \u2500\u2500 Cost estimate (\"simulator\") \u2500\u2500 *\/\n    #collab-register-app .sim-card { margin:26px 0 4px; border:1.5px solid var(--r-line); border-radius:18px; padding:24px 24px 22px; background:linear-gradient(180deg,#fff,var(--r-soft)); max-width:100%; }\n    #collab-register-app .sim-head { display:flex; justify-content:space-between; align-items:flex-start; gap:16px; flex-wrap:wrap; margin-bottom:18px; }\n    #collab-register-app .sim-head h2 { display:flex; align-items:center; gap:10px; margin:0 0 6px; font-size:18px; font-weight:800; color:var(--r-ink); } #collab-register-app .sim-head h2 .ico { color:var(--r-blue); }\n    #collab-register-app .sim-head p { margin:0; color:var(--r-muted); font-size:13px; max-width:520px; }\n    #collab-register-app .sim-cycle { display:inline-flex; background:var(--r-soft2); border-radius:99px; padding:4px; flex:none; }\n    #collab-register-app .sim-cycle button { border:0; background:none; padding:9px 18px; border-radius:99px; font:inherit; font-size:13px; font-weight:700; color:var(--r-muted); cursor:pointer; transition:all .15s; }\n    #collab-register-app .sim-cycle button.active { background:var(--r-blue); color:#fff; box-shadow:0 4px 12px rgba(37,99,235,.3); } #collab-register-app .sim-cycle button:focus-visible { outline:3px solid #7aa7ff; }\n    #collab-register-app .sim-body { display:grid; grid-template-columns:1fr 310px; gap:22px; align-items:start; min-width:0; }\n    #collab-register-app .sim-users-row { display:flex; align-items:center; gap:14px; margin-bottom:18px; flex-wrap:wrap; } #collab-register-app .sim-users-row label { font-size:13.5px; font-weight:700; color:var(--r-ink); margin:0; }\n    #collab-register-app .sim-stepper { display:inline-flex; align-items:stretch; border:1.5px solid var(--r-line2); border-radius:12px; overflow:hidden; background:#fff; }\n    #collab-register-app .sim-stepper button { width:42px; border:0; background:var(--r-soft); color:var(--r-ink); font-size:18px; font-weight:800; cursor:pointer; } #collab-register-app .sim-stepper button:hover { background:var(--r-blue); color:#fff; }\n    #collab-register-app .sim-stepper input { width:70px; height:44px; border:0; text-align:center; font:inherit; font-size:15px; font-weight:800; color:var(--r-ink); background:#fff; outline:0; -moz-appearance:textfield; }\n    #collab-register-app .sim-users-hint { font-size:12.5px; color:var(--r-muted); }\n    #collab-register-app .sim-label { display:block; margin:0 0 8px; font-size:13.5px; font-weight:700; color:var(--r-ink); }\n    #collab-register-app .sim-mod-list { max-height:380px; overflow-y:auto; overflow-x:hidden; border:1.5px solid var(--r-line); border-radius:14px; background:#fff; }\n    #collab-register-app .sim-mod-item { display:flex; align-items:center; gap:10px; padding:11px 14px; border-bottom:1px solid var(--r-line); flex-wrap:wrap; transition:background .12s; } #collab-register-app .sim-mod-item:last-child { border-bottom:0; } #collab-register-app .sim-mod-item:hover { background:var(--r-soft); }\n    #collab-register-app .sim-mod-item label { flex:1; min-width:0; font-size:13.5px; cursor:pointer; display:flex; align-items:center; flex-wrap:wrap; gap:4px 10px; margin:0; font-weight:600; color:var(--r-ink); }\n    #collab-register-app .sim-mod-item label input[type=checkbox] { flex:none; width:18px; height:18px; accent-color:var(--r-blue); }\n    \/* 4.9.414 \u2014 name + one-line bio stacked in one flexible column, so the checkbox, \"Recommended\" badge and price keep their places. *\/\n    #collab-register-app .sim-mod-text { flex:1 1 150px; min-width:110px; display:flex; flex-direction:column; gap:2px; }\n    #collab-register-app .sim-mod-name { word-break:break-word; }\n    #collab-register-app .sim-mod-bio { display:block; font-size:12px; line-height:1.4; font-weight:500; color:var(--r-muted); }\n    #collab-register-app .sim-mod-item .price { font-size:12.5px; color:var(--r-muted); font-weight:700; white-space:nowrap; flex:none; }\n    #collab-register-app .sim-mod-empty { padding:22px; text-align:center; color:var(--r-muted); font-size:13px; }\n    #collab-register-app .sim-mod-item.recommended { background:#f0f6ff; }\n    #collab-register-app .sim-mod-badge { font-size:10px; font-weight:800; text-transform:uppercase; letter-spacing:.04em; background:var(--r-blue); color:#fff; border-radius:99px; padding:3px 8px; flex:none; }\n    #collab-register-app #sim-reco-note { font-size:12.5px; color:var(--r-ink); background:#eef5ff; border:1px solid #cfe0ff; border-radius:11px; padding:9px 13px; margin-bottom:10px; }\n    #collab-register-app .sim-breakdown { background:#fff; border:1.5px solid var(--r-line); border-radius:16px; padding:18px 20px; position:sticky; top:16px; }\n    #collab-register-app .sim-breakdown h3 { margin:0 0 12px; font-size:12px; font-weight:800; text-transform:uppercase; letter-spacing:.07em; color:var(--r-muted); }\n    #collab-register-app .sim-row { display:flex; justify-content:space-between; gap:10px; padding:8px 0; font-size:13.5px; border-bottom:1px solid var(--r-line); } #collab-register-app .sim-row:last-of-type { border-bottom:0; }\n    #collab-register-app .sim-row .lbl { color:var(--r-muted); min-width:0; } #collab-register-app .sim-row .val { font-weight:700; color:var(--r-ink); text-align:right; flex:none; } #collab-register-app .sim-row.discount .val { color:var(--r-green-t); }\n    #collab-register-app .sim-total { display:flex; justify-content:space-between; align-items:baseline; margin-top:12px; padding-top:14px; border-top:2px solid var(--r-line); flex-wrap:wrap; gap:8px; }\n    #collab-register-app .sim-total .lbl { font-size:13.5px; font-weight:800; color:var(--r-ink); } #collab-register-app .sim-total .val { font-size:26px; font-weight:800; letter-spacing:-.02em; color:var(--r-blue); }\n    #collab-register-app .sim-note { font-size:12px; color:var(--r-muted); margin-top:12px; line-height:1.55; }\n    #collab-register-app #sim-loading { text-align:center; padding:30px; color:var(--r-muted); font-size:14px; }\n\n    \/* \u2500\u2500 Responsive \u2500\u2500 *\/\n    @media (max-width:1020px) { #collab-register-app .reg-layout { grid-template-columns:minmax(0,1fr); } #collab-register-app .reg-aside { position:static; flex-direction:row; flex-wrap:wrap; } #collab-register-app .reg-aside > * { flex:1 1 300px; } }\n    @media (max-width:760px) {\n      #collab-register-app .reg-chips li { padding:6px 11px; font-size:12px; } #collab-register-app .reg-chips { gap:6px; margin-top:14px; } #collab-register-app { padding:16px 12px 56px; } #collab-register-app .reg-hero { padding:28px 22px 66px; flex-direction:column; border-radius:22px; } #collab-register-app .reg-hero-side { text-align:left; padding-top:0; display:flex; align-items:center; gap:12px; flex-wrap:wrap; } #collab-register-app .reg-hero-side span { margin:0; }\n      #collab-register-app .register-steps { padding:16px 14px 14px; } #collab-register-app .step-text { display:none; } #collab-register-app .step-indicator.active { flex:2.6; } #collab-register-app .step-indicator.active .step-text { display:flex; } #collab-register-app .step-sub { display:none; } #collab-register-app .step-indicator:not(:last-child)::after { margin:0 8px; min-width:12px; }\n      #collab-register-app .card { padding:4px 18px 24px; } #collab-register-app .grid-2, #collab-register-app .choice-grid, #collab-register-app .sim-body { grid-template-columns:1fr; } #collab-register-app .sim-breakdown { position:static; }\n      #collab-register-app .sum-row { grid-template-columns:1fr; gap:2px; } #collab-register-app .actions .btn { flex:1 1 100%; } #collab-register-app .actions .push { margin-left:0; } #collab-register-app .sim-card { padding:18px 14px; }\n      #collab-register-app .reg-slug-row { flex-direction:column; } #collab-register-app .reg-slug-prefix { border-right:0; border-bottom:1.5px solid var(--r-line); padding:9px 12px; white-space:normal; word-break:break-all; } #collab-register-app .reg-slug-input.form-control { flex:none; width:100%; height:48px; }   \/* flex:1 in a column gave it a zero base height *\/\n    }\n    @media (prefers-reduced-motion:reduce) { #collab-register-app *, #collab-register-app *::before, #collab-register-app *::after { animation:none !important; transition:none !important; scroll-behavior:auto !important; } }\n  <\/style>\n\n  <!-- \u2500\u2500 Hero \u2500\u2500 -->\n  <header class=\"reg-hero\">\n    <div class=\"reg-hero-main\">\n      <a class=\"reg-logo\" href=\"https:\/\/syncfinanceng.com\/internal\/\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/syncfinanceng.com\/internal\/wp-content\/uploads\/2026\/06\/S-Sync.png\" width=\"58\" height=\"58\" alt=\"Sync\"><\/a>\n      <div class=\"reg-eyebrow\">14-day free trial<\/div>\n      <h1 class=\"reg-title\">Register Now<\/h1>\n              <ul class=\"reg-chips\"><li><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 12.5l4.5 4.5L19 7.5\"\/><\/svg>No credit card required<\/li><li><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 12.5l4.5 4.5L19 7.5\"\/><\/svg>Cancel anytime<\/li><\/ul>\n          <\/div>\n    <div class=\"reg-hero-side\">\n      <span>Already have an account?<\/span>\n      <a class=\"reg-signin\" href=\"https:\/\/syncfinanceng.com\/internal\/login\">Sign in <svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/svg><\/a>\n    <\/div>\n  <\/header>\n\n  <div class=\"reg-layout\">\n    <main class=\"reg-main\">\n\n      <!-- Step indicator -->\n      <ol class=\"register-steps\" aria-label=\"Registration progress\">\n                <li class=\"step-indicator active\" data-step=\"1\" aria-current=\"step\">\n          <span class=\"step-circle\">1<\/span>\n          <span class=\"step-text\"><span class=\"step-label\">Company<\/span><span class=\"step-sub\">Profile &amp; workspace<\/span><\/span>\n        <\/li>\n                <li class=\"step-indicator\" data-step=\"2\">\n          <span class=\"step-circle\">2<\/span>\n          <span class=\"step-text\"><span class=\"step-label\">Admin account<\/span><span class=\"step-sub\">Your sign-in details<\/span><\/span>\n        <\/li>\n                <li class=\"step-indicator\" data-step=\"3\">\n          <span class=\"step-circle\">3<\/span>\n          <span class=\"step-text\"><span class=\"step-label\">Review &amp; launch<\/span><span class=\"step-sub\">Confirm and create<\/span><\/span>\n        <\/li>\n              <\/ol>\n\n      <form id=\"collab-register-form\" data-ajax=\"false\" novalidate>\n\n        <!-- \u2500\u2500 STEP 1: Company Info \u2500\u2500 -->\n        <div class=\"step-panel\" data-step=\"1\">\n          <div class=\"card card-pad\">\n            <div class=\"card-head\">\n              <span class=\"kicker\">Step 1 of 3<\/span>\n              <h2>Tell us about your company<\/h2>\n              <p>We'll set up your isolated ERP workspace. After registration you can subscribe to any modules you need from the <strong>Modules Marketplace<\/strong> inside your dashboard.<\/p>\n            <\/div>\n\n            <section class=\"reg-section\" aria-labelledby=\"sec-profile\">\n              <div class=\"reg-section-head\"><span class=\"badge\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16\"\/><path d=\"M16 9h2a2 2 0 0 1 2 2v10\"\/><path d=\"M8 7h4M8 11h4M8 15h4\"\/><path d=\"M3 21h18\"\/><\/svg><\/span><div><h3 id=\"sec-profile\">Company profile<\/h3><p>The basics about your organisation.<\/p><\/div><\/div>\n              <div class=\"grid-2\">\n                <div class=\"form-group\">\n                  <label class=\"form-label\" for=\"reg-company-name\">Company name <span class=\"req\" aria-hidden=\"true\">*<\/span><\/label>\n                  <input type=\"text\" name=\"company_name\" class=\"form-control\" id=\"reg-company-name\" required aria-required=\"true\" placeholder=\"Acme Corporation\" autocomplete=\"organization\">\n                <\/div>\n                <div class=\"form-group\">\n                  <label class=\"form-label\" for=\"reg-industry\">Industry <span class=\"req\" aria-hidden=\"true\">*<\/span><\/label>\n                  <select name=\"industry\" class=\"form-control\" id=\"reg-industry\" required aria-required=\"true\">\n                    <option value=\"\">\u2014 Loading\u2026 \u2014<\/option>\n                  <\/select>\n                <\/div>\n              <\/div>\n\n              <div class=\"form-group\">\n                <span class=\"form-label\" id=\"structure-label\">Is this a Group of Companies, or an independent company? <span class=\"req\" aria-hidden=\"true\">*<\/span><\/span>\n                <div class=\"choice-grid\" role=\"radiogroup\" aria-labelledby=\"structure-label\">\n                  <label class=\"choice\">\n                    <input type=\"radio\" name=\"company_structure\" value=\"independent\" id=\"reg-structure-independent\" checked>\n                    <span class=\"choice-body\"><span class=\"badge\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16\"\/><path d=\"M16 9h2a2 2 0 0 1 2 2v10\"\/><path d=\"M8 7h4M8 11h4M8 15h4\"\/><path d=\"M3 21h18\"\/><\/svg><\/span><span><strong>Independent company<\/strong><small>A single organisation with one workspace.<\/small><\/span><\/span>\n                  <\/label>\n                  <label class=\"choice\">\n                    <input type=\"radio\" name=\"company_structure\" value=\"group\" id=\"reg-structure-group\">\n                    <span class=\"choice-body\"><span class=\"badge\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 3l9 5-9 5-9-5z\"\/><path d=\"M3 13l9 5 9-5\"\/><\/svg><\/span><span><strong>Group of Companies<\/strong><small>A holding structure with sub-companies.<\/small><\/span><\/span>\n                  <\/label>\n                <\/div>\n                <p class=\"form-hint\">The company name above becomes your Head Office. You can add, rename, or reconfigure sub-companies anytime later from Group of Companies \u2014 nothing here is final.<\/p>\n              <\/div>\n\n              <div id=\"reg-group-setup\" style=\"display:none\">\n                <span class=\"form-label\">Sub-companies <span class=\"opt\">(optional \u2014 you can add these later instead)<\/span><\/span>\n                <div id=\"reg-subcompany-list\"><\/div>\n                <button type=\"button\" class=\"btn btn-outline btn-sm\" id=\"reg-add-subcompany\" style=\"margin-top:10px\">+ Add another company<\/button>\n              <\/div>\n            <\/section>\n\n            <section class=\"reg-section\" aria-labelledby=\"sec-workspace\">\n              <div class=\"reg-section-head\"><span class=\"badge\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M10 14a4.5 4.5 0 0 0 6.4 0l3-3a4.5 4.5 0 0 0-6.4-6.4l-1 1\"\/><path d=\"M14 10a4.5 4.5 0 0 0-6.4 0l-3 3a4.5 4.5 0 0 0 6.4 6.4l1-1\"\/><\/svg><\/span><div><h3 id=\"sec-workspace\">Your workspace address<\/h3><p>The private web address your team will use.<\/p><\/div><\/div>\n              <div class=\"form-group\">\n                  <label class=\"form-label\" for=\"reg-subdomain\">Workspace URL slug <span class=\"req\" aria-hidden=\"true\">*<\/span><\/label>\n                  <div class=\"reg-slug-row\">\n                    <span class=\"reg-slug-prefix\">https:\/\/syncfinanceng.com\/internal\/workspace\/<\/span>\n                    <input type=\"text\" name=\"subdomain\" id=\"reg-subdomain\" class=\"form-control reg-slug-input\" placeholder=\"acme-corp\" pattern=\"[-a-z0-9]+\" required aria-required=\"true\"\n                           title=\"Lowercase letters, numbers, and hyphens only\" autocomplete=\"off\" autocapitalize=\"none\" spellcheck=\"false\" aria-describedby=\"reg-subdomain-status\">\n                  <\/div>\n                  <div id=\"reg-subdomain-status\" class=\"reg-status\" role=\"status\" aria-live=\"polite\"><\/div>\n                  <p class=\"form-hint\">Your unique workspace path \u2014 e.g. <code>https:\/\/syncfinanceng.com\/internal\/workspace\/<strong>acme-corp<\/strong><\/code>. You can change it later from your Tenant Admin settings.<\/p>\n              <\/div>\n            <\/section>\n\n            <section class=\"reg-section\" aria-labelledby=\"sec-contact\">\n              <div class=\"reg-section-head\"><span class=\"badge\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"\/><path d=\"M3 7l9 6 9-6\"\/><\/svg><\/span><div><h3 id=\"sec-contact\">Contact &amp; location<\/h3><p>Who we should reach, and where you are.<\/p><\/div><\/div>\n              <div class=\"grid-2\">\n                <div class=\"form-group\">\n                  <label class=\"form-label\" for=\"reg-contact\">Contact person <span class=\"req\" aria-hidden=\"true\">*<\/span><\/label>\n                  <input type=\"text\" name=\"contact_person\" id=\"reg-contact\" class=\"form-control\" required aria-required=\"true\" placeholder=\"John Adeyemi\" autocomplete=\"name\">\n                <\/div>\n                <div class=\"form-group\">\n                  <label class=\"form-label\" for=\"reg-email\">Email <span class=\"req\" aria-hidden=\"true\">*<\/span><\/label>\n                  <input type=\"email\" name=\"email\" id=\"reg-email\" class=\"form-control\" required aria-required=\"true\" placeholder=\"you@company.com\" autocomplete=\"email\" inputmode=\"email\">\n                <\/div>\n              <\/div>\n              <div class=\"grid-2\">\n                <div class=\"form-group\">\n                  <label class=\"form-label\" for=\"reg-phone\">Phone <span class=\"opt\">(optional)<\/span><\/label>\n                  <input type=\"tel\" name=\"phone\" id=\"reg-phone\" class=\"form-control\" placeholder=\"+234 800 000 0000\" autocomplete=\"tel\">\n                <\/div>\n                <div class=\"form-group\">\n                  <label class=\"form-label\" for=\"reg-size\">Company size<\/label>\n                  <select name=\"company_size\" id=\"reg-size\" class=\"form-control\">\n                    <option value=\"1-10\">1\u201310 employees<\/option>\n                    <option value=\"11-50\">11\u201350 employees<\/option>\n                    <option value=\"51-200\">51\u2013200 employees<\/option>\n                    <option value=\"201-500\">201\u2013500 employees<\/option>\n                    <option value=\"500+\">500+ employees<\/option>\n                  <\/select>\n                <\/div>\n              <\/div>\n              <div class=\"grid-2\">\n                <div class=\"form-group\">\n                  <label class=\"form-label\" for=\"reg-state\">State \/ Province<\/label>\n                  <select name=\"location_state\" class=\"form-control\" id=\"reg-state\">\n                    <option value=\"\">\u2014 Loading\u2026 \u2014<\/option>\n                  <\/select>\n                <\/div>\n                <div class=\"form-group\">\n                  <label class=\"form-label\" for=\"reg-city\">City <span class=\"opt\">(optional)<\/span><\/label>\n                  <input type=\"text\" name=\"city\" id=\"reg-city\" class=\"form-control\" placeholder=\"Lagos\" autocomplete=\"address-level2\">\n                <\/div>\n              <\/div>\n              <div class=\"grid-2\">\n                <div class=\"form-group\">\n                  <label class=\"form-label\" for=\"reg-state-text\">State on your address <span class=\"opt\">(optional)<\/span><\/label>\n                  <input type=\"text\" name=\"state\" id=\"reg-state-text\" class=\"form-control\" placeholder=\"Lagos State\" autocomplete=\"address-level1\">\n                <\/div>\n              <\/div>\n            <\/section>\n\n            <div class=\"sim-card\">\n              <div class=\"sim-head\">\n                <div>\n                  <h2><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect x=\"5\" y=\"3\" width=\"14\" height=\"18\" rx=\"2\"\/><path d=\"M8 7h8M8 12h.01M12 12h.01M16 12h.01M8 16h.01M12 16h.01M16 16h.01\"\/><\/svg> Estimate your cost<\/h2>\n                  <p>See what your workspace would cost before you sign up \u2014 powered by live pricing, the same numbers you'll actually be billed. Updates instantly as you adjust anything below.<\/p>\n                <\/div>\n                <div class=\"sim-cycle\" role=\"tablist\" aria-label=\"Billing cycle\">\n                  <button type=\"button\" id=\"sim-cycle-monthly\" class=\"active\" onclick=\"simSetCycle('monthly')\">Monthly<\/button>\n                  <button type=\"button\" id=\"sim-cycle-annual\" onclick=\"simSetCycle('annual')\">Annual <span id=\"sim-disc-pill\" style=\"opacity:.9\"><\/span><\/button>\n                <\/div>\n              <\/div>\n\n              <div id=\"sim-loading\">\u23f3 Loading current pricing\u2026<\/div>\n\n              <div id=\"sim-content\" style=\"display:none\">\n                <div class=\"sim-users-row\">\n                  <label for=\"sim-users\">Number of users<\/label>\n                  <div class=\"sim-stepper\">\n                    <button type=\"button\" onclick=\"simAdjustUsers(-1)\" aria-label=\"Fewer users\">\u2212<\/button>\n                    <input type=\"number\" id=\"sim-users\" value=\"1\" min=\"1\" oninput=\"simRenderTotals()\">\n                    <button type=\"button\" onclick=\"simAdjustUsers(1)\" aria-label=\"More users\">+<\/button>\n                  <\/div>\n                  <span class=\"sim-users-hint\" id=\"sim-min-hint\"><\/span>\n                <\/div>\n\n                <div class=\"sim-body\">\n                  <div>\n                    <span class=\"sim-label\">Modules you're interested in<\/span>\n                    <div id=\"sim-reco-note\" style=\"display:none\"><\/div>\n                    <div class=\"sim-mod-list\" id=\"sim-mod-list\"><\/div>\n                  <\/div>\n                  <div class=\"sim-breakdown\">\n                    <h3 id=\"sim-cycle-label\">Monthly Cost Breakdown<\/h3>\n                    <div class=\"sim-row\"><span class=\"lbl\">Platform Fee<\/span><span class=\"val\" id=\"sim-plat\">\u2014<\/span><\/div>\n                    <div class=\"sim-row\"><span class=\"lbl\" id=\"sim-user-lbl\">Users<\/span><span class=\"val\" id=\"sim-user-cost\">\u2014<\/span><\/div>\n                    <div class=\"sim-row\"><span class=\"lbl\" id=\"sim-mod-lbl\">Selected Modules<\/span><span class=\"val\" id=\"sim-mod-cost\">\u2014<\/span><\/div>\n                    <div class=\"sim-row\"><span class=\"lbl\">Subtotal<\/span><span class=\"val\" id=\"sim-subtotal\">\u2014<\/span><\/div>\n                    <div class=\"sim-row discount\" id=\"sim-disc-row\" style=\"display:none\"><span class=\"lbl\" id=\"sim-disc-lbl\">Annual Discount<\/span><span class=\"val\" id=\"sim-disc-val\">\u2014<\/span><\/div>\n                    <div class=\"sim-row\" id=\"sim-vat-row\" style=\"display:none\"><span class=\"lbl\" id=\"sim-vat-lbl\">VAT<\/span><span class=\"val\" id=\"sim-vat-val\">\u2014<\/span><\/div>\n                    <div class=\"sim-total\">\n                      <span class=\"lbl\" id=\"sim-total-lbl\">Total \/ month<\/span>\n                      <span><span class=\"val\" id=\"sim-total\">\u2014<\/span><\/span>\n                    <\/div>\n                    <div class=\"sim-note\">Estimate only \u2014 modules are actually subscribed to (and billed) from your dashboard's Modules Marketplace after you register, so you can add or remove them anytime.<\/div>\n                  <\/div>\n                <\/div>\n              <\/div>\n            <\/div>\n\n            <div class=\"panel-alert alert alert-danger\" role=\"alert\" data-for=\"1\"><\/div>\n            <div class=\"actions\">\n              <span class=\"note\">Takes about two minutes. No credit card required.<\/span>\n              <button type=\"button\" class=\"btn btn-primary btn-lg push\" data-next=\"2\">Continue <svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/svg><\/button>\n            <\/div>\n          <\/div>\n        <\/div>\n\n        <!-- \u2500\u2500 STEP 2: Tenant Admin Account \u2500\u2500 -->\n        <div class=\"step-panel\" data-step=\"2\" style=\"display:none\">\n          <div class=\"card card-pad\">\n            <div class=\"card-head\">\n              <span class=\"kicker\">Step 2 of 3<\/span>\n              <h2>Create your Tenant Admin account<\/h2>\n              <p>This account will be the primary administrator for your company. You'll log in here, manage your team, and subscribe to ERP modules from the <strong>Modules Marketplace<\/strong>.<\/p>\n            <\/div>\n\n            <section class=\"reg-section\" aria-labelledby=\"sec-admin\">\n              <div class=\"alert alert-info\"><span aria-hidden=\"true\">\ud83d\udc64<\/span><div>You'll be assigned the <strong>Tenant Admin<\/strong> role \u2014 the highest level of access within your company.<\/div><\/div>\n              <div class=\"reg-section-head\"><span class=\"badge\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><circle cx=\"12\" cy=\"8\" r=\"4\"\/><path d=\"M4 21a8 8 0 0 1 16 0\"\/><\/svg><\/span><div><h3 id=\"sec-admin\">About you<\/h3><p>The person who will administer the workspace.<\/p><\/div><\/div>\n              <div class=\"grid-2\">\n                <div class=\"form-group\">\n                  <label class=\"form-label\" for=\"admin-fullname\">Full name <span class=\"req\" aria-hidden=\"true\">*<\/span><\/label>\n                  <input type=\"text\" name=\"admin_full_name\" id=\"admin-fullname\" class=\"form-control\" required aria-required=\"true\" placeholder=\"Adebola Adeyemi\" autocomplete=\"name\">\n                <\/div>\n                <div class=\"form-group\">\n                  <label class=\"form-label\" for=\"admin-jobtitle\">Job title <span class=\"opt\">(optional)<\/span><\/label>\n                  <input type=\"text\" name=\"admin_job_title\" id=\"admin-jobtitle\" class=\"form-control\" placeholder=\"e.g. CEO, IT Director\" autocomplete=\"organization-title\">\n                <\/div>\n              <\/div>\n              <div class=\"form-group\">\n                <label class=\"form-label\" for=\"admin-mobile\">Mobile number <span class=\"req\" aria-hidden=\"true\">*<\/span><\/label>\n                <input type=\"tel\" name=\"admin_mobile\" id=\"admin-mobile\" class=\"form-control\" required aria-required=\"true\" placeholder=\"+234 801 234 5678\" autocomplete=\"tel\">\n                <p class=\"form-hint\">Used for order &amp; notification alerts.<\/p>\n              <\/div>\n            <\/section>\n\n            <section class=\"reg-section\" aria-labelledby=\"sec-signin\">\n              <div class=\"reg-section-head\"><span class=\"badge\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><circle cx=\"8\" cy=\"15\" r=\"4\"\/><path d=\"M11 12l9-9M16 7l3 3\"\/><\/svg><\/span><div><h3 id=\"sec-signin\">Sign-in details<\/h3><p>You'll use these every time you log in.<\/p><\/div><\/div>\n              <div class=\"form-group\">\n                <label class=\"form-label\" for=\"admin-username\">Username <span class=\"req\" aria-hidden=\"true\">*<\/span><\/label>\n                <input type=\"text\" name=\"admin_username\" id=\"admin-username\" class=\"form-control\" required aria-required=\"true\" placeholder=\"adebola or adebola@company.com\" pattern=\"[a-zA-Z0-9_.@-]+\"\n                       title=\"Letters, numbers, underscores, dots, hyphens, or a full email address\" autocomplete=\"username\" autocapitalize=\"none\" spellcheck=\"false\">\n                <p class=\"form-hint\">Your email address, or any other name you'd like \u2014 you'll use this to log in.<\/p>\n              <\/div>\n              <div class=\"grid-2\">\n                <div class=\"form-group\">\n                  <label class=\"form-label\" for=\"admin-password\">Password <span class=\"req\" aria-hidden=\"true\">*<\/span><\/label>\n                  <div class=\"password-field-wrap\">\n                    <input type=\"password\" name=\"admin_password\" id=\"admin-password\" class=\"form-control\" required aria-required=\"true\" minlength=\"8\" placeholder=\"At least 8 characters\" autocomplete=\"new-password\" style=\"padding-right:50px\" aria-describedby=\"pw-note\">\n                    <button type=\"button\" class=\"pw-toggle-btn\" data-target=\"admin-password\" aria-label=\"Show password\" aria-pressed=\"false\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12z\"\/><circle cx=\"12\" cy=\"12\" r=\"3\"\/><\/svg><span class=\"off\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M3 3l18 18\"\/><path d=\"M10.6 5.1A10 10 0 0 1 12 5c6.5 0 10 7 10 7a17 17 0 0 1-3.2 4.2M6.6 6.7A17 17 0 0 0 2 12s3.5 7 10 7a10 10 0 0 0 4.4-1\"\/><path d=\"M9.9 9.9a3 3 0 0 0 4.2 4.2\"\/><\/svg><\/span><\/button>\n                  <\/div>\n                  <div class=\"pw-meter\" id=\"pw-meter\" data-score=\"0\" aria-hidden=\"true\"><i><\/i><i><\/i><i><\/i><i><\/i><\/div>\n                  <div class=\"pw-note\" id=\"pw-note\" aria-live=\"polite\"><span id=\"pw-label\">Minimum 8 characters.<\/span><\/div>\n                <\/div>\n                <div class=\"form-group\">\n                  <label class=\"form-label\" for=\"admin-password-confirm\">Confirm password <span class=\"req\" aria-hidden=\"true\">*<\/span><\/label>\n                  <div class=\"password-field-wrap\">\n                    <input type=\"password\" name=\"admin_password_confirm\" id=\"admin-password-confirm\" class=\"form-control\" required aria-required=\"true\" minlength=\"8\" placeholder=\"Re-enter your password\" autocomplete=\"new-password\" style=\"padding-right:50px\" aria-describedby=\"pw-match\">\n                    <button type=\"button\" class=\"pw-toggle-btn\" data-target=\"admin-password-confirm\" aria-label=\"Show password\" aria-pressed=\"false\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12z\"\/><circle cx=\"12\" cy=\"12\" r=\"3\"\/><\/svg><span class=\"off\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M3 3l18 18\"\/><path d=\"M10.6 5.1A10 10 0 0 1 12 5c6.5 0 10 7 10 7a17 17 0 0 1-3.2 4.2M6.6 6.7A17 17 0 0 0 2 12s3.5 7 10 7a10 10 0 0 0 4.4-1\"\/><path d=\"M9.9 9.9a3 3 0 0 0 4.2 4.2\"\/><\/svg><\/span><\/button>\n                  <\/div>\n                  <div class=\"pw-note\" id=\"pw-match\" aria-live=\"polite\"><\/div>\n                <\/div>\n              <\/div>\n            <\/section>\n\n            <section class=\"reg-section\" aria-label=\"Marketplace\">\n              <label class=\"opt-card\" for=\"intends-to-sell\">\n                <input type=\"checkbox\" name=\"intends_to_sell\" id=\"intends-to-sell\" value=\"1\">\n                <span><strong>\ud83d\uded2 We intend to sell on the Marketplace<\/strong><small>Tick this if your company wants to list products\/services for other businesses. You'll get a Seller badge after KYC and Super Admin approval.<\/small><\/span>\n              <\/label>\n            <\/section>\n\n            <div class=\"panel-alert alert alert-danger\" role=\"alert\" data-for=\"2\"><\/div>\n            <div class=\"actions\">\n              <button type=\"button\" class=\"btn btn-secondary\" data-prev=\"1\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M19 12H5M11 6l-6 6 6 6\"\/><\/svg> Back<\/button>\n              <button type=\"button\" class=\"btn btn-primary btn-lg push\" data-next=\"3\">Review <svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/svg><\/button>\n            <\/div>\n          <\/div>\n        <\/div>\n\n        <!-- \u2500\u2500 STEP 3: Review & Create \u2500\u2500 -->\n        <div class=\"step-panel\" data-step=\"3\" style=\"display:none\">\n          <div class=\"card card-pad\">\n            <div class=\"card-head\">\n              <span class=\"kicker\">Step 3 of 3<\/span>\n              <h2>Review &amp; create your workspace<\/h2>\n              <p>After registration you'll be redirected to your <strong>Tenant Admin dashboard<\/strong>. From there, go to <strong>\ud83d\udecd\ufe0f Modules Marketplace<\/strong> to browse and subscribe to the ERP modules your company needs. The SA will confirm your payment and activate each module.<\/p>\n            <\/div>\n\n            <div id=\"order-summary\" aria-live=\"polite\"><\/div>\n\n            <!-- Free modules callout -->\n            <div class=\"alert alert-info\">\n              <span aria-hidden=\"true\">\ud83c\udf89<\/span>\n              <div>\n                <strong>Free with every tenant<\/strong>\n                <ul class=\"free-list\"><li>Approval Workflow<\/li><li>Customer Management<\/li><li>Reports &amp; Analytics<\/li><\/ul>\n                <span class=\"sub\">More modules available in the <strong>Modules Marketplace<\/strong> after sign-in \u2014 subscribe, pay via bank transfer, and the SA enables them for you.<\/span>\n              <\/div>\n            <\/div>\n\n            \n            <div class=\"terms-box\" id=\"terms-box\">\n              <label for=\"terms-accepted\">\n                <input type=\"checkbox\" name=\"terms_accepted\" id=\"terms-accepted\" value=\"1\" required aria-required=\"true\" aria-describedby=\"terms-error\">\n                <span>\n                  I have reviewed the estimated cost and agree to the\n                  <a href=\"https:\/\/syncfinanceng.com\/internal\/terms\" target=\"_blank\" rel=\"noopener\"><strong>Terms of Service<\/strong><\/a>\n                  and <a href=\"https:\/\/syncfinanceng.com\/internal\/privacy\" target=\"_blank\" rel=\"noopener\"><strong>Privacy Policy<\/strong><\/a>. <span class=\"req\" aria-hidden=\"true\">*<\/span>\n                <\/span>\n              <\/label>\n              <div id=\"terms-error\" role=\"alert\">Please accept the Terms of Service and Privacy Policy to continue.<\/div>\n            <\/div>\n\n            <div id=\"register-alert-slot\"><\/div>\n            <div class=\"actions\">\n              <button type=\"button\" class=\"btn btn-secondary\" data-prev=\"2\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M19 12H5M11 6l-6 6 6 6\"\/><\/svg> Back<\/button>\n              <button type=\"submit\" class=\"btn btn-gradient btn-xl push\" id=\"btn-complete\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 15c-1.5 1.3-2 5-2 5s3.7-.5 5-2\"\/><path d=\"M12 15l-3-3a22 22 0 0 1 2-4 12 12 0 0 1 11-5c0 3-1.4 8-5 11a22 22 0 0 1-5 1z\"\/><circle cx=\"15\" cy=\"9\" r=\"1.5\"\/><\/svg> Create workspace &amp; sign in<\/button>\n            <\/div>\n          <\/div>\n        <\/div>\n\n      <\/form>\n    <\/main>\n\n    <aside class=\"reg-aside\" aria-label=\"What you get\">\n      <div class=\"aside-card\">\n        <h3>Included with every workspace<\/h3>\n        <ul class=\"perks\">\n          <li><span class=\"badge\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 3l9 5-9 5-9-5z\"\/><path d=\"M3 13l9 5 9-5\"\/><\/svg><\/span><span><strong>Your own isolated ERP<\/strong>A private workspace for your company \u2014 your data stays yours.<\/span><\/li>\n          <li><span class=\"badge\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 3l1.8 5.2L19 10l-5.2 1.8L12 17l-1.8-5.2L5 10l5.2-1.8z\"\/><\/svg><\/span><span><strong>14-day free trial<\/strong>No credit card required. Explore free modules instantly.<\/span><\/li>\n          <li><span class=\"badge\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><circle cx=\"9\" cy=\"20\" r=\"1.5\"\/><circle cx=\"18\" cy=\"20\" r=\"1.5\"\/><path d=\"M2 3h3l2.7 12.4a2 2 0 0 0 2 1.6h7.6a2 2 0 0 0 2-1.5L21 8H6\"\/><\/svg><\/span><span><strong>Add modules as you grow<\/strong>Subscribe to paid modules from the Modules Marketplace whenever you're ready.<\/span><\/li>\n        <\/ul>\n      <\/div>\n      <div class=\"aside-card dark\">\n        <h3>Built for control &amp; trust<\/h3>\n        <ul class=\"perks\">\n          <li><span class=\"badge\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 3l8 3v6c0 4.5-3.2 8.2-8 9-4.8-.8-8-4.5-8-9V6z\"\/><path d=\"M9 12l2 2 4-4\"\/><\/svg><\/span><span><strong>Two-factor authentication<\/strong>Native 2FA to protect every sign-in.<\/span><\/li>\n          <li><span class=\"badge\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><circle cx=\"9\" cy=\"8\" r=\"3.5\"\/><path d=\"M2.5 20a6.5 6.5 0 0 1 13 0\"\/><path d=\"M16 4.5a3.5 3.5 0 0 1 0 7M18.5 14.5A6.5 6.5 0 0 1 21.5 20\"\/><\/svg><\/span><span><strong>8-level role-based access<\/strong>Give each person exactly the access they need.<\/span><\/li>\n          <li><span class=\"badge\"><svg class=\"ico\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 12.5l4.5 4.5L19 7.5\"\/><\/svg><\/span><span><strong>Full audit trail<\/strong>Every action is recorded.<\/span><\/li>\n        <\/ul>\n      <\/div>\n      <p class=\"aside-help\">Questions before you start? Use the chat button \u2014 we're happy to help.<\/p>\n    <\/aside>\n  <\/div>\n<\/div>\n\n<script data-collab-js=\"CihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIGNvbnN0IFJFU1QgICA9ICdodHRwczovL3N5bmNmaW5hbmNlbmcuY29tL2ludGVybmFsL3dwLWpzb24vY29sbGFiL3YxJzsKICBjb25zdCBub25jZSAgPSAnYTI1MTkxZDkzOCc7CiAgY29uc3QgQkFTRV9VUkwgPSAnaHR0cHM6Ly9zeW5jZmluYW5jZW5nLmNvbS9pbnRlcm5hbC93b3Jrc3BhY2UvJzsKCiAgLy8g4pSA4pSAIEdyb3VwIG9mIENvbXBhbmllcyBzdHJ1Y3R1cmUgdG9nZ2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogIGNvbnN0IGdyb3VwU2V0dXBCb3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVnLWdyb3VwLXNldHVwJyk7CiAgY29uc3Qgc3ViQ29tcGFueUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVnLXN1YmNvbXBhbnktbGlzdCcpOwogIGxldCBzdWJDb21wYW55Um93U2VxID0gMDsKCiAgZnVuY3Rpb24gYWRkU3ViQ29tcGFueVJvdygpIHsKICAgIHN1YkNvbXBhbnlSb3dTZXErKzsKICAgIGNvbnN0IG4gPSBzdWJDb21wYW55Um93U2VxOwogICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICByb3cuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tdG9wOjhweDthbGlnbi1pdGVtczpjZW50ZXInOwogICAgcm93LmlkID0gJ3JlZy1zdWJjb21wYW55LXJvdy0nICsgbjsKICAgIHJvdy5pbm5lckhUTUwgPSBgCiAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzdWJfY29tcGFuaWVzW10iIGNsYXNzPSJmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJlLmcuIEFjbWUgTG9naXN0aWNzIEx0ZCI+CiAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1vdXRsaW5lIGJ0bi1zbSIgc3R5bGU9ImZsZXgtc2hyaW5rOjAiIG9uY2xpY2s9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWctc3ViY29tcGFueS1yb3ctJHtufScpLnJlbW92ZSgpIj7inJU8L2J1dHRvbj4KICAgIGA7CiAgICBzdWJDb21wYW55TGlzdC5hcHBlbmRDaGlsZChyb3cpOwogIH0KCiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW25hbWU9ImNvbXBhbnlfc3RydWN0dXJlIl0nKS5mb3JFYWNoKHJhZGlvID0+IHsKICAgIHJhZGlvLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgICAgY29uc3QgaXNHcm91cCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWctc3RydWN0dXJlLWdyb3VwJykuY2hlY2tlZDsKICAgICAgZ3JvdXBTZXR1cEJveC5zdHlsZS5kaXNwbGF5ID0gaXNHcm91cCA\/ICcnIDogJ25vbmUnOwogICAgICBpZiAoaXNHcm91cCAmJiAhc3ViQ29tcGFueUxpc3QuY2hpbGRyZW4ubGVuZ3RoKSBhZGRTdWJDb21wYW55Um93KCk7CiAgICB9KTsKICB9KTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVnLWFkZC1zdWJjb21wYW55JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhZGRTdWJDb21wYW55Um93KTsKCgogIC8vIFNob3cgLyBoaWRlIHBhc3N3b3JkIOKAlCBkZWxlZ2F0ZWQ7IHRoZSBpY29uIHN3YXAgaXMgcHVyZSBDU1MgKC5pcy1zaG93biksIHNvIG5vdGhpbmcgaXMgd3JpdHRlbiBpbnRvIHRoZSBidXR0b24uCiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgewogICAgY29uc3QgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLnB3LXRvZ2dsZS1idG4nKTsKICAgIGlmICghYnRuKSByZXR1cm47CiAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJ0bi5kYXRhc2V0LnRhcmdldCk7CiAgICBpZiAoIWlucHV0KSByZXR1cm47CiAgICBjb25zdCBzaG93aW5nID0gaW5wdXQudHlwZSA9PT0gJ3RleHQnOwogICAgaW5wdXQudHlwZSA9IHNob3dpbmcgPyAncGFzc3dvcmQnIDogJ3RleHQnOwogICAgYnRuLmNsYXNzTGlzdC50b2dnbGUoJ2lzLXNob3duJywgIXNob3dpbmcpOwogICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgc2hvd2luZyA\/ICdmYWxzZScgOiAndHJ1ZScpOwogICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHNob3dpbmcgPyAnU2hvdyBwYXNzd29yZCcgOiAnSGlkZSBwYXNzd29yZCcpOwogIH0pOwoKICAvLyBQYXNzd29yZCBzdHJlbmd0aCArICJkbyB0aGV5IG1hdGNoIiDigJQgYWR2aXNvcnkgb25seSAodGhlIHJ1bGVzIGVuZm9yY2VkIGFyZSB1bmNoYW5nZWQ6IGF0IGxlYXN0IDggY2hhcmFjdGVycywgYW5kIGJvdGggZmllbGRzIGVxdWFsKS4KICBjb25zdCBwdzEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRtaW4tcGFzc3dvcmQnKSwgcHcyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkbWluLXBhc3N3b3JkLWNvbmZpcm0nKTsKICBmdW5jdGlvbiBzY29yZVBhc3N3b3JkKHApIHsKICAgIGlmICghcCkgcmV0dXJuIDA7CiAgICBjb25zdCBraW5kcyA9IFsvW2Etel0vLCAvW0EtWl0vLCAvXGQvLCAvW15BLVphLXowLTldL10uZmlsdGVyKHIgPT4gci50ZXN0KHApKS5sZW5ndGg7CiAgICBsZXQgcyA9IDA7CiAgICBpZiAocC5sZW5ndGggPj0gOCkgcysrOwogICAgaWYgKHAubGVuZ3RoID49IDEyKSBzKys7CiAgICBpZiAoa2luZHMgPj0gMykgcysrOwogICAgaWYgKGtpbmRzID49IDQgJiYgcC5sZW5ndGggPj0gMTIpIHMrKzsKICAgIGlmIChwLmxlbmd0aCA8IDgpIHMgPSBNYXRoLm1pbihzLCAxKTsKICAgIHJldHVybiBNYXRoLm1heCgxLCBNYXRoLm1pbig0LCBzKSk7CiAgfQogIGZ1bmN0aW9uIHVwZGF0ZVB3TWV0ZXIoKSB7CiAgICBjb25zdCB2ID0gcHcxLnZhbHVlLCBtZXRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdy1tZXRlcicpLCBsYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdy1sYWJlbCcpOwogICAgaWYgKCF2KSB7IG1ldGVyLmRhdGFzZXQuc2NvcmUgPSAnMCc7IGxhYmVsLnRleHRDb250ZW50ID0gJ01pbmltdW0gOCBjaGFyYWN0ZXJzLic7IGxhYmVsLmNsYXNzTmFtZSA9ICcnOyB9CiAgICBlbHNlIGlmICh2Lmxlbmd0aCA8IDgpIHsgbWV0ZXIuZGF0YXNldC5zY29yZSA9ICcxJzsgbGFiZWwudGV4dENvbnRlbnQgPSAnVG9vIHNob3J0IOKAlCB1c2UgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzLic7IGxhYmVsLmNsYXNzTmFtZSA9ICdiYWQnOyB9CiAgICBlbHNlIHsgY29uc3Qgc2MgPSBzY29yZVBhc3N3b3JkKHYpOyBtZXRlci5kYXRhc2V0LnNjb3JlID0gU3RyaW5nKHNjKTsgbGFiZWwudGV4dENvbnRlbnQgPSAnUGFzc3dvcmQgc3RyZW5ndGg6ICcgKyBbJycsICdXZWFrJywgJ0ZhaXInLCAnR29vZCcsICdTdHJvbmcnXVtzY107IGxhYmVsLmNsYXNzTmFtZSA9IHNjID49IDMgPyAnZ29vZCcgOiAnJzsgfQogICAgdXBkYXRlUHdNYXRjaCgpOwogIH0KICBmdW5jdGlvbiB1cGRhdGVQd01hdGNoKCkgewogICAgY29uc3QgbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdy1tYXRjaCcpOwogICAgaWYgKCFwdzIudmFsdWUpIHsgbS5pbm5lckhUTUwgPSAnJzsgcmV0dXJuOyB9CiAgICBtLmlubmVySFRNTCA9IHB3MS52YWx1ZSA9PT0gcHcyLnZhbHVlID8gJzxzcGFuIGNsYXNzPSJnb29kIj7inJMgUGFzc3dvcmRzIG1hdGNoPC9zcGFuPicgOiAnPHNwYW4gY2xhc3M9ImJhZCI+UGFzc3dvcmRzIGRvblwndCBtYXRjaCB5ZXQ8L3NwYW4+JzsKICB9CiAgcHcxLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdXBkYXRlUHdNZXRlcik7CiAgcHcyLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdXBkYXRlUHdNYXRjaCk7CgogIC8vIOKUgOKUgCBTdGVwIG5hdmlnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogIGxldCBzdGVwSW5pdGlhbGlzZWQgPSBmYWxzZTsKICBmdW5jdGlvbiBzZXRTdGVwKG4pIHsKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zdGVwLXBhbmVsJykuZm9yRWFjaChwID0+IHsKICAgICAgY29uc3Qgb24gPSArcC5kYXRhc2V0LnN0ZXAgPT09IG47CiAgICAgIHAuc3R5bGUuZGlzcGxheSA9IG9uID8gJycgOiAnbm9uZSc7CiAgICAgIHAucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsc2VsZWN0LHRleHRhcmVhJykuZm9yRWFjaChlbCA9PiB7CiAgICAgICAgaWYgKG9uKSB7CiAgICAgICAgICBpZiAoZWwuZGF0YXNldC5fcmVxID09PSAnMScpICBlbC5yZXF1aXJlZCA9IHRydWU7CiAgICAgICAgICBpZiAoZWwuZGF0YXNldC5fcGF0KSAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3BhdHRlcm4nLCBlbC5kYXRhc2V0Ll9wYXQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoZWwucmVxdWlyZWQpICAgICAgICAgICAgICB7IGVsLmRhdGFzZXQuX3JlcSA9ICcxJzsgZWwucmVxdWlyZWQgPSBmYWxzZTsgfQogICAgICAgICAgaWYgKGVsLmhhc0F0dHJpYnV0ZSgncGF0dGVybicpICYmICFlbC5kYXRhc2V0Ll9wYXQpIHsKICAgICAgICAgICAgZWwuZGF0YXNldC5fcGF0ID0gZWwuZ2V0QXR0cmlidXRlKCdwYXR0ZXJuJyk7CiAgICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgncGF0dGVybicpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zdGVwLWluZGljYXRvcicpLmZvckVhY2gocyA9PiB7CiAgICAgIGNvbnN0IGFjdGl2ZSA9ICtzLmRhdGFzZXQuc3RlcCA9PT0gbjsKICAgICAgcy5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLCBhY3RpdmUpOwogICAgICBzLmNsYXNzTGlzdC50b2dnbGUoJ2RvbmUnLCAgICtzLmRhdGFzZXQuc3RlcCA8ICBuKTsKICAgICAgaWYgKGFjdGl2ZSkgcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsICdzdGVwJyk7IGVsc2Ugcy5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcpOwogICAgfSk7CiAgICBpZiAobiA9PT0gMykgcmVuZGVyU3VtbWFyeSgpOwogICAgaWYgKHN0ZXBJbml0aWFsaXNlZCkgeyAgIC8vIG5vdCBvbiBmaXJzdCBwYWludDogbmV2ZXIgbW92ZSB0aGUgcGFnZSBvciBzdGVhbCBmb2N1cyBqdXN0IGJlY2F1c2UgaXQgbG9hZGVkCiAgICAgIGNvbnN0IGggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc3RlcC1wYW5lbFtkYXRhLXN0ZXA9IicgKyBuICsgJyJdIC5jYXJkLWhlYWQgaDInKTsKICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnJlZ2lzdGVyLXN0ZXBzJyk\/LnNjcm9sbEludG9WaWV3Py4oeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnc3RhcnQnIH0pOwogICAgICBpZiAoaCkgeyBoLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTsgaC5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7IH0KICAgIH0KICAgIHN0ZXBJbml0aWFsaXNlZCA9IHRydWU7CiAgfQoKICBmdW5jdGlvbiBlc2NhcGVIdG1sKHMpIHsKICAgIHJldHVybiBTdHJpbmcocyA\/PyAnJykucmVwbGFjZSgvWyY8PiInXS9nLCBjID0+ICh7JyYnOicmYW1wOycsJzwnOicmbHQ7JywnPic6JyZndDsnLCciJzonJnF1b3Q7JywiJyI6JyYjMzk7J31bY10pKTsKICB9CgogIC8vIDQuOS40MTAg4oCUIG1vbmV5IGFzICLigqYxMiw1MDAiLiBUaGUgcHJpY2luZyBzaW11bGF0b3IgKHRoZSBTRUNPTkQgc2NyaXB0IGJsb2NrIGJlbG93KSBoYXMgaXRzIG93biBjb3B5LCBidXQgYSBibG9jaydzIGZ1bmN0aW9ucyBhcmUgcHJpdmF0ZSB0byBpdDogdGhlICJ5b3VyIHRyaWFsIGhhcwogIC8vIHN0YXJ0ZWQiIHN1bW1hcnkgZHJhd24gaGVyZSBhZnRlciBhIHN1Y2Nlc3NmdWwgc2lnbi11cCBjYWxsZWQgZm10KCkgYW5kIGhpdCBhIFJlZmVyZW5jZUVycm9yIOKAlCBBRlRFUiB0aGUgYWNjb3VudCBoYWQgYmVlbiBjcmVhdGVkIOKAlCB3aGljaCB0aGUgY2F0Y2ggcmVwb3J0ZWQgYXMKICAvLyAiQ291bGQgbm90IGNyZWF0ZSBhY2NvdW50LiBOZXR3b3JrIGVycm9yOiBDYW4ndCBmaW5kIHZhcmlhYmxlOiBmbXQiLiBUaGlzIGJsb2NrIG5lZWRzIGl0cyBvd24uCiAgZnVuY3Rpb24gZm10KHN5bSwgbikgewogICAgY29uc3QgdiA9IE51bWJlcihuIHx8IDApLCBmcmFjID0gTWF0aC5hYnModiAtIE1hdGgucm91bmQodikpID4gMC4wMDQ7ICAgLy8gd2hvbGUgYW1vdW50cyB3aXRob3V0IGRlY2ltYWxzOyBhbnl0aGluZyBlbHNlIHRvIHRoZSBrb2JvICjigqYzMCw2MzcuNTAsIG5vdCDigqYzMCw2MzcuNSkKICAgIHJldHVybiBzeW0gKyB2LnRvTG9jYWxlU3RyaW5nKCdlbi1ORycsIHttaW5pbXVtRnJhY3Rpb25EaWdpdHM6IGZyYWMgPyAyIDogMCwgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAyfSk7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJTdW1tYXJ5KCkgewogICAgY29uc3QgdmFsID0gbiA9PiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW25hbWU9IicgKyBuICsgJyJdJyk\/LnZhbHVlIHx8ICcnKS50cmltKCk7CiAgICBjb25zdCBvcHQgPSBpZCA9PiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpPy5zZWxlY3RlZE9wdGlvbnM\/LlswXT8udGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKTsKICAgIGNvbnN0IHJvdyA9IChrLCB2LCBtb25vKSA9PiAnPGRpdiBjbGFzcz0ic3VtLXJvdyI+PGR0PicgKyBrICsgJzwvZHQ+PGRkJyArIChtb25vID8gJyBjbGFzcz0ibW9ubyInIDogJycpICsgJz4nICsgKHYgPyBlc2NhcGVIdG1sKHYpIDogJzxzcGFuIHN0eWxlPSJjb2xvcjp2YXIoLS1yLW11dGVkKTtmb250LXdlaWdodDo1MDAiPuKAlDwvc3Bhbj4nKSArICc8L2RkPjwvZGl2Pic7CiAgICBjb25zdCBpYyA9IGQgPT4gJzxzdmcgY2xhc3M9ImljbyIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMTciIGhlaWdodD0iMTciIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuOCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JyArIGQgKyAnPC9zdmc+JzsKICAgIGNvbnN0IGNhcmQgPSAoaWNvbiwgdGl0bGUsIHN0ZXAsIHJvd3MpID0+ICc8c2VjdGlvbiBjbGFzcz0ic3VtLWNhcmQiPjxoZWFkZXI+PGgzPicgKyBpYyhpY29uKSArIHRpdGxlICsgJzwvaDM+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJzdW0tZWRpdCIgZGF0YS1nb3RvPSInICsgc3RlcCArICciPkVkaXQ8L2J1dHRvbj48L2hlYWRlcj48ZGwgc3R5bGU9Im1hcmdpbjowO2JvcmRlcjowO2JvcmRlci1yYWRpdXM6MCI+JyArIHJvd3MgKyAnPC9kbD48L3NlY3Rpb24+JzsKICAgIGNvbnN0IGdyb3VwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZy1zdHJ1Y3R1cmUtZ3JvdXAnKT8uY2hlY2tlZDsKICAgIGNvbnN0IGVzdCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2ltLXRvdGFsJyk\/LnRleHRDb250ZW50IHx8ICcnKS50cmltKCk7CiAgICBjb25zdCBlc3RMYmwgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpbS10b3RhbC1sYmwnKT8udGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKTsKICAgIGNvbnN0IHNlbGxlcnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW50ZW5kcy10by1zZWxsJyk\/LmNoZWNrZWQ7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3JkZXItc3VtbWFyeScpLmlubmVySFRNTCA9CiAgICAgIGNhcmQoJzxwYXRoIGQ9Ik00IDIxVjVhMiAyIDAgMCAxIDItMmg4YTIgMiAwIDAgMSAyIDJ2MTYiLz48cGF0aCBkPSJNMTYgOWgyYTIgMiAwIDAgMSAyIDJ2MTAiLz48cGF0aCBkPSJNOCA3aDRNOCAxMWg0TTggMTVoNCIvPjxwYXRoIGQ9Ik0zIDIxaDE4Ii8+JywgJ0NvbXBhbnknLCAxLAogICAgICAgIHJvdygnQ29tcGFueScsIHZhbCgnY29tcGFueV9uYW1lJykpICsgcm93KCdJbmR1c3RyeScsIG9wdCgncmVnLWluZHVzdHJ5JykpICsgcm93KCdTdHJ1Y3R1cmUnLCBncm91cCA\/ICdHcm91cCBvZiBDb21wYW5pZXMnIDogJ0luZGVwZW5kZW50IGNvbXBhbnknKSArIHJvdygnQ29udGFjdCcsIHZhbCgnY29udGFjdF9wZXJzb24nKSkgKyByb3coJ0NvbnRhY3QgZW1haWwnLCB2YWwoJ2VtYWlsJykpICsgKHZhbCgncGhvbmUnKSA\/IHJvdygnUGhvbmUnLCB2YWwoJ3Bob25lJykpIDogJycpICsgcm93KCdDb21wYW55IHNpemUnLCBvcHQoJ3JlZy1zaXplJykpKQogICAgICArIGNhcmQoJzxwYXRoIGQ9Ik0xMCAxNGE0LjUgNC41IDAgMCAwIDYuNCAwbDMtM2E0LjUgNC41IDAgMCAwLTYuNC02LjRsLTEgMSIvPjxwYXRoIGQ9Ik0xNCAxMGE0LjUgNC41IDAgMCAwLTYuNCAwbC0zIDNhNC41IDQuNSAwIDAgMCA2LjQgNi40bDEtMSIvPicsICdXb3Jrc3BhY2UnLCAxLAogICAgICAgIHJvdygnV29ya3NwYWNlIFVSTCcsIEJBU0VfVVJMICsgdmFsKCdzdWJkb21haW4nKSwgdHJ1ZSkpCiAgICAgICsgY2FyZCgnPGNpcmNsZSBjeD0iMTIiIGN5PSI4IiByPSI0Ii8+PHBhdGggZD0iTTQgMjFhOCA4IDAgMCAxIDE2IDAiLz4nLCAnVGVuYW50IEFkbWluJywgMiwKICAgICAgICByb3coJ05hbWUnLCB2YWwoJ2FkbWluX2Z1bGxfbmFtZScpKSArICh2YWwoJ2FkbWluX2pvYl90aXRsZScpID8gcm93KCdKb2IgdGl0bGUnLCB2YWwoJ2FkbWluX2pvYl90aXRsZScpKSA6ICcnKSArIHJvdygnTW9iaWxlJywgdmFsKCdhZG1pbl9tb2JpbGUnKSkgKyByb3coJ1VzZXJuYW1lJywgdmFsKCdhZG1pbl91c2VybmFtZScpLCB0cnVlKSArIChzZWxsZXJzID8gcm93KCdNYXJrZXRwbGFjZScsICdJbnRlbmRzIHRvIHNlbGwgKFNlbGxlciBiYWRnZSBhZnRlciBLWUMpJykgOiAnJykpCiAgICAgICsgKChlc3QgJiYgZXN0ICE9PSAn4oCUJykgPyAnPGRpdiBjbGFzcz0ic3VtLWVzdCI+PGRpdj48c21hbGw+RXN0aW1hdGVkIGNvc3QgYWZ0ZXIgeW91ciBmcmVlIHRyaWFsIMK3ICcgKyBlc2NhcGVIdG1sKGVzdExibCB8fCAnVG90YWwnKSArICc8L3NtYWxsPjxzdHJvbmc+JyArIGVzY2FwZUh0bWwoZXN0KSArICc8L3N0cm9uZz48L2Rpdj48ZW0+MTQgZGF5cyBmcmVlIMK3IG5vIGNhcmQgbmVlZGVkPC9lbT48L2Rpdj4nIDogJycpOwogIH0KCiAgLy8gIkVkaXQiIG9uIGEgc3VtbWFyeSBjYXJkIGp1bXBzIGJhY2sgdG8gdGhhdCBzdGVwLgogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7IGNvbnN0IGIgPSBlLnRhcmdldC5jbG9zZXN0KCdbZGF0YS1nb3RvXScpOyBpZiAoYikgc2V0U3RlcCgrYi5kYXRhc2V0LmdvdG8pOyB9KTsKCiAgLy8g4pSA4pSAIElubGluZSB2YWxpZGF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogIC8vIEVycm9ycyBhcHBlYXIgYmVzaWRlIHRoZSBmaWVsZCB0aGF0IG5lZWRzIGF0dGVudGlvbiAoYW5kIGluIGEgc3VtbWFyeSBhYm92ZSB0aGUgYnV0dG9ucyksIG5ldmVyIGluIGEgYmxvY2tpbmcgYnJvd3NlciBhbGVydCgpLgogIGZ1bmN0aW9uIGNsZWFyRmllbGRFcnJvcihlbCkgewogICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnaXMtaW52YWxpZCcpOyBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcpOwogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmZpZWxkLWVycm9yW2RhdGEtZm9yPSInICsgZWwuaWQgKyAnIl0nKS5mb3JFYWNoKG4gPT4gbi5yZW1vdmUoKSk7CiAgICBlbC5jbG9zZXN0KCcucmVnLXNsdWctcm93Jyk\/LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWludmFsaWQnKTsKICAgIGlmIChlbC5pZCA9PT0gJ3Rlcm1zLWFjY2VwdGVkJykgeyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVybXMtYm94Jyk\/LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWludmFsaWQnKTsgY29uc3QgdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXJtcy1lcnJvcicpOyBpZiAodCkgdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOyB9CiAgfQogIGZ1bmN0aW9uIHNldEZpZWxkRXJyb3IoZWwsIG1zZykgewogICAgY2xlYXJGaWVsZEVycm9yKGVsKTsKICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2lzLWludmFsaWQnKTsgZWwuc2V0QXR0cmlidXRlKCdhcmlhLWludmFsaWQnLCAndHJ1ZScpOwogICAgY29uc3QgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTsgcC5jbGFzc05hbWUgPSAnZmllbGQtZXJyb3InOyBwLmRhdGFzZXQuZm9yID0gZWwuaWQ7IHAuaWQgPSBlbC5pZCArICctZXJyJzsgcC50ZXh0Q29udGVudCA9IG1zZzsgcC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnYWxlcnQnKTsKICAgIChlbC5jbG9zZXN0KCcucGFzc3dvcmQtZmllbGQtd3JhcCcpIHx8IGVsLmNsb3Nlc3QoJy5yZWctc2x1Zy1yb3cnKSB8fCBlbCkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIHApOwogICAgaWYgKGVsLmNsb3Nlc3QoJy5yZWctc2x1Zy1yb3cnKSkgZWwuY2xvc2VzdCgnLnJlZy1zbHVnLXJvdycpLmNsYXNzTGlzdC5hZGQoJ2lzLWludmFsaWQnKTsKICB9CiAgZnVuY3Rpb24gY2xlYXJQYW5lbEFsZXJ0cygpIHsgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBhbmVsLWFsZXJ0JykuZm9yRWFjaChhID0+IHsgYS5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7IGEudGV4dENvbnRlbnQgPSAnJzsgfSk7IH0KICBmdW5jdGlvbiBzaG93UGFuZWxBbGVydChzdGVwLCBuKSB7CiAgICBjb25zdCBhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBhbmVsLWFsZXJ0W2RhdGEtZm9yPSInICsgc3RlcCArICciXScpOyBpZiAoIWEpIHJldHVybjsKICAgIGEuaW5uZXJIVE1MID0gJzxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj7imqDvuI88L3NwYW4+PGRpdj48c3Ryb25nPlBsZWFzZSBjaGVjayAnICsgKG4gPT09IDEgPyAndGhlIGhpZ2hsaWdodGVkIGZpZWxkJyA6ICd0aGUgJyArIG4gKyAnIGhpZ2hsaWdodGVkIGZpZWxkcycpICsgJzwvc3Ryb25nPiBiZWZvcmUgY29udGludWluZy48L2Rpdj4nOwogICAgYS5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7CiAgfQogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNjb2xsYWItcmVnaXN0ZXItZm9ybSAuZm9ybS1jb250cm9sJykuZm9yRWFjaChlbCA9PiB7CiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHsgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnaXMtaW52YWxpZCcpKSBjbGVhckZpZWxkRXJyb3IoZWwpOyB9KTsKICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnaXMtaW52YWxpZCcpKSBjbGVhckZpZWxkRXJyb3IoZWwpOyB9KTsKICB9KTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVybXMtYWNjZXB0ZWQnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZSA9PiB7IGlmIChlLnRhcmdldC5jaGVja2VkKSBjbGVhckZpZWxkRXJyb3IoZS50YXJnZXQpOyB9KTsKICAvLyBSZXBvcnQgYSBsaXN0IG9mIFtlbGVtZW50LCBtZXNzYWdlXSBwcm9ibGVtczogbWFyayB0aGVtIGFsbCwgc3VtbWFyaXNlLCBhbmQgdGFrZSB0aGUgcGVyc29uIHRvIHRoZSBmaXJzdCBvbmUuCiAgZnVuY3Rpb24gcmVwb3J0UHJvYmxlbXMoc3RlcCwgcHJvYmxlbXMpIHsKICAgIHByb2JsZW1zLmZvckVhY2goKFtlbCwgbXNnXSkgPT4gc2V0RmllbGRFcnJvcihlbCwgbXNnKSk7CiAgICBzaG93UGFuZWxBbGVydChzdGVwLCBwcm9ibGVtcy5sZW5ndGgpOwogICAgY29uc3QgZmlyc3QgPSBwcm9ibGVtc1swXVswXTsKICAgIGZpcnN0LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTsKICAgIGZpcnN0LnNjcm9sbEludG9WaWV3Py4oeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJyB9KTsKICB9CiAgY29uc3QgRU1BSUxfUkUgPSAvXlteXHNAXStAW15cc0BdK1wuW15cc0BdezIsfSQvOwoKICAvLyDilIDilIAgTmV4dCAvIHByZXYgYnV0dG9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbmV4dF0nKS5mb3JFYWNoKGJ0biA9PiBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7CiAgICBjb25zdCBuZXh0ID0gK2J0bi5kYXRhc2V0Lm5leHQ7CiAgICBjbGVhclBhbmVsQWxlcnRzKCk7CiAgICBjb25zdCBmaWVsZCA9IGlkID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKICAgIGNvbnN0IHByb2JsZW1zID0gW107CgogICAgaWYgKG5leHQgPT09IDIpIHsKICAgICAgLy8gU3RlcCAxIGZpZWxkcyBhcmUgbWFya2VkIGByZXF1aXJlZGAgaW4gdGhlIEhUTUwsIGJ1dCB0aGUgZm9ybSBpdHNlbGYgaGFzIGBub3ZhbGlkYXRlYCAodGhlIHdpemFyZCBzaG93cy9oaWRlcyBzdGVwcyksIHNvIG5vdGhpbmcgZWxzZSBlbmZvcmNlcyB0aGVtIGJlZm9yZSBOZXh0LgogICAgICBjb25zdCBjb21wYW55ID0gZmllbGQoJ3JlZy1jb21wYW55LW5hbWUnKSwgaW5kdXN0cnkgPSBmaWVsZCgncmVnLWluZHVzdHJ5JyksIGNvbnRhY3QgPSBmaWVsZCgncmVnLWNvbnRhY3QnKSwgZW1haWwgPSBmaWVsZCgncmVnLWVtYWlsJyksIHN1YiA9IGZpZWxkKCdyZWctc3ViZG9tYWluJyk7CiAgICAgIGlmICghY29tcGFueS52YWx1ZS50cmltKCkpICBwcm9ibGVtcy5wdXNoKFtjb21wYW55LCAnQ29tcGFueSBuYW1lIGlzIHJlcXVpcmVkJ10pOwogICAgICBpZiAoIWluZHVzdHJ5LnZhbHVlLnRyaW0oKSkgcHJvYmxlbXMucHVzaChbaW5kdXN0cnksICdQbGVhc2Ugc2VsZWN0IHlvdXIgaW5kdXN0cnknXSk7CiAgICAgIGlmICghc3ViLnZhbHVlLnRyaW0oKSB8fCBzdWIudmFsdWUudHJpbSgpLmxlbmd0aCA8IDMpIHByb2JsZW1zLnB1c2goW3N1YiwgJ1dvcmtzcGFjZSBVUkwgc2x1ZyBpcyByZXF1aXJlZCAobWluIDMgY2hhcmFjdGVycyknXSk7CiAgICAgIGVsc2UgaWYgKGZpZWxkKCdyZWctc3ViZG9tYWluLXN0YXR1cycpLmNsYXNzTGlzdC5jb250YWlucygnaXMtYmFkJykpIHByb2JsZW1zLnB1c2goW3N1YiwgJ1RoYXQgd29ya3NwYWNlIGFkZHJlc3MgaXNuXCd0IGF2YWlsYWJsZSDigJQgcGxlYXNlIGNob29zZSBhbm90aGVyJ10pOwogICAgICBpZiAoIWNvbnRhY3QudmFsdWUudHJpbSgpKSAgcHJvYmxlbXMucHVzaChbY29udGFjdCwgJ0NvbnRhY3QgcGVyc29uIGlzIHJlcXVpcmVkJ10pOwogICAgICBpZiAoIWVtYWlsLnZhbHVlLnRyaW0oKSkgICAgcHJvYmxlbXMucHVzaChbZW1haWwsICdBIHZhbGlkIGVtYWlsIGFkZHJlc3MgaXMgcmVxdWlyZWQnXSk7CiAgICAgIGVsc2UgaWYgKCFFTUFJTF9SRS50ZXN0KGVtYWlsLnZhbHVlLnRyaW0oKSkpIHByb2JsZW1zLnB1c2goW2VtYWlsLCAnVGhhdCBlbWFpbCBhZGRyZXNzIGRvZXNuXCd0IGxvb2sgcmlnaHQnXSk7CiAgICB9CgogICAgaWYgKG5leHQgPT09IDMpIHsKICAgICAgY29uc3QgZnVsbE5hbWUgPSBmaWVsZCgnYWRtaW4tZnVsbG5hbWUnKSwgbW9iaWxlID0gZmllbGQoJ2FkbWluLW1vYmlsZScpLCB1c2VyID0gZmllbGQoJ2FkbWluLXVzZXJuYW1lJyksIHB3ID0gZmllbGQoJ2FkbWluLXBhc3N3b3JkJyksIHB3YyA9IGZpZWxkKCdhZG1pbi1wYXNzd29yZC1jb25maXJtJyk7CiAgICAgIGlmICghZnVsbE5hbWUudmFsdWUudHJpbSgpKSBwcm9ibGVtcy5wdXNoKFtmdWxsTmFtZSwgJ0Z1bGwgbmFtZSBpcyByZXF1aXJlZCddKTsKICAgICAgaWYgKCFtb2JpbGUudmFsdWUudHJpbSgpKSAgIHByb2JsZW1zLnB1c2goW21vYmlsZSwgJ01vYmlsZSBudW1iZXIgaXMgcmVxdWlyZWQnXSk7CiAgICAgIGlmICh1c2VyLnZhbHVlLnRyaW0oKS5sZW5ndGggPCAzKSBwcm9ibGVtcy5wdXNoKFt1c2VyLCAnVXNlcm5hbWUgbXVzdCBiZSBhdCBsZWFzdCAzIGNoYXJhY3RlcnMnXSk7CiAgICAgIGVsc2UgaWYgKCEvXlthLXpBLVowLTlfLkAtXSskLy50ZXN0KHVzZXIudmFsdWUudHJpbSgpKSkgcHJvYmxlbXMucHVzaChbdXNlciwgJ0xldHRlcnMsIG51bWJlcnMsIHVuZGVyc2NvcmVzLCBkb3RzLCBoeXBoZW5zLCBvciBhbiBlbWFpbCBhZGRyZXNzIG9ubHknXSk7CiAgICAgIGlmIChwdy52YWx1ZS5sZW5ndGggPCA4KSAgICBwcm9ibGVtcy5wdXNoKFtwdywgJ1Bhc3N3b3JkIG11c3QgYmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzJ10pOwogICAgICBlbHNlIGlmIChwdy52YWx1ZSAhPT0gcHdjLnZhbHVlKSBwcm9ibGVtcy5wdXNoKFtwd2MsICdQYXNzd29yZHMgZG8gbm90IG1hdGNoJ10pOwogICAgfQoKICAgIGlmIChwcm9ibGVtcy5sZW5ndGgpIHsgcmVwb3J0UHJvYmxlbXMobmV4dCAtIDEsIHByb2JsZW1zKTsgcmV0dXJuOyB9CiAgICBzZXRTdGVwKG5leHQpOwogIH0pKTsKCiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcHJldl0nKS5mb3JFYWNoKGJ0biA9PgogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc2V0U3RlcCgrYnRuLmRhdGFzZXQucHJldikpCiAgKTsKCiAgLy8gQmxvY2sgRW50ZXIgb24gc3RlcHMgMeKAkzIgKGFkdmFuY2UgaW5zdGVhZCBvZiBzdWJtaXQpCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGxhYi1yZWdpc3Rlci1mb3JtJykuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4gewogICAgaWYgKGUua2V5ICE9PSAnRW50ZXInIHx8IGUudGFyZ2V0LnRhZ05hbWUgPT09ICdURVhUQVJFQScpIHJldHVybjsKICAgIGNvbnN0IGFjdGl2ZSA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0ZXAtcGFuZWwnKSkuZmluZChwID0+IHAuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnKTsKICAgIGlmIChhY3RpdmUgJiYgK2FjdGl2ZS5kYXRhc2V0LnN0ZXAgIT09IDMpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBhY3RpdmUucXVlcnlTZWxlY3RvcignW2RhdGEtbmV4dF0nKT8uY2xpY2soKTsKICAgIH0KICB9KTsKCiAgLy8gU3RhcnQgb24gc3RlcCAxCiAgc2V0U3RlcCgxKTsKCiAgLy8g4pSA4pSAIEZvcm0gc3VibWl0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbGFiLXJlZ2lzdGVyLWZvcm0nKS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBhc3luYyBmdW5jdGlvbiAoZSkgewogICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgY29uc3QgYnRuICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuLWNvbXBsZXRlJyk7CiAgICBjb25zdCBvcmlnSFRNTCA9IGJ0bi5pbm5lckhUTUw7CgogICAgY29uc3QgcmVxdWlyZWQgPSBbCiAgICAgIFsnY29tcGFueV9uYW1lJywgICAgICAgICAgJ0NvbXBhbnkgbmFtZSBpcyByZXF1aXJlZCddLAogICAgICBbJ2luZHVzdHJ5JywgICAgICAgICAgICAgICdQbGVhc2Ugc2VsZWN0IHlvdXIgaW5kdXN0cnknXSwKICAgICAgWydlbWFpbCcsICAgICAgICAgICAgICAgICAnQSB2YWxpZCBlbWFpbCBhZGRyZXNzIGlzIHJlcXVpcmVkJ10sCiAgICAgIFsnc3ViZG9tYWluJywgICAgICAgICAgICAgJ1dvcmtzcGFjZSBzdWJkb21haW4gaXMgcmVxdWlyZWQnXSwKICAgICAgWydhZG1pbl9mdWxsX25hbWUnLCAgICAgICAnQWRtaW4gZnVsbCBuYW1lIGlzIHJlcXVpcmVkJ10sCiAgICAgIFsnYWRtaW5fbW9iaWxlJywgICAgICAgICAgJ01vYmlsZSBudW1iZXIgaXMgcmVxdWlyZWQnXSwKICAgICAgWydhZG1pbl91c2VybmFtZScsICAgICAgICAnQWRtaW4gdXNlcm5hbWUgaXMgcmVxdWlyZWQgKG1pbiAzIGNoYXJzKSddLAogICAgICBbJ2FkbWluX3Bhc3N3b3JkJywgICAgICAgICdQYXNzd29yZCBpcyByZXF1aXJlZCAobWluIDggY2hhcnMpJ10sCiAgICAgIFsnYWRtaW5fcGFzc3dvcmRfY29uZmlybScsJ1BsZWFzZSBjb25maXJtIHRoZSBwYXNzd29yZCddLAogICAgXTsKCiAgICBjbGVhclBhbmVsQWxlcnRzKCk7CiAgICAvLyBUYWtlIHRoZSBwZXJzb24gdG8gdGhlIHN0ZXAgdGhhdCBob2xkcyB0aGUgcHJvYmxlbSwgdGhlbiBtYXJrIHRoZSBmaWVsZCB0aGVyZS4KICAgIGNvbnN0IGdvVG9GaWVsZCA9IChlbCwgbXNnKSA9PiB7CiAgICAgIGNvbnN0IHBhbmVsID0gZWwuY2xvc2VzdCgnLnN0ZXAtcGFuZWwnKTsKICAgICAgc2V0U3RlcChwYW5lbCA\/ICtwYW5lbC5kYXRhc2V0LnN0ZXAgOiAxKTsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsgc2V0RmllbGRFcnJvcihlbCwgbXNnKTsgZWwuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pOyBlbC5zY3JvbGxJbnRvVmlldz8uKHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ2NlbnRlcicgfSk7IH0pOwogICAgfTsKCiAgICBmb3IgKGNvbnN0IFtuYW1lLCBtc2ddIG9mIHJlcXVpcmVkKSB7CiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW25hbWU9IicgKyBuYW1lICsgJyJdJyk7CiAgICAgIGlmICghKGVsPy52YWx1ZSB8fCAnJykudHJpbSgpKSB7IGdvVG9GaWVsZChlbCwgbXNnKTsgcmV0dXJuOyB9CiAgICB9CgogICAgY29uc3QgdXNlckVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW25hbWU9YWRtaW5fdXNlcm5hbWVdJyk7CiAgICBjb25zdCB1c2VyID0gdXNlckVsLnZhbHVlLnRyaW0oKTsKICAgIGlmICghL15bYS16QS1aMC05Xy5ALV0rJC8udGVzdCh1c2VyKSB8fCB1c2VyLmxlbmd0aCA8IDMpIHsgZ29Ub0ZpZWxkKHVzZXJFbCwgJ1VzZXJuYW1lOiBsZXR0ZXJzLCBudW1iZXJzLCB1bmRlcnNjb3JlcywgZG90cywgaHlwaGVucywgb3IgYW4gZW1haWwgYWRkcmVzcyAobWluIDMgY2hhcmFjdGVycyknKTsgcmV0dXJuOyB9CgogICAgY29uc3Qgc3ViRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbbmFtZT1zdWJkb21haW5dJyk7CiAgICBpZiAoIS9eWy1hLXowLTldKyQvLnRlc3Qoc3ViRWwudmFsdWUudHJpbSgpKSkgeyBnb1RvRmllbGQoc3ViRWwsICdTdWJkb21haW46IGxvd2VyY2FzZSBsZXR0ZXJzLCBudW1iZXJzLCBoeXBoZW5zIG9ubHknKTsgcmV0dXJuOyB9CgogICAgY29uc3QgcHcgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkbWluLXBhc3N3b3JkJykudmFsdWU7CiAgICBjb25zdCBwdzIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRtaW4tcGFzc3dvcmQtY29uZmlybScpLnZhbHVlOwogICAgaWYgKHB3Lmxlbmd0aCA8IDgpIHsgZ29Ub0ZpZWxkKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZG1pbi1wYXNzd29yZCcpLCAnUGFzc3dvcmQgbXVzdCBiZSBhdCBsZWFzdCA4IGNoYXJhY3RlcnMnKTsgcmV0dXJuOyB9CiAgICBpZiAocHcgIT09IHB3MikgICAgeyBnb1RvRmllbGQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkbWluLXBhc3N3b3JkLWNvbmZpcm0nKSwgJ1Bhc3N3b3JkcyBkbyBub3QgbWF0Y2gnKTsgcmV0dXJuOyB9CgogICAgLy8gVGVybXMgb2YgU2VydmljZSDigJQgcmVxdWlyZWQuIEVuZm9yY2VkIGFnYWluIHNlcnZlci1zaWRlIChyZWdpc3Rlcl90ZW5hbnQgcmVqZWN0cyBhIHJlcXVlc3Qgd2l0aG91dCB0ZXJtc19hY2NlcHRlZCk7IHRoaXMgaXMgdGhlIGZyaWVuZGxpZXIgY2xpZW50LXNpZGUgdmVyc2lvbi4KICAgIGNvbnN0IHRlcm1zQm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlcm1zLWFjY2VwdGVkJyk7CiAgICBjb25zdCB0ZXJtc0VyciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXJtcy1lcnJvcicpOwogICAgaWYgKCF0ZXJtc0JveD8uY2hlY2tlZCkgewogICAgICBzZXRTdGVwKDMpOwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVybXMtYm94Jyk\/LmNsYXNzTGlzdC5hZGQoJ2lzLWludmFsaWQnKTsKICAgICAgaWYgKHRlcm1zRXJyKSB0ZXJtc0Vyci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgdGVybXNCb3g\/LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlcm1zLWJveCcpPy5zY3JvbGxJbnRvVmlldz8uKHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ2NlbnRlcicgfSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0ZXJtc0VycikgdGVybXNFcnIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKCiAgICBidG4uZGlzYWJsZWQgPSB0cnVlOwogICAgYnRuLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz0ic3Bpbm5lciI+PC9zcGFuPiBDcmVhdGluZyBhY2NvdW504oCmJzsKCiAgICBjb25zdCBmZCA9IG5ldyBGb3JtRGF0YShlLnRhcmdldCk7CiAgICBjb25zdCBwYXlsb2FkID0ge307CiAgICBmZC5mb3JFYWNoKCh2LCBrKSA9PiB7CiAgICAgIGlmIChrLmVuZHNXaXRoKCdbXScpKSB7IHBheWxvYWRbay5zbGljZSgwLC0yKV0gPSAocGF5bG9hZFtrLnNsaWNlKDAsLTIpXXx8W10pOyBwYXlsb2FkW2suc2xpY2UoMCwtMildLnB1c2godik7IH0KICAgICAgZWxzZSBwYXlsb2FkW2tdID0gdjsKICAgIH0pOwogICAgLy8gTnVtYmVyIG9mIFVzZXJzIGFuZCBCaWxsaW5nIEN5Y2xlIGxpdmUgaW4gdGhlICJFc3RpbWF0ZSBZb3VyIENvc3QiCiAgICAvLyBzaW11bGF0b3IgYWJvdmUgdGhlIGZvcm0gcmF0aGVyIHRoYW4gYXMgZm9ybSBmaWVsZHMgdGhlbXNlbHZlcyDigJQKICAgIC8vIGl0IG5lZWRzIHRvIHdvcmsgc3RhbmRhbG9uZSAoYSB2aXNpdG9yIHBsYXlzIHdpdGggaXQgYmVmb3JlIGV2ZXIKICAgIC8vIHN0YXJ0aW5nIFN0ZXAgMSksIHNvIGl0cyBpbnB1dHMgYXJlbid0IGluc2lkZSA8Zm9ybT4uIFB1bGwgdGhlaXIKICAgIC8vIGN1cnJlbnQgdmFsdWVzIGluIGhlcmUgaW5zdGVhZCBvZiBkdXBsaWNhdGluZyBhIHNlY29uZCBzZXQgb2YKICAgIC8vIGlucHV0cyB0aGUgY3VzdG9tZXIgd291bGQgaGF2ZSB0byBrZWVwIGluIHN5bmMgYnkgaGFuZC4KICAgIGNvbnN0IHNpbVVzZXJzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2ltLXVzZXJzJyk7CiAgICBpZiAoc2ltVXNlcnNFbCkgcGF5bG9hZC5udW1fdXNlcnMgPSBwYXJzZUludChzaW1Vc2Vyc0VsLnZhbHVlLCAxMCkgfHwgdW5kZWZpbmVkOwogICAgcGF5bG9hZC5iaWxsaW5nX2N5Y2xlID0gKHdpbmRvdy5TSU1fQ1lDTEUgPT09ICdhbm51YWwnKSA\/ICdhbm51YWwnIDogJ21vbnRobHknOwogICAgaWYgKHBheWxvYWQubnVtX3VzZXJzKSBwYXlsb2FkLm51bV91c2VycyA9IHBhcnNlSW50KHBheWxvYWQubnVtX3VzZXJzLCAxMCk7CiAgICAvLyBNb2R1bGVzIHRpY2tlZCBpbiB0aGUgc2ltdWxhdG9yIGFib3ZlIOKAlCBwcmV2aW91c2x5IGNvbGxlY3RlZCBwdXJlbHkKICAgIC8vIGZvciB0aGUgY2xpZW50LXNpZGUgY29zdCBlc3RpbWF0ZSBhbmQgbmV2ZXIgYWN0dWFsbHkgc2VudCB0byB0aGUKICAgIC8vIHNlcnZlci4gTm93IHNlbnQgc28gcmVnaXN0ZXJfdGVuYW50KCkgY2FuIGF1dG8tYWN0aXZhdGUgZXhhY3RseQogICAgLy8gdGhlc2UgYXMgYSA3LWRheSBmcmVlIHRyaWFsIChzZWUgdGhlIHN1bW1hcnkgc2NyZWVuIHNob3duIGFmdGVyCiAgICAvLyBhIHN1Y2Nlc3NmdWwgcmVnaXN0cmF0aW9uIGJlbG93KS4KICAgIHBheWxvYWQuc2VsZWN0ZWRfbW9kdWxlX2tleXMgPSBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNpbS1tb2QtY2hrOmNoZWNrZWQnKV0ubWFwKGNiID0+IGNiLmRhdGFzZXQua2V5KS5maWx0ZXIoQm9vbGVhbik7CiAgICAvLyBwYWNrYWdlX3NsdWc6IHBhY2thZ2VzIHdlcmUgcmVtb3ZlZCAobW9kdWxlcyBhcmUgcHVyY2hhc2VkCiAgICAvLyBwb3N0LXJlZ2lzdHJhdGlvbiBmcm9tIHRoZSBNYXJrZXRwbGFjZSBpbnN0ZWFkKSDigJQgdGhpcyBmaWVsZCBoYXMKICAgIC8vIG5vIGZvcm0gaW5wdXQgYW55bW9yZSwgc28gaXQncyBhbHdheXMgZW1wdHk7IHN0cmlwcGVkIGZvciBjbGFyaXR5LgogICAgLy8gYmlsbGluZ19jeWNsZSwgdW5saWtlIHBhY2thZ2Vfc2x1ZywgSVMgbWVhbmluZ2Z1bCBhZ2FpbiBub3cgdGhhdAogICAgLy8gdGhlIHNpbXVsYXRvciBjb2xsZWN0cyBhIHJlYWwgcHJlZmVyZW5jZSDigJQgQ29sbGFiX1RlbmFudDo6Y3JlYXRlKCkKICAgIC8vIGFscmVhZHkgcmVhZHMgaXQgdG8gc2V0IHRoZSB0ZW5hbnQncyBwbGFuX3R5cGUsIHNvIGl0J3Mga2VwdC4KICAgIGRlbGV0ZSBwYXlsb2FkLnBhY2thZ2Vfc2x1ZzsKCiAgICBjb25zdCBzaG93RXJyb3IgPSBtc2cgPT4gewogICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTsgYnRuLmlubmVySFRNTCA9IG9yaWdIVE1MOwogICAgICBsZXQgYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZ2lzdGVyLWVycm9yLWJveCcpOwogICAgICBpZiAoIWJveCkgewogICAgICAgIGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIGJveC5pZCA9ICdyZWdpc3Rlci1lcnJvci1ib3gnOwogICAgICAgIGJveC5jbGFzc05hbWUgPSAnYWxlcnQgYWxlcnQtZGFuZ2VyJzsKICAgICAgICBib3guc2V0QXR0cmlidXRlKCdyb2xlJywgJ2FsZXJ0Jyk7CiAgICAgICAgY29uc3Qgc2xvdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWdpc3Rlci1hbGVydC1zbG90Jyk7CiAgICAgICAgaWYgKHNsb3QpIHNsb3QuYXBwZW5kQ2hpbGQoYm94KTsKICAgICAgICBlbHNlIHsgYm94LnN0eWxlLm1hcmdpbkJvdHRvbSA9ICcxNnB4JzsgYnRuLmNsb3Nlc3QoJy5jYXJkJykuaW5zZXJ0QmVmb3JlKGJveCwgYnRuLmNsb3Nlc3QoJ2RpdltzdHlsZSo9Imp1c3RpZnktY29udGVudCJdJykpOyB9ICAgLy8gb2xkZXIgbWFya3VwIHdpdGhvdXQgdGhlIHNsb3QKICAgICAgfQogICAgICBib3guaW5uZXJIVE1MID0gYDxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj7imqDvuI88L3NwYW4+PGRpdj48c3Ryb25nPkNvdWxkIG5vdCBjcmVhdGUgYWNjb3VudC48L3N0cm9uZz48YnI+JHtlc2NhcGVIdG1sKG1zZyl9PC9kaXY+YDsKICAgICAgYm94LnNjcm9sbEludG9WaWV3Py4oeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJyB9KTsKICAgICAgd2luZG93LkNvbGxhYkFwcD8udG9hc3Q\/Lihtc2csICdlcnJvcicpOwogICAgfTsKCiAgICBsZXQgcmVnaXN0ZXJlZCA9IG51bGw7ICAgLy8gdGhlIHNlcnZlcidzIGFuc3dlciwgb25jZSBhbiBhY2NvdW50IGhhcyBSRUFMTFkgYmVlbiBjcmVhdGVkIOKAlCBmcm9tIHRoZW4gb24gbm90aGluZyBvbiB0aGlzIHBhZ2UgbWF5IGNhbGwgdGhlIHNpZ24tdXAgYSBmYWlsdXJlCiAgICB0cnkgewogICAgICBsZXQgcmVnLCB0ZXh0LCBsYXN0RXJyOwogICAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSAzOyBhdHRlbXB0KyspIHsKICAgICAgICB0cnkgewogICAgICAgICAgcmVnICA9IGF3YWl0IGZldGNoKFJFU1QgKyAnL3JlZ2lzdGVyJywgewogICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnWC1XUC1Ob25jZSc6IG5vbmNlIH0sCiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLAogICAgICAgICAgfSk7CiAgICAgICAgICB0ZXh0ID0gYXdhaXQgcmVnLnRleHQoKTsKICAgICAgICAgIGlmICgvRXJyb3IgZXN0YWJsaXNoaW5nIGEgZGF0YWJhc2UgY29ubmVjdGlvbi9pLnRlc3QodGV4dCkpIHsKICAgICAgICAgICAgbGFzdEVyciA9IG5ldyBFcnJvcignRGF0YWJhc2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUnKTsKICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCAzKSB7IGJ0bi5pbm5lckhUTUwgPSBg4o+zIFJldHJ5aW5n4oCmICgke2F0dGVtcHR9LzMpYDsgYXdhaXQgbmV3IFByb21pc2Uocj0+c2V0VGltZW91dChyLDE1MDAqYXR0ZW1wdCkpOyBjb250aW51ZTsgfQogICAgICAgICAgICB0aHJvdyBsYXN0RXJyOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBjYXRjaCAoZmV0Y2hFcnIpIHsKICAgICAgICAgIGxhc3RFcnIgPSBmZXRjaEVycjsKICAgICAgICAgIGlmIChhdHRlbXB0IDwgMykgeyBidG4uaW5uZXJIVE1MID0gYOKPsyBSZXRyeWluZ+KApiAoJHthdHRlbXB0fS8zKWA7IGF3YWl0IG5ldyBQcm9taXNlKHI9PnNldFRpbWVvdXQociwxNTAwKmF0dGVtcHQpKTsgY29udGludWU7IH0KICAgICAgICAgIHRocm93IGZldGNoRXJyOwogICAgICAgIH0KICAgICAgfQoKICAgICAgbGV0IGRhdGE7CiAgICAgIHRyeSB7IGRhdGEgPSBKU09OLnBhcnNlKHRleHQpOyB9CiAgICAgIGNhdGNoIChfKSB7CiAgICAgICAgc2hvd0Vycm9yKC9FcnJvciBlc3RhYmxpc2hpbmcgYSBkYXRhYmFzZSBjb25uZWN0aW9uL2kudGVzdCh0ZXh0KQogICAgICAgICAgPyAnRGF0YWJhc2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUg4oCUIHBsZWFzZSB3YWl0IGEgbW9tZW50IGFuZCB0cnkgYWdhaW4uJwogICAgICAgICAgOiBgU2VydmVyIHJldHVybmVkIEhUVFAgJHtyZWcuc3RhdHVzfS4gQ2hlY2sgdGhhdCB0aGUgcGx1Z2luIGlzIGFjdGl2ZS5gKTsKICAgICAgICBjb25zb2xlLmVycm9yKCdbUmVnaXN0ZXJdIE5vbi1KU09OOicsIHRleHQuc3Vic3RyaW5nKDAsNTAwKSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAoIXJlZy5vayB8fCBkYXRhLmNvZGUpIHsgc2hvd0Vycm9yKGRhdGEubWVzc2FnZSB8fCBkYXRhLmNvZGUgfHwgYEhUVFAgJHtyZWcuc3RhdHVzfWApOyByZXR1cm47IH0KCiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHsKICAgICAgICByZWdpc3RlcmVkID0gZGF0YTsKICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3RlcC1pbmRpY2F0b3InKS5mb3JFYWNoKHMgPT4geyBzLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOyBzLmNsYXNzTGlzdC5hZGQoJ2RvbmUnKTsgfSk7CiAgICAgICAgY29uc3QgY2FyZCA9IGJ0bi5jbG9zZXN0KCcuY2FyZCcpOwogICAgICAgIGNvbnN0IGNob3NlblVzZXJuYW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW25hbWU9YWRtaW5fdXNlcm5hbWVdJyk\/LnZhbHVlIHx8ICcnOwogICAgICAgIGNvbnN0IGNob3NlblN1YmRvbWFpbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPXN1YmRvbWFpbl0nKT8udmFsdWUgfHwgJyc7CiAgICAgICAgYnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CgogICAgICAgIC8vIFRyaWFsIHN1bW1hcnkg4oCUIG1vZHVsZSBsaXN0LCBpbmRpdmlkdWFsICsgdG90YWwgbW9udGhseSBjb3N0LAogICAgICAgIC8vIGFuZCB0aGUgNy1kYXkgdHJpYWwgZW5kIGRhdGUuIE9ubHkgcmVuZGVyZWQgd2hlbiBhdCBsZWFzdCBvbmUKICAgICAgICAvLyBtb2R1bGUgd2FzIGFjdHVhbGx5IHNlbGVjdGVkL2FjdGl2YXRlZDsgb3RoZXJ3aXNlIHRoaXMgc2VjdGlvbgogICAgICAgIC8vIGlzIHNpbXBseSBvbWl0dGVkIHJhdGhlciB0aGFuIHNob3dpbmcgYW4gZW1wdHkgdGFibGUuCiAgICAgICAgY29uc3QgdHMgPSBkYXRhLnRyaWFsX3N1bW1hcnk7CiAgICAgICAgY29uc3Qgc3ltID0gJ+KCpic7CiAgICAgICAgbGV0IHRyaWFsSHRtbCA9ICcnOwogICAgICAgIGlmICh0cyAmJiBBcnJheS5pc0FycmF5KHRzLm1vZHVsZXMpICYmIHRzLm1vZHVsZXMubGVuZ3RoKSB7CiAgICAgICAgICBjb25zdCByb3dzID0gdHMubW9kdWxlcy5tYXAobSA9PiBgCiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6N3B4IDRweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4wNikiPiR7ZXNjYXBlSHRtbChtLm1vZHVsZV9pY29uIHx8ICfwn5OmJyl9ICR7ZXNjYXBlSHRtbChtLm1vZHVsZV9uYW1lKX08L3RkPgogICAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzo3cHggNHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjA2KTt0ZXh0LWFsaWduOnJpZ2h0O3doaXRlLXNwYWNlOm5vd3JhcCI+JHttLm1vbnRobHlfcHJpY2UgPiAwID8gZm10KHN5bSwgbS5tb250aGx5X3ByaWNlKSArICcvbW8nIDogJ0ZyZWUnfTwvdGQ+CiAgICAgICAgICAgIDwvdHI+YCkuam9pbignJyk7CiAgICAgICAgICBjb25zdCB0cmlhbEVuZHNMYWJlbCA9IHRzLnRyaWFsX2VuZHNfYXQKICAgICAgICAgICAgPyBuZXcgRGF0ZSh0cy50cmlhbF9lbmRzX2F0LnJlcGxhY2UoJyAnLCAnVCcpKS50b0xvY2FsZURhdGVTdHJpbmcodW5kZWZpbmVkLCB7eWVhcjonbnVtZXJpYycsIG1vbnRoOidsb25nJywgZGF5OidudW1lcmljJ30pCiAgICAgICAgICAgIDogJyc7CiAgICAgICAgICB0cmlhbEh0bWwgPSBgCiAgICAgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi10b3A6MTRweDtiYWNrZ3JvdW5kOiNlZWYyZmY7Ym9yZGVyOjFweCBzb2xpZCAjYzdkMmZlO2JvcmRlci1yYWRpdXM6MTBweDtwYWRkaW5nOjE0cHggMTZweCI+CiAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC13ZWlnaHQ6NzAwO2NvbG9yOiMzMTJlODE7Zm9udC1zaXplOjEzLjVweDttYXJnaW4tYm90dG9tOjhweCI+8J+VkCBZb3VyICR7dHMudHJpYWxfZGF5c30tZGF5IGZyZWUgdHJpYWwgaGFzIHN0YXJ0ZWQ8L2Rpdj4KICAgICAgICAgICAgICA8dGFibGUgc3R5bGU9IndpZHRoOjEwMCU7Zm9udC1zaXplOjEzcHg7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlIj4KICAgICAgICAgICAgICAgICR7cm93c30KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOjlweCA0cHggMDtmb250LXdlaWdodDo4MDA7Y29sb3I6IzMxMmU4MSI+VG90YWwgKGlmIGNvbnRpbnVlZCBhZnRlciB0cmlhbCk8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6OXB4IDRweCAwO2ZvbnQtd2VpZ2h0OjgwMDtjb2xvcjojMzEyZTgxO3RleHQtYWxpZ246cmlnaHQ7d2hpdGUtc3BhY2U6bm93cmFwIj4ke2ZtdChzeW0sIHRzLnRvdGFsX21vbnRobHkpfS9tbzwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgJHt0cmlhbEVuZHNMYWJlbCA\/IGA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOjhweDtmb250LXNpemU6MTJweDtjb2xvcjojNDMzOGNhIj5UcmlhbCBlbmRzIDxzdHJvbmc+JHtlc2NhcGVIdG1sKHRyaWFsRW5kc0xhYmVsKX08L3N0cm9uZz4g4oCUIG1hbmFnZSBvciBzdWJzY3JpYmUgYW55IHRpbWUgZnJvbSB0aGUgTW9kdWxlcyBNYXJrZXRwbGFjZSBpbiB5b3VyIGRhc2hib2FyZC48L2Rpdj5gIDogJyd9CiAgICAgICAgICAgIDwvZGl2PmA7CiAgICAgICAgfQoKICAgICAgICBjb25zdCBzdWNjZXNzQm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgc3VjY2Vzc0JveC5jbGFzc05hbWUgPSAnYWxlcnQgYWxlcnQtc3VjY2Vzcyc7CiAgICAgICAgc3VjY2Vzc0JveC5zdHlsZS5tYXJnaW5Ub3AgPSAnMTZweCc7CiAgICAgICAgc3VjY2Vzc0JveC5pbm5lckhUTUwgPSBgCiAgICAgICAgICA8c3Bhbj7inIU8L3NwYW4+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJmbGV4OjEiPgogICAgICAgICAgICA8c3Ryb25nPkFjY291bnQgY3JlYXRlZCE8L3N0cm9uZz4gU2F2ZSB0aGVzZSBkZXRhaWxzIOKAlCB5b3UnbGwgbmVlZCB0aGVtIHRvIHNpZ24gaW4gbGF0ZXIuPGJyPgogICAgICAgICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOjhweDtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjEzcHg7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCk7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxMHB4IDEycHgiPgogICAgICAgICAgICAgIFVzZXJuYW1lOiA8c3Ryb25nPiR7ZXNjYXBlSHRtbChjaG9zZW5Vc2VybmFtZSl9PC9zdHJvbmc+PGJyPgogICAgICAgICAgICAgIFdvcmtzcGFjZTogPHN0cm9uZz4ke2VzY2FwZUh0bWwoQkFTRV9VUkwpfSR7ZXNjYXBlSHRtbChjaG9zZW5TdWJkb21haW4pfTwvc3Ryb25nPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgJHt0cmlhbEh0bWx9CiAgICAgICAgICAgICR7ZGF0YS5pc19ncm91cF9vZl9jb21wYW5pZXMgPyBgPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDoxMnB4O2JhY2tncm91bmQ6I2Y1ZjBmZjtib3JkZXI6MXB4IHNvbGlkICNlMmQ0ZmI7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MTJweCAxNHB4O2ZvbnQtc2l6ZToxMi41cHg7Y29sb3I6IzViMjFiNiI+8J+PoiBZb3VyIEdyb3VwIG9mIENvbXBhbmllcyBzdHJ1Y3R1cmUgaXMgcmVhZHkg4oCUICIke2VzY2FwZUh0bWwoKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPWNvbXBhbnlfbmFtZV0nKXx8e30pLnZhbHVlIHx8ICcnKX0g4oCUIEhlYWQgT2ZmaWNlIiBwbHVzIGFueSBzdWItY29tcGFuaWVzIHlvdSBuYW1lZC4gTWFuYWdlIGl0IGFueXRpbWUgZnJvbSA8c3Ryb25nPkdyb3VwIG9mIENvbXBhbmllczwvc3Ryb25nPiBpbiB5b3VyIGRhc2hib2FyZC48L2Rpdj5gIDogJyd9CiAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6MTBweDtjb2xvcjp2YXIoLS1jLXRleHQtMyk7Zm9udC1zaXplOjEyLjVweCI+UmVkaXJlY3RpbmcgeW91IHRvIHlvdXIgZGFzaGJvYXJkIGluIGEgbW9tZW504oCmPC9zcGFuPgogICAgICAgICAgPC9kaXY+YDsKICAgICAgICBjYXJkLmFwcGVuZENoaWxkKHN1Y2Nlc3NCb3gpOwogICAgICAgIHdpbmRvdy5Db2xsYWJBcHA\/LnRvYXN0Py4oJ1dlbGNvbWUhIFJlZGlyZWN0aW5nIHRvIHlvdXIgZGFzaGJvYXJk4oCmJywgJ3N1Y2Nlc3MnKTsKICAgICAgICBjb25zdCB1cmwgPSBkYXRhLnJlZGlyZWN0X3VybCB8fCBkYXRhLmxvZ2luX3VybAogICAgICAgICAgfHwgJ2h0dHBzOi8vc3luY2ZpbmFuY2VuZy5jb20vaW50ZXJuYWwvd3AtYWRtaW4vYWRtaW4ucGhwP3BhZ2U9Y29sbGFiLWVycCc7CiAgICAgICAgLy8gR2l2ZSB0aGUgcGVyc29uIHRpbWUgdG8gYWN0dWFsbHkgcmVhZCB0aGUgdHJpYWwgc3VtbWFyeSByYXRoZXIKICAgICAgICAvLyB0aGFuIHdoaXNraW5nIHRoZW0gYXdheSBhZnRlciB0aGUgb2xkIGZsYXQgMy41cyDigJQgbG9uZ2VyIG9ubHkKICAgICAgICAvLyB3aGVuIHRoZXJlJ3Mgc29tZXRoaW5nIG5ldyB0byByZWFkLgogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gbG9jYXRpb24uaHJlZiA9IHVybCwgKHRyaWFsSHRtbCB8fCBkYXRhLmlzX2dyb3VwX29mX2NvbXBhbmllcykgPyA2NTAwIDogMzUwMCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2hvd0Vycm9yKGRhdGEubWVzc2FnZSB8fCAnUmVnaXN0cmF0aW9uIGZhaWxlZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTsKICAgICAgfQogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGlmIChyZWdpc3RlcmVkKSB7CiAgICAgICAgLy8gVGhlIGFjY291bnQgZXhpc3RzLiBEcmF3aW5nIHRoZSAidHJpYWwgc3RhcnRlZCIgc3VtbWFyeSBmYWlsZWQgKGEgZGlzcGxheSBwcm9ibGVtIG9uIHRoaXMgcGFnZSkg4oCUIHRoYXQgaXMgTk9UIGEgZmFpbGVkIHNpZ24tdXAsIGFuZCB0aGUgY3VzdG9tZXIgbXVzdCBub3QgYmUgdG9sZCBpdCB3YXMKICAgICAgICAvLyAodGhleSB3b3VsZCByZWdpc3RlciBhZ2Fpbiwgb3IgZ2l2ZSB1cCkuIFNheSB3aGF0IGlzIHRydWUsIGtlZXAgdGhlIGRldGFpbHMgdGhleSBuZWVkLCBhbmQgY2Fycnkgb24gdG8gdGhlaXIgd29ya3NwYWNlIGV4YWN0bHkgYXMgdGhlIG5vcm1hbCBwYXRoIGRvZXMuCiAgICAgICAgY29uc29sZS5lcnJvcignW1JlZ2lzdGVyXSBUaGUgYWNjb3VudCB3YXMgY3JlYXRlZCwgYnV0IHNob3dpbmcgdGhlIHN1bW1hcnkgZmFpbGVkOicsIGVycik7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IGRvbmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVnaXN0ZXItY3JlYXRlZC1ib3gnKSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgIGRvbmUuaWQgPSAncmVnaXN0ZXItY3JlYXRlZC1ib3gnOyBkb25lLmNsYXNzTmFtZSA9ICdhbGVydCBhbGVydC1zdWNjZXNzJzsgZG9uZS5zdHlsZS5tYXJnaW5Ub3AgPSAnMTZweCc7CiAgICAgICAgICBkb25lLmlubmVySFRNTCA9ICc8c3Bhbj7inIU8L3NwYW4+PGRpdiBzdHlsZT0iZmxleDoxIj48c3Ryb25nPkFjY291bnQgY3JlYXRlZCE8L3N0cm9uZz4gU2F2ZSB0aGVzZSBkZXRhaWxzIOKAlCB5b3VcJ2xsIG5lZWQgdGhlbSB0byBzaWduIGluIGxhdGVyLjxicj4nCiAgICAgICAgICAgICsgJzxkaXYgc3R5bGU9Im1hcmdpbi10b3A6OHB4O2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtmb250LXNpemU6MTNweDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEwcHggMTJweCI+VXNlcm5hbWU6IDxzdHJvbmc+JyArIGVzY2FwZUh0bWwoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW25hbWU9YWRtaW5fdXNlcm5hbWVdJyk\/LnZhbHVlIHx8ICcnKSArICc8L3N0cm9uZz48L2Rpdj4nCiAgICAgICAgICAgICsgJzxzcGFuIHN0eWxlPSJkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6MTBweDtmb250LXNpemU6MTIuNXB4Ij5SZWRpcmVjdGluZyB5b3UgdG8geW91ciBkYXNoYm9hcmQgaW4gYSBtb21lbnTigKY8L3NwYW4+PC9kaXY+JzsKICAgICAgICAgIGJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgaWYgKCFkb25lLnBhcmVudE5vZGUpIGJ0bi5jbG9zZXN0KCcuY2FyZCcpLmFwcGVuZENoaWxkKGRvbmUpOwogICAgICAgIH0gY2F0Y2ggKF8pIHt9CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBsb2NhdGlvbi5ocmVmID0gcmVnaXN0ZXJlZC5yZWRpcmVjdF91cmwgfHwgcmVnaXN0ZXJlZC5sb2dpbl91cmwgfHwgJ2h0dHBzOi8vc3luY2ZpbmFuY2VuZy5jb20vaW50ZXJuYWwvd3AtYWRtaW4vYWRtaW4ucGhwP3BhZ2U9Y29sbGFiLWVycCcsIDM1MDApOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBPbmx5IGEgZ2VudWluZSBmYWlsdXJlIHRvIHJlYWNoIHRoZSBzZXJ2ZXIgaXMgYSAibmV0d29yayBlcnJvciI7IGEgYnVnIGluIHRoaXMgcGFnZSdzIG93biBjb2RlIChhIFJlZmVyZW5jZUVycm9yIGFuZCB0aGUgbGlrZSkgbXVzdCBub3QgYmUgZHJlc3NlZCB1cCBhcyBvbmUuCiAgICAgIGNvbnN0IGlzTmV0d29yayA9ICEhZXJyICYmIGVyci5uYW1lID09PSAnVHlwZUVycm9yJyAmJiAvZmV0Y2h8bmV0d29ya3xsb2FkIGZhaWxlZHxjb25uZWN0aW9ufGFib3J0L2kudGVzdChlcnIubWVzc2FnZSB8fCAnJyk7ICAgLy8gYnkgbmFtZSwgbm90IGluc3RhbmNlb2Y6IGFsc28gcmlnaHQgZm9yIGVycm9ycyByYWlzZWQgaW4gYW5vdGhlciBmcmFtZQogICAgICBzaG93RXJyb3IoL2RhdGFiYXNlL2kudGVzdChlcnIubWVzc2FnZXx8JycpCiAgICAgICAgPyAnRGF0YWJhc2UgY29ubmVjdGlvbiB1bnN0YWJsZS4gUGxlYXNlIHdhaXQgMzAgc2Vjb25kcyBhbmQgdHJ5IGFnYWluLicKICAgICAgICA6IChpc05ldHdvcmsgPyAnTmV0d29yayBlcnJvcjogJyArIGVyci5tZXNzYWdlIDogJ1NvbWV0aGluZyB3ZW50IHdyb25nIG9uIHRoaXMgcGFnZSAoJyArIChlcnIubWVzc2FnZSB8fCBlcnIpICsgJykuIFBsZWFzZSByZWZyZXNoIGFuZCB0cnkgYWdhaW4g4oCUIGlmIGl0IGtlZXBzIGhhcHBlbmluZywgY29udGFjdCBzdXBwb3J0LicpKTsKICAgIH0KICB9KTsKCiAgLy8g4pSA4pSAIERyb3Bkb3duczogaW5kdXN0cmllcyArIHN0YXRlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgZmV0Y2goUkVTVCArICcvbG9va3Vwcy9pbmR1c3RyaWVzJykudGhlbihyID0+IHIuanNvbigpKS50aGVuKGxpc3QgPT4gewogICAgY29uc3Qgc2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZy1pbmR1c3RyeScpOwogICAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSByZXR1cm47CiAgICBzZWwuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9IiI+4oCUIFNlbGVjdCBJbmR1c3RyeSDigJQ8L29wdGlvbj4nICsKICAgICAgbGlzdC5tYXAoaSA9PiBgPG9wdGlvbiB2YWx1ZT0iJHtlc2NhcGVIdG1sKGkuY29kZSl9Ij4ke2VzY2FwZUh0bWwoaS5uYW1lKX08L29wdGlvbj5gKS5qb2luKCcnKTsKICB9KS5jYXRjaCgoKSA9PiB7fSk7CgogIGZldGNoKFJFU1QgKyAnL2xvb2t1cHMvbG9jYXRpb25zJykudGhlbihyID0+IHIuanNvbigpKS50aGVuKGxpc3QgPT4gewogICAgY29uc3Qgc2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZy1zdGF0ZScpOwogICAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSByZXR1cm47CiAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpOwogICAgc2VsLmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSIiPuKAlCBTZWxlY3QgU3RhdGUg4oCUPC9vcHRpb24+JyArCiAgICAgIGxpc3QuZmlsdGVyKGwgPT4geyBpZiAoc2Vlbi5oYXMobC5zdGF0ZSkpIHJldHVybiBmYWxzZTsgc2Vlbi5hZGQobC5zdGF0ZSk7IHJldHVybiB0cnVlOyB9KQogICAgICAgICAgLm1hcChzID0+IGA8b3B0aW9uIHZhbHVlPSIke2VzY2FwZUh0bWwocy5zdGF0ZSl9Ij4ke2VzY2FwZUh0bWwocy5zdGF0ZSl9PC9vcHRpb24+YCkuam9pbignJyk7CiAgfSkuY2F0Y2goKCkgPT4ge30pOwoKICAvLyDilIDilIAgU3ViZG9tYWluOiBhdXRvLXNsdWcgZnJvbSBjb21wYW55IG5hbWUgKyBsaXZlIGF2YWlsYWJpbGl0eSBjaGVjayDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgY29uc3Qgc3ViSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVnLXN1YmRvbWFpbicpOwogIGNvbnN0IHN1YlN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWctc3ViZG9tYWluLXN0YXR1cycpOwoKICBmdW5jdGlvbiBzbHVnaWZ5KHMpIHsKICAgIHJldHVybiBTdHJpbmcocykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOS1dKy9nLCAnLScpLnJlcGxhY2UoL14tK3wtKyQvZywgJycpLnN1YnN0cmluZygwLCAzMCk7CiAgfQoKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVnLWNvbXBhbnktbmFtZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24gKCkgewogICAgaWYgKCFzdWJJbnB1dC52YWx1ZSB8fCBzdWJJbnB1dC5kYXRhc2V0LmF1dG9GaWxsZWQgPT09ICcxJykgewogICAgICBzdWJJbnB1dC52YWx1ZSA9IHNsdWdpZnkodGhpcy52YWx1ZSk7CiAgICAgIHN1YklucHV0LmRhdGFzZXQuYXV0b0ZpbGxlZCA9ICcxJzsKICAgICAgY2hlY2tTdWJkb21haW4oKTsKICAgIH0KICB9KTsKCiAgc3ViSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbiAoKSB7CiAgICB0aGlzLmRhdGFzZXQuYXV0b0ZpbGxlZCA9ICcwJzsKICAgIHRoaXMudmFsdWUgPSBzbHVnaWZ5KHRoaXMudmFsdWUpOwogICAgY2hlY2tTdWJkb21haW4oKTsKICB9KTsKCiAgbGV0IHNkVGltZXIgPSBudWxsOwogIGZ1bmN0aW9uIHNldFN1YlN0YXR1cyhraW5kLCBodG1sKSB7CiAgICBzdWJTdGF0dXMuY2xhc3NOYW1lID0gJ3JlZy1zdGF0dXMnICsgKGtpbmQgPyAnIGlzLScgKyBraW5kIDogJycpOwogICAgc3ViU3RhdHVzLmlubmVySFRNTCA9IGh0bWwgPyAnPHNwYW4gY2xhc3M9ImRvdCIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj48c3Bhbj4nICsgaHRtbCArICc8L3NwYW4+JyA6ICcnOwogICAgc3ViSW5wdXQuY2xvc2VzdCgnLnJlZy1zbHVnLXJvdycpPy5jbGFzc0xpc3QudG9nZ2xlKCdpcy1pbnZhbGlkJywga2luZCA9PT0gJ2JhZCcpOwogICAgaWYgKGtpbmQgJiYga2luZCAhPT0gJ2JhZCcpIGNsZWFyRmllbGRFcnJvcihzdWJJbnB1dCk7CiAgfQogIGZ1bmN0aW9uIGNoZWNrU3ViZG9tYWluKCkgewogICAgY2xlYXJUaW1lb3V0KHNkVGltZXIpOwogICAgY29uc3QgdiA9IHN1YklucHV0LnZhbHVlOwogICAgaWYgKCF2KSB7IHNldFN1YlN0YXR1cygnJywgJycpOyByZXR1cm47IH0KICAgIGlmICh2Lmxlbmd0aCA8IDMpIHsgc2V0U3ViU3RhdHVzKCd3YXJuJywgJ01pbmltdW0gMyBjaGFyYWN0ZXJzJyk7IHJldHVybjsgfQogICAgc2V0U3ViU3RhdHVzKCdidXN5JywgJ0NoZWNraW5nIGF2YWlsYWJpbGl0eeKApicpOwogICAgc2RUaW1lciA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4gewogICAgICB0cnkgewogICAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaChSRVNUICsgJy9zdWJkb21haW4tY2hlY2s\/c3ViZG9tYWluPScgKyBlbmNvZGVVUklDb21wb25lbnQodikpOwogICAgICAgIGNvbnN0IGIgPSBhd2FpdCByLmpzb24oKTsKICAgICAgICBpZiAoc3ViSW5wdXQudmFsdWUgIT09IHYpIHJldHVybjsgICAvLyB0aGV5IGtlcHQgdHlwaW5nOiB0aGlzIGFuc3dlciBpcyBmb3IgYW4gb2xkZXIgdmFsdWUKICAgICAgICBpZiAoYi5hdmFpbGFibGUpIHNldFN1YlN0YXR1cygnb2snLCAnPHN0cm9uZz4nICsgZXNjYXBlSHRtbCh2KSArICc8L3N0cm9uZz4gaXMgYXZhaWxhYmxlJyk7CiAgICAgICAgZWxzZSAgICAgICAgICAgICBzZXRTdWJTdGF0dXMoJ2JhZCcsIGVzY2FwZUh0bWwoYi5yZWFzb24gfHwgJ05vdCBhdmFpbGFibGUnKSk7CiAgICAgIH0gY2F0Y2ggKF8pIHsgaWYgKHN1YklucHV0LnZhbHVlID09PSB2KSBzZXRTdWJTdGF0dXMoJycsICcnKTsgfQogICAgfSwgMzUwKTsKICB9Cn0pKCk7Cg==\">(function(c){var s=document.createElement(c.tagName);s.text=decodeURIComponent(escape(atob(c.dataset.collabJs)));c.parentNode.insertBefore(s,c.nextSibling)})(document.currentScript)<\/script>\n\n<script data-collab-js=\"Ci8vIOKUgOKUgCAiRXN0aW1hdGUgWW91ciBDb3N0IiBwcmljaW5nIHNpbXVsYXRvciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLy8gRGVsaWJlcmF0ZWx5IGEgc2VwYXJhdGUsIHBsYWluIChub24tSUlGRSkgc2NyaXB0IGJsb2NrOiBpdHMgY29udHJvbHMKLy8gdXNlIGlubGluZSBvbmNsaWNrIGhhbmRsZXJzIChzaW1TZXRDeWNsZSwgc2ltQWRqdXN0VXNlcnMpLCBhbmQgdGhvc2UKLy8gb25seSByZXNvbHZlIGFnYWluc3QgdGhlIGdsb2JhbCBzY29wZSDigJQgYnVyeWluZyB0aGVtIGluc2lkZSB0aGUgbWFpbgovLyByZWdpc3RyYXRpb24gSUlGRSBhYm92ZSB3b3VsZCBtYWtlIHRoZW0gdW5yZWFjaGFibGUgdGhlIHNhbWUgd2F5IGFuCi8vIGVhcmxpZXIgYnVnIGluIHRoaXMgY29kZWJhc2UncyBTYWxlcyBDYWxsIE1lbW8gbW9kdWxlIG1hZGUgaXRzIFZpZXcvCi8vIEVkaXQgYnV0dG9ucyBzaWxlbnRseSBkbyBub3RoaW5nIGZvciB0aGUgZXhhY3Qgc2FtZSByZWFzb24uCihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwogIGNvbnN0IFJFU1QgPSAnaHR0cHM6Ly9zeW5jZmluYW5jZW5nLmNvbS9pbnRlcm5hbC93cC1qc29uL2NvbGxhYi92MSc7CiAgY29uc3QgJCA9IGlkID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKCiAgbGV0IENPTkZJRyA9IG51bGw7ICAgICAgICAgICAvLyB7IHNldHRpbmdzLCBtb2R1bGVzIH0gZnJvbSB0aGUgc2VydmVyCiAgd2luZG93LlNJTV9DWUNMRSA9ICdtb250aGx5JzsgLy8gcmVhZCBieSB0aGUgcmVnaXN0cmF0aW9uIHN1Ym1pdCBoYW5kbGVyCgogIGZ1bmN0aW9uIGZtdChzeW0sIG4pIHsKICAgIGNvbnN0IHYgPSBOdW1iZXIobiB8fCAwKSwgZnJhYyA9IE1hdGguYWJzKHYgLSBNYXRoLnJvdW5kKHYpKSA+IDAuMDA0OyAgIC8vIHdob2xlIGFtb3VudHMgd2l0aG91dCBkZWNpbWFsczsgYW55dGhpbmcgZWxzZSB0byB0aGUga29ibyAo4oKmMzAsNjM3LjUwLCBub3Qg4oKmMzAsNjM3LjUpCiAgICByZXR1cm4gc3ltICsgdi50b0xvY2FsZVN0cmluZygnZW4tTkcnLCB7bWluaW11bUZyYWN0aW9uRGlnaXRzOiBmcmFjID8gMiA6IDAsIG1heGltdW1GcmFjdGlvbkRpZ2l0czogMn0pOwogIH0KICBmdW5jdGlvbiBlc2NhcGVIdG1sKHMpIHsKICAgIHJldHVybiBTdHJpbmcocyA\/PyAnJykucmVwbGFjZSgvWyY8PiInXS9nLCBjID0+ICh7JyYnOicmYW1wOycsJzwnOicmbHQ7JywnPic6JyZndDsnLCciJzonJnF1b3Q7JywiJyI6JyYjMzk7J31bY10pKTsKICB9CgogIGFzeW5jIGZ1bmN0aW9uIHNpbUluaXQoKSB7CiAgICAvLyBQcmV2aW91c2x5IG9ubHkgdGhlIGZldGNoIGl0c2VsZiB3YXMgd3JhcHBlZCBpbiB0cnkvY2F0Y2gg4oCUIGFueQogICAgLy8gZXJyb3IgaW4gd2hhdCBjYW1lIEFGVEVSIChwb3B1bGF0aW5nIHRoZSBtb2R1bGUgbGlzdCwgc2V0dGluZyB0aGUKICAgIC8vIHVzZXItY291bnQgZmllbGQsIGV0Yy4pIHdhcyBjb21wbGV0ZWx5IHVuZ3VhcmRlZC4gQW4gYXN5bmMKICAgIC8vIGZ1bmN0aW9uIHdpdGggbm8gb3V0ZXIgY2F0Y2ggb24gYW4gdW5oYW5kbGVkIGVycm9yIGRvZXNuJ3QgdGhyb3cKICAgIC8vIGFueXdoZXJlIHZpc2libGU7IGl0IGp1c3Qgc2lsZW50bHkgc3RvcHMsIGxlYXZpbmcgI3NpbS1sb2FkaW5nJ3MKICAgIC8vICLij7MgTG9hZGluZyBjdXJyZW50IHByaWNpbmfigKYiIG9uIHNjcmVlbiBmb3JldmVyIHdpdGggbm8gZXJyb3IsIG5vCiAgICAvLyBjb25zb2xlIG5vaXNlIGEgdHlwaWNhbCB2aXNpdG9yIHdvdWxkIGV2ZXIgc2VlIOKAlCB3aGljaCBsb29rcwogICAgLy8gZXhhY3RseSBsaWtlICJ0aGUgc2ltdWxhdG9yIGlzbid0IHNob3dpbmcgdXAiIGZyb20gdGhlIG91dHNpZGUuCiAgICAvLyBXcmFwcGluZyB0aGUgd2hvbGUgZnVuY3Rpb24gY2xvc2VzIHRoYXQgZ2FwOiBhbnkgZmFpbHVyZSBub3cKICAgIC8vIHN1cmZhY2VzIGFzIGEgcmVhbCwgdmlzaWJsZSBtZXNzYWdlIGluc3RlYWQgb2YgYW4gaW5maW5pdGUgc3Bpbm5lci4KICAgIHRyeSB7CiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFJFU1QgKyAnL3B1YmxpYy9wcmljaW5nLWVzdGltYXRlLWNvbmZpZycpOwogICAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKCdTZXJ2ZXIgcmV0dXJuZWQgSFRUUCAnICsgcmVzLnN0YXR1cyk7CiAgICAgIENPTkZJRyA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgIGlmICghQ09ORklHIHx8IHR5cGVvZiBDT05GSUcgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoQ09ORklHKSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCByZXNwb25zZSBzaGFwZScpOwogICAgICB9CiAgICAgIC8vIEEgUkVTVCBlcnJvciAoZS5nLiB0aGUgcm91dGUgbm90IGZvdW5kLCBvciBhIHBlcm1pc3Npb24gZmFpbHVyZSkKICAgICAgLy8gY29tZXMgYmFjayBhcyB7Y29kZSwgbWVzc2FnZSwgZGF0YX0g4oCUIHZhbGlkIEpTT04sIHNvIHJlcy5qc29uKCkKICAgICAgLy8gYWJvdmUgd291bGRuJ3QgaGF2ZSB0aHJvd24sIGJ1dCBpdCdzIG5vdCB0aGUge3NldHRpbmdzLCBtb2R1bGVzfQogICAgICAvLyBzaGFwZSB0aGlzIGZ1bmN0aW9uIGV4cGVjdHMuIFRyZWF0IGl0IGFzIGEgZmFpbHVyZSBleHBsaWNpdGx5CiAgICAgIC8vIHJhdGhlciB0aGFuIHNpbGVudGx5IHJlbmRlcmluZyBhbiBhbGwtemVybywgZW1wdHkgc2ltdWxhdG9yLgogICAgICBpZiAoQ09ORklHLmNvZGUgJiYgQ09ORklHLm1lc3NhZ2UgJiYgIUNPTkZJRy5zZXR0aW5ncykgewogICAgICAgIHRocm93IG5ldyBFcnJvcihDT05GSUcubWVzc2FnZSk7CiAgICAgIH0KCiAgICAgIGNvbnN0IHMgPSBDT05GSUcuc2V0dGluZ3MgfHwge307CiAgICAgIGNvbnN0IG1pblVzZXJzID0gTWF0aC5tYXgoMSwgcGFyc2VJbnQocy5taW5fdXNlcnMgfHwgMSwgMTApKTsKCiAgICAgIGNvbnN0IHVzZXJzSW5wdXQgPSAkKCdzaW0tdXNlcnMnKTsKICAgICAgaWYgKCF1c2Vyc0lucHV0KSB0aHJvdyBuZXcgRXJyb3IoJ1NpbXVsYXRvciBtYXJrdXAgaW5jb21wbGV0ZSAoc2ltLXVzZXJzIG1pc3NpbmcpJyk7CiAgICAgIHVzZXJzSW5wdXQudmFsdWUgPSBtaW5Vc2VyczsKICAgICAgdXNlcnNJbnB1dC5taW4gPSBtaW5Vc2VyczsKICAgICAgY29uc3QgbWluSGludCA9ICQoJ3NpbS1taW4taGludCcpOwogICAgICBpZiAobWluSGludCkgbWluSGludC50ZXh0Q29udGVudCA9IGBNaW5pbXVtICR7bWluVXNlcnN9IHVzZXIke21pblVzZXJzICE9PSAxID8gJ3MnIDogJyd9IG9uIGV2ZXJ5IHBsYW5gOwoKICAgICAgY29uc3QgZGlzY1BjdCA9IHBhcnNlRmxvYXQocy5hbm51YWxfZGlzY291bnRfcGVyY2VudCB8fCAwKTsKICAgICAgY29uc3QgZGlzY1BpbGwgPSAkKCdzaW0tZGlzYy1waWxsJyk7CiAgICAgIGlmIChkaXNjUGlsbCkgZGlzY1BpbGwudGV4dENvbnRlbnQgPSBkaXNjUGN0ID4gMCA\/IGAoU2F2ZSAke2Rpc2NQY3R9JSlgIDogJyc7CgogICAgICBjb25zdCBtb2R1bGVzID0gQ09ORklHLm1vZHVsZXMgfHwgW107CiAgICAgIGNvbnN0IHN5bSA9IHMuY3VycmVuY3lfc3ltYm9sIHx8ICfigqYnOwogICAgICBjb25zdCBtb2RMaXN0ID0gJCgnc2ltLW1vZC1saXN0Jyk7CiAgICAgIGlmIChtb2RMaXN0KSB7CiAgICAgICAgbW9kTGlzdC5pbm5lckhUTUwgPSBtb2R1bGVzLmxlbmd0aAogICAgICAgICAgPyBtb2R1bGVzLm1hcChtID0+IGAKICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2ltLW1vZC1pdGVtIiBkYXRhLWtleT0iJHtlc2NhcGVIdG1sKG0ubW9kdWxlX2tleSl9Ij4KICAgICAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJzaW0tbW9kLWNoayIgZGF0YS1pZD0iJHttLmlkfSIgZGF0YS1rZXk9IiR7ZXNjYXBlSHRtbChtLm1vZHVsZV9rZXkpfSIgb25jaGFuZ2U9InNpbVJlbmRlclRvdGFscygpIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzaW0tbW9kLXRleHQiPgogICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2ltLW1vZC1uYW1lIj4ke2VzY2FwZUh0bWwobS5tb2R1bGVfaWNvbiB8fCAn8J+TpicpfSAke2VzY2FwZUh0bWwobS5tb2R1bGVfbmFtZSl9PC9zcGFuPgogICAgICAgICAgICAgICAgICAke20ubW9kdWxlX2JpbyA\/IGA8c3BhbiBjbGFzcz0ic2ltLW1vZC1iaW8iPiR7ZXNjYXBlSHRtbChtLm1vZHVsZV9iaW8pfTwvc3Bhbj5gIDogJyd9CiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2ltLW1vZC1iYWRnZSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+4pyoIFJlY29tbWVuZGVkPC9zcGFuPgogICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InByaWNlIiBkYXRhLW1vbnRobHk9IiR7cGFyc2VGbG9hdChtLm1vbnRobHlfcHJpY2UgfHwgMCl9IiBkYXRhLWFubnVhbD0iJHtwYXJzZUZsb2F0KG0uYW5udWFsX3ByaWNlIHx8IDApfSI+CiAgICAgICAgICAgICAgICAke2ZtdChzeW0sIG0ubW9udGhseV9wcmljZSl9L21vCiAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj5gKS5qb2luKCcnKQogICAgICAgICAgOiAnPGRpdiBjbGFzcz0ic2ltLW1vZC1lbXB0eSI+Tm8gcGFpZCBtb2R1bGVzIGNvbmZpZ3VyZWQgeWV0IOKAlCBQbGF0Zm9ybSBGZWUgYW5kIFBlci1Vc2VyIGNvc3Qgc3RpbGwgYXBwbHkuPC9kaXY+JzsKICAgICAgfQoKICAgICAgLy8gVHJhY2tzIHdoZXRoZXIgYSBwZXJzb24gaGFzIG1hbnVhbGx5IHRvdWNoZWQgYSBnaXZlbiBjaGVja2JveCwgc28KICAgICAgLy8gc2ltQXBwbHlJbmR1c3RyeVJlY29tbWVuZGF0aW9ucygpIChiZWxvdykgb25seSBhdXRvLWNoZWNrcyBpdCB0aGUKICAgICAgLy8gZmlyc3QgdGltZSDigJQgYXR0YWNoZWQgb25jZSBwZXIgY2hlY2tib3ggaGVyZSBhdCByZW5kZXIgdGltZSwgbm90CiAgICAgIC8vIGluc2lkZSB0aGF0IGZ1bmN0aW9uLCBvciBldmVyeSBpbmR1c3RyeSBjaGFuZ2Ugd291bGQgcGlsZSBvbiBhCiAgICAgIC8vIGZyZXNoIGR1cGxpY2F0ZSBsaXN0ZW5lciBpbnN0ZWFkIG9mIHJldXNpbmcgb25lLgogICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2ltLW1vZC1jaGsnKS5mb3JFYWNoKGNoayA9PiB7CiAgICAgICAgY2hrLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsgY2hrLmRhdGFzZXQudXNlclRvdWNoZWQgPSAnMSc7IH0pOwogICAgICB9KTsKCiAgICAgICQoJ3NpbS1sb2FkaW5nJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgJCgnc2ltLWNvbnRlbnQnKS5zdHlsZS5kaXNwbGF5ID0gJyc7CiAgICAgIHNpbVJlbmRlclRvdGFscygpOwoKICAgICAgLy8gUmVhY3QgdG8gSW5kdXN0cnkgKFN0ZXAgMSkg4oCUIGF1dG8tY2hlY2sgdGhlIHJlY29tbWVuZGVkIG1vZHVsZXMgZm9yCiAgICAgIC8vIHdoaWNoZXZlciBpbmR1c3RyeSBpcyBzZWxlY3RlZCBhbmQgYmFkZ2UgdGhlbSwgc28gcGlja2luZyBhbgogICAgICAvLyBpbmR1c3RyeSB2aXNpYmx5IGNoYW5nZXMgdGhlIHNob3J0bGlzdCByYXRoZXIgdGhhbiB0aGUgY3VzdG9tZXIKICAgICAgLy8gaGF2aW5nIHRvIGFscmVhZHkga25vdyB3aGF0IHRvIGxvb2sgZm9yIGluIGEgbGlzdCBvZiB+MzAgbW9kdWxlcy4KICAgICAgY29uc3QgaW5kdXN0cnlTZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVnLWluZHVzdHJ5Jyk7CiAgICAgIGlmIChpbmR1c3RyeVNlbCkgewogICAgICAgIGluZHVzdHJ5U2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHNpbUFwcGx5SW5kdXN0cnlSZWNvbW1lbmRhdGlvbnMoaW5kdXN0cnlTZWwudmFsdWUpKTsKICAgICAgICBpZiAoaW5kdXN0cnlTZWwudmFsdWUpIHNpbUFwcGx5SW5kdXN0cnlSZWNvbW1lbmRhdGlvbnMoaW5kdXN0cnlTZWwudmFsdWUpOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGNvbnN0IGxvYWRpbmcgPSAkKCdzaW0tbG9hZGluZycpOwogICAgICBpZiAobG9hZGluZykgewogICAgICAgIGxvYWRpbmcuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPSJjb2xvcjp2YXIoLS1jLXJlZCwjZGMyNjI2KSI+Q291bGQgbm90IGxvYWQgY3VycmVudCBwcmljaW5nJwogICAgICAgICAgKyAoZSAmJiBlLm1lc3NhZ2UgPyAnICgnICsgZXNjYXBlSHRtbChlLm1lc3NhZ2UpICsgJyknIDogJycpCiAgICAgICAgICArICcuIFlvdSBjYW4gc3RpbGwgcmVnaXN0ZXIg4oCUIG1vZHVsZSBwcmljaW5nIGlzIGFsc28gc2hvd24gaW4geW91ciBkYXNoYm9hcmQuPC9zcGFuPic7CiAgICAgIH0KICAgICAgLy8gVmlzaWJsZSBpbiB0aGUgY29uc29sZSBmb3IgYW55b25lIGFjdHVhbGx5IGRlYnVnZ2luZyB0aGlzLCBzaW5jZQogICAgICAvLyB0aGUgb24tcGFnZSBtZXNzYWdlIGFib3ZlIGlzIGRlbGliZXJhdGVseSBub24tdGVjaG5pY2FsLgogICAgICBjb25zb2xlLmVycm9yKCdbUmVnaXN0cmF0aW9uIHByaWNpbmcgc2ltdWxhdG9yXScsIGUpOwogICAgfQogIH0KCiAgd2luZG93LnNpbUFwcGx5SW5kdXN0cnlSZWNvbW1lbmRhdGlvbnMgPSBmdW5jdGlvbiAoaW5kdXN0cnlDb2RlKSB7CiAgICBjb25zdCBtYXAgPSBDT05GSUc\/LmluZHVzdHJ5X3JlY29tbWVuZGF0aW9ucyB8fCB7fTsKICAgIGNvbnN0IGtleXMgPSBtYXBbaW5kdXN0cnlDb2RlXSB8fCBbXTsKICAgIGNvbnN0IG5vdGUgPSAkKCdzaW0tcmVjby1ub3RlJyk7CiAgICBjb25zdCBpbmR1c3RyeUxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZy1pbmR1c3RyeScpPy5zZWxlY3RlZE9wdGlvbnM\/LlswXT8udGV4dENvbnRlbnQgfHwgaW5kdXN0cnlDb2RlOwoKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zaW0tbW9kLWl0ZW0nKS5mb3JFYWNoKGl0ZW0gPT4gewogICAgICBjb25zdCBrZXkgPSBpdGVtLmRhdGFzZXQua2V5OwogICAgICBjb25zdCBpc1JlY28gPSBrZXlzLmluY2x1ZGVzKGtleSk7CiAgICAgIGl0ZW0uY2xhc3NMaXN0LnRvZ2dsZSgncmVjb21tZW5kZWQnLCBpc1JlY28pOwogICAgICBjb25zdCBiYWRnZSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignLnNpbS1tb2QtYmFkZ2UnKTsKICAgICAgaWYgKGJhZGdlKSBiYWRnZS5zdHlsZS5kaXNwbGF5ID0gaXNSZWNvID8gJycgOiAnbm9uZSc7CiAgICAgIGNvbnN0IGNoayA9IGl0ZW0ucXVlcnlTZWxlY3RvcignLnNpbS1tb2QtY2hrJyk7CiAgICAgIC8vIE9ubHkgYXV0by1jaGVjayByZWNvbW1lbmRlZCBtb2R1bGVzIGlmIHRoZSBwZXJzb24gaGFzbid0IGFscmVhZHkKICAgICAgLy8gbWFudWFsbHkgdG91Y2hlZCB0aGF0IHBhcnRpY3VsYXIgY2hlY2tib3gg4oCUIHNvIGRlbGliZXJhdGVseQogICAgICAvLyB1bmNoZWNraW5nIGEgc3VnZ2VzdGlvbiBzdGlja3MsIGV2ZW4gaWYgdGhleSByZXZpc2l0IHRoZQogICAgICAvLyBkcm9wZG93biBhZnRlcndhcmQgZm9yIGFuIHVucmVsYXRlZCByZWFzb24gKGUuZy4gcmUtY29uZmlybWluZwogICAgICAvLyB0aGVpciBzZWxlY3Rpb24pLgogICAgICBpZiAoY2hrICYmIGlzUmVjbyAmJiAhY2hrLmRhdGFzZXQudXNlclRvdWNoZWQpIGNoay5jaGVja2VkID0gdHJ1ZTsKICAgIH0pOwoKICAgIGlmIChub3RlKSB7CiAgICAgIGlmIChrZXlzLmxlbmd0aCkgewogICAgICAgIG5vdGUuc3R5bGUuZGlzcGxheSA9ICcnOwogICAgICAgIG5vdGUuaW5uZXJIVE1MID0gYOKcqCBQcmUtc2VsZWN0ZWQgPHN0cm9uZz4ke2tleXMubGVuZ3RofTwvc3Ryb25nPiBtb2R1bGUke2tleXMubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9IGNvbW1vbmx5IHVzZWQgaW4gPHN0cm9uZz4ke2VzY2FwZUh0bWwoaW5kdXN0cnlMYWJlbCl9PC9zdHJvbmc+IOKAlCBhZGp1c3QgYXMgeW91IGxpa2UsIHRoaXMgaXMganVzdCBhIHN0YXJ0aW5nIHBvaW50LmA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm90ZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICB9CiAgICB9CiAgICBzaW1SZW5kZXJUb3RhbHMoKTsKICB9OwoKICB3aW5kb3cuc2ltU2V0Q3ljbGUgPSBmdW5jdGlvbiAoY3ljbGUpIHsKICAgIHdpbmRvdy5TSU1fQ1lDTEUgPSBjeWNsZTsKICAgICQoJ3NpbS1jeWNsZS1tb250aGx5JykuY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgY3ljbGUgPT09ICdtb250aGx5Jyk7CiAgICAkKCdzaW0tY3ljbGUtYW5udWFsJykuY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgY3ljbGUgPT09ICdhbm51YWwnKTsKICAgICQoJ3NpbS1jeWNsZS1sYWJlbCcpLnRleHRDb250ZW50ID0gY3ljbGUgPT09ICdhbm51YWwnID8gJ0FubnVhbCBDb3N0IEJyZWFrZG93bicgOiAnTW9udGhseSBDb3N0IEJyZWFrZG93bic7CiAgICAkKCdzaW0tdG90YWwtbGJsJykudGV4dENvbnRlbnQgPSBjeWNsZSA9PT0gJ2FubnVhbCcgPyAnVG90YWwgLyB5ZWFyJyA6ICdUb3RhbCAvIG1vbnRoJzsKICAgIC8vIE1vZHVsZSBwcmljZSBsYWJlbHMgc3dpdGNoIGJldHdlZW4gL21vIGFuZCAveXIgc28gd2hhdCdzIHNob3duIG5leHQKICAgIC8vIHRvIGVhY2ggY2hlY2tib3ggYWx3YXlzIG1hdGNoZXMgd2hhdCdzIGFjdHVhbGx5IGJlaW5nIHRvdGFsZWQgYmVsb3cuCiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2ltLW1vZC1pdGVtIC5wcmljZScpLmZvckVhY2goZWwgPT4gewogICAgICBjb25zdCBzeW0gPSAoQ09ORklHPy5zZXR0aW5ncz8uY3VycmVuY3lfc3ltYm9sKSB8fCAn4oKmJzsKICAgICAgY29uc3QgdiA9IGN5Y2xlID09PSAnYW5udWFsJyA\/IGVsLmRhdGFzZXQuYW5udWFsIDogZWwuZGF0YXNldC5tb250aGx5OwogICAgICBlbC50ZXh0Q29udGVudCA9IGZtdChzeW0sIHYpICsgKGN5Y2xlID09PSAnYW5udWFsJyA\/ICcveXInIDogJy9tbycpOwogICAgfSk7CiAgICBzaW1SZW5kZXJUb3RhbHMoKTsKICB9OwoKICB3aW5kb3cuc2ltQWRqdXN0VXNlcnMgPSBmdW5jdGlvbiAoZGVsdGEpIHsKICAgIGNvbnN0IGVsID0gJCgnc2ltLXVzZXJzJyk7CiAgICBjb25zdCBtaW4gPSBwYXJzZUludChlbC5taW4gfHwgMSwgMTApOwogICAgY29uc3QgbmV4dCA9IE1hdGgubWF4KG1pbiwgKHBhcnNlSW50KGVsLnZhbHVlLCAxMCkgfHwgbWluKSArIGRlbHRhKTsKICAgIGVsLnZhbHVlID0gbmV4dDsKICAgIHNpbVJlbmRlclRvdGFscygpOwogIH07CgogIHdpbmRvdy5zaW1SZW5kZXJUb3RhbHMgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIUNPTkZJRykgcmV0dXJuOwogICAgY29uc3QgcyA9IENPTkZJRy5zZXR0aW5ncyB8fCB7fTsKICAgIGNvbnN0IHN5bSA9IHMuY3VycmVuY3lfc3ltYm9sIHx8ICfigqYnOwogICAgY29uc3QgY3ljbGUgPSB3aW5kb3cuU0lNX0NZQ0xFOwogICAgY29uc3QgYW5udWFsID0gY3ljbGUgPT09ICdhbm51YWwnOwoKICAgIGNvbnN0IG1pblVzZXJzID0gTWF0aC5tYXgoMSwgcGFyc2VJbnQocy5taW5fdXNlcnMgfHwgMSwgMTApKTsKICAgIGNvbnN0IHVzZXJzSW5wdXQgPSAkKCdzaW0tdXNlcnMnKTsKICAgIC8vIE5ldmVyIGxldCB0aGUgZmllbGQgaXRzZWxmIHNpdCBiZWxvdyB0aGUgcGxhdGZvcm0gbWluaW11bSwgd2hhdGV2ZXIKICAgIC8vIHRoZSB2aXNpdG9yIHR5cGVkIOKAlCBzYW1lIGZsb29yIENvbGxhYl9UZW5hbnQ6OmNyZWF0ZSgpIGVuZm9yY2VzCiAgICAvLyBzZXJ2ZXItc2lkZSByZWdhcmRsZXNzIG9mIHdoYXQgdGhpcyBwYWdlIHNlbmRzLgogICAgbGV0IHVzZXJzID0gTWF0aC5tYXgobWluVXNlcnMsIHBhcnNlSW50KHVzZXJzSW5wdXQudmFsdWUsIDEwKSB8fCBtaW5Vc2Vycyk7CiAgICBpZiAocGFyc2VJbnQodXNlcnNJbnB1dC52YWx1ZSwgMTApICE9PSB1c2VycykgdXNlcnNJbnB1dC52YWx1ZSA9IHVzZXJzOwoKICAgIGNvbnN0IHBsYXRmb3JtID0gYW5udWFsID8gcGFyc2VGbG9hdChzLnBsYXRmb3JtX2Nvc3RfYW5udWFsIHx8IDApIDogcGFyc2VGbG9hdChzLnBsYXRmb3JtX2Nvc3RfbW9udGhseSB8fCAwKTsKICAgIGNvbnN0IHBlclVzZXIgID0gYW5udWFsID8gcGFyc2VGbG9hdChzLmNvc3RfcGVyX3VzZXJfYW5udWFsICB8fCAwKSA6IHBhcnNlRmxvYXQocy5jb3N0X3Blcl91c2VyX21vbnRobHkgIHx8IDApOwogICAgY29uc3QgdXNlckNvc3QgPSBwZXJVc2VyICogdXNlcnM7CgogICAgbGV0IG1vZENvc3QgPSAwOwogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNpbS1tb2QtY2hrOmNoZWNrZWQnKS5mb3JFYWNoKGNiID0+IHsKICAgICAgY29uc3QgcHJpY2VFbCA9IGNiLmNsb3Nlc3QoJy5zaW0tbW9kLWl0ZW0nKT8ucXVlcnlTZWxlY3RvcignLnByaWNlJyk7CiAgICAgIGlmICghcHJpY2VFbCkgcmV0dXJuOwogICAgICBtb2RDb3N0ICs9IHBhcnNlRmxvYXQoYW5udWFsID8gcHJpY2VFbC5kYXRhc2V0LmFubnVhbCA6IHByaWNlRWwuZGF0YXNldC5tb250aGx5KSB8fCAwOwogICAgfSk7CgogICAgY29uc3Qgc3VidG90YWwgPSBwbGF0Zm9ybSArIHVzZXJDb3N0ICsgbW9kQ29zdDsKICAgIGNvbnN0IGRpc2NQY3QgPSBhbm51YWwgPyBwYXJzZUZsb2F0KHMuYW5udWFsX2Rpc2NvdW50X3BlcmNlbnQgfHwgMCkgOiAwOwogICAgY29uc3QgZGlzY0FtdCA9IHN1YnRvdGFsICogKGRpc2NQY3QgLyAxMDApOwogICAgLy8gVkFUIGFwcGxpZXMgdG8gdGhlIHN1YnRvdGFsIEFGVEVSIHRoZSBhbm51YWwgZGlzY291bnQsIG5vdCBiZWZvcmUg4oCUCiAgICAvLyBzYW1lIG9yZGVyIENvbGxhYl9QYXltZW50czo6Y2FydF9jaGVja291dCgpIHVzZXMgZm9yIHJlYWwKICAgIC8vIGNoZWNrb3V0cywgYW5kIHN0YW5kYXJkIGludm9pY2luZyBwcmFjdGljZTogdGhlIGRpc2NvdW50IHJlZHVjZXMKICAgIC8vIHRoZSB0YXhhYmxlIGJhc2UsIFZBVCBpcyBjaGFyZ2VkIG9uIHdoYXQncyBhY3R1YWxseSBvd2VkLgogICAgY29uc3QgcG9zdERpc2NvdW50ID0gc3VidG90YWwgLSBkaXNjQW10OwogICAgY29uc3QgdmF0UGN0ID0gcGFyc2VGbG9hdChzLnZhdF9yYXRlX3BlcmNlbnQgfHwgMCk7CiAgICBjb25zdCB2YXRBbXQgPSBwb3N0RGlzY291bnQgKiAodmF0UGN0IC8gMTAwKTsKICAgIGNvbnN0IHRvdGFsID0gcG9zdERpc2NvdW50ICsgdmF0QW10OwoKICAgICQoJ3NpbS1wbGF0JykudGV4dENvbnRlbnQgPSBmbXQoc3ltLCBwbGF0Zm9ybSk7CiAgICAkKCdzaW0tdXNlci1sYmwnKS50ZXh0Q29udGVudCA9IGAke3VzZXJzfSB1c2VyJHt1c2VycyAhPT0gMSA\/ICdzJyA6ICcnfSDDlyAke2ZtdChzeW0sIHBlclVzZXIpfWA7CiAgICAkKCdzaW0tdXNlci1jb3N0JykudGV4dENvbnRlbnQgPSBmbXQoc3ltLCB1c2VyQ29zdCk7CiAgICBjb25zdCBtb2RDaGVja2VkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNpbS1tb2QtY2hrOmNoZWNrZWQnKS5sZW5ndGg7CiAgICAkKCdzaW0tbW9kLWxibCcpLnRleHRDb250ZW50ID0gbW9kQ2hlY2tlZCA\/IGBTZWxlY3RlZCBNb2R1bGVzICgke21vZENoZWNrZWR9KWAgOiAnU2VsZWN0ZWQgTW9kdWxlcyc7CiAgICAkKCdzaW0tbW9kLWNvc3QnKS50ZXh0Q29udGVudCA9IGZtdChzeW0sIG1vZENvc3QpOwogICAgJCgnc2ltLXN1YnRvdGFsJykudGV4dENvbnRlbnQgPSBmbXQoc3ltLCBzdWJ0b3RhbCk7CgogICAgY29uc3QgZGlzY1JvdyA9ICQoJ3NpbS1kaXNjLXJvdycpOwogICAgaWYgKGRpc2NQY3QgPiAwKSB7CiAgICAgIGRpc2NSb3cuc3R5bGUuZGlzcGxheSA9ICcnOwogICAgICAkKCdzaW0tZGlzYy1sYmwnKS50ZXh0Q29udGVudCA9IGBBbm51YWwgRGlzY291bnQgKCR7ZGlzY1BjdH0lKWA7CiAgICAgICQoJ3NpbS1kaXNjLXZhbCcpLnRleHRDb250ZW50ID0gJ+KIkicgKyBmbXQoc3ltLCBkaXNjQW10KTsKICAgIH0gZWxzZSB7CiAgICAgIGRpc2NSb3cuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIH0KCiAgICBjb25zdCB2YXRSb3cgPSAkKCdzaW0tdmF0LXJvdycpOwogICAgaWYgKHZhdFBjdCA+IDApIHsKICAgICAgdmF0Um93LnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgJCgnc2ltLXZhdC1sYmwnKS50ZXh0Q29udGVudCA9IGBWQVQgKCR7dmF0UGN0fSUpYDsKICAgICAgJCgnc2ltLXZhdC12YWwnKS50ZXh0Q29udGVudCA9IGZtdChzeW0sIHZhdEFtdCk7CiAgICB9IGVsc2UgewogICAgICB2YXRSb3cuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIH0KICAgICQoJ3NpbS10b3RhbCcpLnRleHRDb250ZW50ID0gZm10KHN5bSwgdG90YWwpOwogIH07CgogIHNpbUluaXQoKTsKfSkoKTsK\">(function(c){var s=document.createElement(c.tagName);s.text=decodeURIComponent(escape(atob(c.dataset.collabJs)));c.parentNode.insertBefore(s,c.nextSibling)})(document.currentScript)<\/script>\n\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":"","_members_access_role":[],"_members_access_error":""},"class_list":["post-64","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/syncfinanceng.com\/internal\/wp-json\/wp\/v2\/pages\/64","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/syncfinanceng.com\/internal\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/syncfinanceng.com\/internal\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/syncfinanceng.com\/internal\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/syncfinanceng.com\/internal\/wp-json\/wp\/v2\/comments?post=64"}],"version-history":[{"count":0,"href":"https:\/\/syncfinanceng.com\/internal\/wp-json\/wp\/v2\/pages\/64\/revisions"}],"wp:attachment":[{"href":"https:\/\/syncfinanceng.com\/internal\/wp-json\/wp\/v2\/media?parent=64"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}