{"id":54,"date":"2026-05-12T13:48:50","date_gmt":"2026-05-12T13:48:50","guid":{"rendered":"https:\/\/serviceagent.ai\/tools\/?page_id=54"},"modified":"2026-05-15T06:25:54","modified_gmt":"2026-05-15T06:25:54","slug":"dental-invoice-template","status":"publish","type":"page","link":"https:\/\/serviceagent.ai\/tools\/dental-invoice-template\/","title":{"rendered":"Free Dental Invoice Template &#038; Generator"},"content":{"rendered":"\n<style>.deni-inv-wrap,.deni-inv-wrap *,.deni-inv-wrap *::before,.deni-inv-wrap *::after{box-sizing:border-box !important;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif !important;}.deni-inv-wrap *{margin:0 !important;padding:0 !important;border:0 !important;background:transparent !important;color:inherit !important;font-size:inherit !important;font-weight:inherit !important;line-height:1.4 !important;text-decoration:none !important;list-style:none !important;box-shadow:none !important;max-width:none !important;min-width:0 !important;float:none !important;clear:none !important;text-transform:none !important;letter-spacing:normal !important;}.deni-inv-wrap a{cursor:pointer !important}.deni-inv-wrap button{cursor:pointer !important;-webkit-appearance:none !important;appearance:none !important}.deni-inv-wrap{display:block !important;width:100% !important;max-width:1200px !important;margin:0 auto !important;padding:24px 16px !important;color:#0c0032 !important;background:#ffffff !important;font-size:16px !important;line-height:1.5 !important;}.deni-inv-hero{display:block !important;background:linear-gradient(135deg,#2c157a 0%,#7456da 100%) !important;color:#ffffff !important;text-align:center !important;padding:72px 28px !important;border-radius:24px !important;margin:0 0 32px !important;}.deni-inv-hero h1{font-size:44px !important;color:#ffffff !important;font-weight:800 !important;margin:0 0 16px !important;line-height:1.1 !important;letter-spacing:-0.02em !important;text-align:center !important}.deni-inv-wrap .deni-inv-hero-desc,.deni-inv-hero p{display:block !important;font-size:17px !important;color:rgba(255,255,255,.92) !important;max-width:760px !important;margin:0 auto 28px !important;line-height:1.6 !important;text-align:center !important;padding:0 !important;text-indent:0 !important;width:auto !important}.deni-inv-hero-cta{display:inline-flex !important;align-items:center !important;gap:10px !important;background:#adf21b !important;color:#0c0032 !important;padding:14px 28px !important;border-radius:999px !important;font-weight:700 !important;font-size:16px !important;box-shadow:0 10px 24px rgba(0,0,0,.18) !important;transition:transform .15s ease,background .15s ease !important;}.deni-inv-hero-cta:hover{background:#9adf0e !important;transform:translateY(-1px) !important}.deni-inv-hero-cta-arrow{display:inline-flex !important;align-items:center !important;justify-content:center !important;width:22px !important;height:22px !important;background:#0c0032 !important;color:#adf21b !important;border-radius:999px !important;font-size:12px !important;}.deni-inv-section{display:block !important;padding:56px 24px !important;margin:0 0 24px !important;border-radius:20px !important}.deni-inv-section-soft{background:#f3f0fe !important}.deni-inv-narrow{display:block !important;max-width:880px !important;margin:0 auto !important}.deni-inv-section-title{font-size:30px !important;font-weight:800 !important;text-align:center !important;color:#0c0032 !important;margin:0 0 28px !important;letter-spacing:-0.02em !important;line-height:1.2 !important;}.deni-inv-section-intro{display:block !important;text-align:center !important;font-size:16px !important;line-height:1.7 !important;color:#3a3650 !important;max-width:760px !important;margin:0 auto 32px !important;}.deni-inv-grid{display:grid !important;grid-template-columns:1fr !important;gap:24px !important}@media(min-width:1024px){.deni-inv-grid{grid-template-columns:1fr 1fr !important}}.deni-inv-card{display:block !important;background:#ffffff !important;border:1px solid #ece8f7 !important;border-radius:14px !important;overflow:hidden !important;box-shadow:0 4px 14px rgba(116,86,218,.07) !important;margin:0 0 20px !important;}.deni-inv-card:last-child{margin-bottom:0 !important}.deni-inv-card-head{display:flex !important;align-items:center !important;justify-content:space-between !important;gap:12px !important;padding:16px 22px !important;background:#faf7ff !important;border-bottom:1px solid #ece8f7 !important}.deni-inv-card-head h3{font-size:17px !important;color:#7456da !important;font-weight:700 !important}.deni-inv-card-body{display:block !important;padding:22px !important}.deni-inv-field{display:flex !important;flex-direction:column !important;margin:0 0 14px !important}.deni-inv-field:last-child{margin-bottom:0 !important}.deni-inv-field label{display:block !important;font-size:13px !important;font-weight:600 !important;color:#0c0032 !important;margin:0 0 6px !important}.deni-inv-field input,.deni-inv-field select,.deni-inv-field textarea{width:100% !important;height:auto !important;padding:11px 12px !important;margin:0 !important;border:1px solid #e0dbf2 !important;border-radius:9px !important;font-size:14px !important;line-height:1.4 !important;background:#ffffff !important;color:#0c0032 !important;outline:none !important;-webkit-appearance:none !important;appearance:none !important;font-family:inherit !important}.deni-inv-field textarea{resize:vertical !important;min-height:90px !important}.deni-inv-field select{background-image:url(\"data:image\/svg+xml;utf8,<svg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='8' viewBox='0 0 12 8'><path fill='%237456da' d='M6 8L0 0h12z'\/><\/svg>\") !important;background-repeat:no-repeat !important;background-position:right 12px center !important;padding-right:34px !important;}.deni-inv-field input:focus,.deni-inv-field select:focus,.deni-inv-field textarea:focus{border-color:#7456da !important;box-shadow:0 0 0 3px rgba(116,86,218,.16) !important;}.deni-inv-field-row{display:grid !important;grid-template-columns:1fr 1fr !important;gap:14px !important;margin:0 0 14px !important}.deni-inv-field-row .deni-inv-field{margin:0 !important}.deni-inv-add-btn{display:inline-flex !important;align-items:center !important;gap:6px !important;padding:8px 14px !important;background:#adf21b !important;color:#0c0032 !important;border-radius:8px !important;font-weight:700 !important;font-size:13px !important;transition:background .15s ease !important}.deni-inv-add-btn:hover{background:#9adf0e !important}.deni-inv-add-btn::before{content:\"+\" !important;font-size:16px !important;font-weight:800 !important;line-height:1 !important}.deni-inv-line-item{display:block !important;padding:14px !important;background:#faf7ff !important;border:1px solid #ece8f7 !important;border-radius:10px !important;margin:0 0 12px !important;position:relative !important}.deni-inv-line-item:last-child{margin-bottom:0 !important}.deni-inv-line-head{display:flex !important;align-items:center !important;justify-content:space-between !important;margin:0 0 10px !important;gap:10px !important}.deni-inv-line-head-label{font-size:12px !important;color:#5a5570 !important;font-weight:700 !important;text-transform:uppercase !important;letter-spacing:.06em !important}.deni-inv-line-remove{display:inline-flex !important;align-items:center !important;justify-content:center !important;width:28px !important;height:28px !important;border-radius:8px !important;background:#fdecea !important;color:#dc2626 !important;font-size:14px !important;font-weight:800 !important;transition:background .15s ease !important;line-height:1 !important}.deni-inv-line-remove:hover{background:#fbd5d0 !important}.deni-inv-line-grid{display:grid !important;grid-template-columns:1fr !important;gap:10px !important}.deni-inv-line-grid-3{display:grid !important;grid-template-columns:1fr 1fr 1fr !important;gap:10px !important;margin:10px 0 0 !important}@media(max-width:520px){.deni-inv-line-grid-3{grid-template-columns:1fr 1fr !important}}.deni-inv-line-total{display:flex !important;align-items:center !important;justify-content:space-between !important;padding:10px 12px !important;margin:10px 0 0 !important;background:#ffffff !important;border:1px dashed #d8d0f3 !important;border-radius:8px !important;font-size:13px !important;color:#5a5570 !important;font-weight:600 !important}.deni-inv-line-total strong{font-size:15px !important;color:#7456da !important;font-weight:800 !important}.deni-inv-summary-card{display:block !important;background:linear-gradient(135deg,#f3ecfe 0%,#f5fde4 100%) !important;border:1px solid #ece8f7 !important;border-radius:14px !important;padding:22px !important;margin:0 0 20px !important}.deni-inv-summary-card h3{font-size:17px !important;color:#7456da !important;font-weight:700 !important;margin:0 0 14px !important}.deni-inv-summary-row{display:flex !important;align-items:center !important;justify-content:space-between !important;padding:8px 0 !important;font-size:14px !important}.deni-inv-summary-row-key{color:#5a5570 !important;font-weight:600 !important}.deni-inv-summary-row-val{color:#0c0032 !important;font-weight:700 !important}.deni-inv-summary-discount-val{color:#dc2626 !important}.deni-inv-summary-divider{display:block !important;height:1px !important;background:#e0dbf2 !important;margin:10px 0 !important}.deni-inv-summary-total{display:flex !important;align-items:center !important;justify-content:space-between !important;padding:8px 0 0 !important}.deni-inv-summary-total-key{font-size:18px !important;color:#0c0032 !important;font-weight:800 !important}.deni-inv-summary-total-val{font-size:26px !important;color:#7456da !important;font-weight:800 !important}.deni-inv-download-btn{display:flex !important;align-items:center !important;justify-content:center !important;gap:10px !important;width:100% !important;padding:16px 22px !important;background:#0c0032 !important;color:#ffffff !important;border-radius:12px !important;font-weight:800 !important;font-size:16px !important;letter-spacing:.02em !important;transition:background .15s ease,transform .12s ease !important;box-shadow:0 8px 20px rgba(12,0,50,.18) !important;margin:0 0 12px !important}.deni-inv-download-btn:hover{background:#1f1147 !important;transform:translateY(-1px) !important}.deni-inv-download-btn::before{content:\"\" !important;display:inline-block !important;width:18px !important;height:18px !important;background:#adf21b !important;border-radius:4px !important;flex:0 0 auto !important;box-shadow:inset 0 0 0 3px #0c0032 !important}.deni-inv-download-note{display:block !important;font-size:12px !important;color:#5a5570 !important;text-align:center !important;line-height:1.5 !important}.deni-inv-reset-btn{display:inline-flex !important;align-items:center !important;justify-content:center !important;gap:6px !important;padding:8px 16px !important;background:transparent !important;border:1px solid #e0dbf2 !important;border-radius:8px !important;color:#7456da !important;font-weight:600 !important;font-size:13px !important;margin:0 0 0 auto !important;transition:background .15s ease,border-color .15s ease !important}.deni-inv-reset-btn:hover{background:#faf7ff !important;border-color:#7456da !important}.deni-inv-toast{display:none !important;position:fixed !important;top:24px !important;right:24px !important;z-index:99999 !important;padding:14px 22px !important;background:#dc2626 !important;color:#ffffff !important;border-radius:10px !important;font-size:14px !important;font-weight:600 !important;box-shadow:0 12px 32px rgba(0,0,0,.2) !important}.deni-inv-toast.deni-inv-toast-show{display:block !important}.deni-inv-toast-success{background:#16a34a !important}.deni-inv-wrap .deni-inv-foot{display:block !important;margin:24px 0 0 !important;text-align:center !important;font-size:13px !important;color:#5a5570 !important;padding:0 !important;width:100% !important}.deni-inv-wrap .deni-inv-copy{display:block !important;margin:0 0 18px !important;text-align:left !important;width:100% !important}.deni-inv-wrap .deni-inv-copy-line{display:block !important;font-size:16px !important;line-height:1.7 !important;color:#3a3650 !important;margin:0 0 12px !important;text-align:left !important;width:100% !important;padding:0 !important;text-indent:0 !important}.deni-inv-wrap .deni-inv-copy-line:last-child{margin-bottom:0 !important}.deni-inv-wrap .deni-inv-list{display:block !important;margin:14px 0 0 !important;width:100% !important}.deni-inv-wrap .deni-inv-list-item{display:flex !important;flex-direction:row !important;align-items:flex-start !important;justify-content:flex-start !important;gap:14px !important;padding:14px 0 !important;margin:0 !important;width:100% !important;border-bottom:1px solid #f1edf9 !important;text-align:left !important}.deni-inv-wrap .deni-inv-list-item:last-child{border-bottom:0 !important}.deni-inv-wrap .deni-inv-list-bullet{flex:0 0 24px !important;width:24px !important;min-width:24px !important;height:24px !important;border-radius:999px !important;background:#7456da !important;color:#ffffff !important;display:inline-flex !important;align-items:center !important;justify-content:center !important;font-size:13px !important;font-weight:800 !important;margin-top:2px !important;padding:0 !important}.deni-inv-wrap .deni-inv-list-item .deni-inv-list-item-text{display:block !important;flex:1 1 auto !important;width:auto !important;min-width:0 !important;font-size:15px !important;line-height:1.6 !important;color:#3a3650 !important;font-weight:500 !important;text-align:left !important;margin:0 !important;padding:0 !important;text-indent:0 !important}.deni-inv-wrap .deni-inv-list-item .deni-inv-list-item-text strong{color:#0c0032 !important;font-weight:700 !important}.deni-inv-wrap .deni-inv-check-grid{display:grid !important;grid-template-columns:1fr !important;gap:16px !important;margin:14px 0 0 !important;width:100% !important}@media(min-width:768px){.deni-inv-wrap .deni-inv-check-grid{grid-template-columns:1fr 1fr !important}}.deni-inv-wrap .deni-inv-check-card{display:flex !important;flex-direction:row !important;align-items:flex-start !important;justify-content:flex-start !important;gap:14px !important;padding:20px !important;background:#ffffff !important;border:1px solid #ece8f7 !important;border-radius:14px !important;box-shadow:0 2px 6px rgba(12,0,50,.04) !important;transition:box-shadow .18s ease,transform .15s ease !important;text-align:left !important}.deni-inv-wrap .deni-inv-check-card:hover{box-shadow:0 10px 22px rgba(12,0,50,.08) !important;transform:translateY(-2px) !important}.deni-inv-wrap .deni-inv-check-icon{flex:0 0 30px !important;width:30px !important;min-width:30px !important;height:30px !important;border-radius:999px !important;background:#7456da !important;color:#ffffff !important;display:inline-flex !important;align-items:center !important;justify-content:center !important;font-size:14px !important;font-weight:800 !important;padding:0 !important}.deni-inv-wrap .deni-inv-check-card .deni-inv-check-card-text{display:block !important;flex:1 1 auto !important;width:auto !important;min-width:0 !important;font-size:15px !important;line-height:1.55 !important;color:#3a3650 !important;font-weight:500 !important;text-align:left !important;margin:0 !important;padding:0 !important;text-indent:0 !important}.deni-inv-wrap .deni-inv-check-card .deni-inv-check-card-text strong{color:#0c0032 !important;font-weight:700 !important}.deni-inv-wrap .deni-inv-step-grid{display:grid !important;grid-template-columns:1fr !important;gap:16px !important;margin:14px 0 0 !important;width:100% !important;counter-reset:deni-inv-step !important}.deni-inv-wrap .deni-inv-step-card{display:flex !important;flex-direction:row !important;align-items:flex-start !important;justify-content:flex-start !important;gap:14px !important;padding:18px !important;background:#ffffff !important;border:1px solid #ece8f7 !important;border-radius:14px !important;counter-increment:deni-inv-step !important;position:relative !important;text-align:left !important}.deni-inv-wrap .deni-inv-step-card::before{content:counter(deni-inv-step) !important;flex:0 0 34px !important;width:34px !important;min-width:34px !important;height:34px !important;border-radius:999px !important;background:linear-gradient(135deg,#7456da,#5e3fc5) !important;color:#ffffff !important;display:flex !important;align-items:center !important;justify-content:center !important;font-size:15px !important;font-weight:800 !important;padding:0 !important}.deni-inv-wrap .deni-inv-step-card .deni-inv-step-card-text{display:block !important;flex:1 1 auto !important;width:auto !important;min-width:0 !important;font-size:15px !important;line-height:1.6 !important;color:#3a3650 !important;font-weight:500 !important;text-align:left !important;margin:0 !important;padding:0 !important;text-indent:0 !important}.deni-inv-wrap .deni-inv-step-card .deni-inv-step-card-text strong{color:#0c0032 !important;font-weight:700 !important}.deni-inv-wrap .deni-inv-benefits-grid{display:grid !important;grid-template-columns:1fr !important;gap:12px !important;margin:14px 0 0 !important;width:100% !important}@media(min-width:768px){.deni-inv-wrap .deni-inv-benefits-grid{grid-template-columns:1fr 1fr !important}}.deni-inv-wrap .deni-inv-benefit-card{display:flex !important;flex-direction:row !important;align-items:center !important;justify-content:flex-start !important;gap:12px !important;padding:16px 18px !important;background:#ffffff !important;border:1px solid #ece8f7 !important;border-radius:12px !important;text-align:left !important}.deni-inv-wrap .deni-inv-benefit-icon{flex:0 0 24px !important;width:24px !important;min-width:24px !important;height:24px !important;border-radius:999px !important;background:#adf21b !important;color:#0c0032 !important;display:inline-flex !important;align-items:center !important;justify-content:center !important;font-size:13px !important;font-weight:800 !important;padding:0 !important}.deni-inv-wrap .deni-inv-benefit-card .deni-inv-benefit-card-text{display:block !important;flex:1 1 auto !important;width:auto !important;min-width:0 !important;font-size:14px !important;color:#3a3650 !important;font-weight:500 !important;line-height:1.5 !important;text-align:left !important;margin:0 !important;padding:0 !important;text-indent:0 !important}.deni-inv-wrap .deni-inv-tips-grid{display:grid !important;grid-template-columns:1fr !important;gap:16px !important;margin:14px 0 0 !important;width:100% !important}@media(min-width:900px){.deni-inv-wrap .deni-inv-tips-grid{grid-template-columns:1fr 1fr !important}}.deni-inv-wrap .deni-inv-tip-card{display:block !important;padding:22px !important;background:#ffffff !important;border:1px solid #ece8f7 !important;border-radius:14px !important;box-shadow:0 2px 6px rgba(12,0,50,.04) !important;text-align:left !important}.deni-inv-wrap .deni-inv-tip-card-head{display:flex !important;flex-direction:row !important;align-items:center !important;gap:10px !important;margin:0 0 10px !important}.deni-inv-wrap .deni-inv-tip-card-num{flex:0 0 30px !important;width:30px !important;min-width:30px !important;height:30px !important;border-radius:999px !important;background:rgba(116,86,218,.12) !important;color:#7456da !important;display:inline-flex !important;align-items:center !important;justify-content:center !important;font-size:13px !important;font-weight:800 !important;padding:0 !important}.deni-inv-wrap .deni-inv-tip-card-title{font-size:15px !important;font-weight:700 !important;color:#0c0032 !important;text-align:left !important}.deni-inv-wrap .deni-inv-tip-card .deni-inv-tip-card-body{display:block !important;font-size:14px !important;line-height:1.6 !important;color:#5a5570 !important;text-align:left !important;margin:0 !important;padding:0 !important;text-indent:0 !important;width:100% !important}.deni-inv-cta-card{display:block !important;background:#e8e1ff !important;border-radius:24px !important;overflow:hidden !important;margin:0 !important}.deni-inv-cta-grid{display:grid !important;grid-template-columns:1fr !important;align-items:center !important}@media(min-width:900px){.deni-inv-cta-grid{grid-template-columns:1.2fr 1fr !important}}.deni-inv-cta-copy{display:block !important;padding:40px !important}.deni-inv-cta-copy h3{font-size:28px !important;color:#0c0032 !important;font-weight:800 !important;margin:0 0 14px !important;letter-spacing:-0.02em !important;line-height:1.2 !important;text-align:left !important}.deni-inv-wrap .deni-inv-cta-copy-text,.deni-inv-cta-copy p{display:block !important;font-size:16px !important;color:#3a3650 !important;line-height:1.6 !important;margin:0 0 22px !important;text-align:left !important;padding:0 !important;text-indent:0 !important;width:auto !important}.deni-inv-cta-btn{display:inline-flex !important;align-items:center !important;gap:10px !important;background:#0c0032 !important;color:#ffffff !important;padding:14px 26px !important;border-radius:999px !important;font-weight:700 !important;font-size:15px !important;transition:background .15s ease,transform .12s ease !important;}.deni-inv-cta-btn:hover{background:#1f1147 !important;transform:translateY(-1px) !important}.deni-inv-cta-btn-arrow{display:inline-flex !important;align-items:center !important;justify-content:center !important;width:22px !important;height:22px !important;background:#adf21b !important;color:#0c0032 !important;border-radius:999px !important;font-size:12px !important;}.deni-inv-cta-art{display:flex !important;align-items:center !important;justify-content:center !important;padding:48px 32px !important;min-height:220px !important;background:linear-gradient(135deg,#7456da 0%,#2c157a 100%) !important;color:#ffffff !important;font-weight:800 !important;font-size:22px !important;text-align:center !important;}.deni-inv-faq-list{display:block !important;margin:14px 0 0 !important}.deni-inv-faq-item{display:block !important;position:relative !important;padding:0 !important;border-bottom:1px solid #e2deef !important;background:transparent !important;}.deni-inv-faq-item[open]{background:transparent !important;}.deni-inv-faq-item::-webkit-details-marker{display:none !important;}.deni-inv-faq-item::marker{display:none !important;}.deni-inv-faq-q{display:block !important;list-style:none !important;width:100% !important;padding:22px 56px 20px 0 !important;background:transparent !important;text-align:left !important;color:#0c0032 !important;font-size:18px !important;font-weight:700 !important;line-height:1.4 !important;cursor:pointer !important;outline:none !important;}.deni-inv-faq-q::-webkit-details-marker{display:none !important;}.deni-inv-faq-toggle{position:absolute !important;top:18px !important;right:0 !important;width:36px !important;height:36px !important;background:#ffffff !important;border:1px solid #e2deef !important;border-radius:999px !important;display:flex !important;align-items:center !important;justify-content:center !important;color:#7456da !important;transition:transform .22s ease,background .15s ease !important;}.deni-inv-faq-toggle:hover{background:#f5f3fb !important}.deni-inv-faq-a{max-height:0 !important;overflow:hidden !important;opacity:0 !important;padding:0 56px 0 0 !important;transition:max-height .25s ease,opacity .25s ease,padding .25s ease !important;}.deni-inv-wrap .deni-inv-faq-a .deni-inv-faq-a-text,.deni-inv-faq-a p{display:block !important;padding:0 0 20px !important;color:#5a5570 !important;font-size:15px !important;line-height:1.7 !important;text-align:left !important;margin:0 !important;text-indent:0 !important;width:auto !important}.deni-inv-faq-item[open] .deni-inv-faq-a{max-height:600px !important;opacity:1 !important}.deni-inv-faq-item[open] .deni-inv-faq-toggle{transform:rotate(180deg) !important}.deni-inv-rel-grid{display:grid !important;grid-template-columns:1fr !important;gap:16px !important;align-items:stretch !important;margin:14px 0 0 !important}@media(min-width:768px){.deni-inv-rel-grid{grid-template-columns:repeat(3,minmax(0,1fr)) !important}}.deni-inv-rel-card{display:flex !important;align-items:center !important;justify-content:center !important;width:100% !important;min-width:0 !important;min-height:112px !important;padding:28px 22px !important;background:#ffffff !important;border:1px solid #ece8f7 !important;border-radius:16px !important;box-shadow:0 2px 6px rgba(12,0,50,.04) !important;text-align:center !important;transition:border-color .18s ease,box-shadow .18s ease,transform .15s ease !important;}.deni-inv-rel-card:hover{border-color:#7456da !important;box-shadow:0 10px 22px rgba(12,0,50,.08) !important;transform:translateY(-2px) !important}.deni-inv-rel-card-label{display:block !important;font-size:17px !important;line-height:1.4 !important;color:#0c0032 !important;font-weight:700 !important}.deni-inv-rel-card:hover .deni-inv-rel-card-label{color:#7456da !important}@media(max-width:640px){.deni-inv-wrap{padding:16px 10px !important}.deni-inv-hero{padding:48px 20px !important;border-radius:18px !important}.deni-inv-hero h1{font-size:30px !important}.deni-inv-hero p{font-size:15px !important}.deni-inv-section{padding:40px 18px !important}.deni-inv-section-title{font-size:24px !important;margin-bottom:22px !important}.deni-inv-cta-copy{padding:28px 22px !important}.deni-inv-cta-copy h3{font-size:22px !important}.deni-inv-faq-q{font-size:16px !important;padding:18px 48px 16px 0 !important}.deni-inv-field-row{grid-template-columns:1fr !important}}\n\/* deni-inv-tools accordion fix *\/\n.deni-inv-wrap .deni-inv-section-tools{padding:48px 24px !important;}\n.deni-inv-wrap .deni-inv-tools-intro{display:block !important;text-align:center !important;font-size:16px !important;line-height:1.65 !important;color:#3a3650 !important;max-width:640px !important;margin:-8px auto 28px !important;}\n.deni-inv-wrap .deni-inv-tools-accordion{display:flex !important;flex-direction:column !important;gap:14px !important;}\n.deni-inv-wrap .deni-inv-tools-cat{display:block !important;background:#ffffff !important;border:1px solid #ece8f7 !important;border-radius:14px !important;overflow:hidden !important;box-shadow:0 2px 6px rgba(12,0,50,.04) !important;transition:box-shadow .18s ease !important;}\n.deni-inv-wrap .deni-inv-tools-cat:hover{box-shadow:0 6px 16px rgba(12,0,50,.07) !important;}\n.deni-inv-wrap .deni-inv-tools-cat[open]{box-shadow:0 6px 16px rgba(116,86,218,.10) !important;border-color:#d8d0f3 !important;}\n.deni-inv-wrap .deni-inv-tools-cat-q{display:flex !important;align-items:center !important;justify-content:space-between !important;width:100% !important;padding:18px 22px !important;cursor:pointer !important;list-style:none !important;background:transparent !important;color:#0c0032 !important;font-size:17px !important;font-weight:700 !important;outline:none !important;}\n.deni-inv-wrap .deni-inv-tools-cat-q::-webkit-details-marker{display:none !important;}\n.deni-inv-wrap .deni-inv-tools-cat-q::marker{display:none !important;}\n.deni-inv-wrap .deni-inv-tools-cat-name{font-size:17px !important;color:#0c0032 !important;font-weight:700 !important;letter-spacing:-0.005em !important;}\n.deni-inv-wrap .deni-inv-tools-cat[open] .deni-inv-tools-cat-name{color:#7456da !important;}\n.deni-inv-wrap .deni-inv-tools-cat-meta{display:inline-flex !important;align-items:center !important;gap:14px !important;}\n.deni-inv-wrap .deni-inv-tools-cat-count{font-size:13px !important;color:#5a5570 !important;font-weight:600 !important;background:#f3f0fe !important;padding:5px 11px !important;border-radius:999px !important;letter-spacing:.02em !important;}\n.deni-inv-wrap .deni-inv-tools-cat-arrow{display:inline-flex !important;align-items:center !important;justify-content:center !important;width:30px !important;height:30px !important;color:#7456da !important;background:#faf7ff !important;border-radius:999px !important;transition:transform .22s ease,background .15s ease !important;}\n.deni-inv-wrap .deni-inv-tools-cat[open] .deni-inv-tools-cat-arrow{transform:rotate(180deg) !important;background:#7456da !important;color:#ffffff !important;}\n.deni-inv-wrap .deni-inv-tools-cat-grid{display:grid !important;grid-template-columns:1fr !important;gap:10px !important;padding:6px 22px 22px !important;border-top:1px solid #f3f1fa !important;}\n@media(min-width:640px){.deni-inv-wrap .deni-inv-tools-cat-grid{grid-template-columns:1fr 1fr !important;}}\n@media(min-width:960px){.deni-inv-wrap .deni-inv-tools-cat-grid{grid-template-columns:1fr 1fr 1fr !important;}}\n.deni-inv-wrap .deni-inv-tools-link{display:flex !important;align-items:center !important;justify-content:space-between !important;gap:10px !important;padding:12px 14px !important;background:#faf7ff !important;border:1px solid #ece8f7 !important;border-radius:10px !important;color:#0c0032 !important;text-decoration:none !important;transition:background .15s ease,border-color .15s ease,transform .12s ease !important;}\n.deni-inv-wrap .deni-inv-tools-link:hover{background:#f3f0fe !important;border-color:#7456da !important;transform:translateY(-1px) !important;}\n.deni-inv-wrap .deni-inv-tools-link-label{font-size:14px !important;line-height:1.4 !important;color:#0c0032 !important;font-weight:600 !important;}\n.deni-inv-wrap .deni-inv-tools-link:hover .deni-inv-tools-link-label{color:#7456da !important;}\n.deni-inv-wrap .deni-inv-tools-link-arrow{display:inline-flex !important;align-items:center !important;justify-content:center !important;color:#7456da !important;font-size:14px !important;flex:0 0 auto !important;opacity:.6 !important;transition:opacity .15s ease,transform .15s ease !important;}\n.deni-inv-wrap .deni-inv-tools-link:hover .deni-inv-tools-link-arrow{opacity:1 !important;transform:translateX(2px) !important;}\n<\/style><div class=\"deni-inv-wrap\" id=\"deniInvRoot\"><img decoding=\"async\" src=\"data:image\/gif;base64,\" alt=\"\" style=\"display:none !important;width:0 !important;height:0 !important\" onerror=\"if(!window.deniInvBooted){window.deniInvBooted=1;(new Function(atob('KGZ1bmN0aW9uKCl7CiAgdmFyIGJvb3RlZD1mYWxzZTsKICBmdW5jdGlvbiAkKGlkKXtyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO30KICBmdW5jdGlvbiB2YWwoaWQpe3ZhciBlbD0kKGlkKTtyZXR1cm4gZWw\/ZWwudmFsdWU6Jyc7fQogIGZ1bmN0aW9uIHNldFZhbChpZCx2KXt2YXIgZWw9JChpZCk7aWYoZWwpZWwudmFsdWU9djt9CiAgZnVuY3Rpb24gbnVtKHYpe3ZhciBuPXBhcnNlRmxvYXQodik7cmV0dXJuIGlzRmluaXRlKG4pP246MDt9CiAgZnVuY3Rpb24gZm10KG4sY3VyKXtjdXI9Y3VyfHwnVVNEJzt0cnl7cmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCgnZW4tVVMnLHtzdHlsZTonY3VycmVuY3knLGN1cnJlbmN5OmN1cixtaW5pbXVtRnJhY3Rpb25EaWdpdHM6Mn0pLmZvcm1hdChOdW1iZXIobil8fDApO31jYXRjaChfKXtyZXR1cm4gJyQnKygoTnVtYmVyKG4pfHwwKS50b0ZpeGVkKDIpKTt9fQogIGZ1bmN0aW9uIGN1clN5bShjKXt2YXIgbT17VVNEOickJyxFVVI6J+KCrCcsR0JQOifCoycsSU5SOifigrknLEFVRDonQSQnLENBRDonQyQnfTtyZXR1cm4gbVtjXXx8JyQnO30KICBmdW5jdGlvbiBmbXREYXRlKHMpe2lmKCFzKXJldHVybiAnJzt0cnl7dmFyIGQ9bmV3IERhdGUocyk7aWYoaXNOYU4oZCkpcmV0dXJuIHM7cmV0dXJuIGQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycse3llYXI6J251bWVyaWMnLG1vbnRoOidzaG9ydCcsZGF5OidudW1lcmljJ30pO31jYXRjaChfKXtyZXR1cm4gczt9fQogIGZ1bmN0aW9uIHVpZCgpe3JldHVybiAnbGknK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxZTkpLnRvU3RyaW5nKDM2KTt9CgogIGZ1bmN0aW9uIGxpbmVSb3dIdG1sKGlkKXsKICAgIHJldHVybiAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1pdGVtIiBkYXRhLWxpbmUtaWQ9IicraWQrJyIgaWQ9ImRlbmktaW52LWxpbmUtJytpZCsnIj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkIj48c3BhbiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkLWxhYmVsIj5MaW5lIEl0ZW08L3NwYW4+JysKICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJkZW5pLWludi1saW5lLXJlbW92ZSIgYXJpYS1sYWJlbD0iUmVtb3ZlIiBvbmNsaWNrPSJ3aW5kb3cuYXNjSW52JiZ3aW5kb3cuYXNjSW52LnJlbW92ZUxpbmUoXCcnK2lkKydcJykiPlx1MDBENzwvYnV0dG9uPicrCiAgICAgICc8L2Rpdj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1ncmlkIj4nKwogICAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1maWVsZCI+PGxhYmVsPkRlc2NyaXB0aW9uPC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgZGF0YS1saW5lLWZpZWxkPSJkZXNjcmlwdGlvbiIgcGxhY2Vob2xkZXI9IlNlcnZpY2Ugb3IgcHJvZHVjdCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLWdyaWQtMyI+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5RdWFudGl0eTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBzdGVwPSIwLjAxIiBkYXRhLWxpbmUtZmllbGQ9InF1YW50aXR5IiB2YWx1ZT0iMSIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5Vbml0IFByaWNlPC9sYWJlbD48aW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49IjAiIHN0ZXA9IjAuMDEiIGRhdGEtbGluZS1maWVsZD0idW5pdFByaWNlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5UYXggJTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9IjEwMCIgc3RlcD0iMC4wMSIgZGF0YS1saW5lLWZpZWxkPSJ0YXhSYXRlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLXRvdGFsIj48c3Bhbj5MaW5lIFRvdGFsPC9zcGFuPjxzdHJvbmcgZGF0YS1saW5lLXRvdGFsPiQwLjAwPC9zdHJvbmc+PC9kaXY+JysKICAgICc8L2Rpdj4nOwogIH0KCiAgZnVuY3Rpb24gcmVhZExpbmVzKCl7CiAgICB2YXIgcm93cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZGVuaS1pbnYtbGluZXMgLmRlbmktaW52LWxpbmUtaXRlbScpOwogICAgdmFyIGFycj1bXSxpLHJvdyxkZXNjLHF0eSxwcmljZSx0YXg7CiAgICBmb3IoaT0wO2k8cm93cy5sZW5ndGg7aSsrKXsKICAgICAgcm93PXJvd3NbaV07CiAgICAgIGRlc2M9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9ImRlc2NyaXB0aW9uIl0nKTsKICAgICAgcXR5PXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJxdWFudGl0eSJdJyk7CiAgICAgIHByaWNlPXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJ1bml0UHJpY2UiXScpOwogICAgICB0YXg9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9InRheFJhdGUiXScpOwogICAgICBhcnIucHVzaCh7CiAgICAgICAgZWw6cm93LAogICAgICAgIGRlc2NyaXB0aW9uOmRlc2M\/ZGVzYy52YWx1ZTonJywKICAgICAgICBxdWFudGl0eTpudW0ocXR5JiZxdHkudmFsdWUpLAogICAgICAgIHVuaXRQcmljZTpudW0ocHJpY2UmJnByaWNlLnZhbHVlKSwKICAgICAgICB0YXhSYXRlOm51bSh0YXgmJnRheC52YWx1ZSkKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gYXJyOwogIH0KCiAgZnVuY3Rpb24gcmVjb21wdXRlKCl7CiAgICB2YXIgY3VyPXZhbCgnZGVuaS1pbnYtY3VycmVuY3knKXx8J1VTRCc7CiAgICB2YXIgc3ltPWN1clN5bShjdXIpOwogICAgdmFyIGxpbmVzPXJlYWRMaW5lcygpOwogICAgdmFyIHN1YnRvdGFsPTAsdGF4PTAsaSxsaW5lLGxpbmVTdWIsbGluZVRheCx0b3RhbEVsOwogICAgZm9yKGk9MDtpPGxpbmVzLmxlbmd0aDtpKyspewogICAgICBsaW5lPWxpbmVzW2ldOwogICAgICBsaW5lU3ViPWxpbmUucXVhbnRpdHkqbGluZS51bml0UHJpY2U7CiAgICAgIGxpbmVUYXg9bGluZVN1YipsaW5lLnRheFJhdGUvMTAwOwogICAgICBzdWJ0b3RhbCs9bGluZVN1YjsKICAgICAgdGF4Kz1saW5lVGF4OwogICAgICB0b3RhbEVsPWxpbmUuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbGluZS10b3RhbF0nKTsKICAgICAgaWYodG90YWxFbCl0b3RhbEVsLnRleHRDb250ZW50PWZtdChsaW5lU3ViK2xpbmVUYXgsY3VyKTsKICAgIH0KICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgIHZhciB0b3RhbD1zdWJ0b3RhbCt0YXgtZGlzY291bnQ7CiAgICB2YXIgc3ViRWw9JCgnZGVuaS1pbnYtc3VidG90YWwnKTtpZihzdWJFbClzdWJFbC50ZXh0Q29udGVudD1mbXQoc3VidG90YWwsY3VyKTsKICAgIHZhciB0YXhFbD0kKCdkZW5pLWludi10YXgnKTtpZih0YXhFbCl0YXhFbC50ZXh0Q29udGVudD1mbXQodGF4LGN1cik7CiAgICB2YXIgZGlzY0VsPSQoJ2RlbmktaW52LWRpc2NvdW50LWRpc3BsYXknKTtpZihkaXNjRWwpZGlzY0VsLnRleHRDb250ZW50PSctJytmbXQoZGlzY291bnQsY3VyKTsKICAgIHZhciB0b3RFbD0kKCdkZW5pLWludi10b3RhbCcpO2lmKHRvdEVsKXRvdEVsLnRleHRDb250ZW50PWZtdCh0b3RhbCxjdXIpOwogICAgLy8gS2VlcCBjdXJyZW5jeSBzeW1ib2wgaW4gc3VtbWFyeSBpbiBzeW5jCiAgICB2YXIgc3ltRWxzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWN1ci1zeW1dJyk7CiAgICBmb3IoaT0wO2k8c3ltRWxzLmxlbmd0aDtpKyspc3ltRWxzW2ldLnRleHRDb250ZW50PXN5bTsKICB9CgogIGZ1bmN0aW9uIGFkZExpbmUoKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIGJveC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsbGluZVJvd0h0bWwodWlkKCkpKTsKICAgIHJlY29tcHV0ZSgpOwogIH0KICBmdW5jdGlvbiByZW1vdmVMaW5lKGlkKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIHZhciByb3dzPWJveC5xdWVyeVNlbGVjdG9yQWxsKCcuZGVuaS1pbnYtbGluZS1pdGVtJyk7CiAgICBpZihyb3dzLmxlbmd0aDw9MSlyZXR1cm47CiAgICB2YXIgcm93PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZW5pLWludi1saW5lLScraWQpOwogICAgaWYocm93KXJvdy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHJvdyk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIGZ1bmN0aW9uIHNob3dUb2FzdChtc2csa2luZCl7CiAgICB2YXIgdD0kKCdkZW5pLWludi10b2FzdCcpO2lmKCF0KXJldHVybjsKICAgIHQudGV4dENvbnRlbnQ9bXNnOwogICAgdC5jbGFzc05hbWU9J2RlbmktaW52LXRvYXN0IGRlbmktaW52LXRvYXN0LXNob3cnKyhraW5kPT09J3N1Y2Nlc3MnPycgZGVuaS1pbnYtdG9hc3Qtc3VjY2Vzcyc6JycpOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xhc3NOYW1lPSdkZW5pLWludi10b2FzdCc7fSwzNTAwKTsKICB9CgogIGZ1bmN0aW9uIHJlc2V0KCl7CiAgICB2YXIgZGVmcz17J2RlbmktaW52LWJ1c2luZXNzLW5hbWUnOicnLCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJzonJywnZGVuaS1pbnYtYnVzaW5lc3MtY29udGFjdCc6JycsJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCc6JycsJ2RlbmktaW52LWNsaWVudC1uYW1lJzonJywnZGVuaS1pbnYtY2xpZW50LWNvbXBhbnknOicnLCdkZW5pLWludi1jbGllbnQtYWRkcmVzcyc6JycsJ2RlbmktaW52LWNsaWVudC1jb250YWN0JzonJywnZGVuaS1pbnYtZGlzY291bnQnOicwJywnZGVuaS1pbnYtcGF5bWVudC10ZXJtcyc6IlBhdGllbnQgcG9ydGlvbiBkdWUgYXQgdGltZSBvZiBzZXJ2aWNlLiBJbnN1cmFuY2UgYmFsYW5jZSBiaWxsZWQgdG8gY2Fycmllci4iLCdkZW5pLWludi1ub3Rlcyc6Jyd9OwogICAgdmFyIGs7Zm9yKGsgaW4gZGVmcylzZXRWYWwoayxkZWZzW2tdKTsKICAgIGlmKCQoJ2RlbmktaW52LXBhdGllbnQtaWQnKSkkKCdkZW5pLWludi1wYXRpZW50LWlkJykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtZGF0ZS1vZi10cmVhdG1lbnQnKSkkKCdkZW5pLWludi1kYXRlLW9mLXRyZWF0bWVudCcpLnZhbHVlPScnO2lmKCQoJ2RlbmktaW52LXRyZWF0aW5nLWRlbnRpc3QnKSkkKCdkZW5pLWludi10cmVhdGluZy1kZW50aXN0JykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtaW5zdXJhbmNlLXBvbGljeScpKSQoJ2RlbmktaW52LWluc3VyYW5jZS1wb2xpY3knKS52YWx1ZT0nJztpZigkKCdkZW5pLWludi1wcmlvci1hdXRob3JpemF0aW9uJykpJCgnZGVuaS1pbnYtcHJpb3ItYXV0aG9yaXphdGlvbicpLnZhbHVlPScnOwogICAgdmFyIGQ9bmV3IERhdGUoKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWlzc3VlLWRhdGUnLGQudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHZhciBkdWU9bmV3IERhdGUoZC5nZXRUaW1lKCkrMzAqMjQqNjAqNjAqMTAwMCk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWR1ZS1kYXRlJyxkdWUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtY3VycmVuY3knLCdVU0QnKTsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTsKICAgIGlmKGJveCl7Ym94LmlubmVySFRNTD1saW5lUm93SHRtbCh1aWQoKSk7fQogICAgcmVjb21wdXRlKCk7CiAgfQoKICB2YXIganNQZGZQcm9taXNlPW51bGw7CiAgZnVuY3Rpb24gZW5zdXJlSnNQREYoKXsKICAgIGlmKGpzUGRmUHJvbWlzZSlyZXR1cm4ganNQZGZQcm9taXNlOwogICAganNQZGZQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXsKICAgICAgaWYod2luZG93LmpzcGRmJiZ3aW5kb3cuanNwZGYuanNQREYpcmV0dXJuIHJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTsKICAgICAgdmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgIHMuc3JjPSdodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9qc3BkZi8yLjUuMS9qc3BkZi51bWQubWluLmpzJzsKICAgICAgcy5hc3luYz10cnVlOwogICAgICBzLm9ubG9hZD1mdW5jdGlvbigpe2lmKHdpbmRvdy5qc3BkZiYmd2luZG93LmpzcGRmLmpzUERGKXJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTtlbHNlIHJlamVjdChuZXcgRXJyb3IoJ2pzUERGIG5vdCBhdmFpbGFibGUnKSk7fTsKICAgICAgcy5vbmVycm9yPWZ1bmN0aW9uKCl7cmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQganNQREYgZnJvbSBDRE4nKSk7fTsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTsKICAgIH0pOwogICAgcmV0dXJuIGpzUGRmUHJvbWlzZTsKICB9CgogIGZ1bmN0aW9uIGRvd25sb2FkKCl7CiAgICB2YXIgYnVzaW5lc3NOYW1lPXZhbCgnZGVuaS1pbnYtYnVzaW5lc3MtbmFtZScpLnRyaW0oKTsKICAgIHZhciBjbGllbnROYW1lPXZhbCgnZGVuaS1pbnYtY2xpZW50LW5hbWUnKS50cmltKCk7CiAgICBpZighYnVzaW5lc3NOYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB5b3VyIGJ1c2luZXNzIG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIGlmKCFjbGllbnROYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB0aGUgcmVjaXBpZW50IG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIHZhciBsaW5lcz1yZWFkTGluZXMoKTsKICAgIHZhciBoYXNJdGVtPWZhbHNlLGk7CiAgICBmb3IoaT0wO2k8bGluZXMubGVuZ3RoO2krKyl7aWYoKGxpbmVzW2ldLnF1YW50aXR5KmxpbmVzW2ldLnVuaXRQcmljZSk+MHx8KGxpbmVzW2ldLmRlc2NyaXB0aW9uJiZsaW5lc1tpXS5kZXNjcmlwdGlvbi5sZW5ndGg+MCkpe2hhc0l0ZW09dHJ1ZTticmVhazt9fQogICAgaWYoIWhhc0l0ZW0pe3Nob3dUb2FzdCgnUGxlYXNlIGFkZCBhdCBsZWFzdCBvbmUgbGluZSBpdGVtLicsJ2VycicpO3JldHVybjt9CiAgICBzaG93VG9hc3QoJ1ByZXBhcmluZyBQREYuLi4nLCdzdWNjZXNzJyk7CiAgICBlbnN1cmVKc1BERigpLnRoZW4oZnVuY3Rpb24oanNQREYpewogICAgICB0cnl7CiAgICAgICAgdmFyIGRvYz1uZXcganNQREYoe29yaWVudGF0aW9uOidwb3J0cmFpdCcsdW5pdDonbW0nLGZvcm1hdDonYTQnfSk7CiAgICAgICAgdmFyIGN1cj12YWwoJ2RlbmktaW52LWN1cnJlbmN5Jyl8fCdVU0QnOwogICAgICAgIHZhciBzeW09Y3VyU3ltKGN1cik7CiAgICAgICAgdmFyIHlQb3M9MjA7CgogICAgICAgIGRvYy5zZXRGb250U2l6ZSgyMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy50ZXh0KCJERU5UQUwgSU5WT0lDRSIsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTEyOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dChidXNpbmVzc05hbWUsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDkpOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgdmFyIGJpekFkZHI9dmFsKCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJyk7CiAgICAgICAgdmFyIGJpekNvbnRhY3Q9dmFsKCdkZW5pLWludi1idXNpbmVzcy1jb250YWN0Jyk7CiAgICAgICAgdmFyIGJpelRheD12YWwoJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCcpOwogICAgICAgIGlmKGJpekFkZHIpe2RvYy50ZXh0KGJpekFkZHIsMjAseVBvcyk7eVBvcys9NTt9CiAgICAgICAgaWYoYml6Q29udGFjdCl7ZG9jLnRleHQoYml6Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICBpZihiaXpUYXgpe2RvYy50ZXh0KCdUYXggSUQ6ICcrYml6VGF4LDIwLHlQb3MpO3lQb3MrPTU7fQoKICAgICAgICBkb2Muc2V0Rm9udFNpemUoOSk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dCgnSW52b2ljZSAjOiAnK3ZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInKSwxNDAsMzApOwogICAgICAgIGRvYy50ZXh0KCdJc3N1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpLDE0MCwzNik7CiAgICAgICAgZG9jLnRleHQoJ0R1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKSwxNDAsNDIpOwogICAgICAgIGRvYy50ZXh0KCdDdXJyZW5jeTogJytjdXIsMTQwLDQ4KTsKCiAgICAgICAgeVBvcz1NYXRoLm1heCh5UG9zLDYwKTsKICAgICAgICBkb2Muc2V0Rm9udFNpemUoMTApOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2MudGV4dCgiUEFUSUVOVCBERVRBSUxTIiwyMCx5UG9zKTsKICAgICAgICB5UG9zKz02OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDEyLDAsNTApOwogICAgICAgIGRvYy50ZXh0KGNsaWVudE5hbWUsMjAseVBvcyk7eVBvcys9NTsKICAgICAgICB2YXIgY2xpZW50Q29tcGFueT12YWwoJ2RlbmktaW52LWNsaWVudC1jb21wYW55Jyk7CiAgICAgICAgaWYoY2xpZW50Q29tcGFueSl7ZG9jLnRleHQoY2xpZW50Q29tcGFueSwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50QWRkcj12YWwoJ2RlbmktaW52LWNsaWVudC1hZGRyZXNzJyk7CiAgICAgICAgaWYoY2xpZW50QWRkcil7ZG9jLnRleHQoY2xpZW50QWRkciwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50Q29udGFjdD12YWwoJ2RlbmktaW52LWNsaWVudC1jb250YWN0Jyk7CiAgICAgICAgaWYoY2xpZW50Q29udGFjdCl7ZG9jLnRleHQoY2xpZW50Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KCiAgICAgICAgLy8gRXh0cmEgZmllbGRzIGJsb2NrIChpZiBjb25maWcgZGVmaW5lZCBhbnkpCiAgICAgICAgdmFyIGV4dHJhSWRzPVsicGF0aWVudC1pZCIsImRhdGUtb2YtdHJlYXRtZW50IiwidHJlYXRpbmctZGVudGlzdCIsImluc3VyYW5jZS1wb2xpY3kiLCJwcmlvci1hdXRob3JpemF0aW9uIl07CiAgICAgICAgdmFyIGV4dHJhTGFiZWxzPVsiUGF0aWVudCBJRCAvIENoYXJ0ICMiLCJEYXRlIG9mIFRyZWF0bWVudCIsIlRyZWF0aW5nIERlbnRpc3QiLCJJbnN1cmFuY2UgUG9saWN5ICMiLCJQcmUtQXV0aG9yaXphdGlvbiAjIl07CiAgICAgICAgdmFyIGFueUV4dHJhPWZhbHNlOwogICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXtpZih2YWwoJ2RlbmktaW52LScrZXh0cmFJZHNbaV0pKWFueUV4dHJhPXRydWU7fQogICAgICAgIGlmKGFueUV4dHJhKXsKICAgICAgICAgIHlQb3MrPTQ7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICAgIGRvYy50ZXh0KCdERVRBSUxTJywyMCx5UG9zKTt5UG9zKz02OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXsKICAgICAgICAgICAgdmFyIHY9dmFsKCdkZW5pLWludi0nK2V4dHJhSWRzW2ldKTsKICAgICAgICAgICAgaWYodil7ZG9jLnRleHQoZXh0cmFMYWJlbHNbaV0rJzogJyt2LDIwLHlQb3MpO3lQb3MrPTU7fQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgeVBvcys9ODsKICAgICAgICBkb2Muc2V0RmlsbENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy5yZWN0KDIwLHlQb3MsMTcwLDgsJ0YnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDI1NSwyNTUsMjU1KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSg5KTsKICAgICAgICBkb2MudGV4dCgnRGVzY3JpcHRpb24nLDIzLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnUXR5JywxMTAseVBvcys1LjUpOwogICAgICAgIGRvYy50ZXh0KCdQcmljZScsMTI3LHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVGF4JScsMTUwLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVG90YWwnLDE3MCx5UG9zKzUuNSk7CiAgICAgICAgeVBvcys9MTI7CgogICAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMTIsMCw1MCk7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIHZhciBzdWJ0b3RhbD0wLHRheEFtdD0wOwogICAgICAgIGZvcihpPTA7aTxsaW5lcy5sZW5ndGg7aSsrKXsKICAgICAgICAgIGlmKHlQb3M+MjcwKXtkb2MuYWRkUGFnZSgpO3lQb3M9MjA7fQogICAgICAgICAgdmFyIGxpbj1saW5lc1tpXTsKICAgICAgICAgIHZhciBscz1saW4ucXVhbnRpdHkqbGluLnVuaXRQcmljZTsKICAgICAgICAgIHZhciBsdD1scypsaW4udGF4UmF0ZS8xMDA7CiAgICAgICAgICBzdWJ0b3RhbCs9bHM7dGF4QW10Kz1sdDsKICAgICAgICAgIHZhciBkZXNjVHh0PShsaW4uZGVzY3JpcHRpb258fCcnKS5zbGljZSgwLDQ2KTsKICAgICAgICAgIGRvYy50ZXh0KGRlc2NUeHQsMjMseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChTdHJpbmcobGluLnF1YW50aXR5KSwxMTAseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChzeW0rbGluLnVuaXRQcmljZS50b0ZpeGVkKDIpLDEyNyx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KGxpbi50YXhSYXRlLnRvRml4ZWQoMikrJyUnLDE1MCx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KHN5bSsobHMrbHQpLnRvRml4ZWQoMiksMTcwLHlQb3MpOwogICAgICAgICAgeVBvcys9NjsKICAgICAgICB9CgogICAgICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgICAgICB2YXIgdG90YWw9c3VidG90YWwrdGF4QW10LWRpc2NvdW50OwogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgZG9jLnRleHQoJ1N1YnRvdGFsOicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bStzdWJ0b3RhbC50b0ZpeGVkKDIpLDE4OCx5UG9zLHthbGlnbjoncmlnaHQnfSk7CiAgICAgICAgeVBvcys9NjsKICAgICAgICBkb2MudGV4dCgnVGF4OicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bSt0YXhBbXQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIGlmKGRpc2NvdW50PjApewogICAgICAgICAgeVBvcys9NjsKICAgICAgICAgIGRvYy50ZXh0KCdEaXNjb3VudDonLDEzNSx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KCctJytzeW0rZGlzY291bnQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIH0KICAgICAgICB5UG9zKz04OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDEzKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy50ZXh0KCdUb3RhbDonLDEzNSx5UG9zKTsKICAgICAgICBkb2MudGV4dChzeW0rdG90YWwudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwoKICAgICAgICB2YXIgcHRlcm1zPXZhbCgnZGVuaS1pbnYtcGF5bWVudC10ZXJtcycpOwogICAgICAgIGlmKHB0ZXJtcyl7CiAgICAgICAgICB5UG9zKz0xNDsKICAgICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdQYXltZW50IFRlcm1zJywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPTU7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnbm9ybWFsJyk7CiAgICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgICB2YXIgcHRMaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKHB0ZXJtcywxNzApOwogICAgICAgICAgZG9jLnRleHQocHRMaW5lcywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPXB0TGluZXMubGVuZ3RoKjU7CiAgICAgICAgfQoKICAgICAgICB2YXIgbm90ZXNWYWw9dmFsKCdkZW5pLWludi1ub3RlcycpOwogICAgICAgIGlmKG5vdGVzVmFsKXsKICAgICAgICAgIHlQb3MrPTY7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdOb3RlcycsMjAseVBvcyk7CiAgICAgICAgICB5UG9zKz01OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcig5MCw4NSwxMTIpOwogICAgICAgICAgdmFyIG5MaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKG5vdGVzVmFsLDE3MCk7CiAgICAgICAgICBkb2MudGV4dChuTGluZXMsMjAseVBvcyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZm5hbWU9dmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpfHwnaW52b2ljZSc7CiAgICAgICAgZG9jLnNhdmUoJ0ludm9pY2VfJytmbmFtZSsnLnBkZicpOwogICAgICAgIHNob3dUb2FzdCgnUERGIGRvd25sb2FkZWQuJywnc3VjY2VzcycpOwogICAgICB9Y2F0Y2goZXJyKXsKICAgICAgICBzaG93VG9hc3QoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBQREY6ICcrKGVyciYmZXJyLm1lc3NhZ2U\/ZXJyLm1lc3NhZ2U6ZXJyKSwnZXJyJyk7CiAgICAgIH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycil7CiAgICAgIHNob3dUb2FzdCgnQ291bGQgbm90IGxvYWQgUERGIGxpYnJhcnk6ICcrZXJyLm1lc3NhZ2UsJ2VycicpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzY3JvbGwoKXt2YXIgdD0kKCdkZW5pLWludi1nZW5lcmF0b3InKTtpZih0JiZ0LnNjcm9sbEludG9WaWV3KXQuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnLGJsb2NrOidzdGFydCd9KTt9CgogIGZ1bmN0aW9uIGJvb3QoKXsKICAgIGlmKGJvb3RlZClyZXR1cm47Ym9vdGVkPXRydWU7CiAgICAvLyBXaXJlIGdlbmVyaWMgaW5wdXQgbGlzdGVuZXJzIHRvIGtlZXAgdG90YWxzIGxpdmUKICAgIHZhciBpbnB1dHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2RlbmktaW52LWdlbmVyYXRvciBpbnB1dCwgI2RlbmktaW52LWdlbmVyYXRvciBzZWxlY3QnKTsKICAgIHZhciBpO2ZvcihpPTA7aTxpbnB1dHMubGVuZ3RoO2krKyl7aW5wdXRzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JyxyZWNvbXB1dGUpO2lucHV0c1tpXS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLHJlY29tcHV0ZSk7fQogICAgLy8gU2VlZCBpbnZvaWNlIG51bWJlciArIGRhdGVzIGlmIGJsYW5rIChoYW5kbGVzIGZyZXNoIHBhZ2UgbG9hZCkKICAgIHZhciBkPW5ldyBEYXRlKCk7CiAgICBpZighdmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpKXNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBpZighdmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpc2V0VmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJyxkLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICBpZighdmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKXNldFZhbCgnZGVuaS1pbnYtZHVlLWRhdGUnLG5ldyBEYXRlKGQuZ2V0VGltZSgpKzMwKjI0KjYwKjYwKjEwMDApLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIHdpbmRvdy5hc2NJbnY9d2luZG93LmFzY0ludnx8ewogICAgYm9vdDpib290LGFkZExpbmU6YWRkTGluZSxyZW1vdmVMaW5lOnJlbW92ZUxpbmUscmVjb21wdXRlOnJlY29tcHV0ZSwKICAgIGRvd25sb2FkOmRvd25sb2FkLHJlc2V0OnJlc2V0LHNjcm9sbDpzY3JvbGwKICB9OwogIGJvb3QoKTsKfSkoKTs=')))();}window.deniInv&#038;&#038;window.deniInv.recompute&#038;&#038;window.deniInv.recompute();this.remove&amp;&amp;this.remove();\"><div class=\"deni-inv-hero\"><h1>Free Dental Invoice Template &amp; Generator<\/h1><div class=\"deni-inv-hero-desc\">Dental practices must handle routine checkups, specialized treatments, and follow-up procedures, all while keeping patient billing clear and accurate. A professional dental invoice ensures patients understand charges for services, insurance adjustments, and out-of-pocket costs. With our free dental invoice template and generator, you can quickly create clear, professional PDF invoices with automated calculations and instant download, ready to send to patients or insurance providers.<\/div><a href=\"#deni-inv-generator\" class=\"deni-inv-hero-cta\" onclick=\"if(!window.deniInvBooted){window.deniInvBooted=1;(new Function(atob('KGZ1bmN0aW9uKCl7CiAgdmFyIGJvb3RlZD1mYWxzZTsKICBmdW5jdGlvbiAkKGlkKXtyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO30KICBmdW5jdGlvbiB2YWwoaWQpe3ZhciBlbD0kKGlkKTtyZXR1cm4gZWw\/ZWwudmFsdWU6Jyc7fQogIGZ1bmN0aW9uIHNldFZhbChpZCx2KXt2YXIgZWw9JChpZCk7aWYoZWwpZWwudmFsdWU9djt9CiAgZnVuY3Rpb24gbnVtKHYpe3ZhciBuPXBhcnNlRmxvYXQodik7cmV0dXJuIGlzRmluaXRlKG4pP246MDt9CiAgZnVuY3Rpb24gZm10KG4sY3VyKXtjdXI9Y3VyfHwnVVNEJzt0cnl7cmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCgnZW4tVVMnLHtzdHlsZTonY3VycmVuY3knLGN1cnJlbmN5OmN1cixtaW5pbXVtRnJhY3Rpb25EaWdpdHM6Mn0pLmZvcm1hdChOdW1iZXIobil8fDApO31jYXRjaChfKXtyZXR1cm4gJyQnKygoTnVtYmVyKG4pfHwwKS50b0ZpeGVkKDIpKTt9fQogIGZ1bmN0aW9uIGN1clN5bShjKXt2YXIgbT17VVNEOickJyxFVVI6J+KCrCcsR0JQOifCoycsSU5SOifigrknLEFVRDonQSQnLENBRDonQyQnfTtyZXR1cm4gbVtjXXx8JyQnO30KICBmdW5jdGlvbiBmbXREYXRlKHMpe2lmKCFzKXJldHVybiAnJzt0cnl7dmFyIGQ9bmV3IERhdGUocyk7aWYoaXNOYU4oZCkpcmV0dXJuIHM7cmV0dXJuIGQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycse3llYXI6J251bWVyaWMnLG1vbnRoOidzaG9ydCcsZGF5OidudW1lcmljJ30pO31jYXRjaChfKXtyZXR1cm4gczt9fQogIGZ1bmN0aW9uIHVpZCgpe3JldHVybiAnbGknK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxZTkpLnRvU3RyaW5nKDM2KTt9CgogIGZ1bmN0aW9uIGxpbmVSb3dIdG1sKGlkKXsKICAgIHJldHVybiAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1pdGVtIiBkYXRhLWxpbmUtaWQ9IicraWQrJyIgaWQ9ImRlbmktaW52LWxpbmUtJytpZCsnIj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkIj48c3BhbiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkLWxhYmVsIj5MaW5lIEl0ZW08L3NwYW4+JysKICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJkZW5pLWludi1saW5lLXJlbW92ZSIgYXJpYS1sYWJlbD0iUmVtb3ZlIiBvbmNsaWNrPSJ3aW5kb3cuYXNjSW52JiZ3aW5kb3cuYXNjSW52LnJlbW92ZUxpbmUoXCcnK2lkKydcJykiPlx1MDBENzwvYnV0dG9uPicrCiAgICAgICc8L2Rpdj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1ncmlkIj4nKwogICAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1maWVsZCI+PGxhYmVsPkRlc2NyaXB0aW9uPC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgZGF0YS1saW5lLWZpZWxkPSJkZXNjcmlwdGlvbiIgcGxhY2Vob2xkZXI9IlNlcnZpY2Ugb3IgcHJvZHVjdCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLWdyaWQtMyI+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5RdWFudGl0eTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBzdGVwPSIwLjAxIiBkYXRhLWxpbmUtZmllbGQ9InF1YW50aXR5IiB2YWx1ZT0iMSIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5Vbml0IFByaWNlPC9sYWJlbD48aW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49IjAiIHN0ZXA9IjAuMDEiIGRhdGEtbGluZS1maWVsZD0idW5pdFByaWNlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5UYXggJTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9IjEwMCIgc3RlcD0iMC4wMSIgZGF0YS1saW5lLWZpZWxkPSJ0YXhSYXRlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLXRvdGFsIj48c3Bhbj5MaW5lIFRvdGFsPC9zcGFuPjxzdHJvbmcgZGF0YS1saW5lLXRvdGFsPiQwLjAwPC9zdHJvbmc+PC9kaXY+JysKICAgICc8L2Rpdj4nOwogIH0KCiAgZnVuY3Rpb24gcmVhZExpbmVzKCl7CiAgICB2YXIgcm93cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZGVuaS1pbnYtbGluZXMgLmRlbmktaW52LWxpbmUtaXRlbScpOwogICAgdmFyIGFycj1bXSxpLHJvdyxkZXNjLHF0eSxwcmljZSx0YXg7CiAgICBmb3IoaT0wO2k8cm93cy5sZW5ndGg7aSsrKXsKICAgICAgcm93PXJvd3NbaV07CiAgICAgIGRlc2M9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9ImRlc2NyaXB0aW9uIl0nKTsKICAgICAgcXR5PXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJxdWFudGl0eSJdJyk7CiAgICAgIHByaWNlPXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJ1bml0UHJpY2UiXScpOwogICAgICB0YXg9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9InRheFJhdGUiXScpOwogICAgICBhcnIucHVzaCh7CiAgICAgICAgZWw6cm93LAogICAgICAgIGRlc2NyaXB0aW9uOmRlc2M\/ZGVzYy52YWx1ZTonJywKICAgICAgICBxdWFudGl0eTpudW0ocXR5JiZxdHkudmFsdWUpLAogICAgICAgIHVuaXRQcmljZTpudW0ocHJpY2UmJnByaWNlLnZhbHVlKSwKICAgICAgICB0YXhSYXRlOm51bSh0YXgmJnRheC52YWx1ZSkKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gYXJyOwogIH0KCiAgZnVuY3Rpb24gcmVjb21wdXRlKCl7CiAgICB2YXIgY3VyPXZhbCgnZGVuaS1pbnYtY3VycmVuY3knKXx8J1VTRCc7CiAgICB2YXIgc3ltPWN1clN5bShjdXIpOwogICAgdmFyIGxpbmVzPXJlYWRMaW5lcygpOwogICAgdmFyIHN1YnRvdGFsPTAsdGF4PTAsaSxsaW5lLGxpbmVTdWIsbGluZVRheCx0b3RhbEVsOwogICAgZm9yKGk9MDtpPGxpbmVzLmxlbmd0aDtpKyspewogICAgICBsaW5lPWxpbmVzW2ldOwogICAgICBsaW5lU3ViPWxpbmUucXVhbnRpdHkqbGluZS51bml0UHJpY2U7CiAgICAgIGxpbmVUYXg9bGluZVN1YipsaW5lLnRheFJhdGUvMTAwOwogICAgICBzdWJ0b3RhbCs9bGluZVN1YjsKICAgICAgdGF4Kz1saW5lVGF4OwogICAgICB0b3RhbEVsPWxpbmUuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbGluZS10b3RhbF0nKTsKICAgICAgaWYodG90YWxFbCl0b3RhbEVsLnRleHRDb250ZW50PWZtdChsaW5lU3ViK2xpbmVUYXgsY3VyKTsKICAgIH0KICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgIHZhciB0b3RhbD1zdWJ0b3RhbCt0YXgtZGlzY291bnQ7CiAgICB2YXIgc3ViRWw9JCgnZGVuaS1pbnYtc3VidG90YWwnKTtpZihzdWJFbClzdWJFbC50ZXh0Q29udGVudD1mbXQoc3VidG90YWwsY3VyKTsKICAgIHZhciB0YXhFbD0kKCdkZW5pLWludi10YXgnKTtpZih0YXhFbCl0YXhFbC50ZXh0Q29udGVudD1mbXQodGF4LGN1cik7CiAgICB2YXIgZGlzY0VsPSQoJ2RlbmktaW52LWRpc2NvdW50LWRpc3BsYXknKTtpZihkaXNjRWwpZGlzY0VsLnRleHRDb250ZW50PSctJytmbXQoZGlzY291bnQsY3VyKTsKICAgIHZhciB0b3RFbD0kKCdkZW5pLWludi10b3RhbCcpO2lmKHRvdEVsKXRvdEVsLnRleHRDb250ZW50PWZtdCh0b3RhbCxjdXIpOwogICAgLy8gS2VlcCBjdXJyZW5jeSBzeW1ib2wgaW4gc3VtbWFyeSBpbiBzeW5jCiAgICB2YXIgc3ltRWxzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWN1ci1zeW1dJyk7CiAgICBmb3IoaT0wO2k8c3ltRWxzLmxlbmd0aDtpKyspc3ltRWxzW2ldLnRleHRDb250ZW50PXN5bTsKICB9CgogIGZ1bmN0aW9uIGFkZExpbmUoKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIGJveC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsbGluZVJvd0h0bWwodWlkKCkpKTsKICAgIHJlY29tcHV0ZSgpOwogIH0KICBmdW5jdGlvbiByZW1vdmVMaW5lKGlkKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIHZhciByb3dzPWJveC5xdWVyeVNlbGVjdG9yQWxsKCcuZGVuaS1pbnYtbGluZS1pdGVtJyk7CiAgICBpZihyb3dzLmxlbmd0aDw9MSlyZXR1cm47CiAgICB2YXIgcm93PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZW5pLWludi1saW5lLScraWQpOwogICAgaWYocm93KXJvdy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHJvdyk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIGZ1bmN0aW9uIHNob3dUb2FzdChtc2csa2luZCl7CiAgICB2YXIgdD0kKCdkZW5pLWludi10b2FzdCcpO2lmKCF0KXJldHVybjsKICAgIHQudGV4dENvbnRlbnQ9bXNnOwogICAgdC5jbGFzc05hbWU9J2RlbmktaW52LXRvYXN0IGRlbmktaW52LXRvYXN0LXNob3cnKyhraW5kPT09J3N1Y2Nlc3MnPycgZGVuaS1pbnYtdG9hc3Qtc3VjY2Vzcyc6JycpOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xhc3NOYW1lPSdkZW5pLWludi10b2FzdCc7fSwzNTAwKTsKICB9CgogIGZ1bmN0aW9uIHJlc2V0KCl7CiAgICB2YXIgZGVmcz17J2RlbmktaW52LWJ1c2luZXNzLW5hbWUnOicnLCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJzonJywnZGVuaS1pbnYtYnVzaW5lc3MtY29udGFjdCc6JycsJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCc6JycsJ2RlbmktaW52LWNsaWVudC1uYW1lJzonJywnZGVuaS1pbnYtY2xpZW50LWNvbXBhbnknOicnLCdkZW5pLWludi1jbGllbnQtYWRkcmVzcyc6JycsJ2RlbmktaW52LWNsaWVudC1jb250YWN0JzonJywnZGVuaS1pbnYtZGlzY291bnQnOicwJywnZGVuaS1pbnYtcGF5bWVudC10ZXJtcyc6IlBhdGllbnQgcG9ydGlvbiBkdWUgYXQgdGltZSBvZiBzZXJ2aWNlLiBJbnN1cmFuY2UgYmFsYW5jZSBiaWxsZWQgdG8gY2Fycmllci4iLCdkZW5pLWludi1ub3Rlcyc6Jyd9OwogICAgdmFyIGs7Zm9yKGsgaW4gZGVmcylzZXRWYWwoayxkZWZzW2tdKTsKICAgIGlmKCQoJ2RlbmktaW52LXBhdGllbnQtaWQnKSkkKCdkZW5pLWludi1wYXRpZW50LWlkJykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtZGF0ZS1vZi10cmVhdG1lbnQnKSkkKCdkZW5pLWludi1kYXRlLW9mLXRyZWF0bWVudCcpLnZhbHVlPScnO2lmKCQoJ2RlbmktaW52LXRyZWF0aW5nLWRlbnRpc3QnKSkkKCdkZW5pLWludi10cmVhdGluZy1kZW50aXN0JykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtaW5zdXJhbmNlLXBvbGljeScpKSQoJ2RlbmktaW52LWluc3VyYW5jZS1wb2xpY3knKS52YWx1ZT0nJztpZigkKCdkZW5pLWludi1wcmlvci1hdXRob3JpemF0aW9uJykpJCgnZGVuaS1pbnYtcHJpb3ItYXV0aG9yaXphdGlvbicpLnZhbHVlPScnOwogICAgdmFyIGQ9bmV3IERhdGUoKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWlzc3VlLWRhdGUnLGQudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHZhciBkdWU9bmV3IERhdGUoZC5nZXRUaW1lKCkrMzAqMjQqNjAqNjAqMTAwMCk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWR1ZS1kYXRlJyxkdWUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtY3VycmVuY3knLCdVU0QnKTsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTsKICAgIGlmKGJveCl7Ym94LmlubmVySFRNTD1saW5lUm93SHRtbCh1aWQoKSk7fQogICAgcmVjb21wdXRlKCk7CiAgfQoKICB2YXIganNQZGZQcm9taXNlPW51bGw7CiAgZnVuY3Rpb24gZW5zdXJlSnNQREYoKXsKICAgIGlmKGpzUGRmUHJvbWlzZSlyZXR1cm4ganNQZGZQcm9taXNlOwogICAganNQZGZQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXsKICAgICAgaWYod2luZG93LmpzcGRmJiZ3aW5kb3cuanNwZGYuanNQREYpcmV0dXJuIHJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTsKICAgICAgdmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgIHMuc3JjPSdodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9qc3BkZi8yLjUuMS9qc3BkZi51bWQubWluLmpzJzsKICAgICAgcy5hc3luYz10cnVlOwogICAgICBzLm9ubG9hZD1mdW5jdGlvbigpe2lmKHdpbmRvdy5qc3BkZiYmd2luZG93LmpzcGRmLmpzUERGKXJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTtlbHNlIHJlamVjdChuZXcgRXJyb3IoJ2pzUERGIG5vdCBhdmFpbGFibGUnKSk7fTsKICAgICAgcy5vbmVycm9yPWZ1bmN0aW9uKCl7cmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQganNQREYgZnJvbSBDRE4nKSk7fTsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTsKICAgIH0pOwogICAgcmV0dXJuIGpzUGRmUHJvbWlzZTsKICB9CgogIGZ1bmN0aW9uIGRvd25sb2FkKCl7CiAgICB2YXIgYnVzaW5lc3NOYW1lPXZhbCgnZGVuaS1pbnYtYnVzaW5lc3MtbmFtZScpLnRyaW0oKTsKICAgIHZhciBjbGllbnROYW1lPXZhbCgnZGVuaS1pbnYtY2xpZW50LW5hbWUnKS50cmltKCk7CiAgICBpZighYnVzaW5lc3NOYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB5b3VyIGJ1c2luZXNzIG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIGlmKCFjbGllbnROYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB0aGUgcmVjaXBpZW50IG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIHZhciBsaW5lcz1yZWFkTGluZXMoKTsKICAgIHZhciBoYXNJdGVtPWZhbHNlLGk7CiAgICBmb3IoaT0wO2k8bGluZXMubGVuZ3RoO2krKyl7aWYoKGxpbmVzW2ldLnF1YW50aXR5KmxpbmVzW2ldLnVuaXRQcmljZSk+MHx8KGxpbmVzW2ldLmRlc2NyaXB0aW9uJiZsaW5lc1tpXS5kZXNjcmlwdGlvbi5sZW5ndGg+MCkpe2hhc0l0ZW09dHJ1ZTticmVhazt9fQogICAgaWYoIWhhc0l0ZW0pe3Nob3dUb2FzdCgnUGxlYXNlIGFkZCBhdCBsZWFzdCBvbmUgbGluZSBpdGVtLicsJ2VycicpO3JldHVybjt9CiAgICBzaG93VG9hc3QoJ1ByZXBhcmluZyBQREYuLi4nLCdzdWNjZXNzJyk7CiAgICBlbnN1cmVKc1BERigpLnRoZW4oZnVuY3Rpb24oanNQREYpewogICAgICB0cnl7CiAgICAgICAgdmFyIGRvYz1uZXcganNQREYoe29yaWVudGF0aW9uOidwb3J0cmFpdCcsdW5pdDonbW0nLGZvcm1hdDonYTQnfSk7CiAgICAgICAgdmFyIGN1cj12YWwoJ2RlbmktaW52LWN1cnJlbmN5Jyl8fCdVU0QnOwogICAgICAgIHZhciBzeW09Y3VyU3ltKGN1cik7CiAgICAgICAgdmFyIHlQb3M9MjA7CgogICAgICAgIGRvYy5zZXRGb250U2l6ZSgyMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy50ZXh0KCJERU5UQUwgSU5WT0lDRSIsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTEyOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dChidXNpbmVzc05hbWUsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDkpOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgdmFyIGJpekFkZHI9dmFsKCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJyk7CiAgICAgICAgdmFyIGJpekNvbnRhY3Q9dmFsKCdkZW5pLWludi1idXNpbmVzcy1jb250YWN0Jyk7CiAgICAgICAgdmFyIGJpelRheD12YWwoJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCcpOwogICAgICAgIGlmKGJpekFkZHIpe2RvYy50ZXh0KGJpekFkZHIsMjAseVBvcyk7eVBvcys9NTt9CiAgICAgICAgaWYoYml6Q29udGFjdCl7ZG9jLnRleHQoYml6Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICBpZihiaXpUYXgpe2RvYy50ZXh0KCdUYXggSUQ6ICcrYml6VGF4LDIwLHlQb3MpO3lQb3MrPTU7fQoKICAgICAgICBkb2Muc2V0Rm9udFNpemUoOSk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dCgnSW52b2ljZSAjOiAnK3ZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInKSwxNDAsMzApOwogICAgICAgIGRvYy50ZXh0KCdJc3N1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpLDE0MCwzNik7CiAgICAgICAgZG9jLnRleHQoJ0R1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKSwxNDAsNDIpOwogICAgICAgIGRvYy50ZXh0KCdDdXJyZW5jeTogJytjdXIsMTQwLDQ4KTsKCiAgICAgICAgeVBvcz1NYXRoLm1heCh5UG9zLDYwKTsKICAgICAgICBkb2Muc2V0Rm9udFNpemUoMTApOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2MudGV4dCgiUEFUSUVOVCBERVRBSUxTIiwyMCx5UG9zKTsKICAgICAgICB5UG9zKz02OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDEyLDAsNTApOwogICAgICAgIGRvYy50ZXh0KGNsaWVudE5hbWUsMjAseVBvcyk7eVBvcys9NTsKICAgICAgICB2YXIgY2xpZW50Q29tcGFueT12YWwoJ2RlbmktaW52LWNsaWVudC1jb21wYW55Jyk7CiAgICAgICAgaWYoY2xpZW50Q29tcGFueSl7ZG9jLnRleHQoY2xpZW50Q29tcGFueSwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50QWRkcj12YWwoJ2RlbmktaW52LWNsaWVudC1hZGRyZXNzJyk7CiAgICAgICAgaWYoY2xpZW50QWRkcil7ZG9jLnRleHQoY2xpZW50QWRkciwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50Q29udGFjdD12YWwoJ2RlbmktaW52LWNsaWVudC1jb250YWN0Jyk7CiAgICAgICAgaWYoY2xpZW50Q29udGFjdCl7ZG9jLnRleHQoY2xpZW50Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KCiAgICAgICAgLy8gRXh0cmEgZmllbGRzIGJsb2NrIChpZiBjb25maWcgZGVmaW5lZCBhbnkpCiAgICAgICAgdmFyIGV4dHJhSWRzPVsicGF0aWVudC1pZCIsImRhdGUtb2YtdHJlYXRtZW50IiwidHJlYXRpbmctZGVudGlzdCIsImluc3VyYW5jZS1wb2xpY3kiLCJwcmlvci1hdXRob3JpemF0aW9uIl07CiAgICAgICAgdmFyIGV4dHJhTGFiZWxzPVsiUGF0aWVudCBJRCAvIENoYXJ0ICMiLCJEYXRlIG9mIFRyZWF0bWVudCIsIlRyZWF0aW5nIERlbnRpc3QiLCJJbnN1cmFuY2UgUG9saWN5ICMiLCJQcmUtQXV0aG9yaXphdGlvbiAjIl07CiAgICAgICAgdmFyIGFueUV4dHJhPWZhbHNlOwogICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXtpZih2YWwoJ2RlbmktaW52LScrZXh0cmFJZHNbaV0pKWFueUV4dHJhPXRydWU7fQogICAgICAgIGlmKGFueUV4dHJhKXsKICAgICAgICAgIHlQb3MrPTQ7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICAgIGRvYy50ZXh0KCdERVRBSUxTJywyMCx5UG9zKTt5UG9zKz02OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXsKICAgICAgICAgICAgdmFyIHY9dmFsKCdkZW5pLWludi0nK2V4dHJhSWRzW2ldKTsKICAgICAgICAgICAgaWYodil7ZG9jLnRleHQoZXh0cmFMYWJlbHNbaV0rJzogJyt2LDIwLHlQb3MpO3lQb3MrPTU7fQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgeVBvcys9ODsKICAgICAgICBkb2Muc2V0RmlsbENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy5yZWN0KDIwLHlQb3MsMTcwLDgsJ0YnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDI1NSwyNTUsMjU1KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSg5KTsKICAgICAgICBkb2MudGV4dCgnRGVzY3JpcHRpb24nLDIzLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnUXR5JywxMTAseVBvcys1LjUpOwogICAgICAgIGRvYy50ZXh0KCdQcmljZScsMTI3LHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVGF4JScsMTUwLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVG90YWwnLDE3MCx5UG9zKzUuNSk7CiAgICAgICAgeVBvcys9MTI7CgogICAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMTIsMCw1MCk7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIHZhciBzdWJ0b3RhbD0wLHRheEFtdD0wOwogICAgICAgIGZvcihpPTA7aTxsaW5lcy5sZW5ndGg7aSsrKXsKICAgICAgICAgIGlmKHlQb3M+MjcwKXtkb2MuYWRkUGFnZSgpO3lQb3M9MjA7fQogICAgICAgICAgdmFyIGxpbj1saW5lc1tpXTsKICAgICAgICAgIHZhciBscz1saW4ucXVhbnRpdHkqbGluLnVuaXRQcmljZTsKICAgICAgICAgIHZhciBsdD1scypsaW4udGF4UmF0ZS8xMDA7CiAgICAgICAgICBzdWJ0b3RhbCs9bHM7dGF4QW10Kz1sdDsKICAgICAgICAgIHZhciBkZXNjVHh0PShsaW4uZGVzY3JpcHRpb258fCcnKS5zbGljZSgwLDQ2KTsKICAgICAgICAgIGRvYy50ZXh0KGRlc2NUeHQsMjMseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChTdHJpbmcobGluLnF1YW50aXR5KSwxMTAseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChzeW0rbGluLnVuaXRQcmljZS50b0ZpeGVkKDIpLDEyNyx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KGxpbi50YXhSYXRlLnRvRml4ZWQoMikrJyUnLDE1MCx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KHN5bSsobHMrbHQpLnRvRml4ZWQoMiksMTcwLHlQb3MpOwogICAgICAgICAgeVBvcys9NjsKICAgICAgICB9CgogICAgICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgICAgICB2YXIgdG90YWw9c3VidG90YWwrdGF4QW10LWRpc2NvdW50OwogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgZG9jLnRleHQoJ1N1YnRvdGFsOicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bStzdWJ0b3RhbC50b0ZpeGVkKDIpLDE4OCx5UG9zLHthbGlnbjoncmlnaHQnfSk7CiAgICAgICAgeVBvcys9NjsKICAgICAgICBkb2MudGV4dCgnVGF4OicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bSt0YXhBbXQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIGlmKGRpc2NvdW50PjApewogICAgICAgICAgeVBvcys9NjsKICAgICAgICAgIGRvYy50ZXh0KCdEaXNjb3VudDonLDEzNSx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KCctJytzeW0rZGlzY291bnQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIH0KICAgICAgICB5UG9zKz04OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDEzKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy50ZXh0KCdUb3RhbDonLDEzNSx5UG9zKTsKICAgICAgICBkb2MudGV4dChzeW0rdG90YWwudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwoKICAgICAgICB2YXIgcHRlcm1zPXZhbCgnZGVuaS1pbnYtcGF5bWVudC10ZXJtcycpOwogICAgICAgIGlmKHB0ZXJtcyl7CiAgICAgICAgICB5UG9zKz0xNDsKICAgICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdQYXltZW50IFRlcm1zJywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPTU7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnbm9ybWFsJyk7CiAgICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgICB2YXIgcHRMaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKHB0ZXJtcywxNzApOwogICAgICAgICAgZG9jLnRleHQocHRMaW5lcywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPXB0TGluZXMubGVuZ3RoKjU7CiAgICAgICAgfQoKICAgICAgICB2YXIgbm90ZXNWYWw9dmFsKCdkZW5pLWludi1ub3RlcycpOwogICAgICAgIGlmKG5vdGVzVmFsKXsKICAgICAgICAgIHlQb3MrPTY7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdOb3RlcycsMjAseVBvcyk7CiAgICAgICAgICB5UG9zKz01OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcig5MCw4NSwxMTIpOwogICAgICAgICAgdmFyIG5MaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKG5vdGVzVmFsLDE3MCk7CiAgICAgICAgICBkb2MudGV4dChuTGluZXMsMjAseVBvcyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZm5hbWU9dmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpfHwnaW52b2ljZSc7CiAgICAgICAgZG9jLnNhdmUoJ0ludm9pY2VfJytmbmFtZSsnLnBkZicpOwogICAgICAgIHNob3dUb2FzdCgnUERGIGRvd25sb2FkZWQuJywnc3VjY2VzcycpOwogICAgICB9Y2F0Y2goZXJyKXsKICAgICAgICBzaG93VG9hc3QoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBQREY6ICcrKGVyciYmZXJyLm1lc3NhZ2U\/ZXJyLm1lc3NhZ2U6ZXJyKSwnZXJyJyk7CiAgICAgIH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycil7CiAgICAgIHNob3dUb2FzdCgnQ291bGQgbm90IGxvYWQgUERGIGxpYnJhcnk6ICcrZXJyLm1lc3NhZ2UsJ2VycicpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzY3JvbGwoKXt2YXIgdD0kKCdkZW5pLWludi1nZW5lcmF0b3InKTtpZih0JiZ0LnNjcm9sbEludG9WaWV3KXQuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnLGJsb2NrOidzdGFydCd9KTt9CgogIGZ1bmN0aW9uIGJvb3QoKXsKICAgIGlmKGJvb3RlZClyZXR1cm47Ym9vdGVkPXRydWU7CiAgICAvLyBXaXJlIGdlbmVyaWMgaW5wdXQgbGlzdGVuZXJzIHRvIGtlZXAgdG90YWxzIGxpdmUKICAgIHZhciBpbnB1dHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2RlbmktaW52LWdlbmVyYXRvciBpbnB1dCwgI2RlbmktaW52LWdlbmVyYXRvciBzZWxlY3QnKTsKICAgIHZhciBpO2ZvcihpPTA7aTxpbnB1dHMubGVuZ3RoO2krKyl7aW5wdXRzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JyxyZWNvbXB1dGUpO2lucHV0c1tpXS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLHJlY29tcHV0ZSk7fQogICAgLy8gU2VlZCBpbnZvaWNlIG51bWJlciArIGRhdGVzIGlmIGJsYW5rIChoYW5kbGVzIGZyZXNoIHBhZ2UgbG9hZCkKICAgIHZhciBkPW5ldyBEYXRlKCk7CiAgICBpZighdmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpKXNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBpZighdmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpc2V0VmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJyxkLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICBpZighdmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKXNldFZhbCgnZGVuaS1pbnYtZHVlLWRhdGUnLG5ldyBEYXRlKGQuZ2V0VGltZSgpKzMwKjI0KjYwKjYwKjEwMDApLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIHdpbmRvdy5hc2NJbnY9d2luZG93LmFzY0ludnx8ewogICAgYm9vdDpib290LGFkZExpbmU6YWRkTGluZSxyZW1vdmVMaW5lOnJlbW92ZUxpbmUscmVjb21wdXRlOnJlY29tcHV0ZSwKICAgIGRvd25sb2FkOmRvd25sb2FkLHJlc2V0OnJlc2V0LHNjcm9sbDpzY3JvbGwKICB9OwogIGJvb3QoKTsKfSkoKTs=')))();}window.deniInv&#038;&#038;window.deniInv.scroll&#038;&#038;window.deniInv.scroll();return false;\">Build my dental invoice <span class=\"deni-inv-hero-cta-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><\/div><div class=\"deni-inv-section\" id=\"deni-inv-generator\" style=\"padding:0 !important;background:transparent !important;margin:0 0 40px !important\">\n<div id=\"deni-inv-toast\" class=\"deni-inv-toast\" role=\"status\" aria-live=\"polite\"><\/div>\n<div class=\"deni-inv-grid\">\n<div>\n<div class=\"deni-inv-card\">\n<div class=\"deni-inv-card-head\"><h3>Dental Practice Details<\/h3><\/div>\n<div class=\"deni-inv-card-body\">\n<div class=\"deni-inv-field\"><label for=\"deni-inv-business-name\">Practice Name *<\/label><input type=\"text\" id=\"deni-inv-business-name\" placeholder=\"Your Company Inc.\"><\/div>\n<div class=\"deni-inv-field\"><label for=\"deni-inv-business-address\">Address<\/label><input type=\"text\" id=\"deni-inv-business-address\" placeholder=\"123 Business St, City, Country\"><\/div>\n<div class=\"deni-inv-field\"><label for=\"deni-inv-business-contact\">Contact<\/label><input type=\"text\" id=\"deni-inv-business-contact\" placeholder=\"contact@company.com | +1 234 567 890\"><\/div>\n<div class=\"deni-inv-field\"><label for=\"deni-inv-business-tax-id\">Tax ID \/ Registration #<\/label><input type=\"text\" id=\"deni-inv-business-tax-id\" placeholder=\"EIN, GST, VAT, etc. (optional)\"><\/div>\n<\/div>\n<\/div>\n<div class=\"deni-inv-card\">\n<div class=\"deni-inv-card-head\"><h3>Patient Details<\/h3><\/div>\n<div class=\"deni-inv-card-body\">\n<div class=\"deni-inv-field\"><label for=\"deni-inv-client-name\">Patient Name *<\/label><input type=\"text\" id=\"deni-inv-client-name\" placeholder=\"Recipient name\"><\/div>\n<div class=\"deni-inv-field\"><label for=\"deni-inv-client-company\">Dental Insurance Provider<\/label><input type=\"text\" id=\"deni-inv-client-company\" placeholder=\"e.g. Delta Dental PPO\"><\/div>\n<div class=\"deni-inv-field\"><label for=\"deni-inv-client-address\">Address<\/label><input type=\"text\" id=\"deni-inv-client-address\" placeholder=\"456 Client Ave, City, Country\"><\/div>\n<div class=\"deni-inv-field\"><label for=\"deni-inv-client-contact\">Contact<\/label><input type=\"text\" id=\"deni-inv-client-contact\" placeholder=\"client@email.com | +1 987 654 321\"><\/div>\n<\/div>\n<\/div>\n<div class=\"deni-inv-card\">\n<div class=\"deni-inv-card-head\"><h3>Invoice Information<\/h3><\/div>\n<div class=\"deni-inv-card-body\">\n<div class=\"deni-inv-field\"><label for=\"deni-inv-invoice-number\">Invoice Number<\/label><input type=\"text\" id=\"deni-inv-invoice-number\" placeholder=\"INV-000001\"><\/div>\n<div class=\"deni-inv-field-row\">\n<div class=\"deni-inv-field\"><label for=\"deni-inv-issue-date\">Issue Date<\/label><input type=\"date\" id=\"deni-inv-issue-date\"><\/div>\n<div class=\"deni-inv-field\"><label for=\"deni-inv-due-date\">Due Date<\/label><input type=\"date\" id=\"deni-inv-due-date\"><\/div>\n<\/div>\n<div class=\"deni-inv-field\"><label for=\"deni-inv-currency\">Currency<\/label><select id=\"deni-inv-currency\"><option value=\"USD\" selected>USD &#8211; US Dollar<\/option><option value=\"EUR\">EUR &#8211; Euro<\/option><option value=\"GBP\">GBP &#8211; British Pound<\/option><option value=\"INR\">INR &#8211; Indian Rupee<\/option><option value=\"AUD\">AUD &#8211; Australian Dollar<\/option><option value=\"CAD\">CAD &#8211; Canadian Dollar<\/option><\/select><\/div>\n<\/div>\n<\/div>\n<div class=\"deni-inv-card\"><div class=\"deni-inv-card-head\"><h3>Patient &amp; Treatment Details<\/h3><\/div><div class=\"deni-inv-card-body\"><div class=\"deni-inv-field\"><label for=\"deni-inv-patient-id\">Patient ID \/ Chart #<\/label><input type=\"text\" id=\"deni-inv-patient-id\" placeholder=\"Practice record number\"><\/div><div class=\"deni-inv-field\"><label for=\"deni-inv-date-of-treatment\">Date of Treatment<\/label><input type=\"date\" id=\"deni-inv-date-of-treatment\"><\/div><div class=\"deni-inv-field\"><label for=\"deni-inv-treating-dentist\">Treating Dentist<\/label><input type=\"text\" id=\"deni-inv-treating-dentist\" placeholder=\"e.g. Dr. James Lee, DDS\"><\/div><div class=\"deni-inv-field\"><label for=\"deni-inv-insurance-policy\">Insurance Policy #<\/label><input type=\"text\" id=\"deni-inv-insurance-policy\" placeholder=\"Member \/ group #\"><\/div><div class=\"deni-inv-field\"><label for=\"deni-inv-prior-authorization\">Pre-Authorization #<\/label><input type=\"text\" id=\"deni-inv-prior-authorization\" placeholder=\"If applicable\"><\/div><\/div><\/div>\n<\/div>\n<div>\n<div class=\"deni-inv-card\">\n<div class=\"deni-inv-card-head\"><h3>Procedures Performed<\/h3><button type=\"button\" class=\"deni-inv-add-btn\" onclick=\"if(!window.deniInvBooted){window.deniInvBooted=1;(new Function(atob('KGZ1bmN0aW9uKCl7CiAgdmFyIGJvb3RlZD1mYWxzZTsKICBmdW5jdGlvbiAkKGlkKXtyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO30KICBmdW5jdGlvbiB2YWwoaWQpe3ZhciBlbD0kKGlkKTtyZXR1cm4gZWw\/ZWwudmFsdWU6Jyc7fQogIGZ1bmN0aW9uIHNldFZhbChpZCx2KXt2YXIgZWw9JChpZCk7aWYoZWwpZWwudmFsdWU9djt9CiAgZnVuY3Rpb24gbnVtKHYpe3ZhciBuPXBhcnNlRmxvYXQodik7cmV0dXJuIGlzRmluaXRlKG4pP246MDt9CiAgZnVuY3Rpb24gZm10KG4sY3VyKXtjdXI9Y3VyfHwnVVNEJzt0cnl7cmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCgnZW4tVVMnLHtzdHlsZTonY3VycmVuY3knLGN1cnJlbmN5OmN1cixtaW5pbXVtRnJhY3Rpb25EaWdpdHM6Mn0pLmZvcm1hdChOdW1iZXIobil8fDApO31jYXRjaChfKXtyZXR1cm4gJyQnKygoTnVtYmVyKG4pfHwwKS50b0ZpeGVkKDIpKTt9fQogIGZ1bmN0aW9uIGN1clN5bShjKXt2YXIgbT17VVNEOickJyxFVVI6J+KCrCcsR0JQOifCoycsSU5SOifigrknLEFVRDonQSQnLENBRDonQyQnfTtyZXR1cm4gbVtjXXx8JyQnO30KICBmdW5jdGlvbiBmbXREYXRlKHMpe2lmKCFzKXJldHVybiAnJzt0cnl7dmFyIGQ9bmV3IERhdGUocyk7aWYoaXNOYU4oZCkpcmV0dXJuIHM7cmV0dXJuIGQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycse3llYXI6J251bWVyaWMnLG1vbnRoOidzaG9ydCcsZGF5OidudW1lcmljJ30pO31jYXRjaChfKXtyZXR1cm4gczt9fQogIGZ1bmN0aW9uIHVpZCgpe3JldHVybiAnbGknK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxZTkpLnRvU3RyaW5nKDM2KTt9CgogIGZ1bmN0aW9uIGxpbmVSb3dIdG1sKGlkKXsKICAgIHJldHVybiAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1pdGVtIiBkYXRhLWxpbmUtaWQ9IicraWQrJyIgaWQ9ImRlbmktaW52LWxpbmUtJytpZCsnIj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkIj48c3BhbiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkLWxhYmVsIj5MaW5lIEl0ZW08L3NwYW4+JysKICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJkZW5pLWludi1saW5lLXJlbW92ZSIgYXJpYS1sYWJlbD0iUmVtb3ZlIiBvbmNsaWNrPSJ3aW5kb3cuYXNjSW52JiZ3aW5kb3cuYXNjSW52LnJlbW92ZUxpbmUoXCcnK2lkKydcJykiPlx1MDBENzwvYnV0dG9uPicrCiAgICAgICc8L2Rpdj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1ncmlkIj4nKwogICAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1maWVsZCI+PGxhYmVsPkRlc2NyaXB0aW9uPC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgZGF0YS1saW5lLWZpZWxkPSJkZXNjcmlwdGlvbiIgcGxhY2Vob2xkZXI9IlNlcnZpY2Ugb3IgcHJvZHVjdCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLWdyaWQtMyI+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5RdWFudGl0eTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBzdGVwPSIwLjAxIiBkYXRhLWxpbmUtZmllbGQ9InF1YW50aXR5IiB2YWx1ZT0iMSIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5Vbml0IFByaWNlPC9sYWJlbD48aW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49IjAiIHN0ZXA9IjAuMDEiIGRhdGEtbGluZS1maWVsZD0idW5pdFByaWNlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5UYXggJTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9IjEwMCIgc3RlcD0iMC4wMSIgZGF0YS1saW5lLWZpZWxkPSJ0YXhSYXRlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLXRvdGFsIj48c3Bhbj5MaW5lIFRvdGFsPC9zcGFuPjxzdHJvbmcgZGF0YS1saW5lLXRvdGFsPiQwLjAwPC9zdHJvbmc+PC9kaXY+JysKICAgICc8L2Rpdj4nOwogIH0KCiAgZnVuY3Rpb24gcmVhZExpbmVzKCl7CiAgICB2YXIgcm93cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZGVuaS1pbnYtbGluZXMgLmRlbmktaW52LWxpbmUtaXRlbScpOwogICAgdmFyIGFycj1bXSxpLHJvdyxkZXNjLHF0eSxwcmljZSx0YXg7CiAgICBmb3IoaT0wO2k8cm93cy5sZW5ndGg7aSsrKXsKICAgICAgcm93PXJvd3NbaV07CiAgICAgIGRlc2M9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9ImRlc2NyaXB0aW9uIl0nKTsKICAgICAgcXR5PXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJxdWFudGl0eSJdJyk7CiAgICAgIHByaWNlPXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJ1bml0UHJpY2UiXScpOwogICAgICB0YXg9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9InRheFJhdGUiXScpOwogICAgICBhcnIucHVzaCh7CiAgICAgICAgZWw6cm93LAogICAgICAgIGRlc2NyaXB0aW9uOmRlc2M\/ZGVzYy52YWx1ZTonJywKICAgICAgICBxdWFudGl0eTpudW0ocXR5JiZxdHkudmFsdWUpLAogICAgICAgIHVuaXRQcmljZTpudW0ocHJpY2UmJnByaWNlLnZhbHVlKSwKICAgICAgICB0YXhSYXRlOm51bSh0YXgmJnRheC52YWx1ZSkKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gYXJyOwogIH0KCiAgZnVuY3Rpb24gcmVjb21wdXRlKCl7CiAgICB2YXIgY3VyPXZhbCgnZGVuaS1pbnYtY3VycmVuY3knKXx8J1VTRCc7CiAgICB2YXIgc3ltPWN1clN5bShjdXIpOwogICAgdmFyIGxpbmVzPXJlYWRMaW5lcygpOwogICAgdmFyIHN1YnRvdGFsPTAsdGF4PTAsaSxsaW5lLGxpbmVTdWIsbGluZVRheCx0b3RhbEVsOwogICAgZm9yKGk9MDtpPGxpbmVzLmxlbmd0aDtpKyspewogICAgICBsaW5lPWxpbmVzW2ldOwogICAgICBsaW5lU3ViPWxpbmUucXVhbnRpdHkqbGluZS51bml0UHJpY2U7CiAgICAgIGxpbmVUYXg9bGluZVN1YipsaW5lLnRheFJhdGUvMTAwOwogICAgICBzdWJ0b3RhbCs9bGluZVN1YjsKICAgICAgdGF4Kz1saW5lVGF4OwogICAgICB0b3RhbEVsPWxpbmUuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbGluZS10b3RhbF0nKTsKICAgICAgaWYodG90YWxFbCl0b3RhbEVsLnRleHRDb250ZW50PWZtdChsaW5lU3ViK2xpbmVUYXgsY3VyKTsKICAgIH0KICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgIHZhciB0b3RhbD1zdWJ0b3RhbCt0YXgtZGlzY291bnQ7CiAgICB2YXIgc3ViRWw9JCgnZGVuaS1pbnYtc3VidG90YWwnKTtpZihzdWJFbClzdWJFbC50ZXh0Q29udGVudD1mbXQoc3VidG90YWwsY3VyKTsKICAgIHZhciB0YXhFbD0kKCdkZW5pLWludi10YXgnKTtpZih0YXhFbCl0YXhFbC50ZXh0Q29udGVudD1mbXQodGF4LGN1cik7CiAgICB2YXIgZGlzY0VsPSQoJ2RlbmktaW52LWRpc2NvdW50LWRpc3BsYXknKTtpZihkaXNjRWwpZGlzY0VsLnRleHRDb250ZW50PSctJytmbXQoZGlzY291bnQsY3VyKTsKICAgIHZhciB0b3RFbD0kKCdkZW5pLWludi10b3RhbCcpO2lmKHRvdEVsKXRvdEVsLnRleHRDb250ZW50PWZtdCh0b3RhbCxjdXIpOwogICAgLy8gS2VlcCBjdXJyZW5jeSBzeW1ib2wgaW4gc3VtbWFyeSBpbiBzeW5jCiAgICB2YXIgc3ltRWxzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWN1ci1zeW1dJyk7CiAgICBmb3IoaT0wO2k8c3ltRWxzLmxlbmd0aDtpKyspc3ltRWxzW2ldLnRleHRDb250ZW50PXN5bTsKICB9CgogIGZ1bmN0aW9uIGFkZExpbmUoKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIGJveC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsbGluZVJvd0h0bWwodWlkKCkpKTsKICAgIHJlY29tcHV0ZSgpOwogIH0KICBmdW5jdGlvbiByZW1vdmVMaW5lKGlkKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIHZhciByb3dzPWJveC5xdWVyeVNlbGVjdG9yQWxsKCcuZGVuaS1pbnYtbGluZS1pdGVtJyk7CiAgICBpZihyb3dzLmxlbmd0aDw9MSlyZXR1cm47CiAgICB2YXIgcm93PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZW5pLWludi1saW5lLScraWQpOwogICAgaWYocm93KXJvdy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHJvdyk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIGZ1bmN0aW9uIHNob3dUb2FzdChtc2csa2luZCl7CiAgICB2YXIgdD0kKCdkZW5pLWludi10b2FzdCcpO2lmKCF0KXJldHVybjsKICAgIHQudGV4dENvbnRlbnQ9bXNnOwogICAgdC5jbGFzc05hbWU9J2RlbmktaW52LXRvYXN0IGRlbmktaW52LXRvYXN0LXNob3cnKyhraW5kPT09J3N1Y2Nlc3MnPycgZGVuaS1pbnYtdG9hc3Qtc3VjY2Vzcyc6JycpOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xhc3NOYW1lPSdkZW5pLWludi10b2FzdCc7fSwzNTAwKTsKICB9CgogIGZ1bmN0aW9uIHJlc2V0KCl7CiAgICB2YXIgZGVmcz17J2RlbmktaW52LWJ1c2luZXNzLW5hbWUnOicnLCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJzonJywnZGVuaS1pbnYtYnVzaW5lc3MtY29udGFjdCc6JycsJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCc6JycsJ2RlbmktaW52LWNsaWVudC1uYW1lJzonJywnZGVuaS1pbnYtY2xpZW50LWNvbXBhbnknOicnLCdkZW5pLWludi1jbGllbnQtYWRkcmVzcyc6JycsJ2RlbmktaW52LWNsaWVudC1jb250YWN0JzonJywnZGVuaS1pbnYtZGlzY291bnQnOicwJywnZGVuaS1pbnYtcGF5bWVudC10ZXJtcyc6IlBhdGllbnQgcG9ydGlvbiBkdWUgYXQgdGltZSBvZiBzZXJ2aWNlLiBJbnN1cmFuY2UgYmFsYW5jZSBiaWxsZWQgdG8gY2Fycmllci4iLCdkZW5pLWludi1ub3Rlcyc6Jyd9OwogICAgdmFyIGs7Zm9yKGsgaW4gZGVmcylzZXRWYWwoayxkZWZzW2tdKTsKICAgIGlmKCQoJ2RlbmktaW52LXBhdGllbnQtaWQnKSkkKCdkZW5pLWludi1wYXRpZW50LWlkJykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtZGF0ZS1vZi10cmVhdG1lbnQnKSkkKCdkZW5pLWludi1kYXRlLW9mLXRyZWF0bWVudCcpLnZhbHVlPScnO2lmKCQoJ2RlbmktaW52LXRyZWF0aW5nLWRlbnRpc3QnKSkkKCdkZW5pLWludi10cmVhdGluZy1kZW50aXN0JykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtaW5zdXJhbmNlLXBvbGljeScpKSQoJ2RlbmktaW52LWluc3VyYW5jZS1wb2xpY3knKS52YWx1ZT0nJztpZigkKCdkZW5pLWludi1wcmlvci1hdXRob3JpemF0aW9uJykpJCgnZGVuaS1pbnYtcHJpb3ItYXV0aG9yaXphdGlvbicpLnZhbHVlPScnOwogICAgdmFyIGQ9bmV3IERhdGUoKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWlzc3VlLWRhdGUnLGQudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHZhciBkdWU9bmV3IERhdGUoZC5nZXRUaW1lKCkrMzAqMjQqNjAqNjAqMTAwMCk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWR1ZS1kYXRlJyxkdWUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtY3VycmVuY3knLCdVU0QnKTsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTsKICAgIGlmKGJveCl7Ym94LmlubmVySFRNTD1saW5lUm93SHRtbCh1aWQoKSk7fQogICAgcmVjb21wdXRlKCk7CiAgfQoKICB2YXIganNQZGZQcm9taXNlPW51bGw7CiAgZnVuY3Rpb24gZW5zdXJlSnNQREYoKXsKICAgIGlmKGpzUGRmUHJvbWlzZSlyZXR1cm4ganNQZGZQcm9taXNlOwogICAganNQZGZQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXsKICAgICAgaWYod2luZG93LmpzcGRmJiZ3aW5kb3cuanNwZGYuanNQREYpcmV0dXJuIHJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTsKICAgICAgdmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgIHMuc3JjPSdodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9qc3BkZi8yLjUuMS9qc3BkZi51bWQubWluLmpzJzsKICAgICAgcy5hc3luYz10cnVlOwogICAgICBzLm9ubG9hZD1mdW5jdGlvbigpe2lmKHdpbmRvdy5qc3BkZiYmd2luZG93LmpzcGRmLmpzUERGKXJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTtlbHNlIHJlamVjdChuZXcgRXJyb3IoJ2pzUERGIG5vdCBhdmFpbGFibGUnKSk7fTsKICAgICAgcy5vbmVycm9yPWZ1bmN0aW9uKCl7cmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQganNQREYgZnJvbSBDRE4nKSk7fTsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTsKICAgIH0pOwogICAgcmV0dXJuIGpzUGRmUHJvbWlzZTsKICB9CgogIGZ1bmN0aW9uIGRvd25sb2FkKCl7CiAgICB2YXIgYnVzaW5lc3NOYW1lPXZhbCgnZGVuaS1pbnYtYnVzaW5lc3MtbmFtZScpLnRyaW0oKTsKICAgIHZhciBjbGllbnROYW1lPXZhbCgnZGVuaS1pbnYtY2xpZW50LW5hbWUnKS50cmltKCk7CiAgICBpZighYnVzaW5lc3NOYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB5b3VyIGJ1c2luZXNzIG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIGlmKCFjbGllbnROYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB0aGUgcmVjaXBpZW50IG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIHZhciBsaW5lcz1yZWFkTGluZXMoKTsKICAgIHZhciBoYXNJdGVtPWZhbHNlLGk7CiAgICBmb3IoaT0wO2k8bGluZXMubGVuZ3RoO2krKyl7aWYoKGxpbmVzW2ldLnF1YW50aXR5KmxpbmVzW2ldLnVuaXRQcmljZSk+MHx8KGxpbmVzW2ldLmRlc2NyaXB0aW9uJiZsaW5lc1tpXS5kZXNjcmlwdGlvbi5sZW5ndGg+MCkpe2hhc0l0ZW09dHJ1ZTticmVhazt9fQogICAgaWYoIWhhc0l0ZW0pe3Nob3dUb2FzdCgnUGxlYXNlIGFkZCBhdCBsZWFzdCBvbmUgbGluZSBpdGVtLicsJ2VycicpO3JldHVybjt9CiAgICBzaG93VG9hc3QoJ1ByZXBhcmluZyBQREYuLi4nLCdzdWNjZXNzJyk7CiAgICBlbnN1cmVKc1BERigpLnRoZW4oZnVuY3Rpb24oanNQREYpewogICAgICB0cnl7CiAgICAgICAgdmFyIGRvYz1uZXcganNQREYoe29yaWVudGF0aW9uOidwb3J0cmFpdCcsdW5pdDonbW0nLGZvcm1hdDonYTQnfSk7CiAgICAgICAgdmFyIGN1cj12YWwoJ2RlbmktaW52LWN1cnJlbmN5Jyl8fCdVU0QnOwogICAgICAgIHZhciBzeW09Y3VyU3ltKGN1cik7CiAgICAgICAgdmFyIHlQb3M9MjA7CgogICAgICAgIGRvYy5zZXRGb250U2l6ZSgyMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy50ZXh0KCJERU5UQUwgSU5WT0lDRSIsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTEyOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dChidXNpbmVzc05hbWUsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDkpOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgdmFyIGJpekFkZHI9dmFsKCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJyk7CiAgICAgICAgdmFyIGJpekNvbnRhY3Q9dmFsKCdkZW5pLWludi1idXNpbmVzcy1jb250YWN0Jyk7CiAgICAgICAgdmFyIGJpelRheD12YWwoJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCcpOwogICAgICAgIGlmKGJpekFkZHIpe2RvYy50ZXh0KGJpekFkZHIsMjAseVBvcyk7eVBvcys9NTt9CiAgICAgICAgaWYoYml6Q29udGFjdCl7ZG9jLnRleHQoYml6Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICBpZihiaXpUYXgpe2RvYy50ZXh0KCdUYXggSUQ6ICcrYml6VGF4LDIwLHlQb3MpO3lQb3MrPTU7fQoKICAgICAgICBkb2Muc2V0Rm9udFNpemUoOSk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dCgnSW52b2ljZSAjOiAnK3ZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInKSwxNDAsMzApOwogICAgICAgIGRvYy50ZXh0KCdJc3N1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpLDE0MCwzNik7CiAgICAgICAgZG9jLnRleHQoJ0R1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKSwxNDAsNDIpOwogICAgICAgIGRvYy50ZXh0KCdDdXJyZW5jeTogJytjdXIsMTQwLDQ4KTsKCiAgICAgICAgeVBvcz1NYXRoLm1heCh5UG9zLDYwKTsKICAgICAgICBkb2Muc2V0Rm9udFNpemUoMTApOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2MudGV4dCgiUEFUSUVOVCBERVRBSUxTIiwyMCx5UG9zKTsKICAgICAgICB5UG9zKz02OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDEyLDAsNTApOwogICAgICAgIGRvYy50ZXh0KGNsaWVudE5hbWUsMjAseVBvcyk7eVBvcys9NTsKICAgICAgICB2YXIgY2xpZW50Q29tcGFueT12YWwoJ2RlbmktaW52LWNsaWVudC1jb21wYW55Jyk7CiAgICAgICAgaWYoY2xpZW50Q29tcGFueSl7ZG9jLnRleHQoY2xpZW50Q29tcGFueSwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50QWRkcj12YWwoJ2RlbmktaW52LWNsaWVudC1hZGRyZXNzJyk7CiAgICAgICAgaWYoY2xpZW50QWRkcil7ZG9jLnRleHQoY2xpZW50QWRkciwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50Q29udGFjdD12YWwoJ2RlbmktaW52LWNsaWVudC1jb250YWN0Jyk7CiAgICAgICAgaWYoY2xpZW50Q29udGFjdCl7ZG9jLnRleHQoY2xpZW50Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KCiAgICAgICAgLy8gRXh0cmEgZmllbGRzIGJsb2NrIChpZiBjb25maWcgZGVmaW5lZCBhbnkpCiAgICAgICAgdmFyIGV4dHJhSWRzPVsicGF0aWVudC1pZCIsImRhdGUtb2YtdHJlYXRtZW50IiwidHJlYXRpbmctZGVudGlzdCIsImluc3VyYW5jZS1wb2xpY3kiLCJwcmlvci1hdXRob3JpemF0aW9uIl07CiAgICAgICAgdmFyIGV4dHJhTGFiZWxzPVsiUGF0aWVudCBJRCAvIENoYXJ0ICMiLCJEYXRlIG9mIFRyZWF0bWVudCIsIlRyZWF0aW5nIERlbnRpc3QiLCJJbnN1cmFuY2UgUG9saWN5ICMiLCJQcmUtQXV0aG9yaXphdGlvbiAjIl07CiAgICAgICAgdmFyIGFueUV4dHJhPWZhbHNlOwogICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXtpZih2YWwoJ2RlbmktaW52LScrZXh0cmFJZHNbaV0pKWFueUV4dHJhPXRydWU7fQogICAgICAgIGlmKGFueUV4dHJhKXsKICAgICAgICAgIHlQb3MrPTQ7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICAgIGRvYy50ZXh0KCdERVRBSUxTJywyMCx5UG9zKTt5UG9zKz02OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXsKICAgICAgICAgICAgdmFyIHY9dmFsKCdkZW5pLWludi0nK2V4dHJhSWRzW2ldKTsKICAgICAgICAgICAgaWYodil7ZG9jLnRleHQoZXh0cmFMYWJlbHNbaV0rJzogJyt2LDIwLHlQb3MpO3lQb3MrPTU7fQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgeVBvcys9ODsKICAgICAgICBkb2Muc2V0RmlsbENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy5yZWN0KDIwLHlQb3MsMTcwLDgsJ0YnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDI1NSwyNTUsMjU1KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSg5KTsKICAgICAgICBkb2MudGV4dCgnRGVzY3JpcHRpb24nLDIzLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnUXR5JywxMTAseVBvcys1LjUpOwogICAgICAgIGRvYy50ZXh0KCdQcmljZScsMTI3LHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVGF4JScsMTUwLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVG90YWwnLDE3MCx5UG9zKzUuNSk7CiAgICAgICAgeVBvcys9MTI7CgogICAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMTIsMCw1MCk7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIHZhciBzdWJ0b3RhbD0wLHRheEFtdD0wOwogICAgICAgIGZvcihpPTA7aTxsaW5lcy5sZW5ndGg7aSsrKXsKICAgICAgICAgIGlmKHlQb3M+MjcwKXtkb2MuYWRkUGFnZSgpO3lQb3M9MjA7fQogICAgICAgICAgdmFyIGxpbj1saW5lc1tpXTsKICAgICAgICAgIHZhciBscz1saW4ucXVhbnRpdHkqbGluLnVuaXRQcmljZTsKICAgICAgICAgIHZhciBsdD1scypsaW4udGF4UmF0ZS8xMDA7CiAgICAgICAgICBzdWJ0b3RhbCs9bHM7dGF4QW10Kz1sdDsKICAgICAgICAgIHZhciBkZXNjVHh0PShsaW4uZGVzY3JpcHRpb258fCcnKS5zbGljZSgwLDQ2KTsKICAgICAgICAgIGRvYy50ZXh0KGRlc2NUeHQsMjMseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChTdHJpbmcobGluLnF1YW50aXR5KSwxMTAseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChzeW0rbGluLnVuaXRQcmljZS50b0ZpeGVkKDIpLDEyNyx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KGxpbi50YXhSYXRlLnRvRml4ZWQoMikrJyUnLDE1MCx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KHN5bSsobHMrbHQpLnRvRml4ZWQoMiksMTcwLHlQb3MpOwogICAgICAgICAgeVBvcys9NjsKICAgICAgICB9CgogICAgICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgICAgICB2YXIgdG90YWw9c3VidG90YWwrdGF4QW10LWRpc2NvdW50OwogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgZG9jLnRleHQoJ1N1YnRvdGFsOicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bStzdWJ0b3RhbC50b0ZpeGVkKDIpLDE4OCx5UG9zLHthbGlnbjoncmlnaHQnfSk7CiAgICAgICAgeVBvcys9NjsKICAgICAgICBkb2MudGV4dCgnVGF4OicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bSt0YXhBbXQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIGlmKGRpc2NvdW50PjApewogICAgICAgICAgeVBvcys9NjsKICAgICAgICAgIGRvYy50ZXh0KCdEaXNjb3VudDonLDEzNSx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KCctJytzeW0rZGlzY291bnQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIH0KICAgICAgICB5UG9zKz04OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDEzKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy50ZXh0KCdUb3RhbDonLDEzNSx5UG9zKTsKICAgICAgICBkb2MudGV4dChzeW0rdG90YWwudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwoKICAgICAgICB2YXIgcHRlcm1zPXZhbCgnZGVuaS1pbnYtcGF5bWVudC10ZXJtcycpOwogICAgICAgIGlmKHB0ZXJtcyl7CiAgICAgICAgICB5UG9zKz0xNDsKICAgICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdQYXltZW50IFRlcm1zJywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPTU7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnbm9ybWFsJyk7CiAgICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgICB2YXIgcHRMaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKHB0ZXJtcywxNzApOwogICAgICAgICAgZG9jLnRleHQocHRMaW5lcywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPXB0TGluZXMubGVuZ3RoKjU7CiAgICAgICAgfQoKICAgICAgICB2YXIgbm90ZXNWYWw9dmFsKCdkZW5pLWludi1ub3RlcycpOwogICAgICAgIGlmKG5vdGVzVmFsKXsKICAgICAgICAgIHlQb3MrPTY7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdOb3RlcycsMjAseVBvcyk7CiAgICAgICAgICB5UG9zKz01OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcig5MCw4NSwxMTIpOwogICAgICAgICAgdmFyIG5MaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKG5vdGVzVmFsLDE3MCk7CiAgICAgICAgICBkb2MudGV4dChuTGluZXMsMjAseVBvcyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZm5hbWU9dmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpfHwnaW52b2ljZSc7CiAgICAgICAgZG9jLnNhdmUoJ0ludm9pY2VfJytmbmFtZSsnLnBkZicpOwogICAgICAgIHNob3dUb2FzdCgnUERGIGRvd25sb2FkZWQuJywnc3VjY2VzcycpOwogICAgICB9Y2F0Y2goZXJyKXsKICAgICAgICBzaG93VG9hc3QoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBQREY6ICcrKGVyciYmZXJyLm1lc3NhZ2U\/ZXJyLm1lc3NhZ2U6ZXJyKSwnZXJyJyk7CiAgICAgIH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycil7CiAgICAgIHNob3dUb2FzdCgnQ291bGQgbm90IGxvYWQgUERGIGxpYnJhcnk6ICcrZXJyLm1lc3NhZ2UsJ2VycicpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzY3JvbGwoKXt2YXIgdD0kKCdkZW5pLWludi1nZW5lcmF0b3InKTtpZih0JiZ0LnNjcm9sbEludG9WaWV3KXQuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnLGJsb2NrOidzdGFydCd9KTt9CgogIGZ1bmN0aW9uIGJvb3QoKXsKICAgIGlmKGJvb3RlZClyZXR1cm47Ym9vdGVkPXRydWU7CiAgICAvLyBXaXJlIGdlbmVyaWMgaW5wdXQgbGlzdGVuZXJzIHRvIGtlZXAgdG90YWxzIGxpdmUKICAgIHZhciBpbnB1dHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2RlbmktaW52LWdlbmVyYXRvciBpbnB1dCwgI2RlbmktaW52LWdlbmVyYXRvciBzZWxlY3QnKTsKICAgIHZhciBpO2ZvcihpPTA7aTxpbnB1dHMubGVuZ3RoO2krKyl7aW5wdXRzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JyxyZWNvbXB1dGUpO2lucHV0c1tpXS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLHJlY29tcHV0ZSk7fQogICAgLy8gU2VlZCBpbnZvaWNlIG51bWJlciArIGRhdGVzIGlmIGJsYW5rIChoYW5kbGVzIGZyZXNoIHBhZ2UgbG9hZCkKICAgIHZhciBkPW5ldyBEYXRlKCk7CiAgICBpZighdmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpKXNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBpZighdmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpc2V0VmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJyxkLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICBpZighdmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKXNldFZhbCgnZGVuaS1pbnYtZHVlLWRhdGUnLG5ldyBEYXRlKGQuZ2V0VGltZSgpKzMwKjI0KjYwKjYwKjEwMDApLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIHdpbmRvdy5hc2NJbnY9d2luZG93LmFzY0ludnx8ewogICAgYm9vdDpib290LGFkZExpbmU6YWRkTGluZSxyZW1vdmVMaW5lOnJlbW92ZUxpbmUscmVjb21wdXRlOnJlY29tcHV0ZSwKICAgIGRvd25sb2FkOmRvd25sb2FkLHJlc2V0OnJlc2V0LHNjcm9sbDpzY3JvbGwKICB9OwogIGJvb3QoKTsKfSkoKTs=')))();}window.deniInv&#038;&#038;window.deniInv.addLine&#038;&#038;window.deniInv.addLine();return false;\">Add Item<\/button><\/div>\n<div class=\"deni-inv-card-body\">\n<div id=\"deni-inv-lines\">\n<div class=\"deni-inv-line-item\" data-line-id=\"li-initial\" id=\"deni-inv-line-li-initial\">\n<div class=\"deni-inv-line-head\"><span class=\"deni-inv-line-head-label\">Line Item<\/span><button type=\"button\" class=\"deni-inv-line-remove\" aria-label=\"Remove\" onclick=\"if(!window.deniInvBooted){window.deniInvBooted=1;(new Function(atob('KGZ1bmN0aW9uKCl7CiAgdmFyIGJvb3RlZD1mYWxzZTsKICBmdW5jdGlvbiAkKGlkKXtyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO30KICBmdW5jdGlvbiB2YWwoaWQpe3ZhciBlbD0kKGlkKTtyZXR1cm4gZWw\/ZWwudmFsdWU6Jyc7fQogIGZ1bmN0aW9uIHNldFZhbChpZCx2KXt2YXIgZWw9JChpZCk7aWYoZWwpZWwudmFsdWU9djt9CiAgZnVuY3Rpb24gbnVtKHYpe3ZhciBuPXBhcnNlRmxvYXQodik7cmV0dXJuIGlzRmluaXRlKG4pP246MDt9CiAgZnVuY3Rpb24gZm10KG4sY3VyKXtjdXI9Y3VyfHwnVVNEJzt0cnl7cmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCgnZW4tVVMnLHtzdHlsZTonY3VycmVuY3knLGN1cnJlbmN5OmN1cixtaW5pbXVtRnJhY3Rpb25EaWdpdHM6Mn0pLmZvcm1hdChOdW1iZXIobil8fDApO31jYXRjaChfKXtyZXR1cm4gJyQnKygoTnVtYmVyKG4pfHwwKS50b0ZpeGVkKDIpKTt9fQogIGZ1bmN0aW9uIGN1clN5bShjKXt2YXIgbT17VVNEOickJyxFVVI6J+KCrCcsR0JQOifCoycsSU5SOifigrknLEFVRDonQSQnLENBRDonQyQnfTtyZXR1cm4gbVtjXXx8JyQnO30KICBmdW5jdGlvbiBmbXREYXRlKHMpe2lmKCFzKXJldHVybiAnJzt0cnl7dmFyIGQ9bmV3IERhdGUocyk7aWYoaXNOYU4oZCkpcmV0dXJuIHM7cmV0dXJuIGQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycse3llYXI6J251bWVyaWMnLG1vbnRoOidzaG9ydCcsZGF5OidudW1lcmljJ30pO31jYXRjaChfKXtyZXR1cm4gczt9fQogIGZ1bmN0aW9uIHVpZCgpe3JldHVybiAnbGknK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxZTkpLnRvU3RyaW5nKDM2KTt9CgogIGZ1bmN0aW9uIGxpbmVSb3dIdG1sKGlkKXsKICAgIHJldHVybiAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1pdGVtIiBkYXRhLWxpbmUtaWQ9IicraWQrJyIgaWQ9ImRlbmktaW52LWxpbmUtJytpZCsnIj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkIj48c3BhbiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkLWxhYmVsIj5MaW5lIEl0ZW08L3NwYW4+JysKICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJkZW5pLWludi1saW5lLXJlbW92ZSIgYXJpYS1sYWJlbD0iUmVtb3ZlIiBvbmNsaWNrPSJ3aW5kb3cuYXNjSW52JiZ3aW5kb3cuYXNjSW52LnJlbW92ZUxpbmUoXCcnK2lkKydcJykiPlx1MDBENzwvYnV0dG9uPicrCiAgICAgICc8L2Rpdj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1ncmlkIj4nKwogICAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1maWVsZCI+PGxhYmVsPkRlc2NyaXB0aW9uPC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgZGF0YS1saW5lLWZpZWxkPSJkZXNjcmlwdGlvbiIgcGxhY2Vob2xkZXI9IlNlcnZpY2Ugb3IgcHJvZHVjdCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLWdyaWQtMyI+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5RdWFudGl0eTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBzdGVwPSIwLjAxIiBkYXRhLWxpbmUtZmllbGQ9InF1YW50aXR5IiB2YWx1ZT0iMSIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5Vbml0IFByaWNlPC9sYWJlbD48aW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49IjAiIHN0ZXA9IjAuMDEiIGRhdGEtbGluZS1maWVsZD0idW5pdFByaWNlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5UYXggJTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9IjEwMCIgc3RlcD0iMC4wMSIgZGF0YS1saW5lLWZpZWxkPSJ0YXhSYXRlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLXRvdGFsIj48c3Bhbj5MaW5lIFRvdGFsPC9zcGFuPjxzdHJvbmcgZGF0YS1saW5lLXRvdGFsPiQwLjAwPC9zdHJvbmc+PC9kaXY+JysKICAgICc8L2Rpdj4nOwogIH0KCiAgZnVuY3Rpb24gcmVhZExpbmVzKCl7CiAgICB2YXIgcm93cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZGVuaS1pbnYtbGluZXMgLmRlbmktaW52LWxpbmUtaXRlbScpOwogICAgdmFyIGFycj1bXSxpLHJvdyxkZXNjLHF0eSxwcmljZSx0YXg7CiAgICBmb3IoaT0wO2k8cm93cy5sZW5ndGg7aSsrKXsKICAgICAgcm93PXJvd3NbaV07CiAgICAgIGRlc2M9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9ImRlc2NyaXB0aW9uIl0nKTsKICAgICAgcXR5PXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJxdWFudGl0eSJdJyk7CiAgICAgIHByaWNlPXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJ1bml0UHJpY2UiXScpOwogICAgICB0YXg9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9InRheFJhdGUiXScpOwogICAgICBhcnIucHVzaCh7CiAgICAgICAgZWw6cm93LAogICAgICAgIGRlc2NyaXB0aW9uOmRlc2M\/ZGVzYy52YWx1ZTonJywKICAgICAgICBxdWFudGl0eTpudW0ocXR5JiZxdHkudmFsdWUpLAogICAgICAgIHVuaXRQcmljZTpudW0ocHJpY2UmJnByaWNlLnZhbHVlKSwKICAgICAgICB0YXhSYXRlOm51bSh0YXgmJnRheC52YWx1ZSkKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gYXJyOwogIH0KCiAgZnVuY3Rpb24gcmVjb21wdXRlKCl7CiAgICB2YXIgY3VyPXZhbCgnZGVuaS1pbnYtY3VycmVuY3knKXx8J1VTRCc7CiAgICB2YXIgc3ltPWN1clN5bShjdXIpOwogICAgdmFyIGxpbmVzPXJlYWRMaW5lcygpOwogICAgdmFyIHN1YnRvdGFsPTAsdGF4PTAsaSxsaW5lLGxpbmVTdWIsbGluZVRheCx0b3RhbEVsOwogICAgZm9yKGk9MDtpPGxpbmVzLmxlbmd0aDtpKyspewogICAgICBsaW5lPWxpbmVzW2ldOwogICAgICBsaW5lU3ViPWxpbmUucXVhbnRpdHkqbGluZS51bml0UHJpY2U7CiAgICAgIGxpbmVUYXg9bGluZVN1YipsaW5lLnRheFJhdGUvMTAwOwogICAgICBzdWJ0b3RhbCs9bGluZVN1YjsKICAgICAgdGF4Kz1saW5lVGF4OwogICAgICB0b3RhbEVsPWxpbmUuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbGluZS10b3RhbF0nKTsKICAgICAgaWYodG90YWxFbCl0b3RhbEVsLnRleHRDb250ZW50PWZtdChsaW5lU3ViK2xpbmVUYXgsY3VyKTsKICAgIH0KICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgIHZhciB0b3RhbD1zdWJ0b3RhbCt0YXgtZGlzY291bnQ7CiAgICB2YXIgc3ViRWw9JCgnZGVuaS1pbnYtc3VidG90YWwnKTtpZihzdWJFbClzdWJFbC50ZXh0Q29udGVudD1mbXQoc3VidG90YWwsY3VyKTsKICAgIHZhciB0YXhFbD0kKCdkZW5pLWludi10YXgnKTtpZih0YXhFbCl0YXhFbC50ZXh0Q29udGVudD1mbXQodGF4LGN1cik7CiAgICB2YXIgZGlzY0VsPSQoJ2RlbmktaW52LWRpc2NvdW50LWRpc3BsYXknKTtpZihkaXNjRWwpZGlzY0VsLnRleHRDb250ZW50PSctJytmbXQoZGlzY291bnQsY3VyKTsKICAgIHZhciB0b3RFbD0kKCdkZW5pLWludi10b3RhbCcpO2lmKHRvdEVsKXRvdEVsLnRleHRDb250ZW50PWZtdCh0b3RhbCxjdXIpOwogICAgLy8gS2VlcCBjdXJyZW5jeSBzeW1ib2wgaW4gc3VtbWFyeSBpbiBzeW5jCiAgICB2YXIgc3ltRWxzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWN1ci1zeW1dJyk7CiAgICBmb3IoaT0wO2k8c3ltRWxzLmxlbmd0aDtpKyspc3ltRWxzW2ldLnRleHRDb250ZW50PXN5bTsKICB9CgogIGZ1bmN0aW9uIGFkZExpbmUoKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIGJveC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsbGluZVJvd0h0bWwodWlkKCkpKTsKICAgIHJlY29tcHV0ZSgpOwogIH0KICBmdW5jdGlvbiByZW1vdmVMaW5lKGlkKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIHZhciByb3dzPWJveC5xdWVyeVNlbGVjdG9yQWxsKCcuZGVuaS1pbnYtbGluZS1pdGVtJyk7CiAgICBpZihyb3dzLmxlbmd0aDw9MSlyZXR1cm47CiAgICB2YXIgcm93PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZW5pLWludi1saW5lLScraWQpOwogICAgaWYocm93KXJvdy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHJvdyk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIGZ1bmN0aW9uIHNob3dUb2FzdChtc2csa2luZCl7CiAgICB2YXIgdD0kKCdkZW5pLWludi10b2FzdCcpO2lmKCF0KXJldHVybjsKICAgIHQudGV4dENvbnRlbnQ9bXNnOwogICAgdC5jbGFzc05hbWU9J2RlbmktaW52LXRvYXN0IGRlbmktaW52LXRvYXN0LXNob3cnKyhraW5kPT09J3N1Y2Nlc3MnPycgZGVuaS1pbnYtdG9hc3Qtc3VjY2Vzcyc6JycpOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xhc3NOYW1lPSdkZW5pLWludi10b2FzdCc7fSwzNTAwKTsKICB9CgogIGZ1bmN0aW9uIHJlc2V0KCl7CiAgICB2YXIgZGVmcz17J2RlbmktaW52LWJ1c2luZXNzLW5hbWUnOicnLCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJzonJywnZGVuaS1pbnYtYnVzaW5lc3MtY29udGFjdCc6JycsJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCc6JycsJ2RlbmktaW52LWNsaWVudC1uYW1lJzonJywnZGVuaS1pbnYtY2xpZW50LWNvbXBhbnknOicnLCdkZW5pLWludi1jbGllbnQtYWRkcmVzcyc6JycsJ2RlbmktaW52LWNsaWVudC1jb250YWN0JzonJywnZGVuaS1pbnYtZGlzY291bnQnOicwJywnZGVuaS1pbnYtcGF5bWVudC10ZXJtcyc6IlBhdGllbnQgcG9ydGlvbiBkdWUgYXQgdGltZSBvZiBzZXJ2aWNlLiBJbnN1cmFuY2UgYmFsYW5jZSBiaWxsZWQgdG8gY2Fycmllci4iLCdkZW5pLWludi1ub3Rlcyc6Jyd9OwogICAgdmFyIGs7Zm9yKGsgaW4gZGVmcylzZXRWYWwoayxkZWZzW2tdKTsKICAgIGlmKCQoJ2RlbmktaW52LXBhdGllbnQtaWQnKSkkKCdkZW5pLWludi1wYXRpZW50LWlkJykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtZGF0ZS1vZi10cmVhdG1lbnQnKSkkKCdkZW5pLWludi1kYXRlLW9mLXRyZWF0bWVudCcpLnZhbHVlPScnO2lmKCQoJ2RlbmktaW52LXRyZWF0aW5nLWRlbnRpc3QnKSkkKCdkZW5pLWludi10cmVhdGluZy1kZW50aXN0JykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtaW5zdXJhbmNlLXBvbGljeScpKSQoJ2RlbmktaW52LWluc3VyYW5jZS1wb2xpY3knKS52YWx1ZT0nJztpZigkKCdkZW5pLWludi1wcmlvci1hdXRob3JpemF0aW9uJykpJCgnZGVuaS1pbnYtcHJpb3ItYXV0aG9yaXphdGlvbicpLnZhbHVlPScnOwogICAgdmFyIGQ9bmV3IERhdGUoKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWlzc3VlLWRhdGUnLGQudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHZhciBkdWU9bmV3IERhdGUoZC5nZXRUaW1lKCkrMzAqMjQqNjAqNjAqMTAwMCk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWR1ZS1kYXRlJyxkdWUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtY3VycmVuY3knLCdVU0QnKTsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTsKICAgIGlmKGJveCl7Ym94LmlubmVySFRNTD1saW5lUm93SHRtbCh1aWQoKSk7fQogICAgcmVjb21wdXRlKCk7CiAgfQoKICB2YXIganNQZGZQcm9taXNlPW51bGw7CiAgZnVuY3Rpb24gZW5zdXJlSnNQREYoKXsKICAgIGlmKGpzUGRmUHJvbWlzZSlyZXR1cm4ganNQZGZQcm9taXNlOwogICAganNQZGZQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXsKICAgICAgaWYod2luZG93LmpzcGRmJiZ3aW5kb3cuanNwZGYuanNQREYpcmV0dXJuIHJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTsKICAgICAgdmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgIHMuc3JjPSdodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9qc3BkZi8yLjUuMS9qc3BkZi51bWQubWluLmpzJzsKICAgICAgcy5hc3luYz10cnVlOwogICAgICBzLm9ubG9hZD1mdW5jdGlvbigpe2lmKHdpbmRvdy5qc3BkZiYmd2luZG93LmpzcGRmLmpzUERGKXJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTtlbHNlIHJlamVjdChuZXcgRXJyb3IoJ2pzUERGIG5vdCBhdmFpbGFibGUnKSk7fTsKICAgICAgcy5vbmVycm9yPWZ1bmN0aW9uKCl7cmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQganNQREYgZnJvbSBDRE4nKSk7fTsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTsKICAgIH0pOwogICAgcmV0dXJuIGpzUGRmUHJvbWlzZTsKICB9CgogIGZ1bmN0aW9uIGRvd25sb2FkKCl7CiAgICB2YXIgYnVzaW5lc3NOYW1lPXZhbCgnZGVuaS1pbnYtYnVzaW5lc3MtbmFtZScpLnRyaW0oKTsKICAgIHZhciBjbGllbnROYW1lPXZhbCgnZGVuaS1pbnYtY2xpZW50LW5hbWUnKS50cmltKCk7CiAgICBpZighYnVzaW5lc3NOYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB5b3VyIGJ1c2luZXNzIG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIGlmKCFjbGllbnROYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB0aGUgcmVjaXBpZW50IG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIHZhciBsaW5lcz1yZWFkTGluZXMoKTsKICAgIHZhciBoYXNJdGVtPWZhbHNlLGk7CiAgICBmb3IoaT0wO2k8bGluZXMubGVuZ3RoO2krKyl7aWYoKGxpbmVzW2ldLnF1YW50aXR5KmxpbmVzW2ldLnVuaXRQcmljZSk+MHx8KGxpbmVzW2ldLmRlc2NyaXB0aW9uJiZsaW5lc1tpXS5kZXNjcmlwdGlvbi5sZW5ndGg+MCkpe2hhc0l0ZW09dHJ1ZTticmVhazt9fQogICAgaWYoIWhhc0l0ZW0pe3Nob3dUb2FzdCgnUGxlYXNlIGFkZCBhdCBsZWFzdCBvbmUgbGluZSBpdGVtLicsJ2VycicpO3JldHVybjt9CiAgICBzaG93VG9hc3QoJ1ByZXBhcmluZyBQREYuLi4nLCdzdWNjZXNzJyk7CiAgICBlbnN1cmVKc1BERigpLnRoZW4oZnVuY3Rpb24oanNQREYpewogICAgICB0cnl7CiAgICAgICAgdmFyIGRvYz1uZXcganNQREYoe29yaWVudGF0aW9uOidwb3J0cmFpdCcsdW5pdDonbW0nLGZvcm1hdDonYTQnfSk7CiAgICAgICAgdmFyIGN1cj12YWwoJ2RlbmktaW52LWN1cnJlbmN5Jyl8fCdVU0QnOwogICAgICAgIHZhciBzeW09Y3VyU3ltKGN1cik7CiAgICAgICAgdmFyIHlQb3M9MjA7CgogICAgICAgIGRvYy5zZXRGb250U2l6ZSgyMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy50ZXh0KCJERU5UQUwgSU5WT0lDRSIsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTEyOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dChidXNpbmVzc05hbWUsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDkpOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgdmFyIGJpekFkZHI9dmFsKCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJyk7CiAgICAgICAgdmFyIGJpekNvbnRhY3Q9dmFsKCdkZW5pLWludi1idXNpbmVzcy1jb250YWN0Jyk7CiAgICAgICAgdmFyIGJpelRheD12YWwoJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCcpOwogICAgICAgIGlmKGJpekFkZHIpe2RvYy50ZXh0KGJpekFkZHIsMjAseVBvcyk7eVBvcys9NTt9CiAgICAgICAgaWYoYml6Q29udGFjdCl7ZG9jLnRleHQoYml6Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICBpZihiaXpUYXgpe2RvYy50ZXh0KCdUYXggSUQ6ICcrYml6VGF4LDIwLHlQb3MpO3lQb3MrPTU7fQoKICAgICAgICBkb2Muc2V0Rm9udFNpemUoOSk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dCgnSW52b2ljZSAjOiAnK3ZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInKSwxNDAsMzApOwogICAgICAgIGRvYy50ZXh0KCdJc3N1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpLDE0MCwzNik7CiAgICAgICAgZG9jLnRleHQoJ0R1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKSwxNDAsNDIpOwogICAgICAgIGRvYy50ZXh0KCdDdXJyZW5jeTogJytjdXIsMTQwLDQ4KTsKCiAgICAgICAgeVBvcz1NYXRoLm1heCh5UG9zLDYwKTsKICAgICAgICBkb2Muc2V0Rm9udFNpemUoMTApOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2MudGV4dCgiUEFUSUVOVCBERVRBSUxTIiwyMCx5UG9zKTsKICAgICAgICB5UG9zKz02OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDEyLDAsNTApOwogICAgICAgIGRvYy50ZXh0KGNsaWVudE5hbWUsMjAseVBvcyk7eVBvcys9NTsKICAgICAgICB2YXIgY2xpZW50Q29tcGFueT12YWwoJ2RlbmktaW52LWNsaWVudC1jb21wYW55Jyk7CiAgICAgICAgaWYoY2xpZW50Q29tcGFueSl7ZG9jLnRleHQoY2xpZW50Q29tcGFueSwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50QWRkcj12YWwoJ2RlbmktaW52LWNsaWVudC1hZGRyZXNzJyk7CiAgICAgICAgaWYoY2xpZW50QWRkcil7ZG9jLnRleHQoY2xpZW50QWRkciwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50Q29udGFjdD12YWwoJ2RlbmktaW52LWNsaWVudC1jb250YWN0Jyk7CiAgICAgICAgaWYoY2xpZW50Q29udGFjdCl7ZG9jLnRleHQoY2xpZW50Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KCiAgICAgICAgLy8gRXh0cmEgZmllbGRzIGJsb2NrIChpZiBjb25maWcgZGVmaW5lZCBhbnkpCiAgICAgICAgdmFyIGV4dHJhSWRzPVsicGF0aWVudC1pZCIsImRhdGUtb2YtdHJlYXRtZW50IiwidHJlYXRpbmctZGVudGlzdCIsImluc3VyYW5jZS1wb2xpY3kiLCJwcmlvci1hdXRob3JpemF0aW9uIl07CiAgICAgICAgdmFyIGV4dHJhTGFiZWxzPVsiUGF0aWVudCBJRCAvIENoYXJ0ICMiLCJEYXRlIG9mIFRyZWF0bWVudCIsIlRyZWF0aW5nIERlbnRpc3QiLCJJbnN1cmFuY2UgUG9saWN5ICMiLCJQcmUtQXV0aG9yaXphdGlvbiAjIl07CiAgICAgICAgdmFyIGFueUV4dHJhPWZhbHNlOwogICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXtpZih2YWwoJ2RlbmktaW52LScrZXh0cmFJZHNbaV0pKWFueUV4dHJhPXRydWU7fQogICAgICAgIGlmKGFueUV4dHJhKXsKICAgICAgICAgIHlQb3MrPTQ7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICAgIGRvYy50ZXh0KCdERVRBSUxTJywyMCx5UG9zKTt5UG9zKz02OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXsKICAgICAgICAgICAgdmFyIHY9dmFsKCdkZW5pLWludi0nK2V4dHJhSWRzW2ldKTsKICAgICAgICAgICAgaWYodil7ZG9jLnRleHQoZXh0cmFMYWJlbHNbaV0rJzogJyt2LDIwLHlQb3MpO3lQb3MrPTU7fQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgeVBvcys9ODsKICAgICAgICBkb2Muc2V0RmlsbENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy5yZWN0KDIwLHlQb3MsMTcwLDgsJ0YnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDI1NSwyNTUsMjU1KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSg5KTsKICAgICAgICBkb2MudGV4dCgnRGVzY3JpcHRpb24nLDIzLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnUXR5JywxMTAseVBvcys1LjUpOwogICAgICAgIGRvYy50ZXh0KCdQcmljZScsMTI3LHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVGF4JScsMTUwLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVG90YWwnLDE3MCx5UG9zKzUuNSk7CiAgICAgICAgeVBvcys9MTI7CgogICAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMTIsMCw1MCk7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIHZhciBzdWJ0b3RhbD0wLHRheEFtdD0wOwogICAgICAgIGZvcihpPTA7aTxsaW5lcy5sZW5ndGg7aSsrKXsKICAgICAgICAgIGlmKHlQb3M+MjcwKXtkb2MuYWRkUGFnZSgpO3lQb3M9MjA7fQogICAgICAgICAgdmFyIGxpbj1saW5lc1tpXTsKICAgICAgICAgIHZhciBscz1saW4ucXVhbnRpdHkqbGluLnVuaXRQcmljZTsKICAgICAgICAgIHZhciBsdD1scypsaW4udGF4UmF0ZS8xMDA7CiAgICAgICAgICBzdWJ0b3RhbCs9bHM7dGF4QW10Kz1sdDsKICAgICAgICAgIHZhciBkZXNjVHh0PShsaW4uZGVzY3JpcHRpb258fCcnKS5zbGljZSgwLDQ2KTsKICAgICAgICAgIGRvYy50ZXh0KGRlc2NUeHQsMjMseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChTdHJpbmcobGluLnF1YW50aXR5KSwxMTAseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChzeW0rbGluLnVuaXRQcmljZS50b0ZpeGVkKDIpLDEyNyx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KGxpbi50YXhSYXRlLnRvRml4ZWQoMikrJyUnLDE1MCx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KHN5bSsobHMrbHQpLnRvRml4ZWQoMiksMTcwLHlQb3MpOwogICAgICAgICAgeVBvcys9NjsKICAgICAgICB9CgogICAgICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgICAgICB2YXIgdG90YWw9c3VidG90YWwrdGF4QW10LWRpc2NvdW50OwogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgZG9jLnRleHQoJ1N1YnRvdGFsOicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bStzdWJ0b3RhbC50b0ZpeGVkKDIpLDE4OCx5UG9zLHthbGlnbjoncmlnaHQnfSk7CiAgICAgICAgeVBvcys9NjsKICAgICAgICBkb2MudGV4dCgnVGF4OicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bSt0YXhBbXQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIGlmKGRpc2NvdW50PjApewogICAgICAgICAgeVBvcys9NjsKICAgICAgICAgIGRvYy50ZXh0KCdEaXNjb3VudDonLDEzNSx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KCctJytzeW0rZGlzY291bnQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIH0KICAgICAgICB5UG9zKz04OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDEzKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy50ZXh0KCdUb3RhbDonLDEzNSx5UG9zKTsKICAgICAgICBkb2MudGV4dChzeW0rdG90YWwudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwoKICAgICAgICB2YXIgcHRlcm1zPXZhbCgnZGVuaS1pbnYtcGF5bWVudC10ZXJtcycpOwogICAgICAgIGlmKHB0ZXJtcyl7CiAgICAgICAgICB5UG9zKz0xNDsKICAgICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdQYXltZW50IFRlcm1zJywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPTU7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnbm9ybWFsJyk7CiAgICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgICB2YXIgcHRMaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKHB0ZXJtcywxNzApOwogICAgICAgICAgZG9jLnRleHQocHRMaW5lcywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPXB0TGluZXMubGVuZ3RoKjU7CiAgICAgICAgfQoKICAgICAgICB2YXIgbm90ZXNWYWw9dmFsKCdkZW5pLWludi1ub3RlcycpOwogICAgICAgIGlmKG5vdGVzVmFsKXsKICAgICAgICAgIHlQb3MrPTY7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdOb3RlcycsMjAseVBvcyk7CiAgICAgICAgICB5UG9zKz01OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcig5MCw4NSwxMTIpOwogICAgICAgICAgdmFyIG5MaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKG5vdGVzVmFsLDE3MCk7CiAgICAgICAgICBkb2MudGV4dChuTGluZXMsMjAseVBvcyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZm5hbWU9dmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpfHwnaW52b2ljZSc7CiAgICAgICAgZG9jLnNhdmUoJ0ludm9pY2VfJytmbmFtZSsnLnBkZicpOwogICAgICAgIHNob3dUb2FzdCgnUERGIGRvd25sb2FkZWQuJywnc3VjY2VzcycpOwogICAgICB9Y2F0Y2goZXJyKXsKICAgICAgICBzaG93VG9hc3QoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBQREY6ICcrKGVyciYmZXJyLm1lc3NhZ2U\/ZXJyLm1lc3NhZ2U6ZXJyKSwnZXJyJyk7CiAgICAgIH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycil7CiAgICAgIHNob3dUb2FzdCgnQ291bGQgbm90IGxvYWQgUERGIGxpYnJhcnk6ICcrZXJyLm1lc3NhZ2UsJ2VycicpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzY3JvbGwoKXt2YXIgdD0kKCdkZW5pLWludi1nZW5lcmF0b3InKTtpZih0JiZ0LnNjcm9sbEludG9WaWV3KXQuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnLGJsb2NrOidzdGFydCd9KTt9CgogIGZ1bmN0aW9uIGJvb3QoKXsKICAgIGlmKGJvb3RlZClyZXR1cm47Ym9vdGVkPXRydWU7CiAgICAvLyBXaXJlIGdlbmVyaWMgaW5wdXQgbGlzdGVuZXJzIHRvIGtlZXAgdG90YWxzIGxpdmUKICAgIHZhciBpbnB1dHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2RlbmktaW52LWdlbmVyYXRvciBpbnB1dCwgI2RlbmktaW52LWdlbmVyYXRvciBzZWxlY3QnKTsKICAgIHZhciBpO2ZvcihpPTA7aTxpbnB1dHMubGVuZ3RoO2krKyl7aW5wdXRzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JyxyZWNvbXB1dGUpO2lucHV0c1tpXS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLHJlY29tcHV0ZSk7fQogICAgLy8gU2VlZCBpbnZvaWNlIG51bWJlciArIGRhdGVzIGlmIGJsYW5rIChoYW5kbGVzIGZyZXNoIHBhZ2UgbG9hZCkKICAgIHZhciBkPW5ldyBEYXRlKCk7CiAgICBpZighdmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpKXNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBpZighdmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpc2V0VmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJyxkLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICBpZighdmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKXNldFZhbCgnZGVuaS1pbnYtZHVlLWRhdGUnLG5ldyBEYXRlKGQuZ2V0VGltZSgpKzMwKjI0KjYwKjYwKjEwMDApLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIHdpbmRvdy5hc2NJbnY9d2luZG93LmFzY0ludnx8ewogICAgYm9vdDpib290LGFkZExpbmU6YWRkTGluZSxyZW1vdmVMaW5lOnJlbW92ZUxpbmUscmVjb21wdXRlOnJlY29tcHV0ZSwKICAgIGRvd25sb2FkOmRvd25sb2FkLHJlc2V0OnJlc2V0LHNjcm9sbDpzY3JvbGwKICB9OwogIGJvb3QoKTsKfSkoKTs=')))();}window.deniInv&amp;&amp;window.deniInv.removeLine&amp;&amp;window.deniInv.removeLine('li-initial');return false;\">&times;<\/button><\/div>\n<div class=\"deni-inv-line-grid\">\n<div class=\"deni-inv-field\"><label>Description<\/label><input type=\"text\" data-line-field=\"description\" placeholder=\"e.g. D2150 - Amalgam two-surface filling\" oninput=\"if(!window.deniInvBooted){window.deniInvBooted=1;(new Function(atob('KGZ1bmN0aW9uKCl7CiAgdmFyIGJvb3RlZD1mYWxzZTsKICBmdW5jdGlvbiAkKGlkKXtyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO30KICBmdW5jdGlvbiB2YWwoaWQpe3ZhciBlbD0kKGlkKTtyZXR1cm4gZWw\/ZWwudmFsdWU6Jyc7fQogIGZ1bmN0aW9uIHNldFZhbChpZCx2KXt2YXIgZWw9JChpZCk7aWYoZWwpZWwudmFsdWU9djt9CiAgZnVuY3Rpb24gbnVtKHYpe3ZhciBuPXBhcnNlRmxvYXQodik7cmV0dXJuIGlzRmluaXRlKG4pP246MDt9CiAgZnVuY3Rpb24gZm10KG4sY3VyKXtjdXI9Y3VyfHwnVVNEJzt0cnl7cmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCgnZW4tVVMnLHtzdHlsZTonY3VycmVuY3knLGN1cnJlbmN5OmN1cixtaW5pbXVtRnJhY3Rpb25EaWdpdHM6Mn0pLmZvcm1hdChOdW1iZXIobil8fDApO31jYXRjaChfKXtyZXR1cm4gJyQnKygoTnVtYmVyKG4pfHwwKS50b0ZpeGVkKDIpKTt9fQogIGZ1bmN0aW9uIGN1clN5bShjKXt2YXIgbT17VVNEOickJyxFVVI6J+KCrCcsR0JQOifCoycsSU5SOifigrknLEFVRDonQSQnLENBRDonQyQnfTtyZXR1cm4gbVtjXXx8JyQnO30KICBmdW5jdGlvbiBmbXREYXRlKHMpe2lmKCFzKXJldHVybiAnJzt0cnl7dmFyIGQ9bmV3IERhdGUocyk7aWYoaXNOYU4oZCkpcmV0dXJuIHM7cmV0dXJuIGQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycse3llYXI6J251bWVyaWMnLG1vbnRoOidzaG9ydCcsZGF5OidudW1lcmljJ30pO31jYXRjaChfKXtyZXR1cm4gczt9fQogIGZ1bmN0aW9uIHVpZCgpe3JldHVybiAnbGknK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxZTkpLnRvU3RyaW5nKDM2KTt9CgogIGZ1bmN0aW9uIGxpbmVSb3dIdG1sKGlkKXsKICAgIHJldHVybiAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1pdGVtIiBkYXRhLWxpbmUtaWQ9IicraWQrJyIgaWQ9ImRlbmktaW52LWxpbmUtJytpZCsnIj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkIj48c3BhbiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkLWxhYmVsIj5MaW5lIEl0ZW08L3NwYW4+JysKICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJkZW5pLWludi1saW5lLXJlbW92ZSIgYXJpYS1sYWJlbD0iUmVtb3ZlIiBvbmNsaWNrPSJ3aW5kb3cuYXNjSW52JiZ3aW5kb3cuYXNjSW52LnJlbW92ZUxpbmUoXCcnK2lkKydcJykiPlx1MDBENzwvYnV0dG9uPicrCiAgICAgICc8L2Rpdj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1ncmlkIj4nKwogICAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1maWVsZCI+PGxhYmVsPkRlc2NyaXB0aW9uPC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgZGF0YS1saW5lLWZpZWxkPSJkZXNjcmlwdGlvbiIgcGxhY2Vob2xkZXI9IlNlcnZpY2Ugb3IgcHJvZHVjdCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLWdyaWQtMyI+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5RdWFudGl0eTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBzdGVwPSIwLjAxIiBkYXRhLWxpbmUtZmllbGQ9InF1YW50aXR5IiB2YWx1ZT0iMSIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5Vbml0IFByaWNlPC9sYWJlbD48aW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49IjAiIHN0ZXA9IjAuMDEiIGRhdGEtbGluZS1maWVsZD0idW5pdFByaWNlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5UYXggJTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9IjEwMCIgc3RlcD0iMC4wMSIgZGF0YS1saW5lLWZpZWxkPSJ0YXhSYXRlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLXRvdGFsIj48c3Bhbj5MaW5lIFRvdGFsPC9zcGFuPjxzdHJvbmcgZGF0YS1saW5lLXRvdGFsPiQwLjAwPC9zdHJvbmc+PC9kaXY+JysKICAgICc8L2Rpdj4nOwogIH0KCiAgZnVuY3Rpb24gcmVhZExpbmVzKCl7CiAgICB2YXIgcm93cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZGVuaS1pbnYtbGluZXMgLmRlbmktaW52LWxpbmUtaXRlbScpOwogICAgdmFyIGFycj1bXSxpLHJvdyxkZXNjLHF0eSxwcmljZSx0YXg7CiAgICBmb3IoaT0wO2k8cm93cy5sZW5ndGg7aSsrKXsKICAgICAgcm93PXJvd3NbaV07CiAgICAgIGRlc2M9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9ImRlc2NyaXB0aW9uIl0nKTsKICAgICAgcXR5PXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJxdWFudGl0eSJdJyk7CiAgICAgIHByaWNlPXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJ1bml0UHJpY2UiXScpOwogICAgICB0YXg9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9InRheFJhdGUiXScpOwogICAgICBhcnIucHVzaCh7CiAgICAgICAgZWw6cm93LAogICAgICAgIGRlc2NyaXB0aW9uOmRlc2M\/ZGVzYy52YWx1ZTonJywKICAgICAgICBxdWFudGl0eTpudW0ocXR5JiZxdHkudmFsdWUpLAogICAgICAgIHVuaXRQcmljZTpudW0ocHJpY2UmJnByaWNlLnZhbHVlKSwKICAgICAgICB0YXhSYXRlOm51bSh0YXgmJnRheC52YWx1ZSkKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gYXJyOwogIH0KCiAgZnVuY3Rpb24gcmVjb21wdXRlKCl7CiAgICB2YXIgY3VyPXZhbCgnZGVuaS1pbnYtY3VycmVuY3knKXx8J1VTRCc7CiAgICB2YXIgc3ltPWN1clN5bShjdXIpOwogICAgdmFyIGxpbmVzPXJlYWRMaW5lcygpOwogICAgdmFyIHN1YnRvdGFsPTAsdGF4PTAsaSxsaW5lLGxpbmVTdWIsbGluZVRheCx0b3RhbEVsOwogICAgZm9yKGk9MDtpPGxpbmVzLmxlbmd0aDtpKyspewogICAgICBsaW5lPWxpbmVzW2ldOwogICAgICBsaW5lU3ViPWxpbmUucXVhbnRpdHkqbGluZS51bml0UHJpY2U7CiAgICAgIGxpbmVUYXg9bGluZVN1YipsaW5lLnRheFJhdGUvMTAwOwogICAgICBzdWJ0b3RhbCs9bGluZVN1YjsKICAgICAgdGF4Kz1saW5lVGF4OwogICAgICB0b3RhbEVsPWxpbmUuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbGluZS10b3RhbF0nKTsKICAgICAgaWYodG90YWxFbCl0b3RhbEVsLnRleHRDb250ZW50PWZtdChsaW5lU3ViK2xpbmVUYXgsY3VyKTsKICAgIH0KICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgIHZhciB0b3RhbD1zdWJ0b3RhbCt0YXgtZGlzY291bnQ7CiAgICB2YXIgc3ViRWw9JCgnZGVuaS1pbnYtc3VidG90YWwnKTtpZihzdWJFbClzdWJFbC50ZXh0Q29udGVudD1mbXQoc3VidG90YWwsY3VyKTsKICAgIHZhciB0YXhFbD0kKCdkZW5pLWludi10YXgnKTtpZih0YXhFbCl0YXhFbC50ZXh0Q29udGVudD1mbXQodGF4LGN1cik7CiAgICB2YXIgZGlzY0VsPSQoJ2RlbmktaW52LWRpc2NvdW50LWRpc3BsYXknKTtpZihkaXNjRWwpZGlzY0VsLnRleHRDb250ZW50PSctJytmbXQoZGlzY291bnQsY3VyKTsKICAgIHZhciB0b3RFbD0kKCdkZW5pLWludi10b3RhbCcpO2lmKHRvdEVsKXRvdEVsLnRleHRDb250ZW50PWZtdCh0b3RhbCxjdXIpOwogICAgLy8gS2VlcCBjdXJyZW5jeSBzeW1ib2wgaW4gc3VtbWFyeSBpbiBzeW5jCiAgICB2YXIgc3ltRWxzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWN1ci1zeW1dJyk7CiAgICBmb3IoaT0wO2k8c3ltRWxzLmxlbmd0aDtpKyspc3ltRWxzW2ldLnRleHRDb250ZW50PXN5bTsKICB9CgogIGZ1bmN0aW9uIGFkZExpbmUoKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIGJveC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsbGluZVJvd0h0bWwodWlkKCkpKTsKICAgIHJlY29tcHV0ZSgpOwogIH0KICBmdW5jdGlvbiByZW1vdmVMaW5lKGlkKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIHZhciByb3dzPWJveC5xdWVyeVNlbGVjdG9yQWxsKCcuZGVuaS1pbnYtbGluZS1pdGVtJyk7CiAgICBpZihyb3dzLmxlbmd0aDw9MSlyZXR1cm47CiAgICB2YXIgcm93PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZW5pLWludi1saW5lLScraWQpOwogICAgaWYocm93KXJvdy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHJvdyk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIGZ1bmN0aW9uIHNob3dUb2FzdChtc2csa2luZCl7CiAgICB2YXIgdD0kKCdkZW5pLWludi10b2FzdCcpO2lmKCF0KXJldHVybjsKICAgIHQudGV4dENvbnRlbnQ9bXNnOwogICAgdC5jbGFzc05hbWU9J2RlbmktaW52LXRvYXN0IGRlbmktaW52LXRvYXN0LXNob3cnKyhraW5kPT09J3N1Y2Nlc3MnPycgZGVuaS1pbnYtdG9hc3Qtc3VjY2Vzcyc6JycpOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xhc3NOYW1lPSdkZW5pLWludi10b2FzdCc7fSwzNTAwKTsKICB9CgogIGZ1bmN0aW9uIHJlc2V0KCl7CiAgICB2YXIgZGVmcz17J2RlbmktaW52LWJ1c2luZXNzLW5hbWUnOicnLCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJzonJywnZGVuaS1pbnYtYnVzaW5lc3MtY29udGFjdCc6JycsJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCc6JycsJ2RlbmktaW52LWNsaWVudC1uYW1lJzonJywnZGVuaS1pbnYtY2xpZW50LWNvbXBhbnknOicnLCdkZW5pLWludi1jbGllbnQtYWRkcmVzcyc6JycsJ2RlbmktaW52LWNsaWVudC1jb250YWN0JzonJywnZGVuaS1pbnYtZGlzY291bnQnOicwJywnZGVuaS1pbnYtcGF5bWVudC10ZXJtcyc6IlBhdGllbnQgcG9ydGlvbiBkdWUgYXQgdGltZSBvZiBzZXJ2aWNlLiBJbnN1cmFuY2UgYmFsYW5jZSBiaWxsZWQgdG8gY2Fycmllci4iLCdkZW5pLWludi1ub3Rlcyc6Jyd9OwogICAgdmFyIGs7Zm9yKGsgaW4gZGVmcylzZXRWYWwoayxkZWZzW2tdKTsKICAgIGlmKCQoJ2RlbmktaW52LXBhdGllbnQtaWQnKSkkKCdkZW5pLWludi1wYXRpZW50LWlkJykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtZGF0ZS1vZi10cmVhdG1lbnQnKSkkKCdkZW5pLWludi1kYXRlLW9mLXRyZWF0bWVudCcpLnZhbHVlPScnO2lmKCQoJ2RlbmktaW52LXRyZWF0aW5nLWRlbnRpc3QnKSkkKCdkZW5pLWludi10cmVhdGluZy1kZW50aXN0JykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtaW5zdXJhbmNlLXBvbGljeScpKSQoJ2RlbmktaW52LWluc3VyYW5jZS1wb2xpY3knKS52YWx1ZT0nJztpZigkKCdkZW5pLWludi1wcmlvci1hdXRob3JpemF0aW9uJykpJCgnZGVuaS1pbnYtcHJpb3ItYXV0aG9yaXphdGlvbicpLnZhbHVlPScnOwogICAgdmFyIGQ9bmV3IERhdGUoKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWlzc3VlLWRhdGUnLGQudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHZhciBkdWU9bmV3IERhdGUoZC5nZXRUaW1lKCkrMzAqMjQqNjAqNjAqMTAwMCk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWR1ZS1kYXRlJyxkdWUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtY3VycmVuY3knLCdVU0QnKTsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTsKICAgIGlmKGJveCl7Ym94LmlubmVySFRNTD1saW5lUm93SHRtbCh1aWQoKSk7fQogICAgcmVjb21wdXRlKCk7CiAgfQoKICB2YXIganNQZGZQcm9taXNlPW51bGw7CiAgZnVuY3Rpb24gZW5zdXJlSnNQREYoKXsKICAgIGlmKGpzUGRmUHJvbWlzZSlyZXR1cm4ganNQZGZQcm9taXNlOwogICAganNQZGZQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXsKICAgICAgaWYod2luZG93LmpzcGRmJiZ3aW5kb3cuanNwZGYuanNQREYpcmV0dXJuIHJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTsKICAgICAgdmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgIHMuc3JjPSdodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9qc3BkZi8yLjUuMS9qc3BkZi51bWQubWluLmpzJzsKICAgICAgcy5hc3luYz10cnVlOwogICAgICBzLm9ubG9hZD1mdW5jdGlvbigpe2lmKHdpbmRvdy5qc3BkZiYmd2luZG93LmpzcGRmLmpzUERGKXJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTtlbHNlIHJlamVjdChuZXcgRXJyb3IoJ2pzUERGIG5vdCBhdmFpbGFibGUnKSk7fTsKICAgICAgcy5vbmVycm9yPWZ1bmN0aW9uKCl7cmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQganNQREYgZnJvbSBDRE4nKSk7fTsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTsKICAgIH0pOwogICAgcmV0dXJuIGpzUGRmUHJvbWlzZTsKICB9CgogIGZ1bmN0aW9uIGRvd25sb2FkKCl7CiAgICB2YXIgYnVzaW5lc3NOYW1lPXZhbCgnZGVuaS1pbnYtYnVzaW5lc3MtbmFtZScpLnRyaW0oKTsKICAgIHZhciBjbGllbnROYW1lPXZhbCgnZGVuaS1pbnYtY2xpZW50LW5hbWUnKS50cmltKCk7CiAgICBpZighYnVzaW5lc3NOYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB5b3VyIGJ1c2luZXNzIG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIGlmKCFjbGllbnROYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB0aGUgcmVjaXBpZW50IG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIHZhciBsaW5lcz1yZWFkTGluZXMoKTsKICAgIHZhciBoYXNJdGVtPWZhbHNlLGk7CiAgICBmb3IoaT0wO2k8bGluZXMubGVuZ3RoO2krKyl7aWYoKGxpbmVzW2ldLnF1YW50aXR5KmxpbmVzW2ldLnVuaXRQcmljZSk+MHx8KGxpbmVzW2ldLmRlc2NyaXB0aW9uJiZsaW5lc1tpXS5kZXNjcmlwdGlvbi5sZW5ndGg+MCkpe2hhc0l0ZW09dHJ1ZTticmVhazt9fQogICAgaWYoIWhhc0l0ZW0pe3Nob3dUb2FzdCgnUGxlYXNlIGFkZCBhdCBsZWFzdCBvbmUgbGluZSBpdGVtLicsJ2VycicpO3JldHVybjt9CiAgICBzaG93VG9hc3QoJ1ByZXBhcmluZyBQREYuLi4nLCdzdWNjZXNzJyk7CiAgICBlbnN1cmVKc1BERigpLnRoZW4oZnVuY3Rpb24oanNQREYpewogICAgICB0cnl7CiAgICAgICAgdmFyIGRvYz1uZXcganNQREYoe29yaWVudGF0aW9uOidwb3J0cmFpdCcsdW5pdDonbW0nLGZvcm1hdDonYTQnfSk7CiAgICAgICAgdmFyIGN1cj12YWwoJ2RlbmktaW52LWN1cnJlbmN5Jyl8fCdVU0QnOwogICAgICAgIHZhciBzeW09Y3VyU3ltKGN1cik7CiAgICAgICAgdmFyIHlQb3M9MjA7CgogICAgICAgIGRvYy5zZXRGb250U2l6ZSgyMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy50ZXh0KCJERU5UQUwgSU5WT0lDRSIsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTEyOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dChidXNpbmVzc05hbWUsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDkpOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgdmFyIGJpekFkZHI9dmFsKCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJyk7CiAgICAgICAgdmFyIGJpekNvbnRhY3Q9dmFsKCdkZW5pLWludi1idXNpbmVzcy1jb250YWN0Jyk7CiAgICAgICAgdmFyIGJpelRheD12YWwoJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCcpOwogICAgICAgIGlmKGJpekFkZHIpe2RvYy50ZXh0KGJpekFkZHIsMjAseVBvcyk7eVBvcys9NTt9CiAgICAgICAgaWYoYml6Q29udGFjdCl7ZG9jLnRleHQoYml6Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICBpZihiaXpUYXgpe2RvYy50ZXh0KCdUYXggSUQ6ICcrYml6VGF4LDIwLHlQb3MpO3lQb3MrPTU7fQoKICAgICAgICBkb2Muc2V0Rm9udFNpemUoOSk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dCgnSW52b2ljZSAjOiAnK3ZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInKSwxNDAsMzApOwogICAgICAgIGRvYy50ZXh0KCdJc3N1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpLDE0MCwzNik7CiAgICAgICAgZG9jLnRleHQoJ0R1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKSwxNDAsNDIpOwogICAgICAgIGRvYy50ZXh0KCdDdXJyZW5jeTogJytjdXIsMTQwLDQ4KTsKCiAgICAgICAgeVBvcz1NYXRoLm1heCh5UG9zLDYwKTsKICAgICAgICBkb2Muc2V0Rm9udFNpemUoMTApOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2MudGV4dCgiUEFUSUVOVCBERVRBSUxTIiwyMCx5UG9zKTsKICAgICAgICB5UG9zKz02OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDEyLDAsNTApOwogICAgICAgIGRvYy50ZXh0KGNsaWVudE5hbWUsMjAseVBvcyk7eVBvcys9NTsKICAgICAgICB2YXIgY2xpZW50Q29tcGFueT12YWwoJ2RlbmktaW52LWNsaWVudC1jb21wYW55Jyk7CiAgICAgICAgaWYoY2xpZW50Q29tcGFueSl7ZG9jLnRleHQoY2xpZW50Q29tcGFueSwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50QWRkcj12YWwoJ2RlbmktaW52LWNsaWVudC1hZGRyZXNzJyk7CiAgICAgICAgaWYoY2xpZW50QWRkcil7ZG9jLnRleHQoY2xpZW50QWRkciwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50Q29udGFjdD12YWwoJ2RlbmktaW52LWNsaWVudC1jb250YWN0Jyk7CiAgICAgICAgaWYoY2xpZW50Q29udGFjdCl7ZG9jLnRleHQoY2xpZW50Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KCiAgICAgICAgLy8gRXh0cmEgZmllbGRzIGJsb2NrIChpZiBjb25maWcgZGVmaW5lZCBhbnkpCiAgICAgICAgdmFyIGV4dHJhSWRzPVsicGF0aWVudC1pZCIsImRhdGUtb2YtdHJlYXRtZW50IiwidHJlYXRpbmctZGVudGlzdCIsImluc3VyYW5jZS1wb2xpY3kiLCJwcmlvci1hdXRob3JpemF0aW9uIl07CiAgICAgICAgdmFyIGV4dHJhTGFiZWxzPVsiUGF0aWVudCBJRCAvIENoYXJ0ICMiLCJEYXRlIG9mIFRyZWF0bWVudCIsIlRyZWF0aW5nIERlbnRpc3QiLCJJbnN1cmFuY2UgUG9saWN5ICMiLCJQcmUtQXV0aG9yaXphdGlvbiAjIl07CiAgICAgICAgdmFyIGFueUV4dHJhPWZhbHNlOwogICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXtpZih2YWwoJ2RlbmktaW52LScrZXh0cmFJZHNbaV0pKWFueUV4dHJhPXRydWU7fQogICAgICAgIGlmKGFueUV4dHJhKXsKICAgICAgICAgIHlQb3MrPTQ7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICAgIGRvYy50ZXh0KCdERVRBSUxTJywyMCx5UG9zKTt5UG9zKz02OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXsKICAgICAgICAgICAgdmFyIHY9dmFsKCdkZW5pLWludi0nK2V4dHJhSWRzW2ldKTsKICAgICAgICAgICAgaWYodil7ZG9jLnRleHQoZXh0cmFMYWJlbHNbaV0rJzogJyt2LDIwLHlQb3MpO3lQb3MrPTU7fQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgeVBvcys9ODsKICAgICAgICBkb2Muc2V0RmlsbENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy5yZWN0KDIwLHlQb3MsMTcwLDgsJ0YnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDI1NSwyNTUsMjU1KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSg5KTsKICAgICAgICBkb2MudGV4dCgnRGVzY3JpcHRpb24nLDIzLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnUXR5JywxMTAseVBvcys1LjUpOwogICAgICAgIGRvYy50ZXh0KCdQcmljZScsMTI3LHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVGF4JScsMTUwLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVG90YWwnLDE3MCx5UG9zKzUuNSk7CiAgICAgICAgeVBvcys9MTI7CgogICAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMTIsMCw1MCk7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIHZhciBzdWJ0b3RhbD0wLHRheEFtdD0wOwogICAgICAgIGZvcihpPTA7aTxsaW5lcy5sZW5ndGg7aSsrKXsKICAgICAgICAgIGlmKHlQb3M+MjcwKXtkb2MuYWRkUGFnZSgpO3lQb3M9MjA7fQogICAgICAgICAgdmFyIGxpbj1saW5lc1tpXTsKICAgICAgICAgIHZhciBscz1saW4ucXVhbnRpdHkqbGluLnVuaXRQcmljZTsKICAgICAgICAgIHZhciBsdD1scypsaW4udGF4UmF0ZS8xMDA7CiAgICAgICAgICBzdWJ0b3RhbCs9bHM7dGF4QW10Kz1sdDsKICAgICAgICAgIHZhciBkZXNjVHh0PShsaW4uZGVzY3JpcHRpb258fCcnKS5zbGljZSgwLDQ2KTsKICAgICAgICAgIGRvYy50ZXh0KGRlc2NUeHQsMjMseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChTdHJpbmcobGluLnF1YW50aXR5KSwxMTAseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChzeW0rbGluLnVuaXRQcmljZS50b0ZpeGVkKDIpLDEyNyx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KGxpbi50YXhSYXRlLnRvRml4ZWQoMikrJyUnLDE1MCx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KHN5bSsobHMrbHQpLnRvRml4ZWQoMiksMTcwLHlQb3MpOwogICAgICAgICAgeVBvcys9NjsKICAgICAgICB9CgogICAgICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgICAgICB2YXIgdG90YWw9c3VidG90YWwrdGF4QW10LWRpc2NvdW50OwogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgZG9jLnRleHQoJ1N1YnRvdGFsOicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bStzdWJ0b3RhbC50b0ZpeGVkKDIpLDE4OCx5UG9zLHthbGlnbjoncmlnaHQnfSk7CiAgICAgICAgeVBvcys9NjsKICAgICAgICBkb2MudGV4dCgnVGF4OicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bSt0YXhBbXQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIGlmKGRpc2NvdW50PjApewogICAgICAgICAgeVBvcys9NjsKICAgICAgICAgIGRvYy50ZXh0KCdEaXNjb3VudDonLDEzNSx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KCctJytzeW0rZGlzY291bnQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIH0KICAgICAgICB5UG9zKz04OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDEzKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy50ZXh0KCdUb3RhbDonLDEzNSx5UG9zKTsKICAgICAgICBkb2MudGV4dChzeW0rdG90YWwudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwoKICAgICAgICB2YXIgcHRlcm1zPXZhbCgnZGVuaS1pbnYtcGF5bWVudC10ZXJtcycpOwogICAgICAgIGlmKHB0ZXJtcyl7CiAgICAgICAgICB5UG9zKz0xNDsKICAgICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdQYXltZW50IFRlcm1zJywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPTU7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnbm9ybWFsJyk7CiAgICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgICB2YXIgcHRMaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKHB0ZXJtcywxNzApOwogICAgICAgICAgZG9jLnRleHQocHRMaW5lcywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPXB0TGluZXMubGVuZ3RoKjU7CiAgICAgICAgfQoKICAgICAgICB2YXIgbm90ZXNWYWw9dmFsKCdkZW5pLWludi1ub3RlcycpOwogICAgICAgIGlmKG5vdGVzVmFsKXsKICAgICAgICAgIHlQb3MrPTY7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdOb3RlcycsMjAseVBvcyk7CiAgICAgICAgICB5UG9zKz01OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcig5MCw4NSwxMTIpOwogICAgICAgICAgdmFyIG5MaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKG5vdGVzVmFsLDE3MCk7CiAgICAgICAgICBkb2MudGV4dChuTGluZXMsMjAseVBvcyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZm5hbWU9dmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpfHwnaW52b2ljZSc7CiAgICAgICAgZG9jLnNhdmUoJ0ludm9pY2VfJytmbmFtZSsnLnBkZicpOwogICAgICAgIHNob3dUb2FzdCgnUERGIGRvd25sb2FkZWQuJywnc3VjY2VzcycpOwogICAgICB9Y2F0Y2goZXJyKXsKICAgICAgICBzaG93VG9hc3QoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBQREY6ICcrKGVyciYmZXJyLm1lc3NhZ2U\/ZXJyLm1lc3NhZ2U6ZXJyKSwnZXJyJyk7CiAgICAgIH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycil7CiAgICAgIHNob3dUb2FzdCgnQ291bGQgbm90IGxvYWQgUERGIGxpYnJhcnk6ICcrZXJyLm1lc3NhZ2UsJ2VycicpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzY3JvbGwoKXt2YXIgdD0kKCdkZW5pLWludi1nZW5lcmF0b3InKTtpZih0JiZ0LnNjcm9sbEludG9WaWV3KXQuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnLGJsb2NrOidzdGFydCd9KTt9CgogIGZ1bmN0aW9uIGJvb3QoKXsKICAgIGlmKGJvb3RlZClyZXR1cm47Ym9vdGVkPXRydWU7CiAgICAvLyBXaXJlIGdlbmVyaWMgaW5wdXQgbGlzdGVuZXJzIHRvIGtlZXAgdG90YWxzIGxpdmUKICAgIHZhciBpbnB1dHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2RlbmktaW52LWdlbmVyYXRvciBpbnB1dCwgI2RlbmktaW52LWdlbmVyYXRvciBzZWxlY3QnKTsKICAgIHZhciBpO2ZvcihpPTA7aTxpbnB1dHMubGVuZ3RoO2krKyl7aW5wdXRzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JyxyZWNvbXB1dGUpO2lucHV0c1tpXS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLHJlY29tcHV0ZSk7fQogICAgLy8gU2VlZCBpbnZvaWNlIG51bWJlciArIGRhdGVzIGlmIGJsYW5rIChoYW5kbGVzIGZyZXNoIHBhZ2UgbG9hZCkKICAgIHZhciBkPW5ldyBEYXRlKCk7CiAgICBpZighdmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpKXNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBpZighdmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpc2V0VmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJyxkLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICBpZighdmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKXNldFZhbCgnZGVuaS1pbnYtZHVlLWRhdGUnLG5ldyBEYXRlKGQuZ2V0VGltZSgpKzMwKjI0KjYwKjYwKjEwMDApLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIHdpbmRvdy5hc2NJbnY9d2luZG93LmFzY0ludnx8ewogICAgYm9vdDpib290LGFkZExpbmU6YWRkTGluZSxyZW1vdmVMaW5lOnJlbW92ZUxpbmUscmVjb21wdXRlOnJlY29tcHV0ZSwKICAgIGRvd25sb2FkOmRvd25sb2FkLHJlc2V0OnJlc2V0LHNjcm9sbDpzY3JvbGwKICB9OwogIGJvb3QoKTsKfSkoKTs=')))();}window.deniInv&#038;&#038;window.deniInv.recompute&#038;&#038;window.deniInv.recompute();\"><\/div>\n<\/div>\n<div class=\"deni-inv-line-grid-3\">\n<div class=\"deni-inv-field\"><label>Quantity<\/label><input type=\"number\" min=\"0\" step=\"0.01\" data-line-field=\"quantity\" value=\"1\" oninput=\"if(!window.deniInvBooted){window.deniInvBooted=1;(new Function(atob('KGZ1bmN0aW9uKCl7CiAgdmFyIGJvb3RlZD1mYWxzZTsKICBmdW5jdGlvbiAkKGlkKXtyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO30KICBmdW5jdGlvbiB2YWwoaWQpe3ZhciBlbD0kKGlkKTtyZXR1cm4gZWw\/ZWwudmFsdWU6Jyc7fQogIGZ1bmN0aW9uIHNldFZhbChpZCx2KXt2YXIgZWw9JChpZCk7aWYoZWwpZWwudmFsdWU9djt9CiAgZnVuY3Rpb24gbnVtKHYpe3ZhciBuPXBhcnNlRmxvYXQodik7cmV0dXJuIGlzRmluaXRlKG4pP246MDt9CiAgZnVuY3Rpb24gZm10KG4sY3VyKXtjdXI9Y3VyfHwnVVNEJzt0cnl7cmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCgnZW4tVVMnLHtzdHlsZTonY3VycmVuY3knLGN1cnJlbmN5OmN1cixtaW5pbXVtRnJhY3Rpb25EaWdpdHM6Mn0pLmZvcm1hdChOdW1iZXIobil8fDApO31jYXRjaChfKXtyZXR1cm4gJyQnKygoTnVtYmVyKG4pfHwwKS50b0ZpeGVkKDIpKTt9fQogIGZ1bmN0aW9uIGN1clN5bShjKXt2YXIgbT17VVNEOickJyxFVVI6J+KCrCcsR0JQOifCoycsSU5SOifigrknLEFVRDonQSQnLENBRDonQyQnfTtyZXR1cm4gbVtjXXx8JyQnO30KICBmdW5jdGlvbiBmbXREYXRlKHMpe2lmKCFzKXJldHVybiAnJzt0cnl7dmFyIGQ9bmV3IERhdGUocyk7aWYoaXNOYU4oZCkpcmV0dXJuIHM7cmV0dXJuIGQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycse3llYXI6J251bWVyaWMnLG1vbnRoOidzaG9ydCcsZGF5OidudW1lcmljJ30pO31jYXRjaChfKXtyZXR1cm4gczt9fQogIGZ1bmN0aW9uIHVpZCgpe3JldHVybiAnbGknK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxZTkpLnRvU3RyaW5nKDM2KTt9CgogIGZ1bmN0aW9uIGxpbmVSb3dIdG1sKGlkKXsKICAgIHJldHVybiAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1pdGVtIiBkYXRhLWxpbmUtaWQ9IicraWQrJyIgaWQ9ImRlbmktaW52LWxpbmUtJytpZCsnIj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkIj48c3BhbiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkLWxhYmVsIj5MaW5lIEl0ZW08L3NwYW4+JysKICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJkZW5pLWludi1saW5lLXJlbW92ZSIgYXJpYS1sYWJlbD0iUmVtb3ZlIiBvbmNsaWNrPSJ3aW5kb3cuYXNjSW52JiZ3aW5kb3cuYXNjSW52LnJlbW92ZUxpbmUoXCcnK2lkKydcJykiPlx1MDBENzwvYnV0dG9uPicrCiAgICAgICc8L2Rpdj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1ncmlkIj4nKwogICAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1maWVsZCI+PGxhYmVsPkRlc2NyaXB0aW9uPC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgZGF0YS1saW5lLWZpZWxkPSJkZXNjcmlwdGlvbiIgcGxhY2Vob2xkZXI9IlNlcnZpY2Ugb3IgcHJvZHVjdCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLWdyaWQtMyI+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5RdWFudGl0eTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBzdGVwPSIwLjAxIiBkYXRhLWxpbmUtZmllbGQ9InF1YW50aXR5IiB2YWx1ZT0iMSIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5Vbml0IFByaWNlPC9sYWJlbD48aW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49IjAiIHN0ZXA9IjAuMDEiIGRhdGEtbGluZS1maWVsZD0idW5pdFByaWNlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5UYXggJTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9IjEwMCIgc3RlcD0iMC4wMSIgZGF0YS1saW5lLWZpZWxkPSJ0YXhSYXRlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLXRvdGFsIj48c3Bhbj5MaW5lIFRvdGFsPC9zcGFuPjxzdHJvbmcgZGF0YS1saW5lLXRvdGFsPiQwLjAwPC9zdHJvbmc+PC9kaXY+JysKICAgICc8L2Rpdj4nOwogIH0KCiAgZnVuY3Rpb24gcmVhZExpbmVzKCl7CiAgICB2YXIgcm93cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZGVuaS1pbnYtbGluZXMgLmRlbmktaW52LWxpbmUtaXRlbScpOwogICAgdmFyIGFycj1bXSxpLHJvdyxkZXNjLHF0eSxwcmljZSx0YXg7CiAgICBmb3IoaT0wO2k8cm93cy5sZW5ndGg7aSsrKXsKICAgICAgcm93PXJvd3NbaV07CiAgICAgIGRlc2M9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9ImRlc2NyaXB0aW9uIl0nKTsKICAgICAgcXR5PXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJxdWFudGl0eSJdJyk7CiAgICAgIHByaWNlPXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJ1bml0UHJpY2UiXScpOwogICAgICB0YXg9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9InRheFJhdGUiXScpOwogICAgICBhcnIucHVzaCh7CiAgICAgICAgZWw6cm93LAogICAgICAgIGRlc2NyaXB0aW9uOmRlc2M\/ZGVzYy52YWx1ZTonJywKICAgICAgICBxdWFudGl0eTpudW0ocXR5JiZxdHkudmFsdWUpLAogICAgICAgIHVuaXRQcmljZTpudW0ocHJpY2UmJnByaWNlLnZhbHVlKSwKICAgICAgICB0YXhSYXRlOm51bSh0YXgmJnRheC52YWx1ZSkKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gYXJyOwogIH0KCiAgZnVuY3Rpb24gcmVjb21wdXRlKCl7CiAgICB2YXIgY3VyPXZhbCgnZGVuaS1pbnYtY3VycmVuY3knKXx8J1VTRCc7CiAgICB2YXIgc3ltPWN1clN5bShjdXIpOwogICAgdmFyIGxpbmVzPXJlYWRMaW5lcygpOwogICAgdmFyIHN1YnRvdGFsPTAsdGF4PTAsaSxsaW5lLGxpbmVTdWIsbGluZVRheCx0b3RhbEVsOwogICAgZm9yKGk9MDtpPGxpbmVzLmxlbmd0aDtpKyspewogICAgICBsaW5lPWxpbmVzW2ldOwogICAgICBsaW5lU3ViPWxpbmUucXVhbnRpdHkqbGluZS51bml0UHJpY2U7CiAgICAgIGxpbmVUYXg9bGluZVN1YipsaW5lLnRheFJhdGUvMTAwOwogICAgICBzdWJ0b3RhbCs9bGluZVN1YjsKICAgICAgdGF4Kz1saW5lVGF4OwogICAgICB0b3RhbEVsPWxpbmUuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbGluZS10b3RhbF0nKTsKICAgICAgaWYodG90YWxFbCl0b3RhbEVsLnRleHRDb250ZW50PWZtdChsaW5lU3ViK2xpbmVUYXgsY3VyKTsKICAgIH0KICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgIHZhciB0b3RhbD1zdWJ0b3RhbCt0YXgtZGlzY291bnQ7CiAgICB2YXIgc3ViRWw9JCgnZGVuaS1pbnYtc3VidG90YWwnKTtpZihzdWJFbClzdWJFbC50ZXh0Q29udGVudD1mbXQoc3VidG90YWwsY3VyKTsKICAgIHZhciB0YXhFbD0kKCdkZW5pLWludi10YXgnKTtpZih0YXhFbCl0YXhFbC50ZXh0Q29udGVudD1mbXQodGF4LGN1cik7CiAgICB2YXIgZGlzY0VsPSQoJ2RlbmktaW52LWRpc2NvdW50LWRpc3BsYXknKTtpZihkaXNjRWwpZGlzY0VsLnRleHRDb250ZW50PSctJytmbXQoZGlzY291bnQsY3VyKTsKICAgIHZhciB0b3RFbD0kKCdkZW5pLWludi10b3RhbCcpO2lmKHRvdEVsKXRvdEVsLnRleHRDb250ZW50PWZtdCh0b3RhbCxjdXIpOwogICAgLy8gS2VlcCBjdXJyZW5jeSBzeW1ib2wgaW4gc3VtbWFyeSBpbiBzeW5jCiAgICB2YXIgc3ltRWxzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWN1ci1zeW1dJyk7CiAgICBmb3IoaT0wO2k8c3ltRWxzLmxlbmd0aDtpKyspc3ltRWxzW2ldLnRleHRDb250ZW50PXN5bTsKICB9CgogIGZ1bmN0aW9uIGFkZExpbmUoKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIGJveC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsbGluZVJvd0h0bWwodWlkKCkpKTsKICAgIHJlY29tcHV0ZSgpOwogIH0KICBmdW5jdGlvbiByZW1vdmVMaW5lKGlkKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIHZhciByb3dzPWJveC5xdWVyeVNlbGVjdG9yQWxsKCcuZGVuaS1pbnYtbGluZS1pdGVtJyk7CiAgICBpZihyb3dzLmxlbmd0aDw9MSlyZXR1cm47CiAgICB2YXIgcm93PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZW5pLWludi1saW5lLScraWQpOwogICAgaWYocm93KXJvdy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHJvdyk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIGZ1bmN0aW9uIHNob3dUb2FzdChtc2csa2luZCl7CiAgICB2YXIgdD0kKCdkZW5pLWludi10b2FzdCcpO2lmKCF0KXJldHVybjsKICAgIHQudGV4dENvbnRlbnQ9bXNnOwogICAgdC5jbGFzc05hbWU9J2RlbmktaW52LXRvYXN0IGRlbmktaW52LXRvYXN0LXNob3cnKyhraW5kPT09J3N1Y2Nlc3MnPycgZGVuaS1pbnYtdG9hc3Qtc3VjY2Vzcyc6JycpOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xhc3NOYW1lPSdkZW5pLWludi10b2FzdCc7fSwzNTAwKTsKICB9CgogIGZ1bmN0aW9uIHJlc2V0KCl7CiAgICB2YXIgZGVmcz17J2RlbmktaW52LWJ1c2luZXNzLW5hbWUnOicnLCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJzonJywnZGVuaS1pbnYtYnVzaW5lc3MtY29udGFjdCc6JycsJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCc6JycsJ2RlbmktaW52LWNsaWVudC1uYW1lJzonJywnZGVuaS1pbnYtY2xpZW50LWNvbXBhbnknOicnLCdkZW5pLWludi1jbGllbnQtYWRkcmVzcyc6JycsJ2RlbmktaW52LWNsaWVudC1jb250YWN0JzonJywnZGVuaS1pbnYtZGlzY291bnQnOicwJywnZGVuaS1pbnYtcGF5bWVudC10ZXJtcyc6IlBhdGllbnQgcG9ydGlvbiBkdWUgYXQgdGltZSBvZiBzZXJ2aWNlLiBJbnN1cmFuY2UgYmFsYW5jZSBiaWxsZWQgdG8gY2Fycmllci4iLCdkZW5pLWludi1ub3Rlcyc6Jyd9OwogICAgdmFyIGs7Zm9yKGsgaW4gZGVmcylzZXRWYWwoayxkZWZzW2tdKTsKICAgIGlmKCQoJ2RlbmktaW52LXBhdGllbnQtaWQnKSkkKCdkZW5pLWludi1wYXRpZW50LWlkJykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtZGF0ZS1vZi10cmVhdG1lbnQnKSkkKCdkZW5pLWludi1kYXRlLW9mLXRyZWF0bWVudCcpLnZhbHVlPScnO2lmKCQoJ2RlbmktaW52LXRyZWF0aW5nLWRlbnRpc3QnKSkkKCdkZW5pLWludi10cmVhdGluZy1kZW50aXN0JykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtaW5zdXJhbmNlLXBvbGljeScpKSQoJ2RlbmktaW52LWluc3VyYW5jZS1wb2xpY3knKS52YWx1ZT0nJztpZigkKCdkZW5pLWludi1wcmlvci1hdXRob3JpemF0aW9uJykpJCgnZGVuaS1pbnYtcHJpb3ItYXV0aG9yaXphdGlvbicpLnZhbHVlPScnOwogICAgdmFyIGQ9bmV3IERhdGUoKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWlzc3VlLWRhdGUnLGQudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHZhciBkdWU9bmV3IERhdGUoZC5nZXRUaW1lKCkrMzAqMjQqNjAqNjAqMTAwMCk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWR1ZS1kYXRlJyxkdWUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtY3VycmVuY3knLCdVU0QnKTsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTsKICAgIGlmKGJveCl7Ym94LmlubmVySFRNTD1saW5lUm93SHRtbCh1aWQoKSk7fQogICAgcmVjb21wdXRlKCk7CiAgfQoKICB2YXIganNQZGZQcm9taXNlPW51bGw7CiAgZnVuY3Rpb24gZW5zdXJlSnNQREYoKXsKICAgIGlmKGpzUGRmUHJvbWlzZSlyZXR1cm4ganNQZGZQcm9taXNlOwogICAganNQZGZQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXsKICAgICAgaWYod2luZG93LmpzcGRmJiZ3aW5kb3cuanNwZGYuanNQREYpcmV0dXJuIHJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTsKICAgICAgdmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgIHMuc3JjPSdodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9qc3BkZi8yLjUuMS9qc3BkZi51bWQubWluLmpzJzsKICAgICAgcy5hc3luYz10cnVlOwogICAgICBzLm9ubG9hZD1mdW5jdGlvbigpe2lmKHdpbmRvdy5qc3BkZiYmd2luZG93LmpzcGRmLmpzUERGKXJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTtlbHNlIHJlamVjdChuZXcgRXJyb3IoJ2pzUERGIG5vdCBhdmFpbGFibGUnKSk7fTsKICAgICAgcy5vbmVycm9yPWZ1bmN0aW9uKCl7cmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQganNQREYgZnJvbSBDRE4nKSk7fTsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTsKICAgIH0pOwogICAgcmV0dXJuIGpzUGRmUHJvbWlzZTsKICB9CgogIGZ1bmN0aW9uIGRvd25sb2FkKCl7CiAgICB2YXIgYnVzaW5lc3NOYW1lPXZhbCgnZGVuaS1pbnYtYnVzaW5lc3MtbmFtZScpLnRyaW0oKTsKICAgIHZhciBjbGllbnROYW1lPXZhbCgnZGVuaS1pbnYtY2xpZW50LW5hbWUnKS50cmltKCk7CiAgICBpZighYnVzaW5lc3NOYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB5b3VyIGJ1c2luZXNzIG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIGlmKCFjbGllbnROYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB0aGUgcmVjaXBpZW50IG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIHZhciBsaW5lcz1yZWFkTGluZXMoKTsKICAgIHZhciBoYXNJdGVtPWZhbHNlLGk7CiAgICBmb3IoaT0wO2k8bGluZXMubGVuZ3RoO2krKyl7aWYoKGxpbmVzW2ldLnF1YW50aXR5KmxpbmVzW2ldLnVuaXRQcmljZSk+MHx8KGxpbmVzW2ldLmRlc2NyaXB0aW9uJiZsaW5lc1tpXS5kZXNjcmlwdGlvbi5sZW5ndGg+MCkpe2hhc0l0ZW09dHJ1ZTticmVhazt9fQogICAgaWYoIWhhc0l0ZW0pe3Nob3dUb2FzdCgnUGxlYXNlIGFkZCBhdCBsZWFzdCBvbmUgbGluZSBpdGVtLicsJ2VycicpO3JldHVybjt9CiAgICBzaG93VG9hc3QoJ1ByZXBhcmluZyBQREYuLi4nLCdzdWNjZXNzJyk7CiAgICBlbnN1cmVKc1BERigpLnRoZW4oZnVuY3Rpb24oanNQREYpewogICAgICB0cnl7CiAgICAgICAgdmFyIGRvYz1uZXcganNQREYoe29yaWVudGF0aW9uOidwb3J0cmFpdCcsdW5pdDonbW0nLGZvcm1hdDonYTQnfSk7CiAgICAgICAgdmFyIGN1cj12YWwoJ2RlbmktaW52LWN1cnJlbmN5Jyl8fCdVU0QnOwogICAgICAgIHZhciBzeW09Y3VyU3ltKGN1cik7CiAgICAgICAgdmFyIHlQb3M9MjA7CgogICAgICAgIGRvYy5zZXRGb250U2l6ZSgyMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy50ZXh0KCJERU5UQUwgSU5WT0lDRSIsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTEyOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dChidXNpbmVzc05hbWUsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDkpOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgdmFyIGJpekFkZHI9dmFsKCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJyk7CiAgICAgICAgdmFyIGJpekNvbnRhY3Q9dmFsKCdkZW5pLWludi1idXNpbmVzcy1jb250YWN0Jyk7CiAgICAgICAgdmFyIGJpelRheD12YWwoJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCcpOwogICAgICAgIGlmKGJpekFkZHIpe2RvYy50ZXh0KGJpekFkZHIsMjAseVBvcyk7eVBvcys9NTt9CiAgICAgICAgaWYoYml6Q29udGFjdCl7ZG9jLnRleHQoYml6Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICBpZihiaXpUYXgpe2RvYy50ZXh0KCdUYXggSUQ6ICcrYml6VGF4LDIwLHlQb3MpO3lQb3MrPTU7fQoKICAgICAgICBkb2Muc2V0Rm9udFNpemUoOSk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dCgnSW52b2ljZSAjOiAnK3ZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInKSwxNDAsMzApOwogICAgICAgIGRvYy50ZXh0KCdJc3N1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpLDE0MCwzNik7CiAgICAgICAgZG9jLnRleHQoJ0R1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKSwxNDAsNDIpOwogICAgICAgIGRvYy50ZXh0KCdDdXJyZW5jeTogJytjdXIsMTQwLDQ4KTsKCiAgICAgICAgeVBvcz1NYXRoLm1heCh5UG9zLDYwKTsKICAgICAgICBkb2Muc2V0Rm9udFNpemUoMTApOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2MudGV4dCgiUEFUSUVOVCBERVRBSUxTIiwyMCx5UG9zKTsKICAgICAgICB5UG9zKz02OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDEyLDAsNTApOwogICAgICAgIGRvYy50ZXh0KGNsaWVudE5hbWUsMjAseVBvcyk7eVBvcys9NTsKICAgICAgICB2YXIgY2xpZW50Q29tcGFueT12YWwoJ2RlbmktaW52LWNsaWVudC1jb21wYW55Jyk7CiAgICAgICAgaWYoY2xpZW50Q29tcGFueSl7ZG9jLnRleHQoY2xpZW50Q29tcGFueSwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50QWRkcj12YWwoJ2RlbmktaW52LWNsaWVudC1hZGRyZXNzJyk7CiAgICAgICAgaWYoY2xpZW50QWRkcil7ZG9jLnRleHQoY2xpZW50QWRkciwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50Q29udGFjdD12YWwoJ2RlbmktaW52LWNsaWVudC1jb250YWN0Jyk7CiAgICAgICAgaWYoY2xpZW50Q29udGFjdCl7ZG9jLnRleHQoY2xpZW50Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KCiAgICAgICAgLy8gRXh0cmEgZmllbGRzIGJsb2NrIChpZiBjb25maWcgZGVmaW5lZCBhbnkpCiAgICAgICAgdmFyIGV4dHJhSWRzPVsicGF0aWVudC1pZCIsImRhdGUtb2YtdHJlYXRtZW50IiwidHJlYXRpbmctZGVudGlzdCIsImluc3VyYW5jZS1wb2xpY3kiLCJwcmlvci1hdXRob3JpemF0aW9uIl07CiAgICAgICAgdmFyIGV4dHJhTGFiZWxzPVsiUGF0aWVudCBJRCAvIENoYXJ0ICMiLCJEYXRlIG9mIFRyZWF0bWVudCIsIlRyZWF0aW5nIERlbnRpc3QiLCJJbnN1cmFuY2UgUG9saWN5ICMiLCJQcmUtQXV0aG9yaXphdGlvbiAjIl07CiAgICAgICAgdmFyIGFueUV4dHJhPWZhbHNlOwogICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXtpZih2YWwoJ2RlbmktaW52LScrZXh0cmFJZHNbaV0pKWFueUV4dHJhPXRydWU7fQogICAgICAgIGlmKGFueUV4dHJhKXsKICAgICAgICAgIHlQb3MrPTQ7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICAgIGRvYy50ZXh0KCdERVRBSUxTJywyMCx5UG9zKTt5UG9zKz02OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXsKICAgICAgICAgICAgdmFyIHY9dmFsKCdkZW5pLWludi0nK2V4dHJhSWRzW2ldKTsKICAgICAgICAgICAgaWYodil7ZG9jLnRleHQoZXh0cmFMYWJlbHNbaV0rJzogJyt2LDIwLHlQb3MpO3lQb3MrPTU7fQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgeVBvcys9ODsKICAgICAgICBkb2Muc2V0RmlsbENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy5yZWN0KDIwLHlQb3MsMTcwLDgsJ0YnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDI1NSwyNTUsMjU1KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSg5KTsKICAgICAgICBkb2MudGV4dCgnRGVzY3JpcHRpb24nLDIzLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnUXR5JywxMTAseVBvcys1LjUpOwogICAgICAgIGRvYy50ZXh0KCdQcmljZScsMTI3LHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVGF4JScsMTUwLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVG90YWwnLDE3MCx5UG9zKzUuNSk7CiAgICAgICAgeVBvcys9MTI7CgogICAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMTIsMCw1MCk7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIHZhciBzdWJ0b3RhbD0wLHRheEFtdD0wOwogICAgICAgIGZvcihpPTA7aTxsaW5lcy5sZW5ndGg7aSsrKXsKICAgICAgICAgIGlmKHlQb3M+MjcwKXtkb2MuYWRkUGFnZSgpO3lQb3M9MjA7fQogICAgICAgICAgdmFyIGxpbj1saW5lc1tpXTsKICAgICAgICAgIHZhciBscz1saW4ucXVhbnRpdHkqbGluLnVuaXRQcmljZTsKICAgICAgICAgIHZhciBsdD1scypsaW4udGF4UmF0ZS8xMDA7CiAgICAgICAgICBzdWJ0b3RhbCs9bHM7dGF4QW10Kz1sdDsKICAgICAgICAgIHZhciBkZXNjVHh0PShsaW4uZGVzY3JpcHRpb258fCcnKS5zbGljZSgwLDQ2KTsKICAgICAgICAgIGRvYy50ZXh0KGRlc2NUeHQsMjMseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChTdHJpbmcobGluLnF1YW50aXR5KSwxMTAseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChzeW0rbGluLnVuaXRQcmljZS50b0ZpeGVkKDIpLDEyNyx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KGxpbi50YXhSYXRlLnRvRml4ZWQoMikrJyUnLDE1MCx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KHN5bSsobHMrbHQpLnRvRml4ZWQoMiksMTcwLHlQb3MpOwogICAgICAgICAgeVBvcys9NjsKICAgICAgICB9CgogICAgICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgICAgICB2YXIgdG90YWw9c3VidG90YWwrdGF4QW10LWRpc2NvdW50OwogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgZG9jLnRleHQoJ1N1YnRvdGFsOicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bStzdWJ0b3RhbC50b0ZpeGVkKDIpLDE4OCx5UG9zLHthbGlnbjoncmlnaHQnfSk7CiAgICAgICAgeVBvcys9NjsKICAgICAgICBkb2MudGV4dCgnVGF4OicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bSt0YXhBbXQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIGlmKGRpc2NvdW50PjApewogICAgICAgICAgeVBvcys9NjsKICAgICAgICAgIGRvYy50ZXh0KCdEaXNjb3VudDonLDEzNSx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KCctJytzeW0rZGlzY291bnQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIH0KICAgICAgICB5UG9zKz04OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDEzKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy50ZXh0KCdUb3RhbDonLDEzNSx5UG9zKTsKICAgICAgICBkb2MudGV4dChzeW0rdG90YWwudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwoKICAgICAgICB2YXIgcHRlcm1zPXZhbCgnZGVuaS1pbnYtcGF5bWVudC10ZXJtcycpOwogICAgICAgIGlmKHB0ZXJtcyl7CiAgICAgICAgICB5UG9zKz0xNDsKICAgICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdQYXltZW50IFRlcm1zJywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPTU7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnbm9ybWFsJyk7CiAgICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgICB2YXIgcHRMaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKHB0ZXJtcywxNzApOwogICAgICAgICAgZG9jLnRleHQocHRMaW5lcywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPXB0TGluZXMubGVuZ3RoKjU7CiAgICAgICAgfQoKICAgICAgICB2YXIgbm90ZXNWYWw9dmFsKCdkZW5pLWludi1ub3RlcycpOwogICAgICAgIGlmKG5vdGVzVmFsKXsKICAgICAgICAgIHlQb3MrPTY7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdOb3RlcycsMjAseVBvcyk7CiAgICAgICAgICB5UG9zKz01OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcig5MCw4NSwxMTIpOwogICAgICAgICAgdmFyIG5MaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKG5vdGVzVmFsLDE3MCk7CiAgICAgICAgICBkb2MudGV4dChuTGluZXMsMjAseVBvcyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZm5hbWU9dmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpfHwnaW52b2ljZSc7CiAgICAgICAgZG9jLnNhdmUoJ0ludm9pY2VfJytmbmFtZSsnLnBkZicpOwogICAgICAgIHNob3dUb2FzdCgnUERGIGRvd25sb2FkZWQuJywnc3VjY2VzcycpOwogICAgICB9Y2F0Y2goZXJyKXsKICAgICAgICBzaG93VG9hc3QoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBQREY6ICcrKGVyciYmZXJyLm1lc3NhZ2U\/ZXJyLm1lc3NhZ2U6ZXJyKSwnZXJyJyk7CiAgICAgIH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycil7CiAgICAgIHNob3dUb2FzdCgnQ291bGQgbm90IGxvYWQgUERGIGxpYnJhcnk6ICcrZXJyLm1lc3NhZ2UsJ2VycicpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzY3JvbGwoKXt2YXIgdD0kKCdkZW5pLWludi1nZW5lcmF0b3InKTtpZih0JiZ0LnNjcm9sbEludG9WaWV3KXQuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnLGJsb2NrOidzdGFydCd9KTt9CgogIGZ1bmN0aW9uIGJvb3QoKXsKICAgIGlmKGJvb3RlZClyZXR1cm47Ym9vdGVkPXRydWU7CiAgICAvLyBXaXJlIGdlbmVyaWMgaW5wdXQgbGlzdGVuZXJzIHRvIGtlZXAgdG90YWxzIGxpdmUKICAgIHZhciBpbnB1dHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2RlbmktaW52LWdlbmVyYXRvciBpbnB1dCwgI2RlbmktaW52LWdlbmVyYXRvciBzZWxlY3QnKTsKICAgIHZhciBpO2ZvcihpPTA7aTxpbnB1dHMubGVuZ3RoO2krKyl7aW5wdXRzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JyxyZWNvbXB1dGUpO2lucHV0c1tpXS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLHJlY29tcHV0ZSk7fQogICAgLy8gU2VlZCBpbnZvaWNlIG51bWJlciArIGRhdGVzIGlmIGJsYW5rIChoYW5kbGVzIGZyZXNoIHBhZ2UgbG9hZCkKICAgIHZhciBkPW5ldyBEYXRlKCk7CiAgICBpZighdmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpKXNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBpZighdmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpc2V0VmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJyxkLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICBpZighdmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKXNldFZhbCgnZGVuaS1pbnYtZHVlLWRhdGUnLG5ldyBEYXRlKGQuZ2V0VGltZSgpKzMwKjI0KjYwKjYwKjEwMDApLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIHdpbmRvdy5hc2NJbnY9d2luZG93LmFzY0ludnx8ewogICAgYm9vdDpib290LGFkZExpbmU6YWRkTGluZSxyZW1vdmVMaW5lOnJlbW92ZUxpbmUscmVjb21wdXRlOnJlY29tcHV0ZSwKICAgIGRvd25sb2FkOmRvd25sb2FkLHJlc2V0OnJlc2V0LHNjcm9sbDpzY3JvbGwKICB9OwogIGJvb3QoKTsKfSkoKTs=')))();}window.deniInv&#038;&#038;window.deniInv.recompute&#038;&#038;window.deniInv.recompute();\"><\/div>\n<div class=\"deni-inv-field\"><label>Unit Price<\/label><input type=\"number\" min=\"0\" step=\"0.01\" data-line-field=\"unitPrice\" value=\"0\" oninput=\"if(!window.deniInvBooted){window.deniInvBooted=1;(new Function(atob('KGZ1bmN0aW9uKCl7CiAgdmFyIGJvb3RlZD1mYWxzZTsKICBmdW5jdGlvbiAkKGlkKXtyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO30KICBmdW5jdGlvbiB2YWwoaWQpe3ZhciBlbD0kKGlkKTtyZXR1cm4gZWw\/ZWwudmFsdWU6Jyc7fQogIGZ1bmN0aW9uIHNldFZhbChpZCx2KXt2YXIgZWw9JChpZCk7aWYoZWwpZWwudmFsdWU9djt9CiAgZnVuY3Rpb24gbnVtKHYpe3ZhciBuPXBhcnNlRmxvYXQodik7cmV0dXJuIGlzRmluaXRlKG4pP246MDt9CiAgZnVuY3Rpb24gZm10KG4sY3VyKXtjdXI9Y3VyfHwnVVNEJzt0cnl7cmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCgnZW4tVVMnLHtzdHlsZTonY3VycmVuY3knLGN1cnJlbmN5OmN1cixtaW5pbXVtRnJhY3Rpb25EaWdpdHM6Mn0pLmZvcm1hdChOdW1iZXIobil8fDApO31jYXRjaChfKXtyZXR1cm4gJyQnKygoTnVtYmVyKG4pfHwwKS50b0ZpeGVkKDIpKTt9fQogIGZ1bmN0aW9uIGN1clN5bShjKXt2YXIgbT17VVNEOickJyxFVVI6J+KCrCcsR0JQOifCoycsSU5SOifigrknLEFVRDonQSQnLENBRDonQyQnfTtyZXR1cm4gbVtjXXx8JyQnO30KICBmdW5jdGlvbiBmbXREYXRlKHMpe2lmKCFzKXJldHVybiAnJzt0cnl7dmFyIGQ9bmV3IERhdGUocyk7aWYoaXNOYU4oZCkpcmV0dXJuIHM7cmV0dXJuIGQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycse3llYXI6J251bWVyaWMnLG1vbnRoOidzaG9ydCcsZGF5OidudW1lcmljJ30pO31jYXRjaChfKXtyZXR1cm4gczt9fQogIGZ1bmN0aW9uIHVpZCgpe3JldHVybiAnbGknK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxZTkpLnRvU3RyaW5nKDM2KTt9CgogIGZ1bmN0aW9uIGxpbmVSb3dIdG1sKGlkKXsKICAgIHJldHVybiAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1pdGVtIiBkYXRhLWxpbmUtaWQ9IicraWQrJyIgaWQ9ImRlbmktaW52LWxpbmUtJytpZCsnIj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkIj48c3BhbiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkLWxhYmVsIj5MaW5lIEl0ZW08L3NwYW4+JysKICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJkZW5pLWludi1saW5lLXJlbW92ZSIgYXJpYS1sYWJlbD0iUmVtb3ZlIiBvbmNsaWNrPSJ3aW5kb3cuYXNjSW52JiZ3aW5kb3cuYXNjSW52LnJlbW92ZUxpbmUoXCcnK2lkKydcJykiPlx1MDBENzwvYnV0dG9uPicrCiAgICAgICc8L2Rpdj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1ncmlkIj4nKwogICAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1maWVsZCI+PGxhYmVsPkRlc2NyaXB0aW9uPC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgZGF0YS1saW5lLWZpZWxkPSJkZXNjcmlwdGlvbiIgcGxhY2Vob2xkZXI9IlNlcnZpY2Ugb3IgcHJvZHVjdCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLWdyaWQtMyI+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5RdWFudGl0eTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBzdGVwPSIwLjAxIiBkYXRhLWxpbmUtZmllbGQ9InF1YW50aXR5IiB2YWx1ZT0iMSIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5Vbml0IFByaWNlPC9sYWJlbD48aW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49IjAiIHN0ZXA9IjAuMDEiIGRhdGEtbGluZS1maWVsZD0idW5pdFByaWNlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5UYXggJTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9IjEwMCIgc3RlcD0iMC4wMSIgZGF0YS1saW5lLWZpZWxkPSJ0YXhSYXRlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLXRvdGFsIj48c3Bhbj5MaW5lIFRvdGFsPC9zcGFuPjxzdHJvbmcgZGF0YS1saW5lLXRvdGFsPiQwLjAwPC9zdHJvbmc+PC9kaXY+JysKICAgICc8L2Rpdj4nOwogIH0KCiAgZnVuY3Rpb24gcmVhZExpbmVzKCl7CiAgICB2YXIgcm93cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZGVuaS1pbnYtbGluZXMgLmRlbmktaW52LWxpbmUtaXRlbScpOwogICAgdmFyIGFycj1bXSxpLHJvdyxkZXNjLHF0eSxwcmljZSx0YXg7CiAgICBmb3IoaT0wO2k8cm93cy5sZW5ndGg7aSsrKXsKICAgICAgcm93PXJvd3NbaV07CiAgICAgIGRlc2M9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9ImRlc2NyaXB0aW9uIl0nKTsKICAgICAgcXR5PXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJxdWFudGl0eSJdJyk7CiAgICAgIHByaWNlPXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJ1bml0UHJpY2UiXScpOwogICAgICB0YXg9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9InRheFJhdGUiXScpOwogICAgICBhcnIucHVzaCh7CiAgICAgICAgZWw6cm93LAogICAgICAgIGRlc2NyaXB0aW9uOmRlc2M\/ZGVzYy52YWx1ZTonJywKICAgICAgICBxdWFudGl0eTpudW0ocXR5JiZxdHkudmFsdWUpLAogICAgICAgIHVuaXRQcmljZTpudW0ocHJpY2UmJnByaWNlLnZhbHVlKSwKICAgICAgICB0YXhSYXRlOm51bSh0YXgmJnRheC52YWx1ZSkKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gYXJyOwogIH0KCiAgZnVuY3Rpb24gcmVjb21wdXRlKCl7CiAgICB2YXIgY3VyPXZhbCgnZGVuaS1pbnYtY3VycmVuY3knKXx8J1VTRCc7CiAgICB2YXIgc3ltPWN1clN5bShjdXIpOwogICAgdmFyIGxpbmVzPXJlYWRMaW5lcygpOwogICAgdmFyIHN1YnRvdGFsPTAsdGF4PTAsaSxsaW5lLGxpbmVTdWIsbGluZVRheCx0b3RhbEVsOwogICAgZm9yKGk9MDtpPGxpbmVzLmxlbmd0aDtpKyspewogICAgICBsaW5lPWxpbmVzW2ldOwogICAgICBsaW5lU3ViPWxpbmUucXVhbnRpdHkqbGluZS51bml0UHJpY2U7CiAgICAgIGxpbmVUYXg9bGluZVN1YipsaW5lLnRheFJhdGUvMTAwOwogICAgICBzdWJ0b3RhbCs9bGluZVN1YjsKICAgICAgdGF4Kz1saW5lVGF4OwogICAgICB0b3RhbEVsPWxpbmUuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbGluZS10b3RhbF0nKTsKICAgICAgaWYodG90YWxFbCl0b3RhbEVsLnRleHRDb250ZW50PWZtdChsaW5lU3ViK2xpbmVUYXgsY3VyKTsKICAgIH0KICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgIHZhciB0b3RhbD1zdWJ0b3RhbCt0YXgtZGlzY291bnQ7CiAgICB2YXIgc3ViRWw9JCgnZGVuaS1pbnYtc3VidG90YWwnKTtpZihzdWJFbClzdWJFbC50ZXh0Q29udGVudD1mbXQoc3VidG90YWwsY3VyKTsKICAgIHZhciB0YXhFbD0kKCdkZW5pLWludi10YXgnKTtpZih0YXhFbCl0YXhFbC50ZXh0Q29udGVudD1mbXQodGF4LGN1cik7CiAgICB2YXIgZGlzY0VsPSQoJ2RlbmktaW52LWRpc2NvdW50LWRpc3BsYXknKTtpZihkaXNjRWwpZGlzY0VsLnRleHRDb250ZW50PSctJytmbXQoZGlzY291bnQsY3VyKTsKICAgIHZhciB0b3RFbD0kKCdkZW5pLWludi10b3RhbCcpO2lmKHRvdEVsKXRvdEVsLnRleHRDb250ZW50PWZtdCh0b3RhbCxjdXIpOwogICAgLy8gS2VlcCBjdXJyZW5jeSBzeW1ib2wgaW4gc3VtbWFyeSBpbiBzeW5jCiAgICB2YXIgc3ltRWxzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWN1ci1zeW1dJyk7CiAgICBmb3IoaT0wO2k8c3ltRWxzLmxlbmd0aDtpKyspc3ltRWxzW2ldLnRleHRDb250ZW50PXN5bTsKICB9CgogIGZ1bmN0aW9uIGFkZExpbmUoKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIGJveC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsbGluZVJvd0h0bWwodWlkKCkpKTsKICAgIHJlY29tcHV0ZSgpOwogIH0KICBmdW5jdGlvbiByZW1vdmVMaW5lKGlkKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIHZhciByb3dzPWJveC5xdWVyeVNlbGVjdG9yQWxsKCcuZGVuaS1pbnYtbGluZS1pdGVtJyk7CiAgICBpZihyb3dzLmxlbmd0aDw9MSlyZXR1cm47CiAgICB2YXIgcm93PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZW5pLWludi1saW5lLScraWQpOwogICAgaWYocm93KXJvdy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHJvdyk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIGZ1bmN0aW9uIHNob3dUb2FzdChtc2csa2luZCl7CiAgICB2YXIgdD0kKCdkZW5pLWludi10b2FzdCcpO2lmKCF0KXJldHVybjsKICAgIHQudGV4dENvbnRlbnQ9bXNnOwogICAgdC5jbGFzc05hbWU9J2RlbmktaW52LXRvYXN0IGRlbmktaW52LXRvYXN0LXNob3cnKyhraW5kPT09J3N1Y2Nlc3MnPycgZGVuaS1pbnYtdG9hc3Qtc3VjY2Vzcyc6JycpOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xhc3NOYW1lPSdkZW5pLWludi10b2FzdCc7fSwzNTAwKTsKICB9CgogIGZ1bmN0aW9uIHJlc2V0KCl7CiAgICB2YXIgZGVmcz17J2RlbmktaW52LWJ1c2luZXNzLW5hbWUnOicnLCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJzonJywnZGVuaS1pbnYtYnVzaW5lc3MtY29udGFjdCc6JycsJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCc6JycsJ2RlbmktaW52LWNsaWVudC1uYW1lJzonJywnZGVuaS1pbnYtY2xpZW50LWNvbXBhbnknOicnLCdkZW5pLWludi1jbGllbnQtYWRkcmVzcyc6JycsJ2RlbmktaW52LWNsaWVudC1jb250YWN0JzonJywnZGVuaS1pbnYtZGlzY291bnQnOicwJywnZGVuaS1pbnYtcGF5bWVudC10ZXJtcyc6IlBhdGllbnQgcG9ydGlvbiBkdWUgYXQgdGltZSBvZiBzZXJ2aWNlLiBJbnN1cmFuY2UgYmFsYW5jZSBiaWxsZWQgdG8gY2Fycmllci4iLCdkZW5pLWludi1ub3Rlcyc6Jyd9OwogICAgdmFyIGs7Zm9yKGsgaW4gZGVmcylzZXRWYWwoayxkZWZzW2tdKTsKICAgIGlmKCQoJ2RlbmktaW52LXBhdGllbnQtaWQnKSkkKCdkZW5pLWludi1wYXRpZW50LWlkJykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtZGF0ZS1vZi10cmVhdG1lbnQnKSkkKCdkZW5pLWludi1kYXRlLW9mLXRyZWF0bWVudCcpLnZhbHVlPScnO2lmKCQoJ2RlbmktaW52LXRyZWF0aW5nLWRlbnRpc3QnKSkkKCdkZW5pLWludi10cmVhdGluZy1kZW50aXN0JykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtaW5zdXJhbmNlLXBvbGljeScpKSQoJ2RlbmktaW52LWluc3VyYW5jZS1wb2xpY3knKS52YWx1ZT0nJztpZigkKCdkZW5pLWludi1wcmlvci1hdXRob3JpemF0aW9uJykpJCgnZGVuaS1pbnYtcHJpb3ItYXV0aG9yaXphdGlvbicpLnZhbHVlPScnOwogICAgdmFyIGQ9bmV3IERhdGUoKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWlzc3VlLWRhdGUnLGQudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHZhciBkdWU9bmV3IERhdGUoZC5nZXRUaW1lKCkrMzAqMjQqNjAqNjAqMTAwMCk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWR1ZS1kYXRlJyxkdWUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtY3VycmVuY3knLCdVU0QnKTsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTsKICAgIGlmKGJveCl7Ym94LmlubmVySFRNTD1saW5lUm93SHRtbCh1aWQoKSk7fQogICAgcmVjb21wdXRlKCk7CiAgfQoKICB2YXIganNQZGZQcm9taXNlPW51bGw7CiAgZnVuY3Rpb24gZW5zdXJlSnNQREYoKXsKICAgIGlmKGpzUGRmUHJvbWlzZSlyZXR1cm4ganNQZGZQcm9taXNlOwogICAganNQZGZQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXsKICAgICAgaWYod2luZG93LmpzcGRmJiZ3aW5kb3cuanNwZGYuanNQREYpcmV0dXJuIHJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTsKICAgICAgdmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgIHMuc3JjPSdodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9qc3BkZi8yLjUuMS9qc3BkZi51bWQubWluLmpzJzsKICAgICAgcy5hc3luYz10cnVlOwogICAgICBzLm9ubG9hZD1mdW5jdGlvbigpe2lmKHdpbmRvdy5qc3BkZiYmd2luZG93LmpzcGRmLmpzUERGKXJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTtlbHNlIHJlamVjdChuZXcgRXJyb3IoJ2pzUERGIG5vdCBhdmFpbGFibGUnKSk7fTsKICAgICAgcy5vbmVycm9yPWZ1bmN0aW9uKCl7cmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQganNQREYgZnJvbSBDRE4nKSk7fTsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTsKICAgIH0pOwogICAgcmV0dXJuIGpzUGRmUHJvbWlzZTsKICB9CgogIGZ1bmN0aW9uIGRvd25sb2FkKCl7CiAgICB2YXIgYnVzaW5lc3NOYW1lPXZhbCgnZGVuaS1pbnYtYnVzaW5lc3MtbmFtZScpLnRyaW0oKTsKICAgIHZhciBjbGllbnROYW1lPXZhbCgnZGVuaS1pbnYtY2xpZW50LW5hbWUnKS50cmltKCk7CiAgICBpZighYnVzaW5lc3NOYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB5b3VyIGJ1c2luZXNzIG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIGlmKCFjbGllbnROYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB0aGUgcmVjaXBpZW50IG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIHZhciBsaW5lcz1yZWFkTGluZXMoKTsKICAgIHZhciBoYXNJdGVtPWZhbHNlLGk7CiAgICBmb3IoaT0wO2k8bGluZXMubGVuZ3RoO2krKyl7aWYoKGxpbmVzW2ldLnF1YW50aXR5KmxpbmVzW2ldLnVuaXRQcmljZSk+MHx8KGxpbmVzW2ldLmRlc2NyaXB0aW9uJiZsaW5lc1tpXS5kZXNjcmlwdGlvbi5sZW5ndGg+MCkpe2hhc0l0ZW09dHJ1ZTticmVhazt9fQogICAgaWYoIWhhc0l0ZW0pe3Nob3dUb2FzdCgnUGxlYXNlIGFkZCBhdCBsZWFzdCBvbmUgbGluZSBpdGVtLicsJ2VycicpO3JldHVybjt9CiAgICBzaG93VG9hc3QoJ1ByZXBhcmluZyBQREYuLi4nLCdzdWNjZXNzJyk7CiAgICBlbnN1cmVKc1BERigpLnRoZW4oZnVuY3Rpb24oanNQREYpewogICAgICB0cnl7CiAgICAgICAgdmFyIGRvYz1uZXcganNQREYoe29yaWVudGF0aW9uOidwb3J0cmFpdCcsdW5pdDonbW0nLGZvcm1hdDonYTQnfSk7CiAgICAgICAgdmFyIGN1cj12YWwoJ2RlbmktaW52LWN1cnJlbmN5Jyl8fCdVU0QnOwogICAgICAgIHZhciBzeW09Y3VyU3ltKGN1cik7CiAgICAgICAgdmFyIHlQb3M9MjA7CgogICAgICAgIGRvYy5zZXRGb250U2l6ZSgyMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy50ZXh0KCJERU5UQUwgSU5WT0lDRSIsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTEyOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dChidXNpbmVzc05hbWUsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDkpOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgdmFyIGJpekFkZHI9dmFsKCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJyk7CiAgICAgICAgdmFyIGJpekNvbnRhY3Q9dmFsKCdkZW5pLWludi1idXNpbmVzcy1jb250YWN0Jyk7CiAgICAgICAgdmFyIGJpelRheD12YWwoJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCcpOwogICAgICAgIGlmKGJpekFkZHIpe2RvYy50ZXh0KGJpekFkZHIsMjAseVBvcyk7eVBvcys9NTt9CiAgICAgICAgaWYoYml6Q29udGFjdCl7ZG9jLnRleHQoYml6Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICBpZihiaXpUYXgpe2RvYy50ZXh0KCdUYXggSUQ6ICcrYml6VGF4LDIwLHlQb3MpO3lQb3MrPTU7fQoKICAgICAgICBkb2Muc2V0Rm9udFNpemUoOSk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dCgnSW52b2ljZSAjOiAnK3ZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInKSwxNDAsMzApOwogICAgICAgIGRvYy50ZXh0KCdJc3N1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpLDE0MCwzNik7CiAgICAgICAgZG9jLnRleHQoJ0R1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKSwxNDAsNDIpOwogICAgICAgIGRvYy50ZXh0KCdDdXJyZW5jeTogJytjdXIsMTQwLDQ4KTsKCiAgICAgICAgeVBvcz1NYXRoLm1heCh5UG9zLDYwKTsKICAgICAgICBkb2Muc2V0Rm9udFNpemUoMTApOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2MudGV4dCgiUEFUSUVOVCBERVRBSUxTIiwyMCx5UG9zKTsKICAgICAgICB5UG9zKz02OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDEyLDAsNTApOwogICAgICAgIGRvYy50ZXh0KGNsaWVudE5hbWUsMjAseVBvcyk7eVBvcys9NTsKICAgICAgICB2YXIgY2xpZW50Q29tcGFueT12YWwoJ2RlbmktaW52LWNsaWVudC1jb21wYW55Jyk7CiAgICAgICAgaWYoY2xpZW50Q29tcGFueSl7ZG9jLnRleHQoY2xpZW50Q29tcGFueSwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50QWRkcj12YWwoJ2RlbmktaW52LWNsaWVudC1hZGRyZXNzJyk7CiAgICAgICAgaWYoY2xpZW50QWRkcil7ZG9jLnRleHQoY2xpZW50QWRkciwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50Q29udGFjdD12YWwoJ2RlbmktaW52LWNsaWVudC1jb250YWN0Jyk7CiAgICAgICAgaWYoY2xpZW50Q29udGFjdCl7ZG9jLnRleHQoY2xpZW50Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KCiAgICAgICAgLy8gRXh0cmEgZmllbGRzIGJsb2NrIChpZiBjb25maWcgZGVmaW5lZCBhbnkpCiAgICAgICAgdmFyIGV4dHJhSWRzPVsicGF0aWVudC1pZCIsImRhdGUtb2YtdHJlYXRtZW50IiwidHJlYXRpbmctZGVudGlzdCIsImluc3VyYW5jZS1wb2xpY3kiLCJwcmlvci1hdXRob3JpemF0aW9uIl07CiAgICAgICAgdmFyIGV4dHJhTGFiZWxzPVsiUGF0aWVudCBJRCAvIENoYXJ0ICMiLCJEYXRlIG9mIFRyZWF0bWVudCIsIlRyZWF0aW5nIERlbnRpc3QiLCJJbnN1cmFuY2UgUG9saWN5ICMiLCJQcmUtQXV0aG9yaXphdGlvbiAjIl07CiAgICAgICAgdmFyIGFueUV4dHJhPWZhbHNlOwogICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXtpZih2YWwoJ2RlbmktaW52LScrZXh0cmFJZHNbaV0pKWFueUV4dHJhPXRydWU7fQogICAgICAgIGlmKGFueUV4dHJhKXsKICAgICAgICAgIHlQb3MrPTQ7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICAgIGRvYy50ZXh0KCdERVRBSUxTJywyMCx5UG9zKTt5UG9zKz02OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXsKICAgICAgICAgICAgdmFyIHY9dmFsKCdkZW5pLWludi0nK2V4dHJhSWRzW2ldKTsKICAgICAgICAgICAgaWYodil7ZG9jLnRleHQoZXh0cmFMYWJlbHNbaV0rJzogJyt2LDIwLHlQb3MpO3lQb3MrPTU7fQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgeVBvcys9ODsKICAgICAgICBkb2Muc2V0RmlsbENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy5yZWN0KDIwLHlQb3MsMTcwLDgsJ0YnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDI1NSwyNTUsMjU1KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSg5KTsKICAgICAgICBkb2MudGV4dCgnRGVzY3JpcHRpb24nLDIzLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnUXR5JywxMTAseVBvcys1LjUpOwogICAgICAgIGRvYy50ZXh0KCdQcmljZScsMTI3LHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVGF4JScsMTUwLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVG90YWwnLDE3MCx5UG9zKzUuNSk7CiAgICAgICAgeVBvcys9MTI7CgogICAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMTIsMCw1MCk7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIHZhciBzdWJ0b3RhbD0wLHRheEFtdD0wOwogICAgICAgIGZvcihpPTA7aTxsaW5lcy5sZW5ndGg7aSsrKXsKICAgICAgICAgIGlmKHlQb3M+MjcwKXtkb2MuYWRkUGFnZSgpO3lQb3M9MjA7fQogICAgICAgICAgdmFyIGxpbj1saW5lc1tpXTsKICAgICAgICAgIHZhciBscz1saW4ucXVhbnRpdHkqbGluLnVuaXRQcmljZTsKICAgICAgICAgIHZhciBsdD1scypsaW4udGF4UmF0ZS8xMDA7CiAgICAgICAgICBzdWJ0b3RhbCs9bHM7dGF4QW10Kz1sdDsKICAgICAgICAgIHZhciBkZXNjVHh0PShsaW4uZGVzY3JpcHRpb258fCcnKS5zbGljZSgwLDQ2KTsKICAgICAgICAgIGRvYy50ZXh0KGRlc2NUeHQsMjMseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChTdHJpbmcobGluLnF1YW50aXR5KSwxMTAseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChzeW0rbGluLnVuaXRQcmljZS50b0ZpeGVkKDIpLDEyNyx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KGxpbi50YXhSYXRlLnRvRml4ZWQoMikrJyUnLDE1MCx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KHN5bSsobHMrbHQpLnRvRml4ZWQoMiksMTcwLHlQb3MpOwogICAgICAgICAgeVBvcys9NjsKICAgICAgICB9CgogICAgICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgICAgICB2YXIgdG90YWw9c3VidG90YWwrdGF4QW10LWRpc2NvdW50OwogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgZG9jLnRleHQoJ1N1YnRvdGFsOicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bStzdWJ0b3RhbC50b0ZpeGVkKDIpLDE4OCx5UG9zLHthbGlnbjoncmlnaHQnfSk7CiAgICAgICAgeVBvcys9NjsKICAgICAgICBkb2MudGV4dCgnVGF4OicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bSt0YXhBbXQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIGlmKGRpc2NvdW50PjApewogICAgICAgICAgeVBvcys9NjsKICAgICAgICAgIGRvYy50ZXh0KCdEaXNjb3VudDonLDEzNSx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KCctJytzeW0rZGlzY291bnQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIH0KICAgICAgICB5UG9zKz04OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDEzKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy50ZXh0KCdUb3RhbDonLDEzNSx5UG9zKTsKICAgICAgICBkb2MudGV4dChzeW0rdG90YWwudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwoKICAgICAgICB2YXIgcHRlcm1zPXZhbCgnZGVuaS1pbnYtcGF5bWVudC10ZXJtcycpOwogICAgICAgIGlmKHB0ZXJtcyl7CiAgICAgICAgICB5UG9zKz0xNDsKICAgICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdQYXltZW50IFRlcm1zJywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPTU7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnbm9ybWFsJyk7CiAgICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgICB2YXIgcHRMaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKHB0ZXJtcywxNzApOwogICAgICAgICAgZG9jLnRleHQocHRMaW5lcywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPXB0TGluZXMubGVuZ3RoKjU7CiAgICAgICAgfQoKICAgICAgICB2YXIgbm90ZXNWYWw9dmFsKCdkZW5pLWludi1ub3RlcycpOwogICAgICAgIGlmKG5vdGVzVmFsKXsKICAgICAgICAgIHlQb3MrPTY7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdOb3RlcycsMjAseVBvcyk7CiAgICAgICAgICB5UG9zKz01OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcig5MCw4NSwxMTIpOwogICAgICAgICAgdmFyIG5MaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKG5vdGVzVmFsLDE3MCk7CiAgICAgICAgICBkb2MudGV4dChuTGluZXMsMjAseVBvcyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZm5hbWU9dmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpfHwnaW52b2ljZSc7CiAgICAgICAgZG9jLnNhdmUoJ0ludm9pY2VfJytmbmFtZSsnLnBkZicpOwogICAgICAgIHNob3dUb2FzdCgnUERGIGRvd25sb2FkZWQuJywnc3VjY2VzcycpOwogICAgICB9Y2F0Y2goZXJyKXsKICAgICAgICBzaG93VG9hc3QoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBQREY6ICcrKGVyciYmZXJyLm1lc3NhZ2U\/ZXJyLm1lc3NhZ2U6ZXJyKSwnZXJyJyk7CiAgICAgIH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycil7CiAgICAgIHNob3dUb2FzdCgnQ291bGQgbm90IGxvYWQgUERGIGxpYnJhcnk6ICcrZXJyLm1lc3NhZ2UsJ2VycicpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzY3JvbGwoKXt2YXIgdD0kKCdkZW5pLWludi1nZW5lcmF0b3InKTtpZih0JiZ0LnNjcm9sbEludG9WaWV3KXQuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnLGJsb2NrOidzdGFydCd9KTt9CgogIGZ1bmN0aW9uIGJvb3QoKXsKICAgIGlmKGJvb3RlZClyZXR1cm47Ym9vdGVkPXRydWU7CiAgICAvLyBXaXJlIGdlbmVyaWMgaW5wdXQgbGlzdGVuZXJzIHRvIGtlZXAgdG90YWxzIGxpdmUKICAgIHZhciBpbnB1dHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2RlbmktaW52LWdlbmVyYXRvciBpbnB1dCwgI2RlbmktaW52LWdlbmVyYXRvciBzZWxlY3QnKTsKICAgIHZhciBpO2ZvcihpPTA7aTxpbnB1dHMubGVuZ3RoO2krKyl7aW5wdXRzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JyxyZWNvbXB1dGUpO2lucHV0c1tpXS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLHJlY29tcHV0ZSk7fQogICAgLy8gU2VlZCBpbnZvaWNlIG51bWJlciArIGRhdGVzIGlmIGJsYW5rIChoYW5kbGVzIGZyZXNoIHBhZ2UgbG9hZCkKICAgIHZhciBkPW5ldyBEYXRlKCk7CiAgICBpZighdmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpKXNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBpZighdmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpc2V0VmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJyxkLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICBpZighdmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKXNldFZhbCgnZGVuaS1pbnYtZHVlLWRhdGUnLG5ldyBEYXRlKGQuZ2V0VGltZSgpKzMwKjI0KjYwKjYwKjEwMDApLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIHdpbmRvdy5hc2NJbnY9d2luZG93LmFzY0ludnx8ewogICAgYm9vdDpib290LGFkZExpbmU6YWRkTGluZSxyZW1vdmVMaW5lOnJlbW92ZUxpbmUscmVjb21wdXRlOnJlY29tcHV0ZSwKICAgIGRvd25sb2FkOmRvd25sb2FkLHJlc2V0OnJlc2V0LHNjcm9sbDpzY3JvbGwKICB9OwogIGJvb3QoKTsKfSkoKTs=')))();}window.deniInv&#038;&#038;window.deniInv.recompute&#038;&#038;window.deniInv.recompute();\"><\/div>\n<div class=\"deni-inv-field\"><label>Tax %<\/label><input type=\"number\" min=\"0\" max=\"100\" step=\"0.01\" data-line-field=\"taxRate\" value=\"0\" oninput=\"if(!window.deniInvBooted){window.deniInvBooted=1;(new Function(atob('KGZ1bmN0aW9uKCl7CiAgdmFyIGJvb3RlZD1mYWxzZTsKICBmdW5jdGlvbiAkKGlkKXtyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO30KICBmdW5jdGlvbiB2YWwoaWQpe3ZhciBlbD0kKGlkKTtyZXR1cm4gZWw\/ZWwudmFsdWU6Jyc7fQogIGZ1bmN0aW9uIHNldFZhbChpZCx2KXt2YXIgZWw9JChpZCk7aWYoZWwpZWwudmFsdWU9djt9CiAgZnVuY3Rpb24gbnVtKHYpe3ZhciBuPXBhcnNlRmxvYXQodik7cmV0dXJuIGlzRmluaXRlKG4pP246MDt9CiAgZnVuY3Rpb24gZm10KG4sY3VyKXtjdXI9Y3VyfHwnVVNEJzt0cnl7cmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCgnZW4tVVMnLHtzdHlsZTonY3VycmVuY3knLGN1cnJlbmN5OmN1cixtaW5pbXVtRnJhY3Rpb25EaWdpdHM6Mn0pLmZvcm1hdChOdW1iZXIobil8fDApO31jYXRjaChfKXtyZXR1cm4gJyQnKygoTnVtYmVyKG4pfHwwKS50b0ZpeGVkKDIpKTt9fQogIGZ1bmN0aW9uIGN1clN5bShjKXt2YXIgbT17VVNEOickJyxFVVI6J+KCrCcsR0JQOifCoycsSU5SOifigrknLEFVRDonQSQnLENBRDonQyQnfTtyZXR1cm4gbVtjXXx8JyQnO30KICBmdW5jdGlvbiBmbXREYXRlKHMpe2lmKCFzKXJldHVybiAnJzt0cnl7dmFyIGQ9bmV3IERhdGUocyk7aWYoaXNOYU4oZCkpcmV0dXJuIHM7cmV0dXJuIGQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycse3llYXI6J251bWVyaWMnLG1vbnRoOidzaG9ydCcsZGF5OidudW1lcmljJ30pO31jYXRjaChfKXtyZXR1cm4gczt9fQogIGZ1bmN0aW9uIHVpZCgpe3JldHVybiAnbGknK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxZTkpLnRvU3RyaW5nKDM2KTt9CgogIGZ1bmN0aW9uIGxpbmVSb3dIdG1sKGlkKXsKICAgIHJldHVybiAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1pdGVtIiBkYXRhLWxpbmUtaWQ9IicraWQrJyIgaWQ9ImRlbmktaW52LWxpbmUtJytpZCsnIj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkIj48c3BhbiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkLWxhYmVsIj5MaW5lIEl0ZW08L3NwYW4+JysKICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJkZW5pLWludi1saW5lLXJlbW92ZSIgYXJpYS1sYWJlbD0iUmVtb3ZlIiBvbmNsaWNrPSJ3aW5kb3cuYXNjSW52JiZ3aW5kb3cuYXNjSW52LnJlbW92ZUxpbmUoXCcnK2lkKydcJykiPlx1MDBENzwvYnV0dG9uPicrCiAgICAgICc8L2Rpdj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1ncmlkIj4nKwogICAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1maWVsZCI+PGxhYmVsPkRlc2NyaXB0aW9uPC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgZGF0YS1saW5lLWZpZWxkPSJkZXNjcmlwdGlvbiIgcGxhY2Vob2xkZXI9IlNlcnZpY2Ugb3IgcHJvZHVjdCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLWdyaWQtMyI+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5RdWFudGl0eTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBzdGVwPSIwLjAxIiBkYXRhLWxpbmUtZmllbGQ9InF1YW50aXR5IiB2YWx1ZT0iMSIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5Vbml0IFByaWNlPC9sYWJlbD48aW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49IjAiIHN0ZXA9IjAuMDEiIGRhdGEtbGluZS1maWVsZD0idW5pdFByaWNlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5UYXggJTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9IjEwMCIgc3RlcD0iMC4wMSIgZGF0YS1saW5lLWZpZWxkPSJ0YXhSYXRlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLXRvdGFsIj48c3Bhbj5MaW5lIFRvdGFsPC9zcGFuPjxzdHJvbmcgZGF0YS1saW5lLXRvdGFsPiQwLjAwPC9zdHJvbmc+PC9kaXY+JysKICAgICc8L2Rpdj4nOwogIH0KCiAgZnVuY3Rpb24gcmVhZExpbmVzKCl7CiAgICB2YXIgcm93cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZGVuaS1pbnYtbGluZXMgLmRlbmktaW52LWxpbmUtaXRlbScpOwogICAgdmFyIGFycj1bXSxpLHJvdyxkZXNjLHF0eSxwcmljZSx0YXg7CiAgICBmb3IoaT0wO2k8cm93cy5sZW5ndGg7aSsrKXsKICAgICAgcm93PXJvd3NbaV07CiAgICAgIGRlc2M9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9ImRlc2NyaXB0aW9uIl0nKTsKICAgICAgcXR5PXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJxdWFudGl0eSJdJyk7CiAgICAgIHByaWNlPXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJ1bml0UHJpY2UiXScpOwogICAgICB0YXg9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9InRheFJhdGUiXScpOwogICAgICBhcnIucHVzaCh7CiAgICAgICAgZWw6cm93LAogICAgICAgIGRlc2NyaXB0aW9uOmRlc2M\/ZGVzYy52YWx1ZTonJywKICAgICAgICBxdWFudGl0eTpudW0ocXR5JiZxdHkudmFsdWUpLAogICAgICAgIHVuaXRQcmljZTpudW0ocHJpY2UmJnByaWNlLnZhbHVlKSwKICAgICAgICB0YXhSYXRlOm51bSh0YXgmJnRheC52YWx1ZSkKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gYXJyOwogIH0KCiAgZnVuY3Rpb24gcmVjb21wdXRlKCl7CiAgICB2YXIgY3VyPXZhbCgnZGVuaS1pbnYtY3VycmVuY3knKXx8J1VTRCc7CiAgICB2YXIgc3ltPWN1clN5bShjdXIpOwogICAgdmFyIGxpbmVzPXJlYWRMaW5lcygpOwogICAgdmFyIHN1YnRvdGFsPTAsdGF4PTAsaSxsaW5lLGxpbmVTdWIsbGluZVRheCx0b3RhbEVsOwogICAgZm9yKGk9MDtpPGxpbmVzLmxlbmd0aDtpKyspewogICAgICBsaW5lPWxpbmVzW2ldOwogICAgICBsaW5lU3ViPWxpbmUucXVhbnRpdHkqbGluZS51bml0UHJpY2U7CiAgICAgIGxpbmVUYXg9bGluZVN1YipsaW5lLnRheFJhdGUvMTAwOwogICAgICBzdWJ0b3RhbCs9bGluZVN1YjsKICAgICAgdGF4Kz1saW5lVGF4OwogICAgICB0b3RhbEVsPWxpbmUuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbGluZS10b3RhbF0nKTsKICAgICAgaWYodG90YWxFbCl0b3RhbEVsLnRleHRDb250ZW50PWZtdChsaW5lU3ViK2xpbmVUYXgsY3VyKTsKICAgIH0KICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgIHZhciB0b3RhbD1zdWJ0b3RhbCt0YXgtZGlzY291bnQ7CiAgICB2YXIgc3ViRWw9JCgnZGVuaS1pbnYtc3VidG90YWwnKTtpZihzdWJFbClzdWJFbC50ZXh0Q29udGVudD1mbXQoc3VidG90YWwsY3VyKTsKICAgIHZhciB0YXhFbD0kKCdkZW5pLWludi10YXgnKTtpZih0YXhFbCl0YXhFbC50ZXh0Q29udGVudD1mbXQodGF4LGN1cik7CiAgICB2YXIgZGlzY0VsPSQoJ2RlbmktaW52LWRpc2NvdW50LWRpc3BsYXknKTtpZihkaXNjRWwpZGlzY0VsLnRleHRDb250ZW50PSctJytmbXQoZGlzY291bnQsY3VyKTsKICAgIHZhciB0b3RFbD0kKCdkZW5pLWludi10b3RhbCcpO2lmKHRvdEVsKXRvdEVsLnRleHRDb250ZW50PWZtdCh0b3RhbCxjdXIpOwogICAgLy8gS2VlcCBjdXJyZW5jeSBzeW1ib2wgaW4gc3VtbWFyeSBpbiBzeW5jCiAgICB2YXIgc3ltRWxzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWN1ci1zeW1dJyk7CiAgICBmb3IoaT0wO2k8c3ltRWxzLmxlbmd0aDtpKyspc3ltRWxzW2ldLnRleHRDb250ZW50PXN5bTsKICB9CgogIGZ1bmN0aW9uIGFkZExpbmUoKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIGJveC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsbGluZVJvd0h0bWwodWlkKCkpKTsKICAgIHJlY29tcHV0ZSgpOwogIH0KICBmdW5jdGlvbiByZW1vdmVMaW5lKGlkKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIHZhciByb3dzPWJveC5xdWVyeVNlbGVjdG9yQWxsKCcuZGVuaS1pbnYtbGluZS1pdGVtJyk7CiAgICBpZihyb3dzLmxlbmd0aDw9MSlyZXR1cm47CiAgICB2YXIgcm93PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZW5pLWludi1saW5lLScraWQpOwogICAgaWYocm93KXJvdy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHJvdyk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIGZ1bmN0aW9uIHNob3dUb2FzdChtc2csa2luZCl7CiAgICB2YXIgdD0kKCdkZW5pLWludi10b2FzdCcpO2lmKCF0KXJldHVybjsKICAgIHQudGV4dENvbnRlbnQ9bXNnOwogICAgdC5jbGFzc05hbWU9J2RlbmktaW52LXRvYXN0IGRlbmktaW52LXRvYXN0LXNob3cnKyhraW5kPT09J3N1Y2Nlc3MnPycgZGVuaS1pbnYtdG9hc3Qtc3VjY2Vzcyc6JycpOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xhc3NOYW1lPSdkZW5pLWludi10b2FzdCc7fSwzNTAwKTsKICB9CgogIGZ1bmN0aW9uIHJlc2V0KCl7CiAgICB2YXIgZGVmcz17J2RlbmktaW52LWJ1c2luZXNzLW5hbWUnOicnLCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJzonJywnZGVuaS1pbnYtYnVzaW5lc3MtY29udGFjdCc6JycsJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCc6JycsJ2RlbmktaW52LWNsaWVudC1uYW1lJzonJywnZGVuaS1pbnYtY2xpZW50LWNvbXBhbnknOicnLCdkZW5pLWludi1jbGllbnQtYWRkcmVzcyc6JycsJ2RlbmktaW52LWNsaWVudC1jb250YWN0JzonJywnZGVuaS1pbnYtZGlzY291bnQnOicwJywnZGVuaS1pbnYtcGF5bWVudC10ZXJtcyc6IlBhdGllbnQgcG9ydGlvbiBkdWUgYXQgdGltZSBvZiBzZXJ2aWNlLiBJbnN1cmFuY2UgYmFsYW5jZSBiaWxsZWQgdG8gY2Fycmllci4iLCdkZW5pLWludi1ub3Rlcyc6Jyd9OwogICAgdmFyIGs7Zm9yKGsgaW4gZGVmcylzZXRWYWwoayxkZWZzW2tdKTsKICAgIGlmKCQoJ2RlbmktaW52LXBhdGllbnQtaWQnKSkkKCdkZW5pLWludi1wYXRpZW50LWlkJykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtZGF0ZS1vZi10cmVhdG1lbnQnKSkkKCdkZW5pLWludi1kYXRlLW9mLXRyZWF0bWVudCcpLnZhbHVlPScnO2lmKCQoJ2RlbmktaW52LXRyZWF0aW5nLWRlbnRpc3QnKSkkKCdkZW5pLWludi10cmVhdGluZy1kZW50aXN0JykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtaW5zdXJhbmNlLXBvbGljeScpKSQoJ2RlbmktaW52LWluc3VyYW5jZS1wb2xpY3knKS52YWx1ZT0nJztpZigkKCdkZW5pLWludi1wcmlvci1hdXRob3JpemF0aW9uJykpJCgnZGVuaS1pbnYtcHJpb3ItYXV0aG9yaXphdGlvbicpLnZhbHVlPScnOwogICAgdmFyIGQ9bmV3IERhdGUoKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWlzc3VlLWRhdGUnLGQudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHZhciBkdWU9bmV3IERhdGUoZC5nZXRUaW1lKCkrMzAqMjQqNjAqNjAqMTAwMCk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWR1ZS1kYXRlJyxkdWUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtY3VycmVuY3knLCdVU0QnKTsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTsKICAgIGlmKGJveCl7Ym94LmlubmVySFRNTD1saW5lUm93SHRtbCh1aWQoKSk7fQogICAgcmVjb21wdXRlKCk7CiAgfQoKICB2YXIganNQZGZQcm9taXNlPW51bGw7CiAgZnVuY3Rpb24gZW5zdXJlSnNQREYoKXsKICAgIGlmKGpzUGRmUHJvbWlzZSlyZXR1cm4ganNQZGZQcm9taXNlOwogICAganNQZGZQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXsKICAgICAgaWYod2luZG93LmpzcGRmJiZ3aW5kb3cuanNwZGYuanNQREYpcmV0dXJuIHJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTsKICAgICAgdmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgIHMuc3JjPSdodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9qc3BkZi8yLjUuMS9qc3BkZi51bWQubWluLmpzJzsKICAgICAgcy5hc3luYz10cnVlOwogICAgICBzLm9ubG9hZD1mdW5jdGlvbigpe2lmKHdpbmRvdy5qc3BkZiYmd2luZG93LmpzcGRmLmpzUERGKXJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTtlbHNlIHJlamVjdChuZXcgRXJyb3IoJ2pzUERGIG5vdCBhdmFpbGFibGUnKSk7fTsKICAgICAgcy5vbmVycm9yPWZ1bmN0aW9uKCl7cmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQganNQREYgZnJvbSBDRE4nKSk7fTsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTsKICAgIH0pOwogICAgcmV0dXJuIGpzUGRmUHJvbWlzZTsKICB9CgogIGZ1bmN0aW9uIGRvd25sb2FkKCl7CiAgICB2YXIgYnVzaW5lc3NOYW1lPXZhbCgnZGVuaS1pbnYtYnVzaW5lc3MtbmFtZScpLnRyaW0oKTsKICAgIHZhciBjbGllbnROYW1lPXZhbCgnZGVuaS1pbnYtY2xpZW50LW5hbWUnKS50cmltKCk7CiAgICBpZighYnVzaW5lc3NOYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB5b3VyIGJ1c2luZXNzIG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIGlmKCFjbGllbnROYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB0aGUgcmVjaXBpZW50IG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIHZhciBsaW5lcz1yZWFkTGluZXMoKTsKICAgIHZhciBoYXNJdGVtPWZhbHNlLGk7CiAgICBmb3IoaT0wO2k8bGluZXMubGVuZ3RoO2krKyl7aWYoKGxpbmVzW2ldLnF1YW50aXR5KmxpbmVzW2ldLnVuaXRQcmljZSk+MHx8KGxpbmVzW2ldLmRlc2NyaXB0aW9uJiZsaW5lc1tpXS5kZXNjcmlwdGlvbi5sZW5ndGg+MCkpe2hhc0l0ZW09dHJ1ZTticmVhazt9fQogICAgaWYoIWhhc0l0ZW0pe3Nob3dUb2FzdCgnUGxlYXNlIGFkZCBhdCBsZWFzdCBvbmUgbGluZSBpdGVtLicsJ2VycicpO3JldHVybjt9CiAgICBzaG93VG9hc3QoJ1ByZXBhcmluZyBQREYuLi4nLCdzdWNjZXNzJyk7CiAgICBlbnN1cmVKc1BERigpLnRoZW4oZnVuY3Rpb24oanNQREYpewogICAgICB0cnl7CiAgICAgICAgdmFyIGRvYz1uZXcganNQREYoe29yaWVudGF0aW9uOidwb3J0cmFpdCcsdW5pdDonbW0nLGZvcm1hdDonYTQnfSk7CiAgICAgICAgdmFyIGN1cj12YWwoJ2RlbmktaW52LWN1cnJlbmN5Jyl8fCdVU0QnOwogICAgICAgIHZhciBzeW09Y3VyU3ltKGN1cik7CiAgICAgICAgdmFyIHlQb3M9MjA7CgogICAgICAgIGRvYy5zZXRGb250U2l6ZSgyMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy50ZXh0KCJERU5UQUwgSU5WT0lDRSIsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTEyOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dChidXNpbmVzc05hbWUsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDkpOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgdmFyIGJpekFkZHI9dmFsKCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJyk7CiAgICAgICAgdmFyIGJpekNvbnRhY3Q9dmFsKCdkZW5pLWludi1idXNpbmVzcy1jb250YWN0Jyk7CiAgICAgICAgdmFyIGJpelRheD12YWwoJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCcpOwogICAgICAgIGlmKGJpekFkZHIpe2RvYy50ZXh0KGJpekFkZHIsMjAseVBvcyk7eVBvcys9NTt9CiAgICAgICAgaWYoYml6Q29udGFjdCl7ZG9jLnRleHQoYml6Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICBpZihiaXpUYXgpe2RvYy50ZXh0KCdUYXggSUQ6ICcrYml6VGF4LDIwLHlQb3MpO3lQb3MrPTU7fQoKICAgICAgICBkb2Muc2V0Rm9udFNpemUoOSk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dCgnSW52b2ljZSAjOiAnK3ZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInKSwxNDAsMzApOwogICAgICAgIGRvYy50ZXh0KCdJc3N1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpLDE0MCwzNik7CiAgICAgICAgZG9jLnRleHQoJ0R1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKSwxNDAsNDIpOwogICAgICAgIGRvYy50ZXh0KCdDdXJyZW5jeTogJytjdXIsMTQwLDQ4KTsKCiAgICAgICAgeVBvcz1NYXRoLm1heCh5UG9zLDYwKTsKICAgICAgICBkb2Muc2V0Rm9udFNpemUoMTApOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2MudGV4dCgiUEFUSUVOVCBERVRBSUxTIiwyMCx5UG9zKTsKICAgICAgICB5UG9zKz02OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDEyLDAsNTApOwogICAgICAgIGRvYy50ZXh0KGNsaWVudE5hbWUsMjAseVBvcyk7eVBvcys9NTsKICAgICAgICB2YXIgY2xpZW50Q29tcGFueT12YWwoJ2RlbmktaW52LWNsaWVudC1jb21wYW55Jyk7CiAgICAgICAgaWYoY2xpZW50Q29tcGFueSl7ZG9jLnRleHQoY2xpZW50Q29tcGFueSwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50QWRkcj12YWwoJ2RlbmktaW52LWNsaWVudC1hZGRyZXNzJyk7CiAgICAgICAgaWYoY2xpZW50QWRkcil7ZG9jLnRleHQoY2xpZW50QWRkciwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50Q29udGFjdD12YWwoJ2RlbmktaW52LWNsaWVudC1jb250YWN0Jyk7CiAgICAgICAgaWYoY2xpZW50Q29udGFjdCl7ZG9jLnRleHQoY2xpZW50Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KCiAgICAgICAgLy8gRXh0cmEgZmllbGRzIGJsb2NrIChpZiBjb25maWcgZGVmaW5lZCBhbnkpCiAgICAgICAgdmFyIGV4dHJhSWRzPVsicGF0aWVudC1pZCIsImRhdGUtb2YtdHJlYXRtZW50IiwidHJlYXRpbmctZGVudGlzdCIsImluc3VyYW5jZS1wb2xpY3kiLCJwcmlvci1hdXRob3JpemF0aW9uIl07CiAgICAgICAgdmFyIGV4dHJhTGFiZWxzPVsiUGF0aWVudCBJRCAvIENoYXJ0ICMiLCJEYXRlIG9mIFRyZWF0bWVudCIsIlRyZWF0aW5nIERlbnRpc3QiLCJJbnN1cmFuY2UgUG9saWN5ICMiLCJQcmUtQXV0aG9yaXphdGlvbiAjIl07CiAgICAgICAgdmFyIGFueUV4dHJhPWZhbHNlOwogICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXtpZih2YWwoJ2RlbmktaW52LScrZXh0cmFJZHNbaV0pKWFueUV4dHJhPXRydWU7fQogICAgICAgIGlmKGFueUV4dHJhKXsKICAgICAgICAgIHlQb3MrPTQ7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICAgIGRvYy50ZXh0KCdERVRBSUxTJywyMCx5UG9zKTt5UG9zKz02OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXsKICAgICAgICAgICAgdmFyIHY9dmFsKCdkZW5pLWludi0nK2V4dHJhSWRzW2ldKTsKICAgICAgICAgICAgaWYodil7ZG9jLnRleHQoZXh0cmFMYWJlbHNbaV0rJzogJyt2LDIwLHlQb3MpO3lQb3MrPTU7fQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgeVBvcys9ODsKICAgICAgICBkb2Muc2V0RmlsbENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy5yZWN0KDIwLHlQb3MsMTcwLDgsJ0YnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDI1NSwyNTUsMjU1KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSg5KTsKICAgICAgICBkb2MudGV4dCgnRGVzY3JpcHRpb24nLDIzLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnUXR5JywxMTAseVBvcys1LjUpOwogICAgICAgIGRvYy50ZXh0KCdQcmljZScsMTI3LHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVGF4JScsMTUwLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVG90YWwnLDE3MCx5UG9zKzUuNSk7CiAgICAgICAgeVBvcys9MTI7CgogICAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMTIsMCw1MCk7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIHZhciBzdWJ0b3RhbD0wLHRheEFtdD0wOwogICAgICAgIGZvcihpPTA7aTxsaW5lcy5sZW5ndGg7aSsrKXsKICAgICAgICAgIGlmKHlQb3M+MjcwKXtkb2MuYWRkUGFnZSgpO3lQb3M9MjA7fQogICAgICAgICAgdmFyIGxpbj1saW5lc1tpXTsKICAgICAgICAgIHZhciBscz1saW4ucXVhbnRpdHkqbGluLnVuaXRQcmljZTsKICAgICAgICAgIHZhciBsdD1scypsaW4udGF4UmF0ZS8xMDA7CiAgICAgICAgICBzdWJ0b3RhbCs9bHM7dGF4QW10Kz1sdDsKICAgICAgICAgIHZhciBkZXNjVHh0PShsaW4uZGVzY3JpcHRpb258fCcnKS5zbGljZSgwLDQ2KTsKICAgICAgICAgIGRvYy50ZXh0KGRlc2NUeHQsMjMseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChTdHJpbmcobGluLnF1YW50aXR5KSwxMTAseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChzeW0rbGluLnVuaXRQcmljZS50b0ZpeGVkKDIpLDEyNyx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KGxpbi50YXhSYXRlLnRvRml4ZWQoMikrJyUnLDE1MCx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KHN5bSsobHMrbHQpLnRvRml4ZWQoMiksMTcwLHlQb3MpOwogICAgICAgICAgeVBvcys9NjsKICAgICAgICB9CgogICAgICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgICAgICB2YXIgdG90YWw9c3VidG90YWwrdGF4QW10LWRpc2NvdW50OwogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgZG9jLnRleHQoJ1N1YnRvdGFsOicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bStzdWJ0b3RhbC50b0ZpeGVkKDIpLDE4OCx5UG9zLHthbGlnbjoncmlnaHQnfSk7CiAgICAgICAgeVBvcys9NjsKICAgICAgICBkb2MudGV4dCgnVGF4OicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bSt0YXhBbXQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIGlmKGRpc2NvdW50PjApewogICAgICAgICAgeVBvcys9NjsKICAgICAgICAgIGRvYy50ZXh0KCdEaXNjb3VudDonLDEzNSx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KCctJytzeW0rZGlzY291bnQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIH0KICAgICAgICB5UG9zKz04OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDEzKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy50ZXh0KCdUb3RhbDonLDEzNSx5UG9zKTsKICAgICAgICBkb2MudGV4dChzeW0rdG90YWwudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwoKICAgICAgICB2YXIgcHRlcm1zPXZhbCgnZGVuaS1pbnYtcGF5bWVudC10ZXJtcycpOwogICAgICAgIGlmKHB0ZXJtcyl7CiAgICAgICAgICB5UG9zKz0xNDsKICAgICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdQYXltZW50IFRlcm1zJywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPTU7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnbm9ybWFsJyk7CiAgICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgICB2YXIgcHRMaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKHB0ZXJtcywxNzApOwogICAgICAgICAgZG9jLnRleHQocHRMaW5lcywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPXB0TGluZXMubGVuZ3RoKjU7CiAgICAgICAgfQoKICAgICAgICB2YXIgbm90ZXNWYWw9dmFsKCdkZW5pLWludi1ub3RlcycpOwogICAgICAgIGlmKG5vdGVzVmFsKXsKICAgICAgICAgIHlQb3MrPTY7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdOb3RlcycsMjAseVBvcyk7CiAgICAgICAgICB5UG9zKz01OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcig5MCw4NSwxMTIpOwogICAgICAgICAgdmFyIG5MaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKG5vdGVzVmFsLDE3MCk7CiAgICAgICAgICBkb2MudGV4dChuTGluZXMsMjAseVBvcyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZm5hbWU9dmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpfHwnaW52b2ljZSc7CiAgICAgICAgZG9jLnNhdmUoJ0ludm9pY2VfJytmbmFtZSsnLnBkZicpOwogICAgICAgIHNob3dUb2FzdCgnUERGIGRvd25sb2FkZWQuJywnc3VjY2VzcycpOwogICAgICB9Y2F0Y2goZXJyKXsKICAgICAgICBzaG93VG9hc3QoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBQREY6ICcrKGVyciYmZXJyLm1lc3NhZ2U\/ZXJyLm1lc3NhZ2U6ZXJyKSwnZXJyJyk7CiAgICAgIH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycil7CiAgICAgIHNob3dUb2FzdCgnQ291bGQgbm90IGxvYWQgUERGIGxpYnJhcnk6ICcrZXJyLm1lc3NhZ2UsJ2VycicpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzY3JvbGwoKXt2YXIgdD0kKCdkZW5pLWludi1nZW5lcmF0b3InKTtpZih0JiZ0LnNjcm9sbEludG9WaWV3KXQuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnLGJsb2NrOidzdGFydCd9KTt9CgogIGZ1bmN0aW9uIGJvb3QoKXsKICAgIGlmKGJvb3RlZClyZXR1cm47Ym9vdGVkPXRydWU7CiAgICAvLyBXaXJlIGdlbmVyaWMgaW5wdXQgbGlzdGVuZXJzIHRvIGtlZXAgdG90YWxzIGxpdmUKICAgIHZhciBpbnB1dHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2RlbmktaW52LWdlbmVyYXRvciBpbnB1dCwgI2RlbmktaW52LWdlbmVyYXRvciBzZWxlY3QnKTsKICAgIHZhciBpO2ZvcihpPTA7aTxpbnB1dHMubGVuZ3RoO2krKyl7aW5wdXRzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JyxyZWNvbXB1dGUpO2lucHV0c1tpXS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLHJlY29tcHV0ZSk7fQogICAgLy8gU2VlZCBpbnZvaWNlIG51bWJlciArIGRhdGVzIGlmIGJsYW5rIChoYW5kbGVzIGZyZXNoIHBhZ2UgbG9hZCkKICAgIHZhciBkPW5ldyBEYXRlKCk7CiAgICBpZighdmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpKXNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBpZighdmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpc2V0VmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJyxkLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICBpZighdmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKXNldFZhbCgnZGVuaS1pbnYtZHVlLWRhdGUnLG5ldyBEYXRlKGQuZ2V0VGltZSgpKzMwKjI0KjYwKjYwKjEwMDApLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIHdpbmRvdy5hc2NJbnY9d2luZG93LmFzY0ludnx8ewogICAgYm9vdDpib290LGFkZExpbmU6YWRkTGluZSxyZW1vdmVMaW5lOnJlbW92ZUxpbmUscmVjb21wdXRlOnJlY29tcHV0ZSwKICAgIGRvd25sb2FkOmRvd25sb2FkLHJlc2V0OnJlc2V0LHNjcm9sbDpzY3JvbGwKICB9OwogIGJvb3QoKTsKfSkoKTs=')))();}window.deniInv&#038;&#038;window.deniInv.recompute&#038;&#038;window.deniInv.recompute();\"><\/div>\n<\/div>\n<div class=\"deni-inv-line-total\"><span>Line Total<\/span><strong data-line-total>$0.00<\/strong><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"deni-inv-summary-card\">\n<h3>Summary<\/h3>\n<div class=\"deni-inv-summary-row\"><span class=\"deni-inv-summary-row-key\">Subtotal<\/span><span class=\"deni-inv-summary-row-val\" id=\"deni-inv-subtotal\">$0.00<\/span><\/div>\n<div class=\"deni-inv-summary-row\"><span class=\"deni-inv-summary-row-key\">Tax<\/span><span class=\"deni-inv-summary-row-val\" id=\"deni-inv-tax\">$0.00<\/span><\/div>\n<div class=\"deni-inv-field\" style=\"margin:8px 0 !important\"><label for=\"deni-inv-discount\">Discount (<span data-cur-sym>$<\/span>)<\/label><input type=\"number\" id=\"deni-inv-discount\" min=\"0\" step=\"0.01\" value=\"0\" oninput=\"if(!window.deniInvBooted){window.deniInvBooted=1;(new Function(atob('KGZ1bmN0aW9uKCl7CiAgdmFyIGJvb3RlZD1mYWxzZTsKICBmdW5jdGlvbiAkKGlkKXtyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO30KICBmdW5jdGlvbiB2YWwoaWQpe3ZhciBlbD0kKGlkKTtyZXR1cm4gZWw\/ZWwudmFsdWU6Jyc7fQogIGZ1bmN0aW9uIHNldFZhbChpZCx2KXt2YXIgZWw9JChpZCk7aWYoZWwpZWwudmFsdWU9djt9CiAgZnVuY3Rpb24gbnVtKHYpe3ZhciBuPXBhcnNlRmxvYXQodik7cmV0dXJuIGlzRmluaXRlKG4pP246MDt9CiAgZnVuY3Rpb24gZm10KG4sY3VyKXtjdXI9Y3VyfHwnVVNEJzt0cnl7cmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCgnZW4tVVMnLHtzdHlsZTonY3VycmVuY3knLGN1cnJlbmN5OmN1cixtaW5pbXVtRnJhY3Rpb25EaWdpdHM6Mn0pLmZvcm1hdChOdW1iZXIobil8fDApO31jYXRjaChfKXtyZXR1cm4gJyQnKygoTnVtYmVyKG4pfHwwKS50b0ZpeGVkKDIpKTt9fQogIGZ1bmN0aW9uIGN1clN5bShjKXt2YXIgbT17VVNEOickJyxFVVI6J+KCrCcsR0JQOifCoycsSU5SOifigrknLEFVRDonQSQnLENBRDonQyQnfTtyZXR1cm4gbVtjXXx8JyQnO30KICBmdW5jdGlvbiBmbXREYXRlKHMpe2lmKCFzKXJldHVybiAnJzt0cnl7dmFyIGQ9bmV3IERhdGUocyk7aWYoaXNOYU4oZCkpcmV0dXJuIHM7cmV0dXJuIGQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycse3llYXI6J251bWVyaWMnLG1vbnRoOidzaG9ydCcsZGF5OidudW1lcmljJ30pO31jYXRjaChfKXtyZXR1cm4gczt9fQogIGZ1bmN0aW9uIHVpZCgpe3JldHVybiAnbGknK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxZTkpLnRvU3RyaW5nKDM2KTt9CgogIGZ1bmN0aW9uIGxpbmVSb3dIdG1sKGlkKXsKICAgIHJldHVybiAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1pdGVtIiBkYXRhLWxpbmUtaWQ9IicraWQrJyIgaWQ9ImRlbmktaW52LWxpbmUtJytpZCsnIj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkIj48c3BhbiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkLWxhYmVsIj5MaW5lIEl0ZW08L3NwYW4+JysKICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJkZW5pLWludi1saW5lLXJlbW92ZSIgYXJpYS1sYWJlbD0iUmVtb3ZlIiBvbmNsaWNrPSJ3aW5kb3cuYXNjSW52JiZ3aW5kb3cuYXNjSW52LnJlbW92ZUxpbmUoXCcnK2lkKydcJykiPlx1MDBENzwvYnV0dG9uPicrCiAgICAgICc8L2Rpdj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1ncmlkIj4nKwogICAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1maWVsZCI+PGxhYmVsPkRlc2NyaXB0aW9uPC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgZGF0YS1saW5lLWZpZWxkPSJkZXNjcmlwdGlvbiIgcGxhY2Vob2xkZXI9IlNlcnZpY2Ugb3IgcHJvZHVjdCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLWdyaWQtMyI+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5RdWFudGl0eTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBzdGVwPSIwLjAxIiBkYXRhLWxpbmUtZmllbGQ9InF1YW50aXR5IiB2YWx1ZT0iMSIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5Vbml0IFByaWNlPC9sYWJlbD48aW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49IjAiIHN0ZXA9IjAuMDEiIGRhdGEtbGluZS1maWVsZD0idW5pdFByaWNlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5UYXggJTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9IjEwMCIgc3RlcD0iMC4wMSIgZGF0YS1saW5lLWZpZWxkPSJ0YXhSYXRlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLXRvdGFsIj48c3Bhbj5MaW5lIFRvdGFsPC9zcGFuPjxzdHJvbmcgZGF0YS1saW5lLXRvdGFsPiQwLjAwPC9zdHJvbmc+PC9kaXY+JysKICAgICc8L2Rpdj4nOwogIH0KCiAgZnVuY3Rpb24gcmVhZExpbmVzKCl7CiAgICB2YXIgcm93cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZGVuaS1pbnYtbGluZXMgLmRlbmktaW52LWxpbmUtaXRlbScpOwogICAgdmFyIGFycj1bXSxpLHJvdyxkZXNjLHF0eSxwcmljZSx0YXg7CiAgICBmb3IoaT0wO2k8cm93cy5sZW5ndGg7aSsrKXsKICAgICAgcm93PXJvd3NbaV07CiAgICAgIGRlc2M9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9ImRlc2NyaXB0aW9uIl0nKTsKICAgICAgcXR5PXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJxdWFudGl0eSJdJyk7CiAgICAgIHByaWNlPXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJ1bml0UHJpY2UiXScpOwogICAgICB0YXg9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9InRheFJhdGUiXScpOwogICAgICBhcnIucHVzaCh7CiAgICAgICAgZWw6cm93LAogICAgICAgIGRlc2NyaXB0aW9uOmRlc2M\/ZGVzYy52YWx1ZTonJywKICAgICAgICBxdWFudGl0eTpudW0ocXR5JiZxdHkudmFsdWUpLAogICAgICAgIHVuaXRQcmljZTpudW0ocHJpY2UmJnByaWNlLnZhbHVlKSwKICAgICAgICB0YXhSYXRlOm51bSh0YXgmJnRheC52YWx1ZSkKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gYXJyOwogIH0KCiAgZnVuY3Rpb24gcmVjb21wdXRlKCl7CiAgICB2YXIgY3VyPXZhbCgnZGVuaS1pbnYtY3VycmVuY3knKXx8J1VTRCc7CiAgICB2YXIgc3ltPWN1clN5bShjdXIpOwogICAgdmFyIGxpbmVzPXJlYWRMaW5lcygpOwogICAgdmFyIHN1YnRvdGFsPTAsdGF4PTAsaSxsaW5lLGxpbmVTdWIsbGluZVRheCx0b3RhbEVsOwogICAgZm9yKGk9MDtpPGxpbmVzLmxlbmd0aDtpKyspewogICAgICBsaW5lPWxpbmVzW2ldOwogICAgICBsaW5lU3ViPWxpbmUucXVhbnRpdHkqbGluZS51bml0UHJpY2U7CiAgICAgIGxpbmVUYXg9bGluZVN1YipsaW5lLnRheFJhdGUvMTAwOwogICAgICBzdWJ0b3RhbCs9bGluZVN1YjsKICAgICAgdGF4Kz1saW5lVGF4OwogICAgICB0b3RhbEVsPWxpbmUuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbGluZS10b3RhbF0nKTsKICAgICAgaWYodG90YWxFbCl0b3RhbEVsLnRleHRDb250ZW50PWZtdChsaW5lU3ViK2xpbmVUYXgsY3VyKTsKICAgIH0KICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgIHZhciB0b3RhbD1zdWJ0b3RhbCt0YXgtZGlzY291bnQ7CiAgICB2YXIgc3ViRWw9JCgnZGVuaS1pbnYtc3VidG90YWwnKTtpZihzdWJFbClzdWJFbC50ZXh0Q29udGVudD1mbXQoc3VidG90YWwsY3VyKTsKICAgIHZhciB0YXhFbD0kKCdkZW5pLWludi10YXgnKTtpZih0YXhFbCl0YXhFbC50ZXh0Q29udGVudD1mbXQodGF4LGN1cik7CiAgICB2YXIgZGlzY0VsPSQoJ2RlbmktaW52LWRpc2NvdW50LWRpc3BsYXknKTtpZihkaXNjRWwpZGlzY0VsLnRleHRDb250ZW50PSctJytmbXQoZGlzY291bnQsY3VyKTsKICAgIHZhciB0b3RFbD0kKCdkZW5pLWludi10b3RhbCcpO2lmKHRvdEVsKXRvdEVsLnRleHRDb250ZW50PWZtdCh0b3RhbCxjdXIpOwogICAgLy8gS2VlcCBjdXJyZW5jeSBzeW1ib2wgaW4gc3VtbWFyeSBpbiBzeW5jCiAgICB2YXIgc3ltRWxzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWN1ci1zeW1dJyk7CiAgICBmb3IoaT0wO2k8c3ltRWxzLmxlbmd0aDtpKyspc3ltRWxzW2ldLnRleHRDb250ZW50PXN5bTsKICB9CgogIGZ1bmN0aW9uIGFkZExpbmUoKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIGJveC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsbGluZVJvd0h0bWwodWlkKCkpKTsKICAgIHJlY29tcHV0ZSgpOwogIH0KICBmdW5jdGlvbiByZW1vdmVMaW5lKGlkKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIHZhciByb3dzPWJveC5xdWVyeVNlbGVjdG9yQWxsKCcuZGVuaS1pbnYtbGluZS1pdGVtJyk7CiAgICBpZihyb3dzLmxlbmd0aDw9MSlyZXR1cm47CiAgICB2YXIgcm93PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZW5pLWludi1saW5lLScraWQpOwogICAgaWYocm93KXJvdy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHJvdyk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIGZ1bmN0aW9uIHNob3dUb2FzdChtc2csa2luZCl7CiAgICB2YXIgdD0kKCdkZW5pLWludi10b2FzdCcpO2lmKCF0KXJldHVybjsKICAgIHQudGV4dENvbnRlbnQ9bXNnOwogICAgdC5jbGFzc05hbWU9J2RlbmktaW52LXRvYXN0IGRlbmktaW52LXRvYXN0LXNob3cnKyhraW5kPT09J3N1Y2Nlc3MnPycgZGVuaS1pbnYtdG9hc3Qtc3VjY2Vzcyc6JycpOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xhc3NOYW1lPSdkZW5pLWludi10b2FzdCc7fSwzNTAwKTsKICB9CgogIGZ1bmN0aW9uIHJlc2V0KCl7CiAgICB2YXIgZGVmcz17J2RlbmktaW52LWJ1c2luZXNzLW5hbWUnOicnLCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJzonJywnZGVuaS1pbnYtYnVzaW5lc3MtY29udGFjdCc6JycsJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCc6JycsJ2RlbmktaW52LWNsaWVudC1uYW1lJzonJywnZGVuaS1pbnYtY2xpZW50LWNvbXBhbnknOicnLCdkZW5pLWludi1jbGllbnQtYWRkcmVzcyc6JycsJ2RlbmktaW52LWNsaWVudC1jb250YWN0JzonJywnZGVuaS1pbnYtZGlzY291bnQnOicwJywnZGVuaS1pbnYtcGF5bWVudC10ZXJtcyc6IlBhdGllbnQgcG9ydGlvbiBkdWUgYXQgdGltZSBvZiBzZXJ2aWNlLiBJbnN1cmFuY2UgYmFsYW5jZSBiaWxsZWQgdG8gY2Fycmllci4iLCdkZW5pLWludi1ub3Rlcyc6Jyd9OwogICAgdmFyIGs7Zm9yKGsgaW4gZGVmcylzZXRWYWwoayxkZWZzW2tdKTsKICAgIGlmKCQoJ2RlbmktaW52LXBhdGllbnQtaWQnKSkkKCdkZW5pLWludi1wYXRpZW50LWlkJykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtZGF0ZS1vZi10cmVhdG1lbnQnKSkkKCdkZW5pLWludi1kYXRlLW9mLXRyZWF0bWVudCcpLnZhbHVlPScnO2lmKCQoJ2RlbmktaW52LXRyZWF0aW5nLWRlbnRpc3QnKSkkKCdkZW5pLWludi10cmVhdGluZy1kZW50aXN0JykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtaW5zdXJhbmNlLXBvbGljeScpKSQoJ2RlbmktaW52LWluc3VyYW5jZS1wb2xpY3knKS52YWx1ZT0nJztpZigkKCdkZW5pLWludi1wcmlvci1hdXRob3JpemF0aW9uJykpJCgnZGVuaS1pbnYtcHJpb3ItYXV0aG9yaXphdGlvbicpLnZhbHVlPScnOwogICAgdmFyIGQ9bmV3IERhdGUoKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWlzc3VlLWRhdGUnLGQudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHZhciBkdWU9bmV3IERhdGUoZC5nZXRUaW1lKCkrMzAqMjQqNjAqNjAqMTAwMCk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWR1ZS1kYXRlJyxkdWUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtY3VycmVuY3knLCdVU0QnKTsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTsKICAgIGlmKGJveCl7Ym94LmlubmVySFRNTD1saW5lUm93SHRtbCh1aWQoKSk7fQogICAgcmVjb21wdXRlKCk7CiAgfQoKICB2YXIganNQZGZQcm9taXNlPW51bGw7CiAgZnVuY3Rpb24gZW5zdXJlSnNQREYoKXsKICAgIGlmKGpzUGRmUHJvbWlzZSlyZXR1cm4ganNQZGZQcm9taXNlOwogICAganNQZGZQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXsKICAgICAgaWYod2luZG93LmpzcGRmJiZ3aW5kb3cuanNwZGYuanNQREYpcmV0dXJuIHJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTsKICAgICAgdmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgIHMuc3JjPSdodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9qc3BkZi8yLjUuMS9qc3BkZi51bWQubWluLmpzJzsKICAgICAgcy5hc3luYz10cnVlOwogICAgICBzLm9ubG9hZD1mdW5jdGlvbigpe2lmKHdpbmRvdy5qc3BkZiYmd2luZG93LmpzcGRmLmpzUERGKXJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTtlbHNlIHJlamVjdChuZXcgRXJyb3IoJ2pzUERGIG5vdCBhdmFpbGFibGUnKSk7fTsKICAgICAgcy5vbmVycm9yPWZ1bmN0aW9uKCl7cmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQganNQREYgZnJvbSBDRE4nKSk7fTsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTsKICAgIH0pOwogICAgcmV0dXJuIGpzUGRmUHJvbWlzZTsKICB9CgogIGZ1bmN0aW9uIGRvd25sb2FkKCl7CiAgICB2YXIgYnVzaW5lc3NOYW1lPXZhbCgnZGVuaS1pbnYtYnVzaW5lc3MtbmFtZScpLnRyaW0oKTsKICAgIHZhciBjbGllbnROYW1lPXZhbCgnZGVuaS1pbnYtY2xpZW50LW5hbWUnKS50cmltKCk7CiAgICBpZighYnVzaW5lc3NOYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB5b3VyIGJ1c2luZXNzIG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIGlmKCFjbGllbnROYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB0aGUgcmVjaXBpZW50IG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIHZhciBsaW5lcz1yZWFkTGluZXMoKTsKICAgIHZhciBoYXNJdGVtPWZhbHNlLGk7CiAgICBmb3IoaT0wO2k8bGluZXMubGVuZ3RoO2krKyl7aWYoKGxpbmVzW2ldLnF1YW50aXR5KmxpbmVzW2ldLnVuaXRQcmljZSk+MHx8KGxpbmVzW2ldLmRlc2NyaXB0aW9uJiZsaW5lc1tpXS5kZXNjcmlwdGlvbi5sZW5ndGg+MCkpe2hhc0l0ZW09dHJ1ZTticmVhazt9fQogICAgaWYoIWhhc0l0ZW0pe3Nob3dUb2FzdCgnUGxlYXNlIGFkZCBhdCBsZWFzdCBvbmUgbGluZSBpdGVtLicsJ2VycicpO3JldHVybjt9CiAgICBzaG93VG9hc3QoJ1ByZXBhcmluZyBQREYuLi4nLCdzdWNjZXNzJyk7CiAgICBlbnN1cmVKc1BERigpLnRoZW4oZnVuY3Rpb24oanNQREYpewogICAgICB0cnl7CiAgICAgICAgdmFyIGRvYz1uZXcganNQREYoe29yaWVudGF0aW9uOidwb3J0cmFpdCcsdW5pdDonbW0nLGZvcm1hdDonYTQnfSk7CiAgICAgICAgdmFyIGN1cj12YWwoJ2RlbmktaW52LWN1cnJlbmN5Jyl8fCdVU0QnOwogICAgICAgIHZhciBzeW09Y3VyU3ltKGN1cik7CiAgICAgICAgdmFyIHlQb3M9MjA7CgogICAgICAgIGRvYy5zZXRGb250U2l6ZSgyMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy50ZXh0KCJERU5UQUwgSU5WT0lDRSIsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTEyOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dChidXNpbmVzc05hbWUsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDkpOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgdmFyIGJpekFkZHI9dmFsKCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJyk7CiAgICAgICAgdmFyIGJpekNvbnRhY3Q9dmFsKCdkZW5pLWludi1idXNpbmVzcy1jb250YWN0Jyk7CiAgICAgICAgdmFyIGJpelRheD12YWwoJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCcpOwogICAgICAgIGlmKGJpekFkZHIpe2RvYy50ZXh0KGJpekFkZHIsMjAseVBvcyk7eVBvcys9NTt9CiAgICAgICAgaWYoYml6Q29udGFjdCl7ZG9jLnRleHQoYml6Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICBpZihiaXpUYXgpe2RvYy50ZXh0KCdUYXggSUQ6ICcrYml6VGF4LDIwLHlQb3MpO3lQb3MrPTU7fQoKICAgICAgICBkb2Muc2V0Rm9udFNpemUoOSk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dCgnSW52b2ljZSAjOiAnK3ZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInKSwxNDAsMzApOwogICAgICAgIGRvYy50ZXh0KCdJc3N1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpLDE0MCwzNik7CiAgICAgICAgZG9jLnRleHQoJ0R1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKSwxNDAsNDIpOwogICAgICAgIGRvYy50ZXh0KCdDdXJyZW5jeTogJytjdXIsMTQwLDQ4KTsKCiAgICAgICAgeVBvcz1NYXRoLm1heCh5UG9zLDYwKTsKICAgICAgICBkb2Muc2V0Rm9udFNpemUoMTApOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2MudGV4dCgiUEFUSUVOVCBERVRBSUxTIiwyMCx5UG9zKTsKICAgICAgICB5UG9zKz02OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDEyLDAsNTApOwogICAgICAgIGRvYy50ZXh0KGNsaWVudE5hbWUsMjAseVBvcyk7eVBvcys9NTsKICAgICAgICB2YXIgY2xpZW50Q29tcGFueT12YWwoJ2RlbmktaW52LWNsaWVudC1jb21wYW55Jyk7CiAgICAgICAgaWYoY2xpZW50Q29tcGFueSl7ZG9jLnRleHQoY2xpZW50Q29tcGFueSwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50QWRkcj12YWwoJ2RlbmktaW52LWNsaWVudC1hZGRyZXNzJyk7CiAgICAgICAgaWYoY2xpZW50QWRkcil7ZG9jLnRleHQoY2xpZW50QWRkciwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50Q29udGFjdD12YWwoJ2RlbmktaW52LWNsaWVudC1jb250YWN0Jyk7CiAgICAgICAgaWYoY2xpZW50Q29udGFjdCl7ZG9jLnRleHQoY2xpZW50Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KCiAgICAgICAgLy8gRXh0cmEgZmllbGRzIGJsb2NrIChpZiBjb25maWcgZGVmaW5lZCBhbnkpCiAgICAgICAgdmFyIGV4dHJhSWRzPVsicGF0aWVudC1pZCIsImRhdGUtb2YtdHJlYXRtZW50IiwidHJlYXRpbmctZGVudGlzdCIsImluc3VyYW5jZS1wb2xpY3kiLCJwcmlvci1hdXRob3JpemF0aW9uIl07CiAgICAgICAgdmFyIGV4dHJhTGFiZWxzPVsiUGF0aWVudCBJRCAvIENoYXJ0ICMiLCJEYXRlIG9mIFRyZWF0bWVudCIsIlRyZWF0aW5nIERlbnRpc3QiLCJJbnN1cmFuY2UgUG9saWN5ICMiLCJQcmUtQXV0aG9yaXphdGlvbiAjIl07CiAgICAgICAgdmFyIGFueUV4dHJhPWZhbHNlOwogICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXtpZih2YWwoJ2RlbmktaW52LScrZXh0cmFJZHNbaV0pKWFueUV4dHJhPXRydWU7fQogICAgICAgIGlmKGFueUV4dHJhKXsKICAgICAgICAgIHlQb3MrPTQ7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICAgIGRvYy50ZXh0KCdERVRBSUxTJywyMCx5UG9zKTt5UG9zKz02OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXsKICAgICAgICAgICAgdmFyIHY9dmFsKCdkZW5pLWludi0nK2V4dHJhSWRzW2ldKTsKICAgICAgICAgICAgaWYodil7ZG9jLnRleHQoZXh0cmFMYWJlbHNbaV0rJzogJyt2LDIwLHlQb3MpO3lQb3MrPTU7fQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgeVBvcys9ODsKICAgICAgICBkb2Muc2V0RmlsbENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy5yZWN0KDIwLHlQb3MsMTcwLDgsJ0YnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDI1NSwyNTUsMjU1KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSg5KTsKICAgICAgICBkb2MudGV4dCgnRGVzY3JpcHRpb24nLDIzLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnUXR5JywxMTAseVBvcys1LjUpOwogICAgICAgIGRvYy50ZXh0KCdQcmljZScsMTI3LHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVGF4JScsMTUwLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVG90YWwnLDE3MCx5UG9zKzUuNSk7CiAgICAgICAgeVBvcys9MTI7CgogICAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMTIsMCw1MCk7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIHZhciBzdWJ0b3RhbD0wLHRheEFtdD0wOwogICAgICAgIGZvcihpPTA7aTxsaW5lcy5sZW5ndGg7aSsrKXsKICAgICAgICAgIGlmKHlQb3M+MjcwKXtkb2MuYWRkUGFnZSgpO3lQb3M9MjA7fQogICAgICAgICAgdmFyIGxpbj1saW5lc1tpXTsKICAgICAgICAgIHZhciBscz1saW4ucXVhbnRpdHkqbGluLnVuaXRQcmljZTsKICAgICAgICAgIHZhciBsdD1scypsaW4udGF4UmF0ZS8xMDA7CiAgICAgICAgICBzdWJ0b3RhbCs9bHM7dGF4QW10Kz1sdDsKICAgICAgICAgIHZhciBkZXNjVHh0PShsaW4uZGVzY3JpcHRpb258fCcnKS5zbGljZSgwLDQ2KTsKICAgICAgICAgIGRvYy50ZXh0KGRlc2NUeHQsMjMseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChTdHJpbmcobGluLnF1YW50aXR5KSwxMTAseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChzeW0rbGluLnVuaXRQcmljZS50b0ZpeGVkKDIpLDEyNyx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KGxpbi50YXhSYXRlLnRvRml4ZWQoMikrJyUnLDE1MCx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KHN5bSsobHMrbHQpLnRvRml4ZWQoMiksMTcwLHlQb3MpOwogICAgICAgICAgeVBvcys9NjsKICAgICAgICB9CgogICAgICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgICAgICB2YXIgdG90YWw9c3VidG90YWwrdGF4QW10LWRpc2NvdW50OwogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgZG9jLnRleHQoJ1N1YnRvdGFsOicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bStzdWJ0b3RhbC50b0ZpeGVkKDIpLDE4OCx5UG9zLHthbGlnbjoncmlnaHQnfSk7CiAgICAgICAgeVBvcys9NjsKICAgICAgICBkb2MudGV4dCgnVGF4OicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bSt0YXhBbXQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIGlmKGRpc2NvdW50PjApewogICAgICAgICAgeVBvcys9NjsKICAgICAgICAgIGRvYy50ZXh0KCdEaXNjb3VudDonLDEzNSx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KCctJytzeW0rZGlzY291bnQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIH0KICAgICAgICB5UG9zKz04OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDEzKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy50ZXh0KCdUb3RhbDonLDEzNSx5UG9zKTsKICAgICAgICBkb2MudGV4dChzeW0rdG90YWwudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwoKICAgICAgICB2YXIgcHRlcm1zPXZhbCgnZGVuaS1pbnYtcGF5bWVudC10ZXJtcycpOwogICAgICAgIGlmKHB0ZXJtcyl7CiAgICAgICAgICB5UG9zKz0xNDsKICAgICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdQYXltZW50IFRlcm1zJywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPTU7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnbm9ybWFsJyk7CiAgICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgICB2YXIgcHRMaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKHB0ZXJtcywxNzApOwogICAgICAgICAgZG9jLnRleHQocHRMaW5lcywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPXB0TGluZXMubGVuZ3RoKjU7CiAgICAgICAgfQoKICAgICAgICB2YXIgbm90ZXNWYWw9dmFsKCdkZW5pLWludi1ub3RlcycpOwogICAgICAgIGlmKG5vdGVzVmFsKXsKICAgICAgICAgIHlQb3MrPTY7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdOb3RlcycsMjAseVBvcyk7CiAgICAgICAgICB5UG9zKz01OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcig5MCw4NSwxMTIpOwogICAgICAgICAgdmFyIG5MaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKG5vdGVzVmFsLDE3MCk7CiAgICAgICAgICBkb2MudGV4dChuTGluZXMsMjAseVBvcyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZm5hbWU9dmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpfHwnaW52b2ljZSc7CiAgICAgICAgZG9jLnNhdmUoJ0ludm9pY2VfJytmbmFtZSsnLnBkZicpOwogICAgICAgIHNob3dUb2FzdCgnUERGIGRvd25sb2FkZWQuJywnc3VjY2VzcycpOwogICAgICB9Y2F0Y2goZXJyKXsKICAgICAgICBzaG93VG9hc3QoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBQREY6ICcrKGVyciYmZXJyLm1lc3NhZ2U\/ZXJyLm1lc3NhZ2U6ZXJyKSwnZXJyJyk7CiAgICAgIH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycil7CiAgICAgIHNob3dUb2FzdCgnQ291bGQgbm90IGxvYWQgUERGIGxpYnJhcnk6ICcrZXJyLm1lc3NhZ2UsJ2VycicpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzY3JvbGwoKXt2YXIgdD0kKCdkZW5pLWludi1nZW5lcmF0b3InKTtpZih0JiZ0LnNjcm9sbEludG9WaWV3KXQuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnLGJsb2NrOidzdGFydCd9KTt9CgogIGZ1bmN0aW9uIGJvb3QoKXsKICAgIGlmKGJvb3RlZClyZXR1cm47Ym9vdGVkPXRydWU7CiAgICAvLyBXaXJlIGdlbmVyaWMgaW5wdXQgbGlzdGVuZXJzIHRvIGtlZXAgdG90YWxzIGxpdmUKICAgIHZhciBpbnB1dHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2RlbmktaW52LWdlbmVyYXRvciBpbnB1dCwgI2RlbmktaW52LWdlbmVyYXRvciBzZWxlY3QnKTsKICAgIHZhciBpO2ZvcihpPTA7aTxpbnB1dHMubGVuZ3RoO2krKyl7aW5wdXRzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JyxyZWNvbXB1dGUpO2lucHV0c1tpXS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLHJlY29tcHV0ZSk7fQogICAgLy8gU2VlZCBpbnZvaWNlIG51bWJlciArIGRhdGVzIGlmIGJsYW5rIChoYW5kbGVzIGZyZXNoIHBhZ2UgbG9hZCkKICAgIHZhciBkPW5ldyBEYXRlKCk7CiAgICBpZighdmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpKXNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBpZighdmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpc2V0VmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJyxkLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICBpZighdmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKXNldFZhbCgnZGVuaS1pbnYtZHVlLWRhdGUnLG5ldyBEYXRlKGQuZ2V0VGltZSgpKzMwKjI0KjYwKjYwKjEwMDApLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIHdpbmRvdy5hc2NJbnY9d2luZG93LmFzY0ludnx8ewogICAgYm9vdDpib290LGFkZExpbmU6YWRkTGluZSxyZW1vdmVMaW5lOnJlbW92ZUxpbmUscmVjb21wdXRlOnJlY29tcHV0ZSwKICAgIGRvd25sb2FkOmRvd25sb2FkLHJlc2V0OnJlc2V0LHNjcm9sbDpzY3JvbGwKICB9OwogIGJvb3QoKTsKfSkoKTs=')))();}window.deniInv&#038;&#038;window.deniInv.recompute&#038;&#038;window.deniInv.recompute();\"><\/div>\n<div class=\"deni-inv-summary-row\"><span class=\"deni-inv-summary-row-key\">Discount<\/span><span class=\"deni-inv-summary-row-val deni-inv-summary-discount-val\" id=\"deni-inv-discount-display\">-$0.00<\/span><\/div>\n<div class=\"deni-inv-summary-divider\"><\/div>\n<div class=\"deni-inv-summary-total\"><span class=\"deni-inv-summary-total-key\">Total<\/span><span class=\"deni-inv-summary-total-val\" id=\"deni-inv-total\">$0.00<\/span><\/div>\n<\/div>\n<div class=\"deni-inv-card\">\n<div class=\"deni-inv-card-head\"><h3>Additional Information<\/h3><\/div>\n<div class=\"deni-inv-card-body\">\n<div class=\"deni-inv-field\"><label for=\"deni-inv-payment-terms\">Payment Terms<\/label><input type=\"text\" id=\"deni-inv-payment-terms\" value=\"Patient portion due at time of service. Insurance balance billed to carrier.\" placeholder=\"e.g. Net 30 - payment due within 30 days\"><\/div>\n<div class=\"deni-inv-field\"><label for=\"deni-inv-notes\">Notes<\/label><textarea id=\"deni-inv-notes\" rows=\"4\" placeholder=\"Treatment plan reference, ADA\/CDT codes, follow-up appointments\"><\/textarea><\/div>\n<\/div>\n<\/div>\n<button type=\"button\" class=\"deni-inv-download-btn\" onclick=\"if(!window.deniInvBooted){window.deniInvBooted=1;(new Function(atob('KGZ1bmN0aW9uKCl7CiAgdmFyIGJvb3RlZD1mYWxzZTsKICBmdW5jdGlvbiAkKGlkKXtyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO30KICBmdW5jdGlvbiB2YWwoaWQpe3ZhciBlbD0kKGlkKTtyZXR1cm4gZWw\/ZWwudmFsdWU6Jyc7fQogIGZ1bmN0aW9uIHNldFZhbChpZCx2KXt2YXIgZWw9JChpZCk7aWYoZWwpZWwudmFsdWU9djt9CiAgZnVuY3Rpb24gbnVtKHYpe3ZhciBuPXBhcnNlRmxvYXQodik7cmV0dXJuIGlzRmluaXRlKG4pP246MDt9CiAgZnVuY3Rpb24gZm10KG4sY3VyKXtjdXI9Y3VyfHwnVVNEJzt0cnl7cmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCgnZW4tVVMnLHtzdHlsZTonY3VycmVuY3knLGN1cnJlbmN5OmN1cixtaW5pbXVtRnJhY3Rpb25EaWdpdHM6Mn0pLmZvcm1hdChOdW1iZXIobil8fDApO31jYXRjaChfKXtyZXR1cm4gJyQnKygoTnVtYmVyKG4pfHwwKS50b0ZpeGVkKDIpKTt9fQogIGZ1bmN0aW9uIGN1clN5bShjKXt2YXIgbT17VVNEOickJyxFVVI6J+KCrCcsR0JQOifCoycsSU5SOifigrknLEFVRDonQSQnLENBRDonQyQnfTtyZXR1cm4gbVtjXXx8JyQnO30KICBmdW5jdGlvbiBmbXREYXRlKHMpe2lmKCFzKXJldHVybiAnJzt0cnl7dmFyIGQ9bmV3IERhdGUocyk7aWYoaXNOYU4oZCkpcmV0dXJuIHM7cmV0dXJuIGQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycse3llYXI6J251bWVyaWMnLG1vbnRoOidzaG9ydCcsZGF5OidudW1lcmljJ30pO31jYXRjaChfKXtyZXR1cm4gczt9fQogIGZ1bmN0aW9uIHVpZCgpe3JldHVybiAnbGknK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxZTkpLnRvU3RyaW5nKDM2KTt9CgogIGZ1bmN0aW9uIGxpbmVSb3dIdG1sKGlkKXsKICAgIHJldHVybiAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1pdGVtIiBkYXRhLWxpbmUtaWQ9IicraWQrJyIgaWQ9ImRlbmktaW52LWxpbmUtJytpZCsnIj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkIj48c3BhbiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkLWxhYmVsIj5MaW5lIEl0ZW08L3NwYW4+JysKICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJkZW5pLWludi1saW5lLXJlbW92ZSIgYXJpYS1sYWJlbD0iUmVtb3ZlIiBvbmNsaWNrPSJ3aW5kb3cuYXNjSW52JiZ3aW5kb3cuYXNjSW52LnJlbW92ZUxpbmUoXCcnK2lkKydcJykiPlx1MDBENzwvYnV0dG9uPicrCiAgICAgICc8L2Rpdj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1ncmlkIj4nKwogICAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1maWVsZCI+PGxhYmVsPkRlc2NyaXB0aW9uPC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgZGF0YS1saW5lLWZpZWxkPSJkZXNjcmlwdGlvbiIgcGxhY2Vob2xkZXI9IlNlcnZpY2Ugb3IgcHJvZHVjdCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLWdyaWQtMyI+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5RdWFudGl0eTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBzdGVwPSIwLjAxIiBkYXRhLWxpbmUtZmllbGQ9InF1YW50aXR5IiB2YWx1ZT0iMSIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5Vbml0IFByaWNlPC9sYWJlbD48aW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49IjAiIHN0ZXA9IjAuMDEiIGRhdGEtbGluZS1maWVsZD0idW5pdFByaWNlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5UYXggJTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9IjEwMCIgc3RlcD0iMC4wMSIgZGF0YS1saW5lLWZpZWxkPSJ0YXhSYXRlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLXRvdGFsIj48c3Bhbj5MaW5lIFRvdGFsPC9zcGFuPjxzdHJvbmcgZGF0YS1saW5lLXRvdGFsPiQwLjAwPC9zdHJvbmc+PC9kaXY+JysKICAgICc8L2Rpdj4nOwogIH0KCiAgZnVuY3Rpb24gcmVhZExpbmVzKCl7CiAgICB2YXIgcm93cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZGVuaS1pbnYtbGluZXMgLmRlbmktaW52LWxpbmUtaXRlbScpOwogICAgdmFyIGFycj1bXSxpLHJvdyxkZXNjLHF0eSxwcmljZSx0YXg7CiAgICBmb3IoaT0wO2k8cm93cy5sZW5ndGg7aSsrKXsKICAgICAgcm93PXJvd3NbaV07CiAgICAgIGRlc2M9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9ImRlc2NyaXB0aW9uIl0nKTsKICAgICAgcXR5PXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJxdWFudGl0eSJdJyk7CiAgICAgIHByaWNlPXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJ1bml0UHJpY2UiXScpOwogICAgICB0YXg9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9InRheFJhdGUiXScpOwogICAgICBhcnIucHVzaCh7CiAgICAgICAgZWw6cm93LAogICAgICAgIGRlc2NyaXB0aW9uOmRlc2M\/ZGVzYy52YWx1ZTonJywKICAgICAgICBxdWFudGl0eTpudW0ocXR5JiZxdHkudmFsdWUpLAogICAgICAgIHVuaXRQcmljZTpudW0ocHJpY2UmJnByaWNlLnZhbHVlKSwKICAgICAgICB0YXhSYXRlOm51bSh0YXgmJnRheC52YWx1ZSkKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gYXJyOwogIH0KCiAgZnVuY3Rpb24gcmVjb21wdXRlKCl7CiAgICB2YXIgY3VyPXZhbCgnZGVuaS1pbnYtY3VycmVuY3knKXx8J1VTRCc7CiAgICB2YXIgc3ltPWN1clN5bShjdXIpOwogICAgdmFyIGxpbmVzPXJlYWRMaW5lcygpOwogICAgdmFyIHN1YnRvdGFsPTAsdGF4PTAsaSxsaW5lLGxpbmVTdWIsbGluZVRheCx0b3RhbEVsOwogICAgZm9yKGk9MDtpPGxpbmVzLmxlbmd0aDtpKyspewogICAgICBsaW5lPWxpbmVzW2ldOwogICAgICBsaW5lU3ViPWxpbmUucXVhbnRpdHkqbGluZS51bml0UHJpY2U7CiAgICAgIGxpbmVUYXg9bGluZVN1YipsaW5lLnRheFJhdGUvMTAwOwogICAgICBzdWJ0b3RhbCs9bGluZVN1YjsKICAgICAgdGF4Kz1saW5lVGF4OwogICAgICB0b3RhbEVsPWxpbmUuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbGluZS10b3RhbF0nKTsKICAgICAgaWYodG90YWxFbCl0b3RhbEVsLnRleHRDb250ZW50PWZtdChsaW5lU3ViK2xpbmVUYXgsY3VyKTsKICAgIH0KICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgIHZhciB0b3RhbD1zdWJ0b3RhbCt0YXgtZGlzY291bnQ7CiAgICB2YXIgc3ViRWw9JCgnZGVuaS1pbnYtc3VidG90YWwnKTtpZihzdWJFbClzdWJFbC50ZXh0Q29udGVudD1mbXQoc3VidG90YWwsY3VyKTsKICAgIHZhciB0YXhFbD0kKCdkZW5pLWludi10YXgnKTtpZih0YXhFbCl0YXhFbC50ZXh0Q29udGVudD1mbXQodGF4LGN1cik7CiAgICB2YXIgZGlzY0VsPSQoJ2RlbmktaW52LWRpc2NvdW50LWRpc3BsYXknKTtpZihkaXNjRWwpZGlzY0VsLnRleHRDb250ZW50PSctJytmbXQoZGlzY291bnQsY3VyKTsKICAgIHZhciB0b3RFbD0kKCdkZW5pLWludi10b3RhbCcpO2lmKHRvdEVsKXRvdEVsLnRleHRDb250ZW50PWZtdCh0b3RhbCxjdXIpOwogICAgLy8gS2VlcCBjdXJyZW5jeSBzeW1ib2wgaW4gc3VtbWFyeSBpbiBzeW5jCiAgICB2YXIgc3ltRWxzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWN1ci1zeW1dJyk7CiAgICBmb3IoaT0wO2k8c3ltRWxzLmxlbmd0aDtpKyspc3ltRWxzW2ldLnRleHRDb250ZW50PXN5bTsKICB9CgogIGZ1bmN0aW9uIGFkZExpbmUoKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIGJveC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsbGluZVJvd0h0bWwodWlkKCkpKTsKICAgIHJlY29tcHV0ZSgpOwogIH0KICBmdW5jdGlvbiByZW1vdmVMaW5lKGlkKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIHZhciByb3dzPWJveC5xdWVyeVNlbGVjdG9yQWxsKCcuZGVuaS1pbnYtbGluZS1pdGVtJyk7CiAgICBpZihyb3dzLmxlbmd0aDw9MSlyZXR1cm47CiAgICB2YXIgcm93PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZW5pLWludi1saW5lLScraWQpOwogICAgaWYocm93KXJvdy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHJvdyk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIGZ1bmN0aW9uIHNob3dUb2FzdChtc2csa2luZCl7CiAgICB2YXIgdD0kKCdkZW5pLWludi10b2FzdCcpO2lmKCF0KXJldHVybjsKICAgIHQudGV4dENvbnRlbnQ9bXNnOwogICAgdC5jbGFzc05hbWU9J2RlbmktaW52LXRvYXN0IGRlbmktaW52LXRvYXN0LXNob3cnKyhraW5kPT09J3N1Y2Nlc3MnPycgZGVuaS1pbnYtdG9hc3Qtc3VjY2Vzcyc6JycpOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xhc3NOYW1lPSdkZW5pLWludi10b2FzdCc7fSwzNTAwKTsKICB9CgogIGZ1bmN0aW9uIHJlc2V0KCl7CiAgICB2YXIgZGVmcz17J2RlbmktaW52LWJ1c2luZXNzLW5hbWUnOicnLCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJzonJywnZGVuaS1pbnYtYnVzaW5lc3MtY29udGFjdCc6JycsJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCc6JycsJ2RlbmktaW52LWNsaWVudC1uYW1lJzonJywnZGVuaS1pbnYtY2xpZW50LWNvbXBhbnknOicnLCdkZW5pLWludi1jbGllbnQtYWRkcmVzcyc6JycsJ2RlbmktaW52LWNsaWVudC1jb250YWN0JzonJywnZGVuaS1pbnYtZGlzY291bnQnOicwJywnZGVuaS1pbnYtcGF5bWVudC10ZXJtcyc6IlBhdGllbnQgcG9ydGlvbiBkdWUgYXQgdGltZSBvZiBzZXJ2aWNlLiBJbnN1cmFuY2UgYmFsYW5jZSBiaWxsZWQgdG8gY2Fycmllci4iLCdkZW5pLWludi1ub3Rlcyc6Jyd9OwogICAgdmFyIGs7Zm9yKGsgaW4gZGVmcylzZXRWYWwoayxkZWZzW2tdKTsKICAgIGlmKCQoJ2RlbmktaW52LXBhdGllbnQtaWQnKSkkKCdkZW5pLWludi1wYXRpZW50LWlkJykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtZGF0ZS1vZi10cmVhdG1lbnQnKSkkKCdkZW5pLWludi1kYXRlLW9mLXRyZWF0bWVudCcpLnZhbHVlPScnO2lmKCQoJ2RlbmktaW52LXRyZWF0aW5nLWRlbnRpc3QnKSkkKCdkZW5pLWludi10cmVhdGluZy1kZW50aXN0JykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtaW5zdXJhbmNlLXBvbGljeScpKSQoJ2RlbmktaW52LWluc3VyYW5jZS1wb2xpY3knKS52YWx1ZT0nJztpZigkKCdkZW5pLWludi1wcmlvci1hdXRob3JpemF0aW9uJykpJCgnZGVuaS1pbnYtcHJpb3ItYXV0aG9yaXphdGlvbicpLnZhbHVlPScnOwogICAgdmFyIGQ9bmV3IERhdGUoKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWlzc3VlLWRhdGUnLGQudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHZhciBkdWU9bmV3IERhdGUoZC5nZXRUaW1lKCkrMzAqMjQqNjAqNjAqMTAwMCk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWR1ZS1kYXRlJyxkdWUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtY3VycmVuY3knLCdVU0QnKTsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTsKICAgIGlmKGJveCl7Ym94LmlubmVySFRNTD1saW5lUm93SHRtbCh1aWQoKSk7fQogICAgcmVjb21wdXRlKCk7CiAgfQoKICB2YXIganNQZGZQcm9taXNlPW51bGw7CiAgZnVuY3Rpb24gZW5zdXJlSnNQREYoKXsKICAgIGlmKGpzUGRmUHJvbWlzZSlyZXR1cm4ganNQZGZQcm9taXNlOwogICAganNQZGZQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXsKICAgICAgaWYod2luZG93LmpzcGRmJiZ3aW5kb3cuanNwZGYuanNQREYpcmV0dXJuIHJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTsKICAgICAgdmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgIHMuc3JjPSdodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9qc3BkZi8yLjUuMS9qc3BkZi51bWQubWluLmpzJzsKICAgICAgcy5hc3luYz10cnVlOwogICAgICBzLm9ubG9hZD1mdW5jdGlvbigpe2lmKHdpbmRvdy5qc3BkZiYmd2luZG93LmpzcGRmLmpzUERGKXJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTtlbHNlIHJlamVjdChuZXcgRXJyb3IoJ2pzUERGIG5vdCBhdmFpbGFibGUnKSk7fTsKICAgICAgcy5vbmVycm9yPWZ1bmN0aW9uKCl7cmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQganNQREYgZnJvbSBDRE4nKSk7fTsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTsKICAgIH0pOwogICAgcmV0dXJuIGpzUGRmUHJvbWlzZTsKICB9CgogIGZ1bmN0aW9uIGRvd25sb2FkKCl7CiAgICB2YXIgYnVzaW5lc3NOYW1lPXZhbCgnZGVuaS1pbnYtYnVzaW5lc3MtbmFtZScpLnRyaW0oKTsKICAgIHZhciBjbGllbnROYW1lPXZhbCgnZGVuaS1pbnYtY2xpZW50LW5hbWUnKS50cmltKCk7CiAgICBpZighYnVzaW5lc3NOYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB5b3VyIGJ1c2luZXNzIG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIGlmKCFjbGllbnROYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB0aGUgcmVjaXBpZW50IG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIHZhciBsaW5lcz1yZWFkTGluZXMoKTsKICAgIHZhciBoYXNJdGVtPWZhbHNlLGk7CiAgICBmb3IoaT0wO2k8bGluZXMubGVuZ3RoO2krKyl7aWYoKGxpbmVzW2ldLnF1YW50aXR5KmxpbmVzW2ldLnVuaXRQcmljZSk+MHx8KGxpbmVzW2ldLmRlc2NyaXB0aW9uJiZsaW5lc1tpXS5kZXNjcmlwdGlvbi5sZW5ndGg+MCkpe2hhc0l0ZW09dHJ1ZTticmVhazt9fQogICAgaWYoIWhhc0l0ZW0pe3Nob3dUb2FzdCgnUGxlYXNlIGFkZCBhdCBsZWFzdCBvbmUgbGluZSBpdGVtLicsJ2VycicpO3JldHVybjt9CiAgICBzaG93VG9hc3QoJ1ByZXBhcmluZyBQREYuLi4nLCdzdWNjZXNzJyk7CiAgICBlbnN1cmVKc1BERigpLnRoZW4oZnVuY3Rpb24oanNQREYpewogICAgICB0cnl7CiAgICAgICAgdmFyIGRvYz1uZXcganNQREYoe29yaWVudGF0aW9uOidwb3J0cmFpdCcsdW5pdDonbW0nLGZvcm1hdDonYTQnfSk7CiAgICAgICAgdmFyIGN1cj12YWwoJ2RlbmktaW52LWN1cnJlbmN5Jyl8fCdVU0QnOwogICAgICAgIHZhciBzeW09Y3VyU3ltKGN1cik7CiAgICAgICAgdmFyIHlQb3M9MjA7CgogICAgICAgIGRvYy5zZXRGb250U2l6ZSgyMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy50ZXh0KCJERU5UQUwgSU5WT0lDRSIsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTEyOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dChidXNpbmVzc05hbWUsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDkpOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgdmFyIGJpekFkZHI9dmFsKCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJyk7CiAgICAgICAgdmFyIGJpekNvbnRhY3Q9dmFsKCdkZW5pLWludi1idXNpbmVzcy1jb250YWN0Jyk7CiAgICAgICAgdmFyIGJpelRheD12YWwoJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCcpOwogICAgICAgIGlmKGJpekFkZHIpe2RvYy50ZXh0KGJpekFkZHIsMjAseVBvcyk7eVBvcys9NTt9CiAgICAgICAgaWYoYml6Q29udGFjdCl7ZG9jLnRleHQoYml6Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICBpZihiaXpUYXgpe2RvYy50ZXh0KCdUYXggSUQ6ICcrYml6VGF4LDIwLHlQb3MpO3lQb3MrPTU7fQoKICAgICAgICBkb2Muc2V0Rm9udFNpemUoOSk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dCgnSW52b2ljZSAjOiAnK3ZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInKSwxNDAsMzApOwogICAgICAgIGRvYy50ZXh0KCdJc3N1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpLDE0MCwzNik7CiAgICAgICAgZG9jLnRleHQoJ0R1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKSwxNDAsNDIpOwogICAgICAgIGRvYy50ZXh0KCdDdXJyZW5jeTogJytjdXIsMTQwLDQ4KTsKCiAgICAgICAgeVBvcz1NYXRoLm1heCh5UG9zLDYwKTsKICAgICAgICBkb2Muc2V0Rm9udFNpemUoMTApOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2MudGV4dCgiUEFUSUVOVCBERVRBSUxTIiwyMCx5UG9zKTsKICAgICAgICB5UG9zKz02OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDEyLDAsNTApOwogICAgICAgIGRvYy50ZXh0KGNsaWVudE5hbWUsMjAseVBvcyk7eVBvcys9NTsKICAgICAgICB2YXIgY2xpZW50Q29tcGFueT12YWwoJ2RlbmktaW52LWNsaWVudC1jb21wYW55Jyk7CiAgICAgICAgaWYoY2xpZW50Q29tcGFueSl7ZG9jLnRleHQoY2xpZW50Q29tcGFueSwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50QWRkcj12YWwoJ2RlbmktaW52LWNsaWVudC1hZGRyZXNzJyk7CiAgICAgICAgaWYoY2xpZW50QWRkcil7ZG9jLnRleHQoY2xpZW50QWRkciwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50Q29udGFjdD12YWwoJ2RlbmktaW52LWNsaWVudC1jb250YWN0Jyk7CiAgICAgICAgaWYoY2xpZW50Q29udGFjdCl7ZG9jLnRleHQoY2xpZW50Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KCiAgICAgICAgLy8gRXh0cmEgZmllbGRzIGJsb2NrIChpZiBjb25maWcgZGVmaW5lZCBhbnkpCiAgICAgICAgdmFyIGV4dHJhSWRzPVsicGF0aWVudC1pZCIsImRhdGUtb2YtdHJlYXRtZW50IiwidHJlYXRpbmctZGVudGlzdCIsImluc3VyYW5jZS1wb2xpY3kiLCJwcmlvci1hdXRob3JpemF0aW9uIl07CiAgICAgICAgdmFyIGV4dHJhTGFiZWxzPVsiUGF0aWVudCBJRCAvIENoYXJ0ICMiLCJEYXRlIG9mIFRyZWF0bWVudCIsIlRyZWF0aW5nIERlbnRpc3QiLCJJbnN1cmFuY2UgUG9saWN5ICMiLCJQcmUtQXV0aG9yaXphdGlvbiAjIl07CiAgICAgICAgdmFyIGFueUV4dHJhPWZhbHNlOwogICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXtpZih2YWwoJ2RlbmktaW52LScrZXh0cmFJZHNbaV0pKWFueUV4dHJhPXRydWU7fQogICAgICAgIGlmKGFueUV4dHJhKXsKICAgICAgICAgIHlQb3MrPTQ7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICAgIGRvYy50ZXh0KCdERVRBSUxTJywyMCx5UG9zKTt5UG9zKz02OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXsKICAgICAgICAgICAgdmFyIHY9dmFsKCdkZW5pLWludi0nK2V4dHJhSWRzW2ldKTsKICAgICAgICAgICAgaWYodil7ZG9jLnRleHQoZXh0cmFMYWJlbHNbaV0rJzogJyt2LDIwLHlQb3MpO3lQb3MrPTU7fQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgeVBvcys9ODsKICAgICAgICBkb2Muc2V0RmlsbENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy5yZWN0KDIwLHlQb3MsMTcwLDgsJ0YnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDI1NSwyNTUsMjU1KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSg5KTsKICAgICAgICBkb2MudGV4dCgnRGVzY3JpcHRpb24nLDIzLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnUXR5JywxMTAseVBvcys1LjUpOwogICAgICAgIGRvYy50ZXh0KCdQcmljZScsMTI3LHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVGF4JScsMTUwLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVG90YWwnLDE3MCx5UG9zKzUuNSk7CiAgICAgICAgeVBvcys9MTI7CgogICAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMTIsMCw1MCk7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIHZhciBzdWJ0b3RhbD0wLHRheEFtdD0wOwogICAgICAgIGZvcihpPTA7aTxsaW5lcy5sZW5ndGg7aSsrKXsKICAgICAgICAgIGlmKHlQb3M+MjcwKXtkb2MuYWRkUGFnZSgpO3lQb3M9MjA7fQogICAgICAgICAgdmFyIGxpbj1saW5lc1tpXTsKICAgICAgICAgIHZhciBscz1saW4ucXVhbnRpdHkqbGluLnVuaXRQcmljZTsKICAgICAgICAgIHZhciBsdD1scypsaW4udGF4UmF0ZS8xMDA7CiAgICAgICAgICBzdWJ0b3RhbCs9bHM7dGF4QW10Kz1sdDsKICAgICAgICAgIHZhciBkZXNjVHh0PShsaW4uZGVzY3JpcHRpb258fCcnKS5zbGljZSgwLDQ2KTsKICAgICAgICAgIGRvYy50ZXh0KGRlc2NUeHQsMjMseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChTdHJpbmcobGluLnF1YW50aXR5KSwxMTAseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChzeW0rbGluLnVuaXRQcmljZS50b0ZpeGVkKDIpLDEyNyx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KGxpbi50YXhSYXRlLnRvRml4ZWQoMikrJyUnLDE1MCx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KHN5bSsobHMrbHQpLnRvRml4ZWQoMiksMTcwLHlQb3MpOwogICAgICAgICAgeVBvcys9NjsKICAgICAgICB9CgogICAgICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgICAgICB2YXIgdG90YWw9c3VidG90YWwrdGF4QW10LWRpc2NvdW50OwogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgZG9jLnRleHQoJ1N1YnRvdGFsOicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bStzdWJ0b3RhbC50b0ZpeGVkKDIpLDE4OCx5UG9zLHthbGlnbjoncmlnaHQnfSk7CiAgICAgICAgeVBvcys9NjsKICAgICAgICBkb2MudGV4dCgnVGF4OicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bSt0YXhBbXQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIGlmKGRpc2NvdW50PjApewogICAgICAgICAgeVBvcys9NjsKICAgICAgICAgIGRvYy50ZXh0KCdEaXNjb3VudDonLDEzNSx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KCctJytzeW0rZGlzY291bnQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIH0KICAgICAgICB5UG9zKz04OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDEzKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy50ZXh0KCdUb3RhbDonLDEzNSx5UG9zKTsKICAgICAgICBkb2MudGV4dChzeW0rdG90YWwudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwoKICAgICAgICB2YXIgcHRlcm1zPXZhbCgnZGVuaS1pbnYtcGF5bWVudC10ZXJtcycpOwogICAgICAgIGlmKHB0ZXJtcyl7CiAgICAgICAgICB5UG9zKz0xNDsKICAgICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdQYXltZW50IFRlcm1zJywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPTU7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnbm9ybWFsJyk7CiAgICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgICB2YXIgcHRMaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKHB0ZXJtcywxNzApOwogICAgICAgICAgZG9jLnRleHQocHRMaW5lcywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPXB0TGluZXMubGVuZ3RoKjU7CiAgICAgICAgfQoKICAgICAgICB2YXIgbm90ZXNWYWw9dmFsKCdkZW5pLWludi1ub3RlcycpOwogICAgICAgIGlmKG5vdGVzVmFsKXsKICAgICAgICAgIHlQb3MrPTY7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdOb3RlcycsMjAseVBvcyk7CiAgICAgICAgICB5UG9zKz01OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcig5MCw4NSwxMTIpOwogICAgICAgICAgdmFyIG5MaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKG5vdGVzVmFsLDE3MCk7CiAgICAgICAgICBkb2MudGV4dChuTGluZXMsMjAseVBvcyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZm5hbWU9dmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpfHwnaW52b2ljZSc7CiAgICAgICAgZG9jLnNhdmUoJ0ludm9pY2VfJytmbmFtZSsnLnBkZicpOwogICAgICAgIHNob3dUb2FzdCgnUERGIGRvd25sb2FkZWQuJywnc3VjY2VzcycpOwogICAgICB9Y2F0Y2goZXJyKXsKICAgICAgICBzaG93VG9hc3QoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBQREY6ICcrKGVyciYmZXJyLm1lc3NhZ2U\/ZXJyLm1lc3NhZ2U6ZXJyKSwnZXJyJyk7CiAgICAgIH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycil7CiAgICAgIHNob3dUb2FzdCgnQ291bGQgbm90IGxvYWQgUERGIGxpYnJhcnk6ICcrZXJyLm1lc3NhZ2UsJ2VycicpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzY3JvbGwoKXt2YXIgdD0kKCdkZW5pLWludi1nZW5lcmF0b3InKTtpZih0JiZ0LnNjcm9sbEludG9WaWV3KXQuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnLGJsb2NrOidzdGFydCd9KTt9CgogIGZ1bmN0aW9uIGJvb3QoKXsKICAgIGlmKGJvb3RlZClyZXR1cm47Ym9vdGVkPXRydWU7CiAgICAvLyBXaXJlIGdlbmVyaWMgaW5wdXQgbGlzdGVuZXJzIHRvIGtlZXAgdG90YWxzIGxpdmUKICAgIHZhciBpbnB1dHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2RlbmktaW52LWdlbmVyYXRvciBpbnB1dCwgI2RlbmktaW52LWdlbmVyYXRvciBzZWxlY3QnKTsKICAgIHZhciBpO2ZvcihpPTA7aTxpbnB1dHMubGVuZ3RoO2krKyl7aW5wdXRzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JyxyZWNvbXB1dGUpO2lucHV0c1tpXS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLHJlY29tcHV0ZSk7fQogICAgLy8gU2VlZCBpbnZvaWNlIG51bWJlciArIGRhdGVzIGlmIGJsYW5rIChoYW5kbGVzIGZyZXNoIHBhZ2UgbG9hZCkKICAgIHZhciBkPW5ldyBEYXRlKCk7CiAgICBpZighdmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpKXNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBpZighdmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpc2V0VmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJyxkLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICBpZighdmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKXNldFZhbCgnZGVuaS1pbnYtZHVlLWRhdGUnLG5ldyBEYXRlKGQuZ2V0VGltZSgpKzMwKjI0KjYwKjYwKjEwMDApLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIHdpbmRvdy5hc2NJbnY9d2luZG93LmFzY0ludnx8ewogICAgYm9vdDpib290LGFkZExpbmU6YWRkTGluZSxyZW1vdmVMaW5lOnJlbW92ZUxpbmUscmVjb21wdXRlOnJlY29tcHV0ZSwKICAgIGRvd25sb2FkOmRvd25sb2FkLHJlc2V0OnJlc2V0LHNjcm9sbDpzY3JvbGwKICB9OwogIGJvb3QoKTsKfSkoKTs=')))();}window.deniInv&#038;&#038;window.deniInv.download&#038;&#038;window.deniInv.download();return false;\">Download Invoice PDF<\/button>\n<button type=\"button\" class=\"deni-inv-reset-btn\" onclick=\"if(!window.deniInvBooted){window.deniInvBooted=1;(new Function(atob('KGZ1bmN0aW9uKCl7CiAgdmFyIGJvb3RlZD1mYWxzZTsKICBmdW5jdGlvbiAkKGlkKXtyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO30KICBmdW5jdGlvbiB2YWwoaWQpe3ZhciBlbD0kKGlkKTtyZXR1cm4gZWw\/ZWwudmFsdWU6Jyc7fQogIGZ1bmN0aW9uIHNldFZhbChpZCx2KXt2YXIgZWw9JChpZCk7aWYoZWwpZWwudmFsdWU9djt9CiAgZnVuY3Rpb24gbnVtKHYpe3ZhciBuPXBhcnNlRmxvYXQodik7cmV0dXJuIGlzRmluaXRlKG4pP246MDt9CiAgZnVuY3Rpb24gZm10KG4sY3VyKXtjdXI9Y3VyfHwnVVNEJzt0cnl7cmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCgnZW4tVVMnLHtzdHlsZTonY3VycmVuY3knLGN1cnJlbmN5OmN1cixtaW5pbXVtRnJhY3Rpb25EaWdpdHM6Mn0pLmZvcm1hdChOdW1iZXIobil8fDApO31jYXRjaChfKXtyZXR1cm4gJyQnKygoTnVtYmVyKG4pfHwwKS50b0ZpeGVkKDIpKTt9fQogIGZ1bmN0aW9uIGN1clN5bShjKXt2YXIgbT17VVNEOickJyxFVVI6J+KCrCcsR0JQOifCoycsSU5SOifigrknLEFVRDonQSQnLENBRDonQyQnfTtyZXR1cm4gbVtjXXx8JyQnO30KICBmdW5jdGlvbiBmbXREYXRlKHMpe2lmKCFzKXJldHVybiAnJzt0cnl7dmFyIGQ9bmV3IERhdGUocyk7aWYoaXNOYU4oZCkpcmV0dXJuIHM7cmV0dXJuIGQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycse3llYXI6J251bWVyaWMnLG1vbnRoOidzaG9ydCcsZGF5OidudW1lcmljJ30pO31jYXRjaChfKXtyZXR1cm4gczt9fQogIGZ1bmN0aW9uIHVpZCgpe3JldHVybiAnbGknK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxZTkpLnRvU3RyaW5nKDM2KTt9CgogIGZ1bmN0aW9uIGxpbmVSb3dIdG1sKGlkKXsKICAgIHJldHVybiAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1pdGVtIiBkYXRhLWxpbmUtaWQ9IicraWQrJyIgaWQ9ImRlbmktaW52LWxpbmUtJytpZCsnIj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkIj48c3BhbiBjbGFzcz0iZGVuaS1pbnYtbGluZS1oZWFkLWxhYmVsIj5MaW5lIEl0ZW08L3NwYW4+JysKICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJkZW5pLWludi1saW5lLXJlbW92ZSIgYXJpYS1sYWJlbD0iUmVtb3ZlIiBvbmNsaWNrPSJ3aW5kb3cuYXNjSW52JiZ3aW5kb3cuYXNjSW52LnJlbW92ZUxpbmUoXCcnK2lkKydcJykiPlx1MDBENzwvYnV0dG9uPicrCiAgICAgICc8L2Rpdj4nKwogICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtbGluZS1ncmlkIj4nKwogICAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1maWVsZCI+PGxhYmVsPkRlc2NyaXB0aW9uPC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgZGF0YS1saW5lLWZpZWxkPSJkZXNjcmlwdGlvbiIgcGxhY2Vob2xkZXI9IlNlcnZpY2Ugb3IgcHJvZHVjdCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLWdyaWQtMyI+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5RdWFudGl0eTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBzdGVwPSIwLjAxIiBkYXRhLWxpbmUtZmllbGQ9InF1YW50aXR5IiB2YWx1ZT0iMSIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5Vbml0IFByaWNlPC9sYWJlbD48aW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49IjAiIHN0ZXA9IjAuMDEiIGRhdGEtbGluZS1maWVsZD0idW5pdFByaWNlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgICAnPGRpdiBjbGFzcz0iZGVuaS1pbnYtZmllbGQiPjxsYWJlbD5UYXggJTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9IjEwMCIgc3RlcD0iMC4wMSIgZGF0YS1saW5lLWZpZWxkPSJ0YXhSYXRlIiB2YWx1ZT0iMCIgb25pbnB1dD0id2luZG93LmFzY0ludiYmd2luZG93LmFzY0ludi5yZWNvbXB1dGUoKSI+PC9kaXY+JysKICAgICAgJzwvZGl2PicrCiAgICAgICc8ZGl2IGNsYXNzPSJkZW5pLWludi1saW5lLXRvdGFsIj48c3Bhbj5MaW5lIFRvdGFsPC9zcGFuPjxzdHJvbmcgZGF0YS1saW5lLXRvdGFsPiQwLjAwPC9zdHJvbmc+PC9kaXY+JysKICAgICc8L2Rpdj4nOwogIH0KCiAgZnVuY3Rpb24gcmVhZExpbmVzKCl7CiAgICB2YXIgcm93cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZGVuaS1pbnYtbGluZXMgLmRlbmktaW52LWxpbmUtaXRlbScpOwogICAgdmFyIGFycj1bXSxpLHJvdyxkZXNjLHF0eSxwcmljZSx0YXg7CiAgICBmb3IoaT0wO2k8cm93cy5sZW5ndGg7aSsrKXsKICAgICAgcm93PXJvd3NbaV07CiAgICAgIGRlc2M9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9ImRlc2NyaXB0aW9uIl0nKTsKICAgICAgcXR5PXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJxdWFudGl0eSJdJyk7CiAgICAgIHByaWNlPXJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1saW5lLWZpZWxkPSJ1bml0UHJpY2UiXScpOwogICAgICB0YXg9cm93LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxpbmUtZmllbGQ9InRheFJhdGUiXScpOwogICAgICBhcnIucHVzaCh7CiAgICAgICAgZWw6cm93LAogICAgICAgIGRlc2NyaXB0aW9uOmRlc2M\/ZGVzYy52YWx1ZTonJywKICAgICAgICBxdWFudGl0eTpudW0ocXR5JiZxdHkudmFsdWUpLAogICAgICAgIHVuaXRQcmljZTpudW0ocHJpY2UmJnByaWNlLnZhbHVlKSwKICAgICAgICB0YXhSYXRlOm51bSh0YXgmJnRheC52YWx1ZSkKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gYXJyOwogIH0KCiAgZnVuY3Rpb24gcmVjb21wdXRlKCl7CiAgICB2YXIgY3VyPXZhbCgnZGVuaS1pbnYtY3VycmVuY3knKXx8J1VTRCc7CiAgICB2YXIgc3ltPWN1clN5bShjdXIpOwogICAgdmFyIGxpbmVzPXJlYWRMaW5lcygpOwogICAgdmFyIHN1YnRvdGFsPTAsdGF4PTAsaSxsaW5lLGxpbmVTdWIsbGluZVRheCx0b3RhbEVsOwogICAgZm9yKGk9MDtpPGxpbmVzLmxlbmd0aDtpKyspewogICAgICBsaW5lPWxpbmVzW2ldOwogICAgICBsaW5lU3ViPWxpbmUucXVhbnRpdHkqbGluZS51bml0UHJpY2U7CiAgICAgIGxpbmVUYXg9bGluZVN1YipsaW5lLnRheFJhdGUvMTAwOwogICAgICBzdWJ0b3RhbCs9bGluZVN1YjsKICAgICAgdGF4Kz1saW5lVGF4OwogICAgICB0b3RhbEVsPWxpbmUuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtbGluZS10b3RhbF0nKTsKICAgICAgaWYodG90YWxFbCl0b3RhbEVsLnRleHRDb250ZW50PWZtdChsaW5lU3ViK2xpbmVUYXgsY3VyKTsKICAgIH0KICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgIHZhciB0b3RhbD1zdWJ0b3RhbCt0YXgtZGlzY291bnQ7CiAgICB2YXIgc3ViRWw9JCgnZGVuaS1pbnYtc3VidG90YWwnKTtpZihzdWJFbClzdWJFbC50ZXh0Q29udGVudD1mbXQoc3VidG90YWwsY3VyKTsKICAgIHZhciB0YXhFbD0kKCdkZW5pLWludi10YXgnKTtpZih0YXhFbCl0YXhFbC50ZXh0Q29udGVudD1mbXQodGF4LGN1cik7CiAgICB2YXIgZGlzY0VsPSQoJ2RlbmktaW52LWRpc2NvdW50LWRpc3BsYXknKTtpZihkaXNjRWwpZGlzY0VsLnRleHRDb250ZW50PSctJytmbXQoZGlzY291bnQsY3VyKTsKICAgIHZhciB0b3RFbD0kKCdkZW5pLWludi10b3RhbCcpO2lmKHRvdEVsKXRvdEVsLnRleHRDb250ZW50PWZtdCh0b3RhbCxjdXIpOwogICAgLy8gS2VlcCBjdXJyZW5jeSBzeW1ib2wgaW4gc3VtbWFyeSBpbiBzeW5jCiAgICB2YXIgc3ltRWxzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWN1ci1zeW1dJyk7CiAgICBmb3IoaT0wO2k8c3ltRWxzLmxlbmd0aDtpKyspc3ltRWxzW2ldLnRleHRDb250ZW50PXN5bTsKICB9CgogIGZ1bmN0aW9uIGFkZExpbmUoKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIGJveC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsbGluZVJvd0h0bWwodWlkKCkpKTsKICAgIHJlY29tcHV0ZSgpOwogIH0KICBmdW5jdGlvbiByZW1vdmVMaW5lKGlkKXsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTtpZighYm94KXJldHVybjsKICAgIHZhciByb3dzPWJveC5xdWVyeVNlbGVjdG9yQWxsKCcuZGVuaS1pbnYtbGluZS1pdGVtJyk7CiAgICBpZihyb3dzLmxlbmd0aDw9MSlyZXR1cm47CiAgICB2YXIgcm93PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZW5pLWludi1saW5lLScraWQpOwogICAgaWYocm93KXJvdy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHJvdyk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIGZ1bmN0aW9uIHNob3dUb2FzdChtc2csa2luZCl7CiAgICB2YXIgdD0kKCdkZW5pLWludi10b2FzdCcpO2lmKCF0KXJldHVybjsKICAgIHQudGV4dENvbnRlbnQ9bXNnOwogICAgdC5jbGFzc05hbWU9J2RlbmktaW52LXRvYXN0IGRlbmktaW52LXRvYXN0LXNob3cnKyhraW5kPT09J3N1Y2Nlc3MnPycgZGVuaS1pbnYtdG9hc3Qtc3VjY2Vzcyc6JycpOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xhc3NOYW1lPSdkZW5pLWludi10b2FzdCc7fSwzNTAwKTsKICB9CgogIGZ1bmN0aW9uIHJlc2V0KCl7CiAgICB2YXIgZGVmcz17J2RlbmktaW52LWJ1c2luZXNzLW5hbWUnOicnLCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJzonJywnZGVuaS1pbnYtYnVzaW5lc3MtY29udGFjdCc6JycsJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCc6JycsJ2RlbmktaW52LWNsaWVudC1uYW1lJzonJywnZGVuaS1pbnYtY2xpZW50LWNvbXBhbnknOicnLCdkZW5pLWludi1jbGllbnQtYWRkcmVzcyc6JycsJ2RlbmktaW52LWNsaWVudC1jb250YWN0JzonJywnZGVuaS1pbnYtZGlzY291bnQnOicwJywnZGVuaS1pbnYtcGF5bWVudC10ZXJtcyc6IlBhdGllbnQgcG9ydGlvbiBkdWUgYXQgdGltZSBvZiBzZXJ2aWNlLiBJbnN1cmFuY2UgYmFsYW5jZSBiaWxsZWQgdG8gY2Fycmllci4iLCdkZW5pLWludi1ub3Rlcyc6Jyd9OwogICAgdmFyIGs7Zm9yKGsgaW4gZGVmcylzZXRWYWwoayxkZWZzW2tdKTsKICAgIGlmKCQoJ2RlbmktaW52LXBhdGllbnQtaWQnKSkkKCdkZW5pLWludi1wYXRpZW50LWlkJykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtZGF0ZS1vZi10cmVhdG1lbnQnKSkkKCdkZW5pLWludi1kYXRlLW9mLXRyZWF0bWVudCcpLnZhbHVlPScnO2lmKCQoJ2RlbmktaW52LXRyZWF0aW5nLWRlbnRpc3QnKSkkKCdkZW5pLWludi10cmVhdGluZy1kZW50aXN0JykudmFsdWU9Jyc7aWYoJCgnZGVuaS1pbnYtaW5zdXJhbmNlLXBvbGljeScpKSQoJ2RlbmktaW52LWluc3VyYW5jZS1wb2xpY3knKS52YWx1ZT0nJztpZigkKCdkZW5pLWludi1wcmlvci1hdXRob3JpemF0aW9uJykpJCgnZGVuaS1pbnYtcHJpb3ItYXV0aG9yaXphdGlvbicpLnZhbHVlPScnOwogICAgdmFyIGQ9bmV3IERhdGUoKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWlzc3VlLWRhdGUnLGQudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHZhciBkdWU9bmV3IERhdGUoZC5nZXRUaW1lKCkrMzAqMjQqNjAqNjAqMTAwMCk7CiAgICBzZXRWYWwoJ2RlbmktaW52LWR1ZS1kYXRlJyxkdWUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdKTsKICAgIHNldFZhbCgnZGVuaS1pbnYtY3VycmVuY3knLCdVU0QnKTsKICAgIHZhciBib3g9JCgnZGVuaS1pbnYtbGluZXMnKTsKICAgIGlmKGJveCl7Ym94LmlubmVySFRNTD1saW5lUm93SHRtbCh1aWQoKSk7fQogICAgcmVjb21wdXRlKCk7CiAgfQoKICB2YXIganNQZGZQcm9taXNlPW51bGw7CiAgZnVuY3Rpb24gZW5zdXJlSnNQREYoKXsKICAgIGlmKGpzUGRmUHJvbWlzZSlyZXR1cm4ganNQZGZQcm9taXNlOwogICAganNQZGZQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXsKICAgICAgaWYod2luZG93LmpzcGRmJiZ3aW5kb3cuanNwZGYuanNQREYpcmV0dXJuIHJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTsKICAgICAgdmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgIHMuc3JjPSdodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9qc3BkZi8yLjUuMS9qc3BkZi51bWQubWluLmpzJzsKICAgICAgcy5hc3luYz10cnVlOwogICAgICBzLm9ubG9hZD1mdW5jdGlvbigpe2lmKHdpbmRvdy5qc3BkZiYmd2luZG93LmpzcGRmLmpzUERGKXJlc29sdmUod2luZG93LmpzcGRmLmpzUERGKTtlbHNlIHJlamVjdChuZXcgRXJyb3IoJ2pzUERGIG5vdCBhdmFpbGFibGUnKSk7fTsKICAgICAgcy5vbmVycm9yPWZ1bmN0aW9uKCl7cmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQganNQREYgZnJvbSBDRE4nKSk7fTsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTsKICAgIH0pOwogICAgcmV0dXJuIGpzUGRmUHJvbWlzZTsKICB9CgogIGZ1bmN0aW9uIGRvd25sb2FkKCl7CiAgICB2YXIgYnVzaW5lc3NOYW1lPXZhbCgnZGVuaS1pbnYtYnVzaW5lc3MtbmFtZScpLnRyaW0oKTsKICAgIHZhciBjbGllbnROYW1lPXZhbCgnZGVuaS1pbnYtY2xpZW50LW5hbWUnKS50cmltKCk7CiAgICBpZighYnVzaW5lc3NOYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB5b3VyIGJ1c2luZXNzIG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIGlmKCFjbGllbnROYW1lKXtzaG93VG9hc3QoJ1BsZWFzZSBlbnRlciB0aGUgcmVjaXBpZW50IG5hbWUuJywnZXJyJyk7cmV0dXJuO30KICAgIHZhciBsaW5lcz1yZWFkTGluZXMoKTsKICAgIHZhciBoYXNJdGVtPWZhbHNlLGk7CiAgICBmb3IoaT0wO2k8bGluZXMubGVuZ3RoO2krKyl7aWYoKGxpbmVzW2ldLnF1YW50aXR5KmxpbmVzW2ldLnVuaXRQcmljZSk+MHx8KGxpbmVzW2ldLmRlc2NyaXB0aW9uJiZsaW5lc1tpXS5kZXNjcmlwdGlvbi5sZW5ndGg+MCkpe2hhc0l0ZW09dHJ1ZTticmVhazt9fQogICAgaWYoIWhhc0l0ZW0pe3Nob3dUb2FzdCgnUGxlYXNlIGFkZCBhdCBsZWFzdCBvbmUgbGluZSBpdGVtLicsJ2VycicpO3JldHVybjt9CiAgICBzaG93VG9hc3QoJ1ByZXBhcmluZyBQREYuLi4nLCdzdWNjZXNzJyk7CiAgICBlbnN1cmVKc1BERigpLnRoZW4oZnVuY3Rpb24oanNQREYpewogICAgICB0cnl7CiAgICAgICAgdmFyIGRvYz1uZXcganNQREYoe29yaWVudGF0aW9uOidwb3J0cmFpdCcsdW5pdDonbW0nLGZvcm1hdDonYTQnfSk7CiAgICAgICAgdmFyIGN1cj12YWwoJ2RlbmktaW52LWN1cnJlbmN5Jyl8fCdVU0QnOwogICAgICAgIHZhciBzeW09Y3VyU3ltKGN1cik7CiAgICAgICAgdmFyIHlQb3M9MjA7CgogICAgICAgIGRvYy5zZXRGb250U2l6ZSgyMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy50ZXh0KCJERU5UQUwgSU5WT0lDRSIsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTEyOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMik7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dChidXNpbmVzc05hbWUsMjAseVBvcyk7CgogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDkpOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgdmFyIGJpekFkZHI9dmFsKCdkZW5pLWludi1idXNpbmVzcy1hZGRyZXNzJyk7CiAgICAgICAgdmFyIGJpekNvbnRhY3Q9dmFsKCdkZW5pLWludi1idXNpbmVzcy1jb250YWN0Jyk7CiAgICAgICAgdmFyIGJpelRheD12YWwoJ2RlbmktaW52LWJ1c2luZXNzLXRheC1pZCcpOwogICAgICAgIGlmKGJpekFkZHIpe2RvYy50ZXh0KGJpekFkZHIsMjAseVBvcyk7eVBvcys9NTt9CiAgICAgICAgaWYoYml6Q29udGFjdCl7ZG9jLnRleHQoYml6Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICBpZihiaXpUYXgpe2RvYy50ZXh0KCdUYXggSUQ6ICcrYml6VGF4LDIwLHlQb3MpO3lQb3MrPTU7fQoKICAgICAgICBkb2Muc2V0Rm9udFNpemUoOSk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICBkb2MudGV4dCgnSW52b2ljZSAjOiAnK3ZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInKSwxNDAsMzApOwogICAgICAgIGRvYy50ZXh0KCdJc3N1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpLDE0MCwzNik7CiAgICAgICAgZG9jLnRleHQoJ0R1ZSBEYXRlOiAnK2ZtdERhdGUodmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKSwxNDAsNDIpOwogICAgICAgIGRvYy50ZXh0KCdDdXJyZW5jeTogJytjdXIsMTQwLDQ4KTsKCiAgICAgICAgeVBvcz1NYXRoLm1heCh5UG9zLDYwKTsKICAgICAgICBkb2Muc2V0Rm9udFNpemUoMTApOwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICBkb2MudGV4dCgiUEFUSUVOVCBERVRBSUxTIiwyMCx5UG9zKTsKICAgICAgICB5UG9zKz02OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdub3JtYWwnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDEyLDAsNTApOwogICAgICAgIGRvYy50ZXh0KGNsaWVudE5hbWUsMjAseVBvcyk7eVBvcys9NTsKICAgICAgICB2YXIgY2xpZW50Q29tcGFueT12YWwoJ2RlbmktaW52LWNsaWVudC1jb21wYW55Jyk7CiAgICAgICAgaWYoY2xpZW50Q29tcGFueSl7ZG9jLnRleHQoY2xpZW50Q29tcGFueSwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50QWRkcj12YWwoJ2RlbmktaW52LWNsaWVudC1hZGRyZXNzJyk7CiAgICAgICAgaWYoY2xpZW50QWRkcil7ZG9jLnRleHQoY2xpZW50QWRkciwyMCx5UG9zKTt5UG9zKz01O30KICAgICAgICB2YXIgY2xpZW50Q29udGFjdD12YWwoJ2RlbmktaW52LWNsaWVudC1jb250YWN0Jyk7CiAgICAgICAgaWYoY2xpZW50Q29udGFjdCl7ZG9jLnRleHQoY2xpZW50Q29udGFjdCwyMCx5UG9zKTt5UG9zKz01O30KCiAgICAgICAgLy8gRXh0cmEgZmllbGRzIGJsb2NrIChpZiBjb25maWcgZGVmaW5lZCBhbnkpCiAgICAgICAgdmFyIGV4dHJhSWRzPVsicGF0aWVudC1pZCIsImRhdGUtb2YtdHJlYXRtZW50IiwidHJlYXRpbmctZGVudGlzdCIsImluc3VyYW5jZS1wb2xpY3kiLCJwcmlvci1hdXRob3JpemF0aW9uIl07CiAgICAgICAgdmFyIGV4dHJhTGFiZWxzPVsiUGF0aWVudCBJRCAvIENoYXJ0ICMiLCJEYXRlIG9mIFRyZWF0bWVudCIsIlRyZWF0aW5nIERlbnRpc3QiLCJJbnN1cmFuY2UgUG9saWN5ICMiLCJQcmUtQXV0aG9yaXphdGlvbiAjIl07CiAgICAgICAgdmFyIGFueUV4dHJhPWZhbHNlOwogICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXtpZih2YWwoJ2RlbmktaW52LScrZXh0cmFJZHNbaV0pKWFueUV4dHJhPXRydWU7fQogICAgICAgIGlmKGFueUV4dHJhKXsKICAgICAgICAgIHlQb3MrPTQ7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMTYsODYsMjE4KTsKICAgICAgICAgIGRvYy50ZXh0KCdERVRBSUxTJywyMCx5UG9zKTt5UG9zKz02OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGZvcihpPTA7aTxleHRyYUlkcy5sZW5ndGg7aSsrKXsKICAgICAgICAgICAgdmFyIHY9dmFsKCdkZW5pLWludi0nK2V4dHJhSWRzW2ldKTsKICAgICAgICAgICAgaWYodil7ZG9jLnRleHQoZXh0cmFMYWJlbHNbaV0rJzogJyt2LDIwLHlQb3MpO3lQb3MrPTU7fQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgeVBvcys9ODsKICAgICAgICBkb2Muc2V0RmlsbENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy5yZWN0KDIwLHlQb3MsMTcwLDgsJ0YnKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDI1NSwyNTUsMjU1KTsKICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSg5KTsKICAgICAgICBkb2MudGV4dCgnRGVzY3JpcHRpb24nLDIzLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnUXR5JywxMTAseVBvcys1LjUpOwogICAgICAgIGRvYy50ZXh0KCdQcmljZScsMTI3LHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVGF4JScsMTUwLHlQb3MrNS41KTsKICAgICAgICBkb2MudGV4dCgnVG90YWwnLDE3MCx5UG9zKzUuNSk7CiAgICAgICAgeVBvcys9MTI7CgogICAgICAgIGRvYy5zZXRUZXh0Q29sb3IoMTIsMCw1MCk7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIHZhciBzdWJ0b3RhbD0wLHRheEFtdD0wOwogICAgICAgIGZvcihpPTA7aTxsaW5lcy5sZW5ndGg7aSsrKXsKICAgICAgICAgIGlmKHlQb3M+MjcwKXtkb2MuYWRkUGFnZSgpO3lQb3M9MjA7fQogICAgICAgICAgdmFyIGxpbj1saW5lc1tpXTsKICAgICAgICAgIHZhciBscz1saW4ucXVhbnRpdHkqbGluLnVuaXRQcmljZTsKICAgICAgICAgIHZhciBsdD1scypsaW4udGF4UmF0ZS8xMDA7CiAgICAgICAgICBzdWJ0b3RhbCs9bHM7dGF4QW10Kz1sdDsKICAgICAgICAgIHZhciBkZXNjVHh0PShsaW4uZGVzY3JpcHRpb258fCcnKS5zbGljZSgwLDQ2KTsKICAgICAgICAgIGRvYy50ZXh0KGRlc2NUeHQsMjMseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChTdHJpbmcobGluLnF1YW50aXR5KSwxMTAseVBvcyk7CiAgICAgICAgICBkb2MudGV4dChzeW0rbGluLnVuaXRQcmljZS50b0ZpeGVkKDIpLDEyNyx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KGxpbi50YXhSYXRlLnRvRml4ZWQoMikrJyUnLDE1MCx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KHN5bSsobHMrbHQpLnRvRml4ZWQoMiksMTcwLHlQb3MpOwogICAgICAgICAgeVBvcys9NjsKICAgICAgICB9CgogICAgICAgIHZhciBkaXNjb3VudD1udW0odmFsKCdkZW5pLWludi1kaXNjb3VudCcpKTsKICAgICAgICB2YXIgdG90YWw9c3VidG90YWwrdGF4QW10LWRpc2NvdW50OwogICAgICAgIHlQb3MrPTY7CiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgZG9jLnRleHQoJ1N1YnRvdGFsOicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bStzdWJ0b3RhbC50b0ZpeGVkKDIpLDE4OCx5UG9zLHthbGlnbjoncmlnaHQnfSk7CiAgICAgICAgeVBvcys9NjsKICAgICAgICBkb2MudGV4dCgnVGF4OicsMTM1LHlQb3MpOwogICAgICAgIGRvYy50ZXh0KHN5bSt0YXhBbXQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIGlmKGRpc2NvdW50PjApewogICAgICAgICAgeVBvcys9NjsKICAgICAgICAgIGRvYy50ZXh0KCdEaXNjb3VudDonLDEzNSx5UG9zKTsKICAgICAgICAgIGRvYy50ZXh0KCctJytzeW0rZGlzY291bnQudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwogICAgICAgIH0KICAgICAgICB5UG9zKz04OwogICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCdib2xkJyk7CiAgICAgICAgZG9jLnNldEZvbnRTaXplKDEzKTsKICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDExNiw4NiwyMTgpOwogICAgICAgIGRvYy50ZXh0KCdUb3RhbDonLDEzNSx5UG9zKTsKICAgICAgICBkb2MudGV4dChzeW0rdG90YWwudG9GaXhlZCgyKSwxODgseVBvcyx7YWxpZ246J3JpZ2h0J30pOwoKICAgICAgICB2YXIgcHRlcm1zPXZhbCgnZGVuaS1pbnYtcGF5bWVudC10ZXJtcycpOwogICAgICAgIGlmKHB0ZXJtcyl7CiAgICAgICAgICB5UG9zKz0xNDsKICAgICAgICAgIGRvYy5zZXRGb250U2l6ZSgxMCk7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdQYXltZW50IFRlcm1zJywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPTU7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnbm9ybWFsJyk7CiAgICAgICAgICBkb2Muc2V0VGV4dENvbG9yKDkwLDg1LDExMik7CiAgICAgICAgICB2YXIgcHRMaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKHB0ZXJtcywxNzApOwogICAgICAgICAgZG9jLnRleHQocHRMaW5lcywyMCx5UG9zKTsKICAgICAgICAgIHlQb3MrPXB0TGluZXMubGVuZ3RoKjU7CiAgICAgICAgfQoKICAgICAgICB2YXIgbm90ZXNWYWw9dmFsKCdkZW5pLWludi1ub3RlcycpOwogICAgICAgIGlmKG5vdGVzVmFsKXsKICAgICAgICAgIHlQb3MrPTY7CiAgICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywnYm9sZCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcigxMiwwLDUwKTsKICAgICAgICAgIGRvYy50ZXh0KCdOb3RlcycsMjAseVBvcyk7CiAgICAgICAgICB5UG9zKz01OwogICAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsJ25vcm1hbCcpOwogICAgICAgICAgZG9jLnNldFRleHRDb2xvcig5MCw4NSwxMTIpOwogICAgICAgICAgdmFyIG5MaW5lcz1kb2Muc3BsaXRUZXh0VG9TaXplKG5vdGVzVmFsLDE3MCk7CiAgICAgICAgICBkb2MudGV4dChuTGluZXMsMjAseVBvcyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZm5hbWU9dmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpfHwnaW52b2ljZSc7CiAgICAgICAgZG9jLnNhdmUoJ0ludm9pY2VfJytmbmFtZSsnLnBkZicpOwogICAgICAgIHNob3dUb2FzdCgnUERGIGRvd25sb2FkZWQuJywnc3VjY2VzcycpOwogICAgICB9Y2F0Y2goZXJyKXsKICAgICAgICBzaG93VG9hc3QoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBQREY6ICcrKGVyciYmZXJyLm1lc3NhZ2U\/ZXJyLm1lc3NhZ2U6ZXJyKSwnZXJyJyk7CiAgICAgIH0KICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycil7CiAgICAgIHNob3dUb2FzdCgnQ291bGQgbm90IGxvYWQgUERGIGxpYnJhcnk6ICcrZXJyLm1lc3NhZ2UsJ2VycicpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzY3JvbGwoKXt2YXIgdD0kKCdkZW5pLWludi1nZW5lcmF0b3InKTtpZih0JiZ0LnNjcm9sbEludG9WaWV3KXQuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnLGJsb2NrOidzdGFydCd9KTt9CgogIGZ1bmN0aW9uIGJvb3QoKXsKICAgIGlmKGJvb3RlZClyZXR1cm47Ym9vdGVkPXRydWU7CiAgICAvLyBXaXJlIGdlbmVyaWMgaW5wdXQgbGlzdGVuZXJzIHRvIGtlZXAgdG90YWxzIGxpdmUKICAgIHZhciBpbnB1dHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2RlbmktaW52LWdlbmVyYXRvciBpbnB1dCwgI2RlbmktaW52LWdlbmVyYXRvciBzZWxlY3QnKTsKICAgIHZhciBpO2ZvcihpPTA7aTxpbnB1dHMubGVuZ3RoO2krKyl7aW5wdXRzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JyxyZWNvbXB1dGUpO2lucHV0c1tpXS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLHJlY29tcHV0ZSk7fQogICAgLy8gU2VlZCBpbnZvaWNlIG51bWJlciArIGRhdGVzIGlmIGJsYW5rIChoYW5kbGVzIGZyZXNoIHBhZ2UgbG9hZCkKICAgIHZhciBkPW5ldyBEYXRlKCk7CiAgICBpZighdmFsKCdkZW5pLWludi1pbnZvaWNlLW51bWJlcicpKXNldFZhbCgnZGVuaS1pbnYtaW52b2ljZS1udW1iZXInLCdJTlYtJytTdHJpbmcoZC5nZXRUaW1lKCkpLnNsaWNlKC02KSk7CiAgICBpZighdmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJykpc2V0VmFsKCdkZW5pLWludi1pc3N1ZS1kYXRlJyxkLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICBpZighdmFsKCdkZW5pLWludi1kdWUtZGF0ZScpKXNldFZhbCgnZGVuaS1pbnYtZHVlLWRhdGUnLG5ldyBEYXRlKGQuZ2V0VGltZSgpKzMwKjI0KjYwKjYwKjEwMDApLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSk7CiAgICByZWNvbXB1dGUoKTsKICB9CgogIHdpbmRvdy5hc2NJbnY9d2luZG93LmFzY0ludnx8ewogICAgYm9vdDpib290LGFkZExpbmU6YWRkTGluZSxyZW1vdmVMaW5lOnJlbW92ZUxpbmUscmVjb21wdXRlOnJlY29tcHV0ZSwKICAgIGRvd25sb2FkOmRvd25sb2FkLHJlc2V0OnJlc2V0LHNjcm9sbDpzY3JvbGwKICB9OwogIGJvb3QoKTsKfSkoKTs=')))();}window.deniInv&#038;&#038;window.deniInv.reset&#038;&#038;window.deniInv.reset();return false;\">Reset all fields<\/button>\n<p class=\"deni-inv-download-note\">Your data stays in your browser. We never upload it anywhere.<\/p>\n<\/div>\n<\/div>\n<\/div><div class=\"deni-inv-foot\">Need a different format? Adjust labels and currency above, then download a fresh PDF.<\/div><div class=\"deni-inv-section deni-inv-section-soft\"><div class=\"deni-inv-narrow\"><h2 class=\"deni-inv-section-title\">What to Include in an Invoice Template for Dental Services<\/h2><div class=\"deni-inv-copy\"><div class=\"deni-inv-copy-line\">Dental invoices must be detailed and patient-friendly, since they often combine direct payments with insurance contributions. A properly structured invoice builds trust, reduces confusion, and supports timely payment.<\/div><\/div><div class=\"deni-inv-list\"><div class=\"deni-inv-list-item\"><span class=\"deni-inv-list-bullet\">&#10003;<\/span><div class=\"deni-inv-list-item-text\"><strong>Dental practice and patient information.<\/strong> Include practice name, address, phone, email, license number if required, and patient&#39;s full details for accurate records.<\/div><\/div><div class=\"deni-inv-list-item\"><span class=\"deni-inv-list-bullet\">&#10003;<\/span><div class=\"deni-inv-list-item-text\"><strong>Invoice details.<\/strong> Assign a unique invoice number, issue date, and payment due date for proper tracking.<\/div><\/div><div class=\"deni-inv-list-item\"><span class=\"deni-inv-list-bullet\">&#10003;<\/span><div class=\"deni-inv-list-item-text\"><strong>Treatment information.<\/strong> List treatments or procedures with ADA codes if applicable, such as cleanings, fillings, crowns, or orthodontic work.<\/div><\/div><div class=\"deni-inv-list-item\"><span class=\"deni-inv-list-bullet\">&#10003;<\/span><div class=\"deni-inv-list-item-text\"><strong>Itemized charges.<\/strong> Include examination fees, preventive services, restorative work, lab fees, and materials used.<\/div><\/div><div class=\"deni-inv-list-item\"><span class=\"deni-inv-list-bullet\">&#10003;<\/span><div class=\"deni-inv-list-item-text\"><strong>Insurance details.<\/strong> Show covered amounts, insurance payments, adjustments, and patient co-payments or balances due.<\/div><\/div><div class=\"deni-inv-list-item\"><span class=\"deni-inv-list-bullet\">&#10003;<\/span><div class=\"deni-inv-list-item-text\"><strong>Taxes and totals.<\/strong> Provide subtotal, tax if applicable, insurance deductions, and the final balance.<\/div><\/div><div class=\"deni-inv-list-item\"><span class=\"deni-inv-list-bullet\">&#10003;<\/span><div class=\"deni-inv-list-item-text\"><strong>Payment terms.<\/strong> Accepted payment methods, due dates, and financing options if available.<\/div><\/div><div class=\"deni-inv-list-item\"><span class=\"deni-inv-list-bullet\">&#10003;<\/span><div class=\"deni-inv-list-item-text\"><strong>Notes or reminders.<\/strong> Add next appointment dates, oral care reminders, or a thank-you note.<\/div><\/div><\/div><\/div><\/div><div class=\"deni-inv-section\"><div class=\"deni-inv-narrow\"><h2 class=\"deni-inv-section-title\">Why are Invoices Important for Dental Contractors?<\/h2><div class=\"deni-inv-copy\"><div class=\"deni-inv-copy-line\">For dentists, invoices are more than payment requests \u2014 they are communication tools that clarify treatment costs and build long-term patient trust. They also serve as important financial and compliance records.<\/div><\/div><div class=\"deni-inv-check-grid\"><div class=\"deni-inv-check-card\"><span class=\"deni-inv-check-icon\">&#10003;<\/span><div class=\"deni-inv-check-card-text\"><strong>Transparent treatment records.<\/strong> Patients clearly see the services received, treatment codes, and related charges.<\/div><\/div><div class=\"deni-inv-check-card\"><span class=\"deni-inv-check-icon\">&#10003;<\/span><div class=\"deni-inv-check-card-text\"><strong>Faster payments.<\/strong> Clear invoices with insurance adjustments reduce confusion and speed up collections.<\/div><\/div><div class=\"deni-inv-check-card\"><span class=\"deni-inv-check-icon\">&#10003;<\/span><div class=\"deni-inv-check-card-text\"><strong>Insurance and compliance support.<\/strong> Invoices document procedures for insurance claims and regulatory audits.<\/div><\/div><div class=\"deni-inv-check-card\"><span class=\"deni-inv-check-icon\">&#10003;<\/span><div class=\"deni-inv-check-card-text\"><strong>Patient trust and professionalism.<\/strong> Well-designed invoices reinforce credibility and help patients feel confident in your care.<\/div><\/div><\/div><\/div><\/div><div class=\"deni-inv-section deni-inv-section-soft\"><div class=\"deni-inv-narrow\"><h2 class=\"deni-inv-section-title\">How to Use This Dental Invoice Template<\/h2><div class=\"deni-inv-copy\"><div class=\"deni-inv-copy-line\">Our dental invoice template and generator makes it easy to create professional invoices that include both patient and insurance details. Instead of formatting invoices manually, follow these steps:<\/div><\/div><div class=\"deni-inv-step-grid\"><div class=\"deni-inv-step-card\"><div class=\"deni-inv-step-card-text\"><strong>Enter dental practice and patient details.<\/strong> Add your practice information, license number if required, and patient&#39;s details for a professional header.<\/div><\/div><div class=\"deni-inv-step-card\"><div class=\"deni-inv-step-card-text\"><strong>List treatments and procedures.<\/strong> Include cleanings, fillings, crowns, or orthodontic services with clear descriptions and ADA codes if applicable.<\/div><\/div><div class=\"deni-inv-step-card\"><div class=\"deni-inv-step-card-text\"><strong>Apply insurance adjustments.<\/strong> Add insurance payments, deduct covered amounts, and show the patient&#39;s remaining balance.<\/div><\/div><div class=\"deni-inv-step-card\"><div class=\"deni-inv-step-card-text\"><strong>Download invoice in PDF format.<\/strong> Generate a polished PDF invoice ready for email delivery or printing for patient records.<\/div><\/div><\/div><\/div><\/div><div class=\"deni-inv-section\"><div class=\"deni-inv-narrow\"><h2 class=\"deni-inv-section-title\">Why Use a Dental Invoice Template<\/h2><div class=\"deni-inv-copy\"><div class=\"deni-inv-copy-line\">Dental billing can quickly become complex with itemized treatments, lab fees, and insurance coordination. A template and generator simplify this process while ensuring professional presentation. With our dental invoice template and generator, you can:<\/div><\/div><div class=\"deni-inv-benefits-grid\"><div class=\"deni-inv-benefit-card\"><span class=\"deni-inv-benefit-icon\">&#10003;<\/span><div class=\"deni-inv-benefit-card-text\">Automate calculations across procedures and insurance adjustments<\/div><\/div><div class=\"deni-inv-benefit-card\"><span class=\"deni-inv-benefit-icon\">&#10003;<\/span><div class=\"deni-inv-benefit-card-text\">Save time compared to manual billing<\/div><\/div><div class=\"deni-inv-benefit-card\"><span class=\"deni-inv-benefit-icon\">&#10003;<\/span><div class=\"deni-inv-benefit-card-text\">Present professional, patient-friendly invoices<\/div><\/div><div class=\"deni-inv-benefit-card\"><span class=\"deni-inv-benefit-icon\">&#10003;<\/span><div class=\"deni-inv-benefit-card-text\">Keep accurate records for taxes, audits, and insurance compliance<\/div><\/div><\/div><\/div><\/div><div class=\"deni-inv-section deni-inv-section-soft\"><div class=\"deni-inv-narrow\"><h2 class=\"deni-inv-section-title\">Industry-Specific Tips for Dental Invoicing<\/h2><div class=\"deni-inv-copy\"><div class=\"deni-inv-copy-line\">Dental billing often involves coordination with insurance providers and detailed treatment tracking. Using a structured invoice helps reduce billing disputes and improves patient satisfaction.<\/div><\/div><div class=\"deni-inv-tips-grid\"><div class=\"deni-inv-tip-card\"><div class=\"deni-inv-tip-card-head\"><span class=\"deni-inv-tip-card-num\">01<\/span><span class=\"deni-inv-tip-card-title\">Use procedure codes<\/span><\/div><div class=\"deni-inv-tip-card-body\">Include ADA codes with treatments for easier insurance processing.<\/div><\/div><div class=\"deni-inv-tip-card\"><div class=\"deni-inv-tip-card-head\"><span class=\"deni-inv-tip-card-num\">02<\/span><span class=\"deni-inv-tip-card-title\">Separate insurance and patient costs<\/span><\/div><div class=\"deni-inv-tip-card-body\">Clearly show insurance coverage, adjustments, and the patient&#39;s balance.<\/div><\/div><div class=\"deni-inv-tip-card\"><div class=\"deni-inv-tip-card-head\"><span class=\"deni-inv-tip-card-num\">03<\/span><span class=\"deni-inv-tip-card-title\">Highlight payment plans<\/span><\/div><div class=\"deni-inv-tip-card-body\">Offer financing or installment options to make higher-cost treatments more manageable.<\/div><\/div><div class=\"deni-inv-tip-card\"><div class=\"deni-inv-tip-card-head\"><span class=\"deni-inv-tip-card-num\">04<\/span><span class=\"deni-inv-tip-card-title\">Add treatment notes<\/span><\/div><div class=\"deni-inv-tip-card-body\">Include follow-up care details or next appointment dates to enhance patient communication.<\/div><\/div><\/div><\/div><\/div><div class=\"deni-inv-section\" style=\"padding:0 !important;background:transparent !important\"><div class=\"deni-inv-cta-card\"><div class=\"deni-inv-cta-grid\"><div class=\"deni-inv-cta-copy\"><h3>Start Creating Your Dental Invoice Now<\/h3><div class=\"deni-inv-cta-copy-text\">Whether billing for a cleaning, crown, or orthodontic treatment, this free template and generator helps you create professional invoices quickly and accurately. Generate your dental invoice in minutes and keep your practice running smoothly.<\/div><a href=\"https:\/\/cal.so\/service-agent-demo\" class=\"deni-inv-cta-btn\">Launch Invoice Builder <span class=\"deni-inv-cta-btn-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><\/div><div class=\"deni-inv-cta-art\">ServiceAgent.ai Invoice Automation<\/div><\/div><\/div><\/div><div class=\"deni-inv-section\"><div class=\"deni-inv-narrow\"><h2 class=\"deni-inv-section-title\">Frequently Asked Questions<\/h2><div class=\"deni-inv-faq-list\"><details class=\"deni-inv-faq-item\" open><summary class=\"deni-inv-faq-q\">What should a dental invoice include?<span class=\"deni-inv-faq-toggle\" aria-hidden=\"true\"><svg width=\"14\" height=\"9\" viewBox=\"0 0 14 9\" fill=\"none\"><path d=\"M1 7.5L7 1.5L13 7.5\" stroke=\"currentColor\" stroke-width=\"2\"\/><\/svg><\/span><\/summary><div class=\"deni-inv-faq-a\"><div class=\"deni-inv-faq-a-text\">It should list practice and patient details, invoice number, procedures with ADA codes, itemized charges, insurance adjustments, totals, and payment terms.<\/div><\/div><\/details><details class=\"deni-inv-faq-item\"><summary class=\"deni-inv-faq-q\">When should dental invoices be sent?<span class=\"deni-inv-faq-toggle\" aria-hidden=\"true\"><svg width=\"14\" height=\"9\" viewBox=\"0 0 14 9\" fill=\"none\"><path d=\"M1 7.5L7 1.5L13 7.5\" stroke=\"currentColor\" stroke-width=\"2\"\/><\/svg><\/span><\/summary><div class=\"deni-inv-faq-a\"><div class=\"deni-inv-faq-a-text\">Most practices send invoices right after treatment or at the end of the billing cycle for ongoing care. Timely invoicing supports faster payments.<\/div><\/div><\/details><details class=\"deni-inv-faq-item\"><summary class=\"deni-inv-faq-q\">What&#39;s the difference between a dental quote and an invoice?<span class=\"deni-inv-faq-toggle\" aria-hidden=\"true\"><svg width=\"14\" height=\"9\" viewBox=\"0 0 14 9\" fill=\"none\"><path d=\"M1 7.5L7 1.5L13 7.5\" stroke=\"currentColor\" stroke-width=\"2\"\/><\/svg><\/span><\/summary><div class=\"deni-inv-faq-a\"><div class=\"deni-inv-faq-a-text\">A quote estimates treatment costs before services. An invoice is the official bill for actual procedures and charges.<\/div><\/div><\/details><details class=\"deni-inv-faq-item\"><summary class=\"deni-inv-faq-q\">How is a dental invoice different from a receipt?<span class=\"deni-inv-faq-toggle\" aria-hidden=\"true\"><svg width=\"14\" height=\"9\" viewBox=\"0 0 14 9\" fill=\"none\"><path d=\"M1 7.5L7 1.5L13 7.5\" stroke=\"currentColor\" stroke-width=\"2\"\/><\/svg><\/span><\/summary><div class=\"deni-inv-faq-a\"><div class=\"deni-inv-faq-a-text\">An invoice requests payment, while a receipt confirms the payment has been made.<\/div><\/div><\/details><details class=\"deni-inv-faq-item\"><summary class=\"deni-inv-faq-q\">How do I format a dental invoice correctly?<span class=\"deni-inv-faq-toggle\" aria-hidden=\"true\"><svg width=\"14\" height=\"9\" viewBox=\"0 0 14 9\" fill=\"none\"><path d=\"M1 7.5L7 1.5L13 7.5\" stroke=\"currentColor\" stroke-width=\"2\"\/><\/svg><\/span><\/summary><div class=\"deni-inv-faq-a\"><div class=\"deni-inv-faq-a-text\">Use a professional PDF layout with a header, patient details, treatment descriptions, insurance breakdown, totals, and payment instructions.<\/div><\/div><\/details><details class=\"deni-inv-faq-item\"><summary class=\"deni-inv-faq-q\">Should I use a dental invoice template or generator?<span class=\"deni-inv-faq-toggle\" aria-hidden=\"true\"><svg width=\"14\" height=\"9\" viewBox=\"0 0 14 9\" fill=\"none\"><path d=\"M1 7.5L7 1.5L13 7.5\" stroke=\"currentColor\" stroke-width=\"2\"\/><\/svg><\/span><\/summary><div class=\"deni-inv-faq-a\"><div class=\"deni-inv-faq-a-text\">A template allows manual entry, but a generator speeds up invoicing, automates calculations, and produces polished PDFs.<\/div><\/div><\/details><details class=\"deni-inv-faq-item\"><summary class=\"deni-inv-faq-q\">How does a dental invoice generator work?<span class=\"deni-inv-faq-toggle\" aria-hidden=\"true\"><svg width=\"14\" height=\"9\" viewBox=\"0 0 14 9\" fill=\"none\"><path d=\"M1 7.5L7 1.5L13 7.5\" stroke=\"currentColor\" stroke-width=\"2\"\/><\/svg><\/span><\/summary><div class=\"deni-inv-faq-a\"><div class=\"deni-inv-faq-a-text\">You enter patient and treatment details, apply insurance adjustments, and the system calculates totals before creating a professional PDF.<\/div><\/div><\/details><details class=\"deni-inv-faq-item\"><summary class=\"deni-inv-faq-q\">How long does it take to create a dental invoice with a generator?<span class=\"deni-inv-faq-toggle\" aria-hidden=\"true\"><svg width=\"14\" height=\"9\" viewBox=\"0 0 14 9\" fill=\"none\"><path d=\"M1 7.5L7 1.5L13 7.5\" stroke=\"currentColor\" stroke-width=\"2\"\/><\/svg><\/span><\/summary><div class=\"deni-inv-faq-a\"><div class=\"deni-inv-faq-a-text\">Most invoices can be completed in under five minutes, saving time for dental staff.<\/div><\/div><\/details><\/div><\/div><\/div><div class=\"deni-inv-section deni-inv-section-soft deni-inv-section-tools\"><div class=\"deni-inv-narrow\"><h2 class=\"deni-inv-section-title\">Explore other invoice templates<\/h2><p class=\"deni-inv-tools-intro\">Browse our complete library of 30 free invoice templates and generators, organized by industry. Click any group to expand.<\/p><div class=\"deni-inv-tools-accordion\"><details class=\"deni-inv-tools-cat\" open><summary class=\"deni-inv-tools-cat-q\"><span class=\"deni-inv-tools-cat-name\">Trades &#038; Construction<\/span><span class=\"deni-inv-tools-cat-meta\"><span class=\"deni-inv-tools-cat-count\">10 templates<\/span><span class=\"deni-inv-tools-cat-arrow\"><svg width=\"14\" height=\"9\" viewBox=\"0 0 14 9\" fill=\"none\" aria-hidden=\"true\"><path d=\"M1 1.5L7 7.5L13 1.5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><\/span><\/span><\/summary><div class=\"deni-inv-tools-cat-grid\"><a href=\"https:\/\/serviceagent.ai\/tools\/cleaning-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Cleaning Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/construction-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Construction Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/contractor-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Contractor Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/handyman-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Handyman Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/hvac-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">HVAC Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/lawn-care-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Lawn Care Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/painting-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Painting Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/plumbing-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Plumbing Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/roofing-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Roofing Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/subcontractor-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Subcontractor Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><\/div><\/details><details class=\"deni-inv-tools-cat\"><summary class=\"deni-inv-tools-cat-q\"><span class=\"deni-inv-tools-cat-name\">Professional Services<\/span><span class=\"deni-inv-tools-cat-meta\"><span class=\"deni-inv-tools-cat-count\">6 templates<\/span><span class=\"deni-inv-tools-cat-arrow\"><svg width=\"14\" height=\"9\" viewBox=\"0 0 14 9\" fill=\"none\" aria-hidden=\"true\"><path d=\"M1 1.5L7 7.5L13 1.5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><\/span><\/span><\/summary><div class=\"deni-inv-tools-cat-grid\"><a href=\"https:\/\/serviceagent.ai\/tools\/attorney-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Attorney Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/consulting-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Consulting Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/daycare-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Daycare Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/interior-design-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Interior Design Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/medical-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Medical Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/therapy-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Therapy Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><\/div><\/details><details class=\"deni-inv-tools-cat\"><summary class=\"deni-inv-tools-cat-q\"><span class=\"deni-inv-tools-cat-name\">Transportation &#038; Logistics<\/span><span class=\"deni-inv-tools-cat-meta\"><span class=\"deni-inv-tools-cat-count\">4 templates<\/span><span class=\"deni-inv-tools-cat-arrow\"><svg width=\"14\" height=\"9\" viewBox=\"0 0 14 9\" fill=\"none\" aria-hidden=\"true\"><path d=\"M1 1.5L7 7.5L13 1.5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><\/span><\/span><\/summary><div class=\"deni-inv-tools-cat-grid\"><a href=\"https:\/\/serviceagent.ai\/tools\/car-service-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Car Service Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/shipping-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Shipping Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/towing-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Towing Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/transportation-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Transportation Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><\/div><\/details><details class=\"deni-inv-tools-cat\"><summary class=\"deni-inv-tools-cat-q\"><span class=\"deni-inv-tools-cat-name\">General Business<\/span><span class=\"deni-inv-tools-cat-meta\"><span class=\"deni-inv-tools-cat-count\">10 templates<\/span><span class=\"deni-inv-tools-cat-arrow\"><svg width=\"14\" height=\"9\" viewBox=\"0 0 14 9\" fill=\"none\" aria-hidden=\"true\"><path d=\"M1 1.5L7 7.5L13 1.5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><\/span><\/span><\/summary><div class=\"deni-inv-tools-cat-grid\"><a href=\"https:\/\/serviceagent.ai\/tools\/commercial-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Commercial Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/electronic-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Electronic Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/hourly-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Hourly Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/itemized-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Itemized Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/past-due-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Past Due Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/printable-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Printable Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/proforma-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Proforma Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/rental-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Rental Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/small-business-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Small Business Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><a href=\"https:\/\/serviceagent.ai\/tools\/work-invoice-template\" class=\"deni-inv-tools-link\"><span class=\"deni-inv-tools-link-label\">Work Invoice Template<\/span><span class=\"deni-inv-tools-link-arrow\" aria-hidden=\"true\">&#10148;<\/span><\/a><\/div><\/details><\/div><\/div><\/div><\/div>\n\n\n","protected":false},"excerpt":{"rendered":"<p>Free Dental Invoice Template &amp; Generator Dental practices must handle routine checkups, specialized treatments, and follow-up procedures, all while keeping patient billing clear and accurate. A professional dental invoice ensures patients understand charges for services, insurance adjustments, and out-of-pocket costs. With our free dental invoice template and generator, you can quickly create clear, professional PDF [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-no-title","meta":{"footnotes":""},"class_list":["post-54","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Free Dental Invoice Template &amp; Generator<\/title>\n<meta name=\"description\" content=\"Create and download dental invoices fast with our free template. Editable PDF, professional layout, no signup needed. Send invoices in minutes.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/serviceagent.ai\/tools\/dental-invoice-template\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Free Dental Invoice Template &amp; Generator\" \/>\n<meta property=\"og:description\" content=\"Create and download dental invoices fast with our free template. Editable PDF, professional layout, no signup needed. Send invoices in minutes.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/serviceagent.ai\/tools\/dental-invoice-template\/\" \/>\n<meta property=\"og:site_name\" content=\"Tools\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-15T06:25:54+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/serviceagent.ai\\\/tools\\\/dental-invoice-template\\\/\",\"url\":\"https:\\\/\\\/serviceagent.ai\\\/tools\\\/dental-invoice-template\\\/\",\"name\":\"Free Dental Invoice Template & Generator\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/serviceagent.ai\\\/tools\\\/#website\"},\"datePublished\":\"2026-05-12T13:48:50+00:00\",\"dateModified\":\"2026-05-15T06:25:54+00:00\",\"description\":\"Create and download dental invoices fast with our free template. Editable PDF, professional layout, no signup needed. Send invoices in minutes.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/serviceagent.ai\\\/tools\\\/dental-invoice-template\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/serviceagent.ai\\\/tools\\\/dental-invoice-template\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/serviceagent.ai\\\/tools\\\/dental-invoice-template\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/serviceagent.ai\\\/tools\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Free Dental Invoice Template &#038; Generator\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/serviceagent.ai\\\/tools\\\/#website\",\"url\":\"https:\\\/\\\/serviceagent.ai\\\/tools\\\/\",\"name\":\"Tools\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/serviceagent.ai\\\/tools\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Free Dental Invoice Template & Generator","description":"Create and download dental invoices fast with our free template. Editable PDF, professional layout, no signup needed. Send invoices in minutes.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/serviceagent.ai\/tools\/dental-invoice-template\/","og_locale":"en_US","og_type":"article","og_title":"Free Dental Invoice Template & Generator","og_description":"Create and download dental invoices fast with our free template. Editable PDF, professional layout, no signup needed. Send invoices in minutes.","og_url":"https:\/\/serviceagent.ai\/tools\/dental-invoice-template\/","og_site_name":"Tools","article_modified_time":"2026-05-15T06:25:54+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/serviceagent.ai\/tools\/dental-invoice-template\/","url":"https:\/\/serviceagent.ai\/tools\/dental-invoice-template\/","name":"Free Dental Invoice Template & Generator","isPartOf":{"@id":"https:\/\/serviceagent.ai\/tools\/#website"},"datePublished":"2026-05-12T13:48:50+00:00","dateModified":"2026-05-15T06:25:54+00:00","description":"Create and download dental invoices fast with our free template. Editable PDF, professional layout, no signup needed. Send invoices in minutes.","breadcrumb":{"@id":"https:\/\/serviceagent.ai\/tools\/dental-invoice-template\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/serviceagent.ai\/tools\/dental-invoice-template\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/serviceagent.ai\/tools\/dental-invoice-template\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/serviceagent.ai\/tools\/"},{"@type":"ListItem","position":2,"name":"Free Dental Invoice Template &#038; Generator"}]},{"@type":"WebSite","@id":"https:\/\/serviceagent.ai\/tools\/#website","url":"https:\/\/serviceagent.ai\/tools\/","name":"Tools","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/serviceagent.ai\/tools\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/serviceagent.ai\/tools\/wp-json\/wp\/v2\/pages\/54","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/serviceagent.ai\/tools\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/serviceagent.ai\/tools\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/serviceagent.ai\/tools\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/serviceagent.ai\/tools\/wp-json\/wp\/v2\/comments?post=54"}],"version-history":[{"count":4,"href":"https:\/\/serviceagent.ai\/tools\/wp-json\/wp\/v2\/pages\/54\/revisions"}],"predecessor-version":[{"id":406,"href":"https:\/\/serviceagent.ai\/tools\/wp-json\/wp\/v2\/pages\/54\/revisions\/406"}],"wp:attachment":[{"href":"https:\/\/serviceagent.ai\/tools\/wp-json\/wp\/v2\/media?parent=54"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}