{"version":3,"file":"render.cjs","sources":["webpack://thai-qr-payment/../assets/src/generated.ts","webpack://thai-qr-payment/../assets/src/index.ts","webpack://thai-qr-payment/../payload/src/amount.ts","webpack://thai-qr-payment/../payload/src/barcode.ts","webpack://thai-qr-payment/../payload/src/builder.ts","webpack://thai-qr-payment/../payload/src/crc.ts","webpack://thai-qr-payment/../payload/src/index.ts","webpack://thai-qr-payment/../payload/src/message.ts","webpack://thai-qr-payment/../payload/src/parser.ts","webpack://thai-qr-payment/../payload/src/recipient.ts","webpack://thai-qr-payment/../payload/src/slip-verify.ts","webpack://thai-qr-payment/../payload/src/tags.ts","webpack://thai-qr-payment/../payload/src/tlv.ts","webpack://thai-qr-payment/../qr/src/bitbuffer.ts","webpack://thai-qr-payment/../qr/src/encoder.ts","webpack://thai-qr-payment/../qr/src/format-info.ts","webpack://thai-qr-payment/../qr/src/gf.ts","webpack://thai-qr-payment/../qr/src/index.ts","webpack://thai-qr-payment/../qr/src/mask.ts","webpack://thai-qr-payment/../qr/src/matrix.ts","webpack://thai-qr-payment/../qr/src/mode.ts","webpack://thai-qr-payment/../qr/src/patterns.ts","webpack://thai-qr-payment/../qr/src/placement.ts","webpack://thai-qr-payment/../qr/src/rs.ts","webpack://thai-qr-payment/../qr/src/version.ts","webpack://thai-qr-payment/../render/src/card.ts","webpack://thai-qr-payment/../render/src/index.ts","webpack://thai-qr-payment/../render/src/matrix-svg.ts","webpack://thai-qr-payment/./src/render.ts"],"sourcesContent":["// Generated by scripts/build-svg-module.mjs — do not edit by hand.\n// Run `pnpm --filter @thai-qr-payment/assets build` to regenerate.\n\nexport const PromptPay1_silhouette = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"510.686\\\" height=\\\"172.007\\\" viewBox=\\\"0 0 383.015 129.005\\\"><g fill=\\\"#0a2540\\\"><path d=\\\"m.215 64.2.3 64.3 191.3.3 191.2.2V0h-383zm378.6 0 .2 59.8h-374V4l186.8.2 186.7.3z\\\"/><path d=\\\"M358.815 8.7c-4.1 2.1-3.5 7.3.6 5.7.9-.3 1.6-1.1 1.6-1.7s.7-1.8 1.5-2.7c2.2-2.4-.1-3.1-3.7-1.3m-97.7.6c-.6.8-.7 1.7-.3 2.1s.7 1.3.7 1.9c.1 2.6 9.5-.8 9.5-3.3 0-1.4-2.7-1.3-3.6.1-.5.8-1 .6-1.6-.5-1.1-1.9-3.2-2.1-4.7-.3m-24.4 7.3c-1.3 1.3-.7 4.4.7 4.4q1.5 0 1.8 4.2c.4 6.1 3.1 6.4 5.1.6.9-2.8 1.7-3.8 2.1-2.8.3.8 1 2.8 1.6 4.3.7 1.9 1.6 2.7 2.8 2.5 1.4-.3 1.7-1.4 1.7-6.7q0-6.45-1.2-6.9c-.9-.2-1.3.8-1.4 3l-.1 3.3-1.4-3.3c-.8-1.7-1.9-3.2-2.5-3.2-.5 0-1.5 1.5-2.2 3.2l-1.1 3.3-.6-3c-.5-2.9-3.6-4.6-5.3-2.9m22.9.9c-2.3 2.4-2 3.5 1.2 3.5 4.2 0 5.8 2 3.2 4-2.9 2.2-1.7 5.2 1.9 4.8 1.9-.2 2.7-1 2.9-2.7.6-4.3-.6-6.8-4-7.8l-3.3-1.1 3.5.2c4.9.2 5.1-1.8.2-2.2-2.6-.2-4.5.3-5.6 1.3m17.3.5c-2.1 1.6-2.1 1.9-.6 2 1.4 0 1.6.4.7 1.9-.5 1.1-1 3.4-1 5.1v3.1l5.8-.3 5.7-.3.3-5.5c.3-4.3-.1-5.7-1.4-6.7-2.6-1.9-6.8-1.6-9.5.7m6.9 1.2c.7.7 1.2 2.7 1.2 4.5 0 3.5-1.7 5-4.6 3.9-1.4-.5-1.3-.9.7-2.4 2.3-1.9 1.9-4.2-.7-4.2-1.7 0-1.9-1.6-.1-2.3 1.9-.8 2.2-.8 3.5.5m11.1-1.6c-1.1 1.4-.9 1.9 1.1 3.4l2.4 1.8-2.4 2c-2.1 1.7-2.2 2.2-1.1 3.6 1.8 2.1 4.7 2 6-.2 1-1.6 1.2-1.6 2.6.2.8 1.1 2.1 1.6 3 1.3 2.2-.9 2.2-13.7 0-13.7-1.1 0-1.5 1.2-1.5 4.6 0 3.8-.3 4.5-1.6 4-.9-.3-1.8-.6-2-.6s-.4-1.3-.4-2.8c0-4.7-3.5-6.8-6.1-3.6m21.3 5.1c.3 6.2.5 6.8 2.6 7.1 2.9.4 4.2-2.6 1.9-4.3-1.1-.8-1.7-2.7-1.7-5.4 0-3-.4-4.1-1.5-4.1-1.3 0-1.5 1.2-1.3 6.7m11.5-6.1c-1.3 1.3-.7 4.4.7 4.4q1.5 0 1.8 4.2c.4 6 3.2 6.5 4.9.9 1.4-4.7 2.5-4.5 3.5.5.5 2.8 1 3.5 2.8 3.2 1.9-.3 2.1-.9 2.1-6.7 0-7-2.1-9.9-2.7-3.9l-.4 3.3-1.3-3.3c-.7-1.7-1.7-3.2-2.2-3.2-.6 0-1.5 1.5-2.2 3.2l-1.1 3.3-.6-3c-.5-2.9-3.6-4.6-5.3-2.9\\\"/><path d=\\\"M350.215 17.3c-.7.8-.9 3.5-.5 7l.6 5.7h4.8c5.8 0 7.2-1.7 6.7-8.7-.4-6.5-2.8-7-2.8-.6 0 5.2-1.2 7.3-4.2 7.3-2.3 0-2.3-2.6 0-4 1.2-.8 1.4-1.3.4-1.7s-1-.8-.1-1.9.9-1.8-.1-2.9c-1.5-1.8-3.4-1.9-4.8-.2M23.015 64v29h208V35h-208zm35.3-20.6c7.2 3 9.7 10.4 5.5 16.6-3.4 5-6.1 6-16 6h-8.8v17h-6l.2-16.3.3-16.2 2.8-.3c2.7-.3 2.7-.2 2.7 5.2V61h8.5c9.6 0 12.5-1.6 12.5-6.8 0-5.8-3.1-7.2-16.4-7.2-9.6 0-10.6-.2-10.6-1.8 0-1 .3-2.2.7-2.5 1.2-1.3 21.3-.7 24.6.7m155.7 5.6c0 3.6.3 4 2.5 4 2 0 2.5.5 2.5 2.5s-.5 2.5-2.5 2.5h-2.5v10c0 9.7.1 10.1 2.5 11.2 3.7 1.7 3.3 4.8-.7 4.8-5.9 0-6.8-1.9-6.8-14.7 0-10.6-.1-11.3-2-11.3-1.5 0-2-.7-2-2.5s.5-2.5 2-2.5c1.7 0 2-.7 2-4 0-3.6.3-4 2.5-4 2.3 0 2.5.4 2.5 4m-140 6.6v2.6l3.1-2.6c4.1-3.5 7.9-3.5 7.9-.1 0 2-.5 2.5-2.4 2.5-1.3 0-3.5.9-5 2.1-2.5 2-2.6 2.4-2.6 12.5V83h-6V68.7c0-7.9.3-14.7.7-15 .3-.4 1.5-.7 2.5-.7 1.3 0 1.8.7 1.8 2.6m38.1 1.1c6.8 6.8 5.5 20.6-2.5 25.8-3.3 2.2-11.3 2.2-15.4.1-6.1-3.2-8.8-12.8-5.7-20.3 3.2-7.5 6.3-9.4 14.8-9 4.9.3 6.3.8 8.8 3.4m15.9-1.7c0 1.1.3 2 .6 2s1.7-.9 3.1-2c3.4-2.6 9.2-2.6 12.7.1l2.6 2 2.6-2c4.1-3.2 9.8-2.8 13.5.8 2.9 2.9 2.9 3 2.9 15V83h-2.5c-2.5 0-2.5 0-2.5-9.9 0-11.2-.9-14.6-4-15.6-3-.9-7.5 1.2-8.9 4.1-.6 1.4-1.1 6.7-1.1 11.9 0 9.5 0 9.5-2.5 9.5h-2.5V71.6c0-13.1-1-15.3-6.3-14.2-6 1.2-6.7 2.8-6.7 14.8V83h-6V68.7c0-7.9.3-14.7.7-15 1.5-1.5 4.3-.7 4.3 1.3m67-.3c5.8 3.9 7.8 10.1 6 18-1.6 7.1-6.2 11.3-12.6 11.3-2.4 0-5.6-.7-6.9-1.6l-2.5-1.6v4.1c0 3.7-.2 4.1-2.5 4.1h-2.5V54h2.5c1.6 0 2.5.6 2.5 1.6 0 1.3.5 1.2 2.6-.5 3.3-2.6 10-2.8 13.4-.4\\\"/><path d=\\\"M96.915 58.3c-2.7 2.1-3.9 5.4-3.9 11.2 0 7.2 2.8 10.5 8.9 10.5 6 0 9.1-4.1 9.1-12.1 0-7-3.2-10.8-9-10.8-1.9 0-4.2.5-5.1 1.2m86.3-.6c-2.3.9-4.2 6.2-4.2 11.8 0 4.6.4 6 2.5 8 4.1 4.2 10.5 3.1 13.3-2.2 1.5-2.8 1.5-10.5.1-13.6-1.7-3.8-7.5-5.7-11.7-4m52.8 6.3v29h13V72.2l10.8-.3c9-.4 11.3-.8 14.4-2.7 5-3.1 7.2-8.9 6.6-17.6-.5-7.8-2.5-11.1-8.8-14.4-4-2-5.8-2.2-20.2-2.2h-15.8zm30.7-16.7q1.8 1.8 1.8 6.3c0 6.7-2.5 8.4-12.1 8.4h-7.4V44.8l8 .4c5.9.2 8.4.8 9.7 2.1m27.4-3.5c-4.2 2.1-6.9 5.6-7.7 9.9l-.6 3.3h5.6c5.1 0 5.7-.2 6.6-2.5 1.5-4 11.1-4.9 13.4-1.2 2.1 3.3-.4 5.1-9 6.5-13.4 2.3-17.4 5.5-17.4 14.2 0 2.3.7 5.4 1.5 6.9 3.3 6.5 14.6 7.9 22.4 2.8l4-2.6.3 2.2c.3 2 1 2.2 6.6 2.5 5 .2 6.2 0 6.2-1.2 0-.8-.4-1.8-1-2.1-.6-.4-1-6.5-1-15.1 0-17.6-.9-20.6-7.2-23.4-5.7-2.6-17.9-2.7-22.7-.2m16.5 30.7c-2.1 3.1-8.5 5.2-11.4 3.6-5.2-2.8-3-9.5 3.5-10.6 2.1-.4 4.9-1 6.3-1.4 2.3-.7 2.5-.5 2.8 2.6.2 2-.4 4.5-1.2 5.8m17.4-31.5c0 .7 2.5 9.1 5.5 18.7l5.6 17.6-1.9 6.8-1.9 6.9h12.2l6.8-24.8c3.7-13.6 6.7-25.1 6.7-25.5s-2.7-.7-5.9-.7h-5.9l-1.8 7c-1 3.8-2.1 7-2.5 7-.3 0-1.5-3-2.5-6.8l-2-6.7-6.2-.3c-4.1-.2-6.2.1-6.2.8\\\"/></g></svg>\";\nexport const PromptPay1 = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"384\\\" height=\\\"129\\\"><path fill=\\\"#fafafa\\\" d=\\\"M0 0h384v129H0Z\\\"/><path fill=\\\"#030303\\\" d=\\\"M23 35h208v58H23Z\\\"/><path fill=\\\"#161616\\\" d=\\\"M0 0h384v129H0Zm4 4v120h375V4Z\\\"/><path fill=\\\"#030303\\\" d=\\\"M236 35h30l9 3 5 6 1 2v15l-4 7-6 3-4 1h-18v21h-13Z\\\"/><path fill=\\\"#080808\\\" d=\\\"M298 42h15l8 4 3 4 1 32 1 4h-13v-5h-2v2l-8 4h-10l-6-4-2-3V68l5-5 3-2 14-2 4-2-1-5h-10l-2 5h-12l2-9 6-5Z\\\"/><path fill=\\\"#040404\\\" d=\\\"M328 42h12l4 10v3h2l3-13h12l-1 6-5 20-5 17-2 8h-12l1-7 1-9-8-24Z\\\"/><path fill=\\\"#f3f3f4\\\" d=\\\"M185 53h8l5 3 3 5v15l-4 6-3 2h-11l-3-2-1 7h-5V54h4l1 3 3-3Z\\\"/><path fill=\\\"#ececec\\\" d=\\\"M96 53h12l7 6 2 5v8l-4 8-3 3-3 1H95l-5-4-3-6V64l3-6Z\\\"/><path fill=\\\"#f9f9f9\\\" d=\\\"M123 53h6v3l6-3h8l3 3 4-2 1-1h10l5 5v25h-5l-1-23-2-2h-6l-3 1-1 3-1 21h-5l-1-25h-7l-4 3-1 23h-6Z\\\"/><path fill=\\\"#e9eaea\\\" d=\\\"M33 42h24l5 3 3 3 1 7-3 7-5 4H39v18h-6V50h6v11l17-1 3-3v-8l-3-1-23-1Z\\\"/><path fill=\\\"#030304\\\" d=\\\"M98 57h7l4 2 2 5v9l-3 6-3 1h-8l-3-3-1-3V64l2-5Z\\\"/><path fill=\\\"#050505\\\" d=\\\"M184 57h7l4 4 1 3v9l-2 5-4 2h-7l-4-5V62Z\\\"/><path fill=\\\"#f7f7f7\\\" d=\\\"M249 45h15l5 5v7l-5 5h-15Z\\\"/><path fill=\\\"#f2f2f2\\\" d=\\\"M209 45h5v9h5v3h-5l1 22 5 1v4h-8l-3-4V58h-5v-5h5Z\\\"/><path fill=\\\"#e2e3e3\\\" d=\\\"M69 53h5l1 4 4-4h6v5l-7 2-2 2-1 22h-6Z\\\"/><path fill=\\\"#dfdfe0\\\" d=\\\"M123 53h6v3l5-2-4 7-1 23h-6Z\\\"/><path fill=\\\"#2b2c2d\\\" d=\\\"m328 16 5 1 1 3 1-4 4 1 5-1v13l-5 1-2-6-2 3-1 3h-4v-9h-3Z\\\"/><path fill=\\\"#ececec\\\" d=\\\"M311 65h1v9l-6 5h-7l-3-3v-5l5-4Z\\\"/><path fill=\\\"#2a2a2b\\\" d=\\\"m237 16 4 1 2 3 1-4 4 1 5-1v13l-4 1-2-3-1-5-3 8-4-1v-8h-3Z\\\"/><path fill=\\\"#080808\\\" d=\\\"m278 16 9 1 1 1v11l-1 1h-11V18Z\\\"/><path fill=\\\"#181819\\\" d=\\\"m296 16 5 1v7l4 1v-9h3v13l-4 1-3-3-1 3-6-1v-4l4-1v-3l-4-1v-3Z\\\"/><path fill=\\\"#272829\\\" d=\\\"m351 16 5 1-1 4 1 3h-3v4h5V16h4v12l-2 2h-10l-1-13Z\\\"/><path fill=\\\"#272828\\\" d=\\\"M260 16h9v13l-1 1h-5l-1-4 3-1-1-3-6-1 1-4Z\\\"/><path fill=\\\"#121313\\\" d=\\\"m328 16 5 1v5l3-1-2 9h-4v-9h-3Z\\\"/><path fill=\\\"#0e0e0e\\\" d=\\\"m237 16 4 1 2 5 2-1-2 9-4-1v-8h-3Z\\\"/><path fill=\\\"#111\\\" d=\\\"M316 16h3v9l3 1-1 4-5-1Z\\\"/><path fill=\\\"#202121\\\" d=\\\"m261 8 5 1h5l-2 4-2 1h-6Z\\\"/><path fill=\\\"#cdcecf\\\" d=\\\"m280 18 5 1v9h-6l1-3 2-1-1-3-2-2Z\\\"/><path fill=\\\"#2f2f30\\\" d=\\\"m361 7 3 1-1 3h-2l-1 4-4-1 1-5Z\\\"/><path fill=\\\"#141415\\\" d=\\\"M260 16h5v2l-2 1 2 2h-7l1-4Z\\\"/><path fill=\\\"#5e5f61\\\" d=\\\"m275 19 6 1 1 2-1 2-3-1-1 7h-1v-8Z\\\"/><path fill=\\\"#d5d6d7\\\" d=\\\"m356 22 2 1v5h-5v-4h3Z\\\"/><path fill=\\\"#4b4c4d\\\" d=\\\"m265 16 5 1-3 3-5-1 3-1Z\\\"/></svg>\";\nexport const PromptPay2 = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"384\\\" height=\\\"130\\\" viewBox=\\\"0 0 384 130\\\"><image href=\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYAAAACCCAYAAABPeB8AAAAACXBIWXMAACE3AAAhNwEzWJ96AAAaiElEQVR4nO2de5BU1Z3HT7bcMi7i+EoERCIjDwkGwTFIwQouioqgEVd8jFIGtVjGLMQNpQIRLQVkxNIQTBi0BExhJiDs4iqIArIDCMUSRwZFeWbGBxFNdHUyuEj2n63vyZzm9O1zu+85fe/tx/1+qqaYabrvu3+/3/k9v3XK0InnCiF+LAghhCSJhhOEEFAAD/O2E0JIsvg73m9CCEkmVACEEJJQqAAIISShnGA67fppd4pRV/+QzwQhhJQJo8c9IrZ89GnayXAFQAghCYUKgBBCipg9+w6JP3/eGskBUgEQQjJY89rvxYxZz8t/SWG5b9Yi0eOfp4pbJtRKZRAmxhgAISS5DBs7XTT96Ut5/vPX/7fov2iVWFn3gPjOmRWifvlGUbNghfy//t89TWxa8RiflJCBtb/+jUax58BHYvWO3aK59Wu5g20ffCLOPKNjqDvjCoAQkgIWvxL+k0dcIv/F30teeE3+/szKDan33nLVYF64kIGCraqeIZUslK8S/hUn/r2o+9k4qYTDhCsAQkiK007tkPp9574PU7+3HTkq7v7pvJRygEC68fpLeeFCBgq29dj/pW0UinjyxDGhC3/BFQAhRGfwoO+nLH89ZfA3m98WK5r2yd/h+mmsnxmJQEoy27a/n1Kw4wf3k9cZtH19NLJrTQVACEkD1ubY/r3TXlNWKV5X8QASLj17nJ3a3s6DH4uW1iPy944dTorsStMFRAhJAwHIdXuaUy9VVnQQVd27iin33Cj69O7KixURUKq140aJOS+uS60ELu3WSSrkqKACIISkUX3zcPmDgPDAi3vR2o+RmrtHy9jKjrf2y3gMXHJRQgVASImBNMGVL20Rn3z6uejTs5sYcXlVmpBWufuV3TunLHY9nz+XUIcv+s3t78rA7/a33pP7gELAfucvXBU4IImc9YYtTfI4FdjWgP69Aq8k1LF0PLmDuPCCSqNAxH6aWw7L33MJTf066NcnyDmo66DA9YCg1relvwaytdRR5wauHTkkdSy4trhH2I463qha81ABEFJCIE1w6qKXjmeKIE9/5YZUPr5fnn71nMWpk/Tr9QXhNWl6nVirZf+ofWCbyPzBfhEQrr3r+jRhqAOhNXfRqpQbw7st0R5LmDNjfFZFgqwjFXhWIEA988H0+VX1KzbIlEnR7jJZPch/vIl+HUzb0ql7brWYunRN2rHXr94iVi/92/ahhNX/j+z9PbHs2alSaOv7aPUR3N5zm72qIe14gm4nXxgEJqSEUMIffnkIO9Gepw9hBTZueyd1MnjdpnL0xprH04Q/BL6OUjr4t7Xtf43bwHFAcHmFv8poUUD4YX9+LQ6gRJSAxHnifEV7YRos5zhQwl2/1siMUlb5ph27U0eB6xa0XYN+bvq24zw3BRUAISWEEsLD+p4npv9kbOrAlTDSg7fglbVbA50c2j7oQhtCCYVHWC3U3TNWpiXKgOSIS+Rr8FV7gbLRLWYIfby3dVOdXIkc/PfatOwivcDMy3t7j58HzhPnq/jyq68jv2G6IL51+A9F9ejjNQ9wi0HYe1dKWBEEAZ9XjB54gai57ZpYz02HLiBCSggIYVihS7a9I38UR44ek+4fbxHRmq27xP333pzzBDfv2p/2N/axRXNBwFKFsMrm/39ywcrU71g9eNNF8TvcPuuqZ6SO8+33W4zbgk/8V69ule8b+cDTsd8gxBGgwKCk4J7xYhL2UMLjup5ltR9Y/cp9hWsG33+ccAVASAmx5Bf3Siva654RHvePIqgbqOO3T5RWPrYNJYMf3W2DlgQQVNNmLvHdxnO/vFda+2sfnyT6nXWGbGBWMaxGNjFTFjWUwA1VfVKfgeIygYDoskcnSt96oYAC87vWuvtHgRVBa2ub09HKGMKjE2PPuOIKgJASAgICglYYBnw0thwX9HDVKMsyiBtIBTa9QHlMfHBByj0EFxPcH9kE1WO/XpF2XBCM2x5aKF5/+n4p2IMWNsEKVxk9UCRxk+1aK/cPlAMUmlqNmZSwl5FXDEzdG521G3ZIF1Ccw7i4AiCkDPhja1uqcRisSQgZxebGvc4nCIENS1gBl4ye5ugFlr4SlLCesRoQ7Z9DOmU5oPdIgvAfqMU1dCXsB5Qa4io6UChQCnp8IA6oAAgpA7745q+pk7ju8oFSyKjMGe8YQFts3BJ6EBPCcP7il1N/d7P0j4O585ZL6zvttUWr5OtRDUnJhX49b/rRMJkOq9xESgnn4uU3dqS9A5+H261LpzNjPRe6gAgpA1RQFYJE5ecjc6Y5gEvCD7h/ENj99H/cBC2EoRKIWA3Yujb0uQQ6eK1pVYMMEt8x9CKnYwPotX9gQq0Yd8PlTm4XKFjlorqyT2VGzUI29AyiXPUIUUIFQEgZAUGkgHW6xFEBwLq+atLcjKwiW9DbxlvBe/jPX+XcCuoJ9H44plUMjg1uE1OQNghKQa2ds1jUHvrMmNqaDWRFKap+0MNKAegMuriv0+fCgC4gQsqIMSOHpE4GQtdVOCI/Xwl/+Ktds3EgVHXhj1WF7ic/+aQTjZ/T20d4A9Q4Hr2ewEVJ4bqgRkEVYS17fZv1NqrHXpH6PezZCOs3vRXq9vzgCoCQEqXT6RVCaJYxXBJeV4ata0KB3juKHU37xOEv/5L6Wx8ak4tc2TsXfb+78XXdF+7dRkVFR5mdU+Vt1ZBFoSjUagJKAwHXP7anbSIN1gakyOp9hBAngZLMaKMRANnyQau58KJiOVHAFQAhJUqv7p3TDlyvllUMH9wv7W9YvkH83bBoVR0A3EjKHQMhF1aHSmx//O1XG/8PKwfTqgOfUceP96jhNYphmlvGuF2t6lYfuai/bmKA51hGDbkw413efYchuHG/7stxbPnAFQAhJQoqfGGpK3eJ7pJQICCM4eKpvw3vMQGLFu0bkG2zv+WwOPkfThS9zzsnp58cXTG9QtlLx5NPEn3Pr8ypiNBcDX1zVGokVgXe/ate+djmPw76QU7lhH1u795ZNpBDLKLzd06V1yRXV1AEabF/da2v1Vxtissu7S8mt/8/jsf0ntRx57hGoj02EHU77m+dMnTiZUKI/9Jf9OsWSAghpDTxFrMJIR6hC4gQQhIKFQAhhCQUKgBCCEkokQaB0WOcEOKOt0JUD4rGCQKSccyoJfESqQIwdbwjhATHqwAg/AvxvdJ71g8+t4tMeUSqKAfGlzZ0ARFCAoMCKhQ7oQAL/f4x29Zm7CQpLqgACCHOoMp40ITZ4t5pdQXrzkncoQIghOQNqoUx5D3uoeYkP6gACCGhgHYRtzy0kEqghKACIISEBmIEUAKMC5QG7AVECAkVKAHMEUYvoTBAbAFjKJEBhf49akDNO599kdYKGhlKGEYPenT9ruhy1umBeg75gZTbut++avUZNI3LNdwFsw7WbGoMvE10OEVfpCgoCgWAFq1+Q6nzBTfxvb3N4u33W5xatRJC7IE7CI3k0LDOBQj9lS9tEZt27A78vYUyUL1ujve8aZCtltFZFK2n0X00aOoqGrFVZ2nTbAJKaabIrgBwTjZjOvXZB2FT9isAaH9lAagRd66TewghwcHIRhcFgALS32x+O+9pZDpQIviZvapBCtQp99yYswOoS49/HDNiINkK5mwNUUwbi4pEuYBwwzFIYsxrvxc1Ty0N9QEjyQV938+u6Jh2/hg0EnRAeNSoqVc2eN0rLuDzcHcEHbUIwTntyReMc4DDBAbgigmzpSKYM2N81hUBCt5sBfaL/7nJVwHAI2EL2kxHRSJjAFgRNF7cS6atRf2wkfIHs2G9fl9YscVSCe/qXsWKuWFLk3j25QZnZQZ3RxAFUL98o5i66KVYjTIoggM1j4s5U273FdhS+HqmjuVi03t/8H2H7ahH7+SxsCkKBQBrKey+QX16dhMD+vfyvXjQ+rjxyFjgSoCQTPDdwQ8EuKtCC2I9w/KPW/grYABi1bGy7gHjSgDnDyFsYyhCWfq5gXYe/Njq+Ab0OMfq/bYUhQLABQvdWmrfHm7e/XeNMWYC4Ab96zVDpF+QEOIPVjiYcuXyXYHbwy8TB8HeQhthUgnMXCLdwyYw/rHJ8rzf3P5uhgLAudp6HEYMu9jq/baUfR0ALjgi+ShVN4EgFdLHCCHZwXfFZc4tsvD8mP1kfVGswOEO8qtdyDba0Y81W3dl/A+ymmyJejJjYgrBUKoOP6OJG6r6FPrwCCkJbh1uL5Dajhw1vg6Bi+9lsfDM868YjwRuIFvFB8PTq1Aa3z1otQ3TUPywKeo6gLADac+s3CCHZHvBMquYHkRCihUMXheW7pADPjnvGMzuAoRxVfeucqA75hSAjw59Jge2o1CsseWQU9A6m39+WN/zRLOljHhl7VbRp/fxNFgclw2oW4iaRGUBKa3sDQyj4IMQkhuXgTBHjh4zvr56x26r7cBVO+2mKwNlFSHu8OCC5VaKIJt//qYfDbM2ElF8qkBQ2FYpSWUbMYlLA21uOZyhAPIZaqFbIwrbVQse7Cv7VKZZNIrW1jax58BH0oqKu5IZK7MBnmVo29dHpaVkE8wybQfs3PdhKPnmuUAiALIpOnY4KXV90VbA5VxIOMAQsxWIdT8bF9gnjvdVdu8sW1Xb4Je9g9fwXbc5ZnxfEfiFfEFQ2AbsK47pa+wFZMDkkvK6o7JZI0EVAPZTPfpSo1vKhCqPd83LNp0XLCW93B3ndcfQi8TkiWOyKsZcVdV4gCdcd1mgqVEoFrI9p/ppd2a85i3bz1bxqQsS2wrx1k3mhAIdZM2YxjnathYoV3Y27bc6M9xL24Ao7js+Z1P5/+VX/s8gDL1myy4C+L5CRmxu3Gv1OewrDqgAHIBF6Zc3HAQI2dq7rg8s+BXYHx4m/KDPCkrtw7SecV4LZ90TqPBEVVUPNxTwjB/cT/x8SnXg64PzgaJAKl7QL6tRGLQLV5xHtuIev3OZsu+QbGLGFUH0YFVrw523Xul0TPrKPF+GD+5n3UZGFcLZ9P4REbd/0ElcO2gMtvZiM8koX+GPzzfWz7QW/l6Qkrfs0Ylye2EASwnnZVt1iPPASkhRO26UmDenxvr64P0Qwi5tC3TU/XFZPuPc0cEyyuZbpY5Lr390s/QC91tQ8nGH2OwnF3jWbVPGt33wiW/2YTZgEMVBolYAcqC14UFa/0aw1qxhCH+/z0MJ4TiUvx+BM7S0VX5rv0I2bC/flhZINzMVwXj7lvgtwWHhwNJB1oLJJaba+ebaDnjiwbvEVZPmOq1s/K6v6gir0hG7dDpTXHhBpa9Qkdfip/PYNNCArS8b9DQodQRVgxY5mYy2IOC5+4/GPU6f9QMD8W2bwyH70AY8x3EN20+UAoBv28SOgF90uBW8NwYWEb4UfrnOCigfP+Hv1/1QLRsRU6hcsFzcd9s1GSsHbA/braqe4SQ0kQGlZ0HhSwNXzLo9zRnbq3hqqaycNnV4fPqxTKsfvv1lr2/LVE5zFvv65/E3AuIuwtd7fXN1lYRlabqmol0JHBg73ahYK4bVpP09ecQlRd0LKEx+t9G+mZmJqAOcsLqf+O2roScYuDSHszXOom7/oJMYBQCtisCml6BWgjcoahu4hM/fKyCx76DWO/ZTs2CF2LjtnQxrHdvF9vH/tujHlKshF15XrQC8SkDfDs5r/L/Ny+r3hIBfN2mueP3p+zOUwJiRQ5wUgDqGoNdVXVMYAHBbeYHCH/nA09bHUa4g7uSSfODNbAsbmVHUcliu8va3HHauAwgCXDNTLZvD2RJ1+wedRCiAbEHJ+QtXBbIS9M/ebekekNk+BisTlratdYD9dp71fIbFie3Xr95iHWxSQPgHVSC5+rwHVWq47si+8So06SLKI1sGysfmuiK/u4theAmsVNssknIFBo9rz6ww6myw0t61u1kWeykXaSFabrvMCLAl6vYPOmWpAGDtdz7tFOmTRh8Pv8AmLAe4CGzA0t5WINTcdk3Ga/BLuwoWuBaqx16RcV5IKd3isAqAxfyExei7bEMvcH1shC9cTSZsOzAqIKhclCCUmulZQfZJkhUA7vP8xS87CzxXfzb2u3bDDlkr4mrURAXkSlQKII72DzpFrQBMudRhAaGHlD8bH6H8Mlj6dfEFMGl021mjXkyWM1YBLm11katsa0n55UvbVnf6HWvHb2dmjgQBbjkXZLDu+VcyXEEuBUDFhkur9XxaKujY+LPxncSKHM9QMV9vGApRdRCOo/2DTiLrAPCgTZpeZ21hLv7dOut9oZWsF6w88rVq/Cxn2ywF0Z6rbAt6r5jOq5BfXJdyex3EguYZXncpAComChmM/pcfXxvofVHUtUSFy4yAoMTR/kEncXUAcL3AR+2yhPMTutkw3VA0icoX5YbxYkq5ywVylW2BL9YLAnGFBC6DfPC7pr26dy7oeZUqcGfkqiuR8wAm1EqLupQGM5kMu3yJq/2DTiIUAB4y+IZHj3tEluK7aG4IBpcH1HRDbcvC/fjgw8xVhEvGRVhfvGx93+NgZwh+WVOee9/zKwt6XqXKw1Nuz3rkKlsrKn86Uq/DKpT0EoWlHlf7B52idgHBWkfTLhdQAXjw0J9E2zfHQlmqZesR4offw4cGaGFgW05vwqWy049ctRBRg6yQUj+HcuHnYy7Laf27uGGDgKy7oVXni/G3Xy1jCk0RuMCiiA3F1f5Bp6gVAIR/KRfT+AUyi2mp66LYipUwvoym3vX5pqUmDaTOZksTFu1px/la/rDw+511hqyY733eOaJb17NiTaF0mRGQjbjaP+iwGVyZwdkG+eHXu54EAzU3pqI6LzZpxzrKuocLJm5/uReXGQF+xNn+QYcKoMzQe+4QEhdwh8y65+ZAFjisf9vVGgTk/XeNidXCzwUUEFYhYazo42z/oEMFQIgG3AlevE3xyHEg+EcPvCDn/AidoL23FPk2YYwS175VXuJs/6BDBVDC9OnZLePgW0MIhCYZdF8l2VFT8NAf36WtOZIzbIDl7yr8w8gMy4bLjAAvWEUUamVDBRAhyEAyEVb2wLnfy8z5DyMzKMmgVbQXU9FbKZHvjAXVlhwGx4D+vaxnRnixKYLEdyUf4RhGZlg2XKvvdVC8WSioACLEL8Wtd6cz81YAfrMNTFksSQGCLt8Ka8wJ8LLvDx+X9BX0jgEtJc6u6Oh8tPlWhgfFpfpeJ+72DzqJqwSOG1OefRg3HL5HEy5VveWCyX9vg18lJgbHk9LDpXWLC5gRkA/oLVQoqAAixtSeAAUq+TLG8NAgu6KUyunDBml5+TDa8EVGtSpnBBcO16LJfLrt2pJP/j6MjnxdavlABRAxpu6YCGjlM3fWzy+6McSilFIE1rurvxsuNdPAIHRKJYUDBo1tFhZW3TVPLY3tmNWMABcK0f5BhwogYuCDND3Ac2aMtx4wrbjPMF8AnTg5uESI6T8Z6/Q5DLY3ZZq4tpcm/tj253lwwXK5EssF3oPW15jiFvdK2NWtiyyiQkIFEANzF63K2AmEzbJHJ1orAawcTKl3jzz5QhFfgfjAKqB23Cir/eH9pmH2aCDoGkQ0peiSv9Gzi12sBvcAM6/RMtqkCGBgYUof3lOo1jGufvwRl1eFfiw2MAsoBuBDnmEY4whhBSXw2K9X5MxegaLwG8geRl+VcgLCHH1hYDlmE+DZhsJD0Mx50T2ImO+IznIGTc9sV6tqHjV+cN+QHVSIkZB+uMwIKFT7Bx0qgJiAZQKr0CtsoARWD3pYWjHrN72VUSTT6fQK+YVBoMn0sMDfiTxkItLGVCJGgh81WlDNkRXt2UIDfVZSCswVDupG2LzL3H5DpV/iGNB0D+2yo5okVUpAQUO5urppIPSjEvz5FFL+5dhfrd4/9MLC9+2iAogRJahNgkcJLBsgWG55aGGiM390sJIatbsqzZ0DhWDTNAyWP4b121jusPoQg/HL5kjfPxUAuGPoRbG4a2ytctdCSpdpeC6zO8KGMYAYgaCuWbDCaUarF7h9KPwzmbp0jfTduwCFigElLsH0+2YtivjMygu4Q6Ma1qJAZg56CNng2jqiYUuT9WeKobFdUawA0DLBlCmDwdTFcjxhTruC5YP00AnXXWYMPmYDgt/VtxzmeeHeeLfler9M996vjUYQoAQw5xgTqYLkWMN6q1+xIS+LFPcDE+eQheS34mCfpnQgnKFwo6iz0NtS27RewX1EQPm5X95rtb/Gdw9avd81bTRsikIB4AGoLqKBG3EcDx5ICCr4QlHVCz8/ApeV3TunhJbuO97fcljOJM7H4g/zvGAlh5V2GsW1RlB87YTZ8ouGOcmm5TYGDiE2EFYAHcIDKYgqSKmDgiau1tJBTAtKAPGWsILlprbUtkP98VwfmVArlj07NfBnbOeFF7L9gw5jAAUGQiFMYUrSkYpg34expgdGGaQsN6AEECxHiuevXt3qrCSRJYe4gqkttUvHTpvBQC7zwqOYKewCFQAhpOAgvRktUpa88JpYs3VXYLcQ4gijhlwoP+uXUolc+3rLpnKnndoh8Hvf3P6u1bb9ek4VAioAQkhRAAEORYAfZGNhuh3cdCbg0sP40yB59HhPlAHXzY17rd5f6PYPOlQAhJCiQwntYhoB6Ydt/ALxvmKBCoCUJGFnDhHigsu40Hy6h4YNFQApSYopa4wkF1Tv21AM7R90WAhGCCGO2A4LGtDjnKK61FQAhBDigMuwoIF5zAGJgkhdQPkOoyaEpIOh9fxeFQeff9EmJo+4xOpYsjUgLASRKoBSHkZNSDGC1iG27UNINKBi39vivdSgC4gQQhIKFQAhhCQUKgBCCEkoVACEEJJQqAAIISShUAEQQkhCoQIghJCEQgVACCEJhQqAEEISChUAIYQkFCoAQghJKFQAhBCSUKgACCEkoVABEEJIQqECIISQhEIFQAghCYUKgBBCEgoVACGEJBQqAEIISShUAIQQklCoAAghJKFQARBCSEKhAiCEkIRCBUAIIQmFCoAQQhIKFQAhhCQUKgBCCEkoVACEEJJQqAAIISShnGA67ff2NvN5IISQMqLtm2MZJ2NUALNXNQghGnjvCSGkjKELiBBCEgoVACGEJBQqAEIISSiIATQJIf6JDwAhhCQIIT74f1WVttJP9RUvAAAAAElFTkSuQmCC\\\" x=\\\"0\\\" y=\\\"0\\\" width=\\\"384\\\" height=\\\"130\\\"/></svg>\";\nexport const Thai_QR_Payment_Logo_01_silhouette = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"1217.333\\\" height=\\\"501.333\\\" viewBox=\\\"0 0 913 376\\\"><g fill=\\\"#0a2540\\\"><path d=\\\"M0 188v188h913V0H0zM261.7 77.8c13.7 5.1 26.3 15.9 32.6 28 7.3 14 7.1 11.6 7.4 72.2l.4 54.5 34.7 34.8 34.7 34.7-124-.2c-117.3-.3-124.3-.4-129.5-2.2-20.7-6.9-34.8-21-40.9-41-2-6.6-2.1-8.7-2.1-70 0-69.5-.1-68.5 6.3-81.6 4.1-8.4 16.8-21.3 25-25.4 13.4-6.7 11.3-6.5 83.7-6.3l65.5.2zM739.3 103c6.6 2.5 14.5 9.6 17.6 15.7 6.8 13.5 6.7 31.4-.2 45.2l-2.2 4.4 5.3 4.7c2.8 2.5 5.2 5.1 5.2 5.6s-2.1 2.7-4.6 4.8l-4.6 3.9-5.6-5.5-5.7-5.5-3.8 1.9c-14 6.9-32.9 3.8-43.8-7.1-8.4-8.4-10.4-14.2-10.4-30.1 0-10.7.4-13.3 2.3-18.2 4.4-10.8 14.6-19.3 26.2-21.8 6.5-1.3 17.9-.4 24.3 2M460 108v7h-24l-.2 32.7-.3 32.8h-14l-.3-32.7-.2-32.7-12.3-.3-12.2-.3-.3-5.4c-.2-2.9-.1-6 .2-6.7.4-1.1 6.3-1.4 32.1-1.4H460zm25.8 9.7.2 16.3h34v-33.1l7.3.3 7.2.3v79l-7.2.3-7.3.3V148h-34l-.2 16.2-.3 16.3h-14l-.3-38.5c-.1-21.2 0-39.1.3-39.8.3-.9 2.4-1.2 7.2-1l6.8.3zm117.3 23.1c11.2 28 15.4 39.5 14.5 39.8-.7.3-4.2.4-7.7.2l-6.4-.3-3-8.3-3-8.2-15.5.2-15.5.3-2.5 7c-1.4 3.9-2.9 7.6-3.3 8.3-.8 1.2-13.8 1.8-14.9.6-.4-.4 20.3-53.3 29.8-76.2 1.3-3.2 1.5-3.3 6.6-3l5.2.3zm40.4.2v39.5h-14l-.3-38.5c-.1-21.2 0-39.1.3-39.8.3-.9 2.4-1.2 7.2-1l6.8.3zm172.9-37.5c16.4 6 20.9 26.2 8.2 37.3-2 1.7-4 3.2-4.4 3.2-3.7.1-2.9 2.3 6.8 17.8 5.5 8.9 10.3 16.9 10.6 17.7.5 1.3-.7 1.5-7.4 1.5h-8.1l-9.7-17-9.6-17H794l-.2 16.7-.3 16.8-7.2.3-7.3.3v-80.3l16.3.5c12.1.3 17.5.9 21.1 2.2m-382.9 107c14.5 9 11.9 29.8-4.5 35.4-1.9.7-7.2 1.5-11.7 1.8l-8.3.6V276h-13v-69.2l16.3.4c16.2.3 16.4.3 21.2 3.3m57.1 30.5c7.4 18.4 13.4 33.8 13.4 34.3 0 .4-3 .7-6.7.5l-6.7-.3-2.5-7.3-2.6-7.2-13.4.2-13.4.3-2.5 7.2-2.6 7.3h-6.8c-3.7 0-6.8-.2-6.8-.5s6.1-15.8 13.6-34.5l13.6-34.1 5 .3 5 .3zm29.9-19.3c4.4 7.8 8.2 14.3 8.5 14.3s4.3-6.5 8.8-14.5l8.4-14.5h7.5c5.6 0 7.4.3 7 1.2-.2.7-5.9 10.2-12.6 21.1L536 249v27h-13v-26.3l-12.7-20.6c-6.9-11.3-12.8-21-13-21.4-.3-.4 3-.7 7.3-.5l7.9.3zm75.9 9.3c4.9 13.2 9 24 9.2 24 .1 0 4.2-10.8 9-24l8.9-24H641v69h-13l-.2-24-.3-24.1-7.9 21.1-7.8 21h-12.5l-7.9-21.3-7.9-21.2-.3 24.2-.2 24.3h-13v-69h17.5zM705 212.5v5.5h-34v17h31v12h-31v17l16.8.2 16.7.3.3 5.7.3 5.8H658v-69h47zm41.5 18.4 14 23.5.3-23.7.2-23.7h12v69h-12.9l-13.8-23-13.8-23-.3 23-.2 23h-13v-69.1l6.7.3 6.7.3zm92.5-18.4v5.5h-22v58h-13v-58h-22v-11h57z\\\"/><path d=\\\"M127.8 101c-10.3 1.8-19.7 9.3-24.7 19.9-2.5 5.5-2.6 6.1-2.9 29.8l-.4 24.3H142v-11.5c0-18.9 2.5-21.5 21.3-21.5H175v-42l-21.2.1c-11.7.1-23.4.5-26 .9m73.2 19.9V142h11.9c10.6 0 12.1.2 15.2 2.3 5.1 3.4 5.9 5.8 5.9 18.9V175h42.1l-.3-24.8-.3-24.7-2.8-5.7c-3.4-7-11.9-14.9-18.4-17.3-3.9-1.5-9.2-1.9-29-2.3l-24.3-.4zm-101 101c0 22.1.8 28.9 4.1 35.8 2.8 5.9 9.4 12.1 15.9 15.2 5.4 2.5 6 2.6 30.3 2.9l24.7.3V234h-25l-3.8-3.4-3.7-3.4-.3-13.1-.4-13.1H100zm615.6-106.5c-6.3 2.3-8.9 4.8-12.1 11.1-2.6 5.3-3 7-3 14.5.1 13.9 5.4 22.6 15.9 26 4.2 1.3 15.2.8 16.8-.8.6-.6-1-2.6-4.1-5.4l-5-4.5 4.4-4.3c4.9-4.8 4.5-4.9 11.7 1.9l3.7 3.4 1.3-2.9c.8-1.8 1.3-7.1 1.3-13.9 0-10.2-.2-11.3-2.8-15.7-3.7-6.4-9.8-9.9-18-10.4-3.9-.3-7.6.1-10.1 1m-133.8 9.2c-.6.9-9.8 25.5-9.8 26.1 0 .2 4.5.3 10.1.3 9.7 0 10-.1 9.4-2-2.9-9-9.3-25.1-9.7-24.4m212.2.4v10h7.8c5.9 0 8.4-.5 11-2 6.1-3.7 6.6-10.8 1-15.5-2.6-2.2-3.8-2.5-11.4-2.5H794zM409 227v8h7.6c10.7 0 13.4-1.6 13.4-8.2 0-5.8-3.3-7.8-13.1-7.8H409zm60.7 5.6c-1.4 3.8-3.5 9.3-4.6 12.1l-1.9 5.3h8.9c4.9 0 8.9-.1 8.9-.3 0-.1-2-5.6-4.4-12.1l-4.3-11.9z\\\"/></g></svg>\";\nexport const Thai_QR_Payment_Logo_01 = \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"913\\\" height=\\\"376\\\"><path fill=\\\"#00427A\\\" d=\\\"M0 0h913v376H0Z\\\"/><path fill=\\\"#fdfdfd\\\" d=\\\"M127 75h126l16 6 10 6 7 6 9 13 4 10 2 7 1 109 69 69v1H126l-16-5-12-7-8-7-7-10-5-10-3-12V125l4-14 6-11 9-10 9-7 13-6Z\\\"/><path fill=\\\"#fbfcfc\\\" d=\\\"M715 101h20l9 4 8 6 7 11 3 12v14l-3 12-3 6 1 4 8 7-1 4-7 6-4-2-8-8-10 4h-20l-10-3-8-6-6-8-4-10-1-6v-17l4-12 6-8 7-6 8-3Z\\\"/><path fill=\\\"#00427A\\\" d=\\\"M201 100h46l12 4 10 9 5 8 2 5v50h-42l-1-25-4-6-5-2-23-1Z\\\"/><path fill=\\\"#00427A\\\" d=\\\"M128 100h47v42l-24 1-6 4-2 4-1 25h-42v-48l4-11 9-10 8-5Z\\\"/><path fill=\\\"#00427A\\\" d=\\\"M100 201h42l1 24 4 6 3 2 25 1v42h-49l-12-6-5-4-6-9-3-10Z\\\"/><path fill=\\\"#00A796\\\" d=\\\"m234 201 7 6 68 68v1H201v-42l26-1 5-5 1-3Z\\\"/><path fill=\\\"#fcfdfd\\\" d=\\\"M779 102h33l10 4 6 5 4 8v10l-4 9-7 6-4 1 14 23 7 11v2h-16l-15-26-4-7-10-1v33h-14Z\\\"/><path fill=\\\"#f9fafb\\\" d=\\\"M570 207h18l12 32 5 14 2-3 15-40 1-3h18v69h-12l-1-49-16 43h-13l-16-43-1 49h-12Z\\\"/><path fill=\\\"#fcfcfc\\\" d=\\\"M576 102h12l30 75v3h-15l-6-16h-30l-6 16h-15l1-6Z\\\"/><path fill=\\\"#fafafb\\\" d=\\\"M472 101h14v33h34v-32h14v78h-14v-32h-35v32h-13Z\\\"/><path fill=\\\"#f9f9fa\\\" d=\\\"M719 207h13l10 16 18 30 1-46h12v69h-13l-17-28-11-19-1 47h-12Z\\\"/><path fill=\\\"#fafafb\\\" d=\\\"M467 207h10l5 11 22 55v3h-13l-5-13v-2h-28l-2 9-2 6h-14l3-10 23-57Z\\\"/><path fill=\\\"#fdfdfd\\\" d=\\\"M397 207h29l9 4 5 5 3 6v9l-3 8-6 5-7 3h-18v29h-12Z\\\"/><path fill=\\\"#fbfbfc\\\" d=\\\"M658 207h46v11h-33v18h31v11h-31v17h33v12h-46Z\\\"/><path fill=\\\"#00427A\\\" d=\\\"M717 114h13l10 5 4 5 3 7 1 5v11l-3 9h-3l-8-7-4 2-4 4-1 3 4 2 5 6-3 2h-14l-8-4-6-7-3-8v-16l4-9 6-7Z\\\"/><path fill=\\\"#f0f0f4\\\" d=\\\"M396 101h64v14h-24v66h-15v-66h-25Z\\\"/><path fill=\\\"#fcfcfd\\\" d=\\\"M497 207h15l8 13 8 14v2h2l2-5 14-24h15l-2 5-17 28-5 8-1 28h-13l-1-27-12-20-13-21Z\\\"/><path fill=\\\"#fbfbfc\\\" d=\\\"M783 207h55v11h-21v58h-13v-58h-21Z\\\"/><path fill=\\\"#eeeff2\\\" d=\\\"M629 101h15v80h-15Z\\\"/><path fill=\\\"#00427A\\\" d=\\\"M793 114h15l6 3 4 5v6l-5 6-2 1h-18Z\\\"/><path fill=\\\"#00427A\\\" d=\\\"M409 218h13l6 3 2 2v8l-4 4-4 1h-13Z\\\"/><path fill=\\\"#00427A\\\" d=\\\"m582 123 2 3 8 22v3h-20l1-5 8-22Z\\\"/><path fill=\\\"#00427A\\\" d=\\\"m472 226 2 2 7 20v2h-18l7-20Z\\\"/></svg>\";\n\nexport const COLOR_LOGOS = {\n  \"PromptPay1\": PromptPay1,\n  \"PromptPay2\": PromptPay2,\n  \"Thai_QR_Payment_Logo-01\": Thai_QR_Payment_Logo_01,\n} as const;\n\nexport const SILHOUETTE_LOGOS = {\n  \"PromptPay1\": PromptPay1_silhouette,\n  \"Thai_QR_Payment_Logo-01\": Thai_QR_Payment_Logo_01_silhouette,\n} as const;\n\nexport type ColorLogoName = keyof typeof COLOR_LOGOS;\nexport type SilhouetteLogoName = keyof typeof SILHOUETTE_LOGOS;\n","/**\n * `@thai-qr-payment/assets` — SVG brand marks for Thai QR Payment.\n *\n * Each mark ships in two flavors:\n *  - `COLOR_LOGOS[name]` — full-colour SVG path traced via vtracer.\n *    True vector (no embedded raster), small enough to inline anywhere.\n *  - `SILHOUETTE_LOGOS[name]` — monochrome path traced via potrace.\n *    Even smaller, suitable for masks / icons / dark mode.\n *\n * Only the canonical marks ship by default — `Thai_QR_Payment_Logo-01`\n * (the BOT/TBA primary Thai QR Payment logo) and `PromptPay1` (the\n * National ITMX PromptPay mark). If you need an alternative layout,\n * trace your own asset via the supplied `scripts/build-assets.sh` and\n * drop the result into `packages/assets/src/svg/`.\n *\n * All exports are plain SVG strings — drop them into innerHTML, write\n * them to disk, or serve them with `Content-Type: image/svg+xml`.\n *\n * Marks belong to their respective rights-holders:\n *  - Thai QR Payment logo — Bank of Thailand / Thai Bankers' Association\n *  - PromptPay logo — Bank of Thailand / National ITMX\n *\n * Use of these marks is governed by Thai QR Payment Brand Guidelines.\n * This package merely redistributes the bitmap → SVG conversion;\n * downstream apps must comply with the official brand book.\n */\n\nexport {\n  COLOR_LOGOS,\n  SILHOUETTE_LOGOS,\n  type ColorLogoName,\n  type SilhouetteLogoName,\n} from './generated.js';\n\nimport { COLOR_LOGOS, SILHOUETTE_LOGOS } from './generated.js';\nimport type { ColorLogoName, SilhouetteLogoName } from './generated.js';\n\n/** Get a color logo by name (returns the SVG string). */\nexport function colorLogo(name: ColorLogoName): string {\n  return COLOR_LOGOS[name];\n}\n\n/** Get a silhouette logo by name. */\nexport function silhouetteLogo(name: SilhouetteLogoName): string {\n  return SILHOUETTE_LOGOS[name];\n}\n\n/** Default mark recommendations for downstream use. */\nexport const DEFAULT_LOGOS = {\n  thaiQrPayment: 'Thai_QR_Payment_Logo-01',\n  thaiQrPaymentSilhouette: 'Thai_QR_Payment_Logo-01',\n  promptpay: 'PromptPay1',\n  promptpaySilhouette: 'PromptPay1',\n} as const;\n","/**\n * Amount formatting for tag 54 (Transaction Amount).\n *\n * EMVCo allows up to 13 chars including the decimal point — Thai banks\n * cap the integer part at 10 digits + 2 decimals. We accept either a\n * number (in baht) or a satang-int + flag, and always emit 2 decimals\n * because that's what every Thai banking app re-displays consistently.\n */\n\nconst MAX_BAHT = 9_999_999_999.99; // 13 chars: \"9999999999.99\"\n\nexport interface FormatAmountOptions {\n  /** When true, treat the input as integer satang (1 baht = 100 satang). */\n  fromSatang?: boolean;\n}\n\n/**\n * Format an amount for the wire. Returns `null` for static QR (caller\n * intends a \"scan and enter any amount\" code).\n */\nexport function formatAmount(\n  value: number | bigint | undefined | null,\n  options: FormatAmountOptions = {},\n): string | null {\n  if (value == null) return null;\n\n  let baht: number;\n  if (typeof value === 'bigint') {\n    baht = options.fromSatang ? Number(value) / 100 : Number(value);\n  } else {\n    baht = options.fromSatang ? value / 100 : value;\n  }\n\n  if (!Number.isFinite(baht)) {\n    throw new TypeError('Amount must be a finite number');\n  }\n  if (baht <= 0) return null;\n  if (baht > MAX_BAHT) {\n    throw new RangeError(`Amount ${baht} exceeds max wire value ${MAX_BAHT}`);\n  }\n\n  // Round to 2 decimals using integer math to dodge float-printout\n  // surprises like 0.1 + 0.2 → \"0.30000000000000004\".\n  const cents = Math.round(baht * 100);\n  const baht10 = Math.floor(cents / 100);\n  const sub = cents - baht10 * 100;\n  return `${baht10}.${sub.toString(10).padStart(2, '0')}`;\n}\n","/**\n * Bank of Thailand 1D barcode (bill-payment, counter-scanned).\n *\n * This is intentionally not part of the EMVCo TLV machinery in the rest\n * of the package. The BOT barcode is a `|`-led, `\\r`-delimited ASCII\n * string scanned at bank counters and 7-Eleven cashier stations for\n * over-the-counter bill payments — not a QR, not TLV, no CRC. It shares\n * the cross-bank biller-id concept with EMVCo tag 30 but the wire\n * format is otherwise unrelated, so it lives in its own module to keep\n * the TLV builder + parser tree-shake cleanly when callers only need\n * one or the other.\n *\n * Wire shape:  `|<billerId>\\r<ref1>\\r<ref2>\\r<amount>`\n *   - leading pipe is a fixed sentinel\n *   - billerId is 15 chars (Tax ID + suffix), zero-padded if shorter\n *   - ref1 is mandatory (customer/invoice number)\n *   - ref2 may be the empty string if unused\n *   - amount is integer satang (baht × 100), or the literal \"0\" when\n *     the cashier is expected to key the amount in by hand\n */\n\nconst FIELD_SEPARATOR = '\\r';\nconst PAYLOAD_PREFIX = '|';\nconst BILLER_ID_LENGTH = 15;\nconst NO_AMOUNT_SENTINEL = '0';\n/** 13 chars: \"9999999999.99\" — matches `formatAmount`'s cap for consistency. */\nconst MAX_BAHT = 9_999_999_999.99;\n\nexport interface BOTBarcodeInput {\n  /** Cross-bank biller id (Tax ID + suffix). ≤ 15 chars, zero-padded on emit. */\n  billerId: string;\n  /** Customer / invoice reference. Must be non-empty. */\n  ref1: string;\n  /** Optional secondary reference. Empty string on the wire if omitted. */\n  ref2?: string;\n  /**\n   * Baht amount. Omit (or pass `undefined`) for a counter-keyed total —\n   * the literal \"0\" is then written and the cashier types the amount.\n   */\n  amount?: number;\n}\n\nexport interface ParsedBOTBarcode {\n  billerId: string;\n  ref1: string;\n  ref2?: string;\n  amount?: number;\n}\n\n/**\n * Build a BOT 1D bill-payment barcode payload.\n *\n * Throws `TypeError` / `RangeError` for malformed input — the caller\n * never silently produces an unscannable barcode.\n *\n * @example\n *   buildBOTBarcode({ billerId: '099999999999990', ref1: '111222333444' })\n *   // → '|099999999999990\\r111222333444\\r\\r0'\n *\n * @example\n *   buildBOTBarcode({\n *     billerId: '099400016550100',\n *     ref1: '123456789012',\n *     ref2: '670429',\n *     amount: 3649.22,\n *   })\n *   // → '|099400016550100\\r123456789012\\r670429\\r364922'\n */\nexport function buildBOTBarcode(input: BOTBarcodeInput): string {\n  const billerId = normaliseBillerId(input.billerId);\n  const ref1 = ensureRef('ref1', input.ref1, { allowEmpty: false });\n  const ref2 = ensureRef('ref2', input.ref2 ?? '', { allowEmpty: true });\n  const amountField = formatAmountField(input.amount);\n\n  return (\n    PAYLOAD_PREFIX +\n    billerId +\n    FIELD_SEPARATOR +\n    ref1 +\n    FIELD_SEPARATOR +\n    ref2 +\n    FIELD_SEPARATOR +\n    amountField\n  );\n}\n\n/**\n * Parse a BOT 1D bill-payment barcode back into its component fields.\n *\n * Returns `null` for any structural issue (missing prefix, wrong field\n * count, biller-id too short) so callers can branch without `try/catch`.\n * The trailing amount is decoded back to baht (e.g. `'364922'` → `3649.22`),\n * and the literal \"0\" sentinel surfaces as `undefined`.\n *\n * @example\n *   parseBOTBarcode('|099999999999990\\r111222333444\\r\\r0')\n *   // → { billerId: '099999999999990', ref1: '111222333444' }\n *\n * @example\n *   parseBOTBarcode('|099400016550100\\r123456789012\\r670429\\r364922')\n *   // → {\n *   //     billerId: '099400016550100',\n *   //     ref1: '123456789012',\n *   //     ref2: '670429',\n *   //     amount: 3649.22,\n *   //   }\n */\nexport function parseBOTBarcode(barcode: string): ParsedBOTBarcode | null {\n  if (typeof barcode !== 'string') return null;\n  if (!barcode.startsWith(PAYLOAD_PREFIX)) return null;\n\n  // `\\r` delimiters resolve the otherwise-ambiguous variable-length\n  // ref1/ref2/amount tail. Four parts exactly — no more, no less.\n  const parts = barcode.slice(PAYLOAD_PREFIX.length).split(FIELD_SEPARATOR);\n  if (parts.length !== 4) return null;\n\n  const billerId = parts[0]!;\n  const ref1 = parts[1]!;\n  const ref2 = parts[2]!;\n  const amountField = parts[3]!;\n\n  if (billerId.length < BILLER_ID_LENGTH) return null;\n  if (ref1.length === 0) return null;\n\n  const result: ParsedBOTBarcode = { billerId, ref1 };\n  if (ref2.length > 0) result.ref2 = ref2;\n\n  const amount = decodeAmountField(amountField);\n  if (amount === 'invalid') return null;\n  if (amount != null) result.amount = amount;\n\n  return result;\n}\n\n/** Pad short biller ids to the 15-char wire width; reject overlong ones. */\nfunction normaliseBillerId(raw: string): string {\n  if (typeof raw !== 'string' || raw.length === 0) {\n    throw new TypeError('billerId must be a non-empty string');\n  }\n  if (raw.includes(FIELD_SEPARATOR)) {\n    throw new TypeError('billerId must not contain a carriage return');\n  }\n  if (raw.length > BILLER_ID_LENGTH) {\n    throw new RangeError(`billerId is ${raw.length} chars; max is ${BILLER_ID_LENGTH}`);\n  }\n  return raw.padStart(BILLER_ID_LENGTH, '0');\n}\n\n/** Reject CR and (optionally) empty refs without inventing extra rules. */\nfunction ensureRef(name: 'ref1' | 'ref2', value: string, options: { allowEmpty: boolean }): string {\n  if (typeof value !== 'string') {\n    throw new TypeError(`${name} must be a string`);\n  }\n  if (!options.allowEmpty && value.length === 0) {\n    throw new TypeError(`${name} must be a non-empty string`);\n  }\n  if (value.includes(FIELD_SEPARATOR)) {\n    throw new TypeError(`${name} must not contain a carriage return`);\n  }\n  return value;\n}\n\n/** Encode the trailing amount field as integer satang, or the \"0\" sentinel. */\nfunction formatAmountField(amount: number | undefined): string {\n  if (amount == null) return NO_AMOUNT_SENTINEL;\n  if (!Number.isFinite(amount)) {\n    throw new TypeError('amount must be a finite number');\n  }\n  if (amount < 0) {\n    throw new RangeError('amount must be non-negative');\n  }\n  if (amount > MAX_BAHT) {\n    throw new RangeError(`amount ${amount} exceeds max wire value ${MAX_BAHT}`);\n  }\n  // Integer math so 0.1 + 0.2 → \"30\" instead of \"30.0000000004\".\n  const satang = Math.round(amount * 100);\n  return satang === 0 ? NO_AMOUNT_SENTINEL : satang.toString(10);\n}\n\n/**\n * Decode the trailing amount field.\n *\n * Returns `'invalid'` (a discriminator, not a value) for malformed input,\n * `null` for the \"amount entered at counter\" sentinel, or the decoded\n * baht number otherwise.\n */\nfunction decodeAmountField(field: string): number | null | 'invalid' {\n  if (field.length === 0) return 'invalid';\n  if (field === NO_AMOUNT_SENTINEL) return null;\n  // BOT spec specifies the amount field as integer satang. Reject any\n  // non-digit content (including a stray decimal point or sign).\n  for (let i = 0; i < field.length; i += 1) {\n    const code = field.charCodeAt(i);\n    if (code < 0x30 || code > 0x39) return 'invalid';\n  }\n  const satang = Number.parseInt(field, 10);\n  if (!Number.isFinite(satang)) return 'invalid';\n  if (satang === 0) return null;\n  // Round-trip through integer math to keep the baht side exact.\n  const baht = Math.floor(satang / 100);\n  const sub = satang - baht * 100;\n  return baht + sub / 100;\n}\n","/**\n * Fluent builder for the Thai QR Payment wire payload.\n *\n * The builder collects field assignments in an ordered list, then renders\n * the final string in one pass with the CRC computed over the body plus\n * the CRC tag header (`6304`) — that header is part of the hashed input\n * per EMVCo §4, which surprises everyone who reads the spec for the\n * first time.\n *\n * Order on the wire is fixed by tag id (lowest first). The builder\n * stores fields in a Map keyed by tag id and emits them sorted at\n * `build()`-time so callers can set them in any order without breaking\n * the resulting checksum.\n */\n\nimport { formatAmount, type FormatAmountOptions } from './amount.js';\nimport { checksum } from './crc.js';\nimport { encodePersonalMessage } from './message.js';\nimport {\n  normaliseBankAccount,\n  normaliseRecipient,\n  type NormalisedRecipient,\n  type PromptPayRecipientType,\n} from './recipient.js';\nimport {\n  COUNTRY_TH,\n  CURRENCY_THB,\n  GUID_BILL_PAYMENT,\n  GUID_BILL_PAYMENT_CROSS_BORDER,\n  GUID_PROMPTPAY,\n  GUID_PROMPTPAY_OTA,\n  PAYLOAD_FORMAT_VERSION,\n  POI_DYNAMIC,\n  POI_STATIC,\n  SUB_ADD_BILL_NUMBER,\n  SUB_ADD_CONSUMER_DATA_REQUEST,\n  SUB_ADD_CUSTOMER_LABEL,\n  SUB_ADD_LOYALTY_NUMBER,\n  SUB_ADD_MOBILE_NUMBER,\n  SUB_ADD_PURPOSE_OF_TRANSACTION,\n  SUB_ADD_REFERENCE_LABEL,\n  SUB_ADD_STORE_LABEL,\n  SUB_ADD_TERMINAL_LABEL,\n  SUB_BILL_BILLER_ID,\n  SUB_BILL_REFERENCE_1,\n  SUB_BILL_REFERENCE_2,\n  SUB_GUID,\n  SUB_PROMPTPAY_OTA,\n  SUB_TRUE_MONEY,\n  SUB_VAT_AMOUNT,\n  SUB_VAT_RATE,\n  SUB_VAT_SELLER_TAX_BRANCH_ID,\n  TAG_ADDITIONAL_DATA,\n  TAG_CHECKSUM,\n  TAG_COUNTRY_CODE,\n  TAG_MERCHANT_ACCOUNT_BILL_PAYMENT,\n  TAG_MERCHANT_ACCOUNT_PROMPTPAY,\n  TAG_MERCHANT_CATEGORY_CODE,\n  TAG_MERCHANT_CITY,\n  TAG_MERCHANT_NAME,\n  TAG_PAYLOAD_FORMAT,\n  TAG_PERSONAL_MESSAGE,\n  TAG_POINT_OF_INITIATION,\n  TAG_POSTAL_CODE,\n  TAG_TIP_FIXED,\n  TAG_TIP_OR_CONVENIENCE_INDICATOR,\n  TAG_TIP_PERCENTAGE,\n  TAG_TRANSACTION_AMOUNT,\n  TAG_TRANSACTION_CURRENCY,\n  TAG_VAT_TQRC,\n  TIP_FIXED,\n  TIP_PERCENTAGE,\n  TIP_PROMPT,\n  TRUE_MONEY_PREFIX,\n} from './tags.js';\nimport { encodeField, encodeFields } from './tlv.js';\n\nconst OTA_CODE_LENGTH = 10;\n\nexport interface AdditionalDataFields {\n  billNumber?: string;\n  mobileNumber?: string;\n  storeLabel?: string;\n  loyaltyNumber?: string;\n  referenceLabel?: string;\n  customerLabel?: string;\n  terminalLabel?: string;\n  purposeOfTransaction?: string;\n  consumerDataRequest?: string;\n}\n\nexport type TipMode =\n  | { mode: 'prompt' }\n  | { mode: 'fixed'; value: number; fromSatang?: boolean }\n  | { mode: 'percentage'; value: number };\n\nexport interface MerchantInfo {\n  /** Up to 25 alphanumeric characters; truncated by the builder. */\n  name?: string;\n  /** Up to 15 alphanumeric characters. */\n  city?: string;\n  /** Up to 10 chars. */\n  postalCode?: string;\n  /** 4-digit Merchant Category Code from ISO 18245. */\n  categoryCode?: string;\n}\n\nexport interface VATTQRCInput {\n  /** Seller's tax branch identifier — exactly 4 characters. */\n  sellerTaxBranchId: string;\n  /** VAT rate as displayed on the receipt (e.g. \"7\" or \"7.00\"); 1–5 chars. */\n  vatRate?: string;\n  /** VAT amount as displayed on the receipt; 1–13 chars, required. */\n  vatAmount: string;\n}\n\n/**\n * Thai QR Payment payload builder.\n *\n * Three terminal methods:\n *  - `.build()` returns the wire-format string ready for QR encoding.\n *  - `.buildWithChecksum()` returns both the body and the checksum\n *    separately — useful for debugging the CRC step.\n *  - `.toBytes()` returns a `Uint8Array` of the ASCII-encoded payload\n *    for callers that want to hash or sign it.\n */\nexport class ThaiQRPaymentBuilder {\n  private readonly fields = new Map<string, string>();\n  private readonly additional: AdditionalDataFields = {};\n  private tip: TipMode | undefined;\n  private personalMessage: string | undefined;\n  private promptPayRecipient: NormalisedRecipient | undefined;\n  private otaCode: string | undefined;\n  private vat: VATTQRCInput | undefined;\n\n  constructor() {\n    this.fields.set(TAG_PAYLOAD_FORMAT, PAYLOAD_FORMAT_VERSION);\n    this.fields.set(TAG_POINT_OF_INITIATION, POI_STATIC);\n    this.fields.set(TAG_COUNTRY_CODE, COUNTRY_TH);\n    this.fields.set(TAG_TRANSACTION_CURRENCY, CURRENCY_THB);\n  }\n\n  /**\n   * Configure a PromptPay recipient (mobile, national ID, or e-wallet).\n   * Overrides any previously-set BillPayment / KShop template. Use\n   * `.bankAccount()` for credit-transfer payloads — its wire value needs\n   * the (bankCode, accountNo) split this single-string form cannot carry.\n   */\n  promptpay(recipient: string, type?: PromptPayRecipientType): this {\n    if (type === 'bankAccount') {\n      throw new TypeError('Use .bankAccount(bankCode, accountNo) for bank-account recipients');\n    }\n    this.promptPayRecipient = normaliseRecipient(recipient, type);\n    this.refreshPromptPayTemplate();\n    this.fields.delete(TAG_MERCHANT_ACCOUNT_BILL_PAYMENT);\n    return this;\n  }\n\n  /**\n   * Configure a PromptPay credit transfer to a bank account (sub-tag 04).\n   * `bankCode` is the 3-digit BoT bank identifier; `accountNo` is the\n   * variable-length numeric account.\n   *\n   * @example\n   *   new ThaiQRPaymentBuilder().bankAccount('014', '1234567890').amount(100).build()\n   */\n  bankAccount(bankCode: string, accountNo: string): this {\n    this.promptPayRecipient = normaliseBankAccount(bankCode, accountNo);\n    this.refreshPromptPayTemplate();\n    this.fields.delete(TAG_MERCHANT_ACCOUNT_BILL_PAYMENT);\n    return this;\n  }\n\n  /**\n   * Attach a One-Time Authorization code (sub-tag 05, fixed 10 chars).\n   * Flips the merchant template's AID from the standard PromptPay GUID to\n   * the OTA GUID so scanners route the payload to the single-use flow.\n   *\n   * @example\n   *   new ThaiQRPaymentBuilder().promptpay('0812345678').ota('1234567890').amount(50).build()\n   */\n  ota(otaCode: string): this {\n    if (otaCode.length !== OTA_CODE_LENGTH) {\n      throw new RangeError(`OTA code must be ${OTA_CODE_LENGTH} chars, got ${otaCode.length}`);\n    }\n    this.otaCode = otaCode;\n    this.refreshPromptPayTemplate();\n    return this;\n  }\n\n  /** Re-emit tag 29 from the current recipient + OTA state. */\n  private refreshPromptPayTemplate(): void {\n    if (this.promptPayRecipient == null) return;\n    const aid = this.otaCode != null ? GUID_PROMPTPAY_OTA : GUID_PROMPTPAY;\n    const template = encodeFields([\n      [SUB_GUID, aid],\n      [this.promptPayRecipient.subTag, this.promptPayRecipient.value],\n      [SUB_PROMPTPAY_OTA, this.otaCode],\n    ]);\n    this.fields.set(TAG_MERCHANT_ACCOUNT_PROMPTPAY, template);\n  }\n\n  /**\n   * Configure a TrueMoney Wallet recipient. Same merchant template tag\n   * (29) as PromptPay but with the literal `14` prefix on sub-tag 03 so\n   * the TrueMoney app can disambiguate its own payloads from a plain\n   * e-wallet QR. The mobile is zero-padded on the left to 13 digits\n   * before the prefix is added (final value length is always 15).\n   *\n   * The optional `message` is carried in tag 81 (UTF-16BE hex) and is\n   * surfaced inside the TrueMoney app only; other scanners ignore it.\n   */\n  trueMoney(mobileNo: string, options: { amount?: number; message?: string } = {}): this {\n    const digits = mobileNo.replace(/\\D/g, '');\n    if (digits.length === 0) {\n      throw new TypeError('TrueMoney mobile number must contain at least one digit');\n    }\n    if (digits.length > 13) {\n      throw new RangeError(`TrueMoney mobile number too long (${digits.length} digits)`);\n    }\n    const wireMobile = TRUE_MONEY_PREFIX + digits.padStart(13, '0');\n    const template = encodeFields([\n      [SUB_GUID, GUID_PROMPTPAY],\n      [SUB_TRUE_MONEY, wireMobile],\n    ]);\n    this.fields.set(TAG_MERCHANT_ACCOUNT_PROMPTPAY, template);\n    this.fields.delete(TAG_MERCHANT_ACCOUNT_BILL_PAYMENT);\n    this.promptPayRecipient = undefined;\n    this.otaCode = undefined;\n    this.personalMessage = options.message;\n    if (options.amount != null) {\n      this.amount(options.amount);\n    } else {\n      this.amount(undefined);\n    }\n    return this;\n  }\n\n  /**\n   * Configure a BillPayment recipient (Cross-Bank BillPayment / R-Bill).\n   *\n   * Pass `crossBorder: true` to emit the ASEAN-region remittance AID\n   * (`A000000677012006`) instead of the domestic one (`A000000677010112`).\n   * The template layout is otherwise identical — same sub-tags, same\n   * value rules. Pair with the `purposeOfTransaction` additional-data\n   * field (tag 62 sub-tag 08), which carries an 18-char triple in this\n   * mode: currencyCode (3 digits) + localAmount (13 digits) +\n   * countryCode (2 digits). The builder treats that field as opaque;\n   * compose / parse the triple at the call site.\n   */\n  billPayment(input: {\n    billerId: string;\n    reference1?: string;\n    reference2?: string;\n    crossBorder?: boolean;\n  }): this {\n    const aid = input.crossBorder === true ? GUID_BILL_PAYMENT_CROSS_BORDER : GUID_BILL_PAYMENT;\n    const template = encodeFields([\n      [SUB_GUID, aid],\n      [SUB_BILL_BILLER_ID, input.billerId],\n      [SUB_BILL_REFERENCE_1, input.reference1],\n      [SUB_BILL_REFERENCE_2, input.reference2],\n    ]);\n    this.fields.set(TAG_MERCHANT_ACCOUNT_BILL_PAYMENT, template);\n    this.fields.delete(TAG_MERCHANT_ACCOUNT_PROMPTPAY);\n    this.promptPayRecipient = undefined;\n    this.otaCode = undefined;\n    return this;\n  }\n\n  /**\n   * Set the transaction amount in baht. Pass `{fromSatang: true}` to\n   * supply integer satang instead. Omit / pass `undefined` to keep the\n   * QR static (the consumer's banking app will prompt for an amount).\n   */\n  amount(value: number | bigint | undefined, options?: FormatAmountOptions): this {\n    const formatted = formatAmount(value, options);\n    if (formatted == null) {\n      this.fields.delete(TAG_TRANSACTION_AMOUNT);\n      this.fields.set(TAG_POINT_OF_INITIATION, POI_STATIC);\n    } else {\n      this.fields.set(TAG_TRANSACTION_AMOUNT, formatted);\n      this.fields.set(TAG_POINT_OF_INITIATION, POI_DYNAMIC);\n    }\n    return this;\n  }\n\n  /** Set the tip / convenience-fee policy (tags 55-57). */\n  tipPolicy(mode: TipMode | undefined): this {\n    this.tip = mode;\n    return this;\n  }\n\n  /** Set merchant display info (tags 52, 59, 60, 61). */\n  merchant(info: MerchantInfo): this {\n    if (info.categoryCode != null) this.fields.set(TAG_MERCHANT_CATEGORY_CODE, info.categoryCode);\n    if (info.name != null) this.fields.set(TAG_MERCHANT_NAME, info.name.slice(0, 25));\n    if (info.city != null) this.fields.set(TAG_MERCHANT_CITY, info.city.slice(0, 15));\n    if (info.postalCode != null) this.fields.set(TAG_POSTAL_CODE, info.postalCode);\n    return this;\n  }\n\n  /** Set sub-fields of the additional-data template (tag 62). */\n  additionalData(fields: AdditionalDataFields): this {\n    Object.assign(this.additional, fields);\n    return this;\n  }\n\n  /**\n   * Attach the Bank of Thailand VAT TQRC extension (tag 80). Promotes the\n   * payment QR to an e-tax-receipt source. Pass `undefined` to clear.\n   *\n   * Field-length rules come from the BOT extension spec:\n   *  - `sellerTaxBranchId` is exactly 4 characters\n   *  - `vatRate` is 1–5 characters when present (e.g. \"7\" or \"7.00\")\n   *  - `vatAmount` is 1–13 characters and required\n   */\n  vatTqrc(input: VATTQRCInput | undefined): this {\n    if (input == null) {\n      this.vat = undefined;\n      return this;\n    }\n    if (input.sellerTaxBranchId.length !== 4) {\n      throw new RangeError(\n        `VAT TQRC sellerTaxBranchId must be exactly 4 chars (got ${input.sellerTaxBranchId.length})`,\n      );\n    }\n    if (input.vatRate != null && (input.vatRate.length < 1 || input.vatRate.length > 5)) {\n      throw new RangeError(`VAT TQRC vatRate must be 1–5 chars (got ${input.vatRate.length})`);\n    }\n    if (input.vatAmount.length < 1 || input.vatAmount.length > 13) {\n      throw new RangeError(`VAT TQRC vatAmount must be 1–13 chars (got ${input.vatAmount.length})`);\n    }\n    this.vat = { ...input };\n    return this;\n  }\n\n  /** Force the point-of-initiation flag regardless of amount presence. */\n  pointOfInitiation(method: 'static' | 'dynamic'): this {\n    this.fields.set(TAG_POINT_OF_INITIATION, method === 'static' ? POI_STATIC : POI_DYNAMIC);\n    return this;\n  }\n\n  /** Compose the additional-data template if any sub-fields are set. */\n  private composeAdditionalData(): string | null {\n    const pairs: ReadonlyArray<readonly [string, string | undefined]> = [\n      [SUB_ADD_BILL_NUMBER, this.additional.billNumber],\n      [SUB_ADD_MOBILE_NUMBER, this.additional.mobileNumber],\n      [SUB_ADD_STORE_LABEL, this.additional.storeLabel],\n      [SUB_ADD_LOYALTY_NUMBER, this.additional.loyaltyNumber],\n      [SUB_ADD_REFERENCE_LABEL, this.additional.referenceLabel],\n      [SUB_ADD_CUSTOMER_LABEL, this.additional.customerLabel],\n      [SUB_ADD_TERMINAL_LABEL, this.additional.terminalLabel],\n      [SUB_ADD_PURPOSE_OF_TRANSACTION, this.additional.purposeOfTransaction],\n      [SUB_ADD_CONSUMER_DATA_REQUEST, this.additional.consumerDataRequest],\n    ];\n    const body = encodeFields(pairs);\n    return body === '' ? null : body;\n  }\n\n  /** Apply the tip policy to tags 55-57 just before emit. */\n  private applyTip(): void {\n    if (this.tip == null) {\n      this.fields.delete(TAG_TIP_OR_CONVENIENCE_INDICATOR);\n      this.fields.delete(TAG_TIP_FIXED);\n      this.fields.delete(TAG_TIP_PERCENTAGE);\n      return;\n    }\n    switch (this.tip.mode) {\n      case 'prompt':\n        this.fields.set(TAG_TIP_OR_CONVENIENCE_INDICATOR, TIP_PROMPT);\n        this.fields.delete(TAG_TIP_FIXED);\n        this.fields.delete(TAG_TIP_PERCENTAGE);\n        break;\n      case 'fixed': {\n        const formatted = formatAmount(this.tip.value, { fromSatang: this.tip.fromSatang });\n        if (formatted == null) {\n          throw new TypeError('Tip fixed amount must be positive');\n        }\n        this.fields.set(TAG_TIP_OR_CONVENIENCE_INDICATOR, TIP_FIXED);\n        this.fields.set(TAG_TIP_FIXED, formatted);\n        this.fields.delete(TAG_TIP_PERCENTAGE);\n        break;\n      }\n      case 'percentage':\n        this.fields.set(TAG_TIP_OR_CONVENIENCE_INDICATOR, TIP_PERCENTAGE);\n        this.fields.set(TAG_TIP_PERCENTAGE, this.tip.value.toFixed(2));\n        this.fields.delete(TAG_TIP_FIXED);\n        break;\n    }\n  }\n\n  /** Render the full wire-format payload with checksum appended. */\n  build(): string {\n    this.applyTip();\n    const additional = this.composeAdditionalData();\n    if (additional != null) {\n      this.fields.set(TAG_ADDITIONAL_DATA, additional);\n    } else {\n      this.fields.delete(TAG_ADDITIONAL_DATA);\n    }\n    if (this.personalMessage != null && this.personalMessage !== '') {\n      this.fields.set(TAG_PERSONAL_MESSAGE, encodePersonalMessage(this.personalMessage));\n    } else {\n      this.fields.delete(TAG_PERSONAL_MESSAGE);\n    }\n    if (this.vat != null) {\n      // Sub-tag order inside tag 80 is 00 → 01 → 02 per the BOT\n      // supplement; `encodeFields` drops the optional rate cleanly.\n      this.fields.set(\n        TAG_VAT_TQRC,\n        encodeFields([\n          [SUB_VAT_SELLER_TAX_BRANCH_ID, this.vat.sellerTaxBranchId],\n          [SUB_VAT_RATE, this.vat.vatRate],\n          [SUB_VAT_AMOUNT, this.vat.vatAmount],\n        ]),\n      );\n    } else {\n      this.fields.delete(TAG_VAT_TQRC);\n    }\n\n    // Spec mandates ascending tag order on the wire. Map iteration\n    // preserves insertion order, so we sort explicitly here instead.\n    // Tag 80 (VAT TQRC) sorts naturally after tag 64; the CRC tag 63 is\n    // appended below regardless of sort order so it always lands last.\n    const sorted = [...this.fields.entries()]\n      .filter(([tag]) => tag !== TAG_CHECKSUM)\n      .toSorted(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));\n\n    let body = '';\n    for (const [tag, value] of sorted) {\n      body += encodeField(tag, value);\n    }\n\n    // The CRC is taken over `body + \"6304\"` — the tag header for the\n    // checksum is part of the hashed input. Off-by-one if you miss it.\n    const seed = body + TAG_CHECKSUM + '04';\n    return seed + checksum(seed);\n  }\n\n  /** Render and split the body/CRC for inspection. */\n  buildWithChecksum(): { body: string; checksum: string; payload: string } {\n    const payload = this.build();\n    return {\n      body: payload.slice(0, -4),\n      checksum: payload.slice(-4),\n      payload,\n    };\n  }\n\n  /** UTF-8 byte view of the payload — useful for hashing or transport. */\n  toBytes(): Uint8Array {\n    const text = this.build();\n    const out = new Uint8Array(text.length);\n    for (let i = 0; i < text.length; i += 1) {\n      out[i] = text.charCodeAt(i) & 0xff;\n    }\n    return out;\n  }\n}\n","/**\n * CRC-16/CCITT-FALSE — the variant mandated by EMVCo MPM §4 for the\n * trailing checksum tag (poly 0x1021, init 0xFFFF, no reflect, no XOR out).\n *\n * Table-driven implementation: pre-compute the 256-entry lookup at module\n * load, then xor-shift one byte per loop iteration. Roughly 4× faster than\n * the per-bit loop for typical payload sizes (~120-180 chars), and the\n * 512-byte table is dwarfed by the JS function objects around it.\n */\n\nconst CRC_TABLE: Uint16Array = (() => {\n  const table = new Uint16Array(256);\n  for (let byte = 0; byte < 256; byte += 1) {\n    let acc = byte << 8;\n    for (let bit = 0; bit < 8; bit += 1) {\n      acc = (acc & 0x8000) !== 0 ? ((acc << 1) ^ 0x1021) & 0xffff : (acc << 1) & 0xffff;\n    }\n    table[byte] = acc;\n  }\n  return table;\n})();\n\n/**\n * Compute the CRC-16/CCITT-FALSE checksum of an ASCII-encoded payload\n * and return it as a 4-character uppercase hex string. The EMVCo spec\n * requires the trailing zero-padding to keep the QR payload length stable.\n */\nexport function checksum(input: string): string {\n  let acc = 0xffff;\n  for (let i = 0; i < input.length; i += 1) {\n    const byte = input.charCodeAt(i) & 0xff;\n    acc = ((acc << 8) ^ (CRC_TABLE[(acc >> 8) ^ byte] ?? 0)) & 0xffff;\n  }\n  return acc.toString(16).toUpperCase().padStart(4, '0');\n}\n","/**\n * `@thai-qr-payment/payload` — public surface.\n *\n * Wire-format helpers for the Thai QR Payment EMVCo MPM standard. Zero\n * runtime dependencies; works in browsers, Node, Bun, Deno, and edge\n * runtimes (Cloudflare Workers, Vercel Edge, Netlify, Deno Deploy).\n */\n\nexport { ThaiQRPaymentBuilder } from './builder.js';\nexport type { AdditionalDataFields, MerchantInfo, TipMode, VATTQRCInput } from './builder.js';\n\nexport { parsePayload } from './parser.js';\nexport type {\n  ParsedAdditionalData,\n  ParsedBillPayment,\n  ParsedCRC,\n  ParsedPayload,\n  ParsedPromptPay,\n  ParsedTrueMoney,\n  ParsedVATTQRC,\n  ParsePayloadOptions,\n} from './parser.js';\n\nexport { normaliseBankAccount, normaliseRecipient } from './recipient.js';\nexport type { NormalisedRecipient, PromptPayRecipientType } from './recipient.js';\n\nexport { formatAmount } from './amount.js';\nexport type { FormatAmountOptions } from './amount.js';\n\nexport { checksum } from './crc.js';\n\nexport { decodePersonalMessage, encodePersonalMessage } from './message.js';\n\nexport {\n  buildSlipVerify,\n  buildTrueMoneySlipVerify,\n  parseSlipVerify,\n  parseTrueMoneySlipVerify,\n} from './slip-verify.js';\nexport type {\n  ParsedSlipVerify,\n  ParsedTrueMoneySlipVerify,\n  SlipVerifyInput,\n  TrueMoneySlipVerifyInput,\n} from './slip-verify.js';\n\nexport { buildBOTBarcode, parseBOTBarcode } from './barcode.js';\nexport type { BOTBarcodeInput, ParsedBOTBarcode } from './barcode.js';\n\nexport { encodeField, encodeFields, parseFields, iterateFields } from './tlv.js';\nexport type { TLVField } from './tlv.js';\n\nexport * as Tags from './tags.js';\n\nimport { ThaiQRPaymentBuilder } from './builder.js';\nimport type { PromptPayRecipientType } from './recipient.js';\nimport type { FormatAmountOptions } from './amount.js';\n\n/**\n * Shorthand for the common \"make me a PromptPay QR for this recipient\n * with this amount\" use case. Returns the wire payload string.\n *\n * @example\n *   payloadFor({ recipient: '0812345678', amount: 100 })\n *   // → '00020101021229370016A00000067701011101130066812345678530376454...'\n */\nexport function payloadFor(input: {\n  recipient: string;\n  amount?: number;\n  type?: PromptPayRecipientType;\n  fromSatang?: boolean;\n}): string {\n  const opts: FormatAmountOptions | undefined = input.fromSatang ? { fromSatang: true } : undefined;\n  return new ThaiQRPaymentBuilder()\n    .promptpay(input.recipient, input.type)\n    .amount(input.amount, opts)\n    .build();\n}\n","/**\n * Personal-message codec for tag 81 (TrueMoney Wallet).\n *\n * The wire format is the UTF-16BE encoding of the message, expressed as\n * uppercase hex. Each Unicode code unit becomes 4 hex chars; `Hello` →\n * `00480065006C006C006F`. Length on the TLV header counts the hex chars,\n * not the source characters.\n *\n * Browser/edge-safe — no `node:buffer` reach-through.\n */\n\n/** Encode a personal message string to UTF-16BE hex (uppercase). */\nexport function encodePersonalMessage(message: string): string {\n  let out = '';\n  for (let i = 0; i < message.length; i += 1) {\n    const code = message.charCodeAt(i);\n    out += code.toString(16).padStart(4, '0').toUpperCase();\n  }\n  return out;\n}\n\n/** Decode a UTF-16BE hex string back to its source message. */\nexport function decodePersonalMessage(hex: string): string {\n  if (hex.length % 4 !== 0) {\n    throw new SyntaxError(`Personal-message hex must be a multiple of 4 chars; got ${hex.length}`);\n  }\n  let out = '';\n  for (let i = 0; i < hex.length; i += 4) {\n    const unit = Number.parseInt(hex.slice(i, i + 4), 16);\n    if (!Number.isFinite(unit)) {\n      throw new SyntaxError(`Invalid hex unit \"${hex.slice(i, i + 4)}\" at offset ${i}`);\n    }\n    out += String.fromCharCode(unit);\n  }\n  return out;\n}\n","/**\n * Decoder for Thai QR Payment wire payloads.\n *\n * Validates the trailing CRC, walks the TLV tree, and surfaces a typed\n * view of the merchant template + amount + additional-data sub-fields.\n * Useful for tests, debugging, and reading back QR codes captured by a\n * scanner.\n *\n * Two non-obvious behaviours live here:\n *  - `strict` opt-in surfaces a CRC failure as an exception instead of a\n *    silent pass; older code without the flag stays backwards-compatible.\n *  - Truncated-CRC auto-fix recovers payloads that some Thai banking\n *    apps emit with the last 1–2 hex chars chopped off. We left-pad the\n *    chopped value with zeros and accept it if the result hashes back to\n *    the same body. The flag survives on the parsed object so callers\n *    can warn the user about the source app's bug.\n */\n\nimport { checksum } from './crc.js';\nimport { decodePersonalMessage } from './message.js';\nimport type { PromptPayRecipientType } from './recipient.js';\nimport {\n  COUNTRY_TH,\n  CURRENCY_THB,\n  GUID_BILL_PAYMENT,\n  GUID_BILL_PAYMENT_CROSS_BORDER,\n  GUID_PROMPTPAY,\n  GUID_PROMPTPAY_OTA,\n  POI_DYNAMIC,\n  SUB_ADD_BILL_NUMBER,\n  SUB_ADD_CONSUMER_DATA_REQUEST,\n  SUB_ADD_CUSTOMER_LABEL,\n  SUB_ADD_LOYALTY_NUMBER,\n  SUB_ADD_MOBILE_NUMBER,\n  SUB_ADD_PURPOSE_OF_TRANSACTION,\n  SUB_ADD_REFERENCE_LABEL,\n  SUB_ADD_STORE_LABEL,\n  SUB_ADD_TERMINAL_LABEL,\n  SUB_BILL_BILLER_ID,\n  SUB_BILL_REFERENCE_1,\n  SUB_BILL_REFERENCE_2,\n  SUB_GUID,\n  SUB_PROMPTPAY_BANK_ACCOUNT,\n  SUB_PROMPTPAY_EWALLET,\n  SUB_PROMPTPAY_MOBILE,\n  SUB_PROMPTPAY_NATIONAL_ID,\n  SUB_PROMPTPAY_OTA,\n  SUB_TRUE_MONEY,\n  SUB_VAT_AMOUNT,\n  SUB_VAT_RATE,\n  SUB_VAT_SELLER_TAX_BRANCH_ID,\n  TAG_ADDITIONAL_DATA,\n  TAG_CHECKSUM,\n  TAG_COUNTRY_CODE,\n  TAG_MERCHANT_ACCOUNT_BILL_PAYMENT,\n  TAG_MERCHANT_ACCOUNT_PROMPTPAY,\n  TAG_MERCHANT_CATEGORY_CODE,\n  TAG_MERCHANT_CITY,\n  TAG_MERCHANT_NAME,\n  TAG_PAYLOAD_FORMAT,\n  TAG_PERSONAL_MESSAGE,\n  TAG_POINT_OF_INITIATION,\n  TAG_POSTAL_CODE,\n  TAG_TRANSACTION_AMOUNT,\n  TAG_TRANSACTION_CURRENCY,\n  TAG_VAT_TQRC,\n  TRUE_MONEY_PREFIX,\n} from './tags.js';\nimport { iterateFields, parseFields, type TLVField } from './tlv.js';\n\nconst BANK_CODE_LENGTH = 3;\n\nexport interface ParsedPromptPay {\n  readonly kind: 'promptpay';\n  readonly recipientType: PromptPayRecipientType;\n  /**\n   * Wire value for the recipient sub-tag. For `bankAccount` this is the\n   * full `bankCode + accountNo` concatenation — split fields are exposed\n   * separately below.\n   */\n  readonly recipient: string;\n  /** Bank code (3 digits). Present only when `recipientType === 'bankAccount'`. */\n  readonly bankCode?: string;\n  /** Account number. Present only when `recipientType === 'bankAccount'`. */\n  readonly accountNo?: string;\n  /** One-Time Authorization code from sub-tag 05. Present only on OTA payloads. */\n  readonly ota?: string;\n}\n\nexport interface ParsedBillPayment {\n  readonly kind: 'billPayment';\n  readonly billerId: string;\n  readonly reference1?: string;\n  readonly reference2?: string;\n  /**\n   * `true` when the merchant template uses the ASEAN cross-border AID\n   * (`A000000677012006`). In that mode the `purposeOfTransaction` field\n   * (tag 62 sub-tag 08) carries an 18-char triple of currency + local\n   * amount + country; the parser surfaces it verbatim under\n   * `additionalData.purposeOfTransaction`.\n   */\n  readonly crossBorder: boolean;\n}\n\nexport interface ParsedTrueMoney {\n  readonly kind: 'trueMoney';\n  readonly mobileNo: string;\n  readonly message?: string;\n}\n\nexport interface ParsedAdditionalData {\n  billNumber?: string;\n  mobileNumber?: string;\n  storeLabel?: string;\n  loyaltyNumber?: string;\n  referenceLabel?: string;\n  customerLabel?: string;\n  terminalLabel?: string;\n  purposeOfTransaction?: string;\n  consumerDataRequest?: string;\n}\n\n/** Decoded VAT TQRC template (tag 80). */\nexport interface ParsedVATTQRC {\n  readonly sellerTaxBranchId: string;\n  readonly vatRate?: string;\n  readonly vatAmount: string;\n}\n\n/** Bookkeeping for the trailing checksum — useful when reporting auto-fix. */\nexport interface ParsedCRC {\n  /** The CRC text as it appeared on the wire (may be 1–4 chars). */\n  readonly value: string;\n  /** True when the wire CRC matches the recomputed value (possibly after padding). */\n  readonly valid: boolean;\n  /** True when zero-padding was needed to recover a valid CRC. */\n  readonly truncated: boolean;\n}\n\nexport interface ParsedPayload {\n  readonly payloadFormat: string;\n  readonly pointOfInitiation: 'static' | 'dynamic';\n  readonly merchant: ParsedPromptPay | ParsedBillPayment | ParsedTrueMoney | null;\n  readonly amount: number | null;\n  readonly currency: string;\n  readonly country: string;\n  readonly merchantName?: string;\n  readonly merchantCity?: string;\n  readonly merchantCategoryCode?: string;\n  readonly postalCode?: string;\n  readonly additionalData?: ParsedAdditionalData;\n  readonly vatTqrc?: ParsedVATTQRC;\n  readonly crc: ParsedCRC;\n  /** All top-level TLV fields, in wire order. Use for unknown / future tags. */\n  readonly rawTags: readonly TLVField[];\n  /** Lookup a top-level TLV field by id. Returns `undefined` if absent. */\n  getTag(id: string): TLVField | undefined;\n  /**\n   * Lookup a value by id. Pass `subId` to descend one level into a nested\n   * template (tags 29–31, 62, 64 are templated). Returns `undefined` if\n   * either the parent or the sub-field is missing.\n   */\n  getTagValue(id: string, subId?: string): string | undefined;\n}\n\nexport interface ParsePayloadOptions {\n  /**\n   * When true, throw if the CRC tag is missing or its on-wire value\n   * doesn't match the recomputed checksum. Defaults to false for\n   * backwards compatibility with callers that need to consume the\n   * truncated-CRC auto-fix path.\n   */\n  readonly strict?: boolean;\n}\n\n/** Recover the human-readable mobile (drop the `0066` prefix and re-add `0`). */\nfunction fromMobileWire(wire: string): string {\n  // Wire: 13-char zero-padded, starts with 0066 for THB. Strip leading\n  // zeros, drop the 66 country code, prepend a 0.\n  const trimmed = wire.replace(/^0+/, '');\n  if (trimmed.startsWith('66')) return `0${trimmed.slice(2)}`;\n  return trimmed;\n}\n\n/** Reverse the TrueMoney mobile-wire transform (drop `14` + restore the leading 0). */\nfunction fromTrueMoneyWire(wire: string): string {\n  // Wire layout: \"14\" + 13-char zero-padded mobile. Thai mobiles\n  // canonically start with a leading 0, so strip the zero-padding and\n  // re-add the 0 the same way `fromMobileWire` does for PromptPay.\n  const trimmed = wire.slice(TRUE_MONEY_PREFIX.length).replace(/^0+/, '');\n  return trimmed === '' ? '0' : `0${trimmed}`;\n}\n\nfunction parsePromptPayTemplate(template: string): ParsedPromptPay | null {\n  const sub = parseFields(template);\n  const guid = sub.get(SUB_GUID);\n  // OTA payloads use the `…0114` AID; everything else rides the standard\n  // PromptPay `…0111` AID. The AID is the sole discriminator — sub-tags\n  // 01-04 carry the same recipient shapes in either envelope.\n  const isOta = guid === GUID_PROMPTPAY_OTA;\n  if (guid !== GUID_PROMPTPAY && !isOta) return null;\n  const ota = isOta ? sub.get(SUB_PROMPTPAY_OTA) : undefined;\n\n  const bankAccount = sub.get(SUB_PROMPTPAY_BANK_ACCOUNT);\n  if (bankAccount != null) {\n    return {\n      kind: 'promptpay',\n      recipientType: 'bankAccount',\n      recipient: bankAccount,\n      bankCode: bankAccount.slice(0, BANK_CODE_LENGTH),\n      accountNo: bankAccount.slice(BANK_CODE_LENGTH),\n      ...(ota != null ? { ota } : {}),\n    };\n  }\n  const mobile = sub.get(SUB_PROMPTPAY_MOBILE);\n  if (mobile != null) {\n    return {\n      kind: 'promptpay',\n      recipientType: 'mobile',\n      recipient: fromMobileWire(mobile),\n      ...(ota != null ? { ota } : {}),\n    };\n  }\n  const nationalId = sub.get(SUB_PROMPTPAY_NATIONAL_ID);\n  if (nationalId != null) {\n    return {\n      kind: 'promptpay',\n      recipientType: 'nationalId',\n      recipient: nationalId,\n      ...(ota != null ? { ota } : {}),\n    };\n  }\n  const eWallet = sub.get(SUB_PROMPTPAY_EWALLET);\n  if (eWallet != null) {\n    return {\n      kind: 'promptpay',\n      recipientType: 'eWallet',\n      recipient: eWallet,\n      ...(ota != null ? { ota } : {}),\n    };\n  }\n  return null;\n}\n\nfunction parseTrueMoneyTemplate(template: string): ParsedTrueMoney | null {\n  const sub = parseFields(template);\n  const guid = sub.get(SUB_GUID);\n  if (guid !== GUID_PROMPTPAY) return null;\n  const wireValue = sub.get(SUB_TRUE_MONEY);\n  if (wireValue == null) return null;\n  if (!wireValue.startsWith(TRUE_MONEY_PREFIX)) return null;\n  return { kind: 'trueMoney', mobileNo: fromTrueMoneyWire(wireValue) };\n}\n\nfunction parseBillPaymentTemplate(template: string): ParsedBillPayment | null {\n  const sub = parseFields(template);\n  const guid = sub.get(SUB_GUID);\n  // Two recognised AIDs: domestic and cross-border (ASEAN remittance).\n  // Anything else is an unknown AID — return null so the parser leaves\n  // `merchant` as null, matching how the PromptPay branch handles a\n  // strange GUID.\n  let crossBorder: boolean;\n  if (guid === GUID_BILL_PAYMENT) {\n    crossBorder = false;\n  } else if (guid === GUID_BILL_PAYMENT_CROSS_BORDER) {\n    crossBorder = true;\n  } else {\n    return null;\n  }\n  const billerId = sub.get(SUB_BILL_BILLER_ID);\n  if (billerId == null) return null;\n  return {\n    kind: 'billPayment',\n    billerId,\n    reference1: sub.get(SUB_BILL_REFERENCE_1) ?? undefined,\n    reference2: sub.get(SUB_BILL_REFERENCE_2) ?? undefined,\n    crossBorder,\n  };\n}\n\nfunction parseAdditionalDataTemplate(template: string): ParsedAdditionalData {\n  const sub = parseFields(template);\n  return {\n    billNumber: sub.get(SUB_ADD_BILL_NUMBER),\n    mobileNumber: sub.get(SUB_ADD_MOBILE_NUMBER),\n    storeLabel: sub.get(SUB_ADD_STORE_LABEL),\n    loyaltyNumber: sub.get(SUB_ADD_LOYALTY_NUMBER),\n    referenceLabel: sub.get(SUB_ADD_REFERENCE_LABEL),\n    customerLabel: sub.get(SUB_ADD_CUSTOMER_LABEL),\n    terminalLabel: sub.get(SUB_ADD_TERMINAL_LABEL),\n    purposeOfTransaction: sub.get(SUB_ADD_PURPOSE_OF_TRANSACTION),\n    consumerDataRequest: sub.get(SUB_ADD_CONSUMER_DATA_REQUEST),\n  };\n}\n\n/**\n * Parse the VAT TQRC template (tag 80). Returns `null` when the required\n * `vatAmount` sub-tag (02) is absent — callers in strict mode escalate\n * that to an exception, lax callers surface it as `vatTqrc: undefined`.\n */\nfunction parseVatTqrcTemplate(template: string): ParsedVATTQRC | null {\n  const sub = parseFields(template);\n  const sellerTaxBranchId = sub.get(SUB_VAT_SELLER_TAX_BRANCH_ID);\n  const vatAmount = sub.get(SUB_VAT_AMOUNT);\n  if (sellerTaxBranchId == null || vatAmount == null) return null;\n  const vatRate = sub.get(SUB_VAT_RATE);\n  return vatRate != null\n    ? { sellerTaxBranchId, vatRate, vatAmount }\n    : { sellerTaxBranchId, vatAmount };\n}\n\n/**\n * Split off the CRC. Returns the canonical (possibly zero-padded) wire\n * representation when an auto-fix landed; downstream TLV parsing always\n * sees a well-formed `6304XXXX` tail so it never needs to special-case\n * the truncated path.\n */\nfunction extractCrc(payload: string, strict: boolean): { canonical: string; crc: ParsedCRC } {\n  // Standard case: payload ends with \"6304XXXX\" where XXXX is the CRC.\n  // Verify first because it's the >99% path.\n  const fullCrc = payload.slice(-4);\n  const fullSeed = payload.slice(0, -4);\n  if (fullSeed.endsWith(TAG_CHECKSUM + '04')) {\n    const expected = checksum(fullSeed);\n    if (expected === fullCrc) {\n      return {\n        canonical: payload,\n        crc: { value: fullCrc, valid: true, truncated: false },\n      };\n    }\n    if (strict) {\n      throw new Error('Invalid CRC');\n    }\n  }\n\n  // Truncated-CRC fallback: walk back 1, 2, 3 chars and try padding the\n  // tail with leading zeros. The seed includes the `6304` header per the\n  // EMVCo spec, so it stays constant and only the value grows back.\n  if (!strict) {\n    for (let dropped = 1; dropped <= 3; dropped += 1) {\n      const candidateEnd = payload.length - (4 - dropped);\n      const candidateSeed = payload.slice(0, candidateEnd);\n      if (!candidateSeed.endsWith(TAG_CHECKSUM + '04')) continue;\n      const wireCrc = payload.slice(candidateEnd);\n      const padded = wireCrc.padStart(4, '0');\n      if (checksum(candidateSeed) === padded) {\n        return {\n          canonical: candidateSeed + padded,\n          crc: { value: wireCrc, valid: true, truncated: true },\n        };\n      }\n    }\n  }\n\n  if (strict) {\n    throw new Error('Invalid CRC');\n  }\n\n  // Non-strict fall-through: surface the original checksum-mismatch\n  // error for backwards compatibility with the previous parser.\n  throw new Error(\n    `Checksum mismatch: payload trails \"${fullCrc}\" but recomputes to \"${checksum(fullSeed)}\"`,\n  );\n}\n\n/**\n * Parse a wire-format payload. By default throws on structural errors or\n * a hard checksum mismatch (with truncated-CRC auto-fix applied when\n * possible). In `strict: true` mode also throws when the CRC tag is\n * missing or its value fails to match.\n */\nexport function parsePayload(payload: string, options: ParsePayloadOptions = {}): ParsedPayload {\n  if (payload.length < 8) {\n    throw new SyntaxError(\n      `Payload too short (${payload.length} chars); not a Thai QR Payment string`,\n    );\n  }\n\n  const strict = options.strict === true;\n  const { canonical, crc } = extractCrc(payload, strict);\n\n  // Iterate the canonical (possibly zero-padded) payload so rawTags\n  // reflect what the spec says the merchant intended, not the truncated\n  // wire byte-for-byte. Tag 63 still appears in rawTags for completeness.\n  const rawTags = [...iterateFields(canonical)];\n  const root = new Map<string, string>();\n  for (const field of rawTags) {\n    if (field.tag !== TAG_CHECKSUM) root.set(field.tag, field.value);\n  }\n\n  const promptpayTemplate = root.get(TAG_MERCHANT_ACCOUNT_PROMPTPAY);\n  const billPaymentTemplate = root.get(TAG_MERCHANT_ACCOUNT_BILL_PAYMENT);\n  let merchant: ParsedPromptPay | ParsedBillPayment | ParsedTrueMoney | null = null;\n  if (promptpayTemplate != null) {\n    // TrueMoney rides on the same AID as PromptPay; the literal \"14\"\n    // prefix on sub-tag 03 is the disambiguator.\n    merchant =\n      parseTrueMoneyTemplate(promptpayTemplate) ?? parsePromptPayTemplate(promptpayTemplate);\n  } else if (billPaymentTemplate != null) {\n    merchant = parseBillPaymentTemplate(billPaymentTemplate);\n  }\n\n  // Personal message lives at tag 81 — TrueMoney's only place to put a\n  // human-readable note. Other wallets ignore it.\n  let trueMoneyWithMessage: ParsedTrueMoney | null = null;\n  if (merchant != null && merchant.kind === 'trueMoney') {\n    const messageHex = root.get(TAG_PERSONAL_MESSAGE);\n    if (messageHex != null && messageHex !== '') {\n      try {\n        trueMoneyWithMessage = { ...merchant, message: decodePersonalMessage(messageHex) };\n      } catch {\n        // Malformed message hex shouldn't kill the whole parse — drop\n        // silently and surface via `rawTags` for callers that care.\n      }\n    }\n  }\n\n  const amountText = root.get(TAG_TRANSACTION_AMOUNT);\n  const additional = root.get(TAG_ADDITIONAL_DATA);\n  const vatTemplate = root.get(TAG_VAT_TQRC);\n  let vatTqrc: ParsedVATTQRC | undefined;\n  if (vatTemplate != null) {\n    const decoded = parseVatTqrcTemplate(vatTemplate);\n    if (decoded == null && strict) {\n      throw new Error('VAT TQRC template is missing required sub-tags');\n    }\n    vatTqrc = decoded ?? undefined;\n  }\n\n  const result: ParsedPayload = {\n    payloadFormat: root.get(TAG_PAYLOAD_FORMAT) ?? '',\n    pointOfInitiation: root.get(TAG_POINT_OF_INITIATION) === POI_DYNAMIC ? 'dynamic' : 'static',\n    merchant: trueMoneyWithMessage ?? merchant,\n    amount: amountText != null ? Number.parseFloat(amountText) : null,\n    currency: root.get(TAG_TRANSACTION_CURRENCY) ?? CURRENCY_THB,\n    country: root.get(TAG_COUNTRY_CODE) ?? COUNTRY_TH,\n    merchantName: root.get(TAG_MERCHANT_NAME),\n    merchantCity: root.get(TAG_MERCHANT_CITY),\n    merchantCategoryCode: root.get(TAG_MERCHANT_CATEGORY_CODE),\n    postalCode: root.get(TAG_POSTAL_CODE),\n    additionalData: additional != null ? parseAdditionalDataTemplate(additional) : undefined,\n    vatTqrc,\n    crc,\n    rawTags,\n    getTag(id: string): TLVField | undefined {\n      for (const field of rawTags) {\n        if (field.tag === id) return field;\n      }\n      return undefined;\n    },\n    getTagValue(id: string, subId?: string): string | undefined {\n      const parent = this.getTag(id);\n      if (parent == null) return undefined;\n      if (subId == null) return parent.value;\n      for (const sub of iterateFields(parent.value)) {\n        if (sub.tag === subId) return sub.value;\n      }\n      return undefined;\n    },\n  };\n  return result;\n}\n","/**\n * Recipient normalisation for the PromptPay merchant template.\n *\n * The wire format under tag 29 has four sub-tags (01 phone, 02 national\n * ID, 03 e-wallet, 04 bank account). The expected length determines which\n * sub-tag a single-string recipient lands in, and phone numbers get the\n * country prefix swap `0` → `66`. Bank account values are composed from\n * two pieces (bank code + account number) and have their own helper.\n */\n\nimport {\n  SUB_PROMPTPAY_BANK_ACCOUNT,\n  SUB_PROMPTPAY_EWALLET,\n  SUB_PROMPTPAY_MOBILE,\n  SUB_PROMPTPAY_NATIONAL_ID,\n} from './tags.js';\n\nexport type PromptPayRecipientType = 'mobile' | 'nationalId' | 'eWallet' | 'bankAccount';\n\nexport interface NormalisedRecipient {\n  readonly subTag:\n    | typeof SUB_PROMPTPAY_MOBILE\n    | typeof SUB_PROMPTPAY_NATIONAL_ID\n    | typeof SUB_PROMPTPAY_EWALLET\n    | typeof SUB_PROMPTPAY_BANK_ACCOUNT;\n  readonly value: string;\n  readonly type: PromptPayRecipientType;\n}\n\nconst BANK_CODE_LENGTH = 3;\nconst BANK_ACCOUNT_MAX_LENGTH = 43;\n\n/** Strip every non-digit character. */\nfunction stripNonDigits(input: string): string {\n  let out = '';\n  for (let i = 0; i < input.length; i += 1) {\n    const code = input.charCodeAt(i);\n    if (code >= 0x30 && code <= 0x39) out += input[i];\n  }\n  return out;\n}\n\n/** Convert a mobile number to the 13-char `0066xxxxxxxxxx` wire form. */\nfunction toMobileWire(digits: string): string {\n  // Phones in Thailand are 9-10 digits (e.g. 0812345678). Replace the\n  // leading 0 with 66 (Thailand country code), then zero-pad to 13.\n  const trimmed = digits.replace(/^0/, '66');\n  return trimmed.padStart(13, '0');\n}\n\n/**\n * Decide the recipient type from the digit count, then format the wire\n * value. Explicit `type` arg overrides the inference — useful if a\n * national ID happens to look like a long e-wallet id or vice versa.\n * Pass `'bankAccount'` to `normaliseBankAccount` instead; it needs two\n * pieces (bank code + account number) the single-string form can't carry.\n */\nexport function normaliseRecipient(\n  raw: string,\n  explicit?: Exclude<PromptPayRecipientType, 'bankAccount'>,\n): NormalisedRecipient {\n  const digits = stripNonDigits(raw);\n  if (digits.length === 0) {\n    throw new TypeError('PromptPay recipient must contain at least one digit');\n  }\n\n  const inferred: Exclude<PromptPayRecipientType, 'bankAccount'> =\n    explicit ?? (digits.length >= 15 ? 'eWallet' : digits.length >= 13 ? 'nationalId' : 'mobile');\n\n  switch (inferred) {\n    case 'mobile':\n      return { subTag: SUB_PROMPTPAY_MOBILE, value: toMobileWire(digits), type: 'mobile' };\n    case 'nationalId':\n      if (digits.length !== 13) {\n        throw new RangeError(`National ID must be 13 digits, got ${digits.length}`);\n      }\n      return { subTag: SUB_PROMPTPAY_NATIONAL_ID, value: digits, type: 'nationalId' };\n    case 'eWallet':\n      if (digits.length !== 15) {\n        throw new RangeError(`e-Wallet ID must be 15 digits, got ${digits.length}`);\n      }\n      return { subTag: SUB_PROMPTPAY_EWALLET, value: digits, type: 'eWallet' };\n  }\n}\n\n/**\n * Format a bank-account recipient for sub-tag 04 under the PromptPay\n * merchant template. The wire value is the 3-digit bank code followed by\n * the (variable-length, numeric) account number; total length must fit\n * EMVCo's 1–43-character cap on the sub-tag.\n *\n * @example\n *   normaliseBankAccount('014', '1234567890')\n *   // → { subTag: '04', value: '0141234567890', type: 'bankAccount' }\n */\nexport function normaliseBankAccount(bankCode: string, accountNo: string): NormalisedRecipient {\n  const codeDigits = stripNonDigits(bankCode);\n  const accountDigits = stripNonDigits(accountNo);\n  if (codeDigits.length !== BANK_CODE_LENGTH) {\n    throw new RangeError(`Bank code must be ${BANK_CODE_LENGTH} digits, got ${codeDigits.length}`);\n  }\n  if (accountDigits.length === 0) {\n    throw new TypeError('Bank account number must contain at least one digit');\n  }\n  const value = codeDigits + accountDigits;\n  if (value.length > BANK_ACCOUNT_MAX_LENGTH) {\n    throw new RangeError(\n      `Bank account wire value exceeds ${BANK_ACCOUNT_MAX_LENGTH} chars (got ${value.length})`,\n    );\n  }\n  return { subTag: SUB_PROMPTPAY_BANK_ACCOUNT, value, type: 'bankAccount' };\n}\n","/**\n * Slip Verify Mini-QR — a different envelope from PromptPay payments.\n *\n * Banks print a small \"Mini-QR\" on transfer slips (and inside the PromptPay\n * mobile-app slip view) so an Open API lookup can resolve the transaction\n * after an OCR / scan. The envelope shares the EMVCo TLV grammar but uses\n * its own root tags: a single nested template at tag 00, a country tag 51,\n * and a CRC at tag 91 — not tag 63 like a payment QR. This module wraps\n * the build / parse round-trip for the standard slip-verify shape and the\n * TrueMoney variant (different sub-fields, lowercase CRC hex).\n *\n * The parsers reject any payload that doesn't carry the slip-verify\n * envelope, and tolerate banks that ship a 1-3 character CRC by padding\n * with leading zeros until the checksum matches.\n */\n\nimport { checksum } from './crc.js';\nimport { encodeField, encodeFields, parseFields } from './tlv.js';\n\n// ── Envelope tags shared by both slip-verify variants ───────────────────\nconst TAG_ROOT_TEMPLATE = '00';\nconst TAG_COUNTRY = '51';\nconst TAG_CRC = '91';\n\n// ── Standard slip-verify sub-tags (under root template) ─────────────────\nconst SUB_API_TYPE = '00';\nconst SUB_SENDING_BANK = '01';\nconst SUB_TRANS_REF = '02';\nconst SLIP_VERIFY_API_TYPE = '000001';\nconst COUNTRY_TH = 'TH';\n\n// ── TrueMoney variant sub-tags (under root template) ────────────────────\nconst SUB_TM_MARKER_A = '00';\nconst SUB_TM_MARKER_B = '01';\nconst SUB_TM_EVENT_TYPE = '02';\nconst SUB_TM_TRANSACTION_ID = '03';\nconst SUB_TM_DATE = '04';\nconst TM_MARKER_VALUE = '01';\n\nconst CRC_HEADER = TAG_CRC + '04';\nconst TM_DATE_LENGTH = 8;\n\n/** Input for `buildSlipVerify`. */\nexport interface SlipVerifyInput {\n  /** Bank code that issued the slip (e.g. `'002'` for Bangkok Bank). */\n  readonly sendingBank: string;\n  /** Transaction reference printed on the slip. */\n  readonly transRef: string;\n}\n\n/** Decoded payload from `parseSlipVerify`. */\nexport interface ParsedSlipVerify {\n  readonly sendingBank: string;\n  readonly transRef: string;\n}\n\n/** Input for `buildTrueMoneySlipVerify`. */\nexport interface TrueMoneySlipVerifyInput {\n  /** Event classification (e.g. `'P2P'`). */\n  readonly eventType: string;\n  /** Wallet transaction identifier. */\n  readonly transactionId: string;\n  /** Transfer date as a `DDMMYYYY` 8-character string. */\n  readonly date: string;\n}\n\n/** Decoded payload from `parseTrueMoneySlipVerify`. */\nexport interface ParsedTrueMoneySlipVerify {\n  readonly eventType: string;\n  readonly transactionId: string;\n  readonly date: string;\n}\n\n/**\n * Build a Slip Verify Mini-QR payload. The output is a TLV string ending\n * in a tag-91 CRC (uppercase hex), suitable for embedding in a printed\n * slip and looking the transaction up via bank Open APIs.\n *\n * @example\n *   buildSlipVerify({ sendingBank: '002', transRef: '0002123123121200011' })\n *   // → '004000060000010103002021900021231231212000115102TH91049C30'\n */\nexport function buildSlipVerify(input: SlipVerifyInput): string {\n  const inner = encodeFields([\n    [SUB_API_TYPE, SLIP_VERIFY_API_TYPE],\n    [SUB_SENDING_BANK, input.sendingBank],\n    [SUB_TRANS_REF, input.transRef],\n  ]);\n  const body = encodeField(TAG_ROOT_TEMPLATE, inner) + encodeField(TAG_COUNTRY, COUNTRY_TH);\n  const seed = body + CRC_HEADER;\n  return seed + checksum(seed);\n}\n\n/**\n * Parse a Slip Verify Mini-QR payload. Returns `null` for any string that\n * isn't a valid slip-verify envelope — wrong root tag, wrong CRC tag, or\n * checksum mismatch. CRCs of 1-3 hex chars are auto-padded with leading\n * zeros (some bank apps drop characters when re-encoding).\n *\n * @example\n *   parseSlipVerify('004000060000010103002021900021231231212000115102TH91049C30')\n *   // → { sendingBank: '002', transRef: '0002123123121200011' }\n */\nexport function parseSlipVerify(payload: string): ParsedSlipVerify | null {\n  const repaired = repairCrcEnvelope(payload, true);\n  if (repaired == null) return null;\n\n  let root: Map<string, string>;\n  try {\n    root = parseFields(repaired.body);\n  } catch {\n    return null;\n  }\n\n  const template = root.get(TAG_ROOT_TEMPLATE);\n  if (template == null) return null;\n\n  let sub: Map<string, string>;\n  try {\n    sub = parseFields(template);\n  } catch {\n    return null;\n  }\n\n  if (sub.get(SUB_API_TYPE) !== SLIP_VERIFY_API_TYPE) return null;\n  const sendingBank = sub.get(SUB_SENDING_BANK);\n  const transRef = sub.get(SUB_TRANS_REF);\n  if (sendingBank == null || transRef == null) return null;\n\n  return { sendingBank, transRef };\n}\n\n/**\n * Build a TrueMoney Slip Verify Mini-QR payload. Uses the same TLV\n * envelope as the standard variant but with a different sub-tag layout\n * and a **lowercase** hex CRC at tag 91.\n *\n * @example\n *   buildTrueMoneySlipVerify({ eventType: 'P2P', transactionId: 'TXN0001234567', date: '25012024' })\n *   // → '00480002010102010203P2P0313TXN00012345670408250120249104b425'\n */\nexport function buildTrueMoneySlipVerify(input: TrueMoneySlipVerifyInput): string {\n  if (input.date.length !== TM_DATE_LENGTH) {\n    throw new RangeError(\n      `TrueMoney slip-verify date must be ${TM_DATE_LENGTH} chars (DDMMYYYY); got ${input.date.length}`,\n    );\n  }\n  const inner = encodeFields([\n    [SUB_TM_MARKER_A, TM_MARKER_VALUE],\n    [SUB_TM_MARKER_B, TM_MARKER_VALUE],\n    [SUB_TM_EVENT_TYPE, input.eventType],\n    [SUB_TM_TRANSACTION_ID, input.transactionId],\n    [SUB_TM_DATE, input.date],\n  ]);\n  const body = encodeField(TAG_ROOT_TEMPLATE, inner);\n  const seed = body + CRC_HEADER;\n  return seed + checksum(seed).toLowerCase();\n}\n\n/**\n * Parse a TrueMoney Slip Verify Mini-QR payload. Returns `null` for any\n * string that doesn't carry the TrueMoney marker pair (sub-tags 00 + 01\n * both `'01'`) or whose CRC fails to verify. Comparison is\n * case-insensitive; truncated CRCs (1-3 chars) are auto-padded.\n *\n * @example\n *   parseTrueMoneySlipVerify('00480002010102010203P2P0313TXN00012345670408250120249104b425')\n *   // → { eventType: 'P2P', transactionId: 'TXN0001234567', date: '25012024' }\n */\nexport function parseTrueMoneySlipVerify(payload: string): ParsedTrueMoneySlipVerify | null {\n  const repaired = repairCrcEnvelope(payload, false);\n  if (repaired == null) return null;\n\n  let root: Map<string, string>;\n  try {\n    root = parseFields(repaired.body);\n  } catch {\n    return null;\n  }\n\n  const template = root.get(TAG_ROOT_TEMPLATE);\n  if (template == null) return null;\n\n  let sub: Map<string, string>;\n  try {\n    sub = parseFields(template);\n  } catch {\n    return null;\n  }\n\n  if (sub.get(SUB_TM_MARKER_A) !== TM_MARKER_VALUE) return null;\n  if (sub.get(SUB_TM_MARKER_B) !== TM_MARKER_VALUE) return null;\n  const eventType = sub.get(SUB_TM_EVENT_TYPE);\n  const transactionId = sub.get(SUB_TM_TRANSACTION_ID);\n  const date = sub.get(SUB_TM_DATE);\n  if (eventType == null || transactionId == null || date == null) return null;\n\n  return { eventType, transactionId, date };\n}\n\n/**\n * Locate the tag-91 CRC at the tail of the payload, repair a truncated\n * checksum (1-3 hex chars get padded with leading zeros until a candidate\n * matches), and return the verified body. Returns `null` if no candidate\n * passes the CRC check.\n *\n * `caseSensitive=true` enforces uppercase hex equality (standard slip\n * verify). `false` lower-cases both sides before comparing (TrueMoney\n * accepts either case on the wire).\n */\nfunction repairCrcEnvelope(payload: string, caseSensitive: boolean): { body: string } | null {\n  const headerIdx = payload.lastIndexOf(CRC_HEADER);\n  if (headerIdx === -1) return null;\n\n  const seedEnd = headerIdx + CRC_HEADER.length;\n  const seed = payload.slice(0, seedEnd);\n  const tail = payload.slice(seedEnd);\n  if (tail.length === 0 || tail.length > 4) return null;\n\n  const expected = caseSensitive ? checksum(seed) : checksum(seed).toLowerCase();\n  const padded = tail.padStart(4, '0');\n  const normalised = caseSensitive ? padded : padded.toLowerCase();\n  if (normalised === expected) {\n    return { body: payload.slice(0, headerIdx) };\n  }\n  return null;\n}\n","/**\n * EMVCo Merchant-Presented-Mode QR Code Specification — tag registry.\n *\n * Source: EMVCo MPM v1.1 §3 — public spec; Bank of Thailand and KASIKORN\n * adopt the same numbering with Thai-specific GUIDs under templates 29-31.\n *\n * Tags are stringly-typed (two-character zero-padded decimal) on the wire\n * but exposed here as named constants so call sites stay readable.\n */\n\n// ── Primary tags (root TLVs) ────────────────────────────────────────────\nexport const TAG_PAYLOAD_FORMAT = '00';\nexport const TAG_POINT_OF_INITIATION = '01';\nexport const TAG_MERCHANT_ACCOUNT_PROMPTPAY = '29';\nexport const TAG_MERCHANT_ACCOUNT_BILL_PAYMENT = '30';\nexport const TAG_MERCHANT_ACCOUNT_KSHOP = '31';\nexport const TAG_MERCHANT_CATEGORY_CODE = '52';\nexport const TAG_TRANSACTION_CURRENCY = '53';\nexport const TAG_TRANSACTION_AMOUNT = '54';\nexport const TAG_TIP_OR_CONVENIENCE_INDICATOR = '55';\nexport const TAG_TIP_FIXED = '56';\nexport const TAG_TIP_PERCENTAGE = '57';\nexport const TAG_COUNTRY_CODE = '58';\nexport const TAG_MERCHANT_NAME = '59';\nexport const TAG_MERCHANT_CITY = '60';\nexport const TAG_POSTAL_CODE = '61';\nexport const TAG_ADDITIONAL_DATA = '62';\nexport const TAG_CHECKSUM = '63';\nexport const TAG_LANGUAGE_TEMPLATE = '64';\nexport const TAG_PERSONAL_MESSAGE = '81';\n\n// ── PromptPay merchant template (under tag 29) sub-fields ──────────────\nexport const SUB_GUID = '00';\nexport const SUB_PROMPTPAY_MOBILE = '01';\nexport const SUB_PROMPTPAY_NATIONAL_ID = '02';\nexport const SUB_PROMPTPAY_EWALLET = '03';\nexport const SUB_PROMPTPAY_BANK_ACCOUNT = '04';\nexport const SUB_PROMPTPAY_OTA = '05';\n\n// ── TrueMoney Wallet (also under tag 29, shares the PromptPay AID) ─────\n// Distinguished from PromptPay e-wallet by the literal \"14\" prefix in\n// sub-tag 03's value. The remaining 13 chars are the merchant's mobile,\n// zero-padded on the left.\nexport const SUB_TRUE_MONEY = '03';\nexport const TRUE_MONEY_PREFIX = '14';\n\n// ── BillPayment merchant template (under tag 30) sub-fields ────────────\nexport const SUB_BILL_BILLER_ID = '01';\nexport const SUB_BILL_REFERENCE_1 = '02';\nexport const SUB_BILL_REFERENCE_2 = '03';\n\n// ── Additional-data template (under tag 62) sub-fields ──────────────────\nexport const SUB_ADD_BILL_NUMBER = '01';\nexport const SUB_ADD_MOBILE_NUMBER = '02';\nexport const SUB_ADD_STORE_LABEL = '03';\nexport const SUB_ADD_LOYALTY_NUMBER = '04';\nexport const SUB_ADD_REFERENCE_LABEL = '05';\nexport const SUB_ADD_CUSTOMER_LABEL = '06';\nexport const SUB_ADD_TERMINAL_LABEL = '07';\nexport const SUB_ADD_PURPOSE_OF_TRANSACTION = '08';\nexport const SUB_ADD_CONSUMER_DATA_REQUEST = '09';\n\n// ── Constants from the Thai QR Payment supplement ──────────────────────\nexport const PAYLOAD_FORMAT_VERSION = '01';\nexport const POI_STATIC = '11';\nexport const POI_DYNAMIC = '12';\nexport const CURRENCY_THB = '764';\nexport const COUNTRY_TH = 'TH';\nexport const GUID_PROMPTPAY = 'A000000677010111';\nexport const GUID_BILL_PAYMENT = 'A000000677010112';\n// One-Time Authorization rides the PromptPay envelope but swaps the AID\n// so scanners can distinguish a single-use credit transfer from a\n// repeatable PromptPay payment.\nexport const GUID_PROMPTPAY_OTA = 'A000000677010114';\n// Cross-border bill payment shares tag 30 with the domestic variant but\n// flags itself with a distinct AID so scanners route the payload through\n// the ASEAN remittance rails (PayNow/DuitNow/QRIS interop) instead of the\n// local PromptPay biller switch.\nexport const GUID_BILL_PAYMENT_CROSS_BORDER = 'A000000677012006';\n\n// ── Tip handling ────────────────────────────────────────────────────────\nexport const TIP_PROMPT = '01';\nexport const TIP_FIXED = '02';\nexport const TIP_PERCENTAGE = '03';\n\n// ── VAT TQRC template (Bank of Thailand Tax-Qualified QR extension) ────\n// Tag 80 carries a nested TLV that turns a regular payment QR into an\n// e-tax-receipt source. The \"ascending tag id\" wire rule places it after\n// tag 64 and before tag 63 — the CRC-last rule wins over ordering.\nexport const TAG_VAT_TQRC = '80';\nexport const SUB_VAT_SELLER_TAX_BRANCH_ID = '00';\nexport const SUB_VAT_RATE = '01';\nexport const SUB_VAT_AMOUNT = '02';\n","/**\n * TLV (Tag-Length-Value) primitives for the EMVCo QR wire format.\n *\n * Every field on the wire is `IILLDDDD…` where `II` is the 2-char tag id,\n * `LL` is the 2-char zero-padded byte length, and `DDDD…` is the value.\n * Nested templates (tags 29-31, 62, 64) contain TLV runs in their value\n * slot recursively.\n */\n\n/** A parsed TLV field with its (possibly-nested) value text. */\nexport interface TLVField {\n  readonly tag: string;\n  readonly value: string;\n}\n\n/** Encode one TLV. The caller guarantees that `tag` is a valid 2-digit id. */\nexport function encodeField(tag: string, value: string): string {\n  const length = value.length.toString(10).padStart(2, '0');\n  if (value.length > 99) {\n    throw new RangeError(\n      `TLV value for tag ${tag} exceeds 99 bytes (got ${value.length}); split across multiple tags`,\n    );\n  }\n  return tag + length + value;\n}\n\n/**\n * Encode an array of `[tag, value]` pairs in registration order. Empty or\n * `null`/`undefined` values are filtered out so callers can compose\n * optional fields without an `if` chain.\n */\nexport function encodeFields(\n  pairs: ReadonlyArray<readonly [string, string | null | undefined]>,\n): string {\n  let out = '';\n  for (const [tag, value] of pairs) {\n    if (value == null || value === '') continue;\n    out += encodeField(tag, value);\n  }\n  return out;\n}\n\n/**\n * Walk a TLV-encoded string and return one field at a time. Stops cleanly\n * at end-of-input; throws on malformed length headers or truncated values.\n *\n * Designed for parsing both the root payload and nested template values\n * — the same algorithm applies at any depth.\n */\nexport function* iterateFields(input: string): IterableIterator<TLVField> {\n  let cursor = 0;\n  while (cursor < input.length) {\n    if (cursor + 4 > input.length) {\n      throw new SyntaxError(`Truncated TLV header at offset ${cursor}`);\n    }\n    const tag = input.slice(cursor, cursor + 2);\n    const lengthText = input.slice(cursor + 2, cursor + 4);\n    const length = Number.parseInt(lengthText, 10);\n    if (!Number.isFinite(length) || lengthText.length !== 2) {\n      throw new SyntaxError(`Invalid TLV length \"${lengthText}\" at offset ${cursor + 2}`);\n    }\n    const valueStart = cursor + 4;\n    const valueEnd = valueStart + length;\n    if (valueEnd > input.length) {\n      throw new SyntaxError(\n        `TLV value for tag ${tag} runs past end of input (need ${length} bytes from offset ${valueStart})`,\n      );\n    }\n    yield { tag, value: input.slice(valueStart, valueEnd) };\n    cursor = valueEnd;\n  }\n}\n\n/** Convenience over `iterateFields` — collect into a Map by tag id. */\nexport function parseFields(input: string): Map<string, string> {\n  const map = new Map<string, string>();\n  for (const field of iterateFields(input)) {\n    map.set(field.tag, field.value);\n  }\n  return map;\n}\n","/**\n * Append-only bit buffer used during QR data encoding.\n *\n * QR streams pack each segment's mode indicator, character-count\n * indicator, and payload bits into a continuous bit run that's later\n * sliced into 8-bit codewords. A typed-array-backed buffer keeps the\n * allocations down compared to JS array of booleans.\n */\n\nexport class BitBuffer {\n  private storage: Uint8Array;\n  private bitLength = 0;\n\n  constructor(initialCapacityBits = 256) {\n    this.storage = new Uint8Array(Math.ceil(initialCapacityBits / 8));\n  }\n\n  get length(): number {\n    return this.bitLength;\n  }\n\n  /** Push the low `count` bits of `value`, MSB first. */\n  push(value: number, count: number): void {\n    if (count < 0 || count > 31) {\n      throw new RangeError(`Bit width ${count} out of range (1-31)`);\n    }\n    this.ensureCapacity(this.bitLength + count);\n    for (let i = count - 1; i >= 0; i -= 1) {\n      const bit = (value >>> i) & 1;\n      const byteIdx = this.bitLength >>> 3;\n      const bitIdx = 7 - (this.bitLength & 7);\n      if (bit === 1) {\n        const current = this.storage[byteIdx] ?? 0;\n        this.storage[byteIdx] = current | (1 << bitIdx);\n      }\n      this.bitLength += 1;\n    }\n  }\n\n  /** Materialise the buffer as a packed byte view (LSB of each byte is the rightmost bit). */\n  toBytes(): Uint8Array {\n    const byteCount = Math.ceil(this.bitLength / 8);\n    return this.storage.slice(0, byteCount);\n  }\n\n  private ensureCapacity(neededBits: number): void {\n    const neededBytes = Math.ceil(neededBits / 8);\n    if (neededBytes <= this.storage.length) return;\n    let nextSize = this.storage.length === 0 ? 1 : this.storage.length;\n    while (nextSize < neededBytes) nextSize *= 2;\n    const expanded = new Uint8Array(nextSize);\n    expanded.set(this.storage);\n    this.storage = expanded;\n  }\n}\n","/**\n * Top-level QR encoder.\n *\n * Pipeline:\n *  1. Detect the narrowest mode for the input.\n *  2. Find the smallest version that fits the (mode, ECC) bit budget.\n *  3. Pack data → codewords → split into blocks → append Reed-Solomon ECC.\n *  4. Interleave codewords into the final byte stream + remainder bits.\n *  5. Lay down fixed patterns, place data in zigzag, try all 8 masks,\n *     pick the one with the lowest penalty.\n *  6. Embed format-info and (for v7+) version-info, then return.\n */\n\nimport { BitBuffer } from './bitbuffer.js';\nimport { buildBaseMatrix } from './patterns.js';\nimport { applyMask, MASK_COUNT, scoreMask } from './mask.js';\nimport { placeData, placeFormatInfo, placeVersionInfo } from './placement.js';\nimport { dataBitLength, detectMode, emitSegment } from './mode.js';\nimport { encodeBlock } from './rs.js';\nimport {\n  type BlockSpec,\n  type ErrorCorrectionLevel,\n  getBlockSpec,\n  totalCodewords,\n} from './version.js';\n\nexport interface EncodeOptions {\n  errorCorrectionLevel?: ErrorCorrectionLevel;\n  minVersion?: number;\n  maxVersion?: number;\n  forceMask?: number;\n}\n\nexport interface QRMatrix {\n  readonly size: number;\n  readonly modules: boolean[][];\n  readonly version: number;\n  readonly errorCorrectionLevel: ErrorCorrectionLevel;\n  readonly mask: number;\n}\n\n/** Pad a partial last codeword with 0 bits, then alternate `0xEC 0x11` filler. */\nfunction padToCapacity(bits: BitBuffer, dataCodewords: number): Uint8Array {\n  const target = dataCodewords * 8;\n  // Terminator: up to 4 trailing 0 bits.\n  const terminator = Math.min(4, target - bits.length);\n  if (terminator > 0) bits.push(0, terminator);\n  // Pad to byte boundary.\n  if (bits.length % 8 !== 0) bits.push(0, 8 - (bits.length % 8));\n  // Filler bytes alternate 0xEC / 0x11 per spec until full.\n  const bytes = new Uint8Array(dataCodewords);\n  const partial = bits.toBytes();\n  bytes.set(partial.slice(0, dataCodewords));\n  let toggle = false;\n  for (let i = partial.length; i < dataCodewords; i += 1) {\n    bytes[i] = toggle ? 0x11 : 0xec;\n    toggle = !toggle;\n  }\n  return bytes;\n}\n\n/** Split data into ECC blocks and append Reed-Solomon parity to each. */\nfunction buildCodewordBlocks(\n  spec: BlockSpec,\n  data: Uint8Array,\n): {\n  dataBlocks: Uint8Array[];\n  ecBlocks: Uint8Array[];\n} {\n  const dataBlocks: Uint8Array[] = [];\n  const ecBlocks: Uint8Array[] = [];\n  let offset = 0;\n  for (const [count, perBlock] of spec.groups) {\n    for (let i = 0; i < count; i += 1) {\n      const block = data.slice(offset, offset + perBlock);\n      offset += perBlock;\n      dataBlocks.push(block);\n      ecBlocks.push(encodeBlock(block, spec.ecPerBlock));\n    }\n  }\n  return { dataBlocks, ecBlocks };\n}\n\n/** Interleave data + ECC blocks column-major per ISO/IEC 18004 §7.6. */\nfunction interleave(dataBlocks: Uint8Array[], ecBlocks: Uint8Array[]): Uint8Array {\n  const maxDataLen = Math.max(...dataBlocks.map((b) => b.length));\n  const maxEcLen = Math.max(...ecBlocks.map((b) => b.length));\n  const out: number[] = [];\n  for (let i = 0; i < maxDataLen; i += 1) {\n    for (const block of dataBlocks) if (i < block.length) out.push(block[i] ?? 0);\n  }\n  for (let i = 0; i < maxEcLen; i += 1) {\n    for (const block of ecBlocks) if (i < block.length) out.push(block[i] ?? 0);\n  }\n  return Uint8Array.from(out);\n}\n\n/** Select the smallest version that can hold the encoded segment. */\nfunction pickVersion(\n  text: string,\n  mode: ReturnType<typeof detectMode>,\n  ecc: ErrorCorrectionLevel,\n  min: number,\n  max: number,\n): number {\n  for (let version = min; version <= max; version += 1) {\n    const needBits = dataBitLength(mode, text, version);\n    const capacity = getBlockSpec(version, ecc).dataCodewords * 8;\n    if (needBits <= capacity) return version;\n  }\n  throw new RangeError(\n    `Input does not fit in versions ${min}-${max} at ECC ${ecc} (${text.length} chars)`,\n  );\n}\n\n/**\n * Encode `text` as a QR Code matrix.\n *\n * The returned matrix is a square 2-D boolean array (`true` = dark\n * module). Render with any output (SVG, canvas, PNG, terminal).\n */\nexport function encodeQR(text: string, options: EncodeOptions = {}): QRMatrix {\n  const ecc = options.errorCorrectionLevel ?? 'M';\n  const minVersion = options.minVersion ?? 1;\n  const maxVersion = options.maxVersion ?? 40;\n\n  const mode = detectMode(text);\n  const version = pickVersion(text, mode, ecc, minVersion, maxVersion);\n  const spec = getBlockSpec(version, ecc);\n\n  // 1) Bit-encode the segment + pad to full data-codeword capacity.\n  const bits = new BitBuffer();\n  emitSegment(text, mode, version, bits);\n  const codewords = padToCapacity(bits, spec.dataCodewords);\n\n  // 2) ECC + interleave into final byte stream.\n  const { dataBlocks, ecBlocks } = buildCodewordBlocks(spec, codewords);\n  const finalBytes = interleave(dataBlocks, ecBlocks);\n\n  // QR may require a few zero \"remainder bits\" at the end of the stream.\n  const totalBytesNeeded = Math.ceil(\n    (totalCodewords(version, ecc) * 8 + REMAINDER_BITS[version]!) / 8,\n  );\n  const padded = new Uint8Array(totalBytesNeeded);\n  padded.set(finalBytes);\n\n  // 3) Build the base matrix and place data, format, version info.\n  const base = buildBaseMatrix(version);\n  placeData(base, padded);\n\n  // 4) Pick the lowest-penalty mask.\n  const snapshot = base.snapshot();\n  let bestMask = options.forceMask ?? 0;\n  let bestScore = Number.POSITIVE_INFINITY;\n  if (options.forceMask == null) {\n    for (let mask = 0; mask < MASK_COUNT; mask += 1) {\n      base.restore(snapshot);\n      placeFormatInfo(base, ecc, mask);\n      placeVersionInfo(base, version);\n      applyMask(base, mask);\n      const score = scoreMask(base);\n      if (score < bestScore) {\n        bestScore = score;\n        bestMask = mask;\n      }\n    }\n  }\n\n  base.restore(snapshot);\n  placeFormatInfo(base, ecc, bestMask);\n  placeVersionInfo(base, version);\n  applyMask(base, bestMask);\n\n  return {\n    size: base.dim,\n    modules: base.toBooleans(),\n    version,\n    errorCorrectionLevel: ecc,\n    mask: bestMask,\n  };\n}\n\n// Remainder-bit table per ISO/IEC 18004 §7.7.\nconst REMAINDER_BITS: Record<number, number> = {\n  1: 0,\n  2: 7,\n  3: 7,\n  4: 7,\n  5: 7,\n  6: 7,\n  7: 0,\n  8: 0,\n  9: 0,\n  10: 0,\n  11: 0,\n  12: 0,\n  13: 0,\n  14: 3,\n  15: 3,\n  16: 3,\n  17: 3,\n  18: 3,\n  19: 3,\n  20: 3,\n  21: 4,\n  22: 4,\n  23: 4,\n  24: 4,\n  25: 4,\n  26: 4,\n  27: 4,\n  28: 3,\n  29: 3,\n  30: 3,\n  31: 3,\n  32: 3,\n  33: 3,\n  34: 3,\n  35: 0,\n  36: 0,\n  37: 0,\n  38: 0,\n  39: 0,\n  40: 0,\n};\n","/**\n * Format-information and version-information bit strings.\n *\n * Format info encodes (ECC level, mask index) as a 15-bit BCH (15, 5)\n * codeword XOR'd with the spec's fixed mask `0x5412`. Version info\n * encodes the version as an 18-bit BCH (18, 6) codeword for v7+.\n */\n\nimport { ECC_BITS, type ErrorCorrectionLevel } from './version.js';\n\nconst FORMAT_MASK = 0x5412;\nconst FORMAT_GENERATOR = 0x537; // 0b10100110111\nconst VERSION_GENERATOR = 0x1f25;\n\n/** BCH(15,5) encode the (ecc, mask) tuple and XOR with the format mask. */\nexport function encodeFormatBits(ecc: ErrorCorrectionLevel, mask: number): number {\n  const data = ((ECC_BITS[ecc] & 0b11) << 3) | (mask & 0b111);\n  let value = data << 10;\n  for (let i = 4; i >= 0; i -= 1) {\n    if (((value >> (i + 10)) & 1) !== 0) {\n      value ^= FORMAT_GENERATOR << i;\n    }\n  }\n  const bch = (data << 10) | (value & 0x3ff);\n  return bch ^ FORMAT_MASK;\n}\n\n/** BCH(18,6) encode the version number (only used for v7+). */\nexport function encodeVersionBits(version: number): number {\n  let value = version << 12;\n  for (let i = 5; i >= 0; i -= 1) {\n    if (((value >> (i + 12)) & 1) !== 0) {\n      value ^= VERSION_GENERATOR << i;\n    }\n  }\n  return (version << 12) | (value & 0xfff);\n}\n","/**\n * Galois field GF(2^8) arithmetic over the QR-spec primitive polynomial\n * 0x11D (binary 100011101) — the same field used by Reed-Solomon error\n * correction throughout ISO/IEC 18004.\n *\n * Lookup tables (`EXP` / `LOG`) trade 512 bytes for constant-time\n * multiplication and inversion. We build them once at module load using\n * the standard alpha-power generator.\n */\n\nconst PRIMITIVE = 0x11d;\n\nexport const EXP: Uint8Array = new Uint8Array(512);\nexport const LOG: Uint8Array = new Uint8Array(256);\n\n(() => {\n  let x = 1;\n  for (let i = 0; i < 255; i += 1) {\n    EXP[i] = x;\n    LOG[x] = i;\n    x <<= 1;\n    if (x & 0x100) x ^= PRIMITIVE;\n  }\n  // Mirror the first 255 entries into [255, 510] so callers can compute\n  // (LOG[a] + LOG[b]) without modulo.\n  for (let i = 255; i < 512; i += 1) {\n    EXP[i] = EXP[i - 255] ?? 0;\n  }\n})();\n\n/** Multiply two field elements. Returns 0 when either operand is 0. */\nexport function mul(a: number, b: number): number {\n  if (a === 0 || b === 0) return 0;\n  return EXP[(LOG[a] ?? 0) + (LOG[b] ?? 0)] ?? 0;\n}\n","/**\n * `@thai-qr-payment/qr` — zero-dependency QR Code encoder.\n *\n * ISO/IEC 18004 Model-2 implementation tuned for Thai QR Payment\n * (EMVCo MPM) payloads. Returns a boolean matrix; rendering is the\n * caller's responsibility (use `@thai-qr-payment/render` for SVG).\n */\n\nexport { encodeQR } from './encoder.js';\nexport type { EncodeOptions, QRMatrix } from './encoder.js';\nexport type { ErrorCorrectionLevel } from './version.js';\nexport { detectMode } from './mode.js';\nexport type { EncodingMode } from './mode.js';\n","/**\n * Mask pattern selection + penalty scoring per ISO/IEC 18004 §7.8.\n *\n * QR defines 8 mask patterns. After data placement, each candidate mask\n * is applied to the free-data modules and scored on four rule\n * categories; the lowest-scoring mask wins.\n */\n\nimport type { Matrix } from './matrix.js';\n\nconst MASK_PREDICATES: ReadonlyArray<(x: number, y: number) => boolean> = [\n  (x, y) => (x + y) % 2 === 0,\n  (_x, y) => y % 2 === 0,\n  (x) => x % 3 === 0,\n  (x, y) => (x + y) % 3 === 0,\n  (x, y) => (Math.floor(y / 2) + Math.floor(x / 3)) % 2 === 0,\n  (x, y) => ((x * y) % 2) + ((x * y) % 3) === 0,\n  (x, y) => (((x * y) % 2) + ((x * y) % 3)) % 2 === 0,\n  (x, y) => (((x + y) % 2) + ((x * y) % 3)) % 2 === 0,\n];\n\n/** Toggle every free-data module that matches the mask predicate. */\nexport function applyMask(matrix: Matrix, maskIndex: number): void {\n  const predicate = MASK_PREDICATES[maskIndex];\n  if (!predicate) throw new RangeError(`Mask index ${maskIndex} out of range`);\n  for (let y = 0; y < matrix.dim; y += 1) {\n    for (let x = 0; x < matrix.dim; x += 1) {\n      if (matrix.isReserved(x, y)) continue;\n      if (predicate(x, y)) matrix.set(x, y, !matrix.get(x, y));\n    }\n  }\n}\n\n// ── Penalty rules ─────────────────────────────────────────────────────\n\n/** Rule 1: penalty for consecutive runs of same-colour modules. */\nfunction penaltyRunLength(matrix: Matrix): number {\n  let total = 0;\n  const { dim } = matrix;\n  for (let y = 0; y < dim; y += 1) {\n    let runColor = matrix.get(0, y);\n    let runLen = 1;\n    for (let x = 1; x < dim; x += 1) {\n      const c = matrix.get(x, y);\n      if (c === runColor) {\n        runLen += 1;\n      } else {\n        if (runLen >= 5) total += runLen - 2;\n        runColor = c;\n        runLen = 1;\n      }\n    }\n    if (runLen >= 5) total += runLen - 2;\n  }\n  for (let x = 0; x < dim; x += 1) {\n    let runColor = matrix.get(x, 0);\n    let runLen = 1;\n    for (let y = 1; y < dim; y += 1) {\n      const c = matrix.get(x, y);\n      if (c === runColor) {\n        runLen += 1;\n      } else {\n        if (runLen >= 5) total += runLen - 2;\n        runColor = c;\n        runLen = 1;\n      }\n    }\n    if (runLen >= 5) total += runLen - 2;\n  }\n  return total;\n}\n\n/** Rule 2: penalty for 2×2 blocks of same-colour modules. */\nfunction penaltyBlocks(matrix: Matrix): number {\n  let count = 0;\n  const { dim } = matrix;\n  for (let y = 0; y < dim - 1; y += 1) {\n    for (let x = 0; x < dim - 1; x += 1) {\n      const c = matrix.get(x, y);\n      if (\n        matrix.get(x + 1, y) === c &&\n        matrix.get(x, y + 1) === c &&\n        matrix.get(x + 1, y + 1) === c\n      ) {\n        count += 1;\n      }\n    }\n  }\n  return count * 3;\n}\n\n/** Rule 3: penalty for finder-like patterns 10111010000 / 00001011101. */\nfunction penaltyFinderLike(matrix: Matrix): number {\n  const { dim } = matrix;\n  let count = 0;\n  const pattern1 = [1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0];\n  const pattern2 = [0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1];\n  const matches = (line: number[]): number => {\n    let hits = 0;\n    for (let i = 0; i <= line.length - 11; i += 1) {\n      let ok1 = true;\n      let ok2 = true;\n      for (let j = 0; j < 11; j += 1) {\n        if (line[i + j] !== pattern1[j]) ok1 = false;\n        if (line[i + j] !== pattern2[j]) ok2 = false;\n        if (!ok1 && !ok2) break;\n      }\n      if (ok1) hits += 1;\n      if (ok2) hits += 1;\n    }\n    return hits;\n  };\n  for (let y = 0; y < dim; y += 1) {\n    const row: number[] = [];\n    for (let x = 0; x < dim; x += 1) row.push(matrix.get(x, y) ? 1 : 0);\n    count += matches(row);\n  }\n  for (let x = 0; x < dim; x += 1) {\n    const col: number[] = [];\n    for (let y = 0; y < dim; y += 1) col.push(matrix.get(x, y) ? 1 : 0);\n    count += matches(col);\n  }\n  return count * 40;\n}\n\n/** Rule 4: penalty for dark/light imbalance. */\nfunction penaltyBalance(matrix: Matrix): number {\n  let dark = 0;\n  const total = matrix.dim * matrix.dim;\n  for (let y = 0; y < matrix.dim; y += 1) {\n    for (let x = 0; x < matrix.dim; x += 1) {\n      if (matrix.get(x, y)) dark += 1;\n    }\n  }\n  const ratio = (dark * 100) / total;\n  const off = Math.floor(Math.abs(ratio - 50) / 5);\n  return off * 10;\n}\n\n/** Total penalty (lower is better). */\nexport function scoreMask(matrix: Matrix): number {\n  return (\n    penaltyRunLength(matrix) +\n    penaltyBlocks(matrix) +\n    penaltyFinderLike(matrix) +\n    penaltyBalance(matrix)\n  );\n}\n\nexport const MASK_COUNT = MASK_PREDICATES.length;\n","/**\n * Module-grid layout for a single QR code.\n *\n * Wraps a `Uint8Array` of size `dim*dim` storing one bit per module.\n * A parallel \"reserved\" mask tracks which modules belong to fixed\n * patterns (finders, alignment, timing, format, version) so the data\n * placement skips them during the zigzag walk.\n */\n\nconst DARK = 1;\nconst LIGHT = 0;\nconst RESERVED = 1;\nconst FREE = 0;\n\nexport class Matrix {\n  readonly dim: number;\n  private readonly modules: Uint8Array;\n  private readonly reserved: Uint8Array;\n\n  constructor(dim: number) {\n    this.dim = dim;\n    this.modules = new Uint8Array(dim * dim);\n    this.reserved = new Uint8Array(dim * dim);\n  }\n\n  get(x: number, y: number): boolean {\n    return (this.modules[y * this.dim + x] ?? 0) === DARK;\n  }\n\n  set(x: number, y: number, dark: boolean): void {\n    this.modules[y * this.dim + x] = dark ? DARK : LIGHT;\n  }\n\n  reserve(x: number, y: number): void {\n    this.reserved[y * this.dim + x] = RESERVED;\n  }\n\n  isReserved(x: number, y: number): boolean {\n    return (this.reserved[y * this.dim + x] ?? 0) === RESERVED;\n  }\n\n  /** Export as a 2-D boolean array; useful for renderers. */\n  toBooleans(): boolean[][] {\n    const rows: boolean[][] = [];\n    for (let y = 0; y < this.dim; y += 1) {\n      const row: boolean[] = Array.from({ length: this.dim }, () => false);\n      for (let x = 0; x < this.dim; x += 1) {\n        row[x] = this.get(x, y);\n      }\n      rows.push(row);\n    }\n    return rows;\n  }\n\n  /** Snapshot just the data-module bits (used during mask scoring). */\n  snapshot(): Uint8Array {\n    return this.modules.slice();\n  }\n\n  restore(snapshot: Uint8Array): void {\n    this.modules.set(snapshot);\n  }\n\n  /** True if a module at (x, y) is on the free-data path. */\n  isFree(x: number, y: number): boolean {\n    return !this.isReserved(x, y);\n  }\n\n  fillReserved(x: number, y: number, dark: boolean): void {\n    this.set(x, y, dark);\n    this.reserve(x, y);\n  }\n}\n\nexport { DARK, LIGHT, RESERVED, FREE };\n","/**\n * Encoding mode detection + bit emission for QR data segments.\n *\n * We support the three modes that matter for Thai QR Payment:\n *  - **Numeric** (3 chars → 10 bits): for amount-only payloads\n *  - **Alphanumeric** (2 chars → 11 bits): the EMVCo payload character\n *    set fits entirely here ([0-9A-Z $%*+-./:])\n *  - **Byte** (1 char → 8 bits): fallback for arbitrary text\n *\n * Mode indicators are 4-bit constants prefixed to each segment.\n */\n\nimport type { BitBuffer } from './bitbuffer.js';\n\nexport type EncodingMode = 'numeric' | 'alphanumeric' | 'byte';\n\nexport const MODE_INDICATOR: Record<EncodingMode, number> = {\n  numeric: 0b0001,\n  alphanumeric: 0b0010,\n  byte: 0b0100,\n};\n\nconst ALPHANUMERIC_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:';\n\n/** Reverse-lookup map for alphanumeric encoding. */\nconst ALPHANUMERIC_INDEX: ReadonlyMap<string, number> = (() => {\n  const map = new Map<string, number>();\n  for (let i = 0; i < ALPHANUMERIC_CHARS.length; i += 1) {\n    map.set(ALPHANUMERIC_CHARS[i]!, i);\n  }\n  return map;\n})();\n\n/** Width of the character-count indicator (depends on mode + version range). */\nexport function charCountBits(mode: EncodingMode, version: number): number {\n  if (version <= 9) {\n    return mode === 'numeric' ? 10 : mode === 'alphanumeric' ? 9 : 8;\n  }\n  if (version <= 26) {\n    return mode === 'numeric' ? 12 : mode === 'alphanumeric' ? 11 : 16;\n  }\n  return mode === 'numeric' ? 14 : mode === 'alphanumeric' ? 13 : 16;\n}\n\nconst DIGITS_RE = /^[0-9]+$/;\nconst ALPHANUM_RE = /^[0-9A-Z $%*+\\-./:]+$/;\n\n/** Detect the narrowest mode that can encode the entire input. */\nexport function detectMode(text: string): EncodingMode {\n  if (DIGITS_RE.test(text)) return 'numeric';\n  if (ALPHANUM_RE.test(text)) return 'alphanumeric';\n  return 'byte';\n}\n\n/** Bit length of the encoded payload (mode indicator + counter + data). */\nexport function dataBitLength(mode: EncodingMode, text: string, version: number): number {\n  const header = 4 + charCountBits(mode, version);\n  switch (mode) {\n    case 'numeric': {\n      const full = Math.floor(text.length / 3);\n      const remainder = text.length - full * 3;\n      const tail = remainder === 0 ? 0 : remainder === 1 ? 4 : 7;\n      return header + full * 10 + tail;\n    }\n    case 'alphanumeric': {\n      const pairs = Math.floor(text.length / 2);\n      const remainder = text.length - pairs * 2;\n      return header + pairs * 11 + (remainder === 0 ? 0 : 6);\n    }\n    case 'byte':\n      return header + utf8Length(text) * 8;\n  }\n}\n\nfunction utf8Length(text: string): number {\n  // Most Thai QR payloads are ASCII; this branch keeps correctness for\n  // hypothetical UTF-8 byte-mode segments without paying for a full\n  // TextEncoder allocation on the hot path.\n  if (typeof TextEncoder !== 'undefined') return new TextEncoder().encode(text).length;\n  let count = 0;\n  for (let i = 0; i < text.length; i += 1) {\n    const code = text.charCodeAt(i);\n    if (code < 0x80) count += 1;\n    else if (code < 0x800) count += 2;\n    else if (code >= 0xd800 && code <= 0xdbff) {\n      count += 4;\n      i += 1; // surrogate pair\n    } else count += 3;\n  }\n  return count;\n}\n\n/** Emit a numeric segment. */\nfunction emitNumeric(text: string, bits: BitBuffer): void {\n  let i = 0;\n  while (i + 3 <= text.length) {\n    const triple = Number.parseInt(text.slice(i, i + 3), 10);\n    bits.push(triple, 10);\n    i += 3;\n  }\n  const remainder = text.length - i;\n  if (remainder === 2) bits.push(Number.parseInt(text.slice(i), 10), 7);\n  else if (remainder === 1) bits.push(Number.parseInt(text.slice(i), 10), 4);\n}\n\n/** Emit an alphanumeric segment. */\nfunction emitAlphanumeric(text: string, bits: BitBuffer): void {\n  let i = 0;\n  while (i + 2 <= text.length) {\n    const high = ALPHANUMERIC_INDEX.get(text[i]!);\n    const low = ALPHANUMERIC_INDEX.get(text[i + 1]!);\n    if (high == null || low == null) throw new TypeError(`Char outside alphanumeric set at ${i}`);\n    bits.push(high * 45 + low, 11);\n    i += 2;\n  }\n  if (i < text.length) {\n    const value = ALPHANUMERIC_INDEX.get(text[i]!);\n    if (value == null) throw new TypeError(`Char outside alphanumeric set at ${i}`);\n    bits.push(value, 6);\n  }\n}\n\n/** Emit a byte segment (UTF-8 encoded). */\nfunction emitByte(text: string, bits: BitBuffer): void {\n  const encoded =\n    typeof TextEncoder !== 'undefined' ? new TextEncoder().encode(text) : utf8EncodeFallback(text);\n  for (let i = 0; i < encoded.length; i += 1) {\n    bits.push(encoded[i] ?? 0, 8);\n  }\n}\n\nfunction utf8EncodeFallback(text: string): Uint8Array {\n  const out: number[] = [];\n  for (let i = 0; i < text.length; i += 1) {\n    let code = text.charCodeAt(i);\n    if (code >= 0xd800 && code <= 0xdbff && i + 1 < text.length) {\n      const low = text.charCodeAt(i + 1);\n      if (low >= 0xdc00 && low <= 0xdfff) {\n        code = 0x10000 + ((code - 0xd800) << 10) + (low - 0xdc00);\n        i += 1;\n      }\n    }\n    if (code < 0x80) out.push(code);\n    else if (code < 0x800) out.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));\n    else if (code < 0x10000) {\n      out.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));\n    } else {\n      out.push(\n        0xf0 | (code >> 18),\n        0x80 | ((code >> 12) & 0x3f),\n        0x80 | ((code >> 6) & 0x3f),\n        0x80 | (code & 0x3f),\n      );\n    }\n  }\n  return Uint8Array.from(out);\n}\n\n/** Append the full segment (mode + count + data) to the bit buffer. */\nexport function emitSegment(\n  text: string,\n  mode: EncodingMode,\n  version: number,\n  bits: BitBuffer,\n): void {\n  bits.push(MODE_INDICATOR[mode], 4);\n  bits.push(text.length, charCountBits(mode, version));\n  switch (mode) {\n    case 'numeric':\n      emitNumeric(text, bits);\n      return;\n    case 'alphanumeric':\n      emitAlphanumeric(text, bits);\n      return;\n    case 'byte':\n      emitByte(text, bits);\n      return;\n  }\n}\n","/**\n * Fixed-pattern placement: finder, separator, alignment, timing, dark\n * module, format-info reservation, and version-info reservation.\n *\n * Each routine reserves the modules it touches so the data placement\n * pass can skip over them.\n */\n\nimport { Matrix } from './matrix.js';\nimport { alignmentCentres, moduleCount } from './version.js';\n\nfunction placeFinder(m: Matrix, originX: number, originY: number): void {\n  for (let dy = -1; dy <= 7; dy += 1) {\n    for (let dx = -1; dx <= 7; dx += 1) {\n      const x = originX + dx;\n      const y = originY + dy;\n      if (x < 0 || y < 0 || x >= m.dim || y >= m.dim) continue;\n      const onEdge = dx === 0 || dx === 6 || dy === 0 || dy === 6;\n      const insideCore = dx >= 2 && dx <= 4 && dy >= 2 && dy <= 4;\n      const isBorder = dx === -1 || dx === 7 || dy === -1 || dy === 7;\n      const dark = !isBorder && (onEdge || insideCore);\n      m.fillReserved(x, y, dark);\n    }\n  }\n}\n\nfunction placeAlignment(m: Matrix, cx: number, cy: number): void {\n  for (let dy = -2; dy <= 2; dy += 1) {\n    for (let dx = -2; dx <= 2; dx += 1) {\n      const dark = Math.max(Math.abs(dx), Math.abs(dy)) !== 1;\n      m.fillReserved(cx + dx, cy + dy, dark);\n    }\n  }\n}\n\nfunction placeTimingPatterns(m: Matrix): void {\n  for (let i = 8; i < m.dim - 8; i += 1) {\n    const dark = i % 2 === 0;\n    m.fillReserved(i, 6, dark);\n    m.fillReserved(6, i, dark);\n  }\n}\n\nfunction placeDarkModule(m: Matrix, version: number): void {\n  // The dark module is the single forced-on module at (8, 4*v + 9).\n  m.fillReserved(8, 4 * version + 9, true);\n}\n\nfunction reserveFormatInfo(m: Matrix): void {\n  const dim = m.dim;\n  // Around top-left finder\n  for (let i = 0; i <= 8; i += 1) {\n    if (i !== 6) m.reserve(i, 8);\n    if (i !== 6) m.reserve(8, i);\n  }\n  // Bottom-left + top-right format strips\n  for (let i = 0; i < 7; i += 1) m.reserve(8, dim - 1 - i);\n  for (let i = 0; i < 8; i += 1) m.reserve(dim - 1 - i, 8);\n}\n\nfunction reserveVersionInfo(m: Matrix, version: number): void {\n  if (version < 7) return;\n  const dim = m.dim;\n  for (let row = 0; row < 6; row += 1) {\n    for (let col = dim - 11; col < dim - 8; col += 1) {\n      m.reserve(col, row);\n      m.reserve(row, col);\n    }\n  }\n}\n\n/**\n * Lay down every fixed pattern for the given version. Returns the\n * matrix in a state where the only unreserved modules are those\n * available for data placement (still empty / 0).\n */\nexport function buildBaseMatrix(version: number): Matrix {\n  const dim = moduleCount(version);\n  const m = new Matrix(dim);\n\n  placeFinder(m, 0, 0);\n  placeFinder(m, dim - 7, 0);\n  placeFinder(m, 0, dim - 7);\n\n  for (const cx of alignmentCentres(version)) {\n    for (const cy of alignmentCentres(version)) {\n      // Skip alignment patterns that overlap finder patterns.\n      const onTopLeftFinder = cx <= 8 && cy <= 8;\n      const onTopRightFinder = cx >= dim - 9 && cy <= 8;\n      const onBottomLeftFinder = cx <= 8 && cy >= dim - 9;\n      if (onTopLeftFinder || onTopRightFinder || onBottomLeftFinder) continue;\n      placeAlignment(m, cx, cy);\n    }\n  }\n\n  placeTimingPatterns(m);\n  placeDarkModule(m, version);\n  reserveFormatInfo(m);\n  reserveVersionInfo(m, version);\n\n  return m;\n}\n","/**\n * Module placement: data zigzag, format-info embed, version-info embed.\n */\n\nimport { encodeFormatBits, encodeVersionBits } from './format-info.js';\nimport type { Matrix } from './matrix.js';\nimport type { ErrorCorrectionLevel } from './version.js';\n\n/**\n * Walk the QR data area right-to-left in 2-column vertical zigzag and\n * place data bits. Columns at x=6 are skipped (timing pattern lives there).\n */\nexport function placeData(matrix: Matrix, bytes: Uint8Array): void {\n  const { dim } = matrix;\n  let bitIndex = 0;\n  let upward = true;\n\n  for (let right = dim - 1; right >= 1; right -= 2) {\n    if (right === 6) right -= 1; // skip the vertical timing column\n\n    for (let v = 0; v < dim; v += 1) {\n      const y = upward ? dim - 1 - v : v;\n      for (let off = 0; off < 2; off += 1) {\n        const x = right - off;\n        if (matrix.isReserved(x, y)) continue;\n        const byteIdx = bitIndex >>> 3;\n        const bitOffset = 7 - (bitIndex & 7);\n        const bit = (((bytes[byteIdx] ?? 0) >>> bitOffset) & 1) === 1;\n        matrix.set(x, y, bit);\n        bitIndex += 1;\n      }\n    }\n\n    upward = !upward;\n  }\n}\n\n/** Embed the 15-bit format-info word in the two canonical strips. */\nexport function placeFormatInfo(matrix: Matrix, ecc: ErrorCorrectionLevel, mask: number): void {\n  const bits = encodeFormatBits(ecc, mask);\n  const { dim } = matrix;\n\n  // Top-left strip (around the top-left finder)\n  for (let i = 0; i < 6; i += 1) matrix.set(8, i, ((bits >>> i) & 1) === 1);\n  matrix.set(8, 7, ((bits >>> 6) & 1) === 1);\n  matrix.set(8, 8, ((bits >>> 7) & 1) === 1);\n  matrix.set(7, 8, ((bits >>> 8) & 1) === 1);\n  for (let i = 9; i < 15; i += 1) matrix.set(14 - i, 8, ((bits >>> i) & 1) === 1);\n\n  // Bottom-left + top-right strips\n  for (let i = 0; i < 8; i += 1) matrix.set(dim - 1 - i, 8, ((bits >>> i) & 1) === 1);\n  for (let i = 8; i < 15; i += 1) matrix.set(8, dim - 15 + i, ((bits >>> i) & 1) === 1);\n}\n\n/** Embed the version-info word for v7+. No-op for v1-6. */\nexport function placeVersionInfo(matrix: Matrix, version: number): void {\n  if (version < 7) return;\n  const bits = encodeVersionBits(version);\n  const { dim } = matrix;\n  for (let i = 0; i < 18; i += 1) {\n    const bit = ((bits >>> i) & 1) === 1;\n    const row = Math.floor(i / 3);\n    const col = (i % 3) + dim - 11;\n    matrix.set(col, row, bit);\n    matrix.set(row, col, bit);\n  }\n}\n","/**\n * Reed-Solomon error correction over GF(2^8).\n *\n * QR uses a punctured Reed-Solomon code with the generator polynomial\n *   g(x) = ∏ (x − α^i) for i ∈ [0, ecLen)\n * built incrementally from the alpha exponents in `gf.EXP`. The encoder\n * computes the codeword remainder via long division and appends it to\n * the data stream.\n */\n\nimport { EXP, LOG, mul } from './gf.js';\n\n/** Pre-compute the RS generator polynomial of the requested length. */\nfunction buildGenerator(ecLen: number): Uint8Array {\n  // Start with the constant polynomial g(x) = 1.\n  let poly = new Uint8Array([1]);\n  for (let i = 0; i < ecLen; i += 1) {\n    // Multiply by (x − α^i): new coefficients have length+1 entries.\n    const next = new Uint8Array(poly.length + 1);\n    const alphaI = EXP[i] ?? 0;\n    for (let j = 0; j < poly.length; j += 1) {\n      const coeff = poly[j] ?? 0;\n      const carry = next[j] ?? 0;\n      next[j] = carry ^ coeff;\n      const tail = next[j + 1] ?? 0;\n      next[j + 1] = tail ^ mul(coeff, alphaI);\n    }\n    poly = next;\n  }\n  return poly;\n}\n\n/**\n * Encode a data block with `ecLen` ECC codewords appended. The output\n * is `data.length + ecLen` bytes long and matches the per-block format\n * used by QR's interleaved data layout.\n */\nexport function encodeBlock(data: Uint8Array, ecLen: number): Uint8Array {\n  const generator = buildGenerator(ecLen);\n  const buffer = new Uint8Array(data.length + ecLen);\n  buffer.set(data, 0);\n\n  for (let i = 0; i < data.length; i += 1) {\n    const lead = buffer[i] ?? 0;\n    if (lead === 0) continue;\n    const leadLog = LOG[lead] ?? 0;\n    for (let j = 0; j < generator.length; j += 1) {\n      const coeff = generator[j] ?? 0;\n      if (coeff === 0) continue;\n      const slot = buffer[i + j] ?? 0;\n      buffer[i + j] = slot ^ (EXP[leadLog + (LOG[coeff] ?? 0)] ?? 0);\n    }\n  }\n\n  return buffer.slice(data.length);\n}\n","/**\n * Capacity tables + version metadata from ISO/IEC 18004 §6.5 and Annex D.\n *\n * Each version 1-40 has 4 ECC levels (L, M, Q, H). For each (version, ECC)\n * the spec defines:\n *  - Total data codewords (`dataCodewords`)\n *  - Number of error-correction blocks (groups)\n *  - Block sizes within each group\n *\n * The matrix dimension is `(version - 1) * 4 + 21`.\n */\n\nexport type ErrorCorrectionLevel = 'L' | 'M' | 'Q' | 'H';\n\nexport interface BlockSpec {\n  /** Total data codewords across all blocks at this (version, ECC). */\n  readonly dataCodewords: number;\n  /** ECC codewords per block. */\n  readonly ecPerBlock: number;\n  /** `[count, dataPerBlock]` group entries (1 or 2 groups). */\n  readonly groups: ReadonlyArray<readonly [number, number]>;\n}\n\n// Format-bit prefix per ECC level (used by format-info encoding too).\nexport const ECC_BITS: Record<ErrorCorrectionLevel, number> = {\n  L: 0b01,\n  M: 0b00,\n  Q: 0b11,\n  H: 0b10,\n};\n\n/** Matrix dimension in modules. */\nexport function moduleCount(version: number): number {\n  return (version - 1) * 4 + 21;\n}\n\n// Block layout per (version, ECC). Sourced from ISO/IEC 18004:2015 Table 9.\n// Compactly encoded as a 2-D lookup keyed by (version, ECC).\n//\n// Each entry = [dataCodewords, ecPerBlock, groupCount1, dataPerBlock1,\n//               groupCount2?, dataPerBlock2?]\n//   ecBlocks[version-1][ecc] → row above.\nconst ECC_INDEX: Record<ErrorCorrectionLevel, number> = { L: 0, M: 1, Q: 2, H: 3 };\n\n// prettier-ignore\nconst ECC_TABLE: ReadonlyArray<ReadonlyArray<ReadonlyArray<number>>> = [\n  // v1\n  [\n    [19, 7, 1, 19],\n    [16, 10, 1, 16],\n    [13, 13, 1, 13],\n    [9, 17, 1, 9],\n  ],\n  // v2\n  [\n    [34, 10, 1, 34],\n    [28, 16, 1, 28],\n    [22, 22, 1, 22],\n    [16, 28, 1, 16],\n  ],\n  // v3\n  [\n    [55, 15, 1, 55],\n    [44, 26, 1, 44],\n    [34, 18, 2, 17],\n    [26, 22, 2, 13],\n  ],\n  // v4\n  [\n    [80, 20, 1, 80],\n    [64, 18, 2, 32],\n    [48, 26, 2, 24],\n    [36, 16, 4, 9],\n  ],\n  // v5\n  [\n    [108, 26, 1, 108],\n    [86, 24, 2, 43],\n    [62, 18, 2, 15, 2, 16],\n    [46, 22, 2, 11, 2, 12],\n  ],\n  // v6\n  [\n    [136, 18, 2, 68],\n    [108, 16, 4, 27],\n    [76, 24, 4, 19],\n    [60, 28, 4, 15],\n  ],\n  // v7\n  [\n    [156, 20, 2, 78],\n    [124, 18, 4, 31],\n    [88, 18, 2, 14, 4, 15],\n    [66, 26, 4, 13, 1, 14],\n  ],\n  // v8\n  [\n    [194, 24, 2, 97],\n    [154, 22, 2, 38, 2, 39],\n    [110, 22, 4, 18, 2, 19],\n    [86, 26, 4, 14, 2, 15],\n  ],\n  // v9\n  [\n    [232, 30, 2, 116],\n    [182, 22, 3, 36, 2, 37],\n    [132, 20, 4, 16, 4, 17],\n    [100, 24, 4, 12, 4, 13],\n  ],\n  // v10\n  [\n    [274, 18, 2, 68, 2, 69],\n    [216, 26, 4, 43, 1, 44],\n    [154, 24, 6, 19, 2, 20],\n    [122, 28, 6, 15, 2, 16],\n  ],\n  // v11\n  [\n    [324, 20, 4, 81],\n    [254, 30, 1, 50, 4, 51],\n    [180, 28, 4, 22, 4, 23],\n    [140, 24, 3, 12, 8, 13],\n  ],\n  // v12\n  [\n    [370, 24, 2, 92, 2, 93],\n    [290, 22, 6, 36, 2, 37],\n    [206, 26, 4, 20, 6, 21],\n    [158, 28, 7, 14, 4, 15],\n  ],\n  // v13\n  [\n    [428, 26, 4, 107],\n    [334, 22, 8, 37, 1, 38],\n    [244, 24, 8, 20, 4, 21],\n    [180, 22, 12, 11, 4, 12],\n  ],\n  // v14\n  [\n    [461, 30, 3, 115, 1, 116],\n    [365, 24, 4, 40, 5, 41],\n    [261, 20, 11, 16, 5, 17],\n    [197, 24, 11, 12, 5, 13],\n  ],\n  // v15\n  [\n    [523, 22, 5, 87, 1, 88],\n    [415, 24, 5, 41, 5, 42],\n    [295, 30, 5, 24, 7, 25],\n    [223, 24, 11, 12, 7, 13],\n  ],\n  // v16\n  [\n    [589, 24, 5, 98, 1, 99],\n    [453, 28, 7, 45, 3, 46],\n    [325, 24, 15, 19, 2, 20],\n    [253, 30, 3, 15, 13, 16],\n  ],\n  // v17\n  [\n    [647, 28, 1, 107, 5, 108],\n    [507, 28, 10, 46, 1, 47],\n    [367, 28, 1, 22, 15, 23],\n    [283, 28, 2, 14, 17, 15],\n  ],\n  // v18\n  [\n    [721, 30, 5, 120, 1, 121],\n    [563, 26, 9, 43, 4, 44],\n    [397, 28, 17, 22, 1, 23],\n    [313, 28, 2, 14, 19, 15],\n  ],\n  // v19\n  [\n    [795, 28, 3, 113, 4, 114],\n    [627, 26, 3, 44, 11, 45],\n    [445, 26, 17, 21, 4, 22],\n    [341, 26, 9, 13, 16, 14],\n  ],\n  // v20\n  [\n    [861, 28, 3, 107, 5, 108],\n    [669, 26, 3, 41, 13, 42],\n    [485, 30, 15, 24, 5, 25],\n    [385, 28, 15, 15, 10, 16],\n  ],\n  // v21\n  [\n    [932, 28, 4, 116, 4, 117],\n    [714, 26, 17, 42],\n    [512, 28, 17, 22, 6, 23],\n    [406, 30, 19, 16, 6, 17],\n  ],\n  // v22\n  [\n    [1006, 28, 2, 111, 7, 112],\n    [782, 28, 17, 46],\n    [568, 30, 7, 24, 16, 25],\n    [442, 24, 34, 13],\n  ],\n  // v23\n  [\n    [1094, 30, 4, 121, 5, 122],\n    [860, 28, 4, 47, 14, 48],\n    [614, 30, 11, 24, 14, 25],\n    [464, 30, 16, 15, 14, 16],\n  ],\n  // v24\n  [\n    [1174, 30, 6, 117, 4, 118],\n    [914, 28, 6, 45, 14, 46],\n    [664, 30, 11, 24, 16, 25],\n    [514, 30, 30, 16, 2, 17],\n  ],\n  // v25\n  [\n    [1276, 26, 8, 106, 4, 107],\n    [1000, 28, 8, 47, 13, 48],\n    [718, 30, 7, 24, 22, 25],\n    [538, 30, 22, 15, 13, 16],\n  ],\n  // v26\n  [\n    [1370, 28, 10, 114, 2, 115],\n    [1062, 28, 19, 46, 4, 47],\n    [754, 28, 28, 22, 6, 23],\n    [596, 30, 33, 16, 4, 17],\n  ],\n  // v27\n  [\n    [1468, 30, 8, 122, 4, 123],\n    [1128, 28, 22, 45, 3, 46],\n    [808, 30, 8, 23, 26, 24],\n    [628, 30, 12, 15, 28, 16],\n  ],\n  // v28\n  [\n    [1531, 30, 3, 117, 10, 118],\n    [1193, 28, 3, 45, 23, 46],\n    [871, 30, 4, 24, 31, 25],\n    [661, 30, 11, 15, 31, 16],\n  ],\n  // v29\n  [\n    [1631, 30, 7, 116, 7, 117],\n    [1267, 28, 21, 45, 7, 46],\n    [911, 30, 1, 23, 37, 24],\n    [701, 30, 19, 15, 26, 16],\n  ],\n  // v30\n  [\n    [1735, 30, 5, 115, 10, 116],\n    [1373, 28, 19, 47, 10, 48],\n    [985, 30, 15, 24, 25, 25],\n    [745, 30, 23, 15, 25, 16],\n  ],\n  // v31\n  [\n    [1843, 30, 13, 115, 3, 116],\n    [1455, 28, 2, 46, 29, 47],\n    [1033, 30, 42, 24, 1, 25],\n    [793, 30, 23, 15, 28, 16],\n  ],\n  // v32\n  [\n    [1955, 30, 17, 115],\n    [1541, 28, 10, 46, 23, 47],\n    [1115, 30, 10, 24, 35, 25],\n    [845, 30, 19, 15, 35, 16],\n  ],\n  // v33\n  [\n    [2071, 30, 17, 115, 1, 116],\n    [1631, 28, 14, 46, 21, 47],\n    [1171, 30, 29, 24, 19, 25],\n    [901, 30, 11, 15, 46, 16],\n  ],\n  // v34\n  [\n    [2191, 30, 13, 115, 6, 116],\n    [1725, 28, 14, 46, 23, 47],\n    [1231, 30, 44, 24, 7, 25],\n    [961, 30, 59, 16, 1, 17],\n  ],\n  // v35\n  [\n    [2306, 30, 12, 121, 7, 122],\n    [1812, 28, 12, 47, 26, 48],\n    [1286, 30, 39, 24, 14, 25],\n    [986, 30, 22, 15, 41, 16],\n  ],\n  // v36\n  [\n    [2434, 30, 6, 121, 14, 122],\n    [1914, 28, 6, 47, 34, 48],\n    [1354, 30, 46, 24, 10, 25],\n    [1054, 30, 2, 15, 64, 16],\n  ],\n  // v37\n  [\n    [2566, 30, 17, 122, 4, 123],\n    [1992, 28, 29, 46, 14, 47],\n    [1426, 30, 49, 24, 10, 25],\n    [1096, 30, 24, 15, 46, 16],\n  ],\n  // v38\n  [\n    [2702, 30, 4, 122, 18, 123],\n    [2102, 28, 13, 46, 32, 47],\n    [1502, 30, 48, 24, 14, 25],\n    [1142, 30, 42, 15, 32, 16],\n  ],\n  // v39\n  [\n    [2812, 30, 20, 117, 4, 118],\n    [2216, 28, 40, 47, 7, 48],\n    [1582, 30, 43, 24, 22, 25],\n    [1222, 30, 10, 15, 67, 16],\n  ],\n  // v40\n  [\n    [2956, 30, 19, 118, 6, 119],\n    [2334, 28, 18, 47, 31, 48],\n    [1666, 30, 34, 24, 34, 25],\n    [1276, 30, 20, 15, 61, 16],\n  ],\n];\n\n/** Look up the block specification for a (version, ECC) pair. */\nexport function getBlockSpec(version: number, ecc: ErrorCorrectionLevel): BlockSpec {\n  const row = ECC_TABLE[version - 1];\n  if (!row) throw new RangeError(`Version ${version} out of range (1-40)`);\n  const entry = row[ECC_INDEX[ecc]];\n  if (!entry) throw new RangeError(`No spec for version ${version} ECC ${ecc}`);\n  const dataCodewords = entry[0] ?? 0;\n  const ecPerBlock = entry[1] ?? 0;\n  const groups: Array<readonly [number, number]> = [];\n  for (let i = 2; i < entry.length; i += 2) {\n    const count = entry[i] ?? 0;\n    const dataPerBlock = entry[i + 1] ?? 0;\n    groups.push([count, dataPerBlock]);\n  }\n  return { dataCodewords, ecPerBlock, groups };\n}\n\n/** Total codewords (data + ECC) on the wire for a given version. */\nexport function totalCodewords(version: number, ecc: ErrorCorrectionLevel): number {\n  const spec = getBlockSpec(version, ecc);\n  let blocks = 0;\n  for (const [count] of spec.groups) blocks += count;\n  return spec.dataCodewords + blocks * spec.ecPerBlock;\n}\n\n/** Locations of alignment-pattern centres for a given version. */\nexport function alignmentCentres(version: number): readonly number[] {\n  if (version === 1) return [];\n  const count = Math.floor(version / 7) + 2;\n  const dim = moduleCount(version);\n  const last = dim - 7;\n  const step = version === 32 ? 26 : 2 * Math.ceil((last - 6) / (2 * (count - 1)));\n  // Walk backwards from `last` toward 6, prepending each centre until we\n  // have `count` entries (the first being the fixed 6 at the top-left\n  // finder edge). Returned in ascending order so callers can iterate\n  // predictably.\n  const centres: number[] = [6];\n  for (let pos = last; centres.length < count; pos -= step) {\n    centres.unshift(pos);\n  }\n  return centres.sort((a, b) => a - b);\n}\n","/**\n * Card composer: Thai QR Payment header + PromptPay sub-mark + QR\n * matrix + centre-overlay icon. Layout + sizing follows the official\n * BOT/TBA Thai QR Payment brand guideline:\n *\n *   - Card aspect 7.4 cm × 10.5 cm (0.7048) — portrait-ish\n *   - Navy `#00427A` (\"TQR Maximum Blue\", brand book §4)\n *   - Header band ~75 % of card width, ~3.5 : 1 aspect\n *   - PromptPay sub-mark *left-aligned* under the header (narrow strip)\n *   - QR ~85 % of card width, centred\n *   - Centre-overlay icon ~10 % of QR (ECC-H recovers the obscured modules)\n *\n *   ┌──────────────────────────┐\n *   │     ▓ THAI QR PAYMENT ▓  │  navy band, tight content crop\n *   │   ⎡Pmt⎤                  │  left-aligned narrow sub-mark\n *   ├──────────────────────────┤\n *   │   ▓▓▓▓▓▓▓▓▓▓▓▓▓        │\n *   │   ▓▓▓▓▓ ┌┐ ▓▓▓▓▓        │\n *   │   ▓▓▓▓▓ └┘ ▓▓▓▓▓        │  small icon overlay (~10%)\n *   │   ▓▓▓▓▓▓▓▓▓▓▓▓▓        │\n *   ├──────────────────────────┤\n *   │ optional merchant name   │\n *   │ optional amount label    │\n *   └──────────────────────────┘\n *\n * Theme rules:\n *   - `theme: 'color'` (default) → Thai_QR_Payment_Logo-01 + PromptPay2 (navy)\n *   - `theme: 'silhouette'`      → silhouette variant + PromptPay1 (black/white)\n *\n * Default PromptPay variant is `PromptPay2` (color theme) because the\n * brand book pairs the navy header with the navy PromptPay sub-mark.\n * Callers can override with `promptpayLogo` to pick `PromptPay1` (the\n * monochrome rounded-border variant) regardless of theme.\n */\n\nimport { COLOR_LOGOS, SILHOUETTE_LOGOS } from '@thai-qr-payment/assets';\nimport type { QRMatrix } from '@thai-qr-payment/qr';\nimport { escapeXmlAttribute, matrixToPath } from './matrix-svg.js';\n\nexport type CardTheme = 'color' | 'silhouette';\n\nexport interface CardOptions {\n  /** Brand artwork flavor. `color` keeps full fidelity, `silhouette` is monochrome. */\n  theme?: CardTheme;\n  /**\n   * Render the caption block (merchant name + amount) below the QR.\n   * Defaults to `false` — opt in explicitly, then supply the text via\n   * `merchantName` / `amountLabel`.\n   */\n  showCaption?: boolean;\n  /** Optional amount label rendered below the QR. Requires `showCaption`. */\n  amountLabel?: string;\n  /** Optional merchant name rendered below the QR (above the amount). Requires `showCaption`. */\n  merchantName?: string;\n  /** Background colour of the entire card. */\n  background?: string;\n  /** Foreground / accent colour for text + silhouette artwork. */\n  accent?: string;\n  /** QR module fill colour. Defaults to `#000000` for max scanner contrast. */\n  qrColor?: string;\n  /** Override the Thai QR Payment header logo by registry name. */\n  headerLogo?: keyof typeof COLOR_LOGOS;\n  /** Override the PromptPay sub-mark by registry name. */\n  promptpayLogo?: keyof typeof COLOR_LOGOS;\n  /**\n   * Overlay the Thai QR Payment icon at the centre of the QR matrix.\n   * Defaults to `true` for `theme: 'color'`, `false` for `'silhouette'`.\n   * Always pair with `encodeQR({ errorCorrectionLevel: 'Q' | 'H' })`\n   * so the obscured modules are recoverable.\n   */\n  centerOverlay?: boolean;\n}\n\n// Canvas 600 × 800 (3 : 4). Mirrors kittinan's 1000×1200 5:6 plus 80 px\n// of footer room for optional merchant + amount labels.\nconst CANVAS = { width: 600, height: 800 } as const;\n\n// Header band — full canvas width, ~6:1 aspect (BOT/TBA reference).\n// Acts as a solid navy strip; the logo sits centred inside with\n// generous padding rather than filling the band edge-to-edge.\nconst HEADER_BAND = { x: 0, y: 0, width: 600, height: 110 } as const;\n\n// Logo placement inside the header band — 40 % of canvas width,\n// centred horizontally with vertical padding.\nconst HEADER_LOGO = { x: 195, y: 15, width: 210, height: 80 } as const;\n\n// PromptPay sub-mark — centred under the header. PromptPay2 native\n// aspect 384 : 130 ≈ 2.95 : 1; we scale to 260 × 88 for a chunky\n// readable mark matching the brand reference.\nconst PROMPTPAY_BAND = { x: 170, y: 140, width: 260, height: 88 } as const;\n\n// QR frame — 500 × 500 (83 % of canvas width, larger than v6 to\n// match the brand reference's QR-dominant layout).\nconst QR_FRAME = { x: 50, y: 250, width: 500, height: 500 } as const;\nconst QR_INSET = 14;\nconst QR_BAND = {\n  x: QR_FRAME.x + QR_INSET,\n  y: QR_FRAME.y + QR_INSET,\n  width: QR_FRAME.width - QR_INSET * 2,\n  height: QR_FRAME.height - QR_INSET * 2,\n} as const;\n\n// Tight content bbox of `Thai_QR_Payment_Logo-01.svg`. The raw asset\n// is 913 × 376 with ~90 px of empty navy padding top/bottom and ~80 px\n// each side. Cropping to the actual icon+wordmark bbox yields the\n// brand-guide aspect (~3.55 : 1) and removes the floating-in-empty-navy\n// look the previous full-viewBox render produced.\nconst HEADER_VIEWBOX_CROP = '88 75 750 210';\n\n// Icon-only viewBox for the centre overlay. The icon glyph lives at\n// roughly x = 88..318 of the original 0..913 viewBox; we keep the full\n// vertical extent so the navy bg paints the centre overlay square.\nconst ICON_WIDTH = 325;\nconst ICON_HEIGHT = 376;\nconst ICON_VIEWBOX = `0 0 ${ICON_WIDTH} ${ICON_HEIGHT}`;\n/** White breathing room between the centre logo and the QR modules. */\nconst OVERLAY_PAD = 4;\n\n/** Strip the outer `<svg …>…</svg>` wrapper so the contents can be reused inside a `<symbol>`. */\nfunction unwrapSvg(svg: string): { viewBox: string; inner: string } {\n  const viewBoxMatch = svg.match(/viewBox=\"([^\"]+)\"/);\n  let viewBox = viewBoxMatch?.[1];\n  if (viewBox == null) {\n    // Asset has no explicit viewBox — derive from width/height. Many\n    // hand-authored / Illustrator-exported SVGs omit the viewBox and\n    // rely on width/height alone; without this fallback the symbol\n    // defaults to \"0 0 100 100\" and the artwork renders 0.5-px tall.\n    const widthMatch = svg.match(/<svg[^>]*\\swidth=\"([\\d.]+)\"/);\n    const heightMatch = svg.match(/<svg[^>]*\\sheight=\"([\\d.]+)\"/);\n    if (widthMatch != null && heightMatch != null) {\n      viewBox = `0 0 ${widthMatch[1]} ${heightMatch[1]}`;\n    } else {\n      viewBox = '0 0 100 100';\n    }\n  }\n  // Some assets (vtracer output) ship with leading `<?xml ... ?>`\n  // and/or `<!-- Generator ... -->` comments before the `<svg>`. Strip\n  // each pattern greedily so the outer `<svg>` always anchors at the\n  // start of the string before we drop it.\n  const inner = svg\n    .replace(/^\\s*<\\?xml[^?]*\\?>\\s*/i, '')\n    .replace(/^\\s*<!--[\\s\\S]*?-->\\s*/g, '')\n    .replace(/^\\s*<svg\\b[^>]*>/i, '')\n    .replace(/<\\/svg>\\s*$/i, '');\n  return { viewBox, inner };\n}\n\nfunction defineSymbol(id: string, svg: string, viewBoxOverride?: string): string {\n  const { viewBox, inner } = unwrapSvg(svg);\n  const vb = viewBoxOverride ?? viewBox;\n  return `<symbol id=\"${id}\" viewBox=\"${escapeXmlAttribute(vb)}\">${inner}</symbol>`;\n}\n\n// SILHOUETTE_LOGOS is a strict subset of COLOR_LOGOS (only marks for\n// which we shipped a `.silhouette.svg` are registered there). When the\n// caller asks for a colour-only mark (e.g. PromptPay2) under the\n// silhouette theme, fall back to the colour version rather than\n// erroring at the type level.\ntype AnyLogoName = keyof typeof COLOR_LOGOS;\nconst SILHOUETTE_LOOKUP = SILHOUETTE_LOGOS as Record<AnyLogoName, string | undefined>;\n\nfunction pickHeaderLogo(theme: CardTheme, override?: AnyLogoName): string {\n  const name = override ?? 'Thai_QR_Payment_Logo-01';\n  if (theme === 'silhouette') {\n    return SILHOUETTE_LOOKUP[name] ?? COLOR_LOGOS[name];\n  }\n  return COLOR_LOGOS[name];\n}\n\nfunction pickPromptpayLogo(theme: CardTheme, override?: AnyLogoName): string {\n  // Default differs by theme:\n  //   color      → PromptPay2 (navy bg, pairs with navy header)\n  //   silhouette → PromptPay1 (mono w/ rounded border)\n  const fallback: AnyLogoName = theme === 'silhouette' ? 'PromptPay1' : 'PromptPay2';\n  const name = override ?? fallback;\n  if (theme === 'silhouette') {\n    return SILHOUETTE_LOOKUP[name] ?? COLOR_LOGOS[name];\n  }\n  return COLOR_LOGOS[name];\n}\n\n/** Compose the full Thai QR Payment card SVG. */\nexport function renderCard(matrix: QRMatrix, options: CardOptions = {}): string {\n  const theme: CardTheme = options.theme ?? 'color';\n  const bg = options.background ?? '#ffffff';\n  const accent = options.accent ?? '#00427A';\n  const qrColor = options.qrColor ?? '#000000';\n  const headerSvg = pickHeaderLogo(theme, options.headerLogo);\n  const promptpaySvg = pickPromptpayLogo(theme, options.promptpayLogo);\n  const overlay = options.centerOverlay ?? theme === 'color';\n\n  const matrixPath = matrixToPath(matrix);\n  const modulePx = QR_BAND.width / matrix.size;\n  const qrTransform = `translate(${QR_BAND.x} ${QR_BAND.y}) scale(${modulePx})`;\n\n  // Centre overlay: navy mini-logo (icon-only crop of the header\n  // artwork) inside a small white pad with rounded corners. 16 % of\n  // the QR width — small enough that ECC-H recovers the obscured\n  // modules cleanly.\n  // The icon is taller than it is wide, and `xMidYMid meet` letterboxes it\n  // inside its box — so a square box would leave the side gaps ~2× the top\n  // and bottom ones. Give the box the icon's own aspect ratio instead: the\n  // glyph draws at exactly the same size, and the white pad around it is\n  // then uniform on all four sides.\n  const overlayHeight = QR_BAND.width * 0.16;\n  const overlayWidth = overlayHeight * (ICON_WIDTH / ICON_HEIGHT);\n  const overlayX = QR_BAND.x + (QR_BAND.width - overlayWidth) / 2;\n  const overlayY = QR_BAND.y + (QR_BAND.height - overlayHeight) / 2;\n  const overlayMarkup = overlay\n    ? [\n        `<rect x=\"${overlayX - OVERLAY_PAD}\" y=\"${overlayY - OVERLAY_PAD}\" width=\"${overlayWidth + OVERLAY_PAD * 2}\" height=\"${overlayHeight + OVERLAY_PAD * 2}\" fill=\"#ffffff\" rx=\"4\"/>`,\n        `<use href=\"#tqp-icon\" xlink:href=\"#tqp-icon\" x=\"${overlayX}\" y=\"${overlayY}\" width=\"${overlayWidth}\" height=\"${overlayHeight}\" preserveAspectRatio=\"xMidYMid meet\"/>`,\n      ].join('')\n    : '';\n\n  // Caption is opt-in: supplying the text alone is not enough, so a card\n  // built from a payload that happens to carry a merchant name stays clean\n  // unless the caller asks for it.\n  const showCaption = options.showCaption ?? false;\n  const labelBaseY = QR_FRAME.y + QR_FRAME.height + 38;\n  const merchantText =\n    showCaption && options.merchantName != null\n      ? `<text x=\"${CANVAS.width / 2}\" y=\"${labelBaseY}\" text-anchor=\"middle\" font-family=\"Inter, system-ui, sans-serif\" font-size=\"22\" font-weight=\"600\" fill=\"${escapeXmlAttribute(accent)}\">${escapeXmlAttribute(options.merchantName)}</text>`\n      : '';\n\n  const amountY = options.merchantName != null ? labelBaseY + 36 : labelBaseY + 6;\n  const amountText =\n    showCaption && options.amountLabel != null\n      ? `<text x=\"${CANVAS.width / 2}\" y=\"${amountY}\" text-anchor=\"middle\" font-family=\"Inter, system-ui, sans-serif\" font-size=\"30\" font-weight=\"700\" fill=\"${escapeXmlAttribute(accent)}\">${escapeXmlAttribute(options.amountLabel)}</text>`\n      : '';\n\n  return [\n    `<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" `,\n    `viewBox=\"0 0 ${CANVAS.width} ${CANVAS.height}\" shape-rendering=\"crispEdges\">`,\n    `<defs>`,\n    // Tight content-bbox crop so the header band renders flush — no\n    // empty navy padding around the icon+wordmark.\n    defineSymbol('tqp-header', headerSvg, HEADER_VIEWBOX_CROP),\n    defineSymbol('tqp-icon', headerSvg, ICON_VIEWBOX),\n    defineSymbol('tqp-promptpay', promptpaySvg),\n    `</defs>`,\n    `<rect width=\"${CANVAS.width}\" height=\"${CANVAS.height}\" fill=\"${escapeXmlAttribute(bg)}\" rx=\"20\"/>`,\n    // Solid navy strip — full canvas width, no rounded corners on\n    // bottom (overlaps the rounded card bg's top corners only).\n    `<path d=\"M0 ${HEADER_BAND.height} V20 a20 20 0 0 1 20 -20 H${CANVAS.width - 20} a20 20 0 0 1 20 20 V${HEADER_BAND.height} Z\" fill=\"${escapeXmlAttribute(theme === 'silhouette' ? accent : '#00427A')}\"/>`,\n    // Logo centred inside the strip with `meet` so it never overflows\n    // and never gets cropped. Tight-crop viewBox keeps the icon+text\n    // tight together; the strip provides the navy padding around them.\n    `<use href=\"#tqp-header\" xlink:href=\"#tqp-header\" x=\"${HEADER_LOGO.x}\" y=\"${HEADER_LOGO.y}\" width=\"${HEADER_LOGO.width}\" height=\"${HEADER_LOGO.height}\" preserveAspectRatio=\"xMidYMid meet\"/>`,\n    `<use href=\"#tqp-promptpay\" xlink:href=\"#tqp-promptpay\" x=\"${PROMPTPAY_BAND.x}\" y=\"${PROMPTPAY_BAND.y}\" width=\"${PROMPTPAY_BAND.width}\" height=\"${PROMPTPAY_BAND.height}\" preserveAspectRatio=\"xMidYMid meet\"/>`,\n    // White QR frame keeps the matrix readable even with a themed bg.\n    `<rect x=\"${QR_FRAME.x}\" y=\"${QR_FRAME.y}\" width=\"${QR_FRAME.width}\" height=\"${QR_FRAME.height}\" fill=\"#ffffff\" rx=\"6\"/>`,\n    `<g transform=\"${qrTransform}\"><path d=\"${matrixPath}\" fill=\"${escapeXmlAttribute(qrColor)}\"/></g>`,\n    overlayMarkup,\n    merchantText,\n    amountText,\n    `</svg>`,\n  ].join('');\n}\n","/**\n * `@thai-qr-payment/render` — high-level SVG renderer.\n *\n * Combines `@thai-qr-payment/payload`, `@thai-qr-payment/qr`, and\n * `@thai-qr-payment/assets` into one entry-point: pass merchant +\n * amount, get an SVG card.\n */\n\nimport { payloadFor, type PromptPayRecipientType } from '@thai-qr-payment/payload';\nimport { encodeQR, type ErrorCorrectionLevel } from '@thai-qr-payment/qr';\nimport { renderCard, type CardOptions } from './card.js';\nimport { renderQRSvg, type QRSvgOptions } from './matrix-svg.js';\n\nexport { renderCard } from './card.js';\nexport { renderQRSvg, matrixToPath } from './matrix-svg.js';\nexport type { CardOptions, CardTheme } from './card.js';\nexport type { QRSvgOptions } from './matrix-svg.js';\n\nexport interface RenderInput {\n  recipient: string;\n  amount?: number;\n  recipientType?: PromptPayRecipientType;\n  fromSatang?: boolean;\n  /** QR error-correction level. `H` gives the best margin for logo overlays. */\n  errorCorrectionLevel?: ErrorCorrectionLevel;\n}\n\n/**\n * One-shot helper: build payload → encode QR → render Thai QR Payment card.\n * Returns the SVG string ready to ship.\n */\nexport function renderThaiQRPayment(input: RenderInput & Omit<CardOptions, never>): string {\n  const wire = payloadFor({\n    recipient: input.recipient,\n    amount: input.amount,\n    type: input.recipientType,\n    fromSatang: input.fromSatang,\n  });\n  // The default card layout overlays the Thai QR Payment icon on the\n  // QR centre, which obscures ~3 % of the modules. Default ECC up to\n  // 'H' so scanners can recover the lost data; callers can still\n  // explicitly pass a weaker level.\n  const ecc = input.errorCorrectionLevel ?? 'H';\n  const matrix = encodeQR(wire, { errorCorrectionLevel: ecc });\n  return renderCard(matrix, input);\n}\n\n/**\n * One-shot helper for callers that want only the QR (no header card).\n * Useful when wrapping the QR in your own design system.\n */\nexport function renderThaiQRPaymentMatrix(input: RenderInput & QRSvgOptions): string {\n  const wire = payloadFor({\n    recipient: input.recipient,\n    amount: input.amount,\n    type: input.recipientType,\n    fromSatang: input.fromSatang,\n  });\n  const matrix = encodeQR(wire, {\n    errorCorrectionLevel: input.errorCorrectionLevel ?? 'M',\n  });\n  return renderQRSvg(matrix, input);\n}\n","/**\n * Compact SVG <path> serialisation of a QR module matrix.\n *\n * Emits one move + horizontal-run command per dark stretch on each\n * row. Gzip likes the repetition; for a typical 25-30-module Thai QR\n * Payment payload the path is 1-2 KB before compression.\n */\n\nimport type { QRMatrix } from '@thai-qr-payment/qr';\n\n/** Build a path-data string covering every dark module in the matrix. */\nexport function matrixToPath(matrix: QRMatrix): string {\n  const segments: string[] = [];\n  for (let y = 0; y < matrix.size; y += 1) {\n    const row = matrix.modules[y];\n    if (!row) continue;\n    let x = 0;\n    while (x < row.length) {\n      if (!row[x]) {\n        x += 1;\n        continue;\n      }\n      let runEnd = x;\n      while (runEnd < row.length && row[runEnd]) runEnd += 1;\n      const runLen = runEnd - x;\n      // Single-row rectangle: M x y h<runLen> v1 h-<runLen> z\n      segments.push(`M${x} ${y}h${runLen}v1h-${runLen}z`);\n      x = runEnd;\n    }\n  }\n  return segments.join('');\n}\n\nexport interface QRSvgOptions {\n  /** Output width in user units (px by default). Defaults to module count. */\n  size?: number;\n  /** Quiet-zone width in modules. EMVCo recommends 4. */\n  quietZone?: number;\n  /** Dark module colour. Defaults to `#000`. */\n  foreground?: string;\n  /** Background colour (set to `transparent` to omit). Defaults to `#fff`. */\n  background?: string;\n  /** Additional attributes added verbatim to the root `<svg>` element. */\n  rootAttributes?: Record<string, string>;\n}\n\n/** Render a QR matrix to a self-contained `<svg>` string. */\nexport function renderQRSvg(matrix: QRMatrix, options: QRSvgOptions = {}): string {\n  const quietZone = toSafeUint(options.quietZone, 4);\n  const fg = options.foreground ?? '#000';\n  const bg = options.background ?? '#fff';\n  const total = toSafeUint(matrix.size, 0) + quietZone * 2;\n  const size = toSafeUint(options.size, total);\n  const path = matrixToPath(matrix);\n\n  const extra = options.rootAttributes\n    ? ' ' +\n      Object.entries(options.rootAttributes)\n        .map(([k, v]) => `${k}=\"${escapeXmlAttribute(v)}\"`)\n        .join(' ')\n    : '';\n\n  return (\n    `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${total} ${total}\" ` +\n    `width=\"${size}\" height=\"${size}\" shape-rendering=\"crispEdges\"${extra}>` +\n    (bg === 'transparent'\n      ? ''\n      : `<rect width=\"${total}\" height=\"${total}\" fill=\"${escapeXmlAttribute(bg)}\"/>`) +\n    `<g transform=\"translate(${quietZone} ${quietZone})\">` +\n    `<path d=\"${path}\" fill=\"${escapeXmlAttribute(fg)}\"/>` +\n    `</g></svg>`\n  );\n}\n\nfunction toSafeUint(value: unknown, fallback: number): number {\n  const n = Number(value);\n  return Number.isFinite(n) && n >= 0 ? Math.floor(n) : fallback;\n}\n\nfunction escapeXmlAttribute(value: string): string {\n  return value.replace(/[&<>\"']/g, (c) => {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;';\n      case \"'\":\n        return '&apos;';\n    }\n    return c;\n  });\n}\n\nexport { escapeXmlAttribute };\n","/** Sub-path entry — direct re-export of the SVG renderer source. */\nexport * from '../../render/src/index.js';\n"],"names":["COLOR_LOGOS","PromptPay1","PromptPay1_silhouette","PromptPay2","SILHOUETTE_LOGOS","Thai_QR_Payment_Logo_01","Thai_QR_Payment_Logo_01_silhouette","_generated","DEFAULT_LOGOS","colorLogo","silhouetteLogo","name","formatAmount","value","options","baht","Number","TypeError","RangeError","cents","Math","baht10","sub","buildBOTBarcode","input","PAYLOAD_PREFIX","normaliseBillerId","ensureRef","formatAmountField","parseBOTBarcode","barcode","parts","billerId","ref1","ref2","amountField","result","amount","decodeAmountField","raw","satang","field","i","code","ThaiQRPaymentBuilder","Map","_tags","recipient","type","_recipient","bankCode","accountNo","otaCode","aid","template","_tlv","mobileNo","digits","wireMobile","undefined","formatted","_amount","mode","info","fields","Object","method","pairs","body","additional","_message","sorted","tag","a","b","seed","_crc","payload","text","out","Uint8Array","checksum","CRC_TABLE","table","Uint16Array","byte","acc","bit","_builder","_barcode","_slipverify","_parser","payloadFor","opts","encodePersonalMessage","message","decodePersonalMessage","hex","SyntaxError","unit","String","parsePayload","fromMobileWire","wire","trimmed","fromTrueMoneyWire","parsePromptPayTemplate","guid","isOta","ota","bankAccount","mobile","nationalId","eWallet","parseTrueMoneyTemplate","wireValue","parseBillPaymentTemplate","crossBorder","parseAdditionalDataTemplate","parseVatTqrcTemplate","sellerTaxBranchId","vatAmount","vatRate","extractCrc","strict","fullCrc","fullSeed","expected","Error","dropped","candidateEnd","candidateSeed","wireCrc","padded","vatTqrc","canonical","crc","rawTags","root","promptpayTemplate","billPaymentTemplate","merchant","trueMoneyWithMessage","messageHex","amountText","vatTemplate","decoded","id","subId","parent","normaliseBankAccount","normaliseRecipient","stripNonDigits","toMobileWire","explicit","codeDigits","accountDigits","buildSlipVerify","buildTrueMoneySlipVerify","parseSlipVerify","parseTrueMoneySlipVerify","SLIP_VERIFY_API_TYPE","CRC_HEADER","TAG_CRC","inner","repaired","repairCrcEnvelope","sendingBank","transRef","eventType","transactionId","date","caseSensitive","headerIdx","seedEnd","tail","normalised","COUNTRY_TH","CURRENCY_THB","GUID_BILL_PAYMENT","GUID_BILL_PAYMENT_CROSS_BORDER","GUID_PROMPTPAY","GUID_PROMPTPAY_OTA","PAYLOAD_FORMAT_VERSION","POI_DYNAMIC","POI_STATIC","SUB_ADD_BILL_NUMBER","SUB_ADD_CONSUMER_DATA_REQUEST","SUB_ADD_CUSTOMER_LABEL","SUB_ADD_LOYALTY_NUMBER","SUB_ADD_MOBILE_NUMBER","SUB_ADD_PURPOSE_OF_TRANSACTION","SUB_ADD_REFERENCE_LABEL","SUB_ADD_STORE_LABEL","SUB_ADD_TERMINAL_LABEL","SUB_BILL_BILLER_ID","SUB_BILL_REFERENCE_1","SUB_BILL_REFERENCE_2","SUB_GUID","SUB_PROMPTPAY_BANK_ACCOUNT","SUB_PROMPTPAY_EWALLET","SUB_PROMPTPAY_MOBILE","SUB_PROMPTPAY_NATIONAL_ID","SUB_PROMPTPAY_OTA","SUB_TRUE_MONEY","SUB_VAT_AMOUNT","SUB_VAT_RATE","SUB_VAT_SELLER_TAX_BRANCH_ID","TAG_ADDITIONAL_DATA","TAG_CHECKSUM","TAG_COUNTRY_CODE","TAG_LANGUAGE_TEMPLATE","TAG_MERCHANT_ACCOUNT_BILL_PAYMENT","TAG_MERCHANT_ACCOUNT_KSHOP","TAG_MERCHANT_ACCOUNT_PROMPTPAY","TAG_MERCHANT_CATEGORY_CODE","TAG_MERCHANT_CITY","TAG_MERCHANT_NAME","TAG_PAYLOAD_FORMAT","TAG_PERSONAL_MESSAGE","TAG_POINT_OF_INITIATION","TAG_POSTAL_CODE","TAG_TIP_FIXED","TAG_TIP_OR_CONVENIENCE_INDICATOR","TAG_TIP_PERCENTAGE","TAG_TRANSACTION_AMOUNT","TAG_TRANSACTION_CURRENCY","TAG_VAT_TQRC","TIP_FIXED","TIP_PERCENTAGE","TIP_PROMPT","TRUE_MONEY_PREFIX","encodeField","length","encodeFields","iterateFields","cursor","lengthText","valueStart","valueEnd","parseFields","map","BitBuffer","initialCapacityBits","count","byteIdx","bitIdx","current","byteCount","neededBits","neededBytes","nextSize","expanded","encodeQR","padToCapacity","bits","dataCodewords","terminator","target","bytes","partial","toggle","buildCodewordBlocks","spec","data","dataBlocks","ecBlocks","offset","perBlock","block","_rs","interleave","maxDataLen","maxEcLen","pickVersion","ecc","min","max","version","needBits","_mode","_version","minVersion","maxVersion","_bitbuffer","codewords","finalBytes","REMAINDER_BITS","base","_patterns","_placement","snapshot","bestMask","bestScore","mask","_mask","score","encodeFormatBits","encodeVersionBits","FORMAT_GENERATOR","bch","VERSION_GENERATOR","EXP","LOG","mul","x","_encoder","MASK_COUNT","applyMask","scoreMask","MASK_PREDICATES","y","_x","matrix","maskIndex","predicate","penaltyRunLength","total","dim","runColor","runLen","c","penaltyBlocks","penaltyFinderLike","pattern1","pattern2","matches","line","hits","ok1","ok2","j","row","col","penaltyBalance","dark","off","ratio","DARK","FREE","LIGHT","Matrix","RESERVED","rows","Array","MODE_INDICATOR","charCountBits","dataBitLength","detectMode","emitSegment","ALPHANUMERIC_CHARS","ALPHANUMERIC_INDEX","DIGITS_RE","ALPHANUM_RE","header","full","remainder","utf8Length","TextEncoder","emitNumeric","triple","emitAlphanumeric","high","low","emitByte","encoded","utf8EncodeFallback","buildBaseMatrix","placeFinder","m","originX","originY","dy","dx","onEdge","insideCore","placeAlignment","cx","cy","placeTimingPatterns","placeDarkModule","reserveFormatInfo","reserveVersionInfo","_matrix","onTopLeftFinder","onTopRightFinder","onBottomLeftFinder","placeData","placeFormatInfo","placeVersionInfo","bitIndex","upward","right","v","bitOffset","_formatinfo","encodeBlock","buildGenerator","ecLen","poly","next","alphaI","_gf","coeff","carry","generator","buffer","lead","leadLog","slot","ECC_BITS","alignmentCentres","getBlockSpec","moduleCount","totalCodewords","ECC_INDEX","ECC_TABLE","entry","ecPerBlock","groups","dataPerBlock","blocks","last","step","centres","pos","renderCard","QR_BAND","QR_FRAME","unwrapSvg","svg","viewBoxMatch","viewBox","widthMatch","heightMatch","defineSymbol","viewBoxOverride","_matrixsvg","SILHOUETTE_LOOKUP","_assets","pickHeaderLogo","theme","override","pickPromptpayLogo","bg","accent","qrColor","headerSvg","promptpaySvg","overlay","matrixPath","modulePx","qrTransform","overlayHeight","overlayWidth","overlayX","overlayY","overlayMarkup","OVERLAY_PAD","showCaption","labelBaseY","merchantText","CANVAS","amountY","_card","renderThaiQRPayment","renderThaiQRPaymentMatrix","_payload","_qr","matrixToPath","segments","runEnd","renderQRSvg","quietZone","toSafeUint","fg","size","path","extra","k","escapeXmlAttribute","fallback","n"],"mappings":"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"}