@feliperohdee/satori 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/yoga-layout/dist/binaries/yoga-wasm-base64-esm.js","../node_modules/yoga-layout/src/generated/YGEnums.ts","../node_modules/yoga-layout/src/wrapAssembly.ts","../node_modules/yoga-layout/src/load.ts","../src/yoga.external.ts","../src/yoga.bundled.ts","../src/utils.ts","../src/vendor/parse-css-dimension/index.js","../src/yoga.ts","../src/handler/image.ts","../src/handler/preprocess.ts","../src/handler/presets.ts","../src/handler/inheritable.ts","../src/handler/expand.ts","../src/transform-origin.ts","../src/parser/mask.ts","../src/handler/variables.ts","../src/handler/compute.ts","../src/builder/text.ts","../src/builder/transform.ts","../src/builder/shadow.ts","../src/builder/text-decoration.ts","../src/text/characters.ts","../src/text/measurer.ts","../src/text/processor.ts","../src/text/index.ts","../src/builder/gradient/linear.ts","../src/builder/gradient/utils.ts","../src/builder/gradient/radial.ts","../src/builder/background-image.ts","../src/builder/border-radius.ts","../src/builder/border.ts","../src/builder/content-mask.ts","../src/parser/shape.ts","../src/builder/clip-path.ts","../src/builder/overflow.ts","../src/builder/mask-image.ts","../src/builder/rect.ts","../src/builder/backdrop-filter.ts","../node_modules/emoji-regex-xs/index.mjs","../src/language.ts","../src/layout.ts","../src/font.ts","../src/builder/svg.ts","../src/satori.ts"],"sourcesContent":["\nvar loadYoga = (() => {\n var _scriptDir = import.meta.url;\n \n return (\nfunction(loadYoga) {\n loadYoga = loadYoga || {};\n\n\nvar h;h||(h=typeof loadYoga !== 'undefined' ? loadYoga : {});var aa,ca;h.ready=new Promise(function(a,b){aa=a;ca=b});var da=Object.assign({},h),q=\"\";\"undefined\"!=typeof document&&document.currentScript&&(q=document.currentScript.src);_scriptDir&&(q=_scriptDir);0!==q.indexOf(\"blob:\")?q=q.substr(0,q.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1):q=\"\";var ea=h.print||console.log.bind(console),v=h.printErr||console.warn.bind(console);Object.assign(h,da);da=null;var w;h.wasmBinary&&(w=h.wasmBinary);\nvar noExitRuntime=h.noExitRuntime||!0;\"object\"!=typeof WebAssembly&&x(\"no native wasm support detected\");var fa,ha=!1;function z(a,b,c){c=b+c;for(var d=\"\";!(b>=c);){var e=a[b++];if(!e)break;if(e&128){var f=a[b++]&63;if(192==(e&224))d+=String.fromCharCode((e&31)<<6|f);else{var g=a[b++]&63;e=224==(e&240)?(e&15)<<12|f<<6|g:(e&7)<<18|f<<12|g<<6|a[b++]&63;65536>e?d+=String.fromCharCode(e):(e-=65536,d+=String.fromCharCode(55296|e>>10,56320|e&1023))}}else d+=String.fromCharCode(e)}return d}\nvar ia,ja,A,C,ka,D,E,la,ma;function na(){var a=fa.buffer;ia=a;h.HEAP8=ja=new Int8Array(a);h.HEAP16=C=new Int16Array(a);h.HEAP32=D=new Int32Array(a);h.HEAPU8=A=new Uint8Array(a);h.HEAPU16=ka=new Uint16Array(a);h.HEAPU32=E=new Uint32Array(a);h.HEAPF32=la=new Float32Array(a);h.HEAPF64=ma=new Float64Array(a)}var oa,pa=[],qa=[],ra=[];function sa(){var a=h.preRun.shift();pa.unshift(a)}var F=0,ta=null,G=null;\nfunction x(a){if(h.onAbort)h.onAbort(a);a=\"Aborted(\"+a+\")\";v(a);ha=!0;a=new WebAssembly.RuntimeError(a+\". Build with -sASSERTIONS for more info.\");ca(a);throw a;}function ua(a){return a.startsWith(\"data:application/octet-stream;base64,\")}var H;H=\"data:application/octet-stream;base64,AGFzbQEAAAABugM3YAF/AGACf38AYAF/AX9gA39/fwBgAn98AGACf38Bf2ADf39/AX9gBH9/f30BfWADf398AGAAAGAEf39/fwBgAX8BfGACf38BfGAFf39/f38Bf2AAAX9gA39/fwF9YAZ/f31/fX8AYAV/f39/fwBgAn9/AX1gBX9/f319AX1gAX8BfWADf35/AX5gB39/f39/f38AYAZ/f39/f38AYAR/f39/AX9gBn9/f319fQF9YAR/f31/AGADf399AX1gBn98f39/fwF/YAR/fHx/AGACf30AYAh/f39/f39/fwBgDX9/f39/f39/f39/f38AYAp/f39/f39/f39/AGAFf39/f38BfGAEfHx/fwF9YA1/fX1/f399fX9/f39/AX9gB39/f319f38AYAJ+fwF/YAN/fX0BfWABfAF8YAN/fHwAYAR/f319AGAHf39/fX19fQF9YA1/fX99f31/fX19fX1/AX9gC39/f39/f399fX19AX9gCH9/f39/f319AGAEf39+fgBgB39/f39/f38Bf2ACfH8BfGAFf398fH8AYAN/f38BfGAEf39/fABgA39/fQBgBn9/fX99fwF/ArUBHgFhAWEAHwFhAWIAAwFhAWMACQFhAWQAFgFhAWUAEQFhAWYAIAFhAWcAAAFhAWgAIQFhAWkAAwFhAWoAAAFhAWsAFwFhAWwACgFhAW0ABQFhAW4AAwFhAW8AAQFhAXAAFwFhAXEABgFhAXIAAAFhAXMAIgFhAXQACgFhAXUADQFhAXYAFgFhAXcAAgFhAXgAAwFhAXkAGAFhAXoAAgFhAUEAAQFhAUIAEQFhAUMAAQFhAUQAAAOiAqACAgMSBwcACRkDAAoRBgYKEwAPDxMBBiMTCgcHGgMUASQFJRQHAwMKCgMmAQYYDxobFAAKBw8KBwMDAgkCAAAFGwACBwIHBgIDAQMIDAABKAkHBQURACkZASoAAAIrLAIALQcHBy4HLwkFCgMCMA0xAgMJAgACAQYKAQIBBQEACQIFAQEABQAODQ0GFQIBHBUGAgkCEAAAAAUyDzMMBQYINAUCAwUODg41AgMCAgIDBgICNgIBDAwMAQsLCwsLCx0CAAIAAAABABABBQICAQMCEgMMCwEBAQEBAQsLAQICAwICAgICAgIDAgIICAEICAgEBAQEBAQEBAQABAQABAQEBAAE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GiABQQA2AvADIAFCADcC6AMgAigC7AMiAyACKALoAyIERwRAIAMgBGsiBEEASA0FIAEgBBAeIgM2AuwDIAEgAzYC6AMgASADIARqNgLwAyACKALoAyIEIAIoAuwDIghHBEADQCADIAQoAgA2AgAgA0EEaiEDIARBBGoiBCAIRw0ACwsgASADNgLsAwsgASACKQL0AzcC9AMgASACKAKEBDYChAQgASACKQL8AzcC/AMgAUEANgLkAwsgBSABNgIAIAEgADYC5AMLIAZBAWohBiAFQQRqIgUgB0cNAAsLDwsQAgALUAACQAJAAkACQAJAIAIOBAQAAQIDCyAAIAEgAUEwahBDDwsgACABIAFBMGogAxBEDwsgACABIAFBMGoQQg8LECQACyAAIAEgAUEwaiADEEULcAIBfwF9IwBBEGsiBCQAIARBCGogACABQQJ0QdwlaigCACACEDZDAADAfyEFAkACQAJAIAQtAAxBAWsOAgABAgsgBCoCCCEFDAELIAQqAgggA5RDCtcjPJQhBQsgBEEQaiQAIAVDAAAAACAFIAVbGwt5AgF/AX0jAEEQayIDJAAgA0EIaiAAIAFBAnRB7CVqKAIAIAIQU0MAAMB/IQQCQAJAAkAgAy0ADEEBaw4CAAECCyADKgIIIQQMAQsgAyoCCEMAAAAAlEMK1yM8lCEECyADQRBqJAAgBEMAAAAAl0MAAAAAIAQgBFsbC1QAAkACQAJAAkACQCACDgQEAAECAwsgACABIAFBwgBqEEMPCyAAIAEgAUHCAGogAxBEDwsgACABIAFBwgBqEEIPCxAkAAsgACABIAFBwgBqIAMQRQsvACAAIAJFQQF0IgIgASADEGAgACACIAEQS5IgACACIAEgAxB/IAAgAiABEFKSkgvOAQIDfwJ9IwBBEGsiAyQAQQEhBCADQQhqIABB/ABqIgUgACABQQF0akH2AGoiAS8BABAfAkACQCADKgIIIgcgAioCACIGXARAIAcgB1sEQCACLQAEIQIMAgsgBiAGXCEECyACLQAEIQIgBEUNACADLQAMIAJB/wFxRg0BCyAFIAEgBiACEDkDQCAALQAAIgFBBHENASAAIAFBBHI6AAAgACgCECIBBEAgACABEQAACyAAQYCAgP4HNgKcASAAKALkAyIADQALCyADQRBqJAALzgECA38CfSMAQRBrIgMk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AWsOAgABAgsgBCoCCCEFDAELIAQqAgggA5RDCtcjPJQhBQsgBEEQaiQAIAVDAAAAACAFIAVbGwscACAAIAFBCCACpyACQiCIpyADpyADQiCIpxAVCwUAEFgACzkAIABFBEBBAA8LAn8gAUGAf3FBgL8DRiABQf8ATXJFBEBB/DtBGTYCAEF/DAELIAAgAToAAEEBCwvEAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABQQlrDhIACgsMCgsCAwQFDAsMDAoLBwgJCyACIAIoAgAiAUEEajYCACAAIAEoAgA2AgAPCwALIAIgAigCACIBQQRqNgIAIAAgATIBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATMBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATAAADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATEAADcDAA8LAAsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRAQALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC84BAgN/An0jAEEQayIDJABBASEEIANBCGogAEH8AGoiBSAAIAFBAXRqQegAaiIBLwEAEB8CQAJAIAMqAggiByACKgIAIgZcBEAgByAHWwRAIAItAAQhAgwCCyAGIAZcIQQLIAItAAQhAiAERQ0AIAMtAAwgAkH/AXFGDQELIAUgASAGIAIQOQNAIAAtAAAiAUEEcQ0BIAAgAUEEcjoAACAAKAIQIgEEQCAAIAERAAALIABBgICA/gc2ApwBIAAoAuQDIgANAAsLIANBEGokAAtdAQR/IAAoAgAhAgNAIAIsAAAiAxBXBEBBfyEEIAAgAkEBaiICNgIAIAFBzJmz5gBNBH9BfyADQTBrIgMgAUEKbCIEaiADIARB/////wdzShsFIAQLIQEMAQsLIAELrhQCEn8BfiMAQdAAayIIJAAgCCABNgJMIAhBN2ohFyAIQThqIRQCQAJAAkACQANAIAEhDSAHIA5B/////wdzSg0BIAcgDmohDgJAAkACQCANIgctAAAiCQRAA0ACQAJAIAlB/wFxIgFFBEAgByEBDAELIAFBJUcNASAH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IQEgAEIANwIEIAAgATYCACABIAA2AgQgAkEQaiQAIAALGwEBfyAABEAgACgCACIBBEAgARAjCyAAECMLC0kBAn9BBBAeIQFBIBAeIgBBADYCHCAAQoCAgICAgIDAPzcCFCAAQgA3AgwgAEEAOgAIIABBAzYCBCAAQQA2AgAgASAANgIAIAELIAAgAkEFR0EAIAIbRQRAQbgwIAMgBBBJDwsgAyAEEHALIgEBfiABIAKtIAOtQiCGhCAEIAARFQAiBUIgiKckASAFpwuoAQEFfyAAKAJUIgMoAgAhBSADKAIEIgQgACgCFCAAKAIcIgdrIgYgBCAGSRsiBgRAIAUgByAGECsaIAMgAygCACAGaiIFNgIAIAMgAygCBCAGayIENgIECyAEIAIgAiAESxsiBARAIAUgASAEECsaIAMgAygCACAEaiIFNgIAIAMgAygCBCAEazYCBAsgBUEAOgAAIAAgACgCLCIBNgIcIAAgATYCFCACCwQAQgALBABBAAuKBQIGfgJ/IAEgASgCAEEHakF4cSIBQRBqNgIAIAAhCSABKQMAIQMgASkDCCEGIwBBIGsiCCQAAkAgBkL///////////8AgyIEQoCAgICAgMCAPH0gBEKAgICAgIDA/8MAfVQEQCAGQgSGIANCPIiEIQQgA0L//////////w+DIgNCgYCAgICAgIAIWgRAIARCgYCAgICAgIDAAHwhAgwCCyAEQoCAgICAgICAQH0hAiADQoCAgICAgICACFINASACIARCAYN8IQIMAQsgA1AgBEKAgICAgIDA//8AVCAEQoCAgICAgMD//wBRG0UEQCAGQgSGIANCPIiEQv////////8Dg0KAgICAgICA/P8AhCECDAELQoCAgICAgID4/wAhAiAEQv///////7//wwBWDQBCACECIARCMIinIgBBkfcASQ0AIAMhAiAGQv///////z+DQoCAgICAgMAAhCIFIQcCQCAAQYH3AGsiAUHAAHEEQCACIAFBQGqthiEHQgAhAgwBCyABRQ0AIAcgAa0iBIYgAkHAACABa62IhCEHIAIgBIYhAgsgCCACNwMQIAggBzcDGAJAQYH4ACAAayIAQcAAcQRAIAUgAEFAaq2IIQNCACEFDAELIABFDQAgBUHAACAAa62GIAMgAK0iAoiEIQMgBSACiCEFCyAIIAM3AwAgCCAF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ASAAKAIAIQAgASACQQFxBH8gASgCACAAaigCAAUgAAsRCwALYQECfyMAQRBrIgIkACABIAAoAgQiA0EBdWohASAAKAIAIQAgAiABIANBAXEEfyABKAIAIABqKAIABSAACxEBAEEQEB4iACACKQMINwMIIAAgAikDADcDACACQRBqJAAgAAtjAQJ/IwBBEGsiAyQAIAEgACgCBCIEQQF1aiEBIAAoAgAhACADIAEgAiAEQQFxBH8gASgCACAAaigCAAUgAAsRAwBBEBAeIgAgAykDCDcDCCAAIAMpAwA3AwAgA0EQaiQAIAALNwEBfyABIAAoAgQiA0EBdWohASAAKAIAIQAgASACIANBAXEEfyABKAIAIABqKAIABSAACxEEAAs5AQF/IAEgACgCBCIEQQF1aiEBIAAoAgAhACABIAIgAyAEQQFxBH8gASgCACAAaigCAAUgAAsRCAALCQAgASAAEQIACwUAQcM7Cw8AIAEgACgCAGogAjYCAAsNACABIAAoAgBqKAIACxgBAX9BEBAeIgBCADcDCCAAQQA2AgAgAAsYAQF/QRAQHiIAQgA3AwAgAEIANwMIIAALDABBMBAeQQBBMBAqCzcBAX8gASAAKAIEIgNBAXVqIQEgACgCACEAIAEgAiADQQFxBH8gASgCACAAaigCAAUgAAsRHgALBQBBvjsLIQAgACABKAIAIAEgASwAC0EASBtBuzsgAigCABAQNgIACyoBAX9BDBAeIgFBADoABCABIAAoAgA2AgggAEEANgIAIAFB2Cc2AgAgAQsFAEG7OwsFAEG4OwshACAAIAEoAgAgASABLAALQQBIG0GkOyACKAIAEBA2AgAL2AEBBH8jAEEgayIDJAAgASgCACIEQfD///8HSQRAAkACQCAEQQtPBEAgBEEPckEBaiIFEB4hBiADIAVBgICAgHhyNgIQIAMgBjYCCCADIAQ2AgwgBCAGaiEFDAELIAMgBDoAEyADQQhqIgYgBGohBSAERQ0BCyAGIAFBBGogBBArGgsgBUEAOgAAIAMgAjYCACADQRhqIANBCGogAyAAEQMAIAMoAhgQHSADKAIYIgAQBiADKAIAEAYgAywAE0EASARAIAMoAggQIwsgA0EgaiQAIAAPCxACAAsqAQF/QQwQHiIBQQA6AAQgASAAKAIANgIIIABBADYCACABQeAmNgIA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AkEIaiAIIAYQHyACIAcgAC8AABAfQQEhAyACKgIIIgogAioCACILXAR/IAogClsNAyALIAtcBSADC0UNAiACLQAMIAItAARHDQILIABBAmohAEEBIQMgBCEGQQEhBCAGRQ0ACyABLwB6IgBBB3FFBEAgBS0AekEHcUUNAgsgCCAAECAiCiAHIAUvAHoQICILWw0BIAogClsNACALIAtcDQELIAFBFGogBUEUakHoABArGiABQfwAaiAFQfwAahCgAQNAIAEtAAAiAEEEcQ0BIAEgAEEEcjoAACABKAIQIgAEQCABIAARAAALIAFBgICA/gc2ApwBIAEoAuQDIgENAAsLIAJBEGokAAvGAwEEfyMAQaAEayICJAAgACgCBCEBIABBADYCBCABBEAgASABKAIAKAIEEQAACyAAKAIIIQEgAEEANgIIIAEEQCABIAEoAgAoAgQRAAALAkAgACgCACIAKALoAyAAKALsA0YEQCAAKALkAw0BIAAgAkEYaiAAKAL0AxBcIgEpAgA3AgAgACABKAIQNgIQIAAgASkCCDcCCCAAQRRqIAFBFGpB6AAQKxogACABKQKMATcCjAEgACABKQKEATcChAEgACABKQJ8NwJ8IAEoApQBIQQgAUEANgKUASAAKAKUASEDIAAgBDYClAEgAwRAIAMQWwsgAEGYAWogAUGYAWpB0AIQKxogACgC6AMiAwRAIAAgAzYC7AMgAxAjCyAAIAEoAugDNgLoAyAAIAEoAuwDNgLsAyAAIAEoAvADNgLwAyABQQA2AvADIAFCADcC6AMgACABKQL8AzcC/AMgACABKQL0AzcC9AMgACABKAKEBDYChAQgASgClAEhACABQQA2ApQBIAAEQCAAEFsLIAJBoARqJAAPCyACQfAcNgIQIABBBUHYJSACQRBqECwQJAALIAJB5hE2AgAgAEEFQdglIAIQLBAkAAsLAEEMEB4gABCiAQsLAEEMEB5BABCiAQsNACAAKAIALQAIQQFxCwoAIAAoAgAoAhQLGQAgAUH/AXEEQBACAAsgACgCACgCEEEBcQsYACAAKAIAIgAgAC0ACEH+AXEgAXI6AAgLJgAgASAAKAIAIgAoAhRHBEAgACABNgIUIAAgACgCDEEBajYCDAsLkgEBAn8jAEEQayICJAAgACgCACEAIAFDAAAAAGAEQCABIAAqAhhcBEAgACABOAIYIAAgACgCDEEBajYCDAsgAkEQaiQADwsgAkGIFDYCACMAQRBrIgMkACADIAI2AgwCQCAARQRAQbgwQdglIAIQSRoMAQsgAEEAQQVB2CUgAiAAKAIEEQ0AGgsgA0EQaiQAECQACz8AIAFB/wFxRQRAIAIgACgCACIAKAIQIgFBAXFHBEAgACABQX5xIAJyNgIQIAAgACgCDEEBajYCDAsPCxACAAsL4CYjAEGACAuBHk9ubHkgbGVhZiBub2RlcyB3aXRoIGN1c3RvbSBtZWFzdXJlIGZ1bmN0aW9ucyBzaG91bGQgbWFudWFsbHkgbWFyayB0aGVtc2VsdmVzIGFzIGRpcnR5AGlzRGlydHkAbWFya0RpcnR5AGRlc3Ryb3kAc2V0RGlzcGxheQBnZXREaXNwbGF5AHNldEZsZXgALSsgICAwWDB4AC0wWCswWCAwWC0weCsweCAweABzZXRGbGV4R3JvdwBnZXRGbGV4R3JvdwBzZXRPdmVyZmxvdwBnZXRPdmVyZmxvdwBoYXNOZXdMYXlvdXQAY2FsY3VsYXRlTGF5b3V0AGdldENvbXB1dGVkTGF5b3V0AHVuc2lnbmVkIHNob3J0AGdldENoaWxkQ291bnQAdW5zaWduZWQgaW50AHNldEp1c3RpZnlDb250ZW50AGdldEp1c3RpZnlDb250ZW50AGF2YWlsYWJsZUhlaWdodCBpcyBpbmRlZmluaXRlIHNvIGhlaWdodFNpemluZ01vZGUgbXVzdCBiZSBTaXppbmdNb2RlOjpNYXhDb250ZW50AGF2YWlsYWJsZVdpZHRoIGlzIGluZGVmaW5pdGUgc28gd2lkdGhTaXppbmdNb2RlIG11c3QgYmUgU2l6aW5nTW9kZTo6TWF4Q29udGVudABzZXRBbGlnbkNvbnRlbnQAZ2V0QWxpZ25Db250ZW50AGdldFBhcmVudABpbXBsZW1lbnQAc2V0TWF4SGVpZ2h0UGVyY2VudABzZXRIZWlnaHRQZXJjZW50AHNldE1pbkhlaWdodFBlcmNlbnQAc2V0RmxleEJhc2lzUGVyY2VudABzZXRHYXBQZXJjZW50AHNldFBvc2l0aW9uUGVyY2VudABzZXRNYXJnaW5QZXJjZW50AHNldE1heFdpZHRoUGVyY2VudABzZXRXaWR0aFBlcmNlbnQAc2V0TWluV2lkdGhQZXJjZW50AHNldFBhZGRpbmdQZXJjZW50AGhhbmRsZS50eXBlKCkgPT0gU3R5bGVWYWx1ZUhhbmRsZTo6VHlwZTo6UG9pbnQgfHwgaGFuZGxlLnR5cGUoKSA9PSBTdHlsZVZhbHVlSGFuZGxlOjpUeXBlOjpQZXJjZW50AGNyZWF0ZURlZmF1bHQAdW5pdAByaWdodABoZWlnaHQAc2V0TWF4SGVpZ2h0AGdldE1heEhlaWdodABzZXRIZWlnaHQAZ2V0SGVpZ2h0AHNldE1pbkhlaWdodABnZXRNaW5IZWlnaHQAZ2V0Q29tcHV0ZWRIZWlnaHQAZ2V0Q29tcHV0ZWRSaWdodABsZWZ0AGdldENvbXB1dGVkTGVmdAByZXNldABfX2Rlc3RydWN0AGZsb2F0AHVpbnQ2NF90AHVzZVdlYkRlZmF1bHRzAHNldFVzZVdlYkRlZmF1bHRzAHNldEFsaWduSXRlbXMAZ2V0QWxpZ25JdGVtcwBzZXRGbGV4QmFzaXMAZ2V0RmxleEJhc2lzAENhbm5vdCBnZXQgbGF5b3V0IHByb3BlcnRpZXMgb2YgbXVsdGktZWRnZSBzaG9ydGhhbmRzAHNldFBvaW50U2NhbGVGYWN0b3IATWVhc3VyZUNhbGxiYWNrV3JhcHBlcgBEaXJ0aWVkQ2FsbGJhY2tXcmFwcGVyAENhbm5vdCByZXNldCBhIG5vZGUgc3RpbGwgYXR0YWNoZWQgdG8gYSBvd25lcgBzZXRCb3JkZXIAZ2V0Qm9yZGVyAGdldENvbXB1dGVkQm9yZGVyAGdldE51bWJlcgBoYW5kbGUudHlwZSgpID09IFN0eWxlVmFsdWVIYW5kbGU6OlR5cGU6Ok51bWJlcgB1bnNpZ25lZCBjaGFyAHRvcABnZXRDb21wdXRlZFRvcABzZXRGbGV4V3JhcABnZXRGbGV4V3JhcABzZXRHYXAAZ2V0R2FwACVwAHNldEhlaWdodEF1dG8Ac2V0RmxleEJhc2lzQXV0bwBzZXRQb3NpdGlvbkF1dG8Ac2V0TWFyZ2luQXV0bwBzZXRXaWR0aEF1dG8AU2NhbGUgZmFjdG9yIHNob3VsZCBub3QgYmUgbGVzcyB0aGFuIHplcm8Ac2V0QXNwZWN0UmF0aW8AZ2V0QXNwZWN0UmF0aW8Ac2V0UG9zaXRpb24AZ2V0UG9zaXRpb24Abm90aWZ5T25EZXN0cnVjdGlvbgBzZXRGbGV4RGlyZWN0aW9uAGdldEZsZXhEaXJlY3Rpb24Ac2V0RGlyZWN0aW9uAGdldERpcmVjdGlvbgBzZXRNYXJnaW4AZ2V0TWFyZ2luAGdldENvbXB1dGVkTWFyZ2luAG1hcmtMYXlvdXRTZWVuAG5hbgBib3R0b20AZ2V0Q29tcHV0ZWRCb3R0b20AYm9vbABlbXNjcmlwdGVuOjp2YWwAc2V0RmxleFNocmluawBnZXRGbGV4U2hyaW5rAHNldEFsd2F5c0Zvcm1zQ29udGFpbmluZ0Jsb2NrAE1lYXN1cmVDYWxsYmFjawBEaXJ0aWVkQ2FsbGJhY2sAZ2V0TGVuZ3RoAHdpZHRoAHNldE1heFdpZHRoAGdldE1heFdpZHRoAHNldFdpZHRoAGdldFdpZHRoAHNldE1pbldpZHRoAGdldE1pbldpZHRoAGdldENvbXB1dGVkV2lkdGgAcHVzaAAvaG9tZS9ydW5uZXIvd29yay95b2dhL3lvZ2EvamF2YXNjcmlwdC8uLi95b2dhL3N0eWxlL1NtYWxsVmFsdWVCdWZmZXIuaAAvaG9tZS9ydW5uZXIvd29yay95b2dhL3lvZ2EvamF2YXNjcmlwdC8uLi95b2dhL3N0eWxlL1N0eWxlVmFsdWVQb29sLmgAdW5zaWduZWQgbG9uZwBzZXRCb3hTaXppbmcAZ2V0Qm94U2l6aW5nAHN0ZDo6d3N0cmluZwBzdGQ6OnN0cmluZwBzdGQ6OnUxNnN0cmluZwBzdGQ6OnUzMnN0cmluZwBzZXRQYWRkaW5nAGdldFBhZGRpbmcAZ2V0Q29tcHV0ZWRQYWRkaW5nAFRyaWVkIHRvIGNvbnN0cnVjdCBZR05vZGUgd2l0aCBudWxsIGNvbmZpZwBBdHRlbXB0aW5nIHRvIGNvbnN0cnVjdCBOb2RlIHdpdGggbnVsbCBjb25maWcAY3JlYXRlV2l0aENvbmZpZwBpbmYAc2V0QWxpZ25TZWxmAGdldEFsaWduU2VsZgBTaXplAHZhbHVlAFZhbHVlAGNyZWF0ZQBtZWFzdXJlAHNldFBvc2l0aW9uVHlwZQBnZXRQb3NpdGlvblR5cGUAaXNSZWZlcmVuY2VCYXNlbGluZQBzZXRJc1JlZmVyZW5jZUJhc2VsaW5lAGNvcHlTdHlsZQBkb3VibGUATm9kZQBleHRlbmQAaW5zZXJ0Q2hpbGQAZ2V0Q2hpbGQAcmVtb3ZlQ2hpbGQAdm9pZABzZXRFeHBlcmltZW50YWxGZWF0dXJlRW5hYmxlZABpc0V4cGVyaW1lbnRhbEZlYXR1cmVFbmFibGVkAGRpcnRpZWQAQ2Fubm90IHJlc2V0IGEgbm9kZSB3aGljaCBzdGlsbCBoYXMgY2hpbGRyZW4gYXR0YWNoZWQAdW5zZXRNZWFzdXJlRnVuYwB1bnNldERpcnRpZWRGdW5jAHNldEVycmF0YQBnZXRFcnJhdGEATWVhc3VyZSBmdW5jdGlvbiByZXR1cm5lZCBhbiBpbnZhbGlkIGRpbWVuc2lvbiB0byBZb2dhOiBbd2lkdGg9JWYsIGhlaWdodD0lZl0ARXhwZWN0IGN1c3RvbSBiYXNlbGluZSBmdW5jdGlvbiB0byBub3QgcmV0dXJuIE5hTgBOQU4ASU5GAGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHNob3J0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBzaG9ydD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBpbnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGZsb2F0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50OF90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQ4X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQxNl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQxNl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8Y2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgY2hhcj4Ac3RkOjpiYXNpY19zdHJpbmc8dW5zaWduZWQgY2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8c2lnbmVk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\";if(!ua(H)){var va=H;H=h.locateFile?h.locateFile(va,q):q+va}\nfunction wa(){var a=H;try{if(a==H&&w)return new Uint8Array(w);if(ua(a))try{var b=xa(a.slice(37)),c=new Uint8Array(b.length);for(a=0;a<b.length;++a)c[a]=b.charCodeAt(a);var d=c}catch(f){throw Error(\"Converting base64 string to bytes failed.\");}else d=void 0;var e=d;if(e)return e;throw\"both async and sync fetching of the wasm failed\";}catch(f){x(f)}}\nfunction ya(){return w||\"function\"!=typeof fetch?Promise.resolve().then(function(){return wa()}):fetch(H,{credentials:\"same-origin\"}).then(function(a){if(!a.ok)throw\"failed to load wasm binary file at '\"+H+\"'\";return a.arrayBuffer()}).catch(function(){return wa()})}function za(a){for(;0<a.length;)a.shift()(h)}function Aa(a){if(void 0===a)return\"_unknown\";a=a.replace(/[^a-zA-Z0-9_]/g,\"$\");var b=a.charCodeAt(0);return 48<=b&&57>=b?\"_\"+a:a}\nfunction Ba(a,b){a=Aa(a);return function(){return b.apply(this,arguments)}}var J=[{},{value:void 0},{value:null},{value:!0},{value:!1}],Ca=[];function Da(a){var b=Error,c=Ba(a,function(d){this.name=a;this.message=d;d=Error(d).stack;void 0!==d&&(this.stack=this.toString()+\"\\n\"+d.replace(/^Error(:[^\\n]*)?\\n/,\"\"))});c.prototype=Object.create(b.prototype);c.prototype.constructor=c;c.prototype.toString=function(){return void 0===this.message?this.name:this.name+\": \"+this.message};return c}var K=void 0;\nfunction L(a){throw new K(a);}var M=a=>{a||L(\"Cannot use deleted val. handle = \"+a);return J[a].value},Ea=a=>{switch(a){case void 0:return 1;case null:return 2;case !0:return 3;case !1:return 4;default:var b=Ca.length?Ca.pop():J.length;J[b]={ga:1,value:a};return b}},Fa=void 0,Ga=void 0;function N(a){for(var b=\"\";A[a];)b+=Ga[A[a++]];return b}var O=[];function Ha(){for(;O.length;){var a=O.pop();a.M.$=!1;a[\"delete\"]()}}var P=void 0,Q={};\nfunction Ia(a,b){for(void 0===b&&L(\"ptr should not be undefined\");a.R;)b=a.ba(b),a=a.R;return b}var R={};function Ja(a){a=Ka(a);var b=N(a);S(a);return b}function La(a,b){var c=R[a];void 0===c&&L(b+\" has unknown type \"+Ja(a));return c}function Ma(){}var Na=!1;function Oa(a){--a.count.value;0===a.count.value&&(a.T?a.U.W(a.T):a.P.N.W(a.O))}function Pa(a,b,c){if(b===c)return a;if(void 0===c.R)return null;a=Pa(a,b,c.R);return null===a?null:c.na(a)}var Qa={};function Ra(a,b){b=Ia(a,b);return Q[b]}\nvar Sa=void 0;function Ta(a){throw new Sa(a);}function Ua(a,b){b.P&&b.O||Ta(\"makeClassHandle requires ptr and ptrType\");!!b.U!==!!b.T&&Ta(\"Both smartPtrType and smartPtr must be specified\");b.count={value:1};return T(Object.create(a,{M:{value:b}}))}function T(a){if(\"undefined\"===typeof FinalizationRegistry)return T=b=>b,a;Na=new FinalizationRegistry(b=>{Oa(b.M)});T=b=>{var c=b.M;c.T&&Na.register(b,{M:c},b);return b};Ma=b=>{Na.unregister(b)};return T(a)}var Va={};\nfunction Wa(a){for(;a.length;){var b=a.pop();a.pop()(b)}}function Xa(a){return this.fromWireType(D[a>>2])}var U={},Ya={};function V(a,b,c){function d(k){k=c(k);k.length!==a.length&&Ta(\"Mismatched type converter count\");for(var m=0;m<a.length;++m)W(a[m],k[m])}a.forEach(function(k){Ya[k]=b});var e=Array(b.length),f=[],g=0;b.forEach((k,m)=>{R.hasOwnProperty(k)?e[m]=R[k]:(f.push(k),U.hasOwnProperty(k)||(U[k]=[]),U[k].push(()=>{e[m]=R[k];++g;g===f.length&&d(e)}))});0===f.length&&d(e)}\nfunction Za(a){switch(a){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError(\"Unknown type size: \"+a);}}\nfunction W(a,b,c={}){if(!(\"argPackAdvance\"in b))throw new TypeError(\"registerType registeredInstance requires argPackAdvance\");var d=b.name;a||L('type \"'+d+'\" must have a positive integer typeid pointer');if(R.hasOwnProperty(a)){if(c.ua)return;L(\"Cannot register type '\"+d+\"' twice\")}R[a]=b;delete Ya[a];U.hasOwnProperty(a)&&(b=U[a],delete U[a],b.forEach(e=>e()))}function $a(a){L(a.M.P.N.name+\" instance already deleted\")}function X(){}\nfunction ab(a,b,c){if(void 0===a[b].S){var d=a[b];a[b]=function(){a[b].S.hasOwnProperty(arguments.length)||L(\"Function '\"+c+\"' called with an invalid number of arguments (\"+arguments.length+\") - expects one of (\"+a[b].S+\")!\");return a[b].S[arguments.length].apply(this,arguments)};a[b].S=[];a[b].S[d.Z]=d}}\nfunction bb(a,b){h.hasOwnProperty(a)?(L(\"Cannot register public name '\"+a+\"' twice\"),ab(h,a,a),h.hasOwnProperty(void 0)&&L(\"Cannot register multiple overloads of a function with the same number of arguments (undefined)!\"),h[a].S[void 0]=b):h[a]=b}function cb(a,b,c,d,e,f,g,k){this.name=a;this.constructor=b;this.X=c;this.W=d;this.R=e;this.pa=f;this.ba=g;this.na=k;this.ja=[]}\nfunction db(a,b,c){for(;b!==c;)b.ba||L(\"Expected null or instance of \"+c.name+\", got an instance of \"+b.name),a=b.ba(a),b=b.R;return a}function eb(a,b){if(null===b)return this.ea&&L(\"null is not a valid \"+this.name),0;b.M||L('Cannot pass \"'+fb(b)+'\" as a '+this.name);b.M.O||L(\"Cannot pass deleted object as a pointer of type \"+this.name);return db(b.M.O,b.M.P.N,this.N)}\nfunction gb(a,b){if(null===b){this.ea&&L(\"null is not a valid \"+this.name);if(this.da){var c=this.fa();null!==a&&a.push(this.W,c);return c}return 0}b.M||L('Cannot pass \"'+fb(b)+'\" as a '+this.name);b.M.O||L(\"Cannot pass deleted object as a pointer of type \"+this.name);!this.ca&&b.M.P.ca&&L(\"Cannot convert argument of type \"+(b.M.U?b.M.U.name:b.M.P.name)+\" to parameter type \"+this.name);c=db(b.M.O,b.M.P.N,this.N);if(this.da)switch(void 0===b.M.T&&L(\"Passing raw pointer to smart pointer is illegal\"),\nthis.Ba){case 0:b.M.U===this?c=b.M.T:L(\"Cannot convert argument of type \"+(b.M.U?b.M.U.name:b.M.P.name)+\" to parameter type \"+this.name);break;case 1:c=b.M.T;break;case 2:if(b.M.U===this)c=b.M.T;else{var d=b.clone();c=this.xa(c,Ea(function(){d[\"delete\"]()}));null!==a&&a.push(this.W,c)}break;default:L(\"Unsupporting sharing policy\")}return c}\nfunction hb(a,b){if(null===b)return this.ea&&L(\"null is not a valid \"+this.name),0;b.M||L('Cannot pass \"'+fb(b)+'\" as a '+this.name);b.M.O||L(\"Cannot pass deleted object as a pointer of type \"+this.name);b.M.P.ca&&L(\"Cannot convert argument of type \"+b.M.P.name+\" to parameter type \"+this.name);return db(b.M.O,b.M.P.N,this.N)}\nfunction Y(a,b,c,d){this.name=a;this.N=b;this.ea=c;this.ca=d;this.da=!1;this.W=this.xa=this.fa=this.ka=this.Ba=this.wa=void 0;void 0!==b.R?this.toWireType=gb:(this.toWireType=d?eb:hb,this.V=null)}function ib(a,b){h.hasOwnProperty(a)||Ta(\"Replacing nonexistant public symbol\");h[a]=b;h[a].Z=void 0}\nfunction jb(a,b){var c=[];return function(){c.length=0;Object.assign(c,arguments);if(a.includes(\"j\")){var d=h[\"dynCall_\"+a];d=c&&c.length?d.apply(null,[b].concat(c)):d.call(null,b)}else d=oa.get(b).apply(null,c);return d}}function Z(a,b){a=N(a);var c=a.includes(\"j\")?jb(a,b):oa.get(b);\"function\"!=typeof c&&L(\"unknown function pointer with signature \"+a+\": \"+b);return c}var mb=void 0;\nfunction nb(a,b){function c(f){e[f]||R[f]||(Ya[f]?Ya[f].forEach(c):(d.push(f),e[f]=!0))}var d=[],e={};b.forEach(c);throw new mb(a+\": \"+d.map(Ja).join([\", \"]));}\nfunction ob(a,b,c,d,e){var f=b.length;2>f&&L(\"argTypes array size mismatch! Must at least get return value and 'this' types!\");var g=null!==b[1]&&null!==c,k=!1;for(c=1;c<b.length;++c)if(null!==b[c]&&void 0===b[c].V){k=!0;break}var m=\"void\"!==b[0].name,l=f-2,n=Array(l),p=[],r=[];return function(){arguments.length!==l&&L(\"function \"+a+\" called with \"+arguments.length+\" arguments, expected \"+l+\" args!\");r.length=0;p.length=g?2:1;p[0]=e;if(g){var u=b[1].toWireType(r,this);p[1]=u}for(var t=0;t<l;++t)n[t]=\nb[t+2].toWireType(r,arguments[t]),p.push(n[t]);t=d.apply(null,p);if(k)Wa(r);else for(var y=g?1:2;y<b.length;y++){var B=1===y?u:n[y-2];null!==b[y].V&&b[y].V(B)}u=m?b[0].fromWireType(t):void 0;return u}}function pb(a,b){for(var c=[],d=0;d<a;d++)c.push(E[b+4*d>>2]);return c}function qb(a){4<a&&0===--J[a].ga&&(J[a]=void 0,Ca.push(a))}function fb(a){if(null===a)return\"null\";var b=typeof a;return\"object\"===b||\"array\"===b||\"function\"===b?a.toString():\"\"+a}\nfunction rb(a,b){switch(b){case 2:return function(c){return this.fromWireType(la[c>>2])};case 3:return function(c){return this.fromWireType(ma[c>>3])};default:throw new TypeError(\"Unknown float type: \"+a);}}\nfunction sb(a,b,c){switch(b){case 0:return c?function(d){return ja[d]}:function(d){return A[d]};case 1:return c?function(d){return C[d>>1]}:function(d){return ka[d>>1]};case 2:return c?function(d){return D[d>>2]}:function(d){return E[d>>2]};default:throw new TypeError(\"Unknown integer type: \"+a);}}function tb(a,b){for(var c=\"\",d=0;!(d>=b/2);++d){var e=C[a+2*d>>1];if(0==e)break;c+=String.fromCharCode(e)}return c}\nfunction ub(a,b,c){void 0===c&&(c=2147483647);if(2>c)return 0;c-=2;var d=b;c=c<2*a.length?c/2:a.length;for(var e=0;e<c;++e)C[b>>1]=a.charCodeAt(e),b+=2;C[b>>1]=0;return b-d}function vb(a){return 2*a.length}function wb(a,b){for(var c=0,d=\"\";!(c>=b/4);){var e=D[a+4*c>>2];if(0==e)break;++c;65536<=e?(e-=65536,d+=String.fromCharCode(55296|e>>10,56320|e&1023)):d+=String.fromCharCode(e)}return d}\nfunction xb(a,b,c){void 0===c&&(c=2147483647);if(4>c)return 0;var d=b;c=d+c-4;for(var e=0;e<a.length;++e){var f=a.charCodeAt(e);if(55296<=f&&57343>=f){var g=a.charCodeAt(++e);f=65536+((f&1023)<<10)|g&1023}D[b>>2]=f;b+=4;if(b+4>c)break}D[b>>2]=0;return b-d}function yb(a){for(var b=0,c=0;c<a.length;++c){var d=a.charCodeAt(c);55296<=d&&57343>=d&&++c;b+=4}return b}var zb={};function Ab(a){var b=zb[a];return void 0===b?N(a):b}var Bb=[];function Cb(a){var b=Bb.length;Bb.push(a);return b}\nfunction Db(a,b){for(var c=Array(a),d=0;d<a;++d)c[d]=La(E[b+4*d>>2],\"parameter \"+d);return c}var Eb=[],Fb=[null,[],[]];K=h.BindingError=Da(\"BindingError\");h.count_emval_handles=function(){for(var a=0,b=5;b<J.length;++b)void 0!==J[b]&&++a;return a};h.get_first_emval=function(){for(var a=5;a<J.length;++a)if(void 0!==J[a])return J[a];return null};Fa=h.PureVirtualError=Da(\"PureVirtualError\");for(var Gb=Array(256),Hb=0;256>Hb;++Hb)Gb[Hb]=String.fromCharCode(Hb);Ga=Gb;h.getInheritedInstanceCount=function(){return Object.keys(Q).length};\nh.getLiveInheritedInstances=function(){var a=[],b;for(b in Q)Q.hasOwnProperty(b)&&a.push(Q[b]);return a};h.flushPendingDeletes=Ha;h.setDelayFunction=function(a){P=a;O.length&&P&&P(Ha)};Sa=h.InternalError=Da(\"InternalError\");X.prototype.isAliasOf=function(a){if(!(this instanceof X&&a instanceof X))return!1;var b=this.M.P.N,c=this.M.O,d=a.M.P.N;for(a=a.M.O;b.R;)c=b.ba(c),b=b.R;for(;d.R;)a=d.ba(a),d=d.R;return b===d&&c===a};\nX.prototype.clone=function(){this.M.O||$a(this);if(this.M.aa)return this.M.count.value+=1,this;var a=T,b=Object,c=b.create,d=Object.getPrototypeOf(this),e=this.M;a=a(c.call(b,d,{M:{value:{count:e.count,$:e.$,aa:e.aa,O:e.O,P:e.P,T:e.T,U:e.U}}}));a.M.count.value+=1;a.M.$=!1;return a};X.prototype[\"delete\"]=function(){this.M.O||$a(this);this.M.$&&!this.M.aa&&L(\"Object already scheduled for deletion\");Ma(this);Oa(this.M);this.M.aa||(this.M.T=void 0,this.M.O=void 0)};X.prototype.isDeleted=function(){return!this.M.O};\nX.prototype.deleteLater=function(){this.M.O||$a(this);this.M.$&&!this.M.aa&&L(\"Object already scheduled for deletion\");O.push(this);1===O.length&&P&&P(Ha);this.M.$=!0;return this};Y.prototype.qa=function(a){this.ka&&(a=this.ka(a));return a};Y.prototype.ha=function(a){this.W&&this.W(a)};Y.prototype.argPackAdvance=8;Y.prototype.readValueFromPointer=Xa;Y.prototype.deleteObject=function(a){if(null!==a)a[\"delete\"]()};\nY.prototype.fromWireType=function(a){function b(){return this.da?Ua(this.N.X,{P:this.wa,O:c,U:this,T:a}):Ua(this.N.X,{P:this,O:a})}var c=this.qa(a);if(!c)return this.ha(a),null;var d=Ra(this.N,c);if(void 0!==d){if(0===d.M.count.value)return d.M.O=c,d.M.T=a,d.clone();d=d.clone();this.ha(a);return d}d=this.N.pa(c);d=Qa[d];if(!d)return b.call(this);d=this.ca?d.la:d.pointerType;var e=Pa(c,this.N,d.N);return null===e?b.call(this):this.da?Ua(d.N.X,{P:d,O:e,U:this,T:a}):Ua(d.N.X,{P:d,O:e})};\nmb=h.UnboundTypeError=Da(\"UnboundTypeError\");\nvar xa=\"function\"==typeof atob?atob:function(a){var b=\"\",c=0;a=a.replace(/[^A-Za-z0-9\\+\\/=]/g,\"\");do{var d=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(c++));var e=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(c++));var f=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(c++));var g=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(c++));d=d<<2|e>>4;\ne=(e&15)<<4|f>>2;var k=(f&3)<<6|g;b+=String.fromCharCode(d);64!==f&&(b+=String.fromCharCode(e));64!==g&&(b+=String.fromCharCode(k))}while(c<a.length);return b},Jb={l:function(a,b,c,d){x(\"Assertion failed: \"+(a?z(A,a):\"\")+\", at: \"+[b?b?z(A,b):\"\":\"unknown filename\",c,d?d?z(A,d):\"\":\"unknown function\"])},q:function(a,b,c){a=N(a);b=La(b,\"wrapper\");c=M(c);var d=[].slice,e=b.N,f=e.X,g=e.R.X,k=e.R.constructor;a=Ba(a,function(){e.R.ja.forEach(function(l){if(this[l]===g[l])throw new Fa(\"Pure virtual function \"+\nl+\" must be implemented in JavaScript\");}.bind(this));Object.defineProperty(this,\"__parent\",{value:f});this.__construct.apply(this,d.call(arguments))});f.__construct=function(){this===f&&L(\"Pass correct 'this' to __construct\");var l=k.implement.apply(void 0,[this].concat(d.call(arguments)));Ma(l);var n=l.M;l.notifyOnDestruction();n.aa=!0;Object.defineProperties(this,{M:{value:n}});T(this);l=n.O;l=Ia(e,l);Q.hasOwnProperty(l)?L(\"Tried to register registered instance: \"+l):Q[l]=this};f.__destruct=function(){this===\nf&&L(\"Pass correct 'this' to __destruct\");Ma(this);var l=this.M.O;l=Ia(e,l);Q.hasOwnProperty(l)?delete Q[l]:L(\"Tried to unregister unregistered instance: \"+l)};a.prototype=Object.create(f);for(var m in c)a.prototype[m]=c[m];return Ea(a)},j:function(a){var b=Va[a];delete Va[a];var c=b.fa,d=b.W,e=b.ia,f=e.map(g=>g.ta).concat(e.map(g=>g.za));V([a],f,g=>{var k={};e.forEach((m,l)=>{var n=g[l],p=m.ra,r=m.sa,u=g[l+e.length],t=m.ya,y=m.Aa;k[m.oa]={read:B=>n.fromWireType(p(r,B)),write:(B,ba)=>{var I=[];t(y,\nB,u.toWireType(I,ba));Wa(I)}}});return[{name:b.name,fromWireType:function(m){var l={},n;for(n in k)l[n]=k[n].read(m);d(m);return l},toWireType:function(m,l){for(var n in k)if(!(n in l))throw new TypeError('Missing field: \"'+n+'\"');var p=c();for(n in k)k[n].write(p,l[n]);null!==m&&m.push(d,p);return p},argPackAdvance:8,readValueFromPointer:Xa,V:d}]})},v:function(){},B:function(a,b,c,d,e){var f=Za(c);b=N(b);W(a,{name:b,fromWireType:function(g){return!!g},toWireType:function(g,k){return k?d:e},argPackAdvance:8,\nreadValueFromPointer:function(g){if(1===c)var k=ja;else if(2===c)k=C;else if(4===c)k=D;else throw new TypeError(\"Unknown boolean type size: \"+b);return this.fromWireType(k[g>>f])},V:null})},f:function(a,b,c,d,e,f,g,k,m,l,n,p,r){n=N(n);f=Z(e,f);k&&(k=Z(g,k));l&&(l=Z(m,l));r=Z(p,r);var u=Aa(n);bb(u,function(){nb(\"Cannot construct \"+n+\" due to unbound types\",[d])});V([a,b,c],d?[d]:[],function(t){t=t[0];if(d){var y=t.N;var B=y.X}else B=X.prototype;t=Ba(u,function(){if(Object.getPrototypeOf(this)!==ba)throw new K(\"Use 'new' to construct \"+\nn);if(void 0===I.Y)throw new K(n+\" has no accessible constructor\");var kb=I.Y[arguments.length];if(void 0===kb)throw new K(\"Tried to invoke ctor of \"+n+\" with invalid number of parameters (\"+arguments.length+\") - expected (\"+Object.keys(I.Y).toString()+\") parameters instead!\");return kb.apply(this,arguments)});var ba=Object.create(B,{constructor:{value:t}});t.prototype=ba;var I=new cb(n,t,ba,r,y,f,k,l);y=new Y(n,I,!0,!1);B=new Y(n+\"*\",I,!1,!1);var lb=new Y(n+\" const*\",I,!1,!0);Qa[a]={pointerType:B,\nla:lb};ib(u,t);return[y,B,lb]})},d:function(a,b,c,d,e,f,g){var k=pb(c,d);b=N(b);f=Z(e,f);V([],[a],function(m){function l(){nb(\"Cannot call \"+n+\" due to unbound types\",k)}m=m[0];var n=m.name+\".\"+b;b.startsWith(\"@@\")&&(b=Symbol[b.substring(2)]);var p=m.N.constructor;void 0===p[b]?(l.Z=c-1,p[b]=l):(ab(p,b,n),p[b].S[c-1]=l);V([],k,function(r){r=ob(n,[r[0],null].concat(r.slice(1)),null,f,g);void 0===p[b].S?(r.Z=c-1,p[b]=r):p[b].S[c-1]=r;return[]});return[]})},p:function(a,b,c,d,e,f){0<b||x();var g=pb(b,\nc);e=Z(d,e);V([],[a],function(k){k=k[0];var m=\"constructor \"+k.name;void 0===k.N.Y&&(k.N.Y=[]);if(void 0!==k.N.Y[b-1])throw new K(\"Cannot register multiple constructors with identical number of parameters (\"+(b-1)+\") for class '\"+k.name+\"'! Overload resolution is currently only performed using the parameter count, not actual type info!\");k.N.Y[b-1]=()=>{nb(\"Cannot construct \"+k.name+\" due to unbound types\",g)};V([],g,function(l){l.splice(1,0,null);k.N.Y[b-1]=ob(m,l,null,e,f);return[]});return[]})},\na:function(a,b,c,d,e,f,g,k){var m=pb(c,d);b=N(b);f=Z(e,f);V([],[a],function(l){function n(){nb(\"Cannot call \"+p+\" due to unbound types\",m)}l=l[0];var p=l.name+\".\"+b;b.startsWith(\"@@\")&&(b=Symbol[b.substring(2)]);k&&l.N.ja.push(b);var r=l.N.X,u=r[b];void 0===u||void 0===u.S&&u.className!==l.name&&u.Z===c-2?(n.Z=c-2,n.className=l.name,r[b]=n):(ab(r,b,p),r[b].S[c-2]=n);V([],m,function(t){t=ob(p,t,l,f,g);void 0===r[b].S?(t.Z=c-2,r[b]=t):r[b].S[c-2]=t;return[]});return[]})},A:function(a,b){b=N(b);W(a,\n{name:b,fromWireType:function(c){var d=M(c);qb(c);return d},toWireType:function(c,d){return Ea(d)},argPackAdvance:8,readValueFromPointer:Xa,V:null})},n:function(a,b,c){c=Za(c);b=N(b);W(a,{name:b,fromWireType:function(d){return d},toWireType:function(d,e){return e},argPackAdvance:8,readValueFromPointer:rb(b,c),V:null})},e:function(a,b,c,d,e){b=N(b);-1===e&&(e=4294967295);e=Za(c);var f=k=>k;if(0===d){var g=32-8*c;f=k=>k<<g>>>g}c=b.includes(\"unsigned\")?function(k,m){return m>>>0}:function(k,m){return m};\nW(a,{name:b,fromWireType:f,toWireType:c,argPackAdvance:8,readValueFromPointer:sb(b,e,0!==d),V:null})},b:function(a,b,c){function d(f){f>>=2;var g=E;return new e(ia,g[f+1],g[f])}var e=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=N(c);W(a,{name:c,fromWireType:d,argPackAdvance:8,readValueFromPointer:d},{ua:!0})},o:function(a,b){b=N(b);var c=\"std::string\"===b;W(a,{name:b,fromWireType:function(d){var e=E[d>>2],f=d+4;if(c)for(var g=f,k=0;k<=e;++k){var m=\nf+k;if(k==e||0==A[m]){g=g?z(A,g,m-g):\"\";if(void 0===l)var l=g;else l+=String.fromCharCode(0),l+=g;g=m+1}}else{l=Array(e);for(k=0;k<e;++k)l[k]=String.fromCharCode(A[f+k]);l=l.join(\"\")}S(d);return l},toWireType:function(d,e){e instanceof ArrayBuffer&&(e=new Uint8Array(e));var f,g=\"string\"==typeof e;g||e instanceof Uint8Array||e instanceof Uint8ClampedArray||e instanceof Int8Array||L(\"Cannot pass non-string to std::string\");if(c&&g){var k=0;for(f=0;f<e.length;++f){var m=e.charCodeAt(f);127>=m?k++:2047>=\nm?k+=2:55296<=m&&57343>=m?(k+=4,++f):k+=3}f=k}else f=e.length;k=Ib(4+f+1);m=k+4;E[k>>2]=f;if(c&&g){if(g=m,m=f+1,f=A,0<m){m=g+m-1;for(var l=0;l<e.length;++l){var n=e.charCodeAt(l);if(55296<=n&&57343>=n){var p=e.charCodeAt(++l);n=65536+((n&1023)<<10)|p&1023}if(127>=n){if(g>=m)break;f[g++]=n}else{if(2047>=n){if(g+1>=m)break;f[g++]=192|n>>6}else{if(65535>=n){if(g+2>=m)break;f[g++]=224|n>>12}else{if(g+3>=m)break;f[g++]=240|n>>18;f[g++]=128|n>>12&63}f[g++]=128|n>>6&63}f[g++]=128|n&63}}f[g]=0}}else if(g)for(g=\n0;g<f;++g)l=e.charCodeAt(g),255<l&&(S(m),L(\"String has UTF-16 code units that do not fit in 8 bits\")),A[m+g]=l;else for(g=0;g<f;++g)A[m+g]=e[g];null!==d&&d.push(S,k);return k},argPackAdvance:8,readValueFromPointer:Xa,V:function(d){S(d)}})},i:function(a,b,c){c=N(c);if(2===b){var d=tb;var e=ub;var f=vb;var g=()=>ka;var k=1}else 4===b&&(d=wb,e=xb,f=yb,g=()=>E,k=2);W(a,{name:c,fromWireType:function(m){for(var l=E[m>>2],n=g(),p,r=m+4,u=0;u<=l;++u){var t=m+4+u*b;if(u==l||0==n[t>>k])r=d(r,t-r),void 0===\np?p=r:(p+=String.fromCharCode(0),p+=r),r=t+b}S(m);return p},toWireType:function(m,l){\"string\"!=typeof l&&L(\"Cannot pass non-string to C++ string type \"+c);var n=f(l),p=Ib(4+n+b);E[p>>2]=n>>k;e(l,p+4,n+b);null!==m&&m.push(S,p);return p},argPackAdvance:8,readValueFromPointer:Xa,V:function(m){S(m)}})},k:function(a,b,c,d,e,f){Va[a]={name:N(b),fa:Z(c,d),W:Z(e,f),ia:[]}},h:function(a,b,c,d,e,f,g,k,m,l){Va[a].ia.push({oa:N(b),ta:c,ra:Z(d,e),sa:f,za:g,ya:Z(k,m),Aa:l})},C:function(a,b){b=N(b);W(a,{va:!0,name:b,\nargPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},s:function(a,b,c,d,e){a=Bb[a];b=M(b);c=Ab(c);var f=[];E[d>>2]=Ea(f);return a(b,c,f,e)},t:function(a,b,c,d){a=Bb[a];b=M(b);c=Ab(c);a(b,c,null,d)},g:qb,m:function(a,b){var c=Db(a,b),d=c[0];b=d.name+\"_$\"+c.slice(1).map(function(g){return g.name}).join(\"_\")+\"$\";var e=Eb[b];if(void 0!==e)return e;var f=Array(a-1);e=Cb((g,k,m,l)=>{for(var n=0,p=0;p<a-1;++p)f[p]=c[p+1].readValueFromPointer(l+n),n+=c[p+1].argPackAdvance;g=g[k].apply(g,\nf);for(p=0;p<a-1;++p)c[p+1].ma&&c[p+1].ma(f[p]);if(!d.va)return d.toWireType(m,g)});return Eb[b]=e},D:function(a){4<a&&(J[a].ga+=1)},r:function(a){var b=M(a);Wa(b);qb(a)},c:function(){x(\"\")},x:function(a,b,c){A.copyWithin(a,b,b+c)},w:function(a){var b=A.length;a>>>=0;if(2147483648<a)return!1;for(var c=1;4>=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);var e=Math;d=Math.max(a,d);e=e.min.call(e,2147483648,d+(65536-d%65536)%65536);a:{try{fa.grow(e-ia.byteLength+65535>>>16);na();var f=1;break a}catch(g){}f=\nvoid 0}if(f)return!0}return!1},z:function(){return 52},u:function(){return 70},y:function(a,b,c,d){for(var e=0,f=0;f<c;f++){var g=E[b>>2],k=E[b+4>>2];b+=8;for(var m=0;m<k;m++){var l=A[g+m],n=Fb[a];0===l||10===l?((1===a?ea:v)(z(n,0)),n.length=0):n.push(l)}e+=k}E[d>>2]=e;return 0}};\n(function(){function a(e){h.asm=e.exports;fa=h.asm.E;na();oa=h.asm.J;qa.unshift(h.asm.F);F--;h.monitorRunDependencies&&h.monitorRunDependencies(F);0==F&&(null!==ta&&(clearInterval(ta),ta=null),G&&(e=G,G=null,e()))}function b(e){a(e.instance)}function c(e){return ya().then(function(f){return WebAssembly.instantiate(f,d)}).then(function(f){return f}).then(e,function(f){v(\"failed to asynchronously prepare wasm: \"+f);x(f)})}var d={a:Jb};F++;h.monitorRunDependencies&&h.monitorRunDependencies(F);if(h.instantiateWasm)try{return h.instantiateWasm(d,\na)}catch(e){v(\"Module.instantiateWasm callback failed with error: \"+e),ca(e)}(function(){return w||\"function\"!=typeof WebAssembly.instantiateStreaming||ua(H)||\"function\"!=typeof fetch?c(b):fetch(H,{credentials:\"same-origin\"}).then(function(e){return WebAssembly.instantiateStreaming(e,d).then(b,function(f){v(\"wasm streaming compile failed: \"+f);v(\"falling back to ArrayBuffer instantiation\");return c(b)})})})().catch(ca);return{}})();\nh.___wasm_call_ctors=function(){return(h.___wasm_call_ctors=h.asm.F).apply(null,arguments)};var Ka=h.___getTypeName=function(){return(Ka=h.___getTypeName=h.asm.G).apply(null,arguments)};h.__embind_initialize_bindings=function(){return(h.__embind_initialize_bindings=h.asm.H).apply(null,arguments)};var Ib=h._malloc=function(){return(Ib=h._malloc=h.asm.I).apply(null,arguments)},S=h._free=function(){return(S=h._free=h.asm.K).apply(null,arguments)};\nh.dynCall_jiji=function(){return(h.dynCall_jiji=h.asm.L).apply(null,arguments)};var Kb;G=function Lb(){Kb||Mb();Kb||(G=Lb)};\nfunction Mb(){function a(){if(!Kb&&(Kb=!0,h.calledRun=!0,!ha)){za(qa);aa(h);if(h.onRuntimeInitialized)h.onRuntimeInitialized();if(h.postRun)for(\"function\"==typeof h.postRun&&(h.postRun=[h.postRun]);h.postRun.length;){var b=h.postRun.shift();ra.unshift(b)}za(ra)}}if(!(0<F)){if(h.preRun)for(\"function\"==typeof h.preRun&&(h.preRun=[h.preRun]);h.preRun.length;)sa();za(pa);0<F||(h.setStatus?(h.setStatus(\"Running...\"),setTimeout(function(){setTimeout(function(){h.setStatus(\"\")},1);a()},1)):a())}}\nif(h.preInit)for(\"function\"==typeof h.preInit&&(h.preInit=[h.preInit]);0<h.preInit.length;)h.preInit.pop()();Mb();\n\n\n return loadYoga.ready\n}\n);\n})();\nexport default loadYoga;","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// @generated by enums.py\n\nexport enum Align {\n Auto = 0,\n FlexStart = 1,\n Center = 2,\n FlexEnd = 3,\n Stretch = 4,\n Baseline = 5,\n SpaceBetween = 6,\n SpaceAround = 7,\n SpaceEvenly = 8,\n}\n\nexport enum BoxSizing {\n BorderBox = 0,\n ContentBox = 1,\n}\n\nexport enum Dimension {\n Width = 0,\n Height = 1,\n}\n\nexport enum Direction {\n Inherit = 0,\n LTR = 1,\n RTL = 2,\n}\n\nexport enum Display {\n Flex = 0,\n None = 1,\n Contents = 2,\n}\n\nexport enum Edge {\n Left = 0,\n Top = 1,\n Right = 2,\n Bottom = 3,\n Start = 4,\n End = 5,\n Horizontal = 6,\n Vertical = 7,\n All = 8,\n}\n\nexport enum Errata {\n None = 0,\n StretchFlexBasis = 1,\n AbsolutePositionWithoutInsetsExcludesPadding = 2,\n AbsolutePercentAgainstInnerSize = 4,\n All = 2147483647,\n Classic = 2147483646,\n}\n\nexport enum ExperimentalFeature {\n WebFlexBasis = 0,\n}\n\nexport enum FlexDirection {\n Column = 0,\n ColumnReverse = 1,\n Row = 2,\n RowReverse = 3,\n}\n\nexport enum Gutter {\n Column = 0,\n Row = 1,\n All = 2,\n}\n\nexport enum Justify {\n FlexStart = 0,\n Center = 1,\n FlexEnd = 2,\n SpaceBetween = 3,\n SpaceAround = 4,\n SpaceEvenly = 5,\n}\n\nexport enum LogLevel {\n Error = 0,\n Warn = 1,\n Info = 2,\n Debug = 3,\n Verbose = 4,\n Fatal = 5,\n}\n\nexport enum MeasureMode {\n Undefined = 0,\n Exactly = 1,\n AtMost = 2,\n}\n\nexport enum NodeType {\n Default = 0,\n Text = 1,\n}\n\nexport enum Overflow {\n Visible = 0,\n Hidden = 1,\n Scroll = 2,\n}\n\nexport enum PositionType {\n Static = 0,\n Relative = 1,\n Absolute = 2,\n}\n\nexport enum Unit {\n Undefined = 0,\n Point = 1,\n Percent = 2,\n Auto = 3,\n}\n\nexport enum Wrap {\n NoWrap = 0,\n Wrap = 1,\n WrapReverse = 2,\n}\n\nconst constants = {\n ALIGN_AUTO: Align.Auto,\n ALIGN_FLEX_START: Align.FlexStart,\n ALIGN_CENTER: Align.Center,\n ALIGN_FLEX_END: Align.FlexEnd,\n ALIGN_STRETCH: Align.Stretch,\n ALIGN_BASELINE: Align.Baseline,\n ALIGN_SPACE_BETWEEN: Align.SpaceBetween,\n ALIGN_SPACE_AROUND: Align.SpaceAround,\n ALIGN_SPACE_EVENLY: Align.SpaceEvenly,\n BOX_SIZING_BORDER_BOX: BoxSizing.BorderBox,\n BOX_SIZING_CONTENT_BOX: BoxSizing.ContentBox,\n DIMENSION_WIDTH: Dimension.Width,\n DIMENSION_HEIGHT: Dimension.Height,\n DIRECTION_INHERIT: Direction.Inherit,\n DIRECTION_LTR: Direction.LTR,\n DIRECTION_RTL: Direction.RTL,\n DISPLAY_FLEX: Display.Flex,\n DISPLAY_NONE: Display.None,\n DISPLAY_CONTENTS: Display.Contents,\n EDGE_LEFT: Edge.Left,\n EDGE_TOP: Edge.Top,\n EDGE_RIGHT: Edge.Right,\n EDGE_BOTTOM: Edge.Bottom,\n EDGE_START: Edge.Start,\n EDGE_END: Edge.End,\n EDGE_HORIZONTAL: Edge.Horizontal,\n EDGE_VERTICAL: Edge.Vertical,\n EDGE_ALL: Edge.All,\n ERRATA_NONE: Errata.None,\n ERRATA_STRETCH_FLEX_BASIS: Errata.StretchFlexBasis,\n ERRATA_ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING: Errata.AbsolutePositionWithoutInsetsExcludesPadding,\n ERRATA_ABSOLUTE_PERCENT_AGAINST_INNER_SIZE: Errata.AbsolutePercentAgainstInnerSize,\n ERRATA_ALL: Errata.All,\n ERRATA_CLASSIC: Errata.Classic,\n EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS: ExperimentalFeature.WebFlexBasis,\n FLEX_DIRECTION_COLUMN: FlexDirection.Column,\n FLEX_DIRECTION_COLUMN_REVERSE: FlexDirection.ColumnReverse,\n FLEX_DIRECTION_ROW: FlexDirection.Row,\n FLEX_DIRECTION_ROW_REVERSE: FlexDirection.RowReverse,\n GUTTER_COLUMN: Gutter.Column,\n GUTTER_ROW: Gutter.Row,\n GUTTER_ALL: Gutter.All,\n JUSTIFY_FLEX_START: Justify.FlexStart,\n JUSTIFY_CENTER: Justify.Center,\n JUSTIFY_FLEX_END: Justify.FlexEnd,\n JUSTIFY_SPACE_BETWEEN: Justify.SpaceBetween,\n JUSTIFY_SPACE_AROUND: Justify.SpaceAround,\n JUSTIFY_SPACE_EVENLY: Justify.SpaceEvenly,\n LOG_LEVEL_ERROR: LogLevel.Error,\n LOG_LEVEL_WARN: LogLevel.Warn,\n LOG_LEVEL_INFO: LogLevel.Info,\n LOG_LEVEL_DEBUG: LogLevel.Debug,\n LOG_LEVEL_VERBOSE: LogLevel.Verbose,\n LOG_LEVEL_FATAL: LogLevel.Fatal,\n MEASURE_MODE_UNDEFINED: MeasureMode.Undefined,\n MEASURE_MODE_EXACTLY: MeasureMode.Exactly,\n MEASURE_MODE_AT_MOST: MeasureMode.AtMost,\n NODE_TYPE_DEFAULT: NodeType.Default,\n NODE_TYPE_TEXT: NodeType.Text,\n OVERFLOW_VISIBLE: Overflow.Visible,\n OVERFLOW_HIDDEN: Overflow.Hidden,\n OVERFLOW_SCROLL: Overflow.Scroll,\n POSITION_TYPE_STATIC: PositionType.Static,\n POSITION_TYPE_RELATIVE: PositionType.Relative,\n POSITION_TYPE_ABSOLUTE: PositionType.Absolute,\n UNIT_UNDEFINED: Unit.Undefined,\n UNIT_POINT: Unit.Point,\n UNIT_PERCENT: Unit.Percent,\n UNIT_AUTO: Unit.Auto,\n WRAP_NO_WRAP: Wrap.NoWrap,\n WRAP_WRAP: Wrap.Wrap,\n WRAP_WRAP_REVERSE: Wrap.WrapReverse,\n}\nexport default constants","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @format\n */\n\n// @ts-nocheck\n\nimport {Unit, Direction} from './generated/YGEnums.ts';\nimport YGEnums from './generated/YGEnums.ts';\n\nimport type {\n Align,\n BoxSizing,\n Display,\n Edge,\n Errata,\n ExperimentalFeature,\n FlexDirection,\n Gutter,\n Justify,\n MeasureMode,\n Overflow,\n PositionType,\n Wrap,\n} from './generated/YGEnums.ts';\n\ntype Layout = {\n left: number;\n right: number;\n top: number;\n bottom: number;\n width: number;\n height: number;\n};\n\ntype Size = {\n width: number;\n height: number;\n};\n\ntype Value = {\n unit: Unit;\n value: number;\n};\n\nexport type Config = {\n free(): void;\n isExperimentalFeatureEnabled(feature: ExperimentalFeature): boolean;\n setExperimentalFeatureEnabled(\n feature: ExperimentalFeature,\n enabled: boolean,\n ): void;\n setPointScaleFactor(factor: number): void;\n getErrata(): Errata;\n setErrata(errata: Errata): void;\n useWebDefaults(): boolean;\n setUseWebDefaults(useWebDefaults: boolean): void;\n};\n\nexport type DirtiedFunction = (node: Node) => void;\n\nexport type MeasureFunction = (\n width: number,\n widthMode: MeasureMode,\n height: number,\n heightMode: MeasureMode,\n) => Size;\n\nexport type Node = {\n calculateLayout(\n width: number | 'auto' | undefined,\n height: number | 'auto' | undefined,\n direction?: Direction,\n ): void;\n copyStyle(node: Node): void;\n free(): void;\n freeRecursive(): void;\n getAlignContent(): Align;\n getAlignItems(): Align;\n getAlignSelf(): Align;\n getAspectRatio(): number;\n getBorder(edge: Edge): number;\n getChild(index: number): Node;\n getChildCount(): number;\n getComputedBorder(edge: Edge): number;\n getComputedBottom(): number;\n getComputedHeight(): number;\n getComputedLayout(): Layout;\n getComputedLeft(): number;\n getComputedMargin(edge: Edge): number;\n getComputedPadding(edge: Edge): number;\n getComputedRight(): number;\n getComputedTop(): number;\n getComputedWidth(): number;\n getDirection(): Direction;\n getDisplay(): Display;\n getFlexBasis(): Value;\n getFlexDirection(): FlexDirection;\n getFlexGrow(): number;\n getFlexShrink(): number;\n getFlexWrap(): Wrap;\n getHeight(): Value;\n getJustifyContent(): Justify;\n getGap(gutter: Gutter): Value;\n getMargin(edge: Edge): Value;\n getMaxHeight(): Value;\n getMaxWidth(): Value;\n getMinHeight(): Value;\n getMinWidth(): Value;\n getOverflow(): Overflow;\n getPadding(edge: Edge): Value;\n getParent(): Node | null;\n getPosition(edge: Edge): Value;\n getPositionType(): PositionType;\n getBoxSizing(): BoxSizing;\n getWidth(): Value;\n insertChild(child: Node, index: number): void;\n isDirty(): boolean;\n isReferenceBaseline(): boolean;\n markDirty(): void;\n hasNewLayout(): boolean;\n markLayoutSeen(): void;\n removeChild(child: Node): void;\n reset(): void;\n setAlignContent(alignContent: Align): void;\n setAlignItems(alignItems: Align): void;\n setAlignSelf(alignSelf: Align): void;\n setAspectRatio(aspectRatio: number | undefined): void;\n setBorder(edge: Edge, borderWidth: number | undefined): void;\n setDirection(direction: Direction): void;\n setDisplay(display: Display): void;\n setFlex(flex: number | undefined): void;\n setFlexBasis(flexBasis: number | 'auto' | `${number}%` | undefined): void;\n setFlexBasisPercent(flexBasis: number | undefined): void;\n setFlexBasisAuto(): void;\n setFlexDirection(flexDirection: FlexDirection): void;\n setFlexGrow(flexGrow: number | undefined): void;\n setFlexShrink(flexShrink: number | undefined): void;\n setFlexWrap(flexWrap: Wrap): void;\n setHeight(height: number | 'auto' | `${number}%` | undefined): void;\n setIsReferenceBaseline(isReferenceBaseline: boolean): void;\n setHeightAuto(): void;\n setHeightPercent(height: number | undefined): void;\n setJustifyContent(justifyContent: Justify): void;\n setGap(gutter: Gutter, gapLength: number | `${number}%` | undefined): Value;\n setGapPercent(gutter: Gutter, gapLength: number | undefined): Value;\n setMargin(\n edge: Edge,\n margin: number | 'auto' | `${number}%` | undefined,\n ): void;\n setMarginAuto(edge: Edge): void;\n setMarginPercent(edge: Edge, margin: number | undefined): void;\n setMaxHeight(maxHeight: number | `${number}%` | undefined): void;\n setMaxHeightPercent(maxHeight: number | undefined): void;\n setMaxWidth(maxWidth: number | `${number}%` | undefined): void;\n setMaxWidthPercent(maxWidth: number | undefined): void;\n setDirtiedFunc(dirtiedFunc: DirtiedFunction | null): void;\n setMeasureFunc(measureFunc: MeasureFunction | null): void;\n setMinHeight(minHeight: number | `${number}%` | undefined): void;\n setMinHeightPercent(minHeight: number | undefined): void;\n setMinWidth(minWidth: number | `${number}%` | undefined): void;\n setMinWidthPercent(minWidth: number | undefined): void;\n setOverflow(overflow: Overflow): void;\n setPadding(edge: Edge, padding: number | `${number}%` | undefined): void;\n setPaddingPercent(edge: Edge, padding: number | undefined): void;\n setPosition(edge: Edge, position: number | `${number}%` | undefined): void;\n setPositionPercent(edge: Edge, position: number | undefined): void;\n setPositionType(positionType: PositionType): void;\n setPositionAuto(edge: Edge): void;\n setBoxSizing(boxSizing: BoxSizing): void;\n setWidth(width: number | 'auto' | `${number}%` | undefined): void;\n setWidthAuto(): void;\n setWidthPercent(width: number | undefined): void;\n unsetDirtiedFunc(): void;\n unsetMeasureFunc(): void;\n setAlwaysFormsContainingBlock(alwaysFormsContainingBlock: boolean): void;\n};\n\nexport type Yoga = {\n Config: {\n create(): Config;\n destroy(config: Config): void;\n };\n Node: {\n create(config?: Config): Node;\n createDefault(): Node;\n createWithConfig(config: Config): Node;\n destroy(node: Node): void;\n };\n} & typeof YGEnums;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default function wrapAssembly(lib: any): Yoga {\n function patch(prototype, name, fn) {\n const original = prototype[name];\n\n prototype[name] = function (...args) {\n return fn.call(this, original, ...args);\n };\n }\n\n for (const fnName of [\n 'setPosition',\n 'setMargin',\n 'setFlexBasis',\n 'setWidth',\n 'setHeight',\n 'setMinWidth',\n 'setMinHeight',\n 'setMaxWidth',\n 'setMaxHeight',\n 'setPadding',\n 'setGap',\n ]) {\n const methods = {\n [Unit.Point]: lib.Node.prototype[fnName],\n [Unit.Percent]: lib.Node.prototype[`${fnName}Percent`],\n [Unit.Auto]: lib.Node.prototype[`${fnName}Auto`],\n };\n\n patch(lib.Node.prototype, fnName, function (original, ...args) {\n // We patch all these functions to add support for the following calls:\n // .setWidth(100) / .setWidth(\"100%\") / .setWidth(.getWidth()) / .setWidth(\"auto\")\n\n const value = args.pop();\n let unit, asNumber;\n\n if (value === 'auto') {\n unit = Unit.Auto;\n asNumber = undefined;\n } else if (typeof value === 'object') {\n unit = value.unit;\n asNumber = value.valueOf();\n } else {\n unit =\n typeof value === 'string' && value.endsWith('%')\n ? Unit.Percent\n : Unit.Point;\n asNumber = parseFloat(value);\n if (\n value !== undefined &&\n !Number.isNaN(value) &&\n Number.isNaN(asNumber)\n ) {\n throw new Error(`Invalid value ${value} for ${fnName}`);\n }\n }\n\n if (!methods[unit])\n throw new Error(\n `Failed to execute \"${fnName}\": Unsupported unit '${value}'`,\n );\n\n if (asNumber !== undefined) {\n return methods[unit].call(this, ...args, asNumber);\n } else {\n return methods[unit].call(this, ...args);\n }\n });\n }\n\n function wrapMeasureFunction(measureFunction) {\n return lib.MeasureCallback.implement({\n measure: (...args) => {\n const {width, height} = measureFunction(...args);\n return {\n width: width ?? NaN,\n height: height ?? NaN,\n };\n },\n });\n }\n\n patch(lib.Node.prototype, 'setMeasureFunc', function (original, measureFunc) {\n // This patch is just a convenience patch, since it helps write more\n // idiomatic source code (such as .setMeasureFunc(null))\n if (measureFunc) {\n return original.call(this, wrapMeasureFunction(measureFunc));\n } else {\n return this.unsetMeasureFunc();\n }\n });\n\n function wrapDirtiedFunc(dirtiedFunction) {\n return lib.DirtiedCallback.implement({dirtied: dirtiedFunction});\n }\n\n patch(lib.Node.prototype, 'setDirtiedFunc', function (original, dirtiedFunc) {\n original.call(this, wrapDirtiedFunc(dirtiedFunc));\n });\n\n patch(lib.Config.prototype, 'free', function () {\n // Since we handle the memory allocation ourselves (via lib.Config.create),\n // we also need to handle the deallocation\n lib.Config.destroy(this);\n });\n\n patch(lib.Node, 'create', (_, config) => {\n // We decide the constructor we want to call depending on the parameters\n return config\n ? lib.Node.createWithConfig(config)\n : lib.Node.createDefault();\n });\n\n patch(lib.Node.prototype, 'free', function () {\n // Since we handle the memory allocation ourselves (via lib.Node.create),\n // we also need to handle the deallocation\n lib.Node.destroy(this);\n });\n\n patch(lib.Node.prototype, 'freeRecursive', function () {\n for (let t = 0, T = this.getChildCount(); t < T; ++t) {\n this.getChild(0).freeRecursive();\n }\n this.free();\n });\n\n patch(\n lib.Node.prototype,\n 'calculateLayout',\n function (original, width = NaN, height = NaN, direction = Direction.LTR) {\n // Just a small patch to add support for the function default parameters\n return original.call(this, width, height, direction);\n },\n );\n\n return {\n Config: lib.Config,\n Node: lib.Node,\n ...YGEnums,\n };\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @format\n */\n\n// @ts-ignore untyped from Emscripten\nimport loadYogaImpl from '../binaries/yoga-wasm-base64-esm.js';\nimport wrapAssembly from './wrapAssembly.ts';\n\nexport type {\n Config,\n DirtiedFunction,\n MeasureFunction,\n Node,\n Yoga,\n} from './wrapAssembly.ts';\n\nexport async function loadYoga() {\n return wrapAssembly(await loadYogaImpl());\n}\nexport * from './generated/YGEnums.ts';\n","import { loadYoga as loadYogaUntyped, type Yoga } from 'yoga-layout/load';\n\nconst loadYoga = loadYogaUntyped as (options: {\n\twasmBinary?: ArrayBuffer | ArrayBufferLike;\n\tinstantiateWasm?: (\n\t\timports: WebAssembly.Imports,\n\t\tsuccessCallback: (instance: WebAssembly.Instance) => void\n\t) => WebAssembly.Exports | false | undefined;\n}) => Promise<Yoga>;\n\nlet resolveYoga: (yoga: Yoga) => void;\nlet rejectYoga: (error: unknown) => void;\nconst yogaPromise: Promise<Yoga> = new Promise((resolve, reject) => {\n\tresolveYoga = resolve;\n\trejectYoga = reject;\n});\n\nexport type InitInput =\n\t| string\n\t| Request\n\t| URL\n\t| Response\n\t| BufferSource\n\t| Buffer\n\t| WebAssembly.Module\n\t| Promise<Response | BufferSource | Buffer | WebAssembly.Module>;\n\nasync function loadWasm(\n\tinput: InitInput,\n\timports: WebAssembly.Imports\n): Promise<WebAssembly.WebAssemblyInstantiatedSource> {\n\tlet source: Response | BufferSource | Buffer | WebAssembly.Module;\n\n\tif (\n\t\ttypeof input === 'string' ||\n\t\t(typeof Request === 'function' && input instanceof Request) ||\n\t\t(typeof URL === 'function' && input instanceof URL)\n\t) {\n\t\tsource = await fetch(input);\n\t} else {\n\t\tsource = await input;\n\t}\n\n\tif (typeof Response === 'function' && source instanceof Response) {\n\t\tif (typeof WebAssembly.instantiateStreaming === 'function') {\n\t\t\ttry {\n\t\t\t\treturn await WebAssembly.instantiateStreaming(source, imports);\n\t\t\t} catch (e) {\n\t\t\t\tif (source.headers.get('Content-Type') !== 'application/wasm') {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t'`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n',\n\t\t\t\t\t\te\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst bytes = await source.arrayBuffer();\n\t\treturn await WebAssembly.instantiate(bytes, imports);\n\t}\n\n\tconst instantiated = (await WebAssembly.instantiate(\n\t\t'buffer' in source\n\t\t\t? source.buffer.slice(\n\t\t\t\t\tsource.byteOffset,\n\t\t\t\t\tsource.byteOffset + source.byteLength\n\t\t\t )\n\t\t\t: source,\n\t\timports\n\t)) as WebAssembly.Instance | WebAssembly.WebAssemblyInstantiatedSource;\n\n\tif (instantiated instanceof WebAssembly.Instance) {\n\t\treturn { instance: instantiated, module: source as WebAssembly.Module };\n\t}\n\n\treturn instantiated;\n}\n\nexport function init(input: InitInput) {\n\tloadYoga({\n\t\tinstantiateWasm(imports, successCallback) {\n\t\t\tloadWasm(input, imports)\n\t\t\t\t.then(({ instance }) => {\n\t\t\t\t\tsuccessCallback(instance);\n\t\t\t\t})\n\t\t\t\t.catch(rejectYoga);\n\n\t\t\treturn {};\n\t\t}\n\t})\n\t\t.then(resolveYoga)\n\t\t.catch(rejectYoga);\n}\n\nexport function getYoga() {\n\treturn yogaPromise;\n}\n","import { loadYoga } from 'yoga-layout/load';\n\n// Always preload Yoga.\nconst loadingYoga = loadYoga();\nexport function getYoga() {\n\treturn loadingYoga;\n}\n","import type { ReactNode, ReactElement } from 'react';\nimport LineBreaker from 'linebreak';\n\nimport CssDimension from './vendor/parse-css-dimension/index.js';\n\nexport function isReactElement(node: ReactNode): node is ReactElement {\n\tconst type = typeof node;\n\tif (\n\t\ttype === 'number' ||\n\t\ttype === 'bigint' ||\n\t\ttype === 'string' ||\n\t\ttype === 'boolean'\n\t) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nexport function isClass(f: Function) {\n\treturn /^class\\s/.test(f.toString());\n}\n\nexport function isForwardRefComponent(type: any) {\n\treturn type && type.$$typeof === Symbol.for('react.forward_ref');\n}\n\nexport function isReactComponent(type: any) {\n\treturn typeof type === 'function' || isForwardRefComponent(type);\n}\n\nexport function hasDangerouslySetInnerHTMLProp(props: any) {\n\treturn 'dangerouslySetInnerHTML' in props;\n}\n\nexport function normalizeChildren(children: any) {\n\tconst flattend =\n\t\ttypeof children === 'undefined'\n\t\t\t? []\n\t\t\t: [].concat(children).flat(Infinity);\n\n\tconst res = [];\n\tfor (let i = 0; i < flattend.length; i++) {\n\t\tlet value = flattend[i];\n\t\tif (\n\t\t\ttypeof value === 'undefined' ||\n\t\t\ttypeof value === 'boolean' ||\n\t\t\tvalue === null\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === 'number') {\n\t\t\tvalue = String(value);\n\t\t}\n\t\tif (\n\t\t\ttypeof value === 'string' &&\n\t\t\tres.length &&\n\t\t\ttypeof res[res.length - 1] === 'string'\n\t\t) {\n\t\t\tres[res.length - 1] += value;\n\t\t} else {\n\t\t\tres.push(value);\n\t\t}\n\t}\n\treturn res;\n}\n\nexport function lengthToNumber(\n\tlength: string | number,\n\tbaseFontSize: number,\n\tbaseLength: number,\n\tinheritedStyle: Record<string, string | number>,\n\tpercentage = false\n): number | undefined {\n\tif (typeof length === 'number') return length;\n\n\t// Convert em and rem values to number (px), convert rad to deg.\n\ttry {\n\t\tlength = length.trim();\n\n\t\t// Not length: `1px/2px`, `1px 2px`, `1px, 2px`, `calc(1px)`.\n\t\tif (/[ /\\(,]/.test(length)) return;\n\n\t\t// Just a number as string: '100'\n\t\tif (length === String(+length)) return +length;\n\n\t\tconst parsed = new CssDimension(length);\n\t\tif (parsed.type === 'length') {\n\t\t\tswitch (parsed.unit) {\n\t\t\t\tcase 'em':\n\t\t\t\t\treturn parsed.value * baseFontSize;\n\t\t\t\tcase 'rem':\n\t\t\t\t\treturn parsed.value * 16;\n\t\t\t\tcase 'vw':\n\t\t\t\t\treturn ~~(\n\t\t\t\t\t\t(parsed.value *\n\t\t\t\t\t\t\t(inheritedStyle._viewportWidth as number)) /\n\t\t\t\t\t\t100\n\t\t\t\t\t);\n\t\t\t\tcase 'vh':\n\t\t\t\t\treturn ~~(\n\t\t\t\t\t\t(parsed.value *\n\t\t\t\t\t\t\t(inheritedStyle._viewportHeight as number)) /\n\t\t\t\t\t\t100\n\t\t\t\t\t);\n\t\t\t\tdefault:\n\t\t\t\t\treturn parsed.value;\n\t\t\t}\n\t\t} else if (parsed.type === 'angle') {\n\t\t\treturn calcDegree(length);\n\t\t} else if (parsed.type === 'percentage') {\n\t\t\tif (percentage) {\n\t\t\t\treturn (parsed.value / 100) * baseLength;\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Not a length unit, silently ignore.\n\t}\n}\n\nexport function calcDegree(deg: string) {\n\tconst parsed = new CssDimension(deg);\n\n\tswitch (parsed.unit) {\n\t\tcase 'deg':\n\t\t\treturn parsed.value;\n\t\tcase 'rad':\n\t\t\treturn (parsed.value * 180) / Math.PI;\n\t\tcase 'turn':\n\t\t\treturn parsed.value * 360;\n\t\tcase 'grad':\n\t\t\treturn 0.9 * parsed.value;\n\t}\n}\n\n// Multiplies two 2d transform matrices.\nexport function multiply(m1: number[], m2: number[]) {\n\treturn [\n\t\tm1[0] * m2[0] + m1[2] * m2[1],\n\t\tm1[1] * m2[0] + m1[3] * m2[1],\n\t\tm1[0] * m2[2] + m1[2] * m2[3],\n\t\tm1[1] * m2[2] + m1[3] * m2[3],\n\t\tm1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n\t\tm1[1] * m2[4] + m1[3] * m2[5] + m1[5]\n\t];\n}\n\nexport function v(\n\tfield: string | number | undefined,\n\tmap: Record<string, any>,\n\tfallback: any,\n\terrorIfNotAllowedForProperty?: string\n) {\n\tlet value = map[field];\n\tif (typeof value === 'undefined') {\n\t\tif (errorIfNotAllowedForProperty && typeof field !== 'undefined') {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid value for CSS property \"${errorIfNotAllowedForProperty}\". Allowed values: ${Object.keys(\n\t\t\t\t\tmap\n\t\t\t\t)\n\t\t\t\t\t.map(_v => `\"${_v}\"`)\n\t\t\t\t\t.join(' | ')}. Received: \"${field}\".`\n\t\t\t);\n\t\t}\n\t\tvalue = fallback;\n\t}\n\treturn value;\n}\n\nlet wordSegmenter;\nlet graphemeSegmenter;\n\n// Implementation modified from\n// https://github.com/niklasvh/html2canvas/blob/6521a487d78172f7179f7c973c1a3af40eb92009/src/css/layout/text.ts\n// https://drafts.csswg.org/css-text/#word-separator\nexport const wordSeparators = [\n\t0x0020, 0x00a0, 0x1361, 0x10100, 0x10101, 0x1039, 0x1091, 0xa\n].map(point => String.fromCodePoint(point));\n\nconst segmentCache = new Map<string, string[]>();\nconst MAX_SEGMENT_CACHE_SIZE = 500;\n\nexport function segment(\n\tcontent: string,\n\tgranularity: 'word' | 'grapheme',\n\tlocale?: string\n): string[] {\n\tconst cacheKey = `${granularity}:${locale || ''}:${content}`;\n\n\tif (segmentCache.has(cacheKey)) {\n\t\treturn segmentCache.get(cacheKey)!;\n\t}\n\tif (!wordSegmenter || !graphemeSegmenter) {\n\t\tif (!(typeof Intl !== 'undefined' && 'Segmenter' in Intl)) {\n\t\t\t// https://caniuse.com/mdn-javascript_builtins_intl_segments\n\t\t\tthrow new Error(\n\t\t\t\t'Intl.Segmenter does not exist, please use import a polyfill.'\n\t\t\t);\n\t\t}\n\n\t\twordSegmenter = new Intl.Segmenter(locale, { granularity: 'word' });\n\t\tgraphemeSegmenter = new Intl.Segmenter(locale, {\n\t\t\tgranularity: 'grapheme'\n\t\t});\n\t}\n\n\tlet result: string[];\n\n\tif (granularity === 'grapheme') {\n\t\tresult = [...graphemeSegmenter.segment(content)].map(\n\t\t\tseg => seg.segment\n\t\t);\n\t} else {\n\t\tconst segmented = [...wordSegmenter.segment(content)].map(\n\t\t\tseg => seg.segment\n\t\t) as string[];\n\n\t\tconst output = [];\n\n\t\tlet i = 0;\n\t\t// When there is a non-breaking space, join the previous and next words together.\n\t\t// This change causes them to be treated as a single segment.\n\t\twhile (i < segmented.length) {\n\t\t\tconst s = segmented[i];\n\n\t\t\tif (s == '\\u00a0') {\n\t\t\t\tconst previousWord = i === 0 ? '' : output.pop();\n\t\t\t\tconst nextWord =\n\t\t\t\t\ti === segmented.length - 1 ? '' : segmented[i + 1];\n\n\t\t\t\toutput.push(previousWord + '\\u00a0' + nextWord);\n\t\t\t\ti += 2;\n\t\t\t} else {\n\t\t\t\toutput.push(s);\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\n\t\tresult = output;\n\t}\n\n\tif (segmentCache.size >= MAX_SEGMENT_CACHE_SIZE) {\n\t\tconst firstKey = segmentCache.keys().next().value;\n\t\tsegmentCache.delete(firstKey);\n\t}\n\n\tsegmentCache.set(cacheKey, result);\n\treturn result;\n}\n\nexport function buildXMLString(\n\ttype: string,\n\tattrs: Record<string, string | number>,\n\tchildren?: string\n) {\n\tlet attrString = '';\n\n\tfor (const [k, _v] of Object.entries(attrs)) {\n\t\tif (typeof _v !== 'undefined') {\n\t\t\tattrString += ` ${k}=\"${_v}\"`;\n\t\t}\n\t}\n\n\tif (children) {\n\t\treturn `<${type}${attrString}>${children}</${type}>`;\n\t}\n\treturn `<${type}${attrString}/>`;\n}\n\nexport function createLRU<T>(max = 20) {\n\tconst store: Map<string, T> = new Map();\n\tfunction get(key: string): T | undefined {\n\t\tconst value = store.get(key);\n\t\tif (value === undefined) return undefined;\n\n\t\t// Move to end (most recently used)\n\t\tstore.delete(key);\n\t\tstore.set(key, value);\n\t\treturn value;\n\t}\n\tfunction set(key: string, value: T) {\n\t\tif (store.has(key)) {\n\t\t\tstore.delete(key);\n\t\t} else if (store.size >= max) {\n\t\t\tconst firstKey = store.keys().next().value;\n\t\t\tstore.delete(firstKey);\n\t\t}\n\n\t\tstore.set(key, value);\n\t}\n\tfunction clear() {\n\t\tstore.clear();\n\t}\n\n\treturn {\n\t\tset,\n\t\tget,\n\t\tclear\n\t};\n}\n\nexport function parseViewBox(viewBox?: string | null | undefined) {\n\treturn viewBox ? viewBox.split(/[, ]/).filter(Boolean).map(Number) : null;\n}\n\nexport function toString(x: unknown): string {\n\treturn Object.prototype.toString.call(x);\n}\n\nexport function isString(x: unknown): x is string {\n\treturn typeof x === 'string';\n}\n\nexport function isNumber(x: unknown): x is number {\n\treturn typeof x === 'number';\n}\n\nexport function isUndefined(x: unknown): x is undefined {\n\treturn typeof x === 'undefined';\n}\n\nexport function asPointPercentageLength(\n\tx: string | number,\n\tpropertyName?: string\n): number | `${number}%` | undefined {\n\tif (typeof x === 'number') {\n\t\treturn x;\n\t}\n\tif (x.endsWith('%')) {\n\t\tconst percentageValue = parseFloat(x.slice(0, -1));\n\t\tif (isNaN(percentageValue)) {\n\t\t\tconsole.warn(\n\t\t\t\t`Invalid value \"${x}\"${\n\t\t\t\t\ttypeof propertyName === 'string'\n\t\t\t\t\t\t? ` for \"${propertyName}\"`\n\t\t\t\t\t\t: ''\n\t\t\t\t}. Expected a percentage value (e.g., \"50%\").`\n\t\t\t);\n\t\t\treturn undefined;\n\t\t}\n\t\treturn `${percentageValue}%`;\n\t}\n\n\tconsole.warn(\n\t\t`Invalid value \"${x}\"${\n\t\t\ttypeof propertyName === 'string' ? ` for \"${propertyName}\"` : ''\n\t\t}. Expected a number or a percentage value (e.g., \"50%\").`\n\t);\n\treturn undefined;\n}\n\nexport function asPointAutoPercentageLength(\n\tx: string | number,\n\tpropertyName?: string\n): number | 'auto' | `${number}%` | undefined {\n\tif (typeof x === 'number') {\n\t\treturn x;\n\t}\n\tif (x === 'auto') {\n\t\treturn 'auto';\n\t}\n\tif (x.endsWith('%')) {\n\t\tconst percentageValue = parseFloat(x.slice(0, -1));\n\t\tif (isNaN(percentageValue)) {\n\t\t\tconsole.warn(\n\t\t\t\t`Invalid value \"${x}\"${\n\t\t\t\t\ttypeof propertyName === 'string'\n\t\t\t\t\t\t? ` for \"${propertyName}\"`\n\t\t\t\t\t\t: ''\n\t\t\t\t}. Expected a percentage value (e.g., \"50%\").`\n\t\t\t);\n\t\t\treturn undefined;\n\t\t}\n\t\treturn `${percentageValue}%`;\n\t}\n\n\tconsole.warn(\n\t\t`Invalid value \"${x}\"${\n\t\t\ttypeof propertyName === 'string' ? ` for \"${propertyName}\"` : ''\n\t\t}. Expected a number, \"auto\", or a percentage value (e.g., \"50%\").`\n\t);\n\treturn undefined;\n}\n\nexport function splitByBreakOpportunities(\n\tcontent: string,\n\twordBreak: string\n): {\n\twords: string[];\n\trequiredBreaks: boolean[];\n} {\n\tif (wordBreak === 'break-all') {\n\t\treturn { words: segment(content, 'grapheme'), requiredBreaks: [] };\n\t}\n\n\tif (wordBreak === 'keep-all') {\n\t\treturn { words: segment(content, 'word'), requiredBreaks: [] };\n\t}\n\n\tconst breaker = new LineBreaker(content);\n\tlet last = 0;\n\tlet bk = breaker.nextBreak();\n\tconst words = [];\n\tconst requiredBreaks = [false];\n\n\twhile (bk) {\n\t\tconst word = content.slice(last, bk.position);\n\t\twords.push(word);\n\n\t\tif (bk.required) {\n\t\t\trequiredBreaks.push(true);\n\t\t} else {\n\t\t\trequiredBreaks.push(false);\n\t\t}\n\n\t\tlast = bk.position;\n\t\tbk = breaker.nextBreak();\n\t}\n\n\treturn { words, requiredBreaks };\n}\n\nexport const midline = (s: string) => {\n\treturn s.replaceAll(\n\t\t/([A-Z])/g,\n\t\t(_, letter: string) => `-${letter.toLowerCase()}`\n\t);\n};\n\nexport function splitEffects(\n\tinput: string,\n\tseparator: string | RegExp = ','\n): string[] {\n\tconst result = [];\n\tlet l = 0;\n\tlet parenCount = 0;\n\tseparator = new RegExp(separator);\n\n\tfor (let i = 0; i < input.length; i++) {\n\t\tif (input[i] === '(') {\n\t\t\tparenCount++;\n\t\t} else if (input[i] === ')') {\n\t\t\tparenCount--;\n\t\t}\n\n\t\tif (parenCount === 0 && separator.test(input[i])) {\n\t\t\tresult.push(input.slice(l, i).trim());\n\t\t\tl = i + 1;\n\t\t}\n\t}\n\n\tresult.push(input.slice(l).trim());\n\n\treturn result;\n}\n","var e=(t,r)=>()=>(r||t((r={exports:{}}).exports,r),r.exports);var u=e((k,g)=>{g.exports=[\"em\",\"ex\",\"ch\",\"rem\",\"vh\",\"vw\",\"vmin\",\"vmax\",\"px\",\"mm\",\"cm\",\"in\",\"pt\",\"pc\",\"mozmm\"]});var a=e((z,v)=>{v.exports=[\"deg\",\"grad\",\"rad\",\"turn\"]});var c=e((L,w)=>{w.exports=[\"dpi\",\"dpcm\",\"dppx\"]});var h=e(($,y)=>{y.exports=[\"Hz\",\"kHz\"]});var m=e((j,b)=>{b.exports=[\"s\",\"ms\"]});var q=u(),f=a(),p=c(),l=h(),d=m();function s(t){if(/\\.\\D?$/.test(t))throw new Error(\"The dot should be followed by a number\");if(/^[+-]{2}/.test(t))throw new Error(\"Only one leading +/- is allowed\");if(x(t)>1)throw new Error(\"Only one dot is allowed\");if(/%$/.test(t)){this.type=\"percentage\",this.value=o(t),this.unit=\"%\";return}var r=O(t);if(!r){this.type=\"number\",this.value=o(t);return}this.type=F(r),this.value=o(t.substr(0,t.length-r.length)),this.unit=r}s.prototype.valueOf=function(){return this.value};s.prototype.toString=function(){return this.value+(this.unit||\"\")};function U(t){return new s(t)}function x(t){var r=t.match(/\\./g);return r?r.length:0}function o(t){var r=parseFloat(t);if(isNaN(r))throw new Error(\"Invalid number: \"+t);return r}var E=[].concat(f,l,q,p,d);function O(t){var r=t.match(/\\D+$/),n=r&&r[0];if(n&&E.indexOf(n)===-1)throw new Error(\"Invalid unit: \"+n);return n}var D=Object.assign(i(f,\"angle\"),i(l,\"frequency\"),i(p,\"resolution\"),i(d,\"time\"));function i(t,r){return Object.fromEntries(t.map(n=>[n,r]))}function F(t){return D[t]||\"length\"}export{U as default};\n","import { type Yoga } from 'yoga-layout/load';\nimport { type Node } from 'yoga-layout';\nimport { type InitInput } from './yoga.external.js';\n\nexport { Yoga as TYoga, Node as YogaNode, type InitInput };\n\nexport function init(input: InitInput) {\n\tif (process.env.SATORI_STANDALONE === '1') {\n\t\treturn import('./yoga.external.js').then(mod => mod.init(input));\n\t} else {\n\t\t// Do nothing. It's bundled.\n\t}\n}\n\nexport function getYoga() {\n\tif (process.env.SATORI_STANDALONE === '1') {\n\t\treturn import('./yoga.external.js').then(mod => mod.getYoga());\n\t} else {\n\t\treturn import('./yoga.bundled.js').then(mod => mod.getYoga());\n\t}\n}\n\nif (process.env.SATORI_STANDALONE !== '1') {\n\t// Preload Yoga in bundled mode.\n\timport('./yoga.bundled.js');\n}\n","/**\n * This module is used to fetch image from the given URL and resolve it as\n * base64 inlined data URI, so the toolchain can process it.\n * The image data will be cached in a LRU so we don't need to fetch it again\n * in new render processes. But to invalidate the cache the workaround is to\n * add a random query string to the URL.\n * TODO: We might want another option to disable image caching by default.\n */\n\nconst AVIF = 'image/avif';\nconst WEBP = 'image/webp';\nconst APNG = 'image/apng';\nconst PNG = 'image/png';\nconst JPEG = 'image/jpeg';\nconst GIF = 'image/gif';\nconst SVG = 'image/svg+xml';\n\nfunction parseJPEG(buf: ArrayBuffer) {\n\tconst view = new DataView(buf);\n\n\t// Skip magic bytes\n\tlet offset = 4;\n\n\tconst len = view.byteLength;\n\twhile (offset < len) {\n\t\tconst i = view.getUint16(offset, false);\n\n\t\tif (i > len) {\n\t\t\tthrow new TypeError('Invalid JPEG');\n\t\t}\n\n\t\tconst next = view.getUint8(i + 1 + offset);\n\t\tif (next === 0xc0 || next === 0xc1 || next === 0xc2) {\n\t\t\treturn [\n\t\t\t\tview.getUint16(i + 7 + offset, false),\n\t\t\t\tview.getUint16(i + 5 + offset, false)\n\t\t\t] as [number, number];\n\t\t}\n\n\t\t// TODO: Support orientations from EXIF.\n\n\t\toffset += i + 2;\n\t}\n\n\tthrow new TypeError('Invalid JPEG');\n}\n\nfunction parseGIF(buf: ArrayBuffer) {\n\tconst view = new Uint8Array(buf.slice(6, 10));\n\treturn [view[0] | (view[1] << 8), view[2] | (view[3] << 8)] as [\n\t\tnumber,\n\t\tnumber\n\t];\n}\n\nfunction parsePNG(buf: ArrayBuffer) {\n\tconst v = new DataView(buf);\n\treturn [v.getUint16(18, false), v.getUint16(22, false)] as [number, number];\n}\n\nimport { createLRU, parseViewBox } from '../utils.js';\n\ntype ResolvedImageData = [string, number?, number?] | readonly [];\nexport const cache = createLRU<ResolvedImageData>(500);\nexport const inflightRequests = new Map<string, Promise<ResolvedImageData>>();\n\nconst ALLOWED_IMAGE_TYPES = [PNG, APNG, JPEG, GIF, SVG];\n\n// Pre-compiled regex patterns for SVG parsing\nconst SVG_ATTRS_REGEX = /<svg[^>]*>/i;\nconst VIEWBOX_REGEX = /viewBox=['\"]([^'\"]+)['\"]/;\nconst WIDTH_REGEX = /width=['\"](\\d*\\.?\\d+)['\"]/;\nconst HEIGHT_REGEX = /height=['\"](\\d*\\.?\\d+)['\"]/;\n\nfunction arrayBufferToBase64(buffer) {\n\tconst bytes = new Uint8Array(buffer);\n\tconst CHUNK_SIZE = 0x8000; // 32KB chunks\n\tlet binary = '';\n\n\tfor (let i = 0; i < bytes.length; i += CHUNK_SIZE) {\n\t\tconst chunk = bytes.subarray(i, Math.min(i + CHUNK_SIZE, bytes.length));\n\t\tbinary += String.fromCharCode(...chunk);\n\t}\n\n\treturn btoa(binary);\n}\n\nfunction base64ToArrayBuffer(base64: string): ArrayBuffer {\n\tlet binaryString = atob(base64);\n\tlet len = binaryString.length;\n\tlet bytes = new Uint8Array(len);\n\tfor (let i = 0; i < len; i++) {\n\t\tbytes[i] = binaryString.charCodeAt(i);\n\t}\n\treturn bytes.buffer;\n}\n\nfunction parseSvgImageSize(src: string, data: string) {\n\t// Parse the SVG image size\n\tconst svgMatch = data.match(SVG_ATTRS_REGEX);\n\tif (!svgMatch) throw new Error(`Failed to parse SVG from ${src}`);\n\n\tconst svgTag = svgMatch[0];\n\tconst viewBoxMatch = VIEWBOX_REGEX.exec(svgTag);\n\tconst widthMatch = WIDTH_REGEX.exec(svgTag);\n\tconst heightMatch = HEIGHT_REGEX.exec(svgTag);\n\n\tlet viewBox = viewBoxMatch ? parseViewBox(viewBoxMatch[1]) : null;\n\n\tif (!viewBox && (!widthMatch || !heightMatch)) {\n\t\tthrow new Error(`Failed to parse SVG from ${src}: missing \"viewBox\"`);\n\t}\n\n\tconst size = viewBox\n\t\t? [viewBox[2], viewBox[3]]\n\t\t: [+widthMatch[1], +heightMatch[1]];\n\n\tconst ratio = size[0] / size[1];\n\tconst imageSize: [number, number] =\n\t\twidthMatch && heightMatch\n\t\t\t? [+widthMatch[1], +heightMatch[1]]\n\t\t\t: widthMatch\n\t\t\t? [+widthMatch[1], +widthMatch[1] / ratio]\n\t\t\t: heightMatch\n\t\t\t? [+heightMatch[1] * ratio, +heightMatch[1]]\n\t\t\t: [size[0], size[1]];\n\n\treturn imageSize;\n}\n\nfunction arrayBufferToDataUri(data: ArrayBuffer) {\n\tlet imageSize: [number, number];\n\n\tconst imageType = detectContentType(new Uint8Array(data));\n\n\tswitch (imageType) {\n\t\tcase PNG:\n\t\tcase APNG:\n\t\t\timageSize = parsePNG(data);\n\t\t\tbreak;\n\t\tcase GIF:\n\t\t\timageSize = parseGIF(data);\n\t\t\tbreak;\n\t\tcase JPEG:\n\t\t\timageSize = parseJPEG(data);\n\t\t\tbreak;\n\t}\n\n\tif (!ALLOWED_IMAGE_TYPES.includes(imageType)) {\n\t\tthrow new Error(`Unsupported image type: ${imageType || 'unknown'}`);\n\t}\n\treturn [\n\t\t`data:${imageType};base64,${arrayBufferToBase64(data)}`,\n\t\timageSize\n\t] as const;\n}\n\nexport async function resolveImageData(\n\tsrc: string | ArrayBuffer\n): Promise<ResolvedImageData> {\n\tif (!src) {\n\t\tthrow new Error('Image source is not provided.');\n\t}\n\n\t// ArrayBuffer\n\tif (typeof src === 'object') {\n\t\tconst [newSrc, imageSize] = arrayBufferToDataUri(src);\n\t\treturn [newSrc, ...imageSize] as ResolvedImageData;\n\t}\n\n\tif (\n\t\t(src.startsWith('\"') && src.endsWith('\"')) ||\n\t\t(src.startsWith(\"'\") && src.endsWith(\"'\"))\n\t) {\n\t\tsrc = src.slice(1, -1);\n\t}\n\n\t// Throw error if the image source is not an absolute URL in server environment\n\t// Should be after slicing quotes to avoid throwing error too early\n\tif (typeof window === 'undefined') {\n\t\tif (!src.startsWith('http') && !src.startsWith('data:')) {\n\t\t\tthrow new Error(`Image source must be an absolute URL: ${src}`);\n\t\t}\n\t}\n\n\tif (src.startsWith('data:')) {\n\t\tlet decodedURI: { imageType; encodingType; dataString };\n\n\t\ttry {\n\t\t\tdecodedURI =\n\t\t\t\t/data:(?<imageType>[a-z/+]+)(;[^;=]+=[^;=]+)*?(;(?<encodingType>[^;,]+))?,(?<dataString>.*)/g.exec(\n\t\t\t\t\tsrc\n\t\t\t\t).groups as typeof decodedURI;\n\t\t} catch (err) {\n\t\t\tconsole.warn('Image data URI resolved without size:' + src);\n\t\t\treturn [src];\n\t\t}\n\n\t\tconst { imageType, encodingType, dataString } = decodedURI;\n\t\tif (imageType === SVG) {\n\t\t\tconst utf8Src =\n\t\t\t\tencodingType === 'base64'\n\t\t\t\t\t? atob(dataString)\n\t\t\t\t\t: decodeURIComponent(dataString.replace(/ /g, '%20'));\n\t\t\tconst base64Src =\n\t\t\t\tencodingType === 'base64'\n\t\t\t\t\t? src\n\t\t\t\t\t: `data:image/svg+xml;base64,${btoa(utf8Src)}`;\n\t\t\tlet imageSize = parseSvgImageSize(src, utf8Src);\n\t\t\tcache.set(src, [base64Src, ...imageSize]);\n\t\t\treturn [base64Src, ...imageSize];\n\t\t} else if (encodingType === 'base64') {\n\t\t\tlet imageSize: [number, number];\n\t\t\tconst data = base64ToArrayBuffer(dataString);\n\t\t\tswitch (imageType) {\n\t\t\t\tcase PNG:\n\t\t\t\tcase APNG:\n\t\t\t\t\timageSize = parsePNG(data);\n\t\t\t\t\tbreak;\n\t\t\t\tcase GIF:\n\t\t\t\t\timageSize = parseGIF(data);\n\t\t\t\t\tbreak;\n\t\t\t\tcase JPEG:\n\t\t\t\t\timageSize = parseJPEG(data);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcache.set(src, [src, ...imageSize]);\n\t\t\treturn [src, ...imageSize];\n\t\t} else {\n\t\t\tconsole.warn('Image data URI resolved without size:' + src);\n\t\t\tcache.set(src, [src]);\n\t\t\treturn [src];\n\t\t}\n\t}\n\n\tif (!globalThis.fetch) {\n\t\tthrow new Error('`fetch` is required to be polyfilled to load images.');\n\t}\n\n\tif (inflightRequests.has(src)) {\n\t\treturn inflightRequests.get(src);\n\t}\n\tconst cached = cache.get(src);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tconst url = src;\n\tconst promise = fetch(url)\n\t\t.then((res): Promise<string | ArrayBuffer> => {\n\t\t\tconst type = res.headers.get('content-type');\n\n\t\t\t// Handle SVG specially\n\t\t\tif (type === 'image/svg+xml' || type === 'application/svg+xml') {\n\t\t\t\treturn res.text();\n\t\t\t}\n\n\t\t\treturn res.arrayBuffer();\n\t\t})\n\t\t.then(data => {\n\t\t\tif (typeof data === 'string') {\n\t\t\t\ttry {\n\t\t\t\t\tconst newSrc = `data:image/svg+xml;base64,${btoa(data)}`;\n\t\t\t\t\t// Parse the SVG image size\n\t\t\t\t\tconst imageSize = parseSvgImageSize(url, data);\n\t\t\t\t\treturn [newSrc, ...imageSize] as ResolvedImageData;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthrow new Error(`Failed to parse SVG image: ${e.message}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst [newSrc, imageSize] = arrayBufferToDataUri(data);\n\t\t\treturn [newSrc, ...imageSize] as ResolvedImageData;\n\t\t})\n\t\t.then(result => {\n\t\t\tcache.set(url, result);\n\t\t\treturn result;\n\t\t})\n\t\t.catch(err => {\n\t\t\tconsole.error(`Can't load image ${url}: ` + err.message);\n\t\t\tcache.set(url, []);\n\t\t\treturn [] as const;\n\t\t});\n\n\tinflightRequests.set(url, promise);\n\treturn promise;\n}\n\n/**\n * Inspects the first few bytes of a buffer to determine if\n * it matches the \"magic number\" of known file signatures.\n * https://en.wikipedia.org/wiki/List_of_file_signatures\n */\nfunction detectContentType(buffer: Uint8Array) {\n\tif ([0xff, 0xd8, 0xff].every((b, i) => buffer[i] === b)) {\n\t\treturn JPEG;\n\t}\n\tif (\n\t\t[0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a].every(\n\t\t\t(b, i) => buffer[i] === b\n\t\t)\n\t) {\n\t\tif (detectAPNG(buffer)) {\n\t\t\treturn APNG;\n\t\t}\n\t\treturn PNG;\n\t}\n\tif ([0x47, 0x49, 0x46, 0x38].every((b, i) => buffer[i] === b)) {\n\t\treturn GIF;\n\t}\n\tif (\n\t\t[0x52, 0x49, 0x46, 0x46, 0, 0, 0, 0, 0x57, 0x45, 0x42, 0x50].every(\n\t\t\t(b, i) => !b || buffer[i] === b\n\t\t)\n\t) {\n\t\treturn WEBP;\n\t}\n\tif ([0x3c, 0x3f, 0x78, 0x6d, 0x6c].every((b, i) => buffer[i] === b)) {\n\t\treturn SVG;\n\t}\n\tif (\n\t\t[0, 0, 0, 0, 0x66, 0x74, 0x79, 0x70, 0x61, 0x76, 0x69, 0x66].every(\n\t\t\t(b, i) => !b || buffer[i] === b\n\t\t)\n\t) {\n\t\treturn AVIF;\n\t}\n\treturn null;\n}\n\nfunction detectAPNG(bytes: Uint8Array) {\n\tconst dv = new DataView(bytes.buffer);\n\tlet type: string,\n\t\tlength: number,\n\t\toff = 8,\n\t\tisAPNG = false;\n\twhile (!isAPNG && type !== 'IEND' && off < bytes.length) {\n\t\tlength = dv.getUint32(off);\n\t\tconst chars = bytes.subarray(off + 4, off + 8);\n\t\ttype = String.fromCharCode(...chars);\n\t\tisAPNG = type === 'acTL';\n\t\toff += 12 + length;\n\t}\n\treturn isAPNG;\n}\n","import type { ReactElement, ReactNode } from 'react';\nimport { resolveImageData, cache } from './image.js';\nimport { isReactElement, parseViewBox, midline } from '../utils.js';\n\n// Based on\n// https://raw.githubusercontent.com/facebook/react/master/packages/react-dom/src/shared/possibleStandardNames.js\nconst ATTRIBUTE_MAPPING = {\n\taccentHeight: 'accent-height',\n\talignmentBaseline: 'alignment-baseline',\n\tarabicForm: 'arabic-form',\n\tbaselineShift: 'baseline-shift',\n\tcapHeight: 'cap-height',\n\tclipPath: 'clip-path',\n\tclipRule: 'clip-rule',\n\tcolorInterpolation: 'color-interpolation',\n\tcolorInterpolationFilters: 'color-interpolation-filters',\n\tcolorProfile: 'color-profile',\n\tcolorRendering: 'color-rendering',\n\tdominantBaseline: 'dominant-baseline',\n\tenableBackground: 'enable-background',\n\tfillOpacity: 'fill-opacity',\n\tfillRule: 'fill-rule',\n\tfloodColor: 'flood-color',\n\tfloodOpacity: 'flood-opacity',\n\tfontFamily: 'font-family',\n\tfontSize: 'font-size',\n\tfontSizeAdjust: 'font-size-adjust',\n\tfontStretch: 'font-stretch',\n\tfontStyle: 'font-style',\n\tfontVariant: 'font-variant',\n\tfontWeight: 'font-weight',\n\tglyphName: 'glyph-name',\n\tglyphOrientationHorizontal: 'glyph-orientation-horizontal',\n\tglyphOrientationVertical: 'glyph-orientation-vertical',\n\thorizAdvX: 'horiz-adv-x',\n\thorizOriginX: 'horiz-origin-x',\n\thref: 'href',\n\timageRendering: 'image-rendering',\n\tletterSpacing: 'letter-spacing',\n\tlightingColor: 'lighting-color',\n\tmarkerEnd: 'marker-end',\n\tmarkerMid: 'marker-mid',\n\tmarkerStart: 'marker-start',\n\toverlinePosition: 'overline-position',\n\toverlineThickness: 'overline-thickness',\n\tpaintOrder: 'paint-order',\n\tpanose1: 'panose-1',\n\tpointerEvents: 'pointer-events',\n\trenderingIntent: 'rendering-intent',\n\tshapeRendering: 'shape-rendering',\n\tstopColor: 'stop-color',\n\tstopOpacity: 'stop-opacity',\n\tstrikethroughPosition: 'strikethrough-position',\n\tstrikethroughThickness: 'strikethrough-thickness',\n\tstrokeDasharray: 'stroke-dasharray',\n\tstrokeDashoffset: 'stroke-dashoffset',\n\tstrokeLinecap: 'stroke-linecap',\n\tstrokeLinejoin: 'stroke-linejoin',\n\tstrokeMiterlimit: 'stroke-miterlimit',\n\tstrokeOpacity: 'stroke-opacity',\n\tstrokeWidth: 'stroke-width',\n\ttextAnchor: 'text-anchor',\n\ttextDecoration: 'text-decoration',\n\ttextRendering: 'text-rendering',\n\tunderlinePosition: 'underline-position',\n\tunderlineThickness: 'underline-thickness',\n\tunicodeBidi: 'unicode-bidi',\n\tunicodeRange: 'unicode-range',\n\tunitsPerEm: 'units-per-em',\n\tvAlphabetic: 'v-alphabetic',\n\tvHanging: 'v-hanging',\n\tvIdeographic: 'v-ideographic',\n\tvMathematical: 'v-mathematical',\n\tvectorEffect: 'vector-effect',\n\tvertAdvY: 'vert-adv-y',\n\tvertOriginX: 'vert-origin-x',\n\tvertOriginY: 'vert-origin-y',\n\twordSpacing: 'word-spacing',\n\twritingMode: 'writing-mode',\n\txHeight: 'x-height',\n\txlinkActuate: 'xlink:actuate',\n\txlinkArcrole: 'xlink:arcrole',\n\txlinkHref: 'xlink:href',\n\txlinkRole: 'xlink:role',\n\txlinkShow: 'xlink:show',\n\txlinkTitle: 'xlink:title',\n\txlinkType: 'xlink:type',\n\txmlBase: 'xml:base',\n\txmlLang: 'xml:lang',\n\txmlSpace: 'xml:space',\n\txmlnsXlink: 'xmlns:xlink'\n} as const;\n\n// From https://github.com/yoksel/url-encoder/blob/master/src/js/script.js\nconst SVGSymbols = /[\\r\\n%#()<>?[\\\\\\]^`{|}\"']/g;\n\nfunction translateSVGNodeToSVGString(\n\tnode: ReactElement | string | (ReactElement | string)[],\n\tinheritedColor: string\n): string {\n\tif (!node) return '';\n\tif (Array.isArray(node)) {\n\t\treturn node\n\t\t\t.map(n => translateSVGNodeToSVGString(n, inheritedColor))\n\t\t\t.join('');\n\t}\n\tif (typeof node !== 'object') return String(node);\n\n\tconst type = node.type;\n\tif (type === 'text') {\n\t\tthrow new Error(\n\t\t\t'<text> nodes are not currently supported, please convert them to <path>'\n\t\t);\n\t}\n\n\tconst { children, style, ...restProps } = node.props || {};\n\tconst currentColor = style?.color || inheritedColor;\n\n\tconst attrs = `${Object.entries(restProps)\n\t\t.map(([k, _v]) => {\n\t\t\tif (typeof _v === 'string' && _v.toLowerCase() === 'currentcolor') {\n\t\t\t\t_v = currentColor;\n\t\t\t}\n\n\t\t\tif ((k === 'href' || k === 'xlinkHref') && type === 'image') {\n\t\t\t\treturn ` ${ATTRIBUTE_MAPPING[k] || k}=\"${\n\t\t\t\t\tcache.get(_v as string)[0]\n\t\t\t\t}\"`;\n\t\t\t}\n\t\t\treturn ` ${ATTRIBUTE_MAPPING[k] || k}=\"${_v}\"`;\n\t\t})\n\t\t.join('')}`;\n\n\tconst styles = style\n\t\t? ` style=\"${Object.entries(style)\n\t\t\t\t.map(([k, _v]) => `${midline(k)}:${_v}`)\n\t\t\t\t.join(';')}\"`\n\t\t: '';\n\n\treturn `<${type}${attrs}${styles}>${translateSVGNodeToSVGString(\n\t\tchildren,\n\t\tcurrentColor\n\t)}</${type}>`;\n}\n/**\n * pre process node and resolve absolute link to img data for image element\n * @param node ReactNode\n * @returns\n */\nexport async function preProcessNode(node: ReactNode) {\n\tconst set = new Set<string | Buffer | ArrayBuffer>();\n\tconst walk = (_node: ReactNode) => {\n\t\tif (!_node) return;\n\t\tif (!isReactElement(_node)) return;\n\n\t\tif (Array.isArray(_node)) {\n\t\t\t_node.forEach(v => walk(v));\n\t\t\treturn;\n\t\t} else if (typeof _node === 'object') {\n\t\t\tif (_node.type === 'image') {\n\t\t\t\tconst imageSrc = _node.props.href || _node.props.xlinkHref;\n\t\t\t\tif (imageSrc) {\n\t\t\t\t\tif (set.has(imageSrc)) {\n\t\t\t\t\t\t// do nothing\n\t\t\t\t\t} else {\n\t\t\t\t\t\tset.add(imageSrc);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (_node.type === 'img') {\n\t\t\t\tif (set.has(_node.props.src)) {\n\t\t\t\t\t// do nothing\n\t\t\t\t} else {\n\t\t\t\t\tset.add(_node.props.src);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// do nothing\n\t\t\t}\n\t\t}\n\n\t\tArray.isArray(_node.props.children)\n\t\t\t? _node.props.children.map(c => walk(c))\n\t\t\t: walk(_node.props.children);\n\t};\n\n\twalk(node);\n\n\treturn Promise.all(Array.from(set).map(s => resolveImageData(s)));\n}\n\nexport async function SVGNodeToImage(\n\tnode: ReactElement,\n\tinheritedColor: string\n): Promise<string> {\n\tlet {\n\t\tviewBox,\n\t\tviewbox,\n\t\twidth,\n\t\theight,\n\t\tclassName,\n\t\tstyle,\n\t\tchildren,\n\t\t...restProps\n\t} = node.props || {};\n\n\tviewBox ||= viewbox;\n\n\t// We directly assign the xmlns attribute here to deduplicate.\n\trestProps.xmlns = 'http://www.w3.org/2000/svg';\n\n\tconst currentColor = style?.color || inheritedColor;\n\tconst viewBoxSize = parseViewBox(viewBox);\n\n\t// ratio = height / width\n\tconst ratio = viewBoxSize ? viewBoxSize[3] / viewBoxSize[2] : null;\n\twidth = width || (ratio && height) ? height / ratio : null;\n\theight = height || (ratio && width) ? width * ratio : null;\n\n\trestProps.width = width;\n\trestProps.height = height;\n\tif (viewBox) restProps.viewBox = viewBox;\n\n\treturn `data:image/svg+xml;utf8,${`<svg ${Object.entries(restProps)\n\t\t.map(([k, _v]) => {\n\t\t\tif (typeof _v === 'string' && _v.toLowerCase() === 'currentcolor') {\n\t\t\t\t_v = currentColor;\n\t\t\t}\n\t\t\treturn ` ${ATTRIBUTE_MAPPING[k] || k}=\"${_v}\"`;\n\t\t})\n\t\t.join('')}>${translateSVGNodeToSVGString(\n\t\tchildren,\n\t\tcurrentColor\n\t)}</svg>`.replace(SVGSymbols, encodeURIComponent)}`;\n}\n","/**\n * Pre-defined styles for elements. Here we hand pick some from Chromium's\n * default styles:\n * https://chromium.googlesource.com/chromium/blink/+/master/Source/core/css/html.css\n *\n * We try to only include commonly used, styling elements rather than semantic elements.\n */\n\nconst DEFAULT_DISPLAY = 'flex';\n\nexport default {\n\t// Generic block-level elements\n\tp: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tmarginTop: '1em',\n\t\tmarginBottom: '1em'\n\t},\n\tdiv: {\n\t\tdisplay: DEFAULT_DISPLAY\n\t},\n\tblockquote: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tmarginTop: '1em',\n\t\tmarginBottom: '1em',\n\t\tmarginLeft: 40,\n\t\tmarginRight: 40\n\t},\n\tcenter: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\ttextAlign: 'center'\n\t},\n\thr: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tmarginTop: '0.5em',\n\t\tmarginBottom: '0.5em',\n\t\tmarginLeft: 'auto',\n\t\tmarginRight: 'auto',\n\t\tborderWidth: 1,\n\t\t// We don't have `inset`\n\t\tborderStyle: 'solid'\n\t},\n\t// Heading elements\n\th1: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tfontSize: '2em',\n\t\tmarginTop: '0.67em',\n\t\tmarginBottom: '0.67em',\n\t\tmarginLeft: 0,\n\t\tmarginRight: 0,\n\t\tfontWeight: 'bold'\n\t},\n\th2: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tfontSize: '1.5em',\n\t\tmarginTop: '0.83em',\n\t\tmarginBottom: '0.83em',\n\t\tmarginLeft: 0,\n\t\tmarginRight: 0,\n\t\tfontWeight: 'bold'\n\t},\n\th3: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tfontSize: '1.17em',\n\t\tmarginTop: '1em',\n\t\tmarginBottom: '1em',\n\t\tmarginLeft: 0,\n\t\tmarginRight: 0,\n\t\tfontWeight: 'bold'\n\t},\n\th4: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tmarginTop: '1.33em',\n\t\tmarginBottom: '1.33em',\n\t\tmarginLeft: 0,\n\t\tmarginRight: 0,\n\t\tfontWeight: 'bold'\n\t},\n\th5: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tfontSize: '0.83em',\n\t\tmarginTop: '1.67em',\n\t\tmarginBottom: '1.67em',\n\t\tmarginLeft: 0,\n\t\tmarginRight: 0,\n\t\tfontWeight: 'bold'\n\t},\n\th6: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tfontSize: '0.67em',\n\t\tmarginTop: '2.33em',\n\t\tmarginBottom: '2.33em',\n\t\tmarginLeft: 0,\n\t\tmarginRight: 0,\n\t\tfontWeight: 'bold'\n\t},\n\t// Tables\n\t// Lists\n\t// Form elements\n\t// Inline elements\n\tu: {\n\t\ttextDecoration: 'underline'\n\t},\n\tstrong: {\n\t\tfontWeight: 'bold'\n\t},\n\tb: {\n\t\tfontWeight: 'bold'\n\t},\n\ti: {\n\t\tfontStyle: 'italic'\n\t},\n\tem: {\n\t\tfontStyle: 'italic'\n\t},\n\tcode: {\n\t\tfontFamily: 'monospace'\n\t},\n\tkbd: {\n\t\tfontFamily: 'monospace'\n\t},\n\tpre: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tfontFamily: 'monospace',\n\t\twhiteSpace: 'pre',\n\t\tmarginTop: '1em',\n\t\tmarginBottom: '1em'\n\t},\n\tmark: {\n\t\tbackgroundColor: 'yellow',\n\t\tcolor: 'black'\n\t},\n\tbig: {\n\t\tfontSize: 'larger'\n\t},\n\tsmall: {\n\t\tfontSize: 'smaller'\n\t},\n\ts: {\n\t\ttextDecoration: 'line-through'\n\t}\n};\n","import { SerializedStyle } from './expand.js';\n\nconst list = new Set([\n\t'color',\n\t'font',\n\t'fontFamily',\n\t'fontSize',\n\t'fontStyle',\n\t'fontWeight',\n\t'letterSpacing',\n\t'lineHeight',\n\t'textAlign',\n\t'textIndent',\n\t'textTransform',\n\t'textShadowOffset',\n\t'textShadowColor',\n\t'textShadowRadius',\n\t'WebkitTextStrokeWidth',\n\t'WebkitTextStrokeColor',\n\t'textDecorationLine',\n\t'textDecorationStyle',\n\t'textDecorationColor',\n\t'textDecorationSkipInk',\n\t'whiteSpace',\n\t'transform',\n\t'wordBreak',\n\t'tabSize',\n\n\t// Special case: SVG doesn't apply these to children elements so we need to\n\t// make it inheritable here.\n\t'opacity',\n\t'filter',\n\n\t// Special properties of Satori:\n\t'_viewportWidth',\n\t'_viewportHeight',\n\t'_inheritedClipPathId',\n\t'_inheritedMaskId',\n\t'_inheritedBackgroundClipTextPath',\n\t'_inheritedBackgroundClipTextHasBackground'\n]);\n\nexport default function inheritable(style: SerializedStyle): SerializedStyle {\n\tconst inheritedStyle: SerializedStyle = {};\n\tfor (const prop in style) {\n\t\t// CSS custom properties (--*) always inherit\n\t\tif (list.has(prop) || prop.startsWith('--')) {\n\t\t\tinheritedStyle[prop] = style[prop];\n\t\t}\n\t}\n\treturn inheritedStyle;\n}\n","/**\n * This module expands the CSS properties to get rid of shorthands, as well as\n * cleaning up some properties.\n */\n\nimport { getPropertyName, getStylesForProperty } from 'css-to-react-native';\nimport { parseElementStyle } from 'css-background-parser';\nimport { parse as parseBoxShadow } from 'css-box-shadow';\nimport cssColorParse from 'parse-css-color';\n\nimport CssDimension from '../vendor/parse-css-dimension/index.js';\nimport parseTransformOrigin, {\n\tParsedTransformOrigin\n} from '../transform-origin.js';\nimport { isString, lengthToNumber, v, splitEffects } from '../utils.js';\nimport { MaskProperty, parseMask } from '../parser/mask.js';\nimport { FontWeight, FontStyle } from '../font.js';\nimport {\n\textractCustomProperties,\n\tmergeVariables,\n\tresolveVariables,\n\tCSSVariables\n} from './variables.js';\n\n// https://react-cn.github.io/react/tips/style-props-value-px.html\nconst optOutPx = new Set([\n\t'flex',\n\t'flexGrow',\n\t'flexShrink',\n\t'flexBasis',\n\t'fontWeight',\n\t'lineHeight',\n\t'opacity',\n\t'scale',\n\t'scaleX',\n\t'scaleY'\n]);\nconst keepNumber = new Set(['lineHeight']);\n\nfunction handleFallbackColor(\n\tprop: string,\n\tparsed: Record<string, string>,\n\trawInput: string,\n\tcurrentColor: string\n) {\n\tif (\n\t\tprop === 'textDecoration' &&\n\t\t!rawInput.includes(parsed.textDecorationColor)\n\t) {\n\t\tparsed.textDecorationColor = currentColor;\n\t}\n\treturn parsed;\n}\n\nfunction purify(name: string, value?: string | number) {\n\tconst num = Number(value);\n\tif (isNaN(num)) return value;\n\tif (!optOutPx.has(name)) return num + 'px';\n\tif (keepNumber.has(name)) return num;\n\treturn String(value);\n}\n\nfunction handleSpecialCase(\n\tname: string,\n\tvalue: string | number,\n\tcurrentColor: string\n) {\n\tif (name === 'zIndex') {\n\t\tconsole.warn('`z-index` is currently not supported.');\n\t\treturn { [name]: value };\n\t}\n\n\tif (name === 'lineHeight') {\n\t\treturn { lineHeight: purify(name, value) };\n\t}\n\n\tif (name === 'fontFamily') {\n\t\treturn {\n\t\t\tfontFamily: (value as string).split(',').map(_v => {\n\t\t\t\treturn _v\n\t\t\t\t\t.trim()\n\t\t\t\t\t.replace(/(^['\"])|(['\"]$)/g, '')\n\t\t\t\t\t.toLocaleLowerCase();\n\t\t\t})\n\t\t};\n\t}\n\n\tif (name === 'borderRadius') {\n\t\tif (typeof value !== 'string' || !value.includes('/')) {\n\t\t\t// Regular border radius\n\t\t\treturn;\n\t\t}\n\t\t// Support the `border-radius: 10px / 20px` syntax.\n\t\tconst [horizontal, vertical] = value.split('/');\n\t\tconst vh = getStylesForProperty(name, horizontal, true);\n\t\tconst vv = getStylesForProperty(name, vertical, true);\n\t\tfor (const k in vh) {\n\t\t\tvv[k] = purify(name, vh[k]) + ' ' + purify(name, vv[k]);\n\t\t}\n\t\treturn vv;\n\t}\n\n\tif (/^border(Top|Right|Bottom|Left)?$/.test(name)) {\n\t\tconst resolved = getStylesForProperty('border', value, true);\n\n\t\t// Border width should be default to 3px (medium) instead of 1px:\n\t\t// https://w3c.github.io/csswg-drafts/css-backgrounds-3/#border-width\n\t\t// Although on Chrome it will be displayed as 1.5px but let's stick to the\n\t\t// spec.\n\t\tif (resolved.borderWidth === 1 && !String(value).includes('1px')) {\n\t\t\tresolved.borderWidth = 3;\n\t\t}\n\n\t\t// A trick to fix `border: 1px solid` to not use `black` but the inherited\n\t\t// `color` value. This is necessary because css-to-react-native automatically\n\t\t// fallbacks to default color values.\n\t\tif (\n\t\t\tresolved.borderColor === 'black' &&\n\t\t\t!String(value).includes('black')\n\t\t) {\n\t\t\tresolved.borderColor = currentColor;\n\t\t}\n\n\t\tconst purified = {\n\t\t\tWidth: purify(name + 'Width', resolved.borderWidth),\n\t\t\tStyle: v(\n\t\t\t\tresolved.borderStyle,\n\t\t\t\t{\n\t\t\t\t\tsolid: 'solid',\n\t\t\t\t\tdashed: 'dashed'\n\t\t\t\t},\n\t\t\t\t'solid',\n\t\t\t\tname + 'Style'\n\t\t\t),\n\t\t\tColor: resolved.borderColor\n\t\t};\n\n\t\tconst full = {};\n\t\tfor (const k of name === 'border'\n\t\t\t? ['Top', 'Right', 'Bottom', 'Left']\n\t\t\t: [name.slice(6)]) {\n\t\t\tfor (const p in purified) {\n\t\t\t\tfull['border' + k + p] = purified[p];\n\t\t\t}\n\t\t}\n\t\treturn full;\n\t}\n\n\tif (name === 'boxShadow') {\n\t\tif (!value) {\n\t\t\tthrow new Error('Invalid `boxShadow` value: \"' + value + '\".');\n\t\t}\n\t\treturn {\n\t\t\t[name]: typeof value === 'string' ? parseBoxShadow(value) : value\n\t\t};\n\t}\n\n\tif (name === 'transform') {\n\t\tif (typeof value !== 'string')\n\t\t\tthrow new Error('Invalid `transform` value.');\n\t\t// To support percentages in transform (which is not supported in RN), we\n\t\t// replace them with random symbols and then replace them back after parsing.\n\t\tconst symbols = {};\n\t\tconst replaced = value.replace(/(-?[\\d.]+%)/g, (_, _v) => {\n\t\t\tconst symbol = ~~(Math.random() * 1e9);\n\t\t\tsymbols[symbol] = _v;\n\t\t\treturn symbol + 'px';\n\t\t});\n\t\tconst parsed = getStylesForProperty('transform', replaced, true);\n\t\tfor (const t of parsed.transform) {\n\t\t\tfor (const k in t) {\n\t\t\t\tif (symbols[t[k]]) {\n\t\t\t\t\tt[k] = symbols[t[k]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn parsed;\n\t}\n\n\tif (name === 'background') {\n\t\tvalue = value.toString().trim();\n\t\tif (\n\t\t\t/^(linear-gradient|radial-gradient|url|repeating-linear-gradient|repeating-radial-gradient)\\(/.test(\n\t\t\t\tvalue\n\t\t\t)\n\t\t) {\n\t\t\treturn getStylesForProperty('backgroundImage', value, true);\n\t\t}\n\t\treturn getStylesForProperty('background', value, true);\n\t}\n\n\tif (name === 'textShadow') {\n\t\t// Handle multiple text shadows if provided.\n\t\tvalue = value.toString().trim();\n\t\tconst result = {};\n\n\t\tconst shadows = splitEffects(value);\n\n\t\tfor (const shadow of shadows) {\n\t\t\tconst styles = getStylesForProperty('textShadow', shadow, true);\n\t\t\tfor (const k in styles) {\n\t\t\t\tif (!result[k]) {\n\t\t\t\t\tresult[k] = [styles[k]];\n\t\t\t\t} else {\n\t\t\t\t\tresult[k].push(styles[k]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tif (name === 'WebkitTextStroke') {\n\t\tvalue = value.toString().trim();\n\t\tconst values = value.split(' ');\n\t\tif (values.length !== 2) {\n\t\t\tthrow new Error('Invalid `WebkitTextStroke` value.');\n\t\t}\n\n\t\treturn {\n\t\t\tWebkitTextStrokeWidth: purify(name, values[0]),\n\t\t\tWebkitTextStrokeColor: purify(name, values[1])\n\t\t};\n\t}\n\n\tif (name === 'backdropFilter' || name === 'WebkitBackdropFilter') {\n\t\treturn { backdropFilter: value };\n\t}\n\n\tif (name === 'textDecorationSkipInk') {\n\t\tconst normalized = value.toString().trim().toLowerCase();\n\t\tif (!['auto', 'none', 'all'].includes(normalized)) {\n\t\t\tthrow new Error('Invalid `textDecorationSkipInk` value.');\n\t\t}\n\n\t\treturn { textDecorationSkipInk: normalized };\n\t}\n\n\treturn;\n}\n\nfunction getErrorHint(name: string) {\n\tif (name === 'transform') {\n\t\treturn ' Only absolute lengths such as `10px` are supported.';\n\t}\n\treturn '';\n}\n\nconst RGB_SLASH = /rgb\\((\\d+)\\s+(\\d+)\\s+(\\d+)\\s*\\/\\s*([\\.\\d]+)\\)/;\nfunction normalizeColor(value: string | object) {\n\tif (typeof value === 'string') {\n\t\tif (RGB_SLASH.test(value.trim())) {\n\t\t\t// rgb(255 122 127 / .2) -> rgba(255, 122, 127, .2)\n\t\t\treturn value.trim().replace(RGB_SLASH, (_, r, g, b, a) => {\n\t\t\t\treturn `rgba(${r}, ${g}, ${b}, ${a})`;\n\t\t\t});\n\t\t}\n\t}\n\n\t// Recursively normalize colors in arrays and objects.\n\tif (typeof value === 'object' && value !== null) {\n\t\tfor (const k in value) {\n\t\t\tvalue[k] = normalizeColor(value[k]);\n\t\t}\n\t\treturn value;\n\t}\n\n\treturn value;\n}\n\ntype MainStyle = {\n\tcolor: string;\n\tfontSize: number;\n\ttransformOrigin: ParsedTransformOrigin;\n\tmaskImage: MaskProperty[];\n\topacity: number;\n\ttextTransform: string;\n\twhiteSpace: string;\n\twordBreak: string;\n\ttextAlign: string;\n\ttextIndent: number | string;\n\tlineHeight: number | string;\n\tletterSpacing: number;\n\n\tfontFamily: string | string[];\n\tfontWeight: FontWeight;\n\tfontStyle: FontStyle;\n\n\tborderTopWidth: number;\n\tborderLeftWidth: number;\n\tborderRightWidth: number;\n\tborderBottomWidth: number;\n\n\tpaddingTop: number;\n\tpaddingLeft: number;\n\tpaddingRight: number;\n\tpaddingBottom: number;\n\n\tflexGrow: number;\n\tflexShrink: number;\n\n\tgap: number;\n\trowGap: number;\n\tcolumnGap: number;\n\n\ttextShadowOffset: {\n\t\twidth: number;\n\t\theight: number;\n\t}[];\n\ttextShadowColor: string[];\n\ttextShadowRadius: number[];\n\tWebkitTextStrokeWidth: number;\n\tWebkitTextStrokeColor: string;\n\ttextDecorationSkipInk: 'auto' | 'none' | 'all';\n};\n\ntype OtherStyle = Exclude<\n\tRecord<PropertyKey, string | number>,\n\tkeyof MainStyle\n>;\n\nexport type SerializedStyle = Partial<MainStyle & OtherStyle>;\n\nexport default function expand(\n\tstyle: Record<string, string | number> | undefined,\n\tinheritedStyle: SerializedStyle\n): SerializedStyle {\n\tconst serializedStyle: SerializedStyle = {};\n\n\t// Extract inherited CSS variables\n\tconst inheritedVariables: CSSVariables = {};\n\tfor (const prop in inheritedStyle) {\n\t\tif (prop.startsWith('--')) {\n\t\t\tinheritedVariables[prop] = String(inheritedStyle[prop]);\n\t\t}\n\t}\n\n\t// Extract and resolve CSS variables from current style\n\tlet currentVariables: CSSVariables = {};\n\tlet processableStyle = style;\n\n\tif (style) {\n\t\tconst { variables, remainingStyle } = extractCustomProperties(style);\n\t\tcurrentVariables = variables;\n\t\tprocessableStyle = remainingStyle;\n\t}\n\n\t// Merge variables (current overrides inherited)\n\tconst mergedVariables = mergeVariables(\n\t\tinheritedVariables,\n\t\tcurrentVariables\n\t);\n\n\t// Store merged variables in the serialized style for inheritance\n\tfor (const varName in mergedVariables) {\n\t\tserializedStyle[varName] = mergedVariables[varName];\n\t}\n\n\tif (processableStyle) {\n\t\t// Resolve CSS variables in color property before processing\n\t\tconst resolvedColor = processableStyle.color\n\t\t\t? resolveVariables(processableStyle.color, mergedVariables)\n\t\t\t: undefined;\n\n\t\tconst currentColor = getCurrentColor(\n\t\t\tresolvedColor as string,\n\t\t\tinheritedStyle.color\n\t\t);\n\n\t\tserializedStyle.color = currentColor;\n\n\t\tfor (const prop in processableStyle) {\n\t\t\t// Internal properties.\n\t\t\tif (prop.startsWith('_')) {\n\t\t\t\tserializedStyle[prop] = processableStyle[prop];\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (prop === 'color') {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst name = getPropertyName(prop);\n\t\t\t// Resolve CSS variables before preprocessing\n\t\t\tconst resolvedValue = resolveVariables(\n\t\t\t\tprocessableStyle[prop],\n\t\t\t\tmergedVariables\n\t\t\t);\n\t\t\tconst value = preprocess(resolvedValue, currentColor);\n\n\t\t\ttry {\n\t\t\t\tconst resolvedStyle =\n\t\t\t\t\thandleSpecialCase(name, value, currentColor) ||\n\t\t\t\t\thandleFallbackColor(\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tgetStylesForProperty(name, purify(name, value), true),\n\t\t\t\t\t\tvalue as string,\n\t\t\t\t\t\tcurrentColor\n\t\t\t\t\t);\n\n\t\t\t\tObject.assign(serializedStyle, resolvedStyle);\n\t\t\t} catch (err) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\terr.message +\n\t\t\t\t\t\t// Attach the extra information of the rule itself if it's not included in\n\t\t\t\t\t\t// the error message.\n\t\t\t\t\t\t(err.message.includes(value)\n\t\t\t\t\t\t\t? '\\n ' + getErrorHint(name)\n\t\t\t\t\t\t\t: `\\n in CSS rule \\`${name}: ${value}\\`.${getErrorHint(\n\t\t\t\t\t\t\t\t\tname\n\t\t\t\t\t\t\t )}`)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Parse background images.\n\tif (serializedStyle.backgroundImage) {\n\t\tconst { backgrounds } = parseElementStyle(serializedStyle);\n\t\tserializedStyle.backgroundImage = backgrounds;\n\t}\n\n\tif (serializedStyle.maskImage || serializedStyle['WebkitMaskImage']) {\n\t\tserializedStyle.maskImage = parseMask(serializedStyle);\n\t}\n\n\t// Calculate the base font size.\n\tconst baseFontSize = calcBaseFontSize(\n\t\tserializedStyle.fontSize,\n\t\tinheritedStyle.fontSize\n\t);\n\tif (typeof serializedStyle.fontSize !== 'undefined') {\n\t\tserializedStyle.fontSize = baseFontSize;\n\t}\n\n\tif (serializedStyle.transformOrigin) {\n\t\tserializedStyle.transformOrigin = parseTransformOrigin(\n\t\t\tserializedStyle.transformOrigin as any,\n\t\t\tbaseFontSize\n\t\t);\n\t}\n\n\tfor (const prop in serializedStyle) {\n\t\tlet value = serializedStyle[prop];\n\n\t\t// Line height needs to be relative.\n\t\tif (prop === 'lineHeight') {\n\t\t\tif (typeof value === 'string' && value !== 'normal') {\n\t\t\t\tvalue = serializedStyle[prop] =\n\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\tinheritedStyle,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) / baseFontSize;\n\t\t\t}\n\t\t} else {\n\t\t\t// Convert em and rem values to px (number).\n\t\t\tif (typeof value === 'string') {\n\t\t\t\tconst len = lengthToNumber(\n\t\t\t\t\tvalue,\n\t\t\t\t\tbaseFontSize,\n\t\t\t\t\tbaseFontSize,\n\t\t\t\t\tinheritedStyle\n\t\t\t\t);\n\t\t\t\tif (typeof len !== 'undefined') serializedStyle[prop] = len;\n\t\t\t\tvalue = serializedStyle[prop];\n\t\t\t}\n\n\t\t\tif (typeof value === 'string' || typeof value === 'object') {\n\t\t\t\tconst color = normalizeColor(value);\n\t\t\t\tif (color) {\n\t\t\t\t\tserializedStyle[prop] = color as any;\n\t\t\t\t}\n\t\t\t\tvalue = serializedStyle[prop];\n\t\t\t}\n\t\t}\n\n\t\t// Inherit the opacity.\n\t\tif (prop === 'opacity' && typeof value === 'number') {\n\t\t\tserializedStyle.opacity = value * inheritedStyle.opacity;\n\t\t}\n\n\t\tif (prop === 'transform') {\n\t\t\tconst transforms = value as any as {\n\t\t\t\t[type: string]: number | string;\n\t\t\t}[];\n\n\t\t\tfor (const transform of transforms) {\n\t\t\t\tconst type = Object.keys(transform)[0];\n\t\t\t\tconst _v = transform[type];\n\n\t\t\t\t// Convert em, rem, vw, vh values to px (number), but keep % values.\n\t\t\t\tconst len =\n\t\t\t\t\ttypeof _v === 'string'\n\t\t\t\t\t\t? lengthToNumber(\n\t\t\t\t\t\t\t\t_v,\n\t\t\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\t\t\tinheritedStyle\n\t\t\t\t\t\t ) ?? _v\n\t\t\t\t\t\t: _v;\n\t\t\t\ttransform[type] = len;\n\t\t\t}\n\t\t}\n\n\t\tif (prop === 'textShadowRadius') {\n\t\t\tconst textShadowRadius = value as unknown as Array<number | string>;\n\n\t\t\tserializedStyle.textShadowRadius = textShadowRadius.map(_v =>\n\t\t\t\tlengthToNumber(_v, baseFontSize, 0, inheritedStyle, false)\n\t\t\t);\n\t\t}\n\n\t\tif (prop === 'textShadowOffset') {\n\t\t\tconst textShadowOffset = value as unknown as Array<{\n\t\t\t\twidth: number | string;\n\t\t\t\theight: number | string;\n\t\t\t}>;\n\n\t\t\tserializedStyle.textShadowOffset = textShadowOffset.map(\n\t\t\t\t({ height, width }) => ({\n\t\t\t\t\theight: lengthToNumber(\n\t\t\t\t\t\theight,\n\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tinheritedStyle,\n\t\t\t\t\t\tfalse\n\t\t\t\t\t),\n\t\t\t\t\twidth: lengthToNumber(\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tinheritedStyle,\n\t\t\t\t\t\tfalse\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t}\n\n\treturn serializedStyle;\n}\n\nfunction calcBaseFontSize(\n\tsize: number | string,\n\tinheritedSize: number\n): number {\n\tif (typeof size === 'number') return size;\n\n\ttry {\n\t\tconst parsed = new CssDimension(size);\n\t\tswitch (parsed.unit) {\n\t\t\tcase 'em':\n\t\t\t\treturn parsed.value * inheritedSize;\n\t\t\tcase 'rem':\n\t\t\t\treturn parsed.value * 16;\n\t\t}\n\t} catch (err) {\n\t\treturn inheritedSize;\n\t}\n}\n\n/**\n * @see https://github.com/RazrFalcon/resvg/issues/579\n */\nfunction refineHSL(color: string) {\n\tif (color.startsWith('hsl')) {\n\t\tconst t = cssColorParse(color);\n\t\tconst [h, s, l] = t.values;\n\n\t\treturn `hsl(${[h, `${s}%`, `${l}%`]\n\t\t\t.concat(t.alpha === 1 ? [] : [t.alpha])\n\t\t\t.join(',')})`;\n\t}\n\n\treturn color;\n}\n\nfunction getCurrentColor(\n\tcolor: string | undefined,\n\tinheritedColor: string\n): string {\n\tif (color && color.toLowerCase() !== 'currentcolor') {\n\t\treturn refineHSL(color);\n\t}\n\n\treturn refineHSL(inheritedColor);\n}\n\nfunction convertCurrentColorToActualValue(\n\tvalue: string,\n\tcurrentColor: string\n): string {\n\treturn value.replace(/currentcolor/gi, currentColor);\n}\n\nfunction preprocess(\n\tvalue: string | number,\n\tcurrentColor: string\n): string | number {\n\tif (isString(value)) {\n\t\tvalue = convertCurrentColorToActualValue(value, currentColor);\n\t}\n\n\treturn value;\n}\n","import valueParser from 'postcss-value-parser';\n\nimport CssDimension from './vendor/parse-css-dimension/index.js';\n\n/**\n * If key for each direction is missing, assume default (50%)\n */\nexport interface ParsedTransformOrigin {\n\t/** Relative horizontal transform origin in % */\n\txRelative?: number;\n\t/** Relative vertical transform origin in % */\n\tyRelative?: number;\n\t/** Absolute horizontal transform origin in pixels */\n\txAbsolute?: number;\n\t/** Absolute horizontal transform origin in pixels */\n\tyAbsolute?: number;\n}\n\ninterface ParsedUnit {\n\t/** Relative unit in % */\n\trelative?: number;\n\t/** Absolute unit in pixels */\n\tabsolute?: number;\n}\n\nfunction parseUnit(word: string, baseFontSize: number): ParsedUnit {\n\ttry {\n\t\tconst parsed = new CssDimension(word);\n\t\tswitch (parsed.unit) {\n\t\t\tcase 'px':\n\t\t\t\treturn { absolute: parsed.value };\n\t\t\tcase 'em':\n\t\t\t\treturn { absolute: parsed.value * baseFontSize };\n\t\t\tcase 'rem':\n\t\t\t\treturn { absolute: parsed.value * 16 };\n\t\t\tcase '%':\n\t\t\t\treturn { relative: parsed.value };\n\t\t\tdefault:\n\t\t\t\treturn {};\n\t\t}\n\t} catch (e) {\n\t\treturn {};\n\t}\n}\n\nfunction handleWord(\n\tword: string,\n\tbaseFontSize: number,\n\tunitIsHorizontal: boolean\n) {\n\tswitch (word) {\n\t\tcase 'top':\n\t\t\treturn { yRelative: 0 };\n\t\tcase 'left':\n\t\t\treturn { xRelative: 0 };\n\t\tcase 'right':\n\t\t\treturn { xRelative: 100 };\n\t\tcase 'bottom':\n\t\t\treturn { yRelative: 100 };\n\t\tcase 'center':\n\t\t\treturn {};\n\t\tdefault: {\n\t\t\tconst parsedUnit = parseUnit(word, baseFontSize);\n\t\t\treturn parsedUnit.absolute\n\t\t\t\t? {\n\t\t\t\t\t\t[unitIsHorizontal ? 'xAbsolute' : 'yAbsolute']:\n\t\t\t\t\t\t\tparsedUnit.absolute\n\t\t\t\t }\n\t\t\t\t: parsedUnit.relative\n\t\t\t\t? {\n\t\t\t\t\t\t[unitIsHorizontal ? 'xRelative' : 'yRelative']:\n\t\t\t\t\t\t\tparsedUnit.relative\n\t\t\t\t }\n\t\t\t\t: {};\n\t\t}\n\t}\n}\n\nexport default function parseTransformOrigin(\n\tvalue: string | number,\n\tbaseFontSize: number\n): ParsedTransformOrigin {\n\t// If it's a single value and a number, then it's horizontal\n\tif (typeof value === 'number') {\n\t\treturn { xAbsolute: value };\n\t}\n\tlet words: string[];\n\ttry {\n\t\twords = valueParser(value)\n\t\t\t.nodes.filter(node => node.type === 'word')\n\t\t\t.map(node => node.value);\n\t} catch (e) {\n\t\treturn {};\n\t}\n\n\tif (words.length === 1) {\n\t\t// If it's a single value and a number, then it's horizontal, so\n\t\t// pass `true` to `unitIsHorizontal`\n\t\treturn handleWord(words[0], baseFontSize, true);\n\t} else if (words.length === 2) {\n\t\t// Make words to be [horizontal, vertical]\n\t\tif (\n\t\t\twords[0] === 'top' ||\n\t\t\twords[0] === 'bottom' ||\n\t\t\twords[1] === 'left' ||\n\t\t\twords[1] === 'right'\n\t\t) {\n\t\t\twords.reverse();\n\t\t}\n\n\t\treturn {\n\t\t\t...handleWord(words[0], baseFontSize, true),\n\t\t\t...handleWord(words[1], baseFontSize, false)\n\t\t};\n\t} else {\n\t\treturn {};\n\t}\n}\n","import { getPropertyName } from 'css-to-react-native';\nimport { splitEffects } from '../utils.js';\n\nfunction getMaskProperty(style: Record<string, string | number>, name: string) {\n\tconst key = getPropertyName(`mask-${name}`);\n\treturn (style[key] || style[`WebkitM${key.substring(1)}`]) as string;\n}\n\nexport interface MaskProperty {\n\timage: string;\n\tposition: string;\n\tsize: string;\n\trepeat: string;\n\torigin: string;\n\tclip: string;\n}\n\nexport function parseMask(\n\tstyle: Record<string, string | number>\n): MaskProperty[] {\n\tconst maskImage = (style.maskImage || style.WebkitMaskImage) as string;\n\n\tconst common = {\n\t\tposition: getMaskProperty(style, 'position') || '0% 0%',\n\t\tsize: getMaskProperty(style, 'size') || '100% 100%',\n\t\trepeat: getMaskProperty(style, 'repeat') || 'repeat',\n\t\torigin: getMaskProperty(style, 'origin') || 'border-box',\n\t\tclip: getMaskProperty(style, 'origin') || 'border-box'\n\t};\n\n\tlet maskImages = splitEffects(maskImage).filter(v => v && v !== 'none');\n\n\treturn maskImages.reverse().map(m => ({\n\t\timage: m,\n\t\t...common\n\t}));\n}\n","/**\n * This module handles CSS custom properties (CSS variables) including:\n * - Extracting custom properties from styles (--property-name)\n * - Resolving var() references\n * - Handling fallback values\n * - Detecting circular references\n */\n\nimport valueParser from 'postcss-value-parser';\n\nexport type CSSVariables = Record<string, string>;\n\n/**\n * Extracts custom properties (--*) from a style object\n * Returns both the variables and the remaining style properties\n */\nexport function extractCustomProperties(\n\tstyle: Record<string, string | number>\n): {\n\tvariables: CSSVariables;\n\tremainingStyle: Record<string, string | number>;\n} {\n\tconst variables: CSSVariables = {};\n\tconst remainingStyle: Record<string, string | number> = {};\n\n\tfor (const prop in style) {\n\t\tif (prop.startsWith('--')) {\n\t\t\t// Custom property\n\t\t\tvariables[prop] = String(style[prop]);\n\t\t} else {\n\t\t\tremainingStyle[prop] = style[prop];\n\t\t}\n\t}\n\n\treturn { variables, remainingStyle };\n}\n\n/**\n * Merges inherited variables with current variables\n * Current variables override inherited ones (cascading)\n */\nexport function mergeVariables(\n\tinherited: CSSVariables,\n\tcurrent: CSSVariables\n): CSSVariables {\n\treturn { ...inherited, ...current };\n}\n\n/**\n * Resolves var() references in a CSS value\n * Supports fallback values: var(--name, fallback)\n * Handles nested var() calls\n */\nexport function resolveVariables(\n\tvalue: string | number,\n\tvariables: CSSVariables,\n\tvisitedVars = new Set<string>()\n): string | number {\n\t// Only process strings\n\tif (typeof value !== 'string') {\n\t\treturn value;\n\t}\n\n\t// Quick check: does this value contain var()?\n\tif (!value.includes('var(')) {\n\t\treturn value;\n\t}\n\n\ttry {\n\t\tconst parsed = valueParser(value);\n\t\tlet hasChanges = false;\n\n\t\tparsed.walk(node => {\n\t\t\tif (node.type === 'function' && node.value === 'var') {\n\t\t\t\thasChanges = true;\n\n\t\t\t\t// Extract variable name and optional fallback\n\t\t\t\tconst args = extractVarArgs(node);\n\t\t\t\tif (!args) {\n\t\t\t\t\t// Invalid var() syntax, leave as-is\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst { varName, fallback } = args;\n\n\t\t\t\t// Check for circular reference\n\t\t\t\tif (visitedVars.has(varName)) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`Circular reference detected for CSS variable: ${varName}`\n\t\t\t\t\t);\n\t\t\t\t\t// Use fallback if available, otherwise use invalid value\n\t\t\t\t\tif (fallback !== undefined) {\n\t\t\t\t\t\treplaceNode(node, fallback);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treplaceNode(node, 'initial');\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Look up the variable\n\t\t\t\tconst variableValue = variables[varName];\n\n\t\t\t\tif (variableValue !== undefined) {\n\t\t\t\t\t// Mark this variable as being resolved to detect circular references\n\t\t\t\t\tconst newVisitedVars = new Set(visitedVars);\n\t\t\t\t\tnewVisitedVars.add(varName);\n\n\t\t\t\t\t// Recursively resolve the variable value in case it contains more var()\n\t\t\t\t\tconst resolvedValue = resolveVariables(\n\t\t\t\t\t\tvariableValue,\n\t\t\t\t\t\tvariables,\n\t\t\t\t\t\tnewVisitedVars\n\t\t\t\t\t);\n\n\t\t\t\t\treplaceNode(node, String(resolvedValue));\n\t\t\t\t} else if (fallback !== undefined) {\n\t\t\t\t\t// Variable not found, use fallback\n\t\t\t\t\t// Recursively resolve fallback in case it contains var()\n\t\t\t\t\tconst resolvedFallback = resolveVariables(\n\t\t\t\t\t\tfallback,\n\t\t\t\t\t\tvariables,\n\t\t\t\t\t\tvisitedVars\n\t\t\t\t\t);\n\t\t\t\t\treplaceNode(node, String(resolvedFallback));\n\t\t\t\t} else {\n\t\t\t\t\t// Variable not found and no fallback, use initial value\n\t\t\t\t\t// According to CSS spec, this should be treated as invalid\n\t\t\t\t\treplaceNode(node, 'initial');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif (hasChanges) {\n\t\t\treturn parsed.toString();\n\t\t}\n\t} catch (err) {\n\t\t// If parsing fails, return the original value\n\t\tconsole.warn(\n\t\t\t`Failed to parse CSS value for variable resolution: ${value}`\n\t\t);\n\t}\n\n\treturn value;\n}\n\n/**\n * Extracts variable name and fallback from var() function arguments\n * Handles: var(--name) and var(--name, fallback)\n */\nfunction extractVarArgs(\n\tnode: valueParser.FunctionNode\n): { varName: string; fallback?: string } | null {\n\tif (!node.nodes || node.nodes.length === 0) {\n\t\treturn null;\n\t}\n\n\t// Find the variable name (first word node)\n\tlet varNameNode: valueParser.Node | undefined;\n\tlet commaIndex = -1;\n\n\tfor (let i = 0; i < node.nodes.length; i++) {\n\t\tconst child = node.nodes[i];\n\t\tif (child.type === 'word' && !varNameNode) {\n\t\t\tvarNameNode = child;\n\t\t} else if (child.type === 'div' && child.value === ',') {\n\t\t\tcommaIndex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (!varNameNode || varNameNode.type !== 'word') {\n\t\treturn null;\n\t}\n\n\tconst varName = varNameNode.value.trim();\n\n\t// Check if there's a fallback value after the comma\n\tif (commaIndex !== -1 && commaIndex < node.nodes.length - 1) {\n\t\t// Collect all nodes after the comma as the fallback\n\t\tconst fallbackNodes = node.nodes.slice(commaIndex + 1);\n\t\tconst fallback = valueParser.stringify(fallbackNodes).trim();\n\t\treturn { varName, fallback };\n\t}\n\n\treturn { varName };\n}\n\n/**\n * Replaces a function node with a raw string value\n */\nfunction replaceNode(node: valueParser.Node, value: string) {\n\t// Replace the function node with a word node\n\tnode.type = 'word';\n\tnode.value = value;\n\t// Remove function-specific properties\n\tdelete (node as any).nodes;\n}\n\n/**\n * Resolves all variables in a style object\n * Returns a new style object with var() references resolved\n */\nexport function resolveStyleVariables(\n\tstyle: Record<string, string | number>,\n\tvariables: CSSVariables\n): Record<string, string | number> {\n\tconst resolved: Record<string, string | number> = {};\n\n\tfor (const prop in style) {\n\t\tresolved[prop] = resolveVariables(style[prop], variables);\n\t}\n\n\treturn resolved;\n}\n","/**\n * Handler to update the Yoga node properties with the given element type and\n * style. Each supported element has its own preset styles, so this function\n * also returns the inherited style for children of the element.\n */\n\nimport presets from './presets.js';\nimport inheritable from './inheritable.js';\nimport expand, { SerializedStyle } from './expand.js';\nimport {\n\tasPointAutoPercentageLength,\n\tasPointPercentageLength,\n\tlengthToNumber,\n\tparseViewBox,\n\tv\n} from '../utils.js';\nimport { getYoga, YogaNode } from '../yoga.js';\nimport { resolveImageData } from './image.js';\n\ntype SatoriElement = keyof typeof presets;\n\nexport default async function compute(\n\tnode: YogaNode,\n\ttype: SatoriElement | string,\n\tinheritedStyle: SerializedStyle,\n\tdefinedStyle: Record<string, string | number>,\n\tprops: Record<string, any>\n): Promise<[SerializedStyle, SerializedStyle]> {\n\tconst Yoga = await getYoga();\n\n\t// Extend the default style with defined and inherited styles.\n\tconst style: SerializedStyle = Object.assign(\n\t\t{},\n\t\tinheritedStyle,\n\t\texpand(presets[type], inheritedStyle),\n\t\texpand(definedStyle, inheritedStyle)\n\t);\n\n\tif (type === 'img') {\n\t\tlet [resolvedSrc, imageWidth, imageHeight] = await resolveImageData(\n\t\t\tprops.src\n\t\t);\n\n\t\t// Cannot parse the image size (e.g. base64 data URI).\n\t\tif (imageWidth === undefined && imageHeight === undefined) {\n\t\t\tif (props.width === undefined || props.height === undefined) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Image size cannot be determined. Please provide the width and height of the image.'\n\t\t\t\t);\n\t\t\t}\n\t\t\timageWidth = parseInt(props.width);\n\t\t\timageHeight = parseInt(props.height);\n\t\t}\n\t\tconst r = imageHeight / imageWidth;\n\n\t\t// Before calculating the missing width or height based on the image ratio,\n\t\t// we must subtract the padding and border due to how box model works.\n\t\t// TODO: Ensure these are absolute length values, not relative values.\n\t\tlet extraHorizontal =\n\t\t\t(style.borderLeftWidth || 0) +\n\t\t\t(style.borderRightWidth || 0) +\n\t\t\t(style.paddingLeft || 0) +\n\t\t\t(style.paddingRight || 0);\n\t\tlet extraVertical =\n\t\t\t(style.borderTopWidth || 0) +\n\t\t\t(style.borderBottomWidth || 0) +\n\t\t\t(style.paddingTop || 0) +\n\t\t\t(style.paddingBottom || 0);\n\n\t\tlet contentBoxWidth = style.width || props.width;\n\t\tlet contentBoxHeight = style.height || props.height;\n\n\t\tconst isAbsoluteContentSize =\n\t\t\ttypeof contentBoxWidth === 'number' &&\n\t\t\ttypeof contentBoxHeight === 'number';\n\n\t\tif (isAbsoluteContentSize) {\n\t\t\tcontentBoxWidth -= extraHorizontal;\n\t\t\tcontentBoxHeight -= extraVertical;\n\t\t}\n\n\t\t// When no content size is defined, we use the image size as the content size.\n\t\tif (contentBoxWidth === undefined && contentBoxHeight === undefined) {\n\t\t\tcontentBoxWidth = '100%';\n\t\t\tnode.setAspectRatio(1 / r);\n\t\t} else {\n\t\t\t// If only one sisde is not defined, we can calculate the other one.\n\t\t\tif (contentBoxWidth === undefined) {\n\t\t\t\tif (typeof contentBoxHeight === 'number') {\n\t\t\t\t\tcontentBoxWidth = contentBoxHeight / r;\n\t\t\t\t} else {\n\t\t\t\t\t// If it uses a relative value (e.g. 50%), we can rely on aspect ratio.\n\t\t\t\t\t// Note: this doesn't work well if there are paddings or borders.\n\t\t\t\t\tnode.setAspectRatio(1 / r);\n\t\t\t\t}\n\t\t\t} else if (contentBoxHeight === undefined) {\n\t\t\t\tif (typeof contentBoxWidth === 'number') {\n\t\t\t\t\tcontentBoxHeight = contentBoxWidth * r;\n\t\t\t\t} else {\n\t\t\t\t\t// If it uses a relative value (e.g. 50%), we can rely on aspect ratio.\n\t\t\t\t\t// Note: this doesn't work well if there are paddings or borders.\n\t\t\t\t\tnode.setAspectRatio(1 / r);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tstyle.width = isAbsoluteContentSize\n\t\t\t? (contentBoxWidth as number) + extraHorizontal\n\t\t\t: contentBoxWidth;\n\t\tstyle.height = isAbsoluteContentSize\n\t\t\t? (contentBoxHeight as number) + extraVertical\n\t\t\t: contentBoxHeight;\n\t\tstyle.__src = resolvedSrc;\n\t\tstyle.__naturalWidth = imageWidth;\n\t\tstyle.__naturalHeight = imageHeight;\n\t}\n\n\tif (type === 'svg') {\n\t\tconst viewBox = props.viewBox || props.viewbox;\n\t\tconst viewBoxSize = parseViewBox(viewBox);\n\t\tconst ratio = viewBoxSize ? viewBoxSize[3] / viewBoxSize[2] : null;\n\n\t\tlet { width, height } = props;\n\t\tif (typeof width === 'undefined' && height) {\n\t\t\tif (ratio == null) {\n\t\t\t\twidth = 0;\n\t\t\t} else if (typeof height === 'string' && height.endsWith('%')) {\n\t\t\t\twidth = parseInt(height) / ratio + '%';\n\t\t\t} else {\n\t\t\t\theight = lengthToNumber(\n\t\t\t\t\theight,\n\t\t\t\t\tinheritedStyle.fontSize,\n\t\t\t\t\t1,\n\t\t\t\t\tinheritedStyle\n\t\t\t\t);\n\t\t\t\twidth = height / ratio;\n\t\t\t}\n\t\t} else if (typeof height === 'undefined' && width) {\n\t\t\tif (ratio == null) {\n\t\t\t\twidth = 0;\n\t\t\t} else if (typeof width === 'string' && width.endsWith('%')) {\n\t\t\t\theight = parseInt(width) * ratio + '%';\n\t\t\t} else {\n\t\t\t\twidth = lengthToNumber(\n\t\t\t\t\twidth,\n\t\t\t\t\tinheritedStyle.fontSize,\n\t\t\t\t\t1,\n\t\t\t\t\tinheritedStyle\n\t\t\t\t);\n\t\t\t\theight = width * ratio;\n\t\t\t}\n\t\t} else {\n\t\t\tif (typeof width !== 'undefined') {\n\t\t\t\twidth =\n\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\tinheritedStyle.fontSize,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\tinheritedStyle\n\t\t\t\t\t) || width;\n\t\t\t}\n\t\t\tif (typeof height !== 'undefined') {\n\t\t\t\theight =\n\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\theight,\n\t\t\t\t\t\tinheritedStyle.fontSize,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\tinheritedStyle\n\t\t\t\t\t) || height;\n\t\t\t}\n\t\t\twidth ||= viewBoxSize?.[2];\n\t\t\theight ||= viewBoxSize?.[3];\n\t\t}\n\n\t\tif (!style.width && width) style.width = width;\n\t\tif (!style.height && height) style.height = height;\n\t}\n\n\t// Set properties for Yoga.\n\tnode.setDisplay(\n\t\tv(\n\t\t\tstyle.display,\n\t\t\t{\n\t\t\t\tflex: Yoga.DISPLAY_FLEX,\n\t\t\t\tblock: Yoga.DISPLAY_FLEX,\n\t\t\t\tcontents: Yoga.DISPLAY_CONTENTS,\n\t\t\t\tnone: Yoga.DISPLAY_NONE,\n\t\t\t\t'-webkit-box': Yoga.DISPLAY_FLEX\n\t\t\t},\n\t\t\tYoga.DISPLAY_FLEX,\n\t\t\t'display'\n\t\t)\n\t);\n\n\tnode.setAlignContent(\n\t\tv(\n\t\t\tstyle.alignContent,\n\t\t\t{\n\t\t\t\tstretch: Yoga.ALIGN_STRETCH,\n\t\t\t\tcenter: Yoga.ALIGN_CENTER,\n\t\t\t\t'flex-start': Yoga.ALIGN_FLEX_START,\n\t\t\t\t'flex-end': Yoga.ALIGN_FLEX_END,\n\t\t\t\t'space-between': Yoga.ALIGN_SPACE_BETWEEN,\n\t\t\t\t'space-around': Yoga.ALIGN_SPACE_AROUND,\n\t\t\t\tbaseline: Yoga.ALIGN_BASELINE,\n\t\t\t\tnormal: Yoga.ALIGN_AUTO\n\t\t\t},\n\t\t\tYoga.ALIGN_AUTO,\n\t\t\t'alignContent'\n\t\t)\n\t);\n\n\tnode.setAlignItems(\n\t\tv(\n\t\t\tstyle.alignItems,\n\t\t\t{\n\t\t\t\tstretch: Yoga.ALIGN_STRETCH,\n\t\t\t\tcenter: Yoga.ALIGN_CENTER,\n\t\t\t\t'flex-start': Yoga.ALIGN_FLEX_START,\n\t\t\t\t'flex-end': Yoga.ALIGN_FLEX_END,\n\t\t\t\tbaseline: Yoga.ALIGN_BASELINE,\n\t\t\t\tnormal: Yoga.ALIGN_AUTO\n\t\t\t},\n\t\t\tYoga.ALIGN_STRETCH,\n\t\t\t'alignItems'\n\t\t)\n\t);\n\tnode.setAlignSelf(\n\t\tv(\n\t\t\tstyle.alignSelf,\n\t\t\t{\n\t\t\t\tstretch: Yoga.ALIGN_STRETCH,\n\t\t\t\tcenter: Yoga.ALIGN_CENTER,\n\t\t\t\t'flex-start': Yoga.ALIGN_FLEX_START,\n\t\t\t\t'flex-end': Yoga.ALIGN_FLEX_END,\n\t\t\t\tbaseline: Yoga.ALIGN_BASELINE,\n\t\t\t\tnormal: Yoga.ALIGN_AUTO\n\t\t\t},\n\t\t\tYoga.ALIGN_AUTO,\n\t\t\t'alignSelf'\n\t\t)\n\t);\n\tnode.setJustifyContent(\n\t\tv(\n\t\t\tstyle.justifyContent,\n\t\t\t{\n\t\t\t\tcenter: Yoga.JUSTIFY_CENTER,\n\t\t\t\t'flex-start': Yoga.JUSTIFY_FLEX_START,\n\t\t\t\t'flex-end': Yoga.JUSTIFY_FLEX_END,\n\t\t\t\t'space-between': Yoga.JUSTIFY_SPACE_BETWEEN,\n\t\t\t\t'space-around': Yoga.JUSTIFY_SPACE_AROUND\n\t\t\t},\n\t\t\tYoga.JUSTIFY_FLEX_START,\n\t\t\t'justifyContent'\n\t\t)\n\t);\n\t// @TODO: node.setAspectRatio\n\n\tnode.setFlexDirection(\n\t\tv(\n\t\t\tstyle.flexDirection,\n\t\t\t{\n\t\t\t\trow: Yoga.FLEX_DIRECTION_ROW,\n\t\t\t\tcolumn: Yoga.FLEX_DIRECTION_COLUMN,\n\t\t\t\t'row-reverse': Yoga.FLEX_DIRECTION_ROW_REVERSE,\n\t\t\t\t'column-reverse': Yoga.FLEX_DIRECTION_COLUMN_REVERSE\n\t\t\t},\n\t\t\tYoga.FLEX_DIRECTION_ROW,\n\t\t\t'flexDirection'\n\t\t)\n\t);\n\tnode.setFlexWrap(\n\t\tv(\n\t\t\tstyle.flexWrap,\n\t\t\t{\n\t\t\t\twrap: Yoga.WRAP_WRAP,\n\t\t\t\tnowrap: Yoga.WRAP_NO_WRAP,\n\t\t\t\t'wrap-reverse': Yoga.WRAP_WRAP_REVERSE\n\t\t\t},\n\t\t\tYoga.WRAP_NO_WRAP,\n\t\t\t'flexWrap'\n\t\t)\n\t);\n\n\tif (typeof style.gap !== 'undefined') {\n\t\tnode.setGap(Yoga.GUTTER_ALL, style.gap);\n\t}\n\n\tif (typeof style.rowGap !== 'undefined') {\n\t\tnode.setGap(Yoga.GUTTER_ROW, style.rowGap);\n\t}\n\n\tif (typeof style.columnGap !== 'undefined') {\n\t\tnode.setGap(Yoga.GUTTER_COLUMN, style.columnGap);\n\t}\n\n\t// @TODO: node.setFlex\n\n\tif (typeof style.flexBasis !== 'undefined') {\n\t\tnode.setFlexBasis(\n\t\t\tasPointAutoPercentageLength(style.flexBasis, 'flexBasis')\n\t\t);\n\t}\n\tnode.setFlexGrow(\n\t\ttypeof style.flexGrow === 'undefined' ? 0 : style.flexGrow\n\t);\n\tnode.setFlexShrink(\n\t\ttypeof style.flexShrink === 'undefined' ? 0 : style.flexShrink\n\t);\n\n\tif (typeof style.maxHeight !== 'undefined') {\n\t\tnode.setMaxHeight(\n\t\t\tasPointPercentageLength(style.maxHeight, 'maxHeight')\n\t\t);\n\t}\n\tif (typeof style.maxWidth !== 'undefined') {\n\t\tnode.setMaxWidth(asPointPercentageLength(style.maxWidth, 'maxWidth'));\n\t}\n\tif (typeof style.minHeight !== 'undefined') {\n\t\tnode.setMinHeight(\n\t\t\tasPointPercentageLength(style.minHeight, 'minHeight')\n\t\t);\n\t}\n\tif (typeof style.minWidth !== 'undefined') {\n\t\tnode.setMinWidth(asPointPercentageLength(style.minWidth, 'minWidth'));\n\t}\n\n\tnode.setOverflow(\n\t\tv(\n\t\t\tstyle.overflow,\n\t\t\t{\n\t\t\t\tvisible: Yoga.OVERFLOW_VISIBLE,\n\t\t\t\thidden: Yoga.OVERFLOW_HIDDEN\n\t\t\t},\n\t\t\tYoga.OVERFLOW_VISIBLE,\n\t\t\t'overflow'\n\t\t)\n\t);\n\n\tnode.setMargin(\n\t\tYoga.EDGE_TOP,\n\t\tasPointAutoPercentageLength(style.marginTop || 0)\n\t);\n\tnode.setMargin(\n\t\tYoga.EDGE_BOTTOM,\n\t\tasPointAutoPercentageLength(style.marginBottom || 0)\n\t);\n\tnode.setMargin(\n\t\tYoga.EDGE_LEFT,\n\t\tasPointAutoPercentageLength(style.marginLeft || 0)\n\t);\n\tnode.setMargin(\n\t\tYoga.EDGE_RIGHT,\n\t\tasPointAutoPercentageLength(style.marginRight || 0)\n\t);\n\n\tnode.setBorder(Yoga.EDGE_TOP, style.borderTopWidth || 0);\n\tnode.setBorder(Yoga.EDGE_BOTTOM, style.borderBottomWidth || 0);\n\tnode.setBorder(Yoga.EDGE_LEFT, style.borderLeftWidth || 0);\n\tnode.setBorder(Yoga.EDGE_RIGHT, style.borderRightWidth || 0);\n\n\tnode.setPadding(Yoga.EDGE_TOP, style.paddingTop || 0);\n\tnode.setPadding(Yoga.EDGE_BOTTOM, style.paddingBottom || 0);\n\tnode.setPadding(Yoga.EDGE_LEFT, style.paddingLeft || 0);\n\tnode.setPadding(Yoga.EDGE_RIGHT, style.paddingRight || 0);\n\n\tnode.setBoxSizing(\n\t\tv(\n\t\t\tstyle.boxSizing,\n\t\t\t{\n\t\t\t\t'border-box': Yoga.BOX_SIZING_BORDER_BOX,\n\t\t\t\t'content-box': Yoga.BOX_SIZING_CONTENT_BOX\n\t\t\t},\n\t\t\tYoga.BOX_SIZING_BORDER_BOX,\n\t\t\t'boxSizing'\n\t\t)\n\t);\n\n\tnode.setPositionType(\n\t\tv(\n\t\t\tstyle.position,\n\t\t\t{\n\t\t\t\tabsolute: Yoga.POSITION_TYPE_ABSOLUTE,\n\t\t\t\trelative: Yoga.POSITION_TYPE_RELATIVE,\n\t\t\t\tstatic: Yoga.POSITION_TYPE_STATIC\n\t\t\t},\n\t\t\tYoga.POSITION_TYPE_RELATIVE,\n\t\t\t'position'\n\t\t)\n\t);\n\n\tif (typeof style.top !== 'undefined') {\n\t\tnode.setPosition(\n\t\t\tYoga.EDGE_TOP,\n\t\t\tasPointPercentageLength(style.top, 'top')\n\t\t);\n\t}\n\tif (typeof style.bottom !== 'undefined') {\n\t\tnode.setPosition(\n\t\t\tYoga.EDGE_BOTTOM,\n\t\t\tasPointPercentageLength(style.bottom, 'bottom')\n\t\t);\n\t}\n\tif (typeof style.left !== 'undefined') {\n\t\tnode.setPosition(\n\t\t\tYoga.EDGE_LEFT,\n\t\t\tasPointPercentageLength(style.left, 'left')\n\t\t);\n\t}\n\tif (typeof style.right !== 'undefined') {\n\t\tnode.setPosition(\n\t\t\tYoga.EDGE_RIGHT,\n\t\t\tasPointPercentageLength(style.right, 'right')\n\t\t);\n\t}\n\n\tif (typeof style.height !== 'undefined') {\n\t\tnode.setHeight(asPointAutoPercentageLength(style.height, 'height'));\n\t} else {\n\t\tnode.setHeightAuto();\n\t}\n\tif (typeof style.width !== 'undefined') {\n\t\tnode.setWidth(asPointAutoPercentageLength(style.width, 'width'));\n\t} else {\n\t\tnode.setWidthAuto();\n\t}\n\n\treturn [style, inheritable(style)];\n}\n","import escapeHTML from 'escape-html';\nimport type { ParsedTransformOrigin } from '../transform-origin.js';\nimport transform from './transform.js';\nimport { buildXMLString } from '../utils.js';\n\nexport function container(\n\t{\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight,\n\t\tisInheritingTransform\n\t}: {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t\tisInheritingTransform: boolean;\n\t},\n\tstyle: Record<string, number | string>\n) {\n\tlet matrix = '';\n\tlet opacity = 1;\n\n\tif (style.transform) {\n\t\tmatrix = transform(\n\t\t\t{\n\t\t\t\tleft,\n\t\t\t\ttop,\n\t\t\t\twidth,\n\t\t\t\theight\n\t\t\t},\n\t\t\tstyle.transform as unknown as number[],\n\t\t\tisInheritingTransform,\n\t\t\tstyle.transformOrigin as ParsedTransformOrigin | undefined\n\t\t);\n\t}\n\n\tif (style.opacity !== undefined) {\n\t\topacity = +style.opacity;\n\t}\n\n\treturn { matrix, opacity };\n}\n\nexport default function buildText(\n\t{\n\t\tid,\n\t\tcontent,\n\t\tfilter,\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight,\n\t\tmatrix,\n\t\topacity,\n\t\timage,\n\t\tclipPathId,\n\t\tdebug,\n\t\tshape,\n\t\tdecorationShape\n\t}: {\n\t\tcontent: string;\n\t\tfilter: string;\n\t\tid: string;\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t\tmatrix: string;\n\t\topacity: number;\n\t\timage: string | null;\n\t\tclipPathId?: string;\n\t\tdebug?: boolean;\n\t\tshape?: boolean;\n\t\tdecorationShape?: string;\n\t},\n\tstyle: Record<string, number | string>\n) {\n\tlet extra = '';\n\tif (debug) {\n\t\textra = buildXMLString('rect', {\n\t\t\tx: left,\n\t\t\ty: top - height,\n\t\t\twidth,\n\t\t\theight,\n\t\t\tfill: 'transparent',\n\t\t\tstroke: '#575eff',\n\t\t\t'stroke-width': 1,\n\t\t\ttransform: matrix || undefined,\n\t\t\t'clip-path': clipPathId ? `url(#${clipPathId})` : undefined\n\t\t});\n\t}\n\n\t// This grapheme should be rendered as an image.\n\tif (image) {\n\t\tconst shapeProps = {\n\t\t\thref: image,\n\t\t\tx: left,\n\t\t\ty: top,\n\t\t\twidth,\n\t\t\theight,\n\t\t\ttransform: matrix || undefined,\n\t\t\t'clip-path': clipPathId ? `url(#${clipPathId})` : undefined,\n\t\t\tstyle: style.filter ? `filter:${style.filter}` : undefined\n\t\t};\n\t\treturn [\n\t\t\t(filter ? `${filter}<g filter=\"url(#satori_s-${id})\">` : '') +\n\t\t\t\tbuildXMLString('image', {\n\t\t\t\t\t...shapeProps,\n\t\t\t\t\topacity: opacity !== 1 ? opacity : undefined\n\t\t\t\t}) +\n\t\t\t\t(decorationShape || '') +\n\t\t\t\t(filter ? '</g>' : '') +\n\t\t\t\textra,\n\t\t\t// SVG doesn't support `<image>` as the shape.\n\t\t\t''\n\t\t];\n\t}\n\n\t// Do not embed the font, use <text> with the raw content instead.\n\tconst shapeProps = {\n\t\tx: left,\n\t\ty: top,\n\t\twidth,\n\t\theight,\n\t\t'font-weight': style.fontWeight,\n\t\t'font-style': style.fontStyle,\n\t\t'font-size': style.fontSize,\n\t\t'font-family': style.fontFamily,\n\t\t'letter-spacing': style.letterSpacing || undefined,\n\t\ttransform: matrix || undefined,\n\t\t'clip-path': clipPathId ? `url(#${clipPathId})` : undefined,\n\t\tstyle: style.filter ? `filter:${style.filter}` : undefined,\n\t\t'stroke-width': style.WebkitTextStrokeWidth\n\t\t\t? `${style.WebkitTextStrokeWidth}px`\n\t\t\t: undefined,\n\t\tstroke: style.WebkitTextStrokeWidth\n\t\t\t? style.WebkitTextStrokeColor\n\t\t\t: undefined,\n\t\t'stroke-linejoin': style.WebkitTextStrokeWidth ? 'round' : undefined,\n\t\t'paint-order': style.WebkitTextStrokeWidth ? 'stroke' : undefined\n\t};\n\treturn [\n\t\t(filter ? `${filter}<g filter=\"url(#satori_s-${id})\">` : '') +\n\t\t\tbuildXMLString(\n\t\t\t\t'text',\n\t\t\t\t{\n\t\t\t\t\t...shapeProps,\n\t\t\t\t\tfill: style.color,\n\t\t\t\t\topacity: opacity !== 1 ? opacity : undefined\n\t\t\t\t},\n\t\t\t\tescapeHTML(content)\n\t\t\t) +\n\t\t\t(decorationShape || '') +\n\t\t\t(filter ? '</g>' : '') +\n\t\t\textra,\n\t\tshape ? buildXMLString('text', shapeProps, escapeHTML(content)) : ''\n\t];\n}\n","import { multiply } from '../utils.js';\nimport type { ParsedTransformOrigin } from '../transform-origin.js';\n\nconst baseMatrix = [1, 0, 0, 1, 0, 0];\n\n// Mutate the array in place.\nfunction resolveTransforms(transforms: any[], width: number, height: number) {\n\tlet matrix = [...baseMatrix];\n\n\t// Handle CSS transforms To make it easier, we convert different transform\n\t// types directly to a matrix and apply it recursively to all its children.\n\t// Transforms are applied from right to left.\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tfor (const transform of transforms) {\n\t\tconst type = Object.keys(transform)[0];\n\t\tlet v = transform[type];\n\n\t\t// Resolve percentages based on the element's final size.\n\t\tif (typeof v === 'string') {\n\t\t\tif (type === 'translateX') {\n\t\t\t\tv = (parseFloat(v) / 100) * width;\n\t\t\t\t// Override the original object.\n\t\t\t\ttransform[type] = v;\n\t\t\t} else if (type === 'translateY') {\n\t\t\t\tv = (parseFloat(v) / 100) * height;\n\t\t\t\ttransform[type] = v;\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Invalid transform: \"${type}: ${v}\".`);\n\t\t\t}\n\t\t}\n\n\t\tlet len = v as number;\n\n\t\tconst transformMatrix = [...baseMatrix];\n\t\tswitch (type) {\n\t\t\tcase 'translateX':\n\t\t\t\ttransformMatrix[4] = len;\n\t\t\t\tbreak;\n\t\t\tcase 'translateY':\n\t\t\t\ttransformMatrix[5] = len;\n\t\t\t\tbreak;\n\t\t\tcase 'scale':\n\t\t\t\ttransformMatrix[0] = len;\n\t\t\t\ttransformMatrix[3] = len;\n\t\t\t\tbreak;\n\t\t\tcase 'scaleX':\n\t\t\t\ttransformMatrix[0] = len;\n\t\t\t\tbreak;\n\t\t\tcase 'scaleY':\n\t\t\t\ttransformMatrix[3] = len;\n\t\t\t\tbreak;\n\t\t\tcase 'rotate': {\n\t\t\t\tconst rad = (len * Math.PI) / 180;\n\t\t\t\tconst c = Math.cos(rad);\n\t\t\t\tconst s = Math.sin(rad);\n\t\t\t\ttransformMatrix[0] = c;\n\t\t\t\ttransformMatrix[1] = s;\n\t\t\t\ttransformMatrix[2] = -s;\n\t\t\t\ttransformMatrix[3] = c;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'skewX':\n\t\t\t\ttransformMatrix[2] = Math.tan((len * Math.PI) / 180);\n\t\t\t\tbreak;\n\t\t\tcase 'skewY':\n\t\t\t\ttransformMatrix[1] = Math.tan((len * Math.PI) / 180);\n\t\t\t\tbreak;\n\t\t}\n\t\tmatrix = multiply(transformMatrix, matrix);\n\t}\n\n\ttransforms.splice(0, transforms.length);\n\ttransforms.push(...matrix);\n\t(transforms as any).__resolved = true;\n}\n\nexport default function transform(\n\t{\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight\n\t}: {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t},\n\ttransforms: number[],\n\tisInheritingTransform: boolean,\n\ttransformOrigin?: ParsedTransformOrigin\n) {\n\tlet result: number[];\n\n\tif (!(transforms as any).__resolved) {\n\t\tresolveTransforms(transforms, width, height);\n\t}\n\n\tlet matrix = transforms;\n\n\t// Calculate the transform origin.\n\tif (isInheritingTransform) {\n\t\tresult = matrix;\n\t} else {\n\t\tconst xOrigin =\n\t\t\ttransformOrigin?.xAbsolute ??\n\t\t\t((transformOrigin?.xRelative ?? 50) * width) / 100;\n\t\tconst yOrigin =\n\t\t\ttransformOrigin?.yAbsolute ??\n\t\t\t((transformOrigin?.yRelative ?? 50) * height) / 100;\n\n\t\t// If this element is the transform target, we attach the origin coordinates\n\t\t// to this matrix.\n\t\tconst x = left + xOrigin;\n\t\tconst y = top + yOrigin;\n\n\t\t// Due to the different coordinate systems, we need to move the shape to the\n\t\t// origin first, then apply the matrix, then move it back.\n\t\tresult = multiply(\n\t\t\t[1, 0, 0, 1, x, y],\n\t\t\tmultiply(matrix, [1, 0, 0, 1, -x, -y])\n\t\t);\n\n\t\t// And we need to apply its parent transform if it has one.\n\t\tif ((matrix as any).__parent) {\n\t\t\tresult = multiply((matrix as any).__parent, result);\n\t\t}\n\n\t\t// Mutate self.\n\t\tmatrix.splice(0, 6, ...result);\n\t}\n\n\treturn `matrix(${result.map(v => v.toFixed(2)).join(',')})`;\n}\n","// @TODO: It seems that SVG filters are pretty expensive for resvg, PNG\n// generation time 10x'd when adding this filter (WASM in browser).\n// https://drafts.fxtf.org/filter-effects/#feGaussianBlurElement\n\nimport { buildXMLString } from '../utils.js';\n\nfunction shiftPath(path: string, dx: number, dy: number) {\n\treturn path.replace(\n\t\t/([MA])([0-9.-]+),([0-9.-]+)/g,\n\t\tfunction (_, command, x, y) {\n\t\t\treturn command + (parseFloat(x) + dx) + ',' + (parseFloat(y) + dy);\n\t\t}\n\t);\n}\n\n// The scale is used to make the filter area larger than the bounding box,\n// because usually the given measured text bounding is larger than the path\n// bounding.\n// The text bounding box is measured via the font metrics, which is not the same\n// as the actual content. For example, the text bounding box of \"A\" is larger\n// than the actual \"a\" path but they have the same font metrics.\n// This scale can be adjusted to prevent the filter from cutting off the text.\nconst SCALE = 1.1;\n\nexport function buildDropShadow(\n\t{ id, width, height }: { id: string; width: number; height: number },\n\tstyle: {\n\t\tshadowColor: string[];\n\t\tshadowOffset: {\n\t\t\twidth: number;\n\t\t\theight: number;\n\t\t}[];\n\t\tshadowRadius: number[];\n\t},\n\ttransparentText = false\n) {\n\tif (\n\t\t!style.shadowColor ||\n\t\t!style.shadowOffset ||\n\t\ttypeof style.shadowRadius === 'undefined'\n\t) {\n\t\treturn '';\n\t}\n\n\tconst shadowCount = style.shadowColor.length;\n\tlet effects = '';\n\tlet merge = '';\n\n\t// There could be multiple shadows, we need to get the maximum bounding box\n\t// and use `feMerge` to merge them together.\n\tlet left = 0;\n\tlet right = width;\n\tlet top = 0;\n\tlet bottom = height;\n\tfor (let i = 0; i < shadowCount; i++) {\n\t\t// Expand the area for the filter to prevent it from cutting off.\n\t\tconst grow = (style.shadowRadius[i] * style.shadowRadius[i]) / 4;\n\t\tleft = Math.min(style.shadowOffset[i].width - grow, left);\n\t\tright = Math.max(style.shadowOffset[i].width + grow + width, right);\n\t\ttop = Math.min(style.shadowOffset[i].height - grow, top);\n\t\tbottom = Math.max(style.shadowOffset[i].height + grow + height, bottom);\n\n\t\tif (transparentText) {\n\t\t\t// For transparent text, use primitive filters instead of feDropShadow\n\t\t\t// because feDropShadow automatically includes source in output and\n\t\t\t// source has unwanted text color\n\t\t\tconst resultId = `satori_s-${id}-result-${i}`;\n\t\t\teffects +=\n\t\t\t\tbuildXMLString('feGaussianBlur', {\n\t\t\t\t\tin: 'SourceAlpha',\n\t\t\t\t\tstdDeviation: style.shadowRadius[i] / 2,\n\t\t\t\t\tresult: `${resultId}-blur`\n\t\t\t\t}) +\n\t\t\t\tbuildXMLString('feOffset', {\n\t\t\t\t\tin: `${resultId}-blur`,\n\t\t\t\t\tdx: style.shadowOffset[i].width,\n\t\t\t\t\tdy: style.shadowOffset[i].height,\n\t\t\t\t\tresult: `${resultId}-offset`\n\t\t\t\t}) +\n\t\t\t\tbuildXMLString('feFlood', {\n\t\t\t\t\t'flood-color': style.shadowColor[i],\n\t\t\t\t\t'flood-opacity': 1,\n\t\t\t\t\tresult: `${resultId}-color`\n\t\t\t\t}) +\n\t\t\t\tbuildXMLString('feComposite', {\n\t\t\t\t\tin: `${resultId}-color`,\n\t\t\t\t\tin2: `${resultId}-offset`,\n\t\t\t\t\toperator: 'in',\n\t\t\t\t\tresult: shadowCount > 1 ? resultId : undefined\n\t\t\t\t});\n\t\t} else {\n\t\t\teffects += buildXMLString('feDropShadow', {\n\t\t\t\tdx: style.shadowOffset[i].width,\n\t\t\t\tdy: style.shadowOffset[i].height,\n\t\t\t\tstdDeviation:\n\t\t\t\t\t// According to the spec, we use the half of the blur radius as the standard\n\t\t\t\t\t// deviation for the filter.\n\t\t\t\t\t// > the image that would be generated by applying to the shadow a Gaussian\n\t\t\t\t\t// > blur with a standard deviation equal to half the blur radius\n\t\t\t\t\t// > https://www.w3.org/TR/css-backgrounds-3/#shadow-blur\n\t\t\t\t\tstyle.shadowRadius[i] / 2,\n\t\t\t\t'flood-color': style.shadowColor[i],\n\t\t\t\t'flood-opacity': 1,\n\t\t\t\t...(shadowCount > 1\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tin: 'SourceGraphic',\n\t\t\t\t\t\t\tresult: `satori_s-${id}-result-${i}`\n\t\t\t\t\t }\n\t\t\t\t\t: {})\n\t\t\t});\n\t\t}\n\n\t\tif (shadowCount > 1) {\n\t\t\t// Merge needs to be in reverse order.\n\t\t\tmerge =\n\t\t\t\tbuildXMLString('feMergeNode', {\n\t\t\t\t\tin: `satori_s-${id}-result-${i}`\n\t\t\t\t}) + merge;\n\t\t}\n\t}\n\n\treturn buildXMLString(\n\t\t'filter',\n\t\t{\n\t\t\tid: `satori_s-${id}`,\n\t\t\tx: ((left / width) * 100 * SCALE).toFixed(2) + '%',\n\t\t\ty: ((top / height) * 100 * SCALE).toFixed(2) + '%',\n\t\t\twidth: (((right - left) / width) * 100 * SCALE).toFixed(2) + '%',\n\t\t\theight: (((bottom - top) / height) * 100 * SCALE).toFixed(2) + '%'\n\t\t},\n\t\teffects + (merge ? buildXMLString('feMerge', {}, merge) : '')\n\t);\n}\n\nexport function boxShadow(\n\t{\n\t\twidth,\n\t\theight,\n\t\tshape,\n\t\topacity,\n\t\tid\n\t}: {\n\t\twidth: number;\n\t\theight: number;\n\t\tshape: string;\n\t\topacity: number;\n\t\tid: string;\n\t},\n\tstyle: Record<string, any>\n) {\n\tif (!style.boxShadow) return null;\n\n\tlet shadow = '';\n\tlet innerShadow = '';\n\n\tfor (let i = style.boxShadow.length - 1; i >= 0; i--) {\n\t\tlet s = '';\n\n\t\tconst shadowStyle = style.boxShadow[i];\n\n\t\tif (shadowStyle.spreadRadius && shadowStyle.inset) {\n\t\t\tshadowStyle.spreadRadius = -shadowStyle.spreadRadius;\n\t\t}\n\n\t\t// Expand the area for the filter to prevent it from cutting off.\n\t\tconst grow =\n\t\t\t(shadowStyle.blurRadius * shadowStyle.blurRadius) / 4 +\n\t\t\t(shadowStyle.spreadRadius || 0);\n\n\t\tconst left = Math.min(\n\t\t\t-grow - (shadowStyle.inset ? shadowStyle.offsetX : 0),\n\t\t\t0\n\t\t);\n\t\tconst right = Math.max(\n\t\t\tgrow + width - (shadowStyle.inset ? shadowStyle.offsetX : 0),\n\t\t\twidth\n\t\t);\n\t\tconst top = Math.min(\n\t\t\t-grow - (shadowStyle.inset ? shadowStyle.offsetY : 0),\n\t\t\t0\n\t\t);\n\t\tconst bottom = Math.max(\n\t\t\tgrow + height - (shadowStyle.inset ? shadowStyle.offsetY : 0),\n\t\t\theight\n\t\t);\n\n\t\tconst sid = `satori_s-${id}-${i}`;\n\t\tconst maskId = `satori_ms-${id}-${i}`;\n\t\tconst shapeWithSpread = shadowStyle.spreadRadius\n\t\t\t? shape.replace(\n\t\t\t\t\t'stroke-width=\"0\"',\n\t\t\t\t\t`stroke-width=\"${shadowStyle.spreadRadius * 2}\"`\n\t\t\t )\n\t\t\t: shape;\n\n\t\ts += buildXMLString(\n\t\t\t'mask',\n\t\t\t{\n\t\t\t\tid: maskId,\n\t\t\t\tmaskUnits: 'userSpaceOnUse'\n\t\t\t},\n\t\t\tbuildXMLString('rect', {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\twidth: style._viewportWidth || '100%',\n\t\t\t\theight: style._viewportHeight || '100%',\n\t\t\t\tfill: shadowStyle.inset ? '#000' : '#fff'\n\t\t\t}) +\n\t\t\t\tshapeWithSpread\n\t\t\t\t\t.replace(\n\t\t\t\t\t\t'fill=\"#fff\"',\n\t\t\t\t\t\tshadowStyle.inset ? 'fill=\"#fff\"' : 'fill=\"#000\"'\n\t\t\t\t\t)\n\t\t\t\t\t.replace('stroke=\"#fff\"', '')\n\t\t);\n\n\t\tlet finalShape = shapeWithSpread\n\t\t\t.replace(/d=\"([^\"]+)\"/, (_, path) => {\n\t\t\t\treturn (\n\t\t\t\t\t'd=\"' +\n\t\t\t\t\tshiftPath(path, shadowStyle.offsetX, shadowStyle.offsetY) +\n\t\t\t\t\t'\"'\n\t\t\t\t);\n\t\t\t})\n\t\t\t.replace(/x=\"([^\"]+)\"/, (_, x) => {\n\t\t\t\treturn 'x=\"' + (parseFloat(x) + shadowStyle.offsetX) + '\"';\n\t\t\t})\n\t\t\t.replace(/y=\"([^\"]+)\"/, (_, y) => {\n\t\t\t\treturn 'y=\"' + (parseFloat(y) + shadowStyle.offsetY) + '\"';\n\t\t\t});\n\n\t\t// Negative spread radius, we need another mask here.\n\t\tif (shadowStyle.spreadRadius && shadowStyle.spreadRadius < 0) {\n\t\t\ts += buildXMLString(\n\t\t\t\t'mask',\n\t\t\t\t{\n\t\t\t\t\tid: maskId + '-neg',\n\t\t\t\t\tmaskUnits: 'userSpaceOnUse'\n\t\t\t\t},\n\t\t\t\tfinalShape\n\t\t\t\t\t.replace('stroke=\"#fff\"', 'stroke=\"#000\"')\n\t\t\t\t\t.replace(\n\t\t\t\t\t\t/stroke-width=\"[^\"]+\"/,\n\t\t\t\t\t\t`stroke-width=\"${-shadowStyle.spreadRadius * 2}\"`\n\t\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tif (shadowStyle.spreadRadius && shadowStyle.spreadRadius < 0) {\n\t\t\tfinalShape = buildXMLString(\n\t\t\t\t'g',\n\t\t\t\t{\n\t\t\t\t\tmask: `url(#${maskId}-neg)`\n\t\t\t\t},\n\t\t\t\tfinalShape\n\t\t\t);\n\t\t}\n\n\t\ts +=\n\t\t\tbuildXMLString(\n\t\t\t\t'defs',\n\t\t\t\t{},\n\t\t\t\tbuildXMLString(\n\t\t\t\t\t'filter',\n\t\t\t\t\t{\n\t\t\t\t\t\tid: sid,\n\t\t\t\t\t\tx: `${(left / width) * 100}%`,\n\t\t\t\t\t\ty: `${(top / height) * 100}%`,\n\t\t\t\t\t\twidth: `${((right - left) / width) * 100}%`,\n\t\t\t\t\t\theight: `${((bottom - top) / height) * 100}%`\n\t\t\t\t\t},\n\t\t\t\t\tbuildXMLString('feGaussianBlur', {\n\t\t\t\t\t\t// According to the spec, we use the half of the blur radius as the standard\n\t\t\t\t\t\t// deviation for the filter.\n\t\t\t\t\t\t// > the image that would be generated by applying to the shadow a Gaussian\n\t\t\t\t\t\t// > blur with a standard deviation equal to half the blur radius\n\t\t\t\t\t\t// > https://www.w3.org/TR/css-backgrounds-3/#shadow-blur\n\t\t\t\t\t\tstdDeviation: shadowStyle.blurRadius / 2,\n\t\t\t\t\t\tresult: 'b'\n\t\t\t\t\t}) +\n\t\t\t\t\t\tbuildXMLString('feFlood', {\n\t\t\t\t\t\t\t'flood-color': shadowStyle.color,\n\t\t\t\t\t\t\tin: 'SourceGraphic',\n\t\t\t\t\t\t\tresult: 'f'\n\t\t\t\t\t\t}) +\n\t\t\t\t\t\tbuildXMLString('feComposite', {\n\t\t\t\t\t\t\tin: 'f',\n\t\t\t\t\t\t\tin2: 'b',\n\t\t\t\t\t\t\toperator: shadowStyle.inset ? 'out' : 'in'\n\t\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t) +\n\t\t\tbuildXMLString(\n\t\t\t\t'g',\n\t\t\t\t{\n\t\t\t\t\tmask: `url(#${maskId})`,\n\t\t\t\t\tfilter: `url(#${sid})`,\n\t\t\t\t\topacity: opacity\n\t\t\t\t},\n\t\t\t\tfinalShape\n\t\t\t);\n\n\t\tif (shadowStyle.inset) {\n\t\t\tinnerShadow += s;\n\t\t} else {\n\t\t\tshadow += s;\n\t\t}\n\t}\n\n\treturn [shadow, innerShadow];\n}\n","import { buildXMLString } from '../utils.js';\nimport type { GlyphBox } from '../font.js';\n\nfunction buildSkipInkSegments(\n\tstart: number,\n\tend: number,\n\tglyphBoxes: GlyphBox[],\n\ty: number,\n\tstrokeWidth: number,\n\tbaseline: number\n) {\n\tconst halfStroke = strokeWidth / 2;\n\tconst bleed = Math.max(halfStroke, strokeWidth * 1.25);\n\tconst skipRanges: [number, number][] = [];\n\n\tfor (const box of glyphBoxes) {\n\t\t// Only skip glyphs that actually cross the underline position and extend below the baseline.\n\t\tif (box.y2 < baseline + halfStroke || box.y1 > y + halfStroke) continue;\n\n\t\tconst from = Math.max(start, box.x1 - bleed);\n\t\tconst to = Math.min(end, box.x2 + bleed);\n\n\t\tif (from >= to) continue;\n\t\tif (skipRanges.length === 0) {\n\t\t\tskipRanges.push([from, to]);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst last = skipRanges[skipRanges.length - 1];\n\t\tif (from <= last[1]) {\n\t\t\tlast[1] = Math.max(last[1], to);\n\t\t} else {\n\t\t\tskipRanges.push([from, to]);\n\t\t}\n\t}\n\n\tif (!skipRanges.length) {\n\t\treturn [[start, end]] as [number, number][];\n\t}\n\n\tconst segments: [number, number][] = [];\n\tlet cursor = start;\n\n\tfor (const [from, to] of skipRanges) {\n\t\tif (from > cursor) {\n\t\t\tsegments.push([cursor, from]);\n\t\t}\n\t\tcursor = Math.max(cursor, to);\n\t\tif (cursor >= end) break;\n\t}\n\n\tif (cursor < end) {\n\t\tsegments.push([cursor, end]);\n\t}\n\n\treturn segments;\n}\n\nexport default function buildDecoration(\n\t{\n\t\twidth,\n\t\tleft,\n\t\ttop,\n\t\tascender,\n\t\tclipPathId,\n\t\tmatrix,\n\t\tglyphBoxes\n\t}: {\n\t\twidth: number;\n\t\tleft: number;\n\t\ttop: number;\n\t\tascender: number;\n\t\tclipPathId?: string;\n\t\tmatrix?: string;\n\t\tglyphBoxes?: GlyphBox[];\n\t},\n\tstyle: Record<string, any>\n) {\n\tconst {\n\t\ttextDecorationColor,\n\t\ttextDecorationStyle,\n\t\ttextDecorationLine,\n\t\ttextDecorationSkipInk,\n\t\tfontSize,\n\t\tcolor\n\t} = style;\n\tif (!textDecorationLine || textDecorationLine === 'none') return '';\n\n\t// The UA should use such font-based information when choosing auto line thicknesses wherever appropriate.\n\t// https://drafts.csswg.org/css-text-decor-4/#text-decoration-thickness\n\tconst height = Math.max(1, fontSize * 0.1);\n\n\tconst y =\n\t\ttextDecorationLine === 'line-through'\n\t\t\t? top + ascender * 0.7\n\t\t\t: textDecorationLine === 'underline'\n\t\t\t? top + ascender * 1.1\n\t\t\t: top;\n\n\tconst dasharray =\n\t\ttextDecorationStyle === 'dashed'\n\t\t\t? `${height * 1.2} ${height * 2}`\n\t\t\t: textDecorationStyle === 'dotted'\n\t\t\t? `0 ${height * 2}`\n\t\t\t: undefined;\n\n\tconst applySkipInk =\n\t\ttextDecorationLine === 'underline' &&\n\t\t(textDecorationSkipInk || 'auto') !== 'none' &&\n\t\tglyphBoxes?.length;\n\n\tconst baseline = top + ascender;\n\n\tconst segments = applySkipInk\n\t\t? buildSkipInkSegments(\n\t\t\t\tleft,\n\t\t\t\tleft + width,\n\t\t\t\tglyphBoxes,\n\t\t\t\ty,\n\t\t\t\theight,\n\t\t\t\tbaseline\n\t\t )\n\t\t: ([[left, left + width]] as [number, number][]);\n\n\t// https://www.w3.org/TR/css-backgrounds-3/#valdef-line-style-double\n\tconst extraLine =\n\t\ttextDecorationStyle === 'double'\n\t\t\t? segments\n\t\t\t\t\t.map(([x1, x2]) =>\n\t\t\t\t\t\tbuildXMLString('line', {\n\t\t\t\t\t\t\tx1,\n\t\t\t\t\t\t\ty1: y + height + 1,\n\t\t\t\t\t\t\tx2,\n\t\t\t\t\t\t\ty2: y + height + 1,\n\t\t\t\t\t\t\tstroke: textDecorationColor || color,\n\t\t\t\t\t\t\t'stroke-width': height,\n\t\t\t\t\t\t\t'stroke-dasharray': dasharray,\n\t\t\t\t\t\t\t'stroke-linecap':\n\t\t\t\t\t\t\t\ttextDecorationStyle === 'dotted'\n\t\t\t\t\t\t\t\t\t? 'round'\n\t\t\t\t\t\t\t\t\t: 'square',\n\t\t\t\t\t\t\ttransform: matrix\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\t\t.join('')\n\t\t\t: '';\n\n\treturn (\n\t\t(clipPathId ? `<g clip-path=\"url(#${clipPathId})\">` : '') +\n\t\tsegments\n\t\t\t.map(([x1, x2]) =>\n\t\t\t\tbuildXMLString('line', {\n\t\t\t\t\tx1,\n\t\t\t\t\ty1: y,\n\t\t\t\t\tx2,\n\t\t\t\t\ty2: y,\n\t\t\t\t\tstroke: textDecorationColor || color,\n\t\t\t\t\t'stroke-width': height,\n\t\t\t\t\t'stroke-dasharray': dasharray,\n\t\t\t\t\t'stroke-linecap':\n\t\t\t\t\t\ttextDecorationStyle === 'dotted' ? 'round' : 'square',\n\t\t\t\t\ttransform: matrix\n\t\t\t\t})\n\t\t\t)\n\t\t\t.join('') +\n\t\textraLine +\n\t\t(clipPathId ? '</g>' : '')\n\t);\n}\n","export function stringFromCode(code: string): string {\n\tcode = code.replace('U+', '0x');\n\n\treturn String.fromCodePoint(Number(code));\n}\n\nexport const Space = stringFromCode('U+0020');\nexport const Tab = stringFromCode('U+0009');\nexport const HorizontalEllipsis = stringFromCode('U+2026');\n","import { FontEngine } from '../font.js';\nimport { segment } from '../utils.js';\n\nexport function genMeasurer(\n\tengine: FontEngine,\n\tisImage: (grapheme: string) => boolean,\n\tstyle: {\n\t\tfontSize: number;\n\t\tletterSpacing: number;\n\t}\n): {\n\tmeasureGrapheme: (grapheme: string) => number;\n\tmeasureGraphemeArray: (graphemes: string[]) => number;\n\tmeasureText: (text: string) => number;\n} {\n\tconst { fontSize, letterSpacing } = style;\n\n\tconst cache = new Map<string, number>();\n\n\tfunction measureGrapheme(grapheme: string): number {\n\t\tlet width = cache.get(grapheme);\n\n\t\tif (width === undefined) {\n\t\t\twidth = engine.measure(grapheme, { fontSize, letterSpacing });\n\t\t\tcache.set(grapheme, width);\n\t\t}\n\n\t\treturn width;\n\t}\n\n\tfunction measureGraphemeArray(graphemes: string[]): number {\n\t\tlet width = 0;\n\n\t\tfor (const grapheme of graphemes) {\n\t\t\tif (isImage(grapheme)) {\n\t\t\t\twidth += fontSize;\n\t\t\t} else {\n\t\t\t\twidth += measureGrapheme(grapheme);\n\t\t\t}\n\t\t}\n\n\t\treturn width;\n\t}\n\n\tfunction measureText(text: string): number {\n\t\treturn measureGraphemeArray(segment(text, 'grapheme'));\n\t}\n\n\treturn {\n\t\tmeasureGrapheme,\n\t\tmeasureGraphemeArray,\n\t\tmeasureText\n\t};\n}\n","import { Locale } from '../language.js';\nimport { isNumber, segment, splitByBreakOpportunities } from '../utils.js';\nimport { HorizontalEllipsis, Space } from './characters.js';\nimport { SerializedStyle } from '../handler/expand.js';\n\nexport function preprocess(\n\tcontent: string,\n\tstyle: SerializedStyle,\n\tlocale?: Locale\n): {\n\twords: string[];\n\trequiredBreaks: boolean[];\n\tallowSoftWrap: boolean;\n\tallowBreakWord: boolean;\n\tprocessedContent: string;\n\tshouldCollapseTabsAndSpaces: boolean;\n\tlineLimit: number;\n\tblockEllipsis: string;\n} {\n\tconst { textTransform, whiteSpace, wordBreak } = style;\n\n\tcontent = processTextTransform(content, textTransform, locale);\n\n\tconst {\n\t\tcontent: processedContent,\n\t\tshouldCollapseTabsAndSpaces,\n\t\tallowSoftWrap\n\t} = processWhiteSpace(content, whiteSpace);\n\n\tconst { words, requiredBreaks, allowBreakWord } = processWordBreak(\n\t\tprocessedContent,\n\t\twordBreak\n\t);\n\n\tconst [lineLimit, blockEllipsis] = processTextOverflow(\n\t\tstyle,\n\t\tallowSoftWrap\n\t);\n\n\treturn {\n\t\twords,\n\t\trequiredBreaks,\n\t\tallowSoftWrap,\n\t\tallowBreakWord,\n\t\tprocessedContent,\n\t\tshouldCollapseTabsAndSpaces,\n\t\tlineLimit,\n\t\tblockEllipsis\n\t};\n}\n\nfunction processTextTransform(\n\tcontent: string,\n\ttextTransform: string,\n\tlocale?: Locale\n): string {\n\tif (textTransform === 'uppercase') {\n\t\tcontent = content.toLocaleUpperCase(locale);\n\t} else if (textTransform === 'lowercase') {\n\t\tcontent = content.toLocaleLowerCase(locale);\n\t} else if (textTransform === 'capitalize') {\n\t\tcontent = segment(content, 'word', locale)\n\t\t\t// For each word...\n\t\t\t.map(word => {\n\t\t\t\t// ...split into graphemes...\n\t\t\t\treturn segment(word, 'grapheme', locale)\n\t\t\t\t\t.map((grapheme, index) => {\n\t\t\t\t\t\t// ...and make the first grapheme uppercase\n\t\t\t\t\t\treturn index === 0\n\t\t\t\t\t\t\t? grapheme.toLocaleUpperCase(locale)\n\t\t\t\t\t\t\t: grapheme;\n\t\t\t\t\t})\n\t\t\t\t\t.join('');\n\t\t\t})\n\t\t\t.join('');\n\t}\n\n\treturn content;\n}\n\nfunction processTextOverflow(\n\tstyle: SerializedStyle,\n\tallowSoftWrap: boolean\n): [number, string?] {\n\tconst {\n\t\ttextOverflow,\n\t\tlineClamp,\n\t\tWebkitLineClamp,\n\t\tWebkitBoxOrient,\n\t\toverflow,\n\t\tdisplay\n\t} = style;\n\n\tif (display === 'block' && lineClamp) {\n\t\tconst [lineLimit, blockEllipsis = HorizontalEllipsis] =\n\t\t\tparseLineClamp(lineClamp);\n\t\tif (lineLimit) {\n\t\t\treturn [lineLimit, blockEllipsis];\n\t\t}\n\t}\n\n\tif (\n\t\ttextOverflow === 'ellipsis' &&\n\t\tdisplay === '-webkit-box' &&\n\t\tWebkitBoxOrient === 'vertical' &&\n\t\tisNumber(WebkitLineClamp) &&\n\t\tWebkitLineClamp > 0\n\t) {\n\t\treturn [WebkitLineClamp, HorizontalEllipsis];\n\t}\n\n\tif (\n\t\ttextOverflow === 'ellipsis' &&\n\t\toverflow === 'hidden' &&\n\t\t!allowSoftWrap\n\t) {\n\t\treturn [1, HorizontalEllipsis];\n\t}\n\n\treturn [Infinity];\n}\n\nfunction processWordBreak(\n\tcontent,\n\twordBreak: string\n): { words: string[]; requiredBreaks: boolean[]; allowBreakWord: boolean } {\n\tconst allowBreakWord = ['break-all', 'break-word'].includes(wordBreak);\n\n\tconst { words, requiredBreaks } = splitByBreakOpportunities(\n\t\tcontent,\n\t\twordBreak\n\t);\n\n\treturn { words, requiredBreaks, allowBreakWord };\n}\n\nfunction processWhiteSpace(\n\tcontent: string,\n\twhiteSpace: string\n): {\n\tcontent: string;\n\tshouldCollapseTabsAndSpaces: boolean;\n\tallowSoftWrap: boolean;\n} {\n\tconst shouldKeepLinebreak = ['pre', 'pre-wrap', 'pre-line'].includes(\n\t\twhiteSpace\n\t);\n\n\tconst shouldCollapseTabsAndSpaces = [\n\t\t'normal',\n\t\t'nowrap',\n\t\t'pre-line'\n\t].includes(whiteSpace);\n\n\tconst allowSoftWrap = !['pre', 'nowrap'].includes(whiteSpace);\n\n\tif (!shouldKeepLinebreak) {\n\t\tcontent = content.replace(/\\n/g, Space);\n\t}\n\n\tif (shouldCollapseTabsAndSpaces) {\n\t\tcontent = content\n\t\t\t.replace(/([ ]|\\t)+/g, Space)\n\t\t\t.replace(/^[ ]|[ ]$/g, '');\n\t}\n\n\treturn { content, shouldCollapseTabsAndSpaces, allowSoftWrap };\n}\n\nfunction parseLineClamp(input: number | string): [number?, string?] {\n\tif (typeof input === 'number') return [input];\n\n\tconst regex1 = /^(\\d+)\\s*\"(.*)\"$/;\n\tconst regex2 = /^(\\d+)\\s*'(.*)'$/;\n\tconst match1 = regex1.exec(input);\n\tconst match2 = regex2.exec(input);\n\n\tif (match1) {\n\t\tconst number = +match1[1];\n\t\tconst text = match1[2];\n\n\t\treturn [number, text];\n\t} else if (match2) {\n\t\tconst number = +match2[1];\n\t\tconst text = match2[2];\n\n\t\treturn [number, text];\n\t}\n\n\treturn [];\n}\n","/**\n * This module calculates the layout of a text string. Currently the only\n * supported inline node is text. All other nodes are using block layout.\n */\nimport type { LayoutContext } from '../layout.js';\nimport {\n\tv,\n\tsegment,\n\twordSeparators,\n\tbuildXMLString,\n\tisUndefined,\n\tisString,\n\tlengthToNumber\n} from '../utils.js';\nimport { getYoga, TYoga, YogaNode } from '../yoga.js';\nimport buildText, { container } from '../builder/text.js';\nimport { buildDropShadow } from '../builder/shadow.js';\nimport buildDecoration from '../builder/text-decoration.js';\nimport type { GlyphBox } from '../font.js';\nimport { Locale } from '../language.js';\nimport { HorizontalEllipsis, Space, Tab } from './characters.js';\nimport { genMeasurer } from './measurer.js';\nimport { preprocess } from './processor.js';\nimport cssColorParse from 'parse-css-color';\n\nconst skippedWordWhenFindingMissingFont = new Set([Tab]);\n\nfunction shouldSkipWhenFindingMissingFont(word: string): boolean {\n\treturn skippedWordWhenFindingMissingFont.has(word);\n}\n\nfunction isFullyTransparent(color: string): boolean {\n\tif (color === 'transparent') return true;\n\tconst parsed = cssColorParse(color);\n\treturn parsed ? parsed.alpha === 0 : false;\n}\n\nfunction isOpaqueWhite(color: string): boolean {\n\tif (!color) return false;\n\tconst parsed = cssColorParse(color);\n\tif (!parsed) return false;\n\tconst [r, g, b, a] = parsed.values;\n\treturn r === 255 && g === 255 && b === 255 && (a === undefined || a === 1);\n}\n\nexport default async function* buildTextNodes(\n\tcontent: string,\n\tcontext: LayoutContext\n): AsyncGenerator<{ word: string; locale?: Locale }[], string, [any, any]> {\n\tconst Yoga = await getYoga();\n\n\tconst {\n\t\tparentStyle,\n\t\tinheritedStyle,\n\t\tparent,\n\t\tfont,\n\t\tid,\n\t\tisInheritingTransform,\n\t\tdebug,\n\t\tembedFont,\n\t\tgraphemeImages,\n\t\tlocale,\n\t\tcanLoadAdditionalAssets\n\t} = context;\n\n\tconst {\n\t\ttextAlign,\n\t\ttextIndent = 0,\n\t\tlineHeight,\n\t\ttextWrap,\n\t\tfontSize,\n\t\tfilter: cssFilter,\n\t\ttabSize = 8,\n\t\tletterSpacing,\n\t\t_inheritedBackgroundClipTextPath,\n\t\t_inheritedBackgroundClipTextHasBackground,\n\t\tflexShrink\n\t} = parentStyle;\n\n\tconst {\n\t\twords,\n\t\trequiredBreaks,\n\t\tallowSoftWrap,\n\t\tallowBreakWord,\n\t\tprocessedContent,\n\t\tshouldCollapseTabsAndSpaces,\n\t\tlineLimit,\n\t\tblockEllipsis\n\t} = preprocess(content, parentStyle, locale);\n\n\tconst textContainer = createTextContainerNode(Yoga, textAlign);\n\tparent.insertChild(textContainer, parent.getChildCount());\n\n\tif (isUndefined(flexShrink)) {\n\t\tparent.setFlexShrink(1);\n\t}\n\n\t// Get the correct font according to the container style.\n\t// https://www.w3.org/TR/CSS2/visudet.html\n\tlet engine = font.getEngine(fontSize, lineHeight, parentStyle, locale);\n\n\t// Yield segments that are missing a font.\n\tconst wordsMissingFont = canLoadAdditionalAssets\n\t\t? segment(processedContent, 'grapheme').filter(\n\t\t\t\tword =>\n\t\t\t\t\t!shouldSkipWhenFindingMissingFont(word) && !engine.has(word)\n\t\t )\n\t\t: [];\n\n\tyield wordsMissingFont.map(word => {\n\t\treturn {\n\t\t\tword,\n\t\t\tlocale\n\t\t};\n\t});\n\n\tif (wordsMissingFont.length) {\n\t\t// Reload the engine with additional fonts.\n\t\tengine = font.getEngine(fontSize, lineHeight, parentStyle, locale);\n\t}\n\n\tfunction isImage(s: string): boolean {\n\t\treturn !!(graphemeImages && graphemeImages[s]);\n\t}\n\n\tconst { measureGrapheme, measureGraphemeArray, measureText } = genMeasurer(\n\t\tengine,\n\t\tisImage,\n\t\t{\n\t\t\tfontSize,\n\t\t\tletterSpacing\n\t\t}\n\t);\n\n\tconst tabWidth = isString(tabSize)\n\t\t? lengthToNumber(tabSize, fontSize, 1, parentStyle)\n\t\t: measureGrapheme(Space) * tabSize;\n\n\tconst calc = (\n\t\ttext: string,\n\t\tcurrentWidth: number\n\t): {\n\t\toriginWidth: number;\n\t\tendingSpacesWidth: number;\n\t\ttext: string;\n\t} => {\n\t\tif (text.length === 0) {\n\t\t\treturn {\n\t\t\t\toriginWidth: 0,\n\t\t\t\tendingSpacesWidth: 0,\n\t\t\t\ttext\n\t\t\t};\n\t\t}\n\n\t\tconst { index, tabCount } = detectTabs(text);\n\n\t\tlet originWidth = 0;\n\n\t\tif (tabCount > 0) {\n\t\t\tconst textBeforeTab = text.slice(0, index);\n\t\t\tconst textAfterTab = text.slice(index + tabCount);\n\t\t\tconst textWidthBeforeTab = measureText(textBeforeTab);\n\t\t\tconst offsetBeforeTab = textWidthBeforeTab + currentWidth;\n\t\t\tconst tabMoveDistance =\n\t\t\t\ttabWidth === 0\n\t\t\t\t\t? textWidthBeforeTab\n\t\t\t\t\t: (Math.floor(offsetBeforeTab / tabWidth) + tabCount) *\n\t\t\t\t\t tabWidth;\n\t\t\toriginWidth = tabMoveDistance + measureText(textAfterTab);\n\t\t} else {\n\t\t\toriginWidth = measureText(text);\n\t\t}\n\n\t\tconst afterTrimEndWidth =\n\t\t\ttext.trimEnd() === text ? originWidth : measureText(text.trimEnd());\n\n\t\treturn {\n\t\t\toriginWidth,\n\t\t\tendingSpacesWidth: originWidth - afterTrimEndWidth,\n\t\t\ttext\n\t\t};\n\t};\n\n\t// Global variables used to compute the text layout.\n\t// @TODO: Use segments instead of words to properly support kerning.\n\tlet lineWidths = [];\n\tlet baselines = [];\n\tlet lineSegmentNumber = [];\n\tlet texts: string[] = [];\n\tlet wordPositionInLayout: (null | {\n\t\tx: number;\n\t\ty: number;\n\t\twidth: number;\n\t\tline: number;\n\t\tlineIndex: number;\n\t\tisImage: boolean;\n\t})[] = [];\n\n\t// With the given container width, compute the text layout.\n\tfunction flow(width: number) {\n\t\tlet lines = 0;\n\t\tlet maxWidth = 0;\n\t\tlet lineIndex = -1;\n\t\tlet height = 0;\n\t\tlet currentWidth = 0;\n\t\tlet currentLineHeight = 0;\n\t\tlet currentBaselineOffset = 0;\n\n\t\tlineWidths = [];\n\t\tlineSegmentNumber = [0];\n\t\ttexts = [];\n\t\twordPositionInLayout = [];\n\n\t\t// We naively implement the width calculation without proper kerning.\n\t\t// @TODO: Support different writing modes.\n\t\t// @TODO: Support RTL languages.\n\t\tlet i = 0;\n\t\tlet prevLineEndingSpacesWidth = 0;\n\t\twhile (i < words.length && lines < lineLimit) {\n\t\t\tlet word = words[i];\n\t\t\tconst forceBreak = requiredBreaks[i];\n\n\t\t\tlet w = 0;\n\n\t\t\tconst {\n\t\t\t\toriginWidth,\n\t\t\t\tendingSpacesWidth,\n\t\t\t\ttext: _word\n\t\t\t} = calc(word, currentWidth);\n\t\t\tword = _word;\n\n\t\t\tw = originWidth;\n\t\t\tconst lineEndingSpacesWidth = endingSpacesWidth;\n\n\t\t\t// When starting a new line from an empty line, we should push one extra\n\t\t\t// line height.\n\t\t\tif (forceBreak && currentLineHeight === 0) {\n\t\t\t\tcurrentLineHeight = engine.height(word);\n\t\t\t}\n\n\t\t\tconst allowedToJustify = textAlign === 'justify';\n\n\t\t\tconst willWrap =\n\t\t\t\ti &&\n\t\t\t\t// When determining whether a line break is necessary, the width of the\n\t\t\t\t// trailing spaces is not included in the calculation, as the end boundary\n\t\t\t\t// can be closely adjacent to the last non-space character.\n\t\t\t\t// e.g.\n\t\t\t\t// 'aaa bbb ccc'\n\t\t\t\t// When the break line happens at the end of the `bbb`, what we see looks like this\n\t\t\t\t// |aaa bbb|\n\t\t\t\t// |ccc |\n\t\t\t\tcurrentWidth + w > width + lineEndingSpacesWidth &&\n\t\t\t\tallowSoftWrap;\n\n\t\t\t// Need to break the word if:\n\t\t\t// - we have break-word\n\t\t\t// - the word is wider than the container width\n\t\t\t// - the word will be put at the beginning of the line\n\t\t\tconst needToBreakWord =\n\t\t\t\tallowBreakWord &&\n\t\t\t\tw > width &&\n\t\t\t\t(!currentWidth || willWrap || forceBreak);\n\n\t\t\tif (needToBreakWord) {\n\t\t\t\t// Break the word into multiple segments and continue the loop.\n\t\t\t\tconst chars = segment(word, 'grapheme');\n\t\t\t\twords.splice(i, 1, ...chars);\n\t\t\t\tif (currentWidth > 0) {\n\t\t\t\t\t// Start a new line, spaces can be ignored.\n\t\t\t\t\tlineWidths.push(currentWidth - prevLineEndingSpacesWidth);\n\t\t\t\t\tbaselines.push(currentBaselineOffset);\n\t\t\t\t\tlines++;\n\t\t\t\t\theight += currentLineHeight;\n\t\t\t\t\tcurrentWidth = 0;\n\t\t\t\t\tcurrentLineHeight = 0;\n\t\t\t\t\tcurrentBaselineOffset = 0;\n\t\t\t\t\tlineSegmentNumber.push(1);\n\t\t\t\t\tlineIndex = -1;\n\t\t\t\t}\n\t\t\t\tprevLineEndingSpacesWidth = lineEndingSpacesWidth;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (forceBreak || willWrap) {\n\t\t\t\t// Start a new line, spaces can be ignored.\n\t\t\t\tif (shouldCollapseTabsAndSpaces && word === Space) {\n\t\t\t\t\tw = 0;\n\t\t\t\t}\n\n\t\t\t\tlineWidths.push(currentWidth - prevLineEndingSpacesWidth);\n\t\t\t\tbaselines.push(currentBaselineOffset);\n\t\t\t\tlines++;\n\t\t\t\theight += currentLineHeight;\n\t\t\t\tcurrentWidth = w;\n\t\t\t\tcurrentLineHeight = w ? Math.round(engine.height(word)) : 0;\n\t\t\t\tcurrentBaselineOffset = w\n\t\t\t\t\t? Math.round(engine.baseline(word))\n\t\t\t\t\t: 0;\n\t\t\t\tlineSegmentNumber.push(1);\n\t\t\t\tlineIndex = -1;\n\n\t\t\t\t// If it's naturally broken, we update the max width.\n\t\t\t\t// Since if there are multiple lines, the width should fit the\n\t\t\t\t// container.\n\t\t\t\tif (!forceBreak) {\n\t\t\t\t\tmaxWidth = Math.max(maxWidth, width);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// It fits into the current line.\n\t\t\t\tcurrentWidth += w;\n\t\t\t\tconst glyphHeight = Math.round(engine.height(word));\n\t\t\t\tif (glyphHeight > currentLineHeight) {\n\t\t\t\t\t// Use the baseline of the highest segment as the baseline of the line.\n\t\t\t\t\tcurrentLineHeight = glyphHeight;\n\t\t\t\t\tcurrentBaselineOffset = Math.round(engine.baseline(word));\n\t\t\t\t}\n\t\t\t\tif (allowedToJustify) {\n\t\t\t\t\tlineSegmentNumber[lineSegmentNumber.length - 1]++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (allowedToJustify) {\n\t\t\t\tlineIndex++;\n\t\t\t}\n\n\t\t\tmaxWidth = Math.max(maxWidth, currentWidth);\n\n\t\t\tlet x = currentWidth - w;\n\n\t\t\tif (w === 0) {\n\t\t\t\twordPositionInLayout.push({\n\t\t\t\t\ty: height,\n\t\t\t\t\tx,\n\t\t\t\t\twidth: 0,\n\t\t\t\t\tline: lines,\n\t\t\t\t\tlineIndex,\n\t\t\t\t\tisImage: false\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst _texts = segment(word, 'word');\n\n\t\t\t\tfor (let j = 0; j < _texts.length; j++) {\n\t\t\t\t\tconst _text = _texts[j];\n\t\t\t\t\tlet _width = 0;\n\t\t\t\t\tlet _isImage = false;\n\n\t\t\t\t\tif (isImage(_text)) {\n\t\t\t\t\t\t_width = fontSize;\n\t\t\t\t\t\t_isImage = true;\n\t\t\t\t\t} else if (!embedFont && _text.length > 1) {\n\t\t\t\t\t\t// When embedFont is false, use measureText for multi-character strings\n\t\t\t\t\t\t// to ensure consistency with how currentWidth is accumulated (sum of\n\t\t\t\t\t\t// grapheme widths). measureGrapheme uses getAdvanceWidth which includes\n\t\t\t\t\t\t// kerning, causing position mismatches between consecutive <text> elements.\n\t\t\t\t\t\t_width = measureText(_text);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_width = measureGrapheme(_text);\n\t\t\t\t\t}\n\n\t\t\t\t\ttexts.push(_text);\n\t\t\t\t\twordPositionInLayout.push({\n\t\t\t\t\t\ty: height,\n\t\t\t\t\t\tx,\n\t\t\t\t\t\twidth: _width,\n\t\t\t\t\t\tline: lines,\n\t\t\t\t\t\tlineIndex,\n\t\t\t\t\t\tisImage: _isImage\n\t\t\t\t\t});\n\n\t\t\t\t\tx += _width;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ti++;\n\t\t\tprevLineEndingSpacesWidth = lineEndingSpacesWidth;\n\t\t}\n\n\t\tif (currentWidth) {\n\t\t\tif (lines < lineLimit) {\n\t\t\t\theight += currentLineHeight;\n\t\t\t}\n\t\t\tlines++;\n\t\t\tlineWidths.push(currentWidth);\n\t\t\tbaselines.push(currentBaselineOffset);\n\t\t}\n\n\t\t// @TODO: Support `line-height`.\n\t\treturn { width: maxWidth, height };\n\t}\n\n\t// It's possible that the text's measured size is different from the container's\n\t// size, because the container might have a fixed width or height or being\n\t// expanded by its parent.\n\tlet measuredTextSize = { width: 0, height: 0 };\n\ttextContainer.setMeasureFunc(containerWidth => {\n\t\tconst { width, height } = flow(containerWidth);\n\n\t\t// When doing `text-wrap: balance`, we reflow the text multiple times\n\t\t// using binary search to find the best width.\n\t\t// https://www.w3.org/TR/css-text-4/#valdef-text-wrap-balance\n\t\tif (textWrap === 'balance') {\n\t\t\tlet l = width / 2;\n\t\t\tlet r = width;\n\t\t\tlet m: number = width;\n\t\t\twhile (l + 1 < r) {\n\t\t\t\tm = (l + r) / 2;\n\t\t\t\tconst { height: mHeight } = flow(m);\n\t\t\t\tif (mHeight > height) {\n\t\t\t\t\tl = m;\n\t\t\t\t} else {\n\t\t\t\t\tr = m;\n\t\t\t\t}\n\t\t\t}\n\t\t\tflow(r);\n\t\t\tconst _width = Math.ceil(r);\n\t\t\tmeasuredTextSize = { width: _width, height };\n\t\t\treturn { width: _width, height };\n\t\t}\n\n\t\t// When doing `text-wrap: pretty`, we try to avoid ending a paragraph with a single word\n\t\t// by reshaping all lines in a way that achieves more balanced line lengths\n\t\t// This \"pretty\" line breaking algorithm tries to achieve optimal line breaks\n\t\t// that avoid orphans (single words at the end of a paragraph) and create\n\t\t// visually pleasing line lengths.\n\t\tif (textWrap === 'pretty') {\n\t\t\t// Check if the last line has a single word or is very short\n\t\t\t// (typically less than 1/3 of the container width)\n\t\t\tconst lastLineWidth = lineWidths[lineWidths.length - 1];\n\t\t\tconst isLastLineShort = lastLineWidth < width / 3;\n\n\t\t\tif (isLastLineShort) {\n\t\t\t\t// Reflow the paragraph with slightly adjusted line breaks\n\t\t\t\t// to avoid orphans and create more even line lengths\n\t\t\t\t// This is a simplified approach - a real implementation would use a\n\t\t\t\t// more sophisticated algorithm to find optimal line breaks\n\n\t\t\t\t// We'll just reflow once with slightly reduced width to force\n\t\t\t\t// redistribution of words. This is much simplified from the actual\n\t\t\t\t// paragraph-level line breaking algorithm which would compute scores\n\t\t\t\t// for different line break combinations.\n\t\t\t\tconst adjustedWidth = width * 0.9;\n\t\t\t\tconst result = flow(adjustedWidth);\n\n\t\t\t\t// Use the result if it reduces orphans without adding too many lines\n\t\t\t\tif (result.height <= height * 1.3) {\n\t\t\t\t\tmeasuredTextSize = { width, height: result.height };\n\t\t\t\t\treturn { width, height: result.height };\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst _width = Math.ceil(width);\n\t\tmeasuredTextSize = { width: _width, height };\n\t\t// This may be a temporary fix, I didn't dig deep into yoga.\n\t\t// But when the return value of width here doesn't change (assuming the value of width is 216.9),\n\t\t// when we later get the width through `parent.getComputedWidth()`, sometimes it returns 216 and sometimes 217.\n\t\t// I'm not sure if this is a yoga bug, but it seems related to the entire page width.\n\t\t// So I use Math.ceil.\n\t\treturn { width: _width, height };\n\t});\n\n\tconst [x, y] = yield;\n\n\tlet result = '';\n\tlet backgroundClipDef = '';\n\n\tconst clipPathId = inheritedStyle._inheritedClipPathId as\n\t\t| string\n\t\t| undefined;\n\tconst overflowMaskId = inheritedStyle._inheritedMaskId as\n\t\t| number\n\t\t| undefined;\n\n\tconst {\n\t\tleft: containerLeft,\n\t\ttop: containerTop,\n\t\twidth: containerWidth,\n\t\theight: containerHeight\n\t} = textContainer.getComputedLayout();\n\n\t// Convert textIndent to number if it's a string (e.g., percentage)\n\tconst textIndentNumber =\n\t\ttypeof textIndent === 'string'\n\t\t\t? lengthToNumber(\n\t\t\t\t\ttextIndent,\n\t\t\t\t\tfontSize,\n\t\t\t\t\tcontainerWidth,\n\t\t\t\t\tparentStyle,\n\t\t\t\t\ttrue\n\t\t\t ) || 0\n\t\t\t: textIndent;\n\n\tconst parentContainerInnerWidth =\n\t\tparent.getComputedWidth() -\n\t\tparent.getComputedPadding(Yoga.EDGE_LEFT) -\n\t\tparent.getComputedPadding(Yoga.EDGE_RIGHT) -\n\t\tparent.getComputedBorder(Yoga.EDGE_LEFT) -\n\t\tparent.getComputedBorder(Yoga.EDGE_RIGHT);\n\n\t// Attach offset to the current node.\n\tconst left = x + containerLeft;\n\tconst top = y + containerTop;\n\n\tconst { matrix, opacity } = container(\n\t\t{\n\t\t\tleft: containerLeft,\n\t\t\ttop: containerTop,\n\t\t\twidth: containerWidth,\n\t\t\theight: containerHeight,\n\t\t\tisInheritingTransform\n\t\t},\n\t\tparentStyle\n\t);\n\n\tlet filter = '';\n\tif (parentStyle.textShadowOffset) {\n\t\tconst { textShadowColor, textShadowOffset, textShadowRadius } =\n\t\t\tparentStyle;\n\n\t\tfilter = buildDropShadow(\n\t\t\t{\n\t\t\t\twidth: measuredTextSize.width,\n\t\t\t\theight: measuredTextSize.height,\n\t\t\t\tid\n\t\t\t},\n\t\t\t{\n\t\t\t\tshadowColor: textShadowColor,\n\t\t\t\tshadowOffset: textShadowOffset,\n\t\t\t\tshadowRadius: textShadowRadius\n\t\t\t},\n\t\t\tisFullyTransparent(parentStyle.color) ||\n\t\t\t\t(_inheritedBackgroundClipTextHasBackground &&\n\t\t\t\t\tisOpaqueWhite(parentStyle.color))\n\t\t);\n\n\t\tfilter = buildXMLString('defs', {}, filter);\n\t}\n\n\tlet decorationShape = '';\n\tlet mergedPath = '';\n\tlet extra = '';\n\tlet skippedLine = -1;\n\ttype DecorationLine = {\n\t\tleft: number;\n\t\ttop: number;\n\t\tascender: number;\n\t\twidth: number;\n\t};\n\tlet decorationLines: Record<number, DecorationLine | null> = {};\n\tlet decorationGlyphs: Record<number, GlyphBox[]> = {};\n\tlet wordBuffer: string | null = null;\n\tlet bufferedOffset = 0;\n\n\tfor (let i = 0; i < texts.length; i++) {\n\t\t// Skip whitespace and empty characters.\n\t\tconst layout = wordPositionInLayout[i];\n\t\tconst nextLayout = wordPositionInLayout[i + 1];\n\n\t\tif (!layout) continue;\n\n\t\tlet text = texts[i];\n\t\tlet path: string | null = null;\n\t\tlet isLastDisplayedBeforeEllipsis = false;\n\n\t\tconst image = graphemeImages ? graphemeImages[text] : null;\n\n\t\tlet topOffset = layout.y;\n\t\tlet leftOffset = layout.x;\n\t\tconst width = layout.width;\n\t\tconst line = layout.line;\n\t\tconst shouldCollectDecorationBoxes =\n\t\t\tparentStyle.textDecorationLine === 'underline' &&\n\t\t\t(parentStyle.textDecorationSkipInk || 'auto') !== 'none';\n\n\t\tif (line === skippedLine) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// When `text-align` is `justify`, the width of the line will be adjusted.\n\t\tlet extendedWidth = false;\n\n\t\t// Apply text-indent to the first line (for both single and multi-line text)\n\t\tif (line === 0 && textIndentNumber !== 0) {\n\t\t\tleftOffset += textIndentNumber;\n\t\t}\n\n\t\tif (lineWidths.length > 1) {\n\t\t\t// Calculate alignment. Note that for Flexbox, there is only text\n\t\t\t// alignment when the container is multi-line.\n\t\t\tconst remainingWidth = containerWidth - lineWidths[line];\n\t\t\tif (textAlign === 'right' || textAlign === 'end') {\n\t\t\t\tleftOffset += remainingWidth;\n\t\t\t} else if (textAlign === 'center') {\n\t\t\t\tleftOffset += remainingWidth / 2;\n\t\t\t} else if (textAlign === 'justify') {\n\t\t\t\t// Don't justify the last line.\n\t\t\t\tif (line < lineWidths.length - 1) {\n\t\t\t\t\tconst segments = lineSegmentNumber[line];\n\t\t\t\t\tconst gutter =\n\t\t\t\t\t\tsegments > 1 ? remainingWidth / (segments - 1) : 0;\n\t\t\t\t\tleftOffset += gutter * layout.lineIndex;\n\t\t\t\t\textendedWidth = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Only round for embedded fonts (paths benefit from pixel alignment).\n\t\t\t// For non-embedded fonts (<text> elements), keep fractional positions\n\t\t\t// to maintain consistent spacing between consecutive elements.\n\t\t\tif (embedFont) {\n\t\t\t\tleftOffset = Math.round(leftOffset);\n\t\t\t}\n\t\t}\n\n\t\tconst baselineOfLine = baselines[line];\n\t\tconst baselineOfWord = engine.baseline(text);\n\t\tconst heightOfWord = engine.height(text);\n\t\tconst baselineDelta = baselineOfLine - baselineOfWord;\n\n\t\tconst buildUnderlineBand = (offset: number) => {\n\t\t\tif (\n\t\t\t\t!shouldCollectDecorationBoxes ||\n\t\t\t\tparentStyle.textDecorationLine !== 'underline'\n\t\t\t) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst baseline = top + offset + baselineDelta + baselineOfWord;\n\t\t\treturn {\n\t\t\t\tunderlineY: baseline + baselineOfWord * 0.1,\n\t\t\t\tstrokeWidth: Math.max(1, fontSize * 0.1)\n\t\t\t};\n\t\t};\n\n\t\tif (!decorationLines[line]) {\n\t\t\tdecorationLines[line] = {\n\t\t\t\tleft: leftOffset,\n\t\t\t\ttop: top + topOffset + baselineDelta,\n\t\t\t\tascender: baselineOfWord,\n\t\t\t\twidth: extendedWidth ? containerWidth : lineWidths[line]\n\t\t\t};\n\t\t}\n\n\t\tif (lineLimit !== Infinity) {\n\t\t\tlet _blockEllipsis = blockEllipsis;\n\t\t\tlet ellipsisWidth = measureGrapheme(blockEllipsis);\n\t\t\tif (ellipsisWidth > parentContainerInnerWidth) {\n\t\t\t\t_blockEllipsis = HorizontalEllipsis;\n\t\t\t\tellipsisWidth = measureGrapheme(_blockEllipsis);\n\t\t\t}\n\t\t\tconst spaceWidth = measureGrapheme(Space);\n\t\t\tconst isNotLastLine = line < lineWidths.length - 1;\n\t\t\tconst isLastAllowedLine = line + 1 === lineLimit;\n\n\t\t\tfunction calcEllipsis(baseWidth: number, _text: string) {\n\t\t\t\tconst chars = segment(_text, 'grapheme', locale);\n\n\t\t\t\tlet subset = '';\n\t\t\t\tlet resolvedWidth = 0;\n\n\t\t\t\tfor (const char of chars) {\n\t\t\t\t\tconst w = baseWidth + measureGraphemeArray([subset + char]);\n\t\t\t\t\tif (\n\t\t\t\t\t\t// Keep at least one character:\n\t\t\t\t\t\t// > The first character or atomic inline-level element on a line\n\t\t\t\t\t\t// must be clipped rather than ellipsed.\n\t\t\t\t\t\t// https://drafts.csswg.org/css-overflow/#text-overflow\n\t\t\t\t\t\tsubset &&\n\t\t\t\t\t\tw + ellipsisWidth > parentContainerInnerWidth\n\t\t\t\t\t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tsubset += char;\n\t\t\t\t\tresolvedWidth = w;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tsubset,\n\t\t\t\t\tresolvedWidth\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tisLastAllowedLine &&\n\t\t\t\t(isNotLastLine || lineWidths[line] > parentContainerInnerWidth)\n\t\t\t) {\n\t\t\t\tif (\n\t\t\t\t\tleftOffset + width + ellipsisWidth + spaceWidth >\n\t\t\t\t\tparentContainerInnerWidth\n\t\t\t\t) {\n\t\t\t\t\tconst { subset, resolvedWidth } = calcEllipsis(\n\t\t\t\t\t\tleftOffset,\n\t\t\t\t\t\ttext\n\t\t\t\t\t);\n\n\t\t\t\t\ttext = subset + _blockEllipsis;\n\t\t\t\t\tskippedLine = line;\n\t\t\t\t\tdecorationLines[line].width = Math.max(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tresolvedWidth - decorationLines[line].left\n\t\t\t\t\t);\n\t\t\t\t\tisLastDisplayedBeforeEllipsis = true;\n\t\t\t\t} else if (nextLayout && nextLayout.line !== line) {\n\t\t\t\t\tif (textAlign === 'center') {\n\t\t\t\t\t\tconst { subset, resolvedWidth } = calcEllipsis(\n\t\t\t\t\t\t\tleftOffset,\n\t\t\t\t\t\t\ttext\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\ttext = subset + _blockEllipsis;\n\t\t\t\t\t\tskippedLine = line;\n\t\t\t\t\t\tdecorationLines[line].width = Math.max(\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\tresolvedWidth - decorationLines[line].left\n\t\t\t\t\t\t);\n\t\t\t\t\t\tisLastDisplayedBeforeEllipsis = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst nextLineText = texts[i + 1];\n\n\t\t\t\t\t\tconst { subset, resolvedWidth } = calcEllipsis(\n\t\t\t\t\t\t\twidth + leftOffset,\n\t\t\t\t\t\t\tnextLineText\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\ttext = text + subset + _blockEllipsis;\n\t\t\t\t\t\tskippedLine = line;\n\t\t\t\t\t\tdecorationLines[line].width = Math.max(\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\tresolvedWidth - decorationLines[line].left\n\t\t\t\t\t\t);\n\t\t\t\t\t\tisLastDisplayedBeforeEllipsis = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (image) {\n\t\t\t// For images, we remove the baseline offset.\n\t\t\ttopOffset += 0;\n\t\t} else if (embedFont) {\n\t\t\t// If the current word and the next word are on the same line, we try to\n\t\t\t// merge them together to better handle the kerning.\n\t\t\tif (\n\t\t\t\t!text.includes(Tab) &&\n\t\t\t\t!wordSeparators.includes(text) &&\n\t\t\t\ttexts[i + 1] &&\n\t\t\t\tnextLayout &&\n\t\t\t\t!nextLayout.isImage &&\n\t\t\t\ttopOffset === nextLayout.y &&\n\t\t\t\t!isLastDisplayedBeforeEllipsis\n\t\t\t) {\n\t\t\t\tif (wordBuffer === null) {\n\t\t\t\t\tbufferedOffset = leftOffset;\n\t\t\t\t}\n\t\t\t\twordBuffer = wordBuffer === null ? text : wordBuffer + text;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst finalizedSegment =\n\t\t\t\twordBuffer === null ? text : wordBuffer + text;\n\t\t\tconst finalizedLeftOffset =\n\t\t\t\twordBuffer === null ? leftOffset : bufferedOffset;\n\t\t\tconst finalizedWidth =\n\t\t\t\tlayout.width + leftOffset - finalizedLeftOffset;\n\n\t\t\tconst band = buildUnderlineBand(topOffset);\n\n\t\t\tconst svg = engine.getSVG(\n\t\t\t\tfinalizedSegment.replace(/(\\t)+/g, ''),\n\t\t\t\t{\n\t\t\t\t\tfontSize,\n\t\t\t\t\tleft: left + finalizedLeftOffset,\n\t\t\t\t\t// Since we need to pass the baseline position, add the ascender to the top.\n\t\t\t\t\ttop: top + topOffset + baselineOfWord + baselineDelta,\n\t\t\t\t\tletterSpacing\n\t\t\t\t},\n\t\t\t\tband\n\t\t\t);\n\n\t\t\tpath = svg.path;\n\n\t\t\tif (shouldCollectDecorationBoxes && svg.boxes && svg.boxes.length) {\n\t\t\t\t(decorationGlyphs[line] || (decorationGlyphs[line] = [])).push(\n\t\t\t\t\t...svg.boxes\n\t\t\t\t);\n\t\t\t}\n\n\t\t\twordBuffer = null;\n\n\t\t\tif (debug) {\n\t\t\t\textra +=\n\t\t\t\t\t// Glyph\n\t\t\t\t\tbuildXMLString('rect', {\n\t\t\t\t\t\tx: left + finalizedLeftOffset,\n\t\t\t\t\t\ty: top + topOffset + baselineDelta,\n\t\t\t\t\t\twidth: finalizedWidth,\n\t\t\t\t\t\theight: heightOfWord,\n\t\t\t\t\t\tfill: 'transparent',\n\t\t\t\t\t\tstroke: '#575eff',\n\t\t\t\t\t\t'stroke-width': 1,\n\t\t\t\t\t\ttransform: matrix ? matrix : undefined,\n\t\t\t\t\t\t'clip-path': clipPathId\n\t\t\t\t\t\t\t? `url(#${clipPathId})`\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}) +\n\t\t\t\t\t// Baseline\n\t\t\t\t\tbuildXMLString('line', {\n\t\t\t\t\t\tx1: left + leftOffset,\n\t\t\t\t\t\tx2: left + leftOffset + layout.width,\n\t\t\t\t\t\ty1: top + topOffset + baselineDelta + baselineOfWord,\n\t\t\t\t\t\ty2: top + topOffset + baselineDelta + baselineOfWord,\n\t\t\t\t\t\tstroke: '#14c000',\n\t\t\t\t\t\t'stroke-width': 1,\n\t\t\t\t\t\ttransform: matrix ? matrix : undefined,\n\t\t\t\t\t\t'clip-path': clipPathId\n\t\t\t\t\t\t\t? `url(#${clipPathId})`\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\t// We need manually add the font ascender height to ensure it starts\n\t\t\t// at the baseline because <text>'s alignment baseline is set to `hanging`\n\t\t\t// by default and supported to change in SVG 1.1.\n\t\t\ttopOffset += baselineOfWord + baselineDelta;\n\n\t\t\tif (shouldCollectDecorationBoxes && !image) {\n\t\t\t\tconst band = buildUnderlineBand(topOffset);\n\n\t\t\t\tconst svg = engine.getSVG(\n\t\t\t\t\ttext.replace(/(\\t)+/g, ''),\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize,\n\t\t\t\t\t\tleft: left + leftOffset,\n\t\t\t\t\t\ttop: top + topOffset,\n\t\t\t\t\t\tletterSpacing\n\t\t\t\t\t},\n\t\t\t\t\tband\n\t\t\t\t);\n\n\t\t\t\tif (svg.boxes && svg.boxes.length) {\n\t\t\t\t\t(\n\t\t\t\t\t\tdecorationGlyphs[line] || (decorationGlyphs[line] = [])\n\t\t\t\t\t).push(...svg.boxes);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (path !== null) {\n\t\t\tmergedPath += path + ' ';\n\t\t} else {\n\t\t\tconst [t, shape] = buildText(\n\t\t\t\t{\n\t\t\t\t\tcontent: text,\n\t\t\t\t\tfilter,\n\t\t\t\t\tid,\n\t\t\t\t\tleft: left + leftOffset,\n\t\t\t\t\ttop: top + topOffset,\n\t\t\t\t\twidth,\n\t\t\t\t\theight: heightOfWord,\n\t\t\t\t\tmatrix,\n\t\t\t\t\topacity,\n\t\t\t\t\timage,\n\t\t\t\t\tclipPathId,\n\t\t\t\t\tdebug,\n\t\t\t\t\tshape: !!_inheritedBackgroundClipTextPath\n\t\t\t\t},\n\t\t\t\tparentStyle\n\t\t\t);\n\t\t\tresult += t;\n\t\t\tbackgroundClipDef += shape;\n\t\t}\n\n\t\tif (isLastDisplayedBeforeEllipsis) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (parentStyle.textDecorationLine) {\n\t\tdecorationShape = Object.entries(decorationLines)\n\t\t\t.map(([lineIndex, deco]) => {\n\t\t\t\tif (!deco) return '';\n\t\t\t\tconst glyphBoxes = decorationGlyphs[lineIndex] || [];\n\n\t\t\t\treturn buildDecoration(\n\t\t\t\t\t{\n\t\t\t\t\t\tleft: left + deco.left,\n\t\t\t\t\t\ttop: deco.top,\n\t\t\t\t\t\twidth: deco.width,\n\t\t\t\t\t\tascender: deco.ascender,\n\t\t\t\t\t\tclipPathId,\n\t\t\t\t\t\tmatrix,\n\t\t\t\t\t\tglyphBoxes\n\t\t\t\t\t},\n\t\t\t\t\tparentStyle\n\t\t\t\t);\n\t\t\t})\n\t\t\t.join('');\n\t}\n\n\t// Embed the font as path.\n\tif (mergedPath) {\n\t\tconst p =\n\t\t\t(!isFullyTransparent(parentStyle.color) || filter) && opacity !== 0\n\t\t\t\t? `<g ${\n\t\t\t\t\t\toverflowMaskId ? `mask=\"url(#${overflowMaskId})\"` : ''\n\t\t\t\t } ${clipPathId ? `clip-path=\"url(#${clipPathId})\"` : ''}>` +\n\t\t\t\t buildXMLString('path', {\n\t\t\t\t\t\tfill:\n\t\t\t\t\t\t\tfilter &&\n\t\t\t\t\t\t\t(isFullyTransparent(parentStyle.color) ||\n\t\t\t\t\t\t\t\t(_inheritedBackgroundClipTextHasBackground &&\n\t\t\t\t\t\t\t\t\tisOpaqueWhite(parentStyle.color)))\n\t\t\t\t\t\t\t\t? 'black'\n\t\t\t\t\t\t\t\t: parentStyle.color,\n\t\t\t\t\t\td: mergedPath,\n\t\t\t\t\t\ttransform: matrix ? matrix : undefined,\n\t\t\t\t\t\topacity: opacity !== 1 ? opacity : undefined,\n\t\t\t\t\t\tstyle: cssFilter ? `filter:${cssFilter}` : undefined,\n\t\t\t\t\t\t'stroke-width': inheritedStyle.WebkitTextStrokeWidth\n\t\t\t\t\t\t\t? `${inheritedStyle.WebkitTextStrokeWidth}px`\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\tstroke: inheritedStyle.WebkitTextStrokeWidth\n\t\t\t\t\t\t\t? inheritedStyle.WebkitTextStrokeColor\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t'stroke-linejoin': inheritedStyle.WebkitTextStrokeWidth\n\t\t\t\t\t\t\t? 'round'\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t'paint-order': inheritedStyle.WebkitTextStrokeWidth\n\t\t\t\t\t\t\t? 'stroke'\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t }) +\n\t\t\t\t '</g>'\n\t\t\t\t: '';\n\n\t\tif (_inheritedBackgroundClipTextPath) {\n\t\t\tbackgroundClipDef = buildXMLString('path', {\n\t\t\t\td: mergedPath,\n\t\t\t\ttransform: matrix ? matrix : undefined\n\t\t\t});\n\t\t}\n\n\t\tresult +=\n\t\t\t(filter\n\t\t\t\t? filter +\n\t\t\t\t buildXMLString(\n\t\t\t\t\t\t'g',\n\t\t\t\t\t\t{ filter: `url(#satori_s-${id})` },\n\t\t\t\t\t\tp + decorationShape\n\t\t\t\t )\n\t\t\t\t: p + decorationShape) + extra;\n\t} else if (decorationShape) {\n\t\tresult += filter\n\t\t\t? buildXMLString(\n\t\t\t\t\t'g',\n\t\t\t\t\t{ filter: `url(#satori_s-${id})` },\n\t\t\t\t\tdecorationShape\n\t\t\t )\n\t\t\t: decorationShape;\n\t}\n\n\t// Attach information to the parent node.\n\tif (backgroundClipDef) {\n\t\t(parentStyle._inheritedBackgroundClipTextPath as any).value +=\n\t\t\tbackgroundClipDef;\n\t}\n\n\treturn result;\n}\n\nfunction createTextContainerNode(Yoga: TYoga, textAlign: string): YogaNode {\n\t// Create a container node for this text fragment.\n\tconst textContainer = Yoga.Node.create();\n\ttextContainer.setAlignItems(Yoga.ALIGN_BASELINE);\n\ttextContainer.setJustifyContent(\n\t\tv(\n\t\t\ttextAlign,\n\t\t\t{\n\t\t\t\tleft: Yoga.JUSTIFY_FLEX_START,\n\t\t\t\tright: Yoga.JUSTIFY_FLEX_END,\n\t\t\t\tcenter: Yoga.JUSTIFY_CENTER,\n\t\t\t\tjustify: Yoga.JUSTIFY_SPACE_BETWEEN,\n\t\t\t\t// We don't have other writing modes yet.\n\t\t\t\tstart: Yoga.JUSTIFY_FLEX_START,\n\t\t\t\tend: Yoga.JUSTIFY_FLEX_END\n\t\t\t},\n\t\t\tYoga.JUSTIFY_FLEX_START,\n\t\t\t'textAlign'\n\t\t)\n\t);\n\n\treturn textContainer;\n}\n\nfunction detectTabs(text: string):\n\t| {\n\t\t\tindex: null;\n\t\t\ttabCount: 0;\n\t }\n\t| {\n\t\t\tindex: number;\n\t\t\ttabCount: number;\n\t } {\n\tconst result = /(\\t)+/.exec(text);\n\treturn result\n\t\t? {\n\t\t\t\tindex: result.index,\n\t\t\t\ttabCount: result[0].length\n\t\t }\n\t\t: {\n\t\t\t\tindex: null,\n\t\t\t\ttabCount: 0\n\t\t };\n}\n","import { parseLinearGradient, ColorStop } from 'css-gradient-parser';\nimport { normalizeStops } from './utils.js';\nimport { buildXMLString, calcDegree, lengthToNumber } from '../../utils.js';\n\nexport function buildLinearGradient(\n\t{\n\t\tid,\n\t\twidth,\n\t\theight,\n\t\trepeatX,\n\t\trepeatY\n\t}: {\n\t\tid: string;\n\t\twidth: number;\n\t\theight: number;\n\t\trepeatX: boolean;\n\t\trepeatY: boolean;\n\t},\n\timage: string,\n\tdimensions: number[],\n\toffsets: number[],\n\tinheritableStyle: Record<string, number | string>,\n\tfrom?: 'background' | 'mask'\n) {\n\tconst parsed = parseLinearGradient(image);\n\tconst [imageWidth, imageHeight] = dimensions;\n\tconst repeating = image.startsWith('repeating');\n\n\t// Calculate the direction.\n\tlet points, length, xys;\n\n\tif (parsed.orientation.type === 'directional') {\n\t\tpoints = resolveXYFromDirection(parsed.orientation.value);\n\n\t\tlength = Math.sqrt(\n\t\t\tMath.pow((points.x2 - points.x1) * imageWidth, 2) +\n\t\t\t\tMath.pow((points.y2 - points.y1) * imageHeight, 2)\n\t\t);\n\t} else if (parsed.orientation.type === 'angular') {\n\t\tconst { length: l, ...p } = calcNormalPoint(\n\t\t\t(calcDegree(\n\t\t\t\t`${parsed.orientation.value.value}${parsed.orientation.value.unit}`\n\t\t\t) /\n\t\t\t\t180) *\n\t\t\t\tMath.PI,\n\t\t\timageWidth,\n\t\t\timageHeight\n\t\t);\n\n\t\tlength = l;\n\t\tpoints = p;\n\t}\n\n\txys = repeating\n\t\t? calcPercentage(parsed.stops, length, points, inheritableStyle)\n\t\t: points;\n\n\tconst stops = normalizeStops(\n\t\trepeating ? resolveRepeatingCycle(parsed.stops, length) : length,\n\t\tparsed.stops,\n\t\tinheritableStyle,\n\t\trepeating,\n\t\tfrom\n\t);\n\n\tconst gradientId = `satori_bi${id}`;\n\tconst patternId = `satori_pattern_${id}`;\n\n\tconst defs = buildXMLString(\n\t\t'pattern',\n\t\t{\n\t\t\tid: patternId,\n\t\t\tx: offsets[0] / width,\n\t\t\ty: offsets[1] / height,\n\t\t\twidth: repeatX ? imageWidth / width : '1',\n\t\t\theight: repeatY ? imageHeight / height : '1',\n\t\t\tpatternUnits: 'objectBoundingBox'\n\t\t},\n\t\tbuildXMLString(\n\t\t\t'linearGradient',\n\t\t\t{\n\t\t\t\tid: gradientId,\n\t\t\t\t...xys,\n\t\t\t\tspreadMethod: repeating ? 'repeat' : 'pad'\n\t\t\t},\n\t\t\tstops\n\t\t\t\t.map(stop =>\n\t\t\t\t\tbuildXMLString('stop', {\n\t\t\t\t\t\toffset: (stop.offset ?? 0) * 100 + '%',\n\t\t\t\t\t\t'stop-color': stop.color\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t\t.join('')\n\t\t) +\n\t\t\tbuildXMLString('rect', {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\twidth: imageWidth,\n\t\t\t\theight: imageHeight,\n\t\t\t\tfill: `url(#${gradientId})`\n\t\t\t})\n\t);\n\treturn [patternId, defs];\n}\n\nfunction resolveRepeatingCycle(stops: ColorStop[], length: number) {\n\tconst last = stops[stops.length - 1];\n\tconst { offset } = last;\n\tif (!offset) return length;\n\n\tif (offset.unit === '%') return (Number(offset.value) / 100) * length;\n\n\treturn Number(offset.value);\n}\n\nfunction resolveXYFromDirection(dir: string) {\n\tlet x1 = 0,\n\t\ty1 = 0,\n\t\tx2 = 0,\n\t\ty2 = 0;\n\n\tif (dir.includes('top')) {\n\t\ty1 = 1;\n\t} else if (dir.includes('bottom')) {\n\t\ty2 = 1;\n\t}\n\n\tif (dir.includes('left')) {\n\t\tx1 = 1;\n\t} else if (dir.includes('right')) {\n\t\tx2 = 1;\n\t}\n\n\tif (!x1 && !x2 && !y1 && !y2) {\n\t\ty1 = 1;\n\t}\n\n\treturn { x1, y1, x2, y2 };\n}\n\n/**\n * calc start point and end point of linear gradient\n */\nfunction calcNormalPoint(v: number, w: number, h: number) {\n\tconst r = Math.pow(h / w, 2);\n\n\t// make sure angle is 0 <= angle <= 360\n\tv = ((v % (Math.PI * 2)) + Math.PI * 2) % (Math.PI * 2);\n\n\tlet x1, y1, x2, y2, length, tmp, a, b;\n\n\tconst dfs = (angle: number) => {\n\t\tif (angle === 0) {\n\t\t\tx1 = 0;\n\t\t\ty1 = h;\n\t\t\tx2 = 0;\n\t\t\ty2 = 0;\n\t\t\tlength = h;\n\t\t\treturn;\n\t\t} else if (angle === Math.PI / 2) {\n\t\t\tx1 = 0;\n\t\t\ty1 = 0;\n\t\t\tx2 = w;\n\t\t\ty2 = 0;\n\t\t\tlength = w;\n\t\t\treturn;\n\t\t}\n\t\tif (angle > 0 && angle < Math.PI / 2) {\n\t\t\tx1 =\n\t\t\t\t((r * w) / 2 / Math.tan(angle) - h / 2) /\n\t\t\t\t(Math.tan(angle) + r / Math.tan(angle));\n\t\t\ty1 = Math.tan(angle) * x1 + h;\n\t\t\tx2 = Math.abs(w / 2 - x1) + w / 2;\n\t\t\ty2 = h / 2 - Math.abs(y1 - h / 2);\n\t\t\tlength = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));\n\t\t\t// y = -1 / tan * x = h / 2 +1 / tan * w/2\n\t\t\t// y = tan * x + h\n\t\t\ta =\n\t\t\t\t(w / 2 / Math.tan(angle) - h / 2) /\n\t\t\t\t(Math.tan(angle) + 1 / Math.tan(angle));\n\t\t\tb = Math.tan(angle) * a + h;\n\t\t\tlength =\n\t\t\t\t2 * Math.sqrt(Math.pow(w / 2 - a, 2) + Math.pow(h / 2 - b, 2));\n\t\t\treturn;\n\t\t} else if (angle > Math.PI / 2 && angle < Math.PI) {\n\t\t\tx1 =\n\t\t\t\t(h / 2 + (r * w) / 2 / Math.tan(angle)) /\n\t\t\t\t(Math.tan(angle) + r / Math.tan(angle));\n\t\t\ty1 = Math.tan(angle) * x1;\n\t\t\tx2 = Math.abs(w / 2 - x1) + w / 2;\n\t\t\ty2 = h / 2 + Math.abs(y1 - h / 2);\n\t\t\t// y = -1 / tan * x + h / 2 + 1 / tan * w / 2\n\t\t\t// y = tan * x\n\t\t\ta =\n\t\t\t\t(w / 2 / Math.tan(angle) + h / 2) /\n\t\t\t\t(Math.tan(angle) + 1 / Math.tan(angle));\n\t\t\tb = Math.tan(angle) * a;\n\t\t\tlength =\n\t\t\t\t2 * Math.sqrt(Math.pow(w / 2 - a, 2) + Math.pow(h / 2 - b, 2));\n\t\t\treturn;\n\t\t} else if (angle >= Math.PI) {\n\t\t\tdfs(angle - Math.PI);\n\n\t\t\ttmp = x1;\n\t\t\tx1 = x2;\n\t\t\tx2 = tmp;\n\t\t\ttmp = y1;\n\t\t\ty1 = y2;\n\t\t\ty2 = tmp;\n\t\t}\n\t};\n\n\tdfs(v);\n\n\treturn {\n\t\tx1: x1 / w,\n\t\ty1: y1 / h,\n\t\tx2: x2 / w,\n\t\ty2: y2 / h,\n\t\tlength\n\t};\n}\n\nfunction calcPercentage(\n\tstops: ColorStop[],\n\tlength: number,\n\tpoints: {\n\t\tx1: number;\n\t\ty1: number;\n\t\tx2: number;\n\t\ty2: number;\n\t},\n\tinheritableStyle: Record<string, string | number>\n) {\n\tconst { x1, x2, y1, y2 } = points;\n\tconst p1 = !stops[0].offset\n\t\t? 0\n\t\t: stops[0].offset.unit === '%'\n\t\t? Number(stops[0].offset.value) / 100\n\t\t: lengthToNumber(\n\t\t\t\t`${stops[0].offset.value}${stops[0].offset.unit}`,\n\t\t\t\tinheritableStyle.fontSize as number,\n\t\t\t\tlength,\n\t\t\t\tinheritableStyle,\n\t\t\t\ttrue\n\t\t ) / length;\n\tconst p2 = !stops.at(-1).offset\n\t\t? 1\n\t\t: stops.at(-1).offset.unit === '%'\n\t\t? Number(stops.at(-1).offset.value) / 100\n\t\t: lengthToNumber(\n\t\t\t\t`${stops.at(-1).offset.value}${stops.at(-1).offset.unit}`,\n\t\t\t\tinheritableStyle.fontSize as number,\n\t\t\t\tlength,\n\t\t\t\tinheritableStyle,\n\t\t\t\ttrue\n\t\t ) / length;\n\n\tconst sx = (x2 - x1) * p1 + x1;\n\tconst sy = (y2 - y1) * p1 + y1;\n\tconst ex = (x2 - x1) * p2 + x1;\n\tconst ey = (y2 - y1) * p2 + y1;\n\n\treturn {\n\t\tx1: sx,\n\t\ty1: sy,\n\t\tx2: ex,\n\t\ty2: ey\n\t};\n}\n","import { lengthToNumber } from '../../utils.js';\nimport cssColorParse from 'parse-css-color';\nimport type { ColorStop } from 'css-gradient-parser';\n\ninterface Stop {\n\tcolor: string;\n\toffset?: number;\n}\n\nexport function normalizeStops(\n\ttotalLength: number,\n\tcolorStops: ColorStop[],\n\tinheritedStyle: Record<string, string | number>,\n\trepeating: boolean,\n\tfrom?: 'background' | 'mask'\n) {\n\t// Resolve the color stops based on the spec:\n\t// https://drafts.csswg.org/css-images/#color-stop-syntax\n\tconst stops: Stop[] = [];\n\tconst lastColorStop = colorStops.at(-1);\n\tconst totalPercentage =\n\t\tlastColorStop &&\n\t\tlastColorStop.offset &&\n\t\tlastColorStop.offset.unit === '%' &&\n\t\trepeating\n\t\t\t? +lastColorStop.offset.value\n\t\t\t: 100;\n\tfor (const stop of colorStops) {\n\t\tconst { color } = stop;\n\t\tif (!stops.length) {\n\t\t\t// First stop, ensure it's at the start.\n\t\t\tstops.push({\n\t\t\t\toffset: 0,\n\t\t\t\tcolor\n\t\t\t});\n\n\t\t\tif (!stop.offset) continue;\n\t\t\tif (stop.offset.value === '0') continue;\n\t\t}\n\n\t\t// All offsets are relative values (0-1) in SVG.\n\t\tconst offset =\n\t\t\ttypeof stop.offset === 'undefined'\n\t\t\t\t? undefined\n\t\t\t\t: stop.offset.unit === '%'\n\t\t\t\t? +stop.offset.value / totalPercentage\n\t\t\t\t: Number(\n\t\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\t\t`${stop.offset.value}${stop.offset.unit}`,\n\t\t\t\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\t\t\t\ttotalLength,\n\t\t\t\t\t\t\tinheritedStyle,\n\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t)\n\t\t\t\t ) / totalLength;\n\n\t\tstops.push({\n\t\t\toffset,\n\t\t\tcolor\n\t\t});\n\t}\n\tif (!stops.length) {\n\t\tstops.push({\n\t\t\toffset: 0,\n\t\t\tcolor: 'transparent'\n\t\t});\n\t}\n\t// Last stop, ensure it's at the end.\n\tconst lastStop = stops[stops.length - 1];\n\tif (lastStop.offset !== 1) {\n\t\tif (typeof lastStop.offset === 'undefined') {\n\t\t\tlastStop.offset = 1;\n\t\t} else if (repeating) {\n\t\t\tstops[stops.length - 1] = {\n\t\t\t\toffset: 1,\n\t\t\t\tcolor: lastStop.color\n\t\t\t};\n\t\t} else {\n\t\t\tstops.push({\n\t\t\t\toffset: 1,\n\t\t\t\tcolor: lastStop.color\n\t\t\t});\n\t\t}\n\t}\n\n\tlet previousStop = 0;\n\tlet nextStop = 1;\n\t// Evenly distribute the missing stop offsets.\n\tfor (let i = 0; i < stops.length; i++) {\n\t\tif (typeof stops[i].offset === 'undefined') {\n\t\t\t// Find the next stop that has an offset.\n\t\t\tif (nextStop < i) nextStop = i;\n\t\t\twhile (typeof stops[nextStop].offset === 'undefined') nextStop++;\n\n\t\t\tstops[i].offset =\n\t\t\t\t((stops[nextStop].offset - stops[previousStop].offset) /\n\t\t\t\t\t(nextStop - previousStop)) *\n\t\t\t\t\t(i - previousStop) +\n\t\t\t\tstops[previousStop].offset;\n\t\t} else {\n\t\t\tpreviousStop = i;\n\t\t}\n\t}\n\n\tif (from === 'mask') {\n\t\treturn stops.map(stop => {\n\t\t\tconst color = cssColorParse(stop.color);\n\t\t\tif (!color) return stop;\n\t\t\tif (color.alpha === 0) {\n\t\t\t\treturn { ...stop, color: `rgba(0, 0, 0, 1)` };\n\t\t\t} else {\n\t\t\t\treturn {\n\t\t\t\t\t...stop,\n\t\t\t\t\tcolor: `rgba(255, 255, 255, ${color.alpha})`\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\t}\n\n\treturn stops;\n}\n","import {\n\tparseRadialGradient,\n\tRadialResult,\n\tRadialPropertyValue,\n\tColorStop\n} from 'css-gradient-parser';\nimport { buildXMLString, lengthToNumber } from '../../utils.js';\nimport { normalizeStops } from './utils.js';\n\nexport function buildRadialGradient(\n\t{\n\t\tid,\n\t\twidth,\n\t\theight,\n\t\trepeatX,\n\t\trepeatY\n\t}: {\n\t\tid: string;\n\t\twidth: number;\n\t\theight: number;\n\t\trepeatX: boolean;\n\t\trepeatY: boolean;\n\t},\n\timage: string,\n\tdimensions: number[],\n\toffsets: number[],\n\tinheritableStyle: Record<string, number | string>,\n\tfrom?: 'background' | 'mask'\n) {\n\tconst {\n\t\tshape,\n\t\tstops: colorStops,\n\t\tposition,\n\t\tsize,\n\t\trepeating\n\t} = parseRadialGradient(image);\n\tconst [xDelta, yDelta] = dimensions;\n\n\tlet cx: number = xDelta / 2;\n\tlet cy: number = yDelta / 2;\n\n\tconst pos = calcRadialGradient(\n\t\tposition.x,\n\t\tposition.y,\n\t\txDelta,\n\t\tyDelta,\n\t\tinheritableStyle.fontSize as number,\n\t\tinheritableStyle\n\t);\n\tcx = pos.x;\n\tcy = pos.y;\n\n\tconst colorStopTotalLength = calcColorStopTotalLength(\n\t\twidth,\n\t\tcolorStops,\n\t\trepeating,\n\t\tinheritableStyle\n\t);\n\n\tconst stops = normalizeStops(\n\t\tcolorStopTotalLength,\n\t\tcolorStops,\n\t\tinheritableStyle,\n\t\trepeating,\n\t\tfrom\n\t);\n\n\tconst gradientId = `satori_radial_${id}`;\n\tconst patternId = `satori_pattern_${id}`;\n\tconst maskId = `satori_mask_${id}`;\n\n\t// https://developer.mozilla.org/en-US/docs/Web/CSS/gradient/radial-gradient()#values\n\tconst spread = calcRadius(\n\t\tshape as Shape,\n\t\tsize,\n\t\tinheritableStyle.fontSize as number,\n\t\t{ x: cx, y: cy },\n\t\t[xDelta, yDelta],\n\t\tinheritableStyle,\n\t\trepeating\n\t);\n\n\tconst props = calcRadialGradientProps(\n\t\tshape as Shape,\n\t\tinheritableStyle.fontSize as number,\n\t\tcolorStops,\n\t\t[xDelta, yDelta],\n\t\tinheritableStyle,\n\t\trepeating,\n\t\tspread\n\t);\n\n\t// TODO: check for repeat-x/repeat-y\n\tconst defs = buildXMLString(\n\t\t'pattern',\n\t\t{\n\t\t\tid: patternId,\n\t\t\tx: offsets[0] / width,\n\t\t\ty: offsets[1] / height,\n\t\t\twidth: repeatX ? xDelta / width : '1',\n\t\t\theight: repeatY ? yDelta / height : '1',\n\t\t\tpatternUnits: 'objectBoundingBox'\n\t\t},\n\t\tbuildXMLString(\n\t\t\t'radialGradient',\n\t\t\t{\n\t\t\t\tid: gradientId,\n\t\t\t\t...props\n\t\t\t},\n\t\t\tstops\n\t\t\t\t.map(stop =>\n\t\t\t\t\tbuildXMLString('stop', {\n\t\t\t\t\t\toffset: stop.offset || 0,\n\t\t\t\t\t\t'stop-color': stop.color\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t\t.join('')\n\t\t) +\n\t\t\tbuildXMLString(\n\t\t\t\t'mask',\n\t\t\t\t{\n\t\t\t\t\tid: maskId\n\t\t\t\t},\n\t\t\t\tbuildXMLString('rect', {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0,\n\t\t\t\t\twidth: xDelta,\n\t\t\t\t\theight: yDelta,\n\t\t\t\t\tfill: '#fff'\n\t\t\t\t})\n\t\t\t) +\n\t\t\tbuildXMLString('rect', {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\twidth: xDelta,\n\t\t\t\theight: yDelta,\n\t\t\t\tfill: stops.at(-1)?.color || 'transparent'\n\t\t\t}) +\n\t\t\tbuildXMLString(shape, {\n\t\t\t\tcx: cx,\n\t\t\t\tcy: cy,\n\t\t\t\twidth: xDelta,\n\t\t\t\theight: yDelta,\n\t\t\t\t...spread,\n\t\t\t\tfill: `url(#${gradientId})`,\n\t\t\t\tmask: `url(#${maskId})`\n\t\t\t})\n\t);\n\n\tconst result = [patternId, defs];\n\treturn result;\n}\n\ntype PositionKeyWord = 'center' | 'left' | 'right' | 'top' | 'bottom';\n\nfunction calcColorStopTotalLength(\n\twidth: number,\n\tstops: ColorStop[],\n\trepeating: boolean,\n\tinheritableStyle: Record<string, string | number>\n) {\n\tif (!repeating) return width;\n\tconst lastStop = stops.at(-1);\n\tif (!lastStop || !lastStop.offset || lastStop.offset.unit === '%')\n\t\treturn width;\n\n\treturn lengthToNumber(\n\t\t`${lastStop.offset.value}${lastStop.offset.unit}`,\n\t\t+inheritableStyle.fontSize,\n\t\twidth,\n\t\tinheritableStyle,\n\t\ttrue\n\t);\n}\n\nfunction calcRadialGradient(\n\tcx: RadialPropertyValue,\n\tcy: RadialPropertyValue,\n\txDelta: number,\n\tyDelta: number,\n\tbaseFontSize: number,\n\tstyle: Record<string, string | number>\n) {\n\tconst pos: { x: number; y: number } = { x: xDelta / 2, y: yDelta / 2 };\n\tif (cx.type === 'keyword') {\n\t\tObject.assign(\n\t\t\tpos,\n\t\t\tcalcPos(cx.value as PositionKeyWord, xDelta, yDelta, 'x')\n\t\t);\n\t} else {\n\t\tpos.x =\n\t\t\tlengthToNumber(\n\t\t\t\t`${cx.value.value}${cx.value.unit}`,\n\t\t\t\tbaseFontSize,\n\t\t\t\txDelta,\n\t\t\t\tstyle,\n\t\t\t\ttrue\n\t\t\t) ?? xDelta / 2;\n\t}\n\n\tif (cy.type === 'keyword') {\n\t\tObject.assign(\n\t\t\tpos,\n\t\t\tcalcPos(cy.value as PositionKeyWord, xDelta, yDelta, 'y')\n\t\t);\n\t} else {\n\t\tpos.y =\n\t\t\tlengthToNumber(\n\t\t\t\t`${cy.value.value}${cy.value.unit}`,\n\t\t\t\tbaseFontSize,\n\t\t\t\tyDelta,\n\t\t\t\tstyle,\n\t\t\t\ttrue\n\t\t\t) ?? yDelta / 2;\n\t}\n\n\treturn pos;\n}\n\nfunction calcPos(\n\tkey: PositionKeyWord,\n\txDelta: number,\n\tyDelta: number,\n\tdir: 'x' | 'y'\n) {\n\tswitch (key) {\n\t\tcase 'center':\n\t\t\treturn { [dir]: dir === 'x' ? xDelta / 2 : yDelta / 2 };\n\t\tcase 'left':\n\t\t\treturn { x: 0 };\n\t\tcase 'top':\n\t\t\treturn { y: 0 };\n\t\tcase 'right':\n\t\t\treturn { x: xDelta };\n\t\tcase 'bottom':\n\t\t\treturn { y: yDelta };\n\t}\n}\n\ntype Shape = 'circle' | 'ellipse';\n\nfunction calcRadialGradientProps(\n\tshape: Shape,\n\tbaseFontSize: number,\n\tcolorStops: ColorStop[],\n\t[xDelta, yDelta]: [number, number],\n\tinheritableStyle: Record<string, string | number>,\n\trepeating: boolean,\n\tspread: Record<string, number>\n) {\n\tconst { r, rx, ratio = 1 } = spread;\n\tif (!repeating) {\n\t\treturn {\n\t\t\tspreadMethod: 'pad'\n\t\t};\n\t}\n\tconst last = colorStops.at(-1);\n\tconst radius = shape === 'circle' ? r * 2 : rx * 2;\n\treturn {\n\t\tspreadMethod: 'repeat',\n\t\tcx: '50%',\n\t\tcy: '50%',\n\t\tr:\n\t\t\tlast.offset.unit === '%'\n\t\t\t\t? `${\n\t\t\t\t\t\t(Number(last.offset.value) *\n\t\t\t\t\t\t\tMath.min(yDelta / xDelta, 1)) /\n\t\t\t\t\t\tratio\n\t\t\t\t }%`\n\t\t\t\t: Number(\n\t\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\t\t`${last.offset.value}${last.offset.unit}`,\n\t\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\t\txDelta,\n\t\t\t\t\t\t\tinheritableStyle,\n\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t) / radius\n\t\t\t\t )\n\t};\n}\n\nfunction calcRadius(\n\tshape: Shape,\n\tendingShape: RadialResult['size'],\n\tbaseFontSize: number,\n\tcenterAxis: { x: number; y: number },\n\tlength: [number, number],\n\tinheritableStyle: Record<string, string | number>,\n\trepeating: boolean\n) {\n\tconst [xDelta, yDelta] = length;\n\tconst { x: cx, y: cy } = centerAxis;\n\tconst spread: Record<string, number> = {};\n\tlet fx = 0;\n\tlet fy = 0;\n\n\tif (isSizeAllLength(endingShape)) {\n\t\tif (endingShape.some(v => v.value.value.startsWith('-'))) {\n\t\t\tthrow new Error(\n\t\t\t\t'disallow setting negative values to the size of the shape. Check https://w3c.github.io/csswg-drafts/css-images/#valdef-rg-size-length-0'\n\t\t\t);\n\t\t}\n\t\tif (shape === 'circle') {\n\t\t\tObject.assign(spread, {\n\t\t\t\tr: Number(\n\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\t`${endingShape[0].value.value}${endingShape[0].value.unit}`,\n\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\txDelta,\n\t\t\t\t\t\tinheritableStyle,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t});\n\t\t} else {\n\t\t\tObject.assign(spread, {\n\t\t\t\trx: Number(\n\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\t`${endingShape[0].value.value}${endingShape[0].value.unit}`,\n\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\txDelta,\n\t\t\t\t\t\tinheritableStyle,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t\t\try: Number(\n\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\t`${endingShape[1].value.value}${endingShape[1].value.unit}`,\n\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\tyDelta,\n\t\t\t\t\t\tinheritableStyle,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t});\n\t\t}\n\t\tpatchSpread(spread, xDelta, yDelta, cx, cy, repeating, shape);\n\t\treturn spread;\n\t}\n\n\tswitch (endingShape[0].value) {\n\t\tcase 'farthest-corner':\n\t\t\tfx = Math.max(Math.abs(xDelta - cx), Math.abs(cx));\n\t\t\tfy = Math.max(Math.abs(yDelta - cy), Math.abs(cy));\n\t\t\tbreak;\n\t\tcase 'closest-corner':\n\t\t\tfx = Math.min(Math.abs(xDelta - cx), Math.abs(cx));\n\t\t\tfy = Math.min(Math.abs(yDelta - cy), Math.abs(cy));\n\t\t\tbreak;\n\t\tcase 'farthest-side':\n\t\t\tif (shape === 'circle') {\n\t\t\t\tspread.r = Math.max(\n\t\t\t\t\tMath.abs(xDelta - cx),\n\t\t\t\t\tMath.abs(cx),\n\t\t\t\t\tMath.abs(yDelta - cy),\n\t\t\t\t\tMath.abs(cy)\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tspread.rx = Math.max(Math.abs(xDelta - cx), Math.abs(cx));\n\t\t\t\tspread.ry = Math.max(Math.abs(yDelta - cy), Math.abs(cy));\n\t\t\t}\n\t\t\tpatchSpread(spread, xDelta, yDelta, cx, cy, repeating, shape);\n\t\t\treturn spread;\n\t\tcase 'closest-side':\n\t\t\tif (shape === 'circle') {\n\t\t\t\tspread.r = Math.min(\n\t\t\t\t\tMath.abs(xDelta - cx),\n\t\t\t\t\tMath.abs(cx),\n\t\t\t\t\tMath.abs(yDelta - cy),\n\t\t\t\t\tMath.abs(cy)\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tspread.rx = Math.min(Math.abs(xDelta - cx), Math.abs(cx));\n\t\t\t\tspread.ry = Math.min(Math.abs(yDelta - cy), Math.abs(cy));\n\t\t\t}\n\t\t\tpatchSpread(spread, xDelta, yDelta, cx, cy, repeating, shape);\n\n\t\t\treturn spread;\n\t}\n\tif (shape === 'circle') {\n\t\tspread.r = Math.sqrt(fx * fx + fy * fy);\n\t} else {\n\t\tObject.assign(spread, f2r(fx, fy));\n\t}\n\n\tpatchSpread(spread, xDelta, yDelta, cx, cy, repeating, shape);\n\n\treturn spread;\n}\n\n// compare with farthest-corner to make it cover the whole container\nfunction patchSpread(\n\tspread: Record<string, number>,\n\txDelta: number,\n\tyDelta: number,\n\tcx: number,\n\tcy: number,\n\trepeating: boolean,\n\tshape: Shape\n) {\n\tif (repeating) {\n\t\tif (shape === 'ellipse') {\n\t\t\tconst mfx = Math.max(Math.abs(xDelta - cx), Math.abs(cx));\n\t\t\tconst mfy = Math.max(Math.abs(yDelta - cy), Math.abs(cy));\n\n\t\t\tconst { rx: mrx, ry: mry } = f2r(mfx, mfy);\n\n\t\t\tspread.ratio = Math.max(mrx / spread.rx, mry / spread.ry);\n\t\t\tif (spread.ratio > 1) {\n\t\t\t\tspread.rx *= spread.ratio;\n\t\t\t\tspread.ry *= spread.ratio;\n\t\t\t}\n\t\t} else {\n\t\t\tconst mfx = Math.max(Math.abs(xDelta - cx), Math.abs(cx));\n\t\t\tconst mfy = Math.max(Math.abs(yDelta - cy), Math.abs(cy));\n\n\t\t\tconst mr = Math.sqrt(mfx * mfx + mfy * mfy);\n\n\t\t\tspread.ratio = mr / spread.r;\n\t\t\tif (spread.ratio > 1) {\n\t\t\t\tspread.r = mr;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction f2r(fx: number, fy: number) {\n\t// Spec: https://drafts.csswg.org/css-images/#typedef-size\n\t// Get the aspect ratio of the closest-side size.\n\tconst ratio = fy !== 0 ? fx / fy : 1;\n\n\tif (fx === 0) {\n\t\treturn {\n\t\t\trx: 0,\n\t\t\try: 0\n\t\t};\n\t} else {\n\t\t// fx^2/a^2 + fy^2/b^2 = 1\n\t\t// fx^2/(b*ratio)^2 + fy^2/b^2 = 1\n\t\t// (fx^2+fy^2*ratio^2) = (b*ratio)^2\n\t\t// b = sqrt(fx^2+fy^2*ratio^2)/ratio\n\n\t\tconst ry = Math.sqrt(fx * fx + fy * fy * ratio * ratio) / ratio;\n\t\treturn {\n\t\t\try,\n\t\t\trx: ry * ratio\n\t\t};\n\t}\n}\n\nfunction isSizeAllLength(v: RadialPropertyValue[]): v is Array<{\n\ttype: 'length';\n\tvalue: {\n\t\tunit: string;\n\t\tvalue: string;\n\t};\n}> {\n\treturn !v.some(s => s.type === 'keyword');\n}\n","import CssDimension from '../vendor/parse-css-dimension/index.js';\nimport { buildXMLString } from '../utils.js';\n\nimport { resolveImageData } from '../handler/image.js';\nimport { buildLinearGradient } from './gradient/linear.js';\nimport { buildRadialGradient } from './gradient/radial.js';\nimport cssColorParse from 'parse-css-color';\n\ninterface Background {\n\tattachment?: string;\n\tcolor?: string;\n\tclip: string;\n\timage: string;\n\torigin?: string;\n\tposition: string;\n\tsize: string;\n\trepeat: string;\n}\n\nfunction toAbsoluteValue(v: string | number, base: number) {\n\tif (typeof v === 'string' && v.endsWith('%')) {\n\t\treturn (base * parseFloat(v)) / 100;\n\t}\n\treturn +v;\n}\n\nfunction calculateKeywordSize(\n\tkeyword: string,\n\tcontainerWidth: number,\n\tcontainerHeight: number,\n\timageWidth: number,\n\timageHeight: number\n): [number, number] {\n\tif (!imageWidth || !imageHeight) {\n\t\treturn [containerWidth, containerHeight];\n\t}\n\n\tif (keyword === 'cover') {\n\t\t// Scale to cover the container (use max scale to ensure it covers)\n\t\tconst scaleX = containerWidth / imageWidth;\n\t\tconst scaleY = containerHeight / imageHeight;\n\t\tconst scale = Math.max(scaleX, scaleY);\n\t\treturn [imageWidth * scale, imageHeight * scale];\n\t}\n\n\tif (keyword === 'contain') {\n\t\t// Scale to fit within the container (use min scale to ensure it fits)\n\t\tconst scaleX = containerWidth / imageWidth;\n\t\tconst scaleY = containerHeight / imageHeight;\n\t\tconst scale = Math.min(scaleX, scaleY);\n\t\treturn [imageWidth * scale, imageHeight * scale];\n\t}\n\n\t// For 'auto' or other values, handle auto\n\tif (keyword === 'auto' || keyword.includes('auto')) {\n\t\tconst parts = keyword.split(' ');\n\t\tconst widthPart = parts[0] || 'auto';\n\t\tconst heightPart = parts[1] || parts[0] || 'auto';\n\n\t\tlet finalWidth = imageWidth;\n\t\tlet finalHeight = imageHeight;\n\n\t\tif (widthPart === 'auto' && heightPart !== 'auto') {\n\t\t\t// Width is auto, height is specified\n\t\t\tconst parsedHeight = toAbsoluteValue(heightPart, containerHeight);\n\t\t\tfinalHeight = parsedHeight;\n\t\t\tfinalWidth = (imageWidth / imageHeight) * parsedHeight;\n\t\t} else if (heightPart === 'auto' && widthPart !== 'auto') {\n\t\t\t// Height is auto, width is specified\n\t\t\tconst parsedWidth = toAbsoluteValue(widthPart, containerWidth);\n\t\t\tfinalWidth = parsedWidth;\n\t\t\tfinalHeight = (imageHeight / imageWidth) * parsedWidth;\n\t\t}\n\t\t// If both are auto, use intrinsic dimensions\n\n\t\treturn [finalWidth, finalHeight];\n\t}\n\n\treturn [containerWidth, containerHeight];\n}\n\nconst positionKeywordMap: Record<string, string> = {\n\tbottom: '100%',\n\tcenter: '50%',\n\tleft: '0%',\n\tright: '100%',\n\ttop: '0%'\n};\n\nexport function parsePositionValues(str: string): { x: string; y: string } {\n\tif (!str) {\n\t\treturn { x: '0%', y: '0%' };\n\t}\n\n\tconst parts = str.split(' ').filter(Boolean);\n\n\tif (parts.length === 1) {\n\t\tconst part = parts[0];\n\n\t\tif (part in positionKeywordMap) {\n\t\t\tif (part === 'top' || part === 'bottom') {\n\t\t\t\treturn { x: '50%', y: positionKeywordMap[part] };\n\t\t\t}\n\n\t\t\treturn { x: positionKeywordMap[part], y: '50%' };\n\t\t}\n\n\t\treturn { x: part, y: '50%' };\n\t}\n\n\treturn {\n\t\tx: positionKeywordMap[parts[0]] || parts[0],\n\t\ty: positionKeywordMap[parts[1]] || parts[1]\n\t};\n}\n\nexport function computeBgPositionOffset(\n\trawValue: string,\n\tcontainerSize: number,\n\timageSize: number\n): number {\n\tif (rawValue.endsWith('%')) {\n\t\tconst percentage = parseFloat(rawValue) / 100;\n\t\t// CSS spec: offset = (containerSize - imageSize) * percentage\n\t\treturn (containerSize - imageSize) * percentage;\n\t}\n\n\ttry {\n\t\tconst parsed = new CssDimension(rawValue);\n\n\t\treturn parsed.type === 'length' || parsed.type === 'number'\n\t\t\t? parsed.value\n\t\t\t: toAbsoluteValue(parsed.value + parsed.unit, containerSize);\n\t} catch {\n\t\treturn 0;\n\t}\n}\n\nfunction parseLengthPairs(\n\tstr: string,\n\t{\n\t\tx,\n\t\ty,\n\t\tdefaultX,\n\t\tdefaultY\n\t}: {\n\t\tx: number;\n\t\ty: number;\n\t\tdefaultX: number | string;\n\t\tdefaultY: number | string;\n\t}\n) {\n\treturn (\n\t\tstr\n\t\t\t? str\n\t\t\t\t\t.split(' ')\n\t\t\t\t\t.map(value => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst parsed = new CssDimension(value);\n\t\t\t\t\t\t\treturn parsed.type === 'length' ||\n\t\t\t\t\t\t\t\tparsed.type === 'number'\n\t\t\t\t\t\t\t\t? parsed.value\n\t\t\t\t\t\t\t\t: parsed.value + parsed.unit;\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.filter(v => v !== null)\n\t\t\t: [defaultX, defaultY]\n\t).map((v, index) => toAbsoluteValue(v, [x, y][index]));\n}\n\nexport default async function backgroundImage(\n\t{\n\t\tid,\n\t\twidth,\n\t\theight,\n\t\tleft,\n\t\ttop\n\t}: { id: string; width: number; height: number; left: number; top: number },\n\t{ image, size, position, repeat }: Background,\n\tinheritableStyle: Record<string, number | string>,\n\tfrom?: 'background' | 'mask'\n): Promise<string[]> {\n\t// Default to `repeat`.\n\trepeat = repeat || 'repeat';\n\tfrom = from || 'background';\n\n\tconst repeatX = repeat === 'repeat-x' || repeat === 'repeat';\n\tconst repeatY = repeat === 'repeat-y' || repeat === 'repeat';\n\n\t// Check if size is a keyword (cover, contain, auto) that needs to be calculated later\n\tconst isKeywordSize =\n\t\tsize &&\n\t\t(size === 'cover' ||\n\t\t\tsize === 'contain' ||\n\t\t\tsize === 'auto' ||\n\t\t\tsize.includes('auto'));\n\n\t// For gradients, keyword sizes (cover, contain, auto) resolve to the\n\t// container dimensions since gradients have no intrinsic size.\n\t// For url() images, keyword sizes are calculated later using the image's\n\t// intrinsic dimensions.\n\tconst isGradient =\n\t\timage.startsWith('linear-gradient(') ||\n\t\timage.startsWith('repeating-linear-gradient(') ||\n\t\timage.startsWith('radial-gradient(') ||\n\t\timage.startsWith('repeating-radial-gradient(');\n\n\tconst dimensions =\n\t\tisKeywordSize && isGradient\n\t\t\t? [width, height] // Gradients have no intrinsic size; keyword sizes resolve to container\n\t\t\t: isKeywordSize\n\t\t\t? [0, 0] // Will be calculated later when we have image dimensions\n\t\t\t: parseLengthPairs(size, {\n\t\t\t\t\tx: width,\n\t\t\t\t\ty: height,\n\t\t\t\t\tdefaultX: width,\n\t\t\t\t\tdefaultY: height\n\t\t\t });\n\tconst offsets = parseLengthPairs(position, {\n\t\tx: width,\n\t\ty: height,\n\t\tdefaultX: 0,\n\t\tdefaultY: 0\n\t});\n\n\tif (\n\t\timage.startsWith('linear-gradient(') ||\n\t\timage.startsWith('repeating-linear-gradient(')\n\t) {\n\t\treturn buildLinearGradient(\n\t\t\t{ id, width, height, repeatX, repeatY },\n\t\t\timage,\n\t\t\tdimensions,\n\t\t\toffsets,\n\t\t\tinheritableStyle,\n\t\t\tfrom\n\t\t);\n\t}\n\n\tif (\n\t\timage.startsWith('radial-gradient(') ||\n\t\timage.startsWith('repeating-radial-gradient(')\n\t) {\n\t\treturn buildRadialGradient(\n\t\t\t{ id, width, height, repeatX, repeatY },\n\t\t\timage,\n\t\t\tdimensions,\n\t\t\toffsets,\n\t\t\tinheritableStyle,\n\t\t\tfrom\n\t\t);\n\t}\n\n\tif (image.startsWith('url(')) {\n\t\tconst [src, imageWidth, imageHeight] = await resolveImageData(\n\t\t\timage.slice(4, -1)\n\t\t);\n\n\t\tlet resolvedWidth: number;\n\t\tlet resolvedHeight: number;\n\n\t\tif (isKeywordSize) {\n\t\t\t// Calculate dimensions based on keyword (cover, contain, auto)\n\t\t\tconst [calcWidth, calcHeight] = calculateKeywordSize(\n\t\t\t\tsize,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\timageWidth,\n\t\t\t\timageHeight\n\t\t\t);\n\t\t\tresolvedWidth = calcWidth;\n\t\t\tresolvedHeight = calcHeight;\n\t\t} else {\n\t\t\t// Use the previously parsed dimensions\n\t\t\tconst dimensionsWithoutFallback = parseLengthPairs(size, {\n\t\t\t\tx: width,\n\t\t\t\ty: height,\n\t\t\t\tdefaultX: 0,\n\t\t\t\tdefaultY: 0\n\t\t\t});\n\t\t\tresolvedWidth =\n\t\t\t\tfrom === 'mask'\n\t\t\t\t\t? imageWidth || dimensionsWithoutFallback[0]\n\t\t\t\t\t: dimensionsWithoutFallback[0] || imageWidth;\n\t\t\tresolvedHeight =\n\t\t\t\tfrom === 'mask'\n\t\t\t\t\t? imageHeight || dimensionsWithoutFallback[1]\n\t\t\t\t\t: dimensionsWithoutFallback[1] || imageHeight;\n\t\t}\n\n\t\tif (isKeywordSize) {\n\t\t\t// For keyword sizes (cover, contain, auto), apply CSS background-position\n\t\t\t// formula: offset = (containerSize - imageSize) * percentage\n\t\t\tconst rawPos = parsePositionValues(position);\n\t\t\tconst imageOffsetX = computeBgPositionOffset(\n\t\t\t\trawPos.x,\n\t\t\t\twidth,\n\t\t\t\tresolvedWidth\n\t\t\t);\n\t\t\tconst imageOffsetY = computeBgPositionOffset(\n\t\t\t\trawPos.y,\n\t\t\t\theight,\n\t\t\t\tresolvedHeight\n\t\t\t);\n\n\t\t\treturn [\n\t\t\t\t`satori_bi${id}`,\n\t\t\t\tbuildXMLString(\n\t\t\t\t\t'pattern',\n\t\t\t\t\t{\n\t\t\t\t\t\tid: `satori_bi${id}`,\n\t\t\t\t\t\tpatternContentUnits: 'userSpaceOnUse',\n\t\t\t\t\t\tpatternUnits: 'userSpaceOnUse',\n\t\t\t\t\t\tx: (repeatX ? imageOffsetX : 0) + left,\n\t\t\t\t\t\ty: (repeatY ? imageOffsetY : 0) + top,\n\t\t\t\t\t\twidth: repeatX ? resolvedWidth : '100%',\n\t\t\t\t\t\theight: repeatY ? resolvedHeight : '100%'\n\t\t\t\t\t},\n\t\t\t\t\tbuildXMLString('image', {\n\t\t\t\t\t\tx: repeatX ? 0 : imageOffsetX,\n\t\t\t\t\t\ty: repeatY ? 0 : imageOffsetY,\n\t\t\t\t\t\twidth: resolvedWidth,\n\t\t\t\t\t\theight: resolvedHeight,\n\t\t\t\t\t\tpreserveAspectRatio: 'none',\n\t\t\t\t\t\thref: src\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t];\n\t\t}\n\n\t\treturn [\n\t\t\t`satori_bi${id}`,\n\t\t\tbuildXMLString(\n\t\t\t\t'pattern',\n\t\t\t\t{\n\t\t\t\t\tid: `satori_bi${id}`,\n\t\t\t\t\tpatternContentUnits: 'userSpaceOnUse',\n\t\t\t\t\tpatternUnits: 'userSpaceOnUse',\n\t\t\t\t\tx: offsets[0] + left,\n\t\t\t\t\ty: offsets[1] + top,\n\t\t\t\t\twidth: repeatX ? resolvedWidth : '100%',\n\t\t\t\t\theight: repeatY ? resolvedHeight : '100%'\n\t\t\t\t},\n\t\t\t\tbuildXMLString('image', {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0,\n\t\t\t\t\twidth: resolvedWidth,\n\t\t\t\t\theight: resolvedHeight,\n\t\t\t\t\tpreserveAspectRatio: 'none',\n\t\t\t\t\thref: src\n\t\t\t\t})\n\t\t\t)\n\t\t];\n\t}\n\n\tif (cssColorParse(image)) {\n\t\tconst colorObj = cssColorParse(image);\n\t\tconst [r, g, b, a] = colorObj.values;\n\t\tconst alpha = a !== undefined ? a : 1;\n\t\tconst color = `rgba(${r},${g},${b},${alpha})`;\n\n\t\treturn [\n\t\t\t`satori_bi${id}`,\n\t\t\tbuildXMLString(\n\t\t\t\t'pattern',\n\t\t\t\t{\n\t\t\t\t\tid: `satori_bi${id}`,\n\t\t\t\t\tpatternContentUnits: 'userSpaceOnUse',\n\t\t\t\t\tpatternUnits: 'userSpaceOnUse',\n\t\t\t\t\tx: left,\n\t\t\t\t\ty: top,\n\t\t\t\t\twidth: width,\n\t\t\t\t\theight: height\n\t\t\t\t},\n\t\t\t\tbuildXMLString('rect', {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0,\n\t\t\t\t\twidth: width,\n\t\t\t\t\theight: height,\n\t\t\t\t\tfill: color\n\t\t\t\t})\n\t\t\t)\n\t\t];\n\t}\n\n\tthrow new Error(`Invalid background image: \"${image}\"`);\n}\n","/**\n * CSS border radius to SVG path.\n */\n\n// TODO: Support the `border-radius: 10px / 20px` syntax.\n// https://developer.mozilla.org/en-US/docs/Web/CSS/border-radius\n\nimport { buildXMLString, lengthToNumber } from '../utils.js';\n\n// Getting the intersection of a 45deg ray with the elliptical arc x^2/rx^2 + y^2/ry^2 = 1.\n// Reference:\n// https://www.w3.org/TR/SVG/implnote.html#ArcConversionEndpointToCenter\nfunction svgArcCenterOffset([rx, ry]: number[]) {\n\tif (Math.round(rx * 1000) === 0 && Math.round(ry * 1000) === 0) {\n\t\treturn 0;\n\t}\n\treturn Math.round(((rx * ry) / Math.sqrt(rx * rx + ry * ry)) * 1000) / 1000;\n}\n\nfunction resolveSize(a: number, b: number, limit: number) {\n\tif (limit < a + b) {\n\t\tif (limit / 2 < a && limit / 2 < b) {\n\t\t\ta = b = limit / 2;\n\t\t} else if (limit / 2 < a) {\n\t\t\ta = limit - b;\n\t\t} else if (limit / 2 < b) {\n\t\t\tb = limit - a;\n\t\t}\n\t}\n\treturn [a, b];\n}\n\nfunction makeSmaller(arr: [number, number]) {\n\tarr[0] = arr[1] = Math.min(arr[0], arr[1]);\n}\n\n// Each corner can have 2 values, the first is the horizontal radius, the second is the vertical radius.\nfunction resolveRadius(\n\tv: number | string | undefined,\n\twidth: number,\n\theight: number,\n\tfontSize: number,\n\tstyle: any\n): [boolean, undefined | [number, number]] {\n\tif (typeof v === 'string') {\n\t\tconst sides = v.split(' ').map(s => s.trim());\n\t\tconst singleValue = !sides[1] && !sides[0].endsWith('%');\n\t\tsides[1] = sides[1] || sides[0];\n\t\treturn [\n\t\t\tsingleValue,\n\t\t\t[\n\t\t\t\tMath.min(\n\t\t\t\t\tlengthToNumber(sides[0], fontSize, width, style, true),\n\t\t\t\t\twidth\n\t\t\t\t),\n\t\t\t\tMath.min(\n\t\t\t\t\tlengthToNumber(sides[1], fontSize, height, style, true),\n\t\t\t\t\theight\n\t\t\t\t)\n\t\t\t]\n\t\t];\n\t}\n\tif (typeof v === 'number') {\n\t\treturn [true, [Math.min(v, width), Math.min(v, height)]];\n\t}\n\treturn [true, undefined];\n}\n\nconst radiusZeroOrNull = (_radius?: [number, number]) =>\n\t_radius && _radius[0] !== 0 && _radius[1] !== 0;\n\nexport function getBorderRadiusClipPath(\n\t{\n\t\tid,\n\t\tborderRadiusPath,\n\t\tborderType,\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight\n\t}: {\n\t\tid: string;\n\t\tborderRadiusPath?: string;\n\t\tborderType?: 'rect' | 'path';\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t},\n\tstyle: Record<string, number | string>\n) {\n\tconst rectClipId = `satori_brc-${id}`;\n\tconst defs = buildXMLString(\n\t\t'clipPath',\n\t\t{\n\t\t\tid: rectClipId\n\t\t},\n\t\tbuildXMLString(borderType, {\n\t\t\tx: left,\n\t\t\ty: top,\n\t\t\twidth,\n\t\t\theight,\n\t\t\td: borderRadiusPath ? borderRadiusPath : undefined\n\t\t})\n\t);\n\n\treturn [defs, rectClipId];\n}\n\nexport default function radius(\n\t{\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight\n\t}: {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t},\n\tstyle: Record<string, any>,\n\tpartialSides?: boolean[]\n) {\n\tlet {\n\t\tborderTopLeftRadius,\n\t\tborderTopRightRadius,\n\t\tborderBottomLeftRadius,\n\t\tborderBottomRightRadius,\n\t\tfontSize\n\t} = style;\n\n\tlet singleAbsValueTopLeftCorner;\n\tlet singleAbsValueTopRightCorner;\n\tlet singleAbsValueBottomLeftCorner;\n\tlet singleAbsValueBottomRightCorner;\n\t[singleAbsValueTopLeftCorner, borderTopLeftRadius] = resolveRadius(\n\t\tborderTopLeftRadius,\n\t\twidth,\n\t\theight,\n\t\tfontSize,\n\t\tstyle\n\t);\n\t[singleAbsValueTopRightCorner, borderTopRightRadius] = resolveRadius(\n\t\tborderTopRightRadius,\n\t\twidth,\n\t\theight,\n\t\tfontSize,\n\t\tstyle\n\t);\n\t[singleAbsValueBottomLeftCorner, borderBottomLeftRadius] = resolveRadius(\n\t\tborderBottomLeftRadius,\n\t\twidth,\n\t\theight,\n\t\tfontSize,\n\t\tstyle\n\t);\n\t[singleAbsValueBottomRightCorner, borderBottomRightRadius] = resolveRadius(\n\t\tborderBottomRightRadius,\n\t\twidth,\n\t\theight,\n\t\tfontSize,\n\t\tstyle\n\t);\n\n\tif (\n\t\t!partialSides &&\n\t\t!radiusZeroOrNull(borderTopLeftRadius) &&\n\t\t!radiusZeroOrNull(borderTopRightRadius) &&\n\t\t!radiusZeroOrNull(borderBottomLeftRadius) &&\n\t\t!radiusZeroOrNull(borderBottomRightRadius)\n\t) {\n\t\treturn '';\n\t}\n\tborderTopLeftRadius ||= [0, 0];\n\tborderTopRightRadius ||= [0, 0];\n\tborderBottomLeftRadius ||= [0, 0];\n\tborderBottomRightRadius ||= [0, 0];\n\n\t// Limit the radius sizes of each edge to make sure they will never overlap.\n\n\t// Top\n\t[borderTopLeftRadius[0], borderTopRightRadius[0]] = resolveSize(\n\t\tborderTopLeftRadius[0],\n\t\tborderTopRightRadius[0],\n\t\twidth\n\t);\n\t// Bottom\n\t[borderBottomLeftRadius[0], borderBottomRightRadius[0]] = resolveSize(\n\t\tborderBottomLeftRadius[0],\n\t\tborderBottomRightRadius[0],\n\t\twidth\n\t);\n\t// Left\n\t[borderTopLeftRadius[1], borderBottomLeftRadius[1]] = resolveSize(\n\t\tborderTopLeftRadius[1],\n\t\tborderBottomLeftRadius[1],\n\t\theight\n\t);\n\t// Right\n\t[borderTopRightRadius[1], borderBottomRightRadius[1]] = resolveSize(\n\t\tborderTopRightRadius[1],\n\t\tborderBottomRightRadius[1],\n\t\theight\n\t);\n\n\t// If the specified border radius is a single value (e.g. 10px or 10em), we take\n\t// the minimum of the resolved horizontal and vertical radius and apply to both.\n\tif (singleAbsValueTopLeftCorner) {\n\t\tmakeSmaller(borderTopLeftRadius);\n\t}\n\tif (singleAbsValueTopRightCorner) {\n\t\tmakeSmaller(borderTopRightRadius);\n\t}\n\tif (singleAbsValueBottomLeftCorner) {\n\t\tmakeSmaller(borderBottomLeftRadius);\n\t}\n\tif (singleAbsValueBottomRightCorner) {\n\t\tmakeSmaller(borderBottomRightRadius);\n\t}\n\n\ttype Arc = [[number, number], [number, number]];\n\tconst p: Arc[] = [];\n\tp[0] = [borderTopRightRadius, borderTopRightRadius];\n\tp[1] = [\n\t\tborderBottomRightRadius,\n\t\t[-borderBottomRightRadius[0], borderBottomRightRadius[1]]\n\t];\n\tp[2] = [\n\t\tborderBottomLeftRadius,\n\t\t[-borderBottomLeftRadius[0], -borderBottomLeftRadius[1]]\n\t];\n\tp[3] = [\n\t\tborderTopLeftRadius,\n\t\t[borderTopLeftRadius[0], -borderTopLeftRadius[1]]\n\t];\n\n\tconst T = `h${width - borderTopLeftRadius[0] - borderTopRightRadius[0]} a${\n\t\tp[0][0]\n\t} 0 0 1 ${p[0][1]}`;\n\tconst R = `v${\n\t\theight - borderTopRightRadius[1] - borderBottomRightRadius[1]\n\t} a${p[1][0]} 0 0 1 ${p[1][1]}`;\n\tconst B = `h${\n\t\tborderBottomRightRadius[0] + borderBottomLeftRadius[0] - width\n\t} a${p[2][0]} 0 0 1 ${p[2][1]}`;\n\tconst L = `v${\n\t\tborderBottomLeftRadius[1] + borderTopLeftRadius[1] - height\n\t} a${p[3][0]} 0 0 1 ${p[3][1]}`;\n\n\tif (partialSides) {\n\t\t// \"However it is not defined what these transitions look like or what function maps from this ratio to a point on the curve.\"\n\t\t// https://w3c.github.io/csswg-drafts/css-backgrounds-3/#corner-transitions\n\t\tlet start = partialSides.indexOf(false);\n\n\t\tif (!partialSides.includes(true))\n\t\t\tthrow new Error('Invalid `partialSides`.');\n\n\t\tif (start === -1) {\n\t\t\tstart = 0;\n\t\t} else {\n\t\t\twhile (!partialSides[start]) {\n\t\t\t\tstart = (start + 1) % 4;\n\t\t\t}\n\t\t}\n\n\t\tfunction getArc(i: number) {\n\t\t\tconst c0 = svgArcCenterOffset(\n\t\t\t\t[\n\t\t\t\t\tborderTopLeftRadius,\n\t\t\t\t\tborderTopRightRadius,\n\t\t\t\t\tborderBottomRightRadius,\n\t\t\t\t\tborderBottomLeftRadius\n\t\t\t\t][i]\n\t\t\t);\n\t\t\treturn i === 0\n\t\t\t\t? [\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tleft + borderTopLeftRadius[0] - c0,\n\t\t\t\t\t\t\ttop + borderTopLeftRadius[1] - c0\n\t\t\t\t\t\t],\n\t\t\t\t\t\t[left + borderTopLeftRadius[0], top]\n\t\t\t\t ]\n\t\t\t\t: i === 1\n\t\t\t\t? [\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tleft + width - borderTopRightRadius[0] + c0,\n\t\t\t\t\t\t\ttop + borderTopRightRadius[1] - c0\n\t\t\t\t\t\t],\n\t\t\t\t\t\t[left + width, top + borderTopRightRadius[1]]\n\t\t\t\t ]\n\t\t\t\t: i === 2\n\t\t\t\t? [\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tleft + width - borderBottomRightRadius[0] + c0,\n\t\t\t\t\t\t\ttop + height - borderBottomRightRadius[1] + c0\n\t\t\t\t\t\t],\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tleft + width - borderBottomRightRadius[0],\n\t\t\t\t\t\t\ttop + height\n\t\t\t\t\t\t]\n\t\t\t\t ]\n\t\t\t\t: [\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tleft + borderBottomLeftRadius[0] - c0,\n\t\t\t\t\t\t\ttop + height - borderBottomLeftRadius[1] + c0\n\t\t\t\t\t\t],\n\t\t\t\t\t\t[left, top + height - borderBottomLeftRadius[1]]\n\t\t\t\t ];\n\t\t}\n\n\t\tlet result = '';\n\n\t\tconst arc0 = getArc(start);\n\n\t\tlet l = `M${arc0[0]} A${p[(start + 3) % 4][0]} 0 0 1 ${arc0[1]}`;\n\n\t\tlet len = 0;\n\t\tfor (; len < 4 && partialSides[(start + len) % 4]; len++) {\n\t\t\tresult += l + ' ';\n\t\t\tl = [T, R, B, L][(start + len) % 4];\n\t\t}\n\t\tconst end = (start + len) % 4;\n\n\t\t// For the last segment, we skip the full arc and add the half arc.\n\t\tresult += l.split(' ')[0];\n\n\t\tconst arc1 = getArc(end);\n\t\tresult += ` A${p[(end + 3) % 4][0]} 0 0 1 ${arc1[0]}`;\n\n\t\treturn result;\n\t}\n\n\t// Generate the path\n\treturn `M${left + borderTopLeftRadius[0]},${top} ${T} ${R} ${B} ${L}`;\n}\n","import { buildXMLString } from '../utils.js';\nimport radius from './border-radius.js';\n\nfunction compareBorderDirections(a: string, b: string, style: any) {\n\treturn (\n\t\tstyle[a + 'Width'] === style[b + 'Width'] &&\n\t\tstyle[a + 'Style'] === style[b + 'Style'] &&\n\t\tstyle[a + 'Color'] === style[b + 'Color']\n\t);\n}\n\nexport function getBorderClipPath(\n\t{\n\t\tid,\n\t\t// Can be `overflow: hidden` from parent containers.\n\t\tcurrentClipPathId,\n\t\tborderPath,\n\t\tborderType,\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight\n\t}: {\n\t\tid: string;\n\t\tcurrentClipPathId?: string | number;\n\t\tborderPath?: string;\n\t\tborderType?: 'rect' | 'path';\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t},\n\tstyle: Record<string, number | string>\n) {\n\tconst hasBorder =\n\t\tstyle.borderTopWidth ||\n\t\tstyle.borderRightWidth ||\n\t\tstyle.borderBottomWidth ||\n\t\tstyle.borderLeftWidth;\n\n\tif (!hasBorder) return null;\n\n\t// In SVG, stroke is always centered on the path and there is no\n\t// existing property to make it behave like CSS border. So here we\n\t// 2x the border width and introduce another clip path to clip the\n\t// overflowed part.\n\tconst rectClipId = `satori_bc-${id}`;\n\tconst defs = buildXMLString(\n\t\t'clipPath',\n\t\t{\n\t\t\tid: rectClipId,\n\t\t\t'clip-path': currentClipPathId\n\t\t\t\t? `url(#${currentClipPathId})`\n\t\t\t\t: undefined\n\t\t},\n\t\tbuildXMLString(borderType, {\n\t\t\tx: left,\n\t\t\ty: top,\n\t\t\twidth,\n\t\t\theight,\n\t\t\td: borderPath ? borderPath : undefined\n\t\t})\n\t);\n\n\treturn [defs, rectClipId];\n}\n\nexport default function border(\n\t{\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight,\n\t\tprops,\n\t\tasContentMask,\n\t\tmaskBorderOnly\n\t}: {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t\tprops: any;\n\t\tasContentMask?: boolean;\n\t\tmaskBorderOnly?: boolean;\n\t},\n\tstyle: Record<string, number | string>\n) {\n\tconst directions = [\n\t\t'borderTop',\n\t\t'borderRight',\n\t\t'borderBottom',\n\t\t'borderLeft'\n\t];\n\n\t// No border\n\tif (\n\t\t!asContentMask &&\n\t\t!directions.some(direction => style[direction + 'Width'])\n\t)\n\t\treturn '';\n\n\tlet fullBorder = '';\n\n\tlet start = 0;\n\twhile (\n\t\tstart > 0 &&\n\t\tcompareBorderDirections(\n\t\t\tdirections[start],\n\t\t\tdirections[(start + 3) % 4],\n\t\t\tstyle\n\t\t)\n\t) {\n\t\tstart = (start + 3) % 4;\n\t}\n\n\tlet partialSides = [false, false, false, false];\n\tlet currentStyle = [];\n\tfor (let _i = 0; _i < 4; _i++) {\n\t\tconst i = (start + _i) % 4;\n\t\tconst ni = (start + _i + 1) % 4;\n\n\t\tconst d = directions[i];\n\t\tconst nd = directions[ni];\n\n\t\tpartialSides[i] = true;\n\t\tcurrentStyle = [\n\t\t\tstyle[d + 'Width'],\n\t\t\tstyle[d + 'Style'],\n\t\t\tstyle[d + 'Color'],\n\t\t\td\n\t\t];\n\n\t\tif (!compareBorderDirections(d, nd, style)) {\n\t\t\tconst w =\n\t\t\t\t(currentStyle[0] || 0) +\n\t\t\t\t(asContentMask && !maskBorderOnly\n\t\t\t\t\t? style[d.replace('border', 'padding')] || 0\n\t\t\t\t\t: 0);\n\t\t\tif (w) {\n\t\t\t\tfullBorder += buildXMLString('path', {\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\t...props,\n\t\t\t\t\tfill: 'none',\n\t\t\t\t\tstroke: asContentMask ? '#000' : currentStyle[2],\n\t\t\t\t\t'stroke-width': w * 2,\n\t\t\t\t\t'stroke-dasharray':\n\t\t\t\t\t\t!asContentMask && currentStyle[1] === 'dashed'\n\t\t\t\t\t\t\t? w * 2 + ' ' + w\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\td: radius(\n\t\t\t\t\t\t{ left, top, width, height },\n\t\t\t\t\t\tstyle as Record<string, number>,\n\t\t\t\t\t\tpartialSides\n\t\t\t\t\t)\n\t\t\t\t});\n\t\t\t}\n\t\t\tpartialSides = [false, false, false, false];\n\t\t}\n\t}\n\n\tif (partialSides.some(Boolean)) {\n\t\tconst w =\n\t\t\t(currentStyle[0] || 0) +\n\t\t\t(asContentMask && !maskBorderOnly\n\t\t\t\t? style[currentStyle[3].replace('border', 'padding')] || 0\n\t\t\t\t: 0);\n\t\tif (w) {\n\t\t\tfullBorder += buildXMLString('path', {\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\t...props,\n\t\t\t\tfill: 'none',\n\t\t\t\tstroke: asContentMask ? '#000' : currentStyle[2],\n\t\t\t\t'stroke-width': w * 2,\n\t\t\t\t'stroke-dasharray':\n\t\t\t\t\t!asContentMask && currentStyle[1] === 'dashed'\n\t\t\t\t\t\t? w * 2 + ' ' + w\n\t\t\t\t\t\t: undefined,\n\t\t\t\td: radius(\n\t\t\t\t\t{ left, top, width, height },\n\t\t\t\t\tstyle as Record<string, number>,\n\t\t\t\t\tpartialSides\n\t\t\t\t)\n\t\t\t});\n\t\t}\n\t}\n\n\treturn fullBorder;\n}\n","/**\n * When there is border radius, the content area should be clipped by the\n * inner path of border + padding. This applies to <img> element as well as any\n * child element inside a `overflow: hidden` container.\n */\n\nimport { buildXMLString } from '../utils.js';\nimport border from './border.js';\n\nexport default function contentMask(\n\t{\n\t\tid,\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight,\n\t\tmatrix,\n\t\tborderOnly\n\t}: {\n\t\tid: string;\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t\tmatrix: string | undefined;\n\t\tborderOnly?: boolean;\n\t},\n\tstyle: Record<string, number | string>\n) {\n\tconst offsetLeft =\n\t\t((style.borderLeftWidth as number) || 0) +\n\t\t(borderOnly ? 0 : (style.paddingLeft as number) || 0);\n\tconst offsetTop =\n\t\t((style.borderTopWidth as number) || 0) +\n\t\t(borderOnly ? 0 : (style.paddingTop as number) || 0);\n\tconst offsetRight =\n\t\t((style.borderRightWidth as number) || 0) +\n\t\t(borderOnly ? 0 : (style.paddingRight as number) || 0);\n\tconst offsetBottom =\n\t\t((style.borderBottomWidth as number) || 0) +\n\t\t(borderOnly ? 0 : (style.paddingBottom as number) || 0);\n\n\tconst contentArea = {\n\t\tx: left + offsetLeft,\n\t\ty: top + offsetTop,\n\t\twidth: width - offsetLeft - offsetRight,\n\t\theight: height - offsetTop - offsetBottom\n\t};\n\n\tconst _contentMask = buildXMLString(\n\t\t'mask',\n\t\t{ id },\n\t\tbuildXMLString('rect', {\n\t\t\t...contentArea,\n\t\t\tfill: '#fff',\n\t\t\t// add transformation matrix to mask if overflow is hidden AND a\n\t\t\t// transformation style is defined, otherwise children will be clipped\n\t\t\t// incorrectly\n\t\t\ttransform:\n\t\t\t\tstyle.overflow === 'hidden' && style.transform && matrix\n\t\t\t\t\t? matrix\n\t\t\t\t\t: undefined,\n\t\t\tmask: style._inheritedMaskId\n\t\t\t\t? `url(#${style._inheritedMaskId})`\n\t\t\t\t: undefined\n\t\t}) +\n\t\t\tborder(\n\t\t\t\t{\n\t\t\t\t\tleft,\n\t\t\t\t\ttop,\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\ttransform: matrix ? matrix : undefined\n\t\t\t\t\t},\n\t\t\t\t\tasContentMask: true,\n\t\t\t\t\tmaskBorderOnly: borderOnly\n\t\t\t\t},\n\t\t\t\tstyle\n\t\t\t)\n\t);\n\n\treturn _contentMask;\n}\n","import { lengthToNumber } from '../utils.js';\nimport { default as buildBorderRadius } from '../builder/border-radius.js';\nimport { getStylesForProperty } from 'css-to-react-native';\n\nconst regexMap = {\n\tcircle: /circle\\((.+)\\)/,\n\tellipse: /ellipse\\((.+)\\)/,\n\tpath: /path\\((.+)\\)/,\n\tpolygon: /polygon\\((.+)\\)/,\n\tinset: /inset\\((.+)\\)/\n};\n\nexport function createShapeParser(\n\t{\n\t\twidth,\n\t\theight\n\t}: {\n\t\twidth: number;\n\t\theight: number;\n\t},\n\tstyle: Record<string, string | number>,\n\tinheritedStyle: Record<string, string | number>\n) {\n\tfunction parseCircle(str: string) {\n\t\tconst res = str.match(regexMap['circle']);\n\n\t\tif (!res) return null;\n\n\t\tconst [, value] = res;\n\t\tconst [radius, pos = ''] = value.split('at').map(v => v.trim());\n\t\tconst { x, y } = resolvePosition(pos, width, height);\n\n\t\treturn {\n\t\t\ttype: 'circle',\n\t\t\tr: lengthToNumber(\n\t\t\t\tradius,\n\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\tMath.sqrt(Math.pow(width, 2) + Math.pow(height, 2)) /\n\t\t\t\t\tMath.sqrt(2),\n\t\t\t\tinheritedStyle,\n\t\t\t\ttrue\n\t\t\t),\n\t\t\tcx: lengthToNumber(\n\t\t\t\tx,\n\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\twidth,\n\t\t\t\tinheritedStyle,\n\t\t\t\ttrue\n\t\t\t),\n\t\t\tcy: lengthToNumber(\n\t\t\t\ty,\n\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\theight,\n\t\t\t\tinheritedStyle,\n\t\t\t\ttrue\n\t\t\t)\n\t\t};\n\t}\n\tfunction parseEllipse(str: string) {\n\t\tconst res = str.match(regexMap['ellipse']);\n\n\t\tif (!res) return null;\n\n\t\tconst [, value] = res;\n\t\tconst [radius, pos = ''] = value.split('at').map(v => v.trim());\n\t\tconst [rx, ry] = radius.split(' ');\n\t\tconst { x, y } = resolvePosition(pos, width, height);\n\n\t\treturn {\n\t\t\ttype: 'ellipse',\n\t\t\trx: lengthToNumber(\n\t\t\t\trx || '50%',\n\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\twidth,\n\t\t\t\tinheritedStyle,\n\t\t\t\ttrue\n\t\t\t),\n\t\t\try: lengthToNumber(\n\t\t\t\try || '50%',\n\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\theight,\n\t\t\t\tinheritedStyle,\n\t\t\t\ttrue\n\t\t\t),\n\t\t\tcx: lengthToNumber(\n\t\t\t\tx,\n\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\twidth,\n\t\t\t\tinheritedStyle,\n\t\t\t\ttrue\n\t\t\t),\n\t\t\tcy: lengthToNumber(\n\t\t\t\ty,\n\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\theight,\n\t\t\t\tinheritedStyle,\n\t\t\t\ttrue\n\t\t\t)\n\t\t};\n\t}\n\tfunction parsePath(str: string) {\n\t\tconst res = str.match(regexMap['path']);\n\n\t\tif (!res) return null;\n\n\t\tconst [fillRule, d] = resolveFillRule(res[1]);\n\n\t\treturn {\n\t\t\ttype: 'path',\n\t\t\td,\n\t\t\t'fill-rule': fillRule\n\t\t};\n\t}\n\tfunction parsePolygon(str: string) {\n\t\tconst res = str.match(regexMap['polygon']);\n\n\t\tif (!res) return null;\n\n\t\tconst [fillRule, points] = resolveFillRule(res[1]);\n\n\t\treturn {\n\t\t\ttype: 'polygon',\n\t\t\t'fill-rule': fillRule,\n\t\t\tpoints: points\n\t\t\t\t.split(',')\n\t\t\t\t.map(v =>\n\t\t\t\t\tv\n\t\t\t\t\t\t.split(' ')\n\t\t\t\t\t\t.map((k, i) =>\n\t\t\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\t\t\tk,\n\t\t\t\t\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\t\t\t\t\ti === 0 ? width : height,\n\t\t\t\t\t\t\t\tinheritedStyle,\n\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join(' ')\n\t\t\t\t)\n\t\t\t\t.join(',')\n\t\t};\n\t}\n\tfunction parseInset(str: string) {\n\t\tconst res = str.match(regexMap['inset']);\n\n\t\tif (!res) return null;\n\n\t\tconst [inset, radius] = (\n\t\t\tres[1].includes('round') ? res[1] : `${res[1].trim()} round 0`\n\t\t).split('round');\n\t\tconst radiusMap = getStylesForProperty('borderRadius', radius, true);\n\t\tconst r = Object.values(radiusMap)\n\t\t\t.map(s => String(s))\n\t\t\t.map(\n\t\t\t\t(s, i) =>\n\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\ts,\n\t\t\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\t\t\ti === 0 || i === 2 ? height : width,\n\t\t\t\t\t\tinheritedStyle,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) || 0\n\t\t\t);\n\t\tconst offsets = Object.values(\n\t\t\tgetStylesForProperty('margin', inset, true)\n\t\t)\n\t\t\t.map(s => String(s))\n\t\t\t.map(\n\t\t\t\t(s, i) =>\n\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\ts,\n\t\t\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\t\t\ti === 0 || i === 2 ? height : width,\n\t\t\t\t\t\tinheritedStyle,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) || 0\n\t\t\t);\n\t\tconst x = offsets[3];\n\t\tconst y = offsets[0];\n\t\tconst w = width - (offsets[1] + offsets[3]);\n\t\tconst h = height - (offsets[0] + offsets[2]);\n\n\t\tif (r.some(v => v > 0)) {\n\t\t\tconst d = buildBorderRadius(\n\t\t\t\t{ left: x, top: y, width: w, height: h },\n\t\t\t\t{ ...style, ...radiusMap }\n\t\t\t);\n\n\t\t\treturn { type: 'path', d };\n\t\t}\n\n\t\treturn {\n\t\t\ttype: 'rect',\n\t\t\tx,\n\t\t\ty,\n\t\t\twidth: w,\n\t\t\theight: h\n\t\t};\n\t}\n\n\treturn {\n\t\tparseCircle,\n\t\tparseEllipse,\n\t\tparsePath,\n\t\tparsePolygon,\n\t\tparseInset\n\t};\n}\n\nfunction resolveFillRule(str: string) {\n\tconst [, fillRule = 'nonzero', d] =\n\t\tstr.replace(/('|\")/g, '').match(/^(nonzero|evenodd)?,?(.+)/) || [];\n\n\treturn [fillRule, d];\n}\n\nfunction resolvePosition(position: string, xDelta: number, yDelta: number) {\n\tconst pos = position.split(' ');\n\tconst res: { x: number | string; y: number | string } = {\n\t\tx: pos[0] || '50%',\n\t\ty: pos[1] || '50%'\n\t};\n\n\tpos.forEach(v => {\n\t\tif (v === 'top') {\n\t\t\tres.y = 0;\n\t\t} else if (v === 'bottom') {\n\t\t\tres.y = yDelta;\n\t\t} else if (v === 'left') {\n\t\t\tres.x = 0;\n\t\t} else if (v === 'right') {\n\t\t\tres.x = xDelta;\n\t\t} else if (v === 'center') {\n\t\t\tres.x = xDelta / 2;\n\t\t\tres.y = yDelta / 2;\n\t\t} else {\n\t\t\t// do nothing\n\t\t}\n\t});\n\n\treturn res;\n}\n","import { buildXMLString } from '../utils.js';\nimport { createShapeParser } from '../parser/shape.js';\n\nexport function genClipPathId(id: string) {\n\treturn `satori_cp-${id}`;\n}\nexport function genClipPath(id: string) {\n\treturn `url(#${genClipPathId(id)})`;\n}\n\nexport function buildClipPath(\n\tv: {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t\tpath: string;\n\t\tmatrix: string | undefined;\n\t\tid: string;\n\t\tcurrentClipPath: string | string;\n\t\tsrc?: string;\n\t},\n\tstyle: Record<string, string | number>,\n\tinheritedStyle: Record<string, string | number>\n) {\n\tif (style.clipPath === 'none') return '';\n\n\tconst parser = createShapeParser(v, style, inheritedStyle);\n\tconst clipPath = style.clipPath as string;\n\n\tlet tmp: { type: string; [p: string]: string | number } = { type: '' };\n\n\tfor (const k of Object.keys(parser)) {\n\t\ttmp = parser[k](clipPath);\n\t\tif (tmp) break;\n\t}\n\n\tif (tmp) {\n\t\tconst { type, ...rest } = tmp;\n\t\treturn buildXMLString(\n\t\t\t'clipPath',\n\t\t\t{\n\t\t\t\tid: genClipPathId(v.id),\n\t\t\t\t'clip-path': v.currentClipPath,\n\t\t\t\ttransform: `translate(${v.left}, ${v.top})`\n\t\t\t},\n\t\t\tbuildXMLString(type, rest)\n\t\t);\n\t}\n\treturn '';\n}\n","/**\n * Generate clip path for the given element.\n */\n\nimport { buildXMLString } from '../utils.js';\nimport mask from './content-mask.js';\nimport { buildClipPath, genClipPathId } from './clip-path.js';\n\nexport default function overflow(\n\t{\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight,\n\t\tpath,\n\t\tmatrix,\n\t\tid,\n\t\tcurrentClipPath,\n\t\tsrc\n\t}: {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t\tpath: string;\n\t\tmatrix: string | undefined;\n\t\tid: string;\n\t\tcurrentClipPath: string | string;\n\t\tsrc?: string;\n\t},\n\tstyle: Record<string, string | number>,\n\tinheritableStyle: Record<string, string | number>\n) {\n\tlet overflowClipPath = '';\n\tconst clipPath =\n\t\tstyle.clipPath && style.clipPath !== 'none'\n\t\t\t? buildClipPath(\n\t\t\t\t\t{\n\t\t\t\t\t\tleft,\n\t\t\t\t\t\ttop,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\theight,\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tmatrix,\n\t\t\t\t\t\tcurrentClipPath,\n\t\t\t\t\t\tsrc\n\t\t\t\t\t},\n\t\t\t\t\tstyle as Record<string, number>,\n\t\t\t\t\tinheritableStyle\n\t\t\t )\n\t\t\t: '';\n\n\tif (style.overflow !== 'hidden' && !src) {\n\t\toverflowClipPath = '';\n\t} else {\n\t\tconst _id = clipPath ? `satori_ocp-${id}` : genClipPathId(id);\n\n\t\toverflowClipPath = buildXMLString(\n\t\t\t'clipPath',\n\t\t\t{\n\t\t\t\tid: _id,\n\t\t\t\t'clip-path': currentClipPath\n\t\t\t},\n\t\t\tbuildXMLString(path ? 'path' : 'rect', {\n\t\t\t\tx: left,\n\t\t\t\ty: top,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\td: path ? path : undefined,\n\t\t\t\t// add transformation matrix to clip path if overflow is hidden AND a\n\t\t\t\t// transformation style is defined, otherwise children will be clipped\n\t\t\t\t// relative to the parent's original plane instead of the transformed\n\t\t\t\t// plane\n\t\t\t\ttransform:\n\t\t\t\t\tstyle.overflow === 'hidden' && style.transform && matrix\n\t\t\t\t\t\t? matrix\n\t\t\t\t\t\t: undefined\n\t\t\t})\n\t\t);\n\t}\n\n\tconst contentMask = mask(\n\t\t{\n\t\t\tid: `satori_om-${id}`,\n\t\t\tleft,\n\t\t\ttop,\n\t\t\twidth,\n\t\t\theight,\n\t\t\tmatrix,\n\t\t\tborderOnly: src ? false : true\n\t\t},\n\t\tstyle\n\t);\n\n\treturn clipPath + overflowClipPath + contentMask;\n}\n","import { buildXMLString } from '../utils.js';\nimport buildBackgroundImage from './background-image.js';\nimport type { MaskProperty } from '../parser/mask.js';\n\nconst genMaskImageId = (id: string) => `satori_mi-${id}`;\n\nexport default async function buildMaskImage(\n\tv: {\n\t\tid: string;\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t},\n\tstyle: Record<string, string | number>,\n\tinheritedStyle: Record<string, string | number>\n): Promise<[string, string]> {\n\tif (!style.maskImage) return ['', ''];\n\tconst { left, top, width, height, id } = v;\n\tconst maskImage = style.maskImage as unknown as MaskProperty[];\n\tconst length = maskImage.length;\n\tif (!length) return ['', ''];\n\tconst miId = genMaskImageId(id);\n\n\tlet mask = '';\n\n\tfor (let i = 0; i < length; i++) {\n\t\tconst m = maskImage[i];\n\n\t\tconst [_id, def] = await buildBackgroundImage(\n\t\t\t{ id: `${miId}-${i}`, left, top, width, height },\n\t\t\tm,\n\t\t\tinheritedStyle,\n\t\t\t'mask'\n\t\t);\n\n\t\tmask +=\n\t\t\tdef +\n\t\t\tbuildXMLString('rect', {\n\t\t\t\tx: left,\n\t\t\t\ty: top,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\tfill: `url(#${_id})`\n\t\t\t});\n\t}\n\n\tmask = buildXMLString('mask', { id: miId }, mask);\n\n\treturn [miId, mask];\n}\n","import type { ParsedTransformOrigin } from '../transform-origin.js';\n\nimport backgroundImage from './background-image.js';\nimport radius, { getBorderRadiusClipPath } from './border-radius.js';\nimport { boxShadow } from './shadow.js';\nimport transform from './transform.js';\nimport overflow from './overflow.js';\nimport { buildXMLString } from '../utils.js';\nimport border, { getBorderClipPath } from './border.js';\nimport { genClipPath } from './clip-path.js';\nimport buildMaskImage from './mask-image.js';\nimport CssDimension from '../vendor/parse-css-dimension/index.js';\n\n/**\n * Parse object-position value into [xOffset, yOffset] in pixels.\n * Supports keywords (left, center, right, top, bottom), percentages, and lengths.\n * Similar to background-position parsing.\n */\nfunction parseObjectPosition(\n\tposition: string,\n\tcontainerWidth: number,\n\tcontainerHeight: number\n): [number, number] {\n\tconst parts = position.toLowerCase().trim().split(/\\s+/);\n\n\t// Convert keyword to percentage\n\tconst keywordToPercent = (keyword: string, axis: 'x' | 'y'): string => {\n\t\tconst map = {\n\t\t\tleft: '0%',\n\t\t\tcenter: '50%',\n\t\t\tright: '100%',\n\t\t\ttop: '0%',\n\t\t\tbottom: '100%'\n\t\t};\n\t\treturn map[keyword] || keyword;\n\t};\n\n\tlet xValue: string;\n\tlet yValue: string;\n\n\tif (parts.length === 1) {\n\t\tconst part = parts[0];\n\t\t// Single value\n\t\tif (part === 'left' || part === 'center' || part === 'right') {\n\t\t\txValue = keywordToPercent(part, 'x');\n\t\t\tyValue = '50%'; // center\n\t\t} else if (part === 'top' || part === 'bottom') {\n\t\t\txValue = '50%'; // center\n\t\t\tyValue = keywordToPercent(part, 'y');\n\t\t} else {\n\t\t\t// Assume it's x value, y defaults to center\n\t\t\txValue = part;\n\t\t\tyValue = '50%';\n\t\t}\n\t} else {\n\t\t// Two or more values\n\t\tconst first = parts[0];\n\t\tconst second = parts[1];\n\n\t\t// Check if first is a y-axis keyword (top/bottom)\n\t\tif (first === 'top' || first === 'bottom') {\n\t\t\tyValue = keywordToPercent(first, 'y');\n\t\t\tif (\n\t\t\t\tsecond === 'left' ||\n\t\t\t\tsecond === 'right' ||\n\t\t\t\tsecond === 'center'\n\t\t\t) {\n\t\t\t\txValue = keywordToPercent(second, 'x');\n\t\t\t} else {\n\t\t\t\t// Second is a length/percentage, default x to center\n\t\t\t\txValue = '50%';\n\t\t\t\tyValue =\n\t\t\t\t\tfirst === 'top' || first === 'bottom'\n\t\t\t\t\t\t? keywordToPercent(first, 'y')\n\t\t\t\t\t\t: second;\n\t\t\t}\n\t\t} else {\n\t\t\t// Normal order: x then y\n\t\t\txValue = keywordToPercent(first, 'x');\n\t\t\tyValue = keywordToPercent(second, 'y');\n\t\t}\n\t}\n\n\t// Convert to absolute pixels\n\tconst parseValue = (value: string, containerSize: number): number => {\n\t\ttry {\n\t\t\tif (value.endsWith('%')) {\n\t\t\t\treturn (containerSize * parseFloat(value)) / 100;\n\t\t\t}\n\t\t\tconst parsed = new CssDimension(value);\n\t\t\tif (parsed.type === 'length' || parsed.type === 'number') {\n\t\t\t\treturn parsed.value;\n\t\t\t}\n\t\t\treturn 0;\n\t\t} catch (e) {\n\t\t\treturn 0;\n\t\t}\n\t};\n\n\treturn [\n\t\tparseValue(xValue, containerWidth),\n\t\tparseValue(yValue, containerHeight)\n\t];\n}\n\nexport default async function rect(\n\t{\n\t\tid,\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight,\n\t\tisInheritingTransform,\n\t\tsrc,\n\t\tdebug\n\t}: {\n\t\tid: string;\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t\tisInheritingTransform: boolean;\n\t\tsrc?: string;\n\t\tdebug?: boolean;\n\t},\n\tstyle: Record<string, number | string>,\n\tinheritableStyle: Record<string, number | string>\n) {\n\tif (style.display === 'none') return '';\n\n\tconst isImage = !!src;\n\n\tlet type: 'rect' | 'path' = 'rect';\n\tlet matrix = '';\n\tlet defs = '';\n\tlet fills: string[] = [];\n\tlet opacity = 1;\n\tlet extra = '';\n\n\tif (style.backgroundColor) {\n\t\tfills.push(style.backgroundColor as string);\n\t}\n\n\tif (style.opacity !== undefined) {\n\t\topacity = +style.opacity;\n\t}\n\n\tif (style.transform) {\n\t\tmatrix = transform(\n\t\t\t{\n\t\t\t\tleft,\n\t\t\t\ttop,\n\t\t\t\twidth,\n\t\t\t\theight\n\t\t\t},\n\t\t\tstyle.transform as unknown as number[],\n\t\t\tisInheritingTransform,\n\t\t\tstyle.transformOrigin as ParsedTransformOrigin | undefined\n\t\t);\n\t}\n\n\tlet backgroundShapes = '';\n\tif (style.backgroundImage) {\n\t\tconst backgrounds: string[][] = [];\n\n\t\tfor (\n\t\t\tlet index = 0;\n\t\t\tindex < (style.backgroundImage as any).length;\n\t\t\tindex++\n\t\t) {\n\t\t\tconst background = (style.backgroundImage as any)[index];\n\t\t\tconst image = await backgroundImage(\n\t\t\t\t{ id: id + '_' + index, width, height, left, top },\n\t\t\t\tbackground,\n\t\t\t\tinheritableStyle\n\t\t\t);\n\t\t\tif (image) {\n\t\t\t\t// Background images that come first in the array are rendered last.\n\t\t\t\tbackgrounds.unshift(image);\n\t\t\t}\n\t\t}\n\n\t\tfor (const background of backgrounds) {\n\t\t\tfills.push(`url(#${background[0]})`);\n\t\t\tdefs += background[1];\n\t\t\tif (background[2]) {\n\t\t\t\tbackgroundShapes += background[2];\n\t\t\t}\n\t\t}\n\t}\n\n\tconst [miId, mi] = await buildMaskImage(\n\t\t{ id, left, top, width, height },\n\t\tstyle,\n\t\tinheritableStyle\n\t);\n\n\tdefs += mi;\n\tconst maskId = miId\n\t\t? `url(#${miId})`\n\t\t: style._inheritedMaskId\n\t\t? `url(#${style._inheritedMaskId})`\n\t\t: undefined;\n\n\tconst path = radius(\n\t\t{ left, top, width, height },\n\t\tstyle as Record<string, number>\n\t);\n\tif (path) {\n\t\ttype = 'path';\n\t}\n\n\tconst clipPathId = style._inheritedClipPathId as number | undefined;\n\n\tif (debug) {\n\t\textra = buildXMLString('rect', {\n\t\t\tx: left,\n\t\t\ty: top,\n\t\t\twidth,\n\t\t\theight,\n\t\t\tfill: 'transparent',\n\t\t\tstroke: '#ff5757',\n\t\t\t'stroke-width': 1,\n\t\t\ttransform: matrix || undefined,\n\t\t\t'clip-path': clipPathId ? `url(#${clipPathId})` : undefined\n\t\t});\n\t}\n\n\tconst { backgroundClip, filter: cssFilter, mixBlendMode } = style;\n\n\tconst inlineStyle =\n\t\t[\n\t\t\tcssFilter ? `filter:${cssFilter}` : undefined,\n\t\t\tmixBlendMode ? `mix-blend-mode:${mixBlendMode}` : undefined\n\t\t]\n\t\t\t.filter(v => v)\n\t\t\t.join(';') || undefined;\n\n\tconst currentClipPath =\n\t\tbackgroundClip === 'text'\n\t\t\t? `url(#satori_bct-${id})`\n\t\t\t: clipPathId\n\t\t\t? `url(#${clipPathId})`\n\t\t\t: style.clipPath\n\t\t\t? genClipPath(id)\n\t\t\t: undefined;\n\n\tconst clip = overflow(\n\t\t{ left, top, width, height, path, id, matrix, currentClipPath, src },\n\t\tstyle as Record<string, number>,\n\t\tinheritableStyle\n\t);\n\n\t// Each background generates a new rectangle.\n\t// @TODO: Not sure if this is the best way to do it, maybe <pattern> with\n\t// multiple <image>s is better.\n\tlet shape = fills\n\t\t.map(fill =>\n\t\t\tbuildXMLString(type, {\n\t\t\t\tx: left,\n\t\t\t\ty: top,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\tfill,\n\t\t\t\td: path ? path : undefined,\n\t\t\t\ttransform: matrix ? matrix : undefined,\n\t\t\t\t'clip-path': style.transform ? undefined : currentClipPath,\n\t\t\t\tstyle: inlineStyle,\n\t\t\t\tmask: style.transform ? undefined : maskId\n\t\t\t})\n\t\t)\n\t\t.join('');\n\n\tconst borderClip = getBorderClipPath(\n\t\t{\n\t\t\tid,\n\t\t\tleft,\n\t\t\ttop,\n\t\t\twidth,\n\t\t\theight,\n\t\t\tcurrentClipPathId: clipPathId,\n\t\t\tborderPath: path,\n\t\t\tborderType: type\n\t\t},\n\t\tstyle\n\t);\n\n\t// border radius for images with transform property\n\tlet imageBorderRadius = undefined;\n\n\t// If it's an image (<img>) tag, we add an extra layer of the image itself.\n\tif (isImage) {\n\t\t// We need to subtract the border and padding sizes from the image size.\n\t\tconst offsetLeft =\n\t\t\t((style.borderLeftWidth as number) || 0) +\n\t\t\t((style.paddingLeft as number) || 0);\n\t\tconst offsetTop =\n\t\t\t((style.borderTopWidth as number) || 0) +\n\t\t\t((style.paddingTop as number) || 0);\n\t\tconst offsetRight =\n\t\t\t((style.borderRightWidth as number) || 0) +\n\t\t\t((style.paddingRight as number) || 0);\n\t\tconst offsetBottom =\n\t\t\t((style.borderBottomWidth as number) || 0) +\n\t\t\t((style.paddingBottom as number) || 0);\n\n\t\tconst containerInnerWidth = width - offsetLeft - offsetRight;\n\t\tconst containerInnerHeight = height - offsetTop - offsetBottom;\n\n\t\t// Parse object-position\n\t\tconst position = (style.objectPosition || 'center').toString();\n\t\tconst [objPosX, objPosY] = parseObjectPosition(\n\t\t\tposition,\n\t\t\tcontainerInnerWidth,\n\t\t\tcontainerInnerHeight\n\t\t);\n\n\t\t// Get natural image dimensions if available\n\t\tconst naturalWidth =\n\t\t\t(style.__naturalWidth as number) || containerInnerWidth;\n\t\tconst naturalHeight =\n\t\t\t(style.__naturalHeight as number) || containerInnerHeight;\n\n\t\t// Calculate objectFit behavior\n\t\tlet preserveAspectRatio: string;\n\t\tlet imageWidth = containerInnerWidth;\n\t\tlet imageHeight = containerInnerHeight;\n\t\tlet imageX = left + offsetLeft;\n\t\tlet imageY = top + offsetTop;\n\n\t\tif (style.objectFit === 'contain') {\n\t\t\t// Scale to fit within container while preserving aspect ratio\n\t\t\tconst scaleX = containerInnerWidth / naturalWidth;\n\t\t\tconst scaleY = containerInnerHeight / naturalHeight;\n\t\t\tconst scale = Math.min(scaleX, scaleY);\n\n\t\t\timageWidth = naturalWidth * scale;\n\t\t\timageHeight = naturalHeight * scale;\n\n\t\t\t// Apply object-position to center the image within the container\n\t\t\timageX =\n\t\t\t\tleft +\n\t\t\t\toffsetLeft +\n\t\t\t\tobjPosX -\n\t\t\t\t(imageWidth * objPosX) / containerInnerWidth;\n\t\t\timageY =\n\t\t\t\ttop +\n\t\t\t\toffsetTop +\n\t\t\t\tobjPosY -\n\t\t\t\t(imageHeight * objPosY) / containerInnerHeight;\n\n\t\t\tpreserveAspectRatio = 'none';\n\t\t} else if (style.objectFit === 'cover') {\n\t\t\t// Scale to cover the container while preserving aspect ratio\n\t\t\tconst scaleX = containerInnerWidth / naturalWidth;\n\t\t\tconst scaleY = containerInnerHeight / naturalHeight;\n\t\t\tconst scale = Math.max(scaleX, scaleY);\n\n\t\t\timageWidth = naturalWidth * scale;\n\t\t\timageHeight = naturalHeight * scale;\n\n\t\t\t// Apply object-position\n\t\t\timageX =\n\t\t\t\tleft +\n\t\t\t\toffsetLeft +\n\t\t\t\tobjPosX -\n\t\t\t\t(imageWidth * objPosX) / containerInnerWidth;\n\t\t\timageY =\n\t\t\t\ttop +\n\t\t\t\toffsetTop +\n\t\t\t\tobjPosY -\n\t\t\t\t(imageHeight * objPosY) / containerInnerHeight;\n\n\t\t\tpreserveAspectRatio = 'none';\n\t\t} else if (style.objectFit === 'fill') {\n\t\t\t// Stretch to fill (ignore aspect ratio)\n\t\t\tpreserveAspectRatio = 'none';\n\t\t} else if (style.objectFit === 'scale-down') {\n\t\t\tif (naturalWidth && naturalHeight) {\n\t\t\t\t// Calculate if we need to scale down\n\t\t\t\tconst scaleX = containerInnerWidth / naturalWidth;\n\t\t\t\tconst scaleY = containerInnerHeight / naturalHeight;\n\t\t\t\tconst minScale = Math.min(scaleX, scaleY);\n\n\t\t\t\tif (minScale >= 1) {\n\t\t\t\t\t// Image is smaller than or equal to container\n\t\t\t\t\t// Use natural size (don't scale up)\n\t\t\t\t\timageWidth = naturalWidth;\n\t\t\t\t\timageHeight = naturalHeight;\n\t\t\t\t\tpreserveAspectRatio = 'none';\n\n\t\t\t\t\t// Apply object-position to position the un-scaled image\n\t\t\t\t\timageX =\n\t\t\t\t\t\tleft +\n\t\t\t\t\t\toffsetLeft +\n\t\t\t\t\t\tobjPosX -\n\t\t\t\t\t\t(imageWidth * objPosX) / containerInnerWidth;\n\t\t\t\t\timageY =\n\t\t\t\t\t\ttop +\n\t\t\t\t\t\toffsetTop +\n\t\t\t\t\t\tobjPosY -\n\t\t\t\t\t\t(imageHeight * objPosY) / containerInnerHeight;\n\t\t\t\t} else {\n\t\t\t\t\t// Image is larger than container, scale down like 'contain'\n\t\t\t\t\tconst scale = minScale;\n\t\t\t\t\timageWidth = naturalWidth * scale;\n\t\t\t\t\timageHeight = naturalHeight * scale;\n\n\t\t\t\t\t// Apply object-position\n\t\t\t\t\timageX =\n\t\t\t\t\t\tleft +\n\t\t\t\t\t\toffsetLeft +\n\t\t\t\t\t\tobjPosX -\n\t\t\t\t\t\t(imageWidth * objPosX) / containerInnerWidth;\n\t\t\t\t\timageY =\n\t\t\t\t\t\ttop +\n\t\t\t\t\t\toffsetTop +\n\t\t\t\t\t\tobjPosY -\n\t\t\t\t\t\t(imageHeight * objPosY) / containerInnerHeight;\n\n\t\t\t\t\tpreserveAspectRatio = 'none';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Fall back to 'contain' behavior if natural dimensions are unavailable\n\t\t\t\tconst scaleX = containerInnerWidth / naturalWidth;\n\t\t\t\tconst scaleY = containerInnerHeight / naturalHeight;\n\t\t\t\tconst scale = Math.min(scaleX, scaleY);\n\n\t\t\t\timageWidth = naturalWidth * scale;\n\t\t\t\timageHeight = naturalHeight * scale;\n\n\t\t\t\timageX =\n\t\t\t\t\tleft +\n\t\t\t\t\toffsetLeft +\n\t\t\t\t\tobjPosX -\n\t\t\t\t\t(imageWidth * objPosX) / containerInnerWidth;\n\t\t\t\timageY =\n\t\t\t\t\ttop +\n\t\t\t\t\toffsetTop +\n\t\t\t\t\tobjPosY -\n\t\t\t\t\t(imageHeight * objPosY) / containerInnerHeight;\n\n\t\t\t\tpreserveAspectRatio = 'none';\n\t\t\t}\n\t\t} else {\n\t\t\t// Default/none: fill (stretch)\n\t\t\tpreserveAspectRatio = 'none';\n\t\t}\n\n\t\tif (style.transform) {\n\t\t\timageBorderRadius = getBorderRadiusClipPath(\n\t\t\t\t{\n\t\t\t\t\tid,\n\t\t\t\t\tborderRadiusPath: path,\n\t\t\t\t\tborderType: type,\n\t\t\t\t\tleft,\n\t\t\t\t\ttop,\n\t\t\t\t\twidth,\n\t\t\t\t\theight\n\t\t\t\t},\n\t\t\t\tstyle\n\t\t\t);\n\t\t}\n\n\t\tshape += buildXMLString('image', {\n\t\t\tx: imageX,\n\t\t\ty: imageY,\n\t\t\twidth: imageWidth,\n\t\t\theight: imageHeight,\n\t\t\thref: src,\n\t\t\tpreserveAspectRatio,\n\t\t\ttransform: matrix ? matrix : undefined,\n\t\t\tstyle: inlineStyle,\n\t\t\t'clip-path': style.transform\n\t\t\t\t? imageBorderRadius\n\t\t\t\t\t? `url(#${imageBorderRadius[1]})`\n\t\t\t\t\t: undefined\n\t\t\t\t: `url(#satori_cp-${id})`,\n\t\t\tmask: style.transform\n\t\t\t\t? undefined\n\t\t\t\t: miId\n\t\t\t\t? `url(#${miId})`\n\t\t\t\t: `url(#satori_om-${id})`\n\t\t});\n\t}\n\n\tif (borderClip) {\n\t\tdefs += borderClip[0];\n\t\tconst rectClipId = borderClip[1];\n\n\t\tshape += border(\n\t\t\t{\n\t\t\t\tleft,\n\t\t\t\ttop,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\tprops: {\n\t\t\t\t\ttransform: matrix ? matrix : undefined,\n\t\t\t\t\t// When using `background-clip: text`, we need to draw the extra border because\n\t\t\t\t\t// it shouldn't be clipped by the clip path, so we are not using currentClipPath here.\n\t\t\t\t\t'clip-path': `url(#${rectClipId})`\n\t\t\t\t}\n\t\t\t},\n\t\t\tstyle\n\t\t);\n\t}\n\n\t// box-shadow.\n\tconst shadow = boxShadow(\n\t\t{\n\t\t\twidth,\n\t\t\theight,\n\t\t\tid,\n\t\t\topacity,\n\t\t\tshape: buildXMLString(type, {\n\t\t\t\tx: left,\n\t\t\t\ty: top,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\tfill: '#fff',\n\t\t\t\tstroke: '#fff',\n\t\t\t\t'stroke-width': 0,\n\t\t\t\td: path ? path : undefined,\n\t\t\t\ttransform: matrix ? matrix : undefined,\n\t\t\t\t'clip-path': currentClipPath,\n\t\t\t\tmask: maskId\n\t\t\t})\n\t\t},\n\t\tstyle\n\t);\n\n\treturn (\n\t\t(defs ? buildXMLString('defs', {}, defs) : '') +\n\t\t(shadow ? shadow[0] : '') +\n\t\t(imageBorderRadius ? imageBorderRadius[0] : '') +\n\t\tclip +\n\t\t(opacity !== 1 ? `<g opacity=\"${opacity}\">` : '') +\n\t\t(style.transform && (currentClipPath || maskId)\n\t\t\t? `<g${currentClipPath ? ` clip-path=\"${currentClipPath}\"` : ''}${\n\t\t\t\t\tmaskId ? ` mask=\"${maskId}\"` : ''\n\t\t\t }>`\n\t\t\t: '') +\n\t\t(backgroundShapes || shape) +\n\t\t(style.transform && (currentClipPath || maskId) ? '</g>' : '') +\n\t\t(opacity !== 1 ? `</g>` : '') +\n\t\t(shadow ? shadow[1] : '') +\n\t\textra\n\t);\n}\n","import { buildXMLString } from '../utils.js';\nimport radius from './border-radius.js';\n\ntype BuildBackdropFilterOptions = {\n\tbgGroupId: string;\n\tfilterValue: string;\n\theight: number;\n\tid: string;\n\tleft: number;\n\tmaskId?: string;\n\tstyle: Record<string, any>;\n\ttop: number;\n\twidth: number;\n};\n\nconst parseFilterValue = (value: string): string => {\n\tlet primitives = '';\n\n\t// blur(Npx)\n\tconst blurMatch = value.match(/blur\\(([\\d.]+)(?:px)?\\)/);\n\tif (blurMatch) {\n\t\tprimitives += buildXMLString('feGaussianBlur', {\n\t\t\tstdDeviation: parseFloat(blurMatch[1])\n\t\t});\n\t}\n\n\t// saturate(N) or saturate(N%)\n\tconst saturateMatch = value.match(/saturate\\(([\\d.]+)(%?)\\)/);\n\tif (saturateMatch) {\n\t\tconst val =\n\t\t\tsaturateMatch[2] === '%'\n\t\t\t\t? parseFloat(saturateMatch[1]) / 100\n\t\t\t\t: parseFloat(saturateMatch[1]);\n\t\tprimitives += buildXMLString('feColorMatrix', {\n\t\t\ttype: 'saturate',\n\t\t\tvalues: val\n\t\t});\n\t}\n\n\t// brightness(N)\n\tconst brightnessMatch = value.match(/brightness\\(([\\d.]+)\\)/);\n\tif (brightnessMatch) {\n\t\tconst val = parseFloat(brightnessMatch[1]);\n\t\tprimitives += buildXMLString(\n\t\t\t'feComponentTransfer',\n\t\t\t{},\n\t\t\tbuildXMLString('feFuncR', { slope: val, type: 'linear' }) +\n\t\t\t\tbuildXMLString('feFuncG', { slope: val, type: 'linear' }) +\n\t\t\t\tbuildXMLString('feFuncB', { slope: val, type: 'linear' })\n\t\t);\n\t}\n\n\t// contrast(N)\n\tconst contrastMatch = value.match(/contrast\\(([\\d.]+)\\)/);\n\tif (contrastMatch) {\n\t\tconst val = parseFloat(contrastMatch[1]);\n\t\tconst intercept = -(0.5 * val) + 0.5;\n\t\tprimitives += buildXMLString(\n\t\t\t'feComponentTransfer',\n\t\t\t{},\n\t\t\tbuildXMLString('feFuncR', {\n\t\t\t\tintercept,\n\t\t\t\tslope: val,\n\t\t\t\ttype: 'linear'\n\t\t\t}) +\n\t\t\t\tbuildXMLString('feFuncG', {\n\t\t\t\t\tintercept,\n\t\t\t\t\tslope: val,\n\t\t\t\t\ttype: 'linear'\n\t\t\t\t}) +\n\t\t\t\tbuildXMLString('feFuncB', {\n\t\t\t\t\tintercept,\n\t\t\t\t\tslope: val,\n\t\t\t\t\ttype: 'linear'\n\t\t\t\t})\n\t\t);\n\t}\n\n\t// grayscale(N) or grayscale(N%)\n\tconst grayscaleMatch = value.match(/grayscale\\(([\\d.]+)(%?)\\)/);\n\tif (grayscaleMatch) {\n\t\tconst val =\n\t\t\tgrayscaleMatch[2] === '%'\n\t\t\t\t? parseFloat(grayscaleMatch[1]) / 100\n\t\t\t\t: parseFloat(grayscaleMatch[1]);\n\t\tprimitives += buildXMLString('feColorMatrix', {\n\t\t\ttype: 'saturate',\n\t\t\tvalues: 1 - Math.min(val, 1)\n\t\t});\n\t}\n\n\treturn primitives;\n};\n\nexport const buildBackdropFilter = (\n\toptions: BuildBackdropFilterOptions\n): string => {\n\tconst {\n\t\tbgGroupId,\n\t\tfilterValue,\n\t\theight,\n\t\tid,\n\t\tleft,\n\t\tmaskId,\n\t\tstyle,\n\t\ttop,\n\t\twidth\n\t} = options;\n\n\tconst primitives = parseFilterValue(filterValue);\n\tif (!primitives) {\n\t\treturn '';\n\t}\n\n\tconst filterId = `satori_bf-${id}`;\n\tconst clipId = `satori_bfc-${id}`;\n\n\t// Filter definition with generous region for blur overflow.\n\tconst filterDef = buildXMLString(\n\t\t'filter',\n\t\t{\n\t\t\theight: '200%',\n\t\t\tid: filterId,\n\t\t\twidth: '200%',\n\t\t\tx: '-50%',\n\t\t\ty: '-50%'\n\t\t},\n\t\tprimitives\n\t);\n\n\t// Clip path — use border-radius path when available, else a rect.\n\tconst borderRadiusPath = radius({ height, left, top, width }, style);\n\tconst clipContent = borderRadiusPath\n\t\t? buildXMLString('path', { d: borderRadiusPath })\n\t\t: buildXMLString('rect', { height, width, x: left, y: top });\n\tconst clipDef = buildXMLString('clipPath', { id: clipId }, clipContent);\n\n\tconst defs = buildXMLString('defs', {}, filterDef + clipDef);\n\n\t// <use> referencing the background group with filter + clip + optional mask.\n\tconst useAttrs: Record<string, string | number> = {\n\t\t'clip-path': `url(#${clipId})`,\n\t\tfilter: `url(#${filterId})`,\n\t\thref: `#${bgGroupId}`\n\t};\n\n\tif (maskId) {\n\t\tuseAttrs.mask = `url(#${maskId})`;\n\t}\n\n\tconst useElement = buildXMLString('use', useAttrs);\n\n\treturn defs + useElement;\n};\n","const r = String.raw,\n e = r`\\p{Emoji}(?:\\p{EMod}|[\\u{E0020}-\\u{E007E}]+\\u{E007F}|\\uFE0F?\\u20E3?)`;\nexport default () => new RegExp(r`\\p{RI}{2}|(?![#*\\d](?!\\uFE0F?\\u20E3))${e}(?:\\u200D${e})*`, 'gu');\n","// This function guesses the human language (writing system) of the given\n// JavaScript string, using the Unicode Alias in extended RegExp.\n//\n// You can learn more about this in:\n// - https://en.wikipedia.org/wiki/Script_(Unicode)\n// - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Unicode_Property_Escapes\n// - https://unicode.org/reports/tr18/#General_Category_Property\n// - https://tc39.es/ecma262/multipage/text-processing.html#table-unicode-script-values\n\nimport createEmojiRegex from 'emoji-regex-xs';\n\nconst emojiRegex = new RegExp(createEmojiRegex(), 'u');\n\n// Supported languages. The order matters.\n// Usually, this is only for \"special cases\" like CJKV languages as latin\n// characters are usually included in the base font, and can be safely fallback\n// to the Noto Sans font. A list of special cases we want to support can be\n// found here (sort by popularity):\n// - https://fonts.google.com/noto/fonts?sort=popularity&noto.query=sans\n//\n// We can't tell if a hanzi(kanji) is Chinese or Japanese by regular expressions.\n// - https://unicode.org/faq/han_cjk.html\n\nconst specialCode = {\n\temoji: emojiRegex,\n\tsymbol: /\\p{Symbol}/u,\n\tmath: /\\p{Math}/u\n} as const;\n\nconst code = {\n\t'ja-JP': /\\p{scx=Hira}|\\p{scx=Kana}|\\p{scx=Han}|[\\u3000]|[\\uFF00-\\uFFEF]/u,\n\t'ko-KR': /\\p{scx=Hangul}/u,\n\t'zh-CN': /\\p{scx=Han}/u,\n\t'zh-TW': /\\p{scx=Han}/u,\n\t'zh-HK': /\\p{scx=Han}/u,\n\t'th-TH': /\\p{scx=Thai}/u,\n\t'bn-IN': /\\p{scx=Bengali}/u,\n\t'ar-AR': /\\p{scx=Arabic}/u,\n\t'ta-IN': /\\p{scx=Tamil}/u,\n\t'ml-IN': /\\p{scx=Malayalam}/u,\n\t'he-IL': /\\p{scx=Hebrew}/u,\n\t'te-IN': /\\p{scx=Telugu}/u,\n\tdevanagari: /\\p{scx=Devanagari}/u,\n\tkannada: /\\p{scx=Kannada}/u\n} as const;\n\ntype SpecialCodeKey = keyof typeof specialCode;\ntype CodeKey = keyof typeof specialCode | keyof typeof code;\nexport type Locale = keyof typeof code;\nexport type LangCode = CodeKey | 'unknown';\n\nexport const locales = Object.keys({ ...code, ...specialCode }) as Locale[];\nexport function isValidLocale(x: any): x is Locale {\n\treturn locales.includes(x);\n}\n\nexport function detectLanguageCode(\n\tsegment: string,\n\tlocale?: Locale\n): Array<Locale> | ['unknown'] | [SpecialCodeKey] {\n\tfor (const c of Object.keys(specialCode) as SpecialCodeKey[]) {\n\t\tif (specialCode[c].test(segment)) {\n\t\t\treturn [c];\n\t\t}\n\t}\n\n\tconst languages = Object.keys(code).filter(lang =>\n\t\tcode[lang].test(segment)\n\t) as Locale[];\n\n\tif (languages.length === 0) {\n\t\treturn ['unknown'];\n\t}\n\n\tif (locale) {\n\t\tconst index = languages.findIndex(lang => lang === locale);\n\t\tif (index !== -1) {\n\t\t\tlanguages.splice(index, 1);\n\t\t\tlanguages.unshift(locale);\n\t\t}\n\t}\n\n\treturn languages;\n}\n\nexport function normalizeLocale(locale?: string): Locale | undefined {\n\tif (locale) {\n\t\treturn locales.find(l =>\n\t\t\tl.toLowerCase().startsWith(locale.toLowerCase())\n\t\t);\n\t}\n}\n","/**\n * This module is used to calculate the layout of the current sub-tree.\n */\n\nimport type { ReactNode } from 'react';\nimport {\n\tisReactElement,\n\tisClass,\n\tbuildXMLString,\n\tnormalizeChildren,\n\thasDangerouslySetInnerHTMLProp,\n\tisReactComponent,\n\tisForwardRefComponent\n} from './utils.js';\nimport { getYoga, YogaNode } from './yoga.js';\nimport { SVGNodeToImage } from './handler/preprocess.js';\nimport computeStyle from './handler/compute.js';\nimport FontLoader from './font.js';\nimport buildTextNodes from './text/index.js';\nimport rect from './builder/rect.js';\nimport { buildBackdropFilter } from './builder/backdrop-filter.js';\nimport { Locale, normalizeLocale } from './language.js';\nimport { SerializedStyle } from './handler/expand.js';\n\nexport type BackdropFilterInfo = {\n\tfilter: string;\n\tinheritedStyle: SerializedStyle;\n\tnode: YogaNode;\n\tstyle: SerializedStyle;\n};\n\nexport interface LayoutContext {\n\tid: string;\n\tparentStyle: SerializedStyle;\n\tinheritedStyle: SerializedStyle;\n\tisInheritingTransform?: boolean;\n\tparent: YogaNode;\n\tfont: FontLoader;\n\tembedFont: boolean;\n\tdebug?: boolean;\n\tgraphemeImages?: Record<string, string>;\n\tcanLoadAdditionalAssets: boolean;\n\tlocale?: Locale;\n\tonNodeDetected?: (node: SatoriNode) => void;\n\t_registerBackdropFilter?: (info: BackdropFilterInfo) => void;\n}\n\nexport interface SatoriNode {\n\t// Layout information.\n\tleft: number;\n\ttop: number;\n\twidth: number;\n\theight: number;\n\ttype: string;\n\tkey?: string | number;\n\tprops: Record<string, any>;\n\ttextContent?: string;\n}\n\nexport default async function* layout(\n\telement: ReactNode,\n\tcontext: LayoutContext\n): AsyncGenerator<\n\t{ word: string; locale?: string }[],\n\tstring,\n\t[number, number]\n> {\n\tconst Yoga = await getYoga();\n\tconst {\n\t\tid,\n\t\tinheritedStyle,\n\t\tparent,\n\t\tfont,\n\t\tdebug,\n\t\tlocale,\n\t\tembedFont = true,\n\t\tgraphemeImages,\n\t\tcanLoadAdditionalAssets\n\t} = context;\n\n\t// 1. Pre-process the node.\n\tif (element === null || typeof element === 'undefined') {\n\t\tyield;\n\t\tyield;\n\t\treturn '';\n\t}\n\n\t// Not a regular element.\n\tif (!isReactElement(element) || isReactComponent(element.type)) {\n\t\tlet iter: ReturnType<typeof layout>;\n\n\t\tif (!isReactElement(element)) {\n\t\t\t// Process as text node.\n\t\t\titer = buildTextNodes(String(element), context);\n\t\t\tyield (await iter.next()).value as {\n\t\t\t\tword: string;\n\t\t\t\tlocale?: Locale;\n\t\t\t}[];\n\t\t} else {\n\t\t\tif (isClass(element.type as Function)) {\n\t\t\t\tthrow new Error('Class component is not supported.');\n\t\t\t}\n\n\t\t\tlet render: Function;\n\n\t\t\t// This is a hack to support React.forwardRef wrapped components.\n\t\t\t// https://github.com/vercel/satori/issues/600\n\t\t\tif (isForwardRefComponent(element.type)) {\n\t\t\t\trender = (element.type as any).render;\n\t\t\t} else {\n\t\t\t\trender = element.type as Function;\n\t\t\t}\n\n\t\t\t// If it's a custom component, Satori strictly requires it to be pure,\n\t\t\t// stateless, and not relying on any React APIs such as hooks or suspense.\n\t\t\t// So we can safely evaluate it to render. Otherwise, an error will be\n\t\t\t// thrown by React.\n\t\t\titer = layout(await render(element.props), context);\n\t\t\tyield (await iter.next()).value as {\n\t\t\t\tword: string;\n\t\t\t\tlocale?: string;\n\t\t\t}[];\n\t\t}\n\n\t\tawait iter.next();\n\t\tconst offset = yield;\n\t\treturn (await iter.next(offset)).value as string;\n\t}\n\n\t// Process as element.\n\tconst { type: $type, props } = element;\n\t// type must be a string here.\n\tconst type = $type as string;\n\n\tif (props && hasDangerouslySetInnerHTMLProp(props)) {\n\t\tthrow new Error(\n\t\t\t'dangerouslySetInnerHTML property is not supported. See documentation for more information https://github.com/vercel/satori#jsx.'\n\t\t);\n\t}\n\tlet { style, children, lang: _newLocale = locale } = props || {};\n\tconst newLocale = normalizeLocale(_newLocale);\n\n\tconst node = Yoga.Node.create();\n\tparent.insertChild(node, parent.getChildCount());\n\n\tconst [computedStyle, newInheritableStyle] = await computeStyle(\n\t\tnode,\n\t\ttype,\n\t\tinheritedStyle,\n\t\tstyle,\n\t\tprops\n\t);\n\t// Post-process styles to attach inheritable properties for Satori.\n\n\t// If the element is inheriting the parent `transform`, or applying its own.\n\t// This affects the coordinate system.\n\tconst isInheritingTransform =\n\t\tcomputedStyle.transform === inheritedStyle.transform;\n\tif (!isInheritingTransform) {\n\t\t(computedStyle.transform as any).__parent = inheritedStyle.transform;\n\t}\n\n\t// If the element has `overflow` set to `hidden` or clip-path is set, we need to create a clip\n\t// path and use it in all its children.\n\tif (\n\t\tcomputedStyle.overflow === 'hidden' ||\n\t\t(computedStyle.clipPath && computedStyle.clipPath !== 'none')\n\t) {\n\t\tnewInheritableStyle._inheritedClipPathId = `satori_cp-${id}`;\n\t\tnewInheritableStyle._inheritedMaskId = `satori_om-${id}`;\n\t}\n\n\tif (computedStyle.maskImage) {\n\t\tnewInheritableStyle._inheritedMaskId = `satori_mi-${id}`;\n\t}\n\n\t// Register backdrop-filter with parent so it can inject the effect.\n\tif (computedStyle.backdropFilter && context._registerBackdropFilter) {\n\t\tcontext._registerBackdropFilter({\n\t\t\tfilter: computedStyle.backdropFilter as string,\n\t\t\tinheritedStyle: newInheritableStyle,\n\t\t\tnode,\n\t\t\tstyle: computedStyle\n\t\t});\n\t}\n\n\t// If the element has `background-clip: text` set, we need to create a clip\n\t// path and use it in all its children.\n\tif (computedStyle.backgroundClip === 'text') {\n\t\tconst mutateRefValue = { value: '' } as any;\n\t\tnewInheritableStyle._inheritedBackgroundClipTextPath = mutateRefValue;\n\t\tcomputedStyle._inheritedBackgroundClipTextPath = mutateRefValue;\n\n\t\tif (computedStyle.backgroundImage) {\n\t\t\tnewInheritableStyle._inheritedBackgroundClipTextHasBackground =\n\t\t\t\t'true';\n\t\t\tcomputedStyle._inheritedBackgroundClipTextHasBackground = 'true';\n\t\t}\n\t}\n\n\t// 2. Do layout recursively for its children.\n\tconst normalizedChildren = normalizeChildren(children);\n\tconst iterators: ReturnType<typeof layout>[] = [];\n\tconst backdropInfoByIndex: Record<number, BackdropFilterInfo> = {};\n\n\tlet i = 0;\n\tconst segmentsMissingFont: { word: string; locale?: string }[] = [];\n\tfor (const child of normalizedChildren) {\n\t\tconst currentIndex = i;\n\t\tconst iter = layout(child, {\n\t\t\tid: id + '-' + i++,\n\t\t\tparentStyle: computedStyle,\n\t\t\tinheritedStyle: newInheritableStyle,\n\t\t\tisInheritingTransform: true,\n\t\t\tparent: node,\n\t\t\tfont,\n\t\t\tembedFont,\n\t\t\tdebug,\n\t\t\tgraphemeImages,\n\t\t\tcanLoadAdditionalAssets,\n\t\t\tlocale: newLocale,\n\t\t\tonNodeDetected: context.onNodeDetected,\n\t\t\t_registerBackdropFilter: (info: BackdropFilterInfo) => {\n\t\t\t\tbackdropInfoByIndex[currentIndex] = info;\n\t\t\t}\n\t\t});\n\t\tif (canLoadAdditionalAssets) {\n\t\t\tsegmentsMissingFont.push(\n\t\t\t\t...(((await iter.next()).value as any) || [])\n\t\t\t);\n\t\t} else {\n\t\t\tawait iter.next();\n\t\t}\n\t\titerators.push(iter);\n\t}\n\tyield segmentsMissingFont;\n\tfor (const iter of iterators) await iter.next();\n\n\t// 3. Post-process the node.\n\tconst [x, y] = yield;\n\tlet { left, top, width, height } = node.getComputedLayout();\n\t// Attach offset to the current node.\n\tleft += x;\n\ttop += y;\n\n\tlet childrenRenderResult = '';\n\tlet baseRenderResult = '';\n\tlet depsRenderResult = '';\n\n\t// Emit event for the current node. We don't pass the children prop to the\n\t// event handler because everything is already flattened, unless it's a text\n\t// node.\n\tconst { children: childrenNode, ...restProps } = props;\n\tcontext.onNodeDetected?.({\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight,\n\t\ttype,\n\t\tprops: restProps,\n\t\tkey: element.key,\n\t\ttextContent: isReactElement(childrenNode) ? undefined : childrenNode\n\t});\n\n\t// Generate the rendered markup for the current node.\n\tif (type === 'img') {\n\t\tconst src = computedStyle.__src as string;\n\t\tbaseRenderResult = await rect(\n\t\t\t{\n\t\t\t\tid,\n\t\t\t\tleft,\n\t\t\t\ttop,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\tsrc,\n\t\t\t\tisInheritingTransform,\n\t\t\t\tdebug\n\t\t\t},\n\t\t\tcomputedStyle,\n\t\t\tnewInheritableStyle\n\t\t);\n\t} else if (type === 'svg') {\n\t\t// When entering a <svg> node, we need to convert it to a <img> with the\n\t\t// SVG data URL embedded.\n\t\tconst currentColor = computedStyle.color;\n\t\tconst src = await SVGNodeToImage(element, currentColor);\n\t\tbaseRenderResult = await rect(\n\t\t\t{\n\t\t\t\tid,\n\t\t\t\tleft,\n\t\t\t\ttop,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\tsrc,\n\t\t\t\tisInheritingTransform,\n\t\t\t\tdebug\n\t\t\t},\n\t\t\tcomputedStyle,\n\t\t\tnewInheritableStyle\n\t\t);\n\t} else {\n\t\tconst display = style?.display;\n\t\tif (\n\t\t\ttype === 'div' &&\n\t\t\tchildren &&\n\t\t\ttypeof children !== 'string' &&\n\t\t\tdisplay !== 'flex' &&\n\t\t\tdisplay !== 'none' &&\n\t\t\tdisplay !== 'contents'\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t`Expected <div> to have explicit \"display: flex\", \"display: contents\", or \"display: none\" if it has more than one child node.`\n\t\t\t);\n\t\t}\n\t\tbaseRenderResult = await rect(\n\t\t\t{ id, left, top, width, height, isInheritingTransform, debug },\n\t\t\tcomputedStyle,\n\t\t\tnewInheritableStyle\n\t\t);\n\t}\n\n\t// Generate the rendered markup for the children.\n\tfor (let j = 0; j < iterators.length; j++) {\n\t\t// If this child has backdrop-filter, wrap all prior content in a <g> and\n\t\t// insert a <use> with the SVG filter + clip before the child.\n\t\tif (backdropInfoByIndex[j]) {\n\t\t\tconst info = backdropInfoByIndex[j];\n\t\t\tconst childLayout = info.node.getComputedLayout();\n\t\t\tconst childLeft = left + childLayout.left;\n\t\t\tconst childTop = top + childLayout.top;\n\t\t\tconst childWidth = childLayout.width;\n\t\t\tconst childHeight = childLayout.height;\n\n\t\t\tconst bgGroupId = `satori_bfbg-${id}-${j}`;\n\t\t\tconst currentContent = baseRenderResult + childrenRenderResult;\n\t\t\tbaseRenderResult = `<g id=\"${bgGroupId}\">${currentContent}</g>`;\n\t\t\tchildrenRenderResult = '';\n\n\t\t\t// Forward-reference the child's mask (generated by the child later).\n\t\t\tconst childId = id + '-' + j;\n\t\t\tconst maskId = info.style.maskImage\n\t\t\t\t? `satori_mi-${childId}`\n\t\t\t\t: undefined;\n\n\t\t\tchildrenRenderResult += buildBackdropFilter({\n\t\t\t\tbgGroupId,\n\t\t\t\tfilterValue: info.filter,\n\t\t\t\theight: childHeight,\n\t\t\t\tid: childId,\n\t\t\t\tleft: childLeft,\n\t\t\t\tmaskId,\n\t\t\t\tstyle: info.style as Record<string, any>,\n\t\t\t\ttop: childTop,\n\t\t\t\twidth: childWidth\n\t\t\t});\n\t\t}\n\n\t\tchildrenRenderResult += (await iterators[j].next([left, top])).value;\n\t}\n\n\t// An extra pass to generate the special background-clip shape collected from\n\t// children.\n\tif (computedStyle._inheritedBackgroundClipTextPath) {\n\t\tdepsRenderResult += buildXMLString(\n\t\t\t'clipPath',\n\t\t\t{\n\t\t\t\tid: `satori_bct-${id}`,\n\t\t\t\t'clip-path': computedStyle._inheritedClipPathId\n\t\t\t\t\t? `url(#${computedStyle._inheritedClipPathId})`\n\t\t\t\t\t: undefined\n\t\t\t},\n\t\t\t(computedStyle._inheritedBackgroundClipTextPath as any).value\n\t\t);\n\t}\n\n\treturn depsRenderResult + baseRenderResult + childrenRenderResult;\n}\n","/**\n * This class handles everything related to fonts.\n */\nimport opentype from '@shuding/opentype.js';\nimport { Locale, locales, isValidLocale } from './language.js';\n\nexport type Weight = 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\nexport type WeightName = 'normal' | 'bold';\nexport type FontWeight = Weight | WeightName;\nexport type FontStyle = 'normal' | 'italic';\nconst SUFFIX_WHEN_LANG_NOT_SET = 'unknown';\n\nexport interface FontOptions {\n\tdata: Buffer | ArrayBuffer;\n\tname: string;\n\tweight?: Weight;\n\tstyle?: FontStyle;\n\tlang?: string;\n}\n\nexport type GlyphBox = {\n\tx1: number;\n\tx2: number;\n\ty1: number;\n\ty2: number;\n};\ntype SkipInkBand = {\n\tunderlineY: number;\n\tstrokeWidth: number;\n};\n\nexport type FontEngine = {\n\thas: (s: string) => boolean;\n\tbaseline: (s?: string, resolvedFont?: any) => number;\n\theight: (s?: string, resolvedFont?: any) => number;\n\tmeasure: (\n\t\ts: string,\n\t\tstyle: {\n\t\t\tfontSize: number;\n\t\t\tletterSpacing: number;\n\t\t}\n\t) => number;\n\tgetSVG: (\n\t\ts: string,\n\t\tstyle: {\n\t\t\tfontSize: number;\n\t\t\ttop: number;\n\t\t\tleft: number;\n\t\t\tletterSpacing: number;\n\t\t},\n\t\tband?: SkipInkBand\n\t) => { path: string; boxes: GlyphBox[] };\n};\n\ntype BandPoint = [number, number];\n\ntype LineSegment = {\n\tfrom: BandPoint;\n\tto: BandPoint;\n};\n\nfunction flattenPath(commands: opentype.Path['commands']): LineSegment[] {\n\tconst segments: LineSegment[] = [];\n\tlet start: BandPoint = [0, 0];\n\tlet current: BandPoint = [0, 0];\n\n\tconst addCurve = (points: BandPoint[], steps: number) => {\n\t\tlet prev = points[0];\n\t\tfor (let i = 1; i <= steps; i++) {\n\t\t\tconst t = i / steps;\n\t\t\tconst next = evaluateBezier(points, t);\n\t\t\tsegments.push({ from: prev, to: next });\n\t\t\tprev = next;\n\t\t}\n\t\tcurrent = points[points.length - 1];\n\t};\n\n\tfor (const cmd of commands) {\n\t\tif (cmd.type === 'M') {\n\t\t\tstart = current = [cmd.x, cmd.y];\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (cmd.type === 'L') {\n\t\t\tconst next: BandPoint = [cmd.x, cmd.y];\n\t\t\tsegments.push({ from: current, to: next });\n\t\t\tcurrent = next;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (cmd.type === 'Q') {\n\t\t\taddCurve([current, [cmd.x1, cmd.y1], [cmd.x, cmd.y]], 12);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (cmd.type === 'C') {\n\t\t\taddCurve(\n\t\t\t\t[current, [cmd.x1, cmd.y1], [cmd.x2, cmd.y2], [cmd.x, cmd.y]],\n\t\t\t\t16\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (cmd.type === 'Z') {\n\t\t\tsegments.push({ from: current, to: start });\n\t\t\tcurrent = start;\n\t\t}\n\t}\n\n\treturn segments;\n}\n\nfunction evaluateBezier(points: BandPoint[], t: number): BandPoint {\n\tlet working = points;\n\n\twhile (working.length > 1) {\n\t\tconst next: BandPoint[] = [];\n\t\tfor (let i = 0; i < working.length - 1; i++) {\n\t\t\tnext.push([\n\t\t\t\tworking[i][0] + (working[i + 1][0] - working[i][0]) * t,\n\t\t\t\tworking[i][1] + (working[i + 1][1] - working[i][1]) * t\n\t\t\t]);\n\t\t}\n\t\tworking = next;\n\t}\n\n\treturn working[0];\n}\n\nfunction computeBandBox(\n\tcommands: opentype.Path['commands'],\n\tband?: SkipInkBand\n): GlyphBox[] {\n\tif (!band) return [];\n\n\tconst strokeWidth = band.strokeWidth;\n\tconst bandMin = band.underlineY - strokeWidth * 0.25;\n\tconst bandMax = band.underlineY + strokeWidth * 2.5;\n\n\tconst segments = flattenPath(commands);\n\tif (!segments.length) return [];\n\n\tconst bandHeight = bandMax - bandMin;\n\tconst ySamples = Math.max(12, Math.ceil(bandHeight / 0.25));\n\tconst yStep = bandHeight / ySamples;\n\tconst yStart = bandMin + yStep / 2;\n\n\tconst columnHits = new Set<number>();\n\n\tfor (let i = 0; i < ySamples; i++) {\n\t\tconst y = yStart + yStep * i;\n\t\tconst intersections: number[] = [];\n\n\t\tfor (const seg of segments) {\n\t\t\tconst [x1, y1] = seg.from;\n\t\t\tconst [x2, y2] = seg.to;\n\n\t\t\tif (y1 === y2) continue;\n\t\t\tconst yMin = Math.min(y1, y2);\n\t\t\tconst yMax = Math.max(y1, y2);\n\t\t\tif (y < yMin || y >= yMax) continue;\n\n\t\t\tconst t = (y - y1) / (y2 - y1);\n\t\t\tconst x = x1 + (x2 - x1) * t;\n\t\t\tintersections.push(x);\n\t\t}\n\n\t\tif (!intersections.length) continue;\n\t\tintersections.sort((a, b) => a - b);\n\n\t\tfor (let j = 0; j < intersections.length - 1; j += 2) {\n\t\t\tconst from = Math.min(intersections[j], intersections[j + 1]);\n\t\t\tconst to = Math.max(intersections[j], intersections[j + 1]);\n\t\t\tconst start = Math.floor(from);\n\t\t\tconst end = Math.ceil(to);\n\t\t\tfor (let col = start; col < end; col++) {\n\t\t\t\tcolumnHits.add(col);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!columnHits.size) return [];\n\n\tconst columns = Array.from(columnHits.values()).sort((a, b) => a - b);\n\tconst inkRanges: [number, number][] = [];\n\n\tlet rangeStart = columns[0];\n\tlet prev = columns[0];\n\tfor (let i = 1; i < columns.length; i++) {\n\t\tconst col = columns[i];\n\t\tif (col > prev + 1) {\n\t\t\tinkRanges.push([rangeStart, prev + 1]);\n\t\t\trangeStart = col;\n\t\t}\n\t\tprev = col;\n\t}\n\tinkRanges.push([rangeStart, prev + 1]);\n\n\tconst boxes: GlyphBox[] = [];\n\tconst bleed = strokeWidth * 0.6;\n\tconst minX = inkRanges[0][0];\n\tconst maxX = inkRanges[inkRanges.length - 1][1];\n\n\tfor (const [x1, x2] of inkRanges) {\n\t\tconst left = Math.min(x1, minX) - bleed;\n\t\tconst right = Math.max(x2, maxX) + bleed;\n\t\tboxes.push({\n\t\t\tx1: left,\n\t\t\tx2: right,\n\t\t\ty1: bandMin,\n\t\t\ty2: bandMax\n\t\t});\n\t}\n\n\treturn boxes;\n}\n\nfunction computeBoundingBox(\n\tcommands: opentype.Path['commands']\n): GlyphBox | null {\n\tconst xs: number[] = [];\n\tconst ys: number[] = [];\n\n\tfor (const cmd of commands) {\n\t\tif ('x' in cmd && typeof cmd.x === 'number') xs.push(cmd.x);\n\t\tif ('y' in cmd && typeof cmd.y === 'number') ys.push(cmd.y);\n\t\tif ('x1' in cmd && typeof cmd.x1 === 'number') xs.push(cmd.x1);\n\t\tif ('y1' in cmd && typeof cmd.y1 === 'number') ys.push(cmd.y1);\n\t\tif ('x2' in cmd && typeof cmd.x2 === 'number') xs.push(cmd.x2);\n\t\tif ('y2' in cmd && typeof cmd.y2 === 'number') ys.push(cmd.y2);\n\t}\n\n\tif (!xs.length || !ys.length) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tx1: Math.min(...xs),\n\t\tx2: Math.max(...xs),\n\t\ty1: Math.min(...ys),\n\t\ty2: Math.max(...ys)\n\t};\n}\n\nfunction compareFont(\n\tweight,\n\tstyle,\n\t[matchedWeight, matchedStyle],\n\t[nextWeight, nextStyle]\n) {\n\tif (matchedWeight !== nextWeight) {\n\t\t// Put the defined weight first.\n\t\tif (!matchedWeight) return 1;\n\t\tif (!nextWeight) return -1;\n\n\t\t// Exact match.\n\t\tif (matchedWeight === weight) return -1;\n\t\tif (nextWeight === weight) return 1;\n\n\t\t// 400 and 500.\n\t\tif (weight === 400 && matchedWeight === 500) return -1;\n\t\tif (weight === 500 && matchedWeight === 400) return -1;\n\t\tif (weight === 400 && nextWeight === 500) return 1;\n\t\tif (weight === 500 && nextWeight === 400) return 1;\n\n\t\t// Less than 400.\n\t\tif (weight < 400) {\n\t\t\tif (matchedWeight < weight && nextWeight < weight)\n\t\t\t\treturn nextWeight - matchedWeight;\n\t\t\tif (matchedWeight < weight) return -1;\n\t\t\tif (nextWeight < weight) return 1;\n\t\t\treturn matchedWeight - nextWeight;\n\t\t}\n\n\t\t// Greater than 500.\n\t\tif (weight < matchedWeight && weight < nextWeight)\n\t\t\treturn matchedWeight - nextWeight;\n\t\tif (weight < matchedWeight) return -1;\n\t\tif (weight < nextWeight) return 1;\n\t\treturn nextWeight - matchedWeight;\n\t}\n\n\tif (matchedStyle !== nextStyle) {\n\t\t// Exact match.\n\t\tif (matchedStyle === style) return -1;\n\t\tif (nextStyle === style) return 1;\n\t}\n\n\treturn -1;\n}\n\nconst cachedParsedFont = new WeakMap<\n\tBuffer | ArrayBuffer,\n\topentype.Font | null | undefined\n>();\n\nexport default class FontLoader {\n\tdefaultFont: opentype.Font;\n\tfonts = new Map<string, [opentype.Font, Weight?, FontStyle?][]>();\n\tconstructor(fontOptions: FontOptions[]) {\n\t\tthis.addFonts(fontOptions);\n\t}\n\n\t// Get font by name and weight.\n\tprivate get({\n\t\tname,\n\t\tweight,\n\t\tstyle\n\t}: {\n\t\tname: string;\n\t\tweight: Weight | WeightName;\n\t\tstyle: FontStyle;\n\t}) {\n\t\tif (!this.fonts.has(name)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (weight === 'normal') weight = 400;\n\t\tif (weight === 'bold') weight = 700;\n\t\tif (typeof weight === 'string')\n\t\t\tweight = Number.parseInt(weight, 10) as Weight;\n\n\t\tconst fonts = [...this.fonts.get(name)];\n\n\t\tlet matchedFont = fonts[0];\n\n\t\t// Fallback to the closest weight and style according to the strategy here:\n\t\t// https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight#fallback_weights\n\t\tfor (let i = 1; i < fonts.length; i++) {\n\t\t\tconst [, weight1, style1] = matchedFont;\n\t\t\tconst [, weight2, style2] = fonts[i];\n\t\t\tif (\n\t\t\t\tcompareFont(\n\t\t\t\t\tweight,\n\t\t\t\t\tstyle,\n\t\t\t\t\t[weight1, style1],\n\t\t\t\t\t[weight2, style2]\n\t\t\t\t) > 0\n\t\t\t) {\n\t\t\t\tmatchedFont = fonts[i];\n\t\t\t}\n\t\t}\n\n\t\treturn matchedFont[0];\n\t}\n\n\tpublic addFonts(fontOptions: FontOptions[]) {\n\t\tfor (const fontOption of fontOptions) {\n\t\t\tconst { name, data, lang } = fontOption;\n\t\t\tif (lang && !isValidLocale(lang)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid value for props \\`lang\\`: \"${lang}\". The value must be one of the following: ${locales.join(\n\t\t\t\t\t\t', '\n\t\t\t\t\t)}.`\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst _lang = lang ?? SUFFIX_WHEN_LANG_NOT_SET;\n\t\t\tlet font;\n\n\t\t\tif (cachedParsedFont.has(data)) {\n\t\t\t\tfont = cachedParsedFont.get(data);\n\t\t\t} else {\n\t\t\t\tfont = opentype.parse(\n\t\t\t\t\t// Buffer to ArrayBuffer.\n\t\t\t\t\t'buffer' in data\n\t\t\t\t\t\t? data.buffer.slice(\n\t\t\t\t\t\t\t\tdata.byteOffset,\n\t\t\t\t\t\t\t\tdata.byteOffset + data.byteLength\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: data,\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t{ lowMemory: true }\n\t\t\t\t);\n\t\t\t\t// Modify the `charToGlyphIndex` method, so we can know which char is\n\t\t\t\t// being mapped to which glyph.\n\t\t\t\tconst originalCharToGlyphIndex = font.charToGlyphIndex;\n\t\t\t\tfont.charToGlyphIndex = char => {\n\t\t\t\t\tconst index = originalCharToGlyphIndex.call(font, char);\n\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\t// The current requested char is missing a glyph.\n\t\t\t\t\t\tif ((font as any)._trackBrokenChars) {\n\t\t\t\t\t\t\t(font as any)._trackBrokenChars.push(char);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn index;\n\t\t\t\t};\n\n\t\t\t\tcachedParsedFont.set(data, font);\n\t\t\t}\n\n\t\t\t// We use the first font as the default font fallback.\n\t\t\tif (!this.defaultFont) this.defaultFont = font;\n\n\t\t\tconst _name = `${name.toLowerCase()}_${_lang}`;\n\n\t\t\tif (!this.fonts.has(_name)) {\n\t\t\t\tthis.fonts.set(_name, []);\n\t\t\t}\n\t\t\tthis.fonts\n\t\t\t\t.get(_name)\n\t\t\t\t.push([font, fontOption.weight, fontOption.style]);\n\t\t}\n\t}\n\n\tpublic getEngine(\n\t\tfontSize = 16,\n\t\tlineHeight: number | string = 'normal',\n\t\t{\n\t\t\tfontFamily = 'sans-serif',\n\t\t\tfontWeight = 400,\n\t\t\tfontStyle = 'normal'\n\t\t}: {\n\t\t\tfontFamily?: string | string[];\n\t\t\tfontWeight?: FontWeight;\n\t\t\tfontStyle?: FontStyle;\n\t\t},\n\t\tlocale: Locale | undefined\n\t): FontEngine {\n\t\tif (!this.fonts.size) {\n\t\t\tthrow new Error(\n\t\t\t\t'No fonts are loaded. At least one font is required to calculate the layout.'\n\t\t\t);\n\t\t}\n\n\t\tfontFamily = (\n\t\t\tArray.isArray(fontFamily) ? fontFamily : [fontFamily]\n\t\t).map(name => name.toLowerCase());\n\t\tconst fonts = [];\n\t\tfontFamily.forEach(face => {\n\t\t\tconst getNormal = this.get({\n\t\t\t\tname: face,\n\t\t\t\tweight: fontWeight,\n\t\t\t\tstyle: fontStyle\n\t\t\t});\n\t\t\tif (getNormal) {\n\t\t\t\tfonts.push(getNormal);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst getUnknown = this.get({\n\t\t\t\tname: face + '_unknown',\n\t\t\t\tweight: fontWeight,\n\t\t\t\tstyle: fontStyle\n\t\t\t});\n\n\t\t\tif (getUnknown) {\n\t\t\t\tfonts.push(getUnknown);\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\n\t\t// Add additional fonts as the fallback.\n\t\tconst keys = Array.from(this.fonts.keys());\n\t\tconst specifiedLangFonts = [];\n\t\tconst nonSpecifiedLangFonts = [];\n\t\tconst additionalFonts = [];\n\t\tfor (const name of keys) {\n\t\t\tif (fontFamily.includes(name)) continue;\n\t\t\tif (locale) {\n\t\t\t\tconst lang = getLangFromFontName(name);\n\t\t\t\tif (lang) {\n\t\t\t\t\tif (lang === locale) {\n\t\t\t\t\t\tspecifiedLangFonts.push(\n\t\t\t\t\t\t\tthis.get({\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\tweight: fontWeight,\n\t\t\t\t\t\t\t\tstyle: fontStyle\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnonSpecifiedLangFonts.push(\n\t\t\t\t\t\t\tthis.get({\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\tweight: fontWeight,\n\t\t\t\t\t\t\t\tstyle: fontStyle\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tadditionalFonts.push(\n\t\t\t\t\t\tthis.get({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tweight: fontWeight,\n\t\t\t\t\t\t\tstyle: fontStyle\n\t\t\t\t\t\t})\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tadditionalFonts.push(\n\t\t\t\t\tthis.get({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tweight: fontWeight,\n\t\t\t\t\t\tstyle: fontStyle\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst cachedFontResolver = new Map<number, opentype.Font | undefined>();\n\t\tconst resolveFont = (word: string, fallback = true) => {\n\t\t\tconst _fonts = [\n\t\t\t\t...fonts,\n\t\t\t\t...additionalFonts,\n\t\t\t\t...specifiedLangFonts,\n\t\t\t\t...(fallback ? nonSpecifiedLangFonts : [])\n\t\t\t];\n\n\t\t\tif (typeof word === 'undefined') {\n\t\t\t\tif (fallback) {\n\t\t\t\t\treturn _fonts[_fonts.length - 1];\n\t\t\t\t}\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst code = word.charCodeAt(0);\n\t\t\tif (cachedFontResolver.has(code))\n\t\t\t\treturn cachedFontResolver.get(code);\n\n\t\t\tconst font = _fonts.find((_font, index) => {\n\t\t\t\treturn (\n\t\t\t\t\t!!_font.charToGlyphIndex(word) ||\n\t\t\t\t\t(fallback && index === _fonts.length - 1)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tif (font) {\n\t\t\t\tcachedFontResolver.set(code, font);\n\t\t\t}\n\n\t\t\treturn font;\n\t\t};\n\n\t\tconst ascender = (resolvedFont: opentype.Font, useOS2Table = false) => {\n\t\t\tconst _ascender =\n\t\t\t\t(useOS2Table ? resolvedFont.tables?.os2?.sTypoAscender : 0) ||\n\t\t\t\tresolvedFont.ascender;\n\t\t\treturn (_ascender / resolvedFont.unitsPerEm) * fontSize;\n\t\t};\n\n\t\tconst descender = (\n\t\t\tresolvedFont: opentype.Font,\n\t\t\tuseOS2Table = false\n\t\t) => {\n\t\t\tconst _descender =\n\t\t\t\t(useOS2Table ? resolvedFont.tables?.os2?.sTypoDescender : 0) ||\n\t\t\t\tresolvedFont.descender;\n\t\t\treturn (_descender / resolvedFont.unitsPerEm) * fontSize;\n\t\t};\n\n\t\tconst height = (resolvedFont: opentype.Font, useOS2Table = false) => {\n\t\t\tif ('string' === typeof lineHeight && 'normal' === lineHeight) {\n\t\t\t\tconst _lineGap =\n\t\t\t\t\t(useOS2Table\n\t\t\t\t\t\t? resolvedFont.tables?.os2?.sTypoLineGap\n\t\t\t\t\t\t: 0) || 0;\n\t\t\t\treturn (\n\t\t\t\t\tascender(resolvedFont, useOS2Table) -\n\t\t\t\t\tdescender(resolvedFont, useOS2Table) +\n\t\t\t\t\t(_lineGap / resolvedFont.unitsPerEm) * fontSize\n\t\t\t\t);\n\t\t\t} else if ('number' === typeof lineHeight) {\n\t\t\t\treturn fontSize * lineHeight;\n\t\t\t}\n\t\t};\n\n\t\tconst resolve = (s: string) => {\n\t\t\treturn resolveFont(s, false);\n\t\t};\n\n\t\tconst engine = {\n\t\t\thas: (s: string) => {\n\t\t\t\tif (s === '\\n') return true;\n\t\t\t\tconst font = resolve(s);\n\t\t\t\tif (!font) return false;\n\t\t\t\t(font as any)._trackBrokenChars = [];\n\t\t\t\tfont.stringToGlyphs(s);\n\t\t\t\tif (!(font as any)._trackBrokenChars.length) return true;\n\t\t\t\t(font as any)._trackBrokenChars = undefined;\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tbaseline: (\n\t\t\t\ts?: string,\n\t\t\t\tresolvedFont = typeof s === 'undefined'\n\t\t\t\t\t? fonts[0]\n\t\t\t\t\t: resolveFont(s)\n\t\t\t) => {\n\t\t\t\tconst asc = ascender(resolvedFont);\n\t\t\t\tconst desc = descender(resolvedFont);\n\t\t\t\tconst contentHeight = asc - desc;\n\n\t\t\t\treturn asc + (height(resolvedFont) - contentHeight) / 2;\n\t\t\t},\n\t\t\theight: (\n\t\t\t\ts?: string,\n\t\t\t\tresolvedFont = typeof s === 'undefined'\n\t\t\t\t\t? fonts[0]\n\t\t\t\t\t: resolveFont(s)\n\t\t\t) => {\n\t\t\t\treturn height(resolvedFont);\n\t\t\t},\n\t\t\tmeasure: (\n\t\t\t\ts: string,\n\t\t\t\tstyle: {\n\t\t\t\t\tfontSize: number;\n\t\t\t\t\tletterSpacing: number;\n\t\t\t\t}\n\t\t\t) => {\n\t\t\t\treturn this.measure(resolveFont, s, style);\n\t\t\t},\n\t\t\tgetSVG: (\n\t\t\t\ts: string,\n\t\t\t\tstyle: {\n\t\t\t\t\tfontSize: number;\n\t\t\t\t\ttop: number;\n\t\t\t\t\tleft: number;\n\t\t\t\t\tletterSpacing: number;\n\t\t\t\t},\n\t\t\t\tband?: SkipInkBand\n\t\t\t) => {\n\t\t\t\treturn this.getSVG(resolveFont, s, style, band);\n\t\t\t}\n\t\t};\n\n\t\treturn engine;\n\t}\n\n\tprivate patchFontFallbackResolver(\n\t\tfont: opentype.Font,\n\t\tresolveFont: (word: string, fallback?: boolean) => opentype.Font\n\t) {\n\t\tconst brokenChars = [];\n\t\t(font as any)._trackBrokenChars = brokenChars;\n\n\t\tconst originalStringToGlyphs = font.stringToGlyphs;\n\t\tfont.stringToGlyphs = (s: string, ...args: any) => {\n\t\t\tconst glyphs = originalStringToGlyphs.call(font, s, ...args);\n\n\t\t\tfor (let i = 0; i < glyphs.length; i++) {\n\t\t\t\t// Hitting an undefined glyph. We have to try to resolve it from other\n\t\t\t\t// fonts.\n\t\t\t\t// @TODO: This affects the kerning resolution but should be fine for now.\n\t\t\t\tif (glyphs[i].unicode === undefined) {\n\t\t\t\t\tconst char = brokenChars.shift();\n\t\t\t\t\tconst anotherFont = resolveFont(char);\n\t\t\t\t\tif (anotherFont !== font) {\n\t\t\t\t\t\tconst glyph = anotherFont.charToGlyph(char);\n\t\t\t\t\t\t// Scale the glyph to match the current units per em.\n\t\t\t\t\t\tconst scale = font.unitsPerEm / anotherFont.unitsPerEm;\n\t\t\t\t\t\tconst p = new opentype.Path();\n\t\t\t\t\t\tp.unitsPerEm = font.unitsPerEm;\n\t\t\t\t\t\tp.commands = glyph.path.commands.map(command => {\n\t\t\t\t\t\t\tconst scaledCommand = { ...command };\n\t\t\t\t\t\t\tfor (let k in scaledCommand) {\n\t\t\t\t\t\t\t\tif (typeof scaledCommand[k] === 'number') {\n\t\t\t\t\t\t\t\t\tscaledCommand[k] *= scale;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn scaledCommand;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst g = new opentype.Glyph({\n\t\t\t\t\t\t\t...glyph,\n\t\t\t\t\t\t\tadvanceWidth: glyph.advanceWidth * scale,\n\t\t\t\t\t\t\txMin: glyph.xMin * scale,\n\t\t\t\t\t\t\txMax: glyph.xMax * scale,\n\t\t\t\t\t\t\tyMin: glyph.yMin * scale,\n\t\t\t\t\t\t\tyMax: glyph.yMax * scale,\n\t\t\t\t\t\t\tpath: p\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tglyphs[i] = g;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn glyphs;\n\t\t};\n\n\t\treturn () => {\n\t\t\tfont.stringToGlyphs = originalStringToGlyphs;\n\t\t\t(font as any)._trackBrokenChars = undefined;\n\t\t};\n\t}\n\n\tprivate measure(\n\t\tresolveFont: (word: string, fallback?: boolean) => opentype.Font,\n\t\tcontent: string,\n\t\t{\n\t\t\tfontSize,\n\t\t\tletterSpacing = 0\n\t\t}: {\n\t\t\tfontSize: number;\n\t\t\tletterSpacing: number;\n\t\t}\n\t) {\n\t\tconst font = resolveFont(content);\n\t\tconst unpatch = this.patchFontFallbackResolver(font, resolveFont);\n\n\t\ttry {\n\t\t\treturn font.getAdvanceWidth(content, fontSize, {\n\t\t\t\tletterSpacing: letterSpacing / fontSize\n\t\t\t});\n\t\t} finally {\n\t\t\tunpatch();\n\t\t}\n\t}\n\n\tprivate getSVG(\n\t\tresolveFont: (word: string, fallback?: boolean) => opentype.Font,\n\t\tcontent: string,\n\t\t{\n\t\t\tfontSize,\n\t\t\ttop,\n\t\t\tleft,\n\t\t\tletterSpacing = 0\n\t\t}: {\n\t\t\tfontSize: number;\n\t\t\ttop: number;\n\t\t\tleft: number;\n\t\t\tletterSpacing: number;\n\t\t},\n\t\tband?: SkipInkBand\n\t): { path: string; boxes: GlyphBox[] } {\n\t\tconst font = resolveFont(content);\n\t\tconst unpatch = this.patchFontFallbackResolver(font, resolveFont);\n\n\t\ttry {\n\t\t\tif (fontSize === 0) {\n\t\t\t\treturn { path: '', boxes: [] };\n\t\t\t}\n\n\t\t\tconst fullPath = new opentype.Path();\n\t\t\tconst boxes: GlyphBox[] = [];\n\n\t\t\tconst options = {\n\t\t\t\tletterSpacing: letterSpacing / fontSize\n\t\t\t};\n\n\t\t\tconst cachedPath = new WeakMap<\n\t\t\t\topentype.Glyph,\n\t\t\t\t[number, number, opentype.Path]\n\t\t\t>();\n\n\t\t\tfont.forEachGlyph(\n\t\t\t\tcontent.replace(/\\n/g, ''),\n\t\t\t\tleft,\n\t\t\t\ttop,\n\t\t\t\tfontSize,\n\t\t\t\toptions,\n\t\t\t\tfunction (glyph, gX, gY, gFontSize) {\n\t\t\t\t\tlet glyphPath: opentype.Path;\n\t\t\t\t\tif (!cachedPath.has(glyph)) {\n\t\t\t\t\t\tglyphPath = glyph.getPath(gX, gY, gFontSize, options);\n\t\t\t\t\t\tcachedPath.set(glyph, [gX, gY, glyphPath]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst [_x, _y, _glyphPath] = cachedPath.get(glyph);\n\t\t\t\t\t\tglyphPath = new opentype.Path();\n\t\t\t\t\t\tglyphPath.commands = _glyphPath.commands.map(\n\t\t\t\t\t\t\tcommand => {\n\t\t\t\t\t\t\t\tconst movedCommand = { ...command };\n\t\t\t\t\t\t\t\tfor (let k in movedCommand) {\n\t\t\t\t\t\t\t\t\tif (typeof movedCommand[k] === 'number') {\n\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\tk === 'x' ||\n\t\t\t\t\t\t\t\t\t\t\tk === 'x1' ||\n\t\t\t\t\t\t\t\t\t\t\tk === 'x2'\n\t\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t\tmovedCommand[k] += gX - _x;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\tk === 'y' ||\n\t\t\t\t\t\t\t\t\t\t\tk === 'y1' ||\n\t\t\t\t\t\t\t\t\t\t\tk === 'y2'\n\t\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t\tmovedCommand[k] += gY - _y;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn movedCommand;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst bandBoxes = band\n\t\t\t\t\t\t? computeBandBox(glyphPath.commands, band)\n\t\t\t\t\t\t: [];\n\t\t\t\t\tif (bandBoxes.length) {\n\t\t\t\t\t\tboxes.push(...bandBoxes);\n\t\t\t\t\t}\n\n\t\t\t\t\tfullPath.extend(glyphPath);\n\t\t\t\t}\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tpath: fullPath.toPathData(1),\n\t\t\t\tboxes\n\t\t\t};\n\t\t} finally {\n\t\t\tunpatch();\n\t\t}\n\t}\n}\n\nfunction getLangFromFontName(name: string): Locale | undefined {\n\tconst arr = name.split('_');\n\tconst lang = arr[arr.length - 1];\n\n\treturn lang === SUFFIX_WHEN_LANG_NOT_SET ? undefined : (lang as Locale);\n}\n","import { buildXMLString } from '../utils.js';\n\nexport default function svg({\n\twidth,\n\theight,\n\tcontent\n}: {\n\twidth: number;\n\theight: number;\n\tcontent: string;\n}) {\n\treturn buildXMLString(\n\t\t'svg',\n\t\t{\n\t\t\twidth,\n\t\t\theight,\n\t\t\tviewBox: `0 0 ${width} ${height}`,\n\t\t\txmlns: 'http://www.w3.org/2000/svg'\n\t\t},\n\t\tcontent\n\t);\n}\n","import type { ReactNode } from 'react';\nimport type { SatoriNode } from './layout.js';\n\nimport layout from './layout.js';\nimport FontLoader, { FontOptions } from './font.js';\nimport svg from './builder/svg.js';\nimport { getYoga, TYoga } from './yoga.js';\nimport { detectLanguageCode, LangCode, Locale } from './language.js';\nimport { preProcessNode } from './handler/preprocess.js';\nimport { cache, inflightRequests } from './handler/image.js';\nimport { segment } from './utils.js';\n\n// We don't need to initialize the opentype instances every time.\nconst fontCache = new WeakMap();\n\nexport type SatoriOptions = (\n\t| {\n\t\t\twidth: number;\n\t\t\theight: number;\n\t }\n\t| {\n\t\t\twidth: number;\n\t }\n\t| {\n\t\t\theight: number;\n\t }\n) & {\n\tfonts: FontOptions[];\n\tembedFont?: boolean;\n\tdebug?: boolean;\n\tgraphemeImages?: Record<string, string>;\n\tloadAdditionalAsset?: (\n\t\tlanguageCode: string,\n\t\tsegment: string\n\t) => Promise<string | Array<FontOptions>>;\n\tonNodeDetected?: (node: SatoriNode) => void;\n\tpointScaleFactor?: number;\n};\nexport type { SatoriNode };\n\nexport default async function satori(\n\telement: ReactNode,\n\toptions: SatoriOptions\n): Promise<string> {\n\tconst Yoga = await getYoga();\n\tif (!Yoga || !Yoga.Node) {\n\t\tthrow new Error(\n\t\t\t'Satori is not initialized: expect `yoga` to be loaded, got ' + Yoga\n\t\t);\n\t}\n\toptions.fonts = options.fonts || [];\n\n\tlet font: FontLoader;\n\tif (fontCache.has(options.fonts)) {\n\t\tfont = fontCache.get(options.fonts);\n\t} else {\n\t\tfontCache.set(options.fonts, (font = new FontLoader(options.fonts)));\n\t}\n\n\tconst definedWidth = 'width' in options ? options.width : undefined;\n\tconst definedHeight = 'height' in options ? options.height : undefined;\n\n\tconst root = getRootNode(Yoga, options.pointScaleFactor);\n\tif (definedWidth) root.setWidth(definedWidth);\n\tif (definedHeight) root.setHeight(definedHeight);\n\troot.setFlexDirection(Yoga.FLEX_DIRECTION_ROW);\n\troot.setFlexWrap(Yoga.WRAP_WRAP);\n\troot.setAlignContent(Yoga.ALIGN_AUTO);\n\troot.setAlignItems(Yoga.ALIGN_FLEX_START);\n\troot.setJustifyContent(Yoga.JUSTIFY_FLEX_START);\n\troot.setOverflow(Yoga.OVERFLOW_HIDDEN);\n\n\tconst graphemeImages = { ...options.graphemeImages };\n\t// Some Chinese characters have different glyphs in Chinese and\n\t// Japanese, but their Unicode is the same. If the user needs to display\n\t// the Chinese and Japanese characters simultaneously correctly, the user\n\t// needs to download the Chinese and Japanese fonts, respectively.\n\t// Assuming that the user has downloaded the corresponding Japanese font,\n\t// to let the program realize that the font has not been downloaded in Chinese,\n\t// we need to prohibit Japanese as the fallback when executing `engine.has`.\n\t//\n\t// This causes a problem. Consider a scenario where we need to display Chinese\n\t// correctly under tags with `lang=\"ja\"` set. `engine.has` will repeatedly treat\n\t// the Chinese as missing font because we have removed the Chinese as a fallback.\n\t// To address this situation, we may need to add `processedWordsMissingFont`\n\tconst processedWordsMissingFonts = new Set();\n\n\tcache.clear();\n\tinflightRequests.clear();\n\tawait preProcessNode(element);\n\n\tconst handler = layout(element, {\n\t\tid: 'id',\n\t\tparentStyle: {},\n\t\tinheritedStyle: {\n\t\t\tfontSize: 16,\n\t\t\tfontWeight: 'normal',\n\t\t\tfontFamily: 'serif',\n\t\t\tfontStyle: 'normal',\n\t\t\tlineHeight: 'normal',\n\t\t\tcolor: 'black',\n\t\t\topacity: 1,\n\t\t\twhiteSpace: 'normal',\n\n\t\t\t// Special style properties:\n\t\t\t_viewportWidth: definedWidth,\n\t\t\t_viewportHeight: definedHeight\n\t\t},\n\t\tparent: root,\n\t\tfont,\n\t\tembedFont: options.embedFont,\n\t\tdebug: options.debug,\n\t\tgraphemeImages,\n\t\tcanLoadAdditionalAssets: !!options.loadAdditionalAsset,\n\t\tonNodeDetected: options.onNodeDetected\n\t});\n\n\tconst segmentsMissingFont = (await handler.next()).value as {\n\t\tword: string;\n\t\tlocale?: Locale;\n\t}[];\n\n\tif (options.loadAdditionalAsset) {\n\t\tif (segmentsMissingFont.length) {\n\t\t\tconst languageCodes = convertToLanguageCodes(segmentsMissingFont);\n\t\t\tconst fonts: FontOptions[] = [];\n\t\t\tconst images: Record<string, string> = {};\n\n\t\t\tawait Promise.all(\n\t\t\t\tObject.entries(languageCodes).flatMap(([code, segments]) =>\n\t\t\t\t\tsegments.map(_segment => {\n\t\t\t\t\t\tconst key = `${code}_${_segment}`;\n\t\t\t\t\t\tif (processedWordsMissingFonts.has(key)) {\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprocessedWordsMissingFonts.add(key);\n\n\t\t\t\t\t\treturn options\n\t\t\t\t\t\t\t.loadAdditionalAsset(code, _segment)\n\t\t\t\t\t\t\t.then((asset: any) => {\n\t\t\t\t\t\t\t\tif (typeof asset === 'string') {\n\t\t\t\t\t\t\t\t\timages[_segment] = asset;\n\t\t\t\t\t\t\t\t} else if (asset) {\n\t\t\t\t\t\t\t\t\tif (Array.isArray(asset)) {\n\t\t\t\t\t\t\t\t\t\tfonts.push(...asset);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tfonts.push(asset);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t);\n\n\t\t\t// Directly mutate the font provider and the grapheme map.\n\t\t\tfont.addFonts(fonts);\n\t\t\tObject.assign(graphemeImages, images);\n\t\t}\n\t}\n\n\tawait handler.next();\n\troot.calculateLayout(definedWidth, definedHeight, Yoga.DIRECTION_LTR);\n\n\tconst content = (await handler.next([0, 0])).value as string;\n\n\tconst computedWidth = root.getComputedWidth();\n\tconst computedHeight = root.getComputedHeight();\n\n\troot.freeRecursive();\n\n\treturn svg({ width: computedWidth, height: computedHeight, content });\n}\n\nfunction getRootNode(\n\tYoga: TYoga,\n\tpointScaleFactor?: SatoriOptions['pointScaleFactor']\n) {\n\tif (!pointScaleFactor) {\n\t\treturn Yoga.Node.create();\n\t} else {\n\t\tconst config = Yoga.Config.create();\n\t\tconfig.setPointScaleFactor(pointScaleFactor);\n\t\treturn Yoga.Node.createWithConfig(config);\n\t}\n}\n\nfunction convertToLanguageCodes(\n\tsegmentsMissingFont: { word: string; locale?: Locale }[]\n): Partial<Record<LangCode, string[]>> {\n\tconst languageCodes = {};\n\tlet wordsByCode = {};\n\n\tfor (const { word, locale } of segmentsMissingFont) {\n\t\tconst code = detectLanguageCode(word, locale).join('|');\n\t\twordsByCode[code] = wordsByCode[code] || '';\n\t\twordsByCode[code] += word;\n\t}\n\n\tObject.keys(wordsByCode).forEach((code: LangCode) => {\n\t\tlanguageCodes[code] = languageCodes[code] || [];\n\t\tif (code === 'emoji') {\n\t\t\tlanguageCodes[code].push(\n\t\t\t\t...unique(segment(wordsByCode[code], 'grapheme'))\n\t\t\t);\n\t\t} else {\n\t\t\tlanguageCodes[code][0] = languageCodes[code][0] || '';\n\t\t\tlanguageCodes[code][0] += unique(\n\t\t\t\tsegment(\n\t\t\t\t\twordsByCode[code],\n\t\t\t\t\t'grapheme',\n\t\t\t\t\tcode === 'unknown' ? undefined : code\n\t\t\t\t)\n\t\t\t).join('');\n\t\t}\n\t});\n\n\treturn languageCodes;\n}\n\nfunction unique<T>(arr: T[]): T[] {\n\treturn Array.from(new Set(arr));\n}\n"],"mappings":"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CACD,CAAC,SAAS,QAAQT,GAAY,kBAAkB,CAAC,EAClD,CChOA,IAAMmC,GAAkB,OAEjBC,GAAQ,CAEd,EAAG,CACF,QAASD,GACT,UAAW,MACX,aAAc,KACf,EACA,IAAK,CACJ,QAASA,EACV,EACA,WAAY,CACX,QAASA,GACT,UAAW,MACX,aAAc,MACd,WAAY,GACZ,YAAa,EACd,EACA,OAAQ,CACP,QAASA,GACT,UAAW,QACZ,EACA,GAAI,CACH,QAASA,GACT,UAAW,QACX,aAAc,QACd,WAAY,OACZ,YAAa,OACb,YAAa,EAEb,YAAa,OACd,EAEA,GAAI,CACH,QAASA,GACT,SAAU,MACV,UAAW,SACX,aAAc,SACd,WAAY,EACZ,YAAa,EACb,WAAY,MACb,EACA,GAAI,CACH,QAASA,GACT,SAAU,QACV,UAAW,SACX,aAAc,SACd,WAAY,EACZ,YAAa,EACb,WAAY,MACb,EACA,GAAI,CACH,QAASA,GACT,SAAU,SACV,UAAW,MACX,aAAc,MACd,WAAY,EACZ,YAAa,EACb,WAAY,MACb,EACA,GAAI,CACH,QAASA,GACT,UAAW,SACX,aAAc,SACd,WAAY,EACZ,YAAa,EACb,WAAY,MACb,EACA,GAAI,CACH,QAASA,GACT,SAAU,SACV,UAAW,SACX,aAAc,SACd,WAAY,EACZ,YAAa,EACb,WAAY,MACb,EACA,GAAI,CACH,QAASA,GACT,SAAU,SACV,UAAW,SACX,aAAc,SACd,WAAY,EACZ,YAAa,EACb,WAAY,MACb,EAKA,EAAG,CACF,eAAgB,WACjB,EACA,OAAQ,CACP,WAAY,MACb,EACA,EAAG,CACF,WAAY,MACb,EACA,EAAG,CACF,UAAW,QACZ,EACA,GAAI,CACH,UAAW,QACZ,EACA,KAAM,CACL,WAAY,WACb,EACA,IAAK,CACJ,WAAY,WACb,EACA,IAAK,CACJ,QAASA,GACT,WAAY,YACZ,WAAY,MACZ,UAAW,MACX,aAAc,KACf,EACA,KAAM,CACL,gBAAiB,SACjB,MAAO,OACR,EACA,IAAK,CACJ,SAAU,QACX,EACA,MAAO,CACN,SAAU,SACX,EACA,EAAG,CACF,eAAgB,cACjB,CACD,EC1IA,IAAME,GAAO,IAAI,IAAI,CACpB,QACA,OACA,aACA,WACA,YACA,aACA,gBACA,aACA,YACA,aACA,gBACA,mBACA,kBACA,mBACA,wBACA,wBACA,qBACA,sBACA,sBACA,wBACA,aACA,YACA,YACA,UAIA,UACA,SAGA,iBACA,kBACA,uBACA,mBACA,mCACA,2CACD,CAAC,EAEc,SAARC,GAA6BC,EAAyC,CAC5E,IAAMC,EAAkC,CAAC,EACzC,QAAWC,KAAQF,GAEdF,GAAK,IAAII,CAAI,GAAKA,EAAK,WAAW,IAAI,KACzCD,EAAeC,CAAI,EAAIF,EAAME,CAAI,GAGnC,OAAOD,CACR,CC9CA,OAAS,mBAAAE,GAAiB,wBAAAC,OAA4B,sBACtD,OAAS,qBAAAC,OAAyB,wBAClC,OAAS,SAASC,OAAsB,iBACxC,OAAOC,OAAmB,kBCR1B,OAAOC,OAAiB,uBAyBxB,SAASC,GAAUC,EAAcC,EAAkC,CAClE,GAAI,CACH,IAAMC,EAAS,IAAIC,GAAaH,CAAI,EACpC,OAAQE,EAAO,KAAM,CACpB,IAAK,KACJ,MAAO,CAAE,SAAUA,EAAO,KAAM,EACjC,IAAK,KACJ,MAAO,CAAE,SAAUA,EAAO,MAAQD,CAAa,EAChD,IAAK,MACJ,MAAO,CAAE,SAAUC,EAAO,MAAQ,EAAG,EACtC,IAAK,IACJ,MAAO,CAAE,SAAUA,EAAO,KAAM,EACjC,QACC,MAAO,CAAC,CACV,CACD,MAAY,CACX,MAAO,CAAC,CACT,CACD,CAEA,SAASE,GACRJ,EACAC,EACAI,EACC,CACD,OAAQL,EAAM,CACb,IAAK,MACJ,MAAO,CAAE,UAAW,CAAE,EACvB,IAAK,OACJ,MAAO,CAAE,UAAW,CAAE,EACvB,IAAK,QACJ,MAAO,CAAE,UAAW,GAAI,EACzB,IAAK,SACJ,MAAO,CAAE,UAAW,GAAI,EACzB,IAAK,SACJ,MAAO,CAAC,EACT,QAAS,CACR,IAAMM,EAAaP,GAAUC,EAAMC,CAAY,EAC/C,OAAOK,EAAW,SACf,CACA,CAACD,EAAmB,YAAc,WAAW,EAC5CC,EAAW,QACZ,EACAA,EAAW,SACX,CACA,CAACD,EAAmB,YAAc,WAAW,EAC5CC,EAAW,QACZ,EACA,CAAC,CACL,CACD,CACD,CAEe,SAARC,GACNC,EACAP,EACwB,CAExB,GAAI,OAAOO,GAAU,SACpB,MAAO,CAAE,UAAWA,CAAM,EAE3B,IAAIC,EACJ,GAAI,CACHA,EAAQC,GAAYF,CAAK,EACvB,MAAM,OAAOG,GAAQA,EAAK,OAAS,MAAM,EACzC,IAAIA,GAAQA,EAAK,KAAK,CACzB,MAAY,CACX,MAAO,CAAC,CACT,CAEA,OAAIF,EAAM,SAAW,EAGbL,GAAWK,EAAM,CAAC,EAAGR,EAAc,EAAI,EACpCQ,EAAM,SAAW,IAG1BA,EAAM,CAAC,IAAM,OACbA,EAAM,CAAC,IAAM,UACbA,EAAM,CAAC,IAAM,QACbA,EAAM,CAAC,IAAM,UAEbA,EAAM,QAAQ,EAGR,CACN,GAAGL,GAAWK,EAAM,CAAC,EAAGR,EAAc,EAAI,EAC1C,GAAGG,GAAWK,EAAM,CAAC,EAAGR,EAAc,EAAK,CAC5C,GAEO,CAAC,CAEV,CCrHA,OAAS,mBAAAW,OAAuB,sBAGhC,SAASC,GAAgBC,EAAwCC,EAAc,CAC9E,IAAMC,EAAMC,GAAgB,QAAQF,CAAI,EAAE,EAC1C,OAAQD,EAAME,CAAG,GAAKF,EAAM,UAAUE,EAAI,UAAU,CAAC,CAAC,EAAE,CACzD,CAWO,SAASE,GACfJ,EACiB,CACjB,IAAMK,EAAaL,EAAM,WAAaA,EAAM,gBAEtCM,EAAS,CACd,SAAUP,GAAgBC,EAAO,UAAU,GAAK,QAChD,KAAMD,GAAgBC,EAAO,MAAM,GAAK,YACxC,OAAQD,GAAgBC,EAAO,QAAQ,GAAK,SAC5C,OAAQD,GAAgBC,EAAO,QAAQ,GAAK,aAC5C,KAAMD,GAAgBC,EAAO,QAAQ,GAAK,YAC3C,EAIA,OAFiBO,GAAaF,CAAS,EAAE,OAAOG,GAAKA,GAAKA,IAAM,MAAM,EAEpD,QAAQ,EAAE,IAAIC,IAAM,CACrC,MAAOA,EACP,GAAGH,CACJ,EAAE,CACH,CC5BA,OAAOI,OAAiB,uBAQjB,SAASC,GACfC,EAIC,CACD,IAAMC,EAA0B,CAAC,EAC3BC,EAAkD,CAAC,EAEzD,QAAWC,KAAQH,EACdG,EAAK,WAAW,IAAI,EAEvBF,EAAUE,CAAI,EAAI,OAAOH,EAAMG,CAAI,CAAC,EAEpCD,EAAeC,CAAI,EAAIH,EAAMG,CAAI,EAInC,MAAO,CAAE,UAAAF,EAAW,eAAAC,CAAe,CACpC,CAMO,SAASE,GACfC,EACAC,EACe,CACf,MAAO,CAAE,GAAGD,EAAW,GAAGC,CAAQ,CACnC,CAOO,SAASC,GACfC,EACAP,EACAQ,EAAc,IAAI,IACA,CAOlB,GALI,OAAOD,GAAU,UAKjB,CAACA,EAAM,SAAS,MAAM,EACzB,OAAOA,EAGR,GAAI,CACH,IAAME,EAASZ,GAAYU,CAAK,EAC5BG,EAAa,GA8DjB,GA5DAD,EAAO,KAAKE,GAAQ,CACnB,GAAIA,EAAK,OAAS,YAAcA,EAAK,QAAU,MAAO,CACrDD,EAAa,GAGb,IAAME,EAAOC,GAAeF,CAAI,EAChC,GAAI,CAACC,EAEJ,OAGD,GAAM,CAAE,QAAAE,EAAS,SAAAC,CAAS,EAAIH,EAG9B,GAAIJ,EAAY,IAAIM,CAAO,EAAG,CAC7B,QAAQ,KACP,iDAAiDA,CAAO,EACzD,EAEIC,IAAa,OAChBC,GAAYL,EAAMI,CAAQ,EAE1BC,GAAYL,EAAM,SAAS,EAE5B,MACD,CAGA,IAAMM,EAAgBjB,EAAUc,CAAO,EAEvC,GAAIG,IAAkB,OAAW,CAEhC,IAAMC,EAAiB,IAAI,IAAIV,CAAW,EAC1CU,EAAe,IAAIJ,CAAO,EAG1B,IAAMK,EAAgBb,GACrBW,EACAjB,EACAkB,CACD,EAEAF,GAAYL,EAAM,OAAOQ,CAAa,CAAC,CACxC,SAAWJ,IAAa,OAAW,CAGlC,IAAMK,EAAmBd,GACxBS,EACAf,EACAQ,CACD,EACAQ,GAAYL,EAAM,OAAOS,CAAgB,CAAC,CAC3C,MAGCJ,GAAYL,EAAM,SAAS,CAE7B,CACD,CAAC,EAEGD,EACH,OAAOD,EAAO,SAAS,CAEzB,MAAc,CAEb,QAAQ,KACP,sDAAsDF,CAAK,EAC5D,CACD,CAEA,OAAOA,CACR,CAMA,SAASM,GACRF,EACgD,CAChD,GAAI,CAACA,EAAK,OAASA,EAAK,MAAM,SAAW,EACxC,OAAO,KAIR,IAAIU,EACAC,EAAa,GAEjB,QAASC,EAAI,EAAGA,EAAIZ,EAAK,MAAM,OAAQY,IAAK,CAC3C,IAAMC,EAAQb,EAAK,MAAMY,CAAC,EAC1B,GAAIC,EAAM,OAAS,QAAU,CAACH,EAC7BA,EAAcG,UACJA,EAAM,OAAS,OAASA,EAAM,QAAU,IAAK,CACvDF,EAAaC,EACb,KACD,CACD,CAEA,GAAI,CAACF,GAAeA,EAAY,OAAS,OACxC,OAAO,KAGR,IAAMP,EAAUO,EAAY,MAAM,KAAK,EAGvC,GAAIC,IAAe,IAAMA,EAAaX,EAAK,MAAM,OAAS,EAAG,CAE5D,IAAMc,EAAgBd,EAAK,MAAM,MAAMW,EAAa,CAAC,EAC/CP,EAAWlB,GAAY,UAAU4B,CAAa,EAAE,KAAK,EAC3D,MAAO,CAAE,QAAAX,EAAS,SAAAC,CAAS,CAC5B,CAEA,MAAO,CAAE,QAAAD,CAAQ,CAClB,CAKA,SAASE,GAAYL,EAAwBJ,EAAe,CAE3DI,EAAK,KAAO,OACZA,EAAK,MAAQJ,EAEb,OAAQI,EAAa,KACtB,CH3KA,IAAMe,GAAW,IAAI,IAAI,CACxB,OACA,WACA,aACA,YACA,aACA,aACA,UACA,QACA,SACA,QACD,CAAC,EACKC,GAAa,IAAI,IAAI,CAAC,YAAY,CAAC,EAEzC,SAASC,GACRC,EACAC,EACAC,EACAC,EACC,CACD,OACCH,IAAS,kBACT,CAACE,EAAS,SAASD,EAAO,mBAAmB,IAE7CA,EAAO,oBAAsBE,GAEvBF,CACR,CAEA,SAASG,GAAOC,EAAcC,EAAyB,CACtD,IAAMC,EAAM,OAAOD,CAAK,EACxB,OAAI,MAAMC,CAAG,EAAUD,EAClBT,GAAS,IAAIQ,CAAI,EAClBP,GAAW,IAAIO,CAAI,EAAUE,EAC1B,OAAOD,CAAK,EAFaC,EAAM,IAGvC,CAEA,SAASC,GACRH,EACAC,EACAH,EACC,CACD,GAAIE,IAAS,SACZ,eAAQ,KAAK,uCAAuC,EAC7C,CAAE,CAACA,CAAI,EAAGC,CAAM,EAGxB,GAAID,IAAS,aACZ,MAAO,CAAE,WAAYD,GAAOC,EAAMC,CAAK,CAAE,EAG1C,GAAID,IAAS,aACZ,MAAO,CACN,WAAaC,EAAiB,MAAM,GAAG,EAAE,IAAIG,GACrCA,EACL,KAAK,EACL,QAAQ,mBAAoB,EAAE,EAC9B,kBAAkB,CACpB,CACF,EAGD,GAAIJ,IAAS,eAAgB,CAC5B,GAAI,OAAOC,GAAU,UAAY,CAACA,EAAM,SAAS,GAAG,EAEnD,OAGD,GAAM,CAACI,EAAYC,CAAQ,EAAIL,EAAM,MAAM,GAAG,EACxCM,EAAKC,GAAqBR,EAAMK,EAAY,EAAI,EAChDI,EAAKD,GAAqBR,EAAMM,EAAU,EAAI,EACpD,QAAWI,KAAKH,EACfE,EAAGC,CAAC,EAAIX,GAAOC,EAAMO,EAAGG,CAAC,CAAC,EAAI,IAAMX,GAAOC,EAAMS,EAAGC,CAAC,CAAC,EAEvD,OAAOD,CACR,CAEA,GAAI,mCAAmC,KAAKT,CAAI,EAAG,CAClD,IAAMW,EAAWH,GAAqB,SAAUP,EAAO,EAAI,EAMvDU,EAAS,cAAgB,GAAK,CAAC,OAAOV,CAAK,EAAE,SAAS,KAAK,IAC9DU,EAAS,YAAc,GAOvBA,EAAS,cAAgB,SACzB,CAAC,OAAOV,CAAK,EAAE,SAAS,OAAO,IAE/BU,EAAS,YAAcb,GAGxB,IAAMc,EAAW,CAChB,MAAOb,GAAOC,EAAO,QAASW,EAAS,WAAW,EAClD,MAAOE,GACNF,EAAS,YACT,CACC,MAAO,QACP,OAAQ,QACT,EACA,QACAX,EAAO,OACR,EACA,MAAOW,EAAS,WACjB,EAEMG,EAAO,CAAC,EACd,QAAWJ,KAAKV,IAAS,SACtB,CAAC,MAAO,QAAS,SAAU,MAAM,EACjC,CAACA,EAAK,MAAM,CAAC,CAAC,EAChB,QAAWe,KAAKH,EACfE,EAAK,SAAWJ,EAAIK,CAAC,EAAIH,EAASG,CAAC,EAGrC,OAAOD,CACR,CAEA,GAAId,IAAS,YAAa,CACzB,GAAI,CAACC,EACJ,MAAM,IAAI,MAAM,+BAAiCA,EAAQ,IAAI,EAE9D,MAAO,CACN,CAACD,CAAI,EAAG,OAAOC,GAAU,SAAWe,GAAef,CAAK,EAAIA,CAC7D,CACD,CAEA,GAAID,IAAS,YAAa,CACzB,GAAI,OAAOC,GAAU,SACpB,MAAM,IAAI,MAAM,4BAA4B,EAG7C,IAAMgB,EAAU,CAAC,EACXC,EAAWjB,EAAM,QAAQ,eAAgB,CAACkB,EAAGf,IAAO,CACzD,IAAMgB,EAAS,CAAC,EAAE,KAAK,OAAO,EAAI,KAClC,OAAAH,EAAQG,CAAM,EAAIhB,EACXgB,EAAS,IACjB,CAAC,EACKxB,EAASY,GAAqB,YAAaU,EAAU,EAAI,EAC/D,QAAWG,KAAKzB,EAAO,UACtB,QAAWc,KAAKW,EACXJ,EAAQI,EAAEX,CAAC,CAAC,IACfW,EAAEX,CAAC,EAAIO,EAAQI,EAAEX,CAAC,CAAC,GAItB,OAAOd,CACR,CAEA,GAAII,IAAS,aAEZ,OADAC,EAAQA,EAAM,SAAS,EAAE,KAAK,EAE7B,+FAA+F,KAC9FA,CACD,EAEOO,GAAqB,kBAAmBP,EAAO,EAAI,EAEpDO,GAAqB,aAAcP,EAAO,EAAI,EAGtD,GAAID,IAAS,aAAc,CAE1BC,EAAQA,EAAM,SAAS,EAAE,KAAK,EAC9B,IAAMqB,EAAS,CAAC,EAEVC,EAAUC,GAAavB,CAAK,EAElC,QAAWwB,KAAUF,EAAS,CAC7B,IAAMG,EAASlB,GAAqB,aAAciB,EAAQ,EAAI,EAC9D,QAAWf,KAAKgB,EACVJ,EAAOZ,CAAC,EAGZY,EAAOZ,CAAC,EAAE,KAAKgB,EAAOhB,CAAC,CAAC,EAFxBY,EAAOZ,CAAC,EAAI,CAACgB,EAAOhB,CAAC,CAAC,CAKzB,CAEA,OAAOY,CACR,CAEA,GAAItB,IAAS,mBAAoB,CAChCC,EAAQA,EAAM,SAAS,EAAE,KAAK,EAC9B,IAAM0B,EAAS1B,EAAM,MAAM,GAAG,EAC9B,GAAI0B,EAAO,SAAW,EACrB,MAAM,IAAI,MAAM,mCAAmC,EAGpD,MAAO,CACN,sBAAuB5B,GAAOC,EAAM2B,EAAO,CAAC,CAAC,EAC7C,sBAAuB5B,GAAOC,EAAM2B,EAAO,CAAC,CAAC,CAC9C,CACD,CAEA,GAAI3B,IAAS,kBAAoBA,IAAS,uBACzC,MAAO,CAAE,eAAgBC,CAAM,EAGhC,GAAID,IAAS,wBAAyB,CACrC,IAAM4B,EAAa3B,EAAM,SAAS,EAAE,KAAK,EAAE,YAAY,EACvD,GAAI,CAAC,CAAC,OAAQ,OAAQ,KAAK,EAAE,SAAS2B,CAAU,EAC/C,MAAM,IAAI,MAAM,wCAAwC,EAGzD,MAAO,CAAE,sBAAuBA,CAAW,CAC5C,CAGD,CAEA,SAASC,GAAa7B,EAAc,CACnC,OAAIA,IAAS,YACL,uDAED,EACR,CAEA,IAAM8B,GAAY,gDAClB,SAASC,GAAe9B,EAAwB,CAC/C,GAAI,OAAOA,GAAU,UAChB6B,GAAU,KAAK7B,EAAM,KAAK,CAAC,EAE9B,OAAOA,EAAM,KAAK,EAAE,QAAQ6B,GAAW,CAACX,EAAGa,EAAGC,EAAGC,EAAGC,IAC5C,QAAQH,CAAC,KAAKC,CAAC,KAAKC,CAAC,KAAKC,CAAC,GAClC,EAKH,GAAI,OAAOlC,GAAU,UAAYA,IAAU,KAAM,CAChD,QAAWS,KAAKT,EACfA,EAAMS,CAAC,EAAIqB,GAAe9B,EAAMS,CAAC,CAAC,EAEnC,OAAOT,CACR,CAEA,OAAOA,CACR,CAuDe,SAARmC,GACNC,EACAC,EACkB,CAClB,IAAMC,EAAmC,CAAC,EAGpCC,EAAmC,CAAC,EAC1C,QAAW7C,KAAQ2C,EACd3C,EAAK,WAAW,IAAI,IACvB6C,EAAmB7C,CAAI,EAAI,OAAO2C,EAAe3C,CAAI,CAAC,GAKxD,IAAI8C,EAAiC,CAAC,EAClCC,EAAmBL,EAEvB,GAAIA,EAAO,CACV,GAAM,CAAE,UAAAM,EAAW,eAAAC,CAAe,EAAIC,GAAwBR,CAAK,EACnEI,EAAmBE,EACnBD,EAAmBE,CACpB,CAGA,IAAME,EAAkBC,GACvBP,EACAC,CACD,EAGA,QAAWO,KAAWF,EACrBP,EAAgBS,CAAO,EAAIF,EAAgBE,CAAO,EAGnD,GAAIN,EAAkB,CAErB,IAAMO,EAAgBP,EAAiB,MACpCQ,GAAiBR,EAAiB,MAAOI,CAAe,EACxD,OAEGhD,EAAeqD,GACpBF,EACAX,EAAe,KAChB,EAEAC,EAAgB,MAAQzC,EAExB,QAAWH,KAAQ+C,EAAkB,CAEpC,GAAI/C,EAAK,WAAW,GAAG,EAAG,CACzB4C,EAAgB5C,CAAI,EAAI+C,EAAiB/C,CAAI,EAC7C,QACD,CAEA,GAAIA,IAAS,QACZ,SAGD,IAAMK,EAAOoD,GAAgBzD,CAAI,EAE3B0D,EAAgBH,GACrBR,EAAiB/C,CAAI,EACrBmD,CACD,EACM7C,EAAQqD,GAAWD,EAAevD,CAAY,EAEpD,GAAI,CACH,IAAMyD,EACLpD,GAAkBH,EAAMC,EAAOH,CAAY,GAC3CJ,GACCM,EACAQ,GAAqBR,EAAMD,GAAOC,EAAMC,CAAK,EAAG,EAAI,EACpDA,EACAH,CACD,EAED,OAAO,OAAOyC,EAAiBgB,CAAa,CAC7C,OAASC,EAAK,CACb,MAAM,IAAI,MACTA,EAAI,SAGFA,EAAI,QAAQ,SAASvD,CAAK,EACxB;AAAA,IAAS4B,GAAa7B,CAAI,EAC1B;AAAA,kBAAqBA,CAAI,KAAKC,CAAK,MAAM4B,GACzC7B,CACA,CAAC,GACN,CACD,CACD,CACD,CAGA,GAAIuC,EAAgB,gBAAiB,CACpC,GAAM,CAAE,YAAAkB,CAAY,EAAIC,GAAkBnB,CAAe,EACzDA,EAAgB,gBAAkBkB,CACnC,EAEIlB,EAAgB,WAAaA,EAAgB,mBAChDA,EAAgB,UAAYoB,GAAUpB,CAAe,GAItD,IAAMqB,EAAeC,GACpBtB,EAAgB,SAChBD,EAAe,QAChB,EACI,OAAOC,EAAgB,SAAa,MACvCA,EAAgB,SAAWqB,GAGxBrB,EAAgB,kBACnBA,EAAgB,gBAAkBuB,GACjCvB,EAAgB,gBAChBqB,CACD,GAGD,QAAWjE,KAAQ4C,EAAiB,CACnC,IAAItC,EAAQsC,EAAgB5C,CAAI,EAGhC,GAAIA,IAAS,aACR,OAAOM,GAAU,UAAYA,IAAU,WAC1CA,EAAQsC,EAAgB5C,CAAI,EAC3BoE,EACC9D,EACA2D,EACAA,EACAtB,EACA,EACD,EAAIsB,OAEA,CAEN,GAAI,OAAO3D,GAAU,SAAU,CAC9B,IAAM+D,EAAMD,EACX9D,EACA2D,EACAA,EACAtB,CACD,EACI,OAAO0B,EAAQ,MAAazB,EAAgB5C,CAAI,EAAIqE,GACxD/D,EAAQsC,EAAgB5C,CAAI,CAC7B,CAEA,GAAI,OAAOM,GAAU,UAAY,OAAOA,GAAU,SAAU,CAC3D,IAAMgE,EAAQlC,GAAe9B,CAAK,EAC9BgE,IACH1B,EAAgB5C,CAAI,EAAIsE,GAEzBhE,EAAQsC,EAAgB5C,CAAI,CAC7B,CACD,CAOA,GAJIA,IAAS,WAAa,OAAOM,GAAU,WAC1CsC,EAAgB,QAAUtC,EAAQqC,EAAe,SAG9C3C,IAAS,YAAa,CACzB,IAAMuE,EAAajE,EAInB,QAAWkE,KAAaD,EAAY,CACnC,IAAME,EAAO,OAAO,KAAKD,CAAS,EAAE,CAAC,EAC/B/D,EAAK+D,EAAUC,CAAI,EAGnBJ,EACL,OAAO5D,GAAO,SACX2D,EACA3D,EACAwD,EACAA,EACAtB,CACA,GAAKlC,EACLA,EACJ+D,EAAUC,CAAI,EAAIJ,CACnB,CACD,CAEA,GAAIrE,IAAS,mBAAoB,CAChC,IAAM0E,EAAmBpE,EAEzBsC,EAAgB,iBAAmB8B,EAAiB,IAAIjE,GACvD2D,EAAe3D,EAAIwD,EAAc,EAAGtB,EAAgB,EAAK,CAC1D,CACD,CAEA,GAAI3C,IAAS,mBAAoB,CAChC,IAAM2E,EAAmBrE,EAKzBsC,EAAgB,iBAAmB+B,EAAiB,IACnD,CAAC,CAAE,OAAAC,EAAQ,MAAAC,CAAM,KAAO,CACvB,OAAQT,EACPQ,EACAX,EACA,EACAtB,EACA,EACD,EACA,MAAOyB,EACNS,EACAZ,EACA,EACAtB,EACA,EACD,CACD,EACD,CACD,CACD,CAEA,OAAOC,CACR,CAEA,SAASsB,GACRY,EACAC,EACS,CACT,GAAI,OAAOD,GAAS,SAAU,OAAOA,EAErC,GAAI,CACH,IAAM7E,EAAS,IAAI+E,GAAaF,CAAI,EACpC,OAAQ7E,EAAO,KAAM,CACpB,IAAK,KACJ,OAAOA,EAAO,MAAQ8E,EACvB,IAAK,MACJ,OAAO9E,EAAO,MAAQ,EACxB,CACD,MAAc,CACb,OAAO8E,CACR,CACD,CAKA,SAASE,GAAUX,EAAe,CACjC,GAAIA,EAAM,WAAW,KAAK,EAAG,CAC5B,IAAM5C,EAAIwD,GAAcZ,CAAK,EACvB,CAACa,EAAGC,EAAGC,CAAC,EAAI3D,EAAE,OAEpB,MAAO,OAAO,CAACyD,EAAG,GAAGC,CAAC,IAAK,GAAGC,CAAC,GAAG,EAChC,OAAO3D,EAAE,QAAU,EAAI,CAAC,EAAI,CAACA,EAAE,KAAK,CAAC,EACrC,KAAK,GAAG,CAAC,GACZ,CAEA,OAAO4C,CACR,CAEA,SAASd,GACRc,EACAgB,EACS,CACT,OAAIhB,GAASA,EAAM,YAAY,IAAM,eAC7BW,GAAUX,CAAK,EAGhBW,GAAUK,CAAc,CAChC,CAEA,SAASC,GACRjF,EACAH,EACS,CACT,OAAOG,EAAM,QAAQ,iBAAkBH,CAAY,CACpD,CAEA,SAASwD,GACRrD,EACAH,EACkB,CAClB,OAAIqF,GAASlF,CAAK,IACjBA,EAAQiF,GAAiCjF,EAAOH,CAAY,GAGtDG,CACR,CI1kBA,eAAOmF,GACNC,EACAC,EACAC,EACAC,EACAC,EAC8C,CAC9C,IAAMC,EAAO,MAAMC,GAAQ,EAGrBC,EAAyB,OAAO,OACrC,CAAC,EACDL,EACAM,GAAOC,GAAQR,CAAI,EAAGC,CAAc,EACpCM,GAAOL,EAAcD,CAAc,CACpC,EAEA,GAAID,IAAS,MAAO,CACnB,GAAI,CAACS,EAAaC,EAAYC,CAAW,EAAI,MAAMC,GAClDT,EAAM,GACP,EAGA,GAAIO,IAAe,QAAaC,IAAgB,OAAW,CAC1D,GAAIR,EAAM,QAAU,QAAaA,EAAM,SAAW,OACjD,MAAM,IAAI,MACT,oFACD,EAEDO,EAAa,SAASP,EAAM,KAAK,EACjCQ,EAAc,SAASR,EAAM,MAAM,CACpC,CACA,IAAMU,EAAIF,EAAcD,EAKpBI,GACFR,EAAM,iBAAmB,IACzBA,EAAM,kBAAoB,IAC1BA,EAAM,aAAe,IACrBA,EAAM,cAAgB,GACpBS,GACFT,EAAM,gBAAkB,IACxBA,EAAM,mBAAqB,IAC3BA,EAAM,YAAc,IACpBA,EAAM,eAAiB,GAErBU,EAAkBV,EAAM,OAASH,EAAM,MACvCc,EAAmBX,EAAM,QAAUH,EAAM,OAEvCe,EACL,OAAOF,GAAoB,UAC3B,OAAOC,GAAqB,SAEzBC,IACHF,GAAmBF,EACnBG,GAAoBF,GAIjBC,IAAoB,QAAaC,IAAqB,QACzDD,EAAkB,OAClBjB,EAAK,eAAe,EAAIc,CAAC,GAGrBG,IAAoB,OACnB,OAAOC,GAAqB,SAC/BD,EAAkBC,EAAmBJ,EAIrCd,EAAK,eAAe,EAAIc,CAAC,EAEhBI,IAAqB,SAC3B,OAAOD,GAAoB,SAC9BC,EAAmBD,EAAkBH,EAIrCd,EAAK,eAAe,EAAIc,CAAC,GAK5BP,EAAM,MAAQY,EACVF,EAA6BF,EAC9BE,EACHV,EAAM,OAASY,EACXD,EAA8BF,EAC/BE,EACHX,EAAM,MAAQG,EACdH,EAAM,eAAiBI,EACvBJ,EAAM,gBAAkBK,CACzB,CAEA,GAAIX,IAAS,MAAO,CACnB,IAAMmB,EAAUhB,EAAM,SAAWA,EAAM,QACjCiB,EAAcC,GAAaF,CAAO,EAClCG,EAAQF,EAAcA,EAAY,CAAC,EAAIA,EAAY,CAAC,EAAI,KAE1D,CAAE,MAAAG,EAAO,OAAAC,CAAO,EAAIrB,EACpB,OAAOoB,EAAU,KAAeC,EAC/BF,GAAS,KACZC,EAAQ,EACE,OAAOC,GAAW,UAAYA,EAAO,SAAS,GAAG,EAC3DD,EAAQ,SAASC,CAAM,EAAIF,EAAQ,KAEnCE,EAASC,EACRD,EACAvB,EAAe,SACf,EACAA,CACD,EACAsB,EAAQC,EAASF,GAER,OAAOE,EAAW,KAAeD,EACvCD,GAAS,KACZC,EAAQ,EACE,OAAOA,GAAU,UAAYA,EAAM,SAAS,GAAG,EACzDC,EAAS,SAASD,CAAK,EAAID,EAAQ,KAEnCC,EAAQE,EACPF,EACAtB,EAAe,SACf,EACAA,CACD,EACAuB,EAASD,EAAQD,IAGd,OAAOC,EAAU,MACpBA,EACCE,EACCF,EACAtB,EAAe,SACf,EACAA,CACD,GAAKsB,GAEH,OAAOC,EAAW,MACrBA,EACCC,EACCD,EACAvB,EAAe,SACf,EACAA,CACD,GAAKuB,GAEPD,IAAUH,GAAA,YAAAA,EAAc,GACxBI,IAAWJ,GAAA,YAAAA,EAAc,IAGtB,CAACd,EAAM,OAASiB,IAAOjB,EAAM,MAAQiB,GACrC,CAACjB,EAAM,QAAUkB,IAAQlB,EAAM,OAASkB,EAC7C,CAGA,OAAAzB,EAAK,WACJ2B,GACCpB,EAAM,QACN,CACC,KAAMF,EAAK,aACX,MAAOA,EAAK,aACZ,SAAUA,EAAK,iBACf,KAAMA,EAAK,aACX,cAAeA,EAAK,YACrB,EACAA,EAAK,aACL,SACD,CACD,EAEAL,EAAK,gBACJ2B,GACCpB,EAAM,aACN,CACC,QAASF,EAAK,cACd,OAAQA,EAAK,aACb,aAAcA,EAAK,iBACnB,WAAYA,EAAK,eACjB,gBAAiBA,EAAK,oBACtB,eAAgBA,EAAK,mBACrB,SAAUA,EAAK,eACf,OAAQA,EAAK,UACd,EACAA,EAAK,WACL,cACD,CACD,EAEAL,EAAK,cACJ2B,GACCpB,EAAM,WACN,CACC,QAASF,EAAK,cACd,OAAQA,EAAK,aACb,aAAcA,EAAK,iBACnB,WAAYA,EAAK,eACjB,SAAUA,EAAK,eACf,OAAQA,EAAK,UACd,EACAA,EAAK,cACL,YACD,CACD,EACAL,EAAK,aACJ2B,GACCpB,EAAM,UACN,CACC,QAASF,EAAK,cACd,OAAQA,EAAK,aACb,aAAcA,EAAK,iBACnB,WAAYA,EAAK,eACjB,SAAUA,EAAK,eACf,OAAQA,EAAK,UACd,EACAA,EAAK,WACL,WACD,CACD,EACAL,EAAK,kBACJ2B,GACCpB,EAAM,eACN,CACC,OAAQF,EAAK,eACb,aAAcA,EAAK,mBACnB,WAAYA,EAAK,iBACjB,gBAAiBA,EAAK,sBACtB,eAAgBA,EAAK,oBACtB,EACAA,EAAK,mBACL,gBACD,CACD,EAGAL,EAAK,iBACJ2B,GACCpB,EAAM,cACN,CACC,IAAKF,EAAK,mBACV,OAAQA,EAAK,sBACb,cAAeA,EAAK,2BACpB,iBAAkBA,EAAK,6BACxB,EACAA,EAAK,mBACL,eACD,CACD,EACAL,EAAK,YACJ2B,GACCpB,EAAM,SACN,CACC,KAAMF,EAAK,UACX,OAAQA,EAAK,aACb,eAAgBA,EAAK,iBACtB,EACAA,EAAK,aACL,UACD,CACD,EAEI,OAAOE,EAAM,IAAQ,KACxBP,EAAK,OAAOK,EAAK,WAAYE,EAAM,GAAG,EAGnC,OAAOA,EAAM,OAAW,KAC3BP,EAAK,OAAOK,EAAK,WAAYE,EAAM,MAAM,EAGtC,OAAOA,EAAM,UAAc,KAC9BP,EAAK,OAAOK,EAAK,cAAeE,EAAM,SAAS,EAK5C,OAAOA,EAAM,UAAc,KAC9BP,EAAK,aACJ4B,GAA4BrB,EAAM,UAAW,WAAW,CACzD,EAEDP,EAAK,YACJ,OAAOO,EAAM,SAAa,IAAc,EAAIA,EAAM,QACnD,EACAP,EAAK,cACJ,OAAOO,EAAM,WAAe,IAAc,EAAIA,EAAM,UACrD,EAEI,OAAOA,EAAM,UAAc,KAC9BP,EAAK,aACJ6B,GAAwBtB,EAAM,UAAW,WAAW,CACrD,EAEG,OAAOA,EAAM,SAAa,KAC7BP,EAAK,YAAY6B,GAAwBtB,EAAM,SAAU,UAAU,CAAC,EAEjE,OAAOA,EAAM,UAAc,KAC9BP,EAAK,aACJ6B,GAAwBtB,EAAM,UAAW,WAAW,CACrD,EAEG,OAAOA,EAAM,SAAa,KAC7BP,EAAK,YAAY6B,GAAwBtB,EAAM,SAAU,UAAU,CAAC,EAGrEP,EAAK,YACJ2B,GACCpB,EAAM,SACN,CACC,QAASF,EAAK,iBACd,OAAQA,EAAK,eACd,EACAA,EAAK,iBACL,UACD,CACD,EAEAL,EAAK,UACJK,EAAK,SACLuB,GAA4BrB,EAAM,WAAa,CAAC,CACjD,EACAP,EAAK,UACJK,EAAK,YACLuB,GAA4BrB,EAAM,cAAgB,CAAC,CACpD,EACAP,EAAK,UACJK,EAAK,UACLuB,GAA4BrB,EAAM,YAAc,CAAC,CAClD,EACAP,EAAK,UACJK,EAAK,WACLuB,GAA4BrB,EAAM,aAAe,CAAC,CACnD,EAEAP,EAAK,UAAUK,EAAK,SAAUE,EAAM,gBAAkB,CAAC,EACvDP,EAAK,UAAUK,EAAK,YAAaE,EAAM,mBAAqB,CAAC,EAC7DP,EAAK,UAAUK,EAAK,UAAWE,EAAM,iBAAmB,CAAC,EACzDP,EAAK,UAAUK,EAAK,WAAYE,EAAM,kBAAoB,CAAC,EAE3DP,EAAK,WAAWK,EAAK,SAAUE,EAAM,YAAc,CAAC,EACpDP,EAAK,WAAWK,EAAK,YAAaE,EAAM,eAAiB,CAAC,EAC1DP,EAAK,WAAWK,EAAK,UAAWE,EAAM,aAAe,CAAC,EACtDP,EAAK,WAAWK,EAAK,WAAYE,EAAM,cAAgB,CAAC,EAExDP,EAAK,aACJ2B,GACCpB,EAAM,UACN,CACC,aAAcF,EAAK,sBACnB,cAAeA,EAAK,sBACrB,EACAA,EAAK,sBACL,WACD,CACD,EAEAL,EAAK,gBACJ2B,GACCpB,EAAM,SACN,CACC,SAAUF,EAAK,uBACf,SAAUA,EAAK,uBACf,OAAQA,EAAK,oBACd,EACAA,EAAK,uBACL,UACD,CACD,EAEI,OAAOE,EAAM,IAAQ,KACxBP,EAAK,YACJK,EAAK,SACLwB,GAAwBtB,EAAM,IAAK,KAAK,CACzC,EAEG,OAAOA,EAAM,OAAW,KAC3BP,EAAK,YACJK,EAAK,YACLwB,GAAwBtB,EAAM,OAAQ,QAAQ,CAC/C,EAEG,OAAOA,EAAM,KAAS,KACzBP,EAAK,YACJK,EAAK,UACLwB,GAAwBtB,EAAM,KAAM,MAAM,CAC3C,EAEG,OAAOA,EAAM,MAAU,KAC1BP,EAAK,YACJK,EAAK,WACLwB,GAAwBtB,EAAM,MAAO,OAAO,CAC7C,EAGG,OAAOA,EAAM,OAAW,IAC3BP,EAAK,UAAU4B,GAA4BrB,EAAM,OAAQ,QAAQ,CAAC,EAElEP,EAAK,cAAc,EAEhB,OAAOO,EAAM,MAAU,IAC1BP,EAAK,SAAS4B,GAA4BrB,EAAM,MAAO,OAAO,CAAC,EAE/DP,EAAK,aAAa,EAGZ,CAACO,EAAOuB,GAAYvB,CAAK,CAAC,CAClC,CC5aA,OAAOwB,OAAgB,cCGvB,IAAMC,GAAa,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAGpC,SAASC,GAAkBC,EAAmBC,EAAeC,EAAgB,CAC5E,IAAIC,EAAS,CAAC,GAAGL,EAAU,EAM3B,QAAWM,KAAaJ,EAAY,CACnC,IAAMK,EAAO,OAAO,KAAKD,CAAS,EAAE,CAAC,EACjCE,EAAIF,EAAUC,CAAI,EAGtB,GAAI,OAAOC,GAAM,SAChB,GAAID,IAAS,aACZC,EAAK,WAAWA,CAAC,EAAI,IAAOL,EAE5BG,EAAUC,CAAI,EAAIC,UACRD,IAAS,aACnBC,EAAK,WAAWA,CAAC,EAAI,IAAOJ,EAC5BE,EAAUC,CAAI,EAAIC,MAElB,OAAM,IAAI,MAAM,uBAAuBD,CAAI,KAAKC,CAAC,IAAI,EAIvD,IAAIC,EAAMD,EAEJE,EAAkB,CAAC,GAAGV,EAAU,EACtC,OAAQO,EAAM,CACb,IAAK,aACJG,EAAgB,CAAC,EAAID,EACrB,MACD,IAAK,aACJC,EAAgB,CAAC,EAAID,EACrB,MACD,IAAK,QACJC,EAAgB,CAAC,EAAID,EACrBC,EAAgB,CAAC,EAAID,EACrB,MACD,IAAK,SACJC,EAAgB,CAAC,EAAID,EACrB,MACD,IAAK,SACJC,EAAgB,CAAC,EAAID,EACrB,MACD,IAAK,SAAU,CACd,IAAME,EAAOF,EAAM,KAAK,GAAM,IACxBG,EAAI,KAAK,IAAID,CAAG,EAChB,EAAI,KAAK,IAAIA,CAAG,EACtBD,EAAgB,CAAC,EAAIE,EACrBF,EAAgB,CAAC,EAAI,EACrBA,EAAgB,CAAC,EAAI,CAAC,EACtBA,EAAgB,CAAC,EAAIE,EACrB,KACD,CACA,IAAK,QACJF,EAAgB,CAAC,EAAI,KAAK,IAAKD,EAAM,KAAK,GAAM,GAAG,EACnD,MACD,IAAK,QACJC,EAAgB,CAAC,EAAI,KAAK,IAAKD,EAAM,KAAK,GAAM,GAAG,EACnD,KACF,CACAJ,EAASQ,GAASH,EAAiBL,CAAM,CAC1C,CAEAH,EAAW,OAAO,EAAGA,EAAW,MAAM,EACtCA,EAAW,KAAK,GAAGG,CAAM,EACxBH,EAAmB,WAAa,EAClC,CAEe,SAARI,GACN,CACC,KAAAQ,EACA,IAAAC,EACA,MAAAZ,EACA,OAAAC,CACD,EAMAF,EACAc,EACAC,EACC,CACD,IAAIC,EAEEhB,EAAmB,YACxBD,GAAkBC,EAAYC,EAAOC,CAAM,EAG5C,IAAIC,EAASH,EAGb,GAAIc,EACHE,EAASb,MACH,CACN,IAAMc,GACLF,GAAA,YAAAA,EAAiB,cACfA,GAAA,YAAAA,EAAiB,YAAa,IAAMd,EAAS,IAC1CiB,GACLH,GAAA,YAAAA,EAAiB,cACfA,GAAA,YAAAA,EAAiB,YAAa,IAAMb,EAAU,IAI3CiB,EAAIP,EAAOK,EACXG,EAAIP,EAAMK,EAIhBF,EAASL,GACR,CAAC,EAAG,EAAG,EAAG,EAAGQ,EAAGC,CAAC,EACjBT,GAASR,EAAQ,CAAC,EAAG,EAAG,EAAG,EAAG,CAACgB,EAAG,CAACC,CAAC,CAAC,CACtC,EAGKjB,EAAe,WACnBa,EAASL,GAAUR,EAAe,SAAUa,CAAM,GAInDb,EAAO,OAAO,EAAG,EAAG,GAAGa,CAAM,CAC9B,CAEA,MAAO,UAAUA,EAAO,IAAIV,GAAKA,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,GACzD,CDhIO,SAASe,GACf,CACC,KAAAC,EACA,IAAAC,EACA,MAAAC,EACA,OAAAC,EACA,sBAAAC,CACD,EAOAC,EACC,CACD,IAAIC,EAAS,GACTC,EAAU,EAEd,OAAIF,EAAM,YACTC,EAASE,GACR,CACC,KAAAR,EACA,IAAAC,EACA,MAAAC,EACA,OAAAC,CACD,EACAE,EAAM,UACND,EACAC,EAAM,eACP,GAGGA,EAAM,UAAY,SACrBE,EAAU,CAACF,EAAM,SAGX,CAAE,OAAAC,EAAQ,QAAAC,CAAQ,CAC1B,CAEe,SAARE,GACN,CACC,GAAAC,EACA,QAAAC,EACA,OAAAC,EACA,KAAAZ,EACA,IAAAC,EACA,MAAAC,EACA,OAAAC,EACA,OAAAG,EACA,QAAAC,EACA,MAAAM,EACA,WAAAC,EACA,MAAAC,EACA,MAAAC,EACA,gBAAAC,CACD,EAgBAZ,EACC,CACD,IAAIa,EAAQ,GAgBZ,GAfIH,IACHG,EAAQC,EAAe,OAAQ,CAC9B,EAAGnB,EACH,EAAGC,EAAME,EACT,MAAAD,EACA,OAAAC,EACA,KAAM,cACN,OAAQ,UACR,eAAgB,EAChB,UAAWG,GAAU,OACrB,YAAaQ,EAAa,QAAQA,CAAU,IAAM,MACnD,CAAC,GAIED,EAAO,CACV,IAAMO,EAAa,CAClB,KAAMP,EACN,EAAGb,EACH,EAAGC,EACH,MAAAC,EACA,OAAAC,EACA,UAAWG,GAAU,OACrB,YAAaQ,EAAa,QAAQA,CAAU,IAAM,OAClD,MAAOT,EAAM,OAAS,UAAUA,EAAM,MAAM,GAAK,MAClD,EACA,MAAO,EACLO,EAAS,GAAGA,CAAM,4BAA4BF,CAAE,MAAQ,IACxDS,EAAe,QAAS,CACvB,GAAGC,EACH,QAASb,IAAY,EAAIA,EAAU,MACpC,CAAC,GACAU,GAAmB,KACnBL,EAAS,OAAS,IACnBM,EAED,EACD,CACD,CAGA,IAAME,EAAa,CAClB,EAAGpB,EACH,EAAGC,EACH,MAAAC,EACA,OAAAC,EACA,cAAeE,EAAM,WACrB,aAAcA,EAAM,UACpB,YAAaA,EAAM,SACnB,cAAeA,EAAM,WACrB,iBAAkBA,EAAM,eAAiB,OACzC,UAAWC,GAAU,OACrB,YAAaQ,EAAa,QAAQA,CAAU,IAAM,OAClD,MAAOT,EAAM,OAAS,UAAUA,EAAM,MAAM,GAAK,OACjD,eAAgBA,EAAM,sBACnB,GAAGA,EAAM,qBAAqB,KAC9B,OACH,OAAQA,EAAM,sBACXA,EAAM,sBACN,OACH,kBAAmBA,EAAM,sBAAwB,QAAU,OAC3D,cAAeA,EAAM,sBAAwB,SAAW,MACzD,EACA,MAAO,EACLO,EAAS,GAAGA,CAAM,4BAA4BF,CAAE,MAAQ,IACxDS,EACC,OACA,CACC,GAAGC,EACH,KAAMf,EAAM,MACZ,QAASE,IAAY,EAAIA,EAAU,MACpC,EACAc,GAAWV,CAAO,CACnB,GACCM,GAAmB,KACnBL,EAAS,OAAS,IACnBM,EACDF,EAAQG,EAAe,OAAQC,EAAYC,GAAWV,CAAO,CAAC,EAAI,EACnE,CACD,CEzJA,SAASW,GAAUC,EAAcC,EAAYC,EAAY,CACxD,OAAOF,EAAK,QACX,+BACA,SAAUG,EAAGC,EAASC,EAAGC,EAAG,CAC3B,OAAOF,GAAW,WAAWC,CAAC,EAAIJ,GAAM,KAAO,WAAWK,CAAC,EAAIJ,EAChE,CACD,CACD,CASA,IAAMK,GAAQ,IAEP,SAASC,GACf,CAAE,GAAAC,EAAI,MAAAC,EAAO,OAAAC,CAAO,EACpBC,EAQAC,EAAkB,GACjB,CACD,GACC,CAACD,EAAM,aACP,CAACA,EAAM,cACP,OAAOA,EAAM,aAAiB,IAE9B,MAAO,GAGR,IAAME,EAAcF,EAAM,YAAY,OAClCG,EAAU,GACVC,EAAQ,GAIRC,EAAO,EACPC,EAAQR,EACRS,EAAM,EACNC,EAAST,EACb,QAASU,EAAI,EAAGA,EAAIP,EAAaO,IAAK,CAErC,IAAMC,EAAQV,EAAM,aAAaS,CAAC,EAAIT,EAAM,aAAaS,CAAC,EAAK,EAM/D,GALAJ,EAAO,KAAK,IAAIL,EAAM,aAAaS,CAAC,EAAE,MAAQC,EAAML,CAAI,EACxDC,EAAQ,KAAK,IAAIN,EAAM,aAAaS,CAAC,EAAE,MAAQC,EAAOZ,EAAOQ,CAAK,EAClEC,EAAM,KAAK,IAAIP,EAAM,aAAaS,CAAC,EAAE,OAASC,EAAMH,CAAG,EACvDC,EAAS,KAAK,IAAIR,EAAM,aAAaS,CAAC,EAAE,OAASC,EAAOX,EAAQS,CAAM,EAElEP,EAAiB,CAIpB,IAAMU,EAAW,YAAYd,CAAE,WAAWY,CAAC,GAC3CN,GACCS,EAAe,iBAAkB,CAChC,GAAI,cACJ,aAAcZ,EAAM,aAAaS,CAAC,EAAI,EACtC,OAAQ,GAAGE,CAAQ,OACpB,CAAC,EACDC,EAAe,WAAY,CAC1B,GAAI,GAAGD,CAAQ,QACf,GAAIX,EAAM,aAAaS,CAAC,EAAE,MAC1B,GAAIT,EAAM,aAAaS,CAAC,EAAE,OAC1B,OAAQ,GAAGE,CAAQ,SACpB,CAAC,EACDC,EAAe,UAAW,CACzB,cAAeZ,EAAM,YAAYS,CAAC,EAClC,gBAAiB,EACjB,OAAQ,GAAGE,CAAQ,QACpB,CAAC,EACDC,EAAe,cAAe,CAC7B,GAAI,GAAGD,CAAQ,SACf,IAAK,GAAGA,CAAQ,UAChB,SAAU,KACV,OAAQT,EAAc,EAAIS,EAAW,MACtC,CAAC,CACH,MACCR,GAAWS,EAAe,eAAgB,CACzC,GAAIZ,EAAM,aAAaS,CAAC,EAAE,MAC1B,GAAIT,EAAM,aAAaS,CAAC,EAAE,OAC1B,aAMCT,EAAM,aAAaS,CAAC,EAAI,EACzB,cAAeT,EAAM,YAAYS,CAAC,EAClC,gBAAiB,EACjB,GAAIP,EAAc,EACf,CACA,GAAI,gBACJ,OAAQ,YAAYL,CAAE,WAAWY,CAAC,EAClC,EACA,CAAC,CACL,CAAC,EAGEP,EAAc,IAEjBE,EACCQ,EAAe,cAAe,CAC7B,GAAI,YAAYf,CAAE,WAAWY,CAAC,EAC/B,CAAC,EAAIL,EAER,CAEA,OAAOQ,EACN,SACA,CACC,GAAI,YAAYf,CAAE,GAClB,GAAKQ,EAAOP,EAAS,IAAMH,IAAO,QAAQ,CAAC,EAAI,IAC/C,GAAKY,EAAMR,EAAU,IAAMJ,IAAO,QAAQ,CAAC,EAAI,IAC/C,QAAUW,EAAQD,GAAQP,EAAS,IAAMH,IAAO,QAAQ,CAAC,EAAI,IAC7D,SAAWa,EAASD,GAAOR,EAAU,IAAMJ,IAAO,QAAQ,CAAC,EAAI,GAChE,EACAQ,GAAWC,EAAQQ,EAAe,UAAW,CAAC,EAAGR,CAAK,EAAI,GAC3D,CACD,CAEO,SAASS,GACf,CACC,MAAAf,EACA,OAAAC,EACA,MAAAe,EACA,QAAAC,EACA,GAAAlB,CACD,EAOAG,EACC,CACD,GAAI,CAACA,EAAM,UAAW,OAAO,KAE7B,IAAIgB,EAAS,GACTC,EAAc,GAElB,QAASR,EAAIT,EAAM,UAAU,OAAS,EAAGS,GAAK,EAAGA,IAAK,CACrD,IAAIS,EAAI,GAEFC,EAAcnB,EAAM,UAAUS,CAAC,EAEjCU,EAAY,cAAgBA,EAAY,QAC3CA,EAAY,aAAe,CAACA,EAAY,cAIzC,IAAMT,EACJS,EAAY,WAAaA,EAAY,WAAc,GACnDA,EAAY,cAAgB,GAExBd,EAAO,KAAK,IACjB,CAACK,GAAQS,EAAY,MAAQA,EAAY,QAAU,GACnD,CACD,EACMb,EAAQ,KAAK,IAClBI,EAAOZ,GAASqB,EAAY,MAAQA,EAAY,QAAU,GAC1DrB,CACD,EACMS,EAAM,KAAK,IAChB,CAACG,GAAQS,EAAY,MAAQA,EAAY,QAAU,GACnD,CACD,EACMX,EAAS,KAAK,IACnBE,EAAOX,GAAUoB,EAAY,MAAQA,EAAY,QAAU,GAC3DpB,CACD,EAEMqB,EAAM,YAAYvB,CAAE,IAAIY,CAAC,GACzBY,EAAS,aAAaxB,CAAE,IAAIY,CAAC,GAC7Ba,EAAkBH,EAAY,aACjCL,EAAM,QACN,mBACA,iBAAiBK,EAAY,aAAe,CAAC,GAC7C,EACAL,EAEHI,GAAKN,EACJ,OACA,CACC,GAAIS,EACJ,UAAW,gBACZ,EACAT,EAAe,OAAQ,CACtB,EAAG,EACH,EAAG,EACH,MAAOZ,EAAM,gBAAkB,OAC/B,OAAQA,EAAM,iBAAmB,OACjC,KAAMmB,EAAY,MAAQ,OAAS,MACpC,CAAC,EACAG,EACE,QACA,cACAH,EAAY,MAAQ,cAAgB,aACrC,EACC,QAAQ,gBAAiB,EAAE,CAC/B,EAEA,IAAII,EAAaD,EACf,QAAQ,cAAe,CAAC/B,EAAGH,IAE1B,MACAD,GAAUC,EAAM+B,EAAY,QAASA,EAAY,OAAO,EACxD,GAED,EACA,QAAQ,cAAe,CAAC5B,EAAGE,IACpB,OAAS,WAAWA,CAAC,EAAI0B,EAAY,SAAW,GACvD,EACA,QAAQ,cAAe,CAAC5B,EAAGG,IACpB,OAAS,WAAWA,CAAC,EAAIyB,EAAY,SAAW,GACvD,EAGEA,EAAY,cAAgBA,EAAY,aAAe,IAC1DD,GAAKN,EACJ,OACA,CACC,GAAIS,EAAS,OACb,UAAW,gBACZ,EACAE,EACE,QAAQ,gBAAiB,eAAe,EACxC,QACA,uBACA,iBAAiB,CAACJ,EAAY,aAAe,CAAC,GAC/C,CACF,GAGGA,EAAY,cAAgBA,EAAY,aAAe,IAC1DI,EAAaX,EACZ,IACA,CACC,KAAM,QAAQS,CAAM,OACrB,EACAE,CACD,GAGDL,GACCN,EACC,OACA,CAAC,EACDA,EACC,SACA,CACC,GAAIQ,EACJ,EAAG,GAAIf,EAAOP,EAAS,GAAG,IAC1B,EAAG,GAAIS,EAAMR,EAAU,GAAG,IAC1B,MAAO,IAAKO,EAAQD,GAAQP,EAAS,GAAG,IACxC,OAAQ,IAAKU,EAASD,GAAOR,EAAU,GAAG,GAC3C,EACAa,EAAe,iBAAkB,CAMhC,aAAcO,EAAY,WAAa,EACvC,OAAQ,GACT,CAAC,EACAP,EAAe,UAAW,CACzB,cAAeO,EAAY,MAC3B,GAAI,gBACJ,OAAQ,GACT,CAAC,EACDP,EAAe,cAAe,CAC7B,GAAI,IACJ,IAAK,IACL,SAAUO,EAAY,MAAQ,MAAQ,IACvC,CAAC,CACH,CACD,EACAP,EACC,IACA,CACC,KAAM,QAAQS,CAAM,IACpB,OAAQ,QAAQD,CAAG,IACnB,QAASL,CACV,EACAQ,CACD,EAEGJ,EAAY,MACfF,GAAeC,EAEfF,GAAUE,CAEZ,CAEA,MAAO,CAACF,EAAQC,CAAW,CAC5B,CCnTA,SAASO,GACRC,EACAC,EACAC,EACAC,EACAC,EACAC,EACC,CACD,IAAMC,EAAaF,EAAc,EAC3BG,EAAQ,KAAK,IAAID,EAAYF,EAAc,IAAI,EAC/CI,EAAiC,CAAC,EAExC,QAAWC,KAAOP,EAAY,CAE7B,GAAIO,EAAI,GAAKJ,EAAWC,GAAcG,EAAI,GAAKN,EAAIG,EAAY,SAE/D,IAAMI,EAAO,KAAK,IAAIV,EAAOS,EAAI,GAAKF,CAAK,EACrCI,EAAK,KAAK,IAAIV,EAAKQ,EAAI,GAAKF,CAAK,EAEvC,GAAIG,GAAQC,EAAI,SAChB,GAAIH,EAAW,SAAW,EAAG,CAC5BA,EAAW,KAAK,CAACE,EAAMC,CAAE,CAAC,EAC1B,QACD,CAEA,IAAMC,EAAOJ,EAAWA,EAAW,OAAS,CAAC,EACzCE,GAAQE,EAAK,CAAC,EACjBA,EAAK,CAAC,EAAI,KAAK,IAAIA,EAAK,CAAC,EAAGD,CAAE,EAE9BH,EAAW,KAAK,CAACE,EAAMC,CAAE,CAAC,CAE5B,CAEA,GAAI,CAACH,EAAW,OACf,MAAO,CAAC,CAACR,EAAOC,CAAG,CAAC,EAGrB,IAAMY,EAA+B,CAAC,EAClCC,EAASd,EAEb,OAAW,CAACU,EAAMC,CAAE,IAAKH,EAKxB,GAJIE,EAAOI,GACVD,EAAS,KAAK,CAACC,EAAQJ,CAAI,CAAC,EAE7BI,EAAS,KAAK,IAAIA,EAAQH,CAAE,EACxBG,GAAUb,EAAK,MAGpB,OAAIa,EAASb,GACZY,EAAS,KAAK,CAACC,EAAQb,CAAG,CAAC,EAGrBY,CACR,CAEe,SAARE,GACN,CACC,MAAAC,EACA,KAAAC,EACA,IAAAC,EACA,SAAAC,EACA,WAAAC,EACA,OAAAC,EACA,WAAAnB,CACD,EASAoB,EACC,CACD,GAAM,CACL,oBAAAC,EACA,oBAAAC,EACA,mBAAAC,EACA,sBAAAC,EACA,SAAAC,EACA,MAAAC,CACD,EAAIN,EACJ,GAAI,CAACG,GAAsBA,IAAuB,OAAQ,MAAO,GAIjE,IAAMI,EAAS,KAAK,IAAI,EAAGF,EAAW,EAAG,EAEnCxB,EACLsB,IAAuB,eACpBP,EAAMC,EAAW,GACjBM,IAAuB,YACvBP,EAAMC,EAAW,IACjBD,EAEEY,EACLN,IAAwB,SACrB,GAAGK,EAAS,GAAG,IAAIA,EAAS,CAAC,GAC7BL,IAAwB,SACxB,KAAKK,EAAS,CAAC,GACf,OAEEE,EACLN,IAAuB,cACtBC,GAAyB,UAAY,SACtCxB,GAAA,YAAAA,EAAY,QAEPG,EAAWa,EAAMC,EAEjBN,EAAWkB,EACdhC,GACAkB,EACAA,EAAOD,EACPd,EACAC,EACA0B,EACAxB,CACA,EACC,CAAC,CAACY,EAAMA,EAAOD,CAAK,CAAC,EAGnBgB,EACLR,IAAwB,SACrBX,EACC,IAAI,CAAC,CAACoB,EAAIC,CAAE,IACZC,EAAe,OAAQ,CACtB,GAAAF,EACA,GAAI9B,EAAI0B,EAAS,EACjB,GAAAK,EACA,GAAI/B,EAAI0B,EAAS,EACjB,OAAQN,GAAuBK,EAC/B,eAAgBC,EAChB,mBAAoBC,EACpB,iBACCN,IAAwB,SACrB,QACA,SACJ,UAAWH,CACZ,CAAC,CACF,EACC,KAAK,EAAE,EACR,GAEJ,OACED,EAAa,sBAAsBA,CAAU,MAAQ,IACtDP,EACE,IAAI,CAAC,CAACoB,EAAIC,CAAE,IACZC,EAAe,OAAQ,CACtB,GAAAF,EACA,GAAI9B,EACJ,GAAA+B,EACA,GAAI/B,EACJ,OAAQoB,GAAuBK,EAC/B,eAAgBC,EAChB,mBAAoBC,EACpB,iBACCN,IAAwB,SAAW,QAAU,SAC9C,UAAWH,CACZ,CAAC,CACF,EACC,KAAK,EAAE,EACTW,GACCZ,EAAa,OAAS,GAEzB,CCxKO,SAASgB,GAAeC,EAAsB,CACpD,OAAAA,EAAOA,EAAK,QAAQ,KAAM,IAAI,EAEvB,OAAO,cAAc,OAAOA,CAAI,CAAC,CACzC,CAEO,IAAMC,GAAQF,GAAe,QAAQ,EAC/BG,GAAMH,GAAe,QAAQ,EAC7BI,GAAqBJ,GAAe,QAAQ,ECLlD,SAASK,GACfC,EACAC,EACAC,EAQC,CACD,GAAM,CAAE,SAAAC,EAAU,cAAAC,CAAc,EAAIF,EAE9BG,EAAQ,IAAI,IAElB,SAASC,EAAgBC,EAA0B,CAClD,IAAIC,EAAQH,EAAM,IAAIE,CAAQ,EAE9B,OAAIC,IAAU,SACbA,EAAQR,EAAO,QAAQO,EAAU,CAAE,SAAAJ,EAAU,cAAAC,CAAc,CAAC,EAC5DC,EAAM,IAAIE,EAAUC,CAAK,GAGnBA,CACR,CAEA,SAASC,EAAqBC,EAA6B,CAC1D,IAAIF,EAAQ,EAEZ,QAAWD,KAAYG,EAClBT,EAAQM,CAAQ,EACnBC,GAASL,EAETK,GAASF,EAAgBC,CAAQ,EAInC,OAAOC,CACR,CAEA,SAASG,EAAYC,EAAsB,CAC1C,OAAOH,EAAqBI,GAAQD,EAAM,UAAU,CAAC,CACtD,CAEA,MAAO,CACN,gBAAAN,EACA,qBAAAG,EACA,YAAAE,CACD,CACD,CChDO,SAASG,GACfC,EACAC,EACAC,EAUC,CACD,GAAM,CAAE,cAAAC,EAAe,WAAAC,EAAY,UAAAC,CAAU,EAAIJ,EAEjDD,EAAUM,GAAqBN,EAASG,EAAeD,CAAM,EAE7D,GAAM,CACL,QAASK,EACT,4BAAAC,EACA,cAAAC,CACD,EAAIC,GAAkBV,EAASI,CAAU,EAEnC,CAAE,MAAAO,EAAO,eAAAC,EAAgB,eAAAC,CAAe,EAAIC,GACjDP,EACAF,CACD,EAEM,CAACU,EAAWC,CAAa,EAAIC,GAClChB,EACAQ,CACD,EAEA,MAAO,CACN,MAAAE,EACA,eAAAC,EACA,cAAAH,EACA,eAAAI,EACA,iBAAAN,EACA,4BAAAC,EACA,UAAAO,EACA,cAAAC,CACD,CACD,CAEA,SAASV,GACRN,EACAG,EACAD,EACS,CACT,OAAIC,IAAkB,YACrBH,EAAUA,EAAQ,kBAAkBE,CAAM,EAChCC,IAAkB,YAC5BH,EAAUA,EAAQ,kBAAkBE,CAAM,EAChCC,IAAkB,eAC5BH,EAAUkB,GAAQlB,EAAS,OAAQE,CAAM,EAEvC,IAAIiB,GAEGD,GAAQC,EAAM,WAAYjB,CAAM,EACrC,IAAI,CAACkB,EAAUC,IAERA,IAAU,EACdD,EAAS,kBAAkBlB,CAAM,EACjCkB,CACH,EACA,KAAK,EAAE,CACT,EACA,KAAK,EAAE,GAGHpB,CACR,CAEA,SAASiB,GACRhB,EACAQ,EACoB,CACpB,GAAM,CACL,aAAAa,EACA,UAAAC,EACA,gBAAAC,EACA,gBAAAC,EACA,SAAAC,EACA,QAAAC,CACD,EAAI1B,EAEJ,GAAI0B,IAAY,SAAWJ,EAAW,CACrC,GAAM,CAACR,EAAWC,EAAgBY,EAAkB,EACnDC,GAAeN,CAAS,EACzB,GAAIR,EACH,MAAO,CAACA,EAAWC,CAAa,CAElC,CAEA,OACCM,IAAiB,YACjBK,IAAY,eACZF,IAAoB,YACpBK,GAASN,CAAe,GACxBA,EAAkB,EAEX,CAACA,EAAiBI,EAAkB,EAI3CN,IAAiB,YACjBI,IAAa,UACb,CAACjB,EAEM,CAAC,EAAGmB,EAAkB,EAGvB,CAAC,GAAQ,CACjB,CAEA,SAASd,GACRd,EACAK,EAC0E,CAC1E,IAAMQ,EAAiB,CAAC,YAAa,YAAY,EAAE,SAASR,CAAS,EAE/D,CAAE,MAAAM,EAAO,eAAAC,CAAe,EAAImB,GACjC/B,EACAK,CACD,EAEA,MAAO,CAAE,MAAAM,EAAO,eAAAC,EAAgB,eAAAC,CAAe,CAChD,CAEA,SAASH,GACRV,EACAI,EAKC,CACD,IAAM4B,EAAsB,CAAC,MAAO,WAAY,UAAU,EAAE,SAC3D5B,CACD,EAEMI,EAA8B,CACnC,SACA,SACA,UACD,EAAE,SAASJ,CAAU,EAEfK,EAAgB,CAAC,CAAC,MAAO,QAAQ,EAAE,SAASL,CAAU,EAE5D,OAAK4B,IACJhC,EAAUA,EAAQ,QAAQ,MAAOiC,EAAK,GAGnCzB,IACHR,EAAUA,EACR,QAAQ,aAAciC,EAAK,EAC3B,QAAQ,aAAc,EAAE,GAGpB,CAAE,QAAAjC,EAAS,4BAAAQ,EAA6B,cAAAC,CAAc,CAC9D,CAEA,SAASoB,GAAeK,EAA4C,CACnE,GAAI,OAAOA,GAAU,SAAU,MAAO,CAACA,CAAK,EAE5C,IAAMC,EAAS,mBACTC,EAAS,mBACTC,EAASF,EAAO,KAAKD,CAAK,EAC1BI,EAASF,EAAO,KAAKF,CAAK,EAEhC,GAAIG,EAAQ,CACX,IAAME,EAAS,CAACF,EAAO,CAAC,EAClBG,EAAOH,EAAO,CAAC,EAErB,MAAO,CAACE,EAAQC,CAAI,CACrB,SAAWF,EAAQ,CAClB,IAAMC,EAAS,CAACD,EAAO,CAAC,EAClBE,EAAOF,EAAO,CAAC,EAErB,MAAO,CAACC,EAAQC,CAAI,CACrB,CAEA,MAAO,CAAC,CACT,CCvKA,OAAOC,OAAmB,kBAE1B,IAAMC,GAAoC,IAAI,IAAI,CAACC,EAAG,CAAC,EAEvD,SAASC,GAAiCC,EAAuB,CAChE,OAAOH,GAAkC,IAAIG,CAAI,CAClD,CAEA,SAASC,GAAmBC,EAAwB,CACnD,GAAIA,IAAU,cAAe,MAAO,GACpC,IAAMC,EAASP,GAAcM,CAAK,EAClC,OAAOC,EAASA,EAAO,QAAU,EAAI,EACtC,CAEA,SAASC,GAAcF,EAAwB,CAC9C,GAAI,CAACA,EAAO,MAAO,GACnB,IAAMC,EAASP,GAAcM,CAAK,EAClC,GAAI,CAACC,EAAQ,MAAO,GACpB,GAAM,CAACE,EAAGC,EAAGC,EAAGC,CAAC,EAAIL,EAAO,OAC5B,OAAOE,IAAM,KAAOC,IAAM,KAAOC,IAAM,MAAQC,IAAM,QAAaA,IAAM,EACzE,CAEA,eAAOC,GACNC,EACAC,EAC0E,CAC1E,IAAMC,EAAO,MAAMC,GAAQ,EAErB,CACL,YAAAC,EACA,eAAAC,EACA,OAAAC,EACA,KAAAC,EACA,GAAAC,EACA,sBAAAC,EACA,MAAAC,EACA,UAAAC,EACA,eAAAC,EACA,OAAAC,EACA,wBAAAC,CACD,EAAIb,EAEE,CACL,UAAAc,EACA,WAAAC,EAAa,EACb,WAAAC,EACA,SAAAC,EACA,SAAAC,EACA,OAAQC,EACR,QAAAC,EAAU,EACV,cAAAC,EACA,iCAAAC,EACA,0CAAAC,EACA,WAAAC,CACD,EAAIrB,EAEE,CACL,MAAAsB,EACA,eAAAC,GACA,cAAAC,GACA,eAAAC,GACA,iBAAAC,GACA,4BAAAC,GACA,UAAAC,GACA,cAAAC,EACD,EAAIC,GAAWlC,EAASI,EAAaS,CAAM,EAErCsB,GAAgBC,GAAwBlC,EAAMa,CAAS,EAC7DT,EAAO,YAAY6B,GAAe7B,EAAO,cAAc,CAAC,EAEpD+B,GAAYZ,CAAU,GACzBnB,EAAO,cAAc,CAAC,EAKvB,IAAIgC,EAAS/B,EAAK,UAAUY,EAAUF,EAAYb,EAAaS,CAAM,EAG/D0B,GAAmBzB,EACtB0B,GAAQV,GAAkB,UAAU,EAAE,OACtCxC,GACC,CAACD,GAAiCC,CAAI,GAAK,CAACgD,EAAO,IAAIhD,CAAI,CAC5D,EACA,CAAC,EAEJ,MAAMiD,GAAiB,IAAIjD,IACnB,CACN,KAAAA,EACA,OAAAuB,CACD,EACA,EAEG0B,GAAiB,SAEpBD,EAAS/B,EAAK,UAAUY,EAAUF,EAAYb,EAAaS,CAAM,GAGlE,SAAS4B,GAAQC,EAAoB,CACpC,MAAO,CAAC,EAAE9B,GAAkBA,EAAe8B,CAAC,EAC7C,CAEA,GAAM,CAAE,gBAAAC,GAAiB,qBAAAC,GAAsB,YAAAC,EAAY,EAAIC,GAC9DR,EACAG,GACA,CACC,SAAAtB,EACA,cAAAG,CACD,CACD,EAEMyB,EAAWC,GAAS3B,CAAO,EAC9B4B,EAAe5B,EAASF,EAAU,EAAGf,CAAW,EAChDuC,GAAgBO,EAAK,EAAI7B,EAEtB8B,EAAO,CACZC,EACAC,IAKI,CACJ,GAAID,EAAK,SAAW,EACnB,MAAO,CACN,YAAa,EACb,kBAAmB,EACnB,KAAAA,CACD,EAGD,GAAM,CAAE,MAAAE,EAAO,SAAAC,CAAS,EAAIC,GAAWJ,CAAI,EAEvCK,EAAc,EAElB,GAAIF,EAAW,EAAG,CACjB,IAAMG,GAAgBN,EAAK,MAAM,EAAGE,CAAK,EACnCK,GAAeP,EAAK,MAAME,EAAQC,CAAQ,EAC1CK,EAAqBf,GAAYa,EAAa,EAC9CG,GAAkBD,EAAqBP,EAM7CI,GAJCV,IAAa,EACVa,GACC,KAAK,MAAMC,GAAkBd,CAAQ,EAAIQ,GAC1CR,GAC4BF,GAAYc,EAAY,CACzD,MACCF,EAAcZ,GAAYO,CAAI,EAG/B,IAAMU,EACLV,EAAK,QAAQ,IAAMA,EAAOK,EAAcZ,GAAYO,EAAK,QAAQ,CAAC,EAEnE,MAAO,CACN,YAAAK,EACA,kBAAmBA,EAAcK,EACjC,KAAAV,CACD,CACD,EAIIW,EAAa,CAAC,EACdC,GAAY,CAAC,EACbC,GAAoB,CAAC,EACrBC,EAAkB,CAAC,EACnBC,GAOG,CAAC,EAGR,SAASC,GAAKC,EAAe,CAC5B,IAAIC,EAAQ,EACRC,EAAW,EACXC,EAAY,GACZC,EAAS,EACTpB,EAAe,EACfqB,GAAoB,EACpBC,GAAwB,EAE5BZ,EAAa,CAAC,EACdE,GAAoB,CAAC,CAAC,EACtBC,EAAQ,CAAC,EACTC,GAAuB,CAAC,EAKxB,IAAIS,EAAI,EACJC,GAA4B,EAChC,KAAOD,EAAIlD,EAAM,QAAU4C,EAAQtC,IAAW,CAC7C,IAAI1C,EAAOoC,EAAMkD,CAAC,EACZE,GAAanD,GAAeiD,CAAC,EAE/BG,GAAI,EAEF,CACL,YAAAtB,GACA,kBAAAuB,GACA,KAAMC,EACP,EAAI9B,EAAK7D,EAAM+D,CAAY,EAC3B/D,EAAO2F,GAEPF,GAAItB,GACJ,IAAMyB,GAAwBF,GAI1BF,IAAcJ,KAAsB,IACvCA,GAAoBpC,EAAO,OAAOhD,CAAI,GAGvC,IAAM6F,GAAmBpE,IAAc,UAEjCqE,GACLR,GASAvB,EAAe0B,GAAIV,EAAQa,IAC3BtD,GAWD,GAJCC,IACAkD,GAAIV,IACH,CAAChB,GAAgB+B,IAAYN,IAEV,CAEpB,IAAMO,GAAQ7C,GAAQlD,EAAM,UAAU,EACtCoC,EAAM,OAAOkD,EAAG,EAAG,GAAGS,EAAK,EACvBhC,EAAe,IAElBU,EAAW,KAAKV,EAAewB,EAAyB,EACxDb,GAAU,KAAKW,EAAqB,EACpCL,IACAG,GAAUC,GACVrB,EAAe,EACfqB,GAAoB,EACpBC,GAAwB,EACxBV,GAAkB,KAAK,CAAC,EACxBO,EAAY,IAEbK,GAA4BK,GAC5B,QACD,CACA,GAAIJ,IAAcM,GAEbrD,IAA+BzC,IAAS4D,KAC3C6B,GAAI,GAGLhB,EAAW,KAAKV,EAAewB,EAAyB,EACxDb,GAAU,KAAKW,EAAqB,EACpCL,IACAG,GAAUC,GACVrB,EAAe0B,GACfL,GAAoBK,GAAI,KAAK,MAAMzC,EAAO,OAAOhD,CAAI,CAAC,EAAI,EAC1DqF,GAAwBI,GACrB,KAAK,MAAMzC,EAAO,SAAShD,CAAI,CAAC,EAChC,EACH2E,GAAkB,KAAK,CAAC,EACxBO,EAAY,GAKPM,KACJP,EAAW,KAAK,IAAIA,EAAUF,CAAK,OAE9B,CAENhB,GAAgB0B,GAChB,IAAMO,GAAc,KAAK,MAAMhD,EAAO,OAAOhD,CAAI,CAAC,EAC9CgG,GAAcZ,KAEjBA,GAAoBY,GACpBX,GAAwB,KAAK,MAAMrC,EAAO,SAAShD,CAAI,CAAC,GAErD6F,IACHlB,GAAkBA,GAAkB,OAAS,CAAC,GAEhD,CAEIkB,IACHX,IAGDD,EAAW,KAAK,IAAIA,EAAUlB,CAAY,EAE1C,IAAIkC,GAAIlC,EAAe0B,GAEvB,GAAIA,KAAM,EACTZ,GAAqB,KAAK,CACzB,EAAGM,EACH,EAAAc,GACA,MAAO,EACP,KAAMjB,EACN,UAAAE,EACA,QAAS,EACV,CAAC,MACK,CACN,IAAMgB,GAAShD,GAAQlD,EAAM,MAAM,EAEnC,QAASmG,GAAI,EAAGA,GAAID,GAAO,OAAQC,KAAK,CACvC,IAAMC,GAAQF,GAAOC,EAAC,EAClBE,GAAS,EACTC,GAAW,GAEXnD,GAAQiD,EAAK,GAChBC,GAASxE,EACTyE,GAAW,IACD,CAACjF,GAAa+E,GAAM,OAAS,EAKvCC,GAAS9C,GAAY6C,EAAK,EAE1BC,GAAShD,GAAgB+C,EAAK,EAG/BxB,EAAM,KAAKwB,EAAK,EAChBvB,GAAqB,KAAK,CACzB,EAAGM,EACH,EAAAc,GACA,MAAOI,GACP,KAAMrB,EACN,UAAAE,EACA,QAASoB,EACV,CAAC,EAEDL,IAAKI,EACN,CACD,CAEAf,IACAC,GAA4BK,EAC7B,CAEA,OAAI7B,IACCiB,EAAQtC,KACXyC,GAAUC,IAEXJ,IACAP,EAAW,KAAKV,CAAY,EAC5BW,GAAU,KAAKW,EAAqB,GAI9B,CAAE,MAAOJ,EAAU,OAAAE,CAAO,CAClC,CAKA,IAAIoB,GAAmB,CAAE,MAAO,EAAG,OAAQ,CAAE,EAC7C1D,GAAc,eAAe2D,GAAkB,CAC9C,GAAM,CAAE,MAAAzB,EAAO,OAAAI,CAAO,EAAIL,GAAK0B,CAAc,EAK7C,GAAI5E,IAAa,UAAW,CAC3B,IAAI6E,EAAI1B,EAAQ,EACZ1E,EAAI0E,EACJ2B,GAAY3B,EAChB,KAAO0B,EAAI,EAAIpG,GAAG,CACjBqG,IAAKD,EAAIpG,GAAK,EACd,GAAM,CAAE,OAAQsG,CAAQ,EAAI7B,GAAK4B,EAAC,EAC9BC,EAAUxB,EACbsB,EAAIC,GAEJrG,EAAIqG,EAEN,CACA5B,GAAKzE,CAAC,EACN,IAAMgG,GAAS,KAAK,KAAKhG,CAAC,EAC1B,OAAAkG,GAAmB,CAAE,MAAOF,GAAQ,OAAAlB,CAAO,EACpC,CAAE,MAAOkB,GAAQ,OAAAlB,CAAO,CAChC,CAOA,GAAIvD,IAAa,UAGM6C,EAAWA,EAAW,OAAS,CAAC,EACdM,EAAQ,EAE3B,CAUpB,IAAM6B,GAAgB7B,EAAQ,GACxB8B,GAAS/B,GAAK8B,EAAa,EAGjC,GAAIC,GAAO,QAAU1B,EAAS,IAC7B,OAAAoB,GAAmB,CAAE,MAAAxB,EAAO,OAAQ8B,GAAO,MAAO,EAC3C,CAAE,MAAA9B,EAAO,OAAQ8B,GAAO,MAAO,CAExC,CAGD,IAAMR,EAAS,KAAK,KAAKtB,CAAK,EAC9B,OAAAwB,GAAmB,CAAE,MAAOF,EAAQ,OAAAlB,CAAO,EAMpC,CAAE,MAAOkB,EAAQ,OAAAlB,CAAO,CAChC,CAAC,EAED,GAAM,CAACc,GAAGa,EAAC,EAAI,MAEXD,GAAS,GACTE,GAAoB,GAElBC,GAAajG,EAAe,qBAG5BkG,GAAiBlG,EAAe,iBAIhC,CACL,KAAMmG,GACN,IAAKC,GACL,MAAOX,GACP,OAAQY,EACT,EAAIvE,GAAc,kBAAkB,EAG9BwE,GACL,OAAO3F,GAAe,SACnBiC,EACAjC,EACAG,EACA2E,GACA1F,EACA,EACA,GAAK,EACLY,EAEE4F,GACLtG,EAAO,iBAAiB,EACxBA,EAAO,mBAAmBJ,EAAK,SAAS,EACxCI,EAAO,mBAAmBJ,EAAK,UAAU,EACzCI,EAAO,kBAAkBJ,EAAK,SAAS,EACvCI,EAAO,kBAAkBJ,EAAK,UAAU,EAGnC2G,GAAOtB,GAAIiB,GACXM,GAAMV,GAAIK,GAEV,CAAE,OAAAM,GAAQ,QAAAC,EAAQ,EAAIC,GAC3B,CACC,KAAMT,GACN,IAAKC,GACL,MAAOX,GACP,OAAQY,GACR,sBAAAjG,CACD,EACAL,CACD,EAEI8G,GAAS,GACb,GAAI9G,EAAY,iBAAkB,CACjC,GAAM,CAAE,gBAAA+G,EAAiB,iBAAAC,EAAkB,iBAAAC,CAAiB,EAC3DjH,EAED8G,GAASI,GACR,CACC,MAAOzB,GAAiB,MACxB,OAAQA,GAAiB,OACzB,GAAArF,CACD,EACA,CACC,YAAa2G,EACb,aAAcC,EACd,aAAcC,CACf,EACA9H,GAAmBa,EAAY,KAAK,GAClCoB,GACA9B,GAAcU,EAAY,KAAK,CAClC,EAEA8G,GAASK,EAAe,OAAQ,CAAC,EAAGL,EAAM,CAC3C,CAEA,IAAIM,GAAkB,GAClBC,GAAa,GACbC,GAAQ,GACRC,GAAc,GAOdC,GAAyD,CAAC,EAC1DC,GAA+C,CAAC,EAChDC,GAA4B,KAC5BC,GAAiB,EAErB,QAASnD,EAAI,EAAGA,EAAIV,EAAM,OAAQU,IAAK,CAEtC,IAAMoD,EAAS7D,GAAqBS,CAAC,EAC/BqD,EAAa9D,GAAqBS,EAAI,CAAC,EAE7C,GAAI,CAACoD,EAAQ,SAEb,IAAI5E,EAAOc,EAAMU,CAAC,EACdsD,EAAsB,KACtBC,EAAgC,GAE9BC,GAAQxH,EAAiBA,EAAewC,CAAI,EAAI,KAElDiF,GAAYL,EAAO,EACnBM,EAAaN,EAAO,EAClB3D,GAAQ2D,EAAO,MACfO,EAAOP,EAAO,KACdQ,GACLpI,EAAY,qBAAuB,cAClCA,EAAY,uBAAyB,UAAY,OAEnD,GAAImI,IAASZ,GACZ,SAID,IAAIc,GAAgB,GAOpB,GAJIF,IAAS,GAAK5B,KAAqB,IACtC2B,GAAc3B,IAGX5C,EAAW,OAAS,EAAG,CAG1B,IAAM2E,GAAiB5C,GAAiB/B,EAAWwE,CAAI,EACvD,GAAIxH,IAAc,SAAWA,IAAc,MAC1CuH,GAAcI,WACJ3H,IAAc,SACxBuH,GAAcI,GAAiB,UACrB3H,IAAc,WAEpBwH,EAAOxE,EAAW,OAAS,EAAG,CACjC,IAAM4E,GAAW1E,GAAkBsE,CAAI,EACjCK,GACLD,GAAW,EAAID,IAAkBC,GAAW,GAAK,EAClDL,GAAcM,GAASZ,EAAO,UAC9BS,GAAgB,EACjB,CAMG9H,IACH2H,EAAa,KAAK,MAAMA,CAAU,EAEpC,CAEA,IAAMO,GAAiB7E,GAAUuE,CAAI,EAC/BO,GAAiBxG,EAAO,SAASc,CAAI,EACrC2F,GAAezG,EAAO,OAAOc,CAAI,EACjC4F,GAAgBH,GAAiBC,GAEjCG,GAAsBC,IAE1B,CAACV,IACDpI,EAAY,qBAAuB,YAEnC,OAGM,CACN,WAFgB0G,GAAMoC,GAASF,GAAgBF,GAExBA,GAAiB,GACxC,YAAa,KAAK,IAAI,EAAG3H,EAAW,EAAG,CACxC,EAYD,GATKyG,GAAgBW,CAAI,IACxBX,GAAgBW,CAAI,EAAI,CACvB,KAAMD,EACN,IAAKxB,GAAMuB,GAAYW,GACvB,SAAUF,GACV,MAAOL,GAAgB3C,GAAiB/B,EAAWwE,CAAI,CACxD,GAGGvG,KAAc,IAAU,CAW3B,IAASmH,GAAT,SAAsBC,GAAmB1D,GAAe,CACvD,IAAML,GAAQ7C,GAAQkD,GAAO,WAAY7E,CAAM,EAE3CwI,GAAS,GACTC,GAAgB,EAEpB,QAAWC,MAAQlE,GAAO,CACzB,IAAMN,GAAIqE,GAAYxG,GAAqB,CAACyG,GAASE,EAAI,CAAC,EAC1D,GAKCF,IACAtE,GAAIyE,GAAgB5C,GAEpB,MAEDyC,IAAUE,GACVD,GAAgBvE,EACjB,CAEA,MAAO,CACN,OAAAsE,GACA,cAAAC,EACD,CACD,EApCIG,GAAiBxH,GACjBuH,GAAgB7G,GAAgBV,EAAa,EAC7CuH,GAAgB5C,KACnB6C,GAAiBC,GACjBF,GAAgB7G,GAAgB8G,EAAc,GAE/C,IAAME,GAAahH,GAAgBO,EAAK,EAClC0G,GAAgBrB,EAAOxE,EAAW,OAAS,EA+BjD,GA9B0BwE,EAAO,IAAMvG,KAgCrC4H,IAAiB7F,EAAWwE,CAAI,EAAI3B,KAErC,GACC0B,EAAajE,GAAQmF,GAAgBG,GACrC/C,GACC,CACD,GAAM,CAAE,OAAAyC,GAAQ,cAAAC,EAAc,EAAIH,GACjCb,EACAlF,CACD,EAEAA,EAAOiG,GAASI,GAChB9B,GAAcY,EACdX,GAAgBW,CAAI,EAAE,MAAQ,KAAK,IAClC,EACAe,GAAgB1B,GAAgBW,CAAI,EAAE,IACvC,EACAJ,EAAgC,EACjC,SAAWF,GAAcA,EAAW,OAASM,EAC5C,GAAIxH,IAAc,SAAU,CAC3B,GAAM,CAAE,OAAAsI,GAAQ,cAAAC,EAAc,EAAIH,GACjCb,EACAlF,CACD,EAEAA,EAAOiG,GAASI,GAChB9B,GAAcY,EACdX,GAAgBW,CAAI,EAAE,MAAQ,KAAK,IAClC,EACAe,GAAgB1B,GAAgBW,CAAI,EAAE,IACvC,EACAJ,EAAgC,EACjC,KAAO,CACN,IAAM0B,GAAe3F,EAAMU,EAAI,CAAC,EAE1B,CAAE,OAAAyE,GAAQ,cAAAC,EAAc,EAAIH,GACjC9E,GAAQiE,EACRuB,EACD,EAEAzG,EAAOA,EAAOiG,GAASI,GACvB9B,GAAcY,EACdX,GAAgBW,CAAI,EAAE,MAAQ,KAAK,IAClC,EACAe,GAAgB1B,GAAgBW,CAAI,EAAE,IACvC,EACAJ,EAAgC,EACjC,EAGH,CAEA,GAAIC,GAEHC,IAAa,UACH1H,EAAW,CAGrB,GACC,CAACyC,EAAK,SAAShE,EAAG,GAClB,CAAC0K,GAAe,SAAS1G,CAAI,GAC7Bc,EAAMU,EAAI,CAAC,GACXqD,GACA,CAACA,EAAW,SACZI,KAAcJ,EAAW,GACzB,CAACE,EACA,CACGL,KAAe,OAClBC,GAAiBO,GAElBR,GAAaA,KAAe,KAAO1E,EAAO0E,GAAa1E,EACvD,QACD,CAEA,IAAM2G,GACLjC,KAAe,KAAO1E,EAAO0E,GAAa1E,EACrC4G,GACLlC,KAAe,KAAOQ,EAAaP,GAC9BkC,GACLjC,EAAO,MAAQM,EAAa0B,GAEvBE,GAAOjB,GAAmBZ,EAAS,EAEnC8B,GAAM7H,EAAO,OAClByH,GAAiB,QAAQ,SAAU,EAAE,EACrC,CACC,SAAA5I,EACA,KAAM0F,GAAOmD,GAEb,IAAKlD,GAAMuB,GAAYS,GAAiBE,GACxC,cAAA1H,CACD,EACA4I,EACD,EAEAhC,EAAOiC,GAAI,KAEP3B,IAAgC2B,GAAI,OAASA,GAAI,MAAM,SACzDtC,GAAiBU,CAAI,IAAMV,GAAiBU,CAAI,EAAI,CAAC,IAAI,KACzD,GAAG4B,GAAI,KACR,EAGDrC,GAAa,KAETpH,IACHgH,IAECH,EAAe,OAAQ,CACtB,EAAGV,GAAOmD,GACV,EAAGlD,GAAMuB,GAAYW,GACrB,MAAOiB,GACP,OAAQlB,GACR,KAAM,cACN,OAAQ,UACR,eAAgB,EAChB,UAAWhC,IAAkB,OAC7B,YAAaT,GACV,QAAQA,EAAU,IAClB,MACJ,CAAC,EAEDiB,EAAe,OAAQ,CACtB,GAAIV,GAAOyB,EACX,GAAIzB,GAAOyB,EAAaN,EAAO,MAC/B,GAAIlB,GAAMuB,GAAYW,GAAgBF,GACtC,GAAIhC,GAAMuB,GAAYW,GAAgBF,GACtC,OAAQ,UACR,eAAgB,EAChB,UAAW/B,IAAkB,OAC7B,YAAaT,GACV,QAAQA,EAAU,IAClB,MACJ,CAAC,EAEJ,SAIC+B,IAAaS,GAAiBE,GAE1BR,IAAgC,CAACJ,GAAO,CAC3C,IAAM8B,GAAOjB,GAAmBZ,EAAS,EAEnC8B,GAAM7H,EAAO,OAClBc,EAAK,QAAQ,SAAU,EAAE,EACzB,CACC,SAAAjC,EACA,KAAM0F,GAAOyB,EACb,IAAKxB,GAAMuB,GACX,cAAA/G,CACD,EACA4I,EACD,EAEIC,GAAI,OAASA,GAAI,MAAM,SAEzBtC,GAAiBU,CAAI,IAAMV,GAAiBU,CAAI,EAAI,CAAC,IACpD,KAAK,GAAG4B,GAAI,KAAK,CAErB,CAGD,GAAIjC,IAAS,KACZT,IAAcS,EAAO,QACf,CACN,GAAM,CAACkC,GAAGC,EAAK,EAAIC,GAClB,CACC,QAASlH,EACT,OAAA8D,GACA,GAAA1G,EACA,KAAMqG,GAAOyB,EACb,IAAKxB,GAAMuB,GACX,MAAAhE,GACA,OAAQ0E,GACR,OAAAhC,GACA,QAAAC,GACA,MAAAoB,GACA,WAAA9B,GACA,MAAA5F,EACA,MAAO,CAAC,CAACa,CACV,EACAnB,CACD,EACA+F,IAAUiE,GACV/D,IAAqBgE,EACtB,CAEA,GAAIlC,EACH,KAEF,CAyBA,GAvBI/H,EAAY,qBACfoH,GAAkB,OAAO,QAAQI,EAAe,EAC9C,IAAI,CAAC,CAACpD,EAAW+F,CAAI,IAAM,CAC3B,GAAI,CAACA,EAAM,MAAO,GAClB,IAAMC,EAAa3C,GAAiBrD,CAAS,GAAK,CAAC,EAEnD,OAAOiG,GACN,CACC,KAAM5D,GAAO0D,EAAK,KAClB,IAAKA,EAAK,IACV,MAAOA,EAAK,MACZ,SAAUA,EAAK,SACf,WAAAjE,GACA,OAAAS,GACA,WAAAyD,CACD,EACApK,CACD,CACD,CAAC,EACA,KAAK,EAAE,GAINqH,GAAY,CACf,IAAMiD,GACJ,CAACnL,GAAmBa,EAAY,KAAK,GAAK8G,KAAWF,KAAY,EAC/D,MACAT,GAAiB,cAAcA,EAAc,KAAO,EACpD,IAAID,GAAa,mBAAmBA,EAAU,KAAO,EAAE,IACvDiB,EAAe,OAAQ,CACvB,KACCL,KACC3H,GAAmBa,EAAY,KAAK,GACnCoB,GACA9B,GAAcU,EAAY,KAAK,GAC9B,QACAA,EAAY,MAChB,EAAGqH,GACH,UAAWV,IAAkB,OAC7B,QAASC,KAAY,EAAIA,GAAU,OACnC,MAAO5F,EAAY,UAAUA,CAAS,GAAK,OAC3C,eAAgBf,EAAe,sBAC5B,GAAGA,EAAe,qBAAqB,KACvC,OACH,OAAQA,EAAe,sBACpBA,EAAe,sBACf,OACH,kBAAmBA,EAAe,sBAC/B,QACA,OACH,cAAeA,EAAe,sBAC3B,SACA,MACH,CAAC,EACD,OACA,GAEAkB,IACH8E,GAAoBkB,EAAe,OAAQ,CAC1C,EAAGE,GACH,UAAWV,IAAkB,MAC9B,CAAC,GAGFZ,KACEe,GACEA,GACAK,EACA,IACA,CAAE,OAAQ,iBAAiB/G,CAAE,GAAI,EACjCkK,EAAIlD,EACJ,EACAkD,EAAIlD,IAAmBE,EAC5B,MAAWF,KACVrB,IAAUe,GACPK,EACA,IACA,CAAE,OAAQ,iBAAiB/G,CAAE,GAAI,EACjCgH,EACA,EACAA,IAIJ,OAAInB,KACFjG,EAAY,iCAAyC,OACrDiG,IAGKF,EACR,CAEA,SAAS/D,GAAwBlC,EAAaa,EAA6B,CAE1E,IAAMoB,EAAgBjC,EAAK,KAAK,OAAO,EACvC,OAAAiC,EAAc,cAAcjC,EAAK,cAAc,EAC/CiC,EAAc,kBACbwI,GACC5J,EACA,CACC,KAAMb,EAAK,mBACX,MAAOA,EAAK,iBACZ,OAAQA,EAAK,eACb,QAASA,EAAK,sBAEd,MAAOA,EAAK,mBACZ,IAAKA,EAAK,gBACX,EACAA,EAAK,mBACL,WACD,CACD,EAEOiC,CACR,CAEA,SAASqB,GAAWJ,EAQf,CACJ,IAAM+C,EAAS,QAAQ,KAAK/C,CAAI,EAChC,OAAO+C,EACJ,CACA,MAAOA,EAAO,MACd,SAAUA,EAAO,CAAC,EAAE,MACpB,EACA,CACA,MAAO,KACP,SAAU,CACV,CACJ,CCl/BA,OAAS,uBAAAyE,OAAsC,sBCC/C,OAAOC,OAAmB,kBAQnB,SAASC,GACfC,EACAC,EACAC,EACAC,EACAC,EACC,CAGD,IAAMC,EAAgB,CAAC,EACjBC,EAAgBL,EAAW,GAAG,EAAE,EAChCM,EACLD,GACAA,EAAc,QACdA,EAAc,OAAO,OAAS,KAC9BH,EACG,CAACG,EAAc,OAAO,MACtB,IACJ,QAAWE,KAAQP,EAAY,CAC9B,GAAM,CAAE,MAAAQ,CAAM,EAAID,EAClB,GAAI,CAACH,EAAM,SAEVA,EAAM,KAAK,CACV,OAAQ,EACR,MAAAI,CACD,CAAC,EAEG,CAACD,EAAK,QACNA,EAAK,OAAO,QAAU,KAAK,SAIhC,IAAME,EACL,OAAOF,EAAK,OAAW,IACpB,OACAA,EAAK,OAAO,OAAS,IACrB,CAACA,EAAK,OAAO,MAAQD,EACrB,OACAI,EACC,GAAGH,EAAK,OAAO,KAAK,GAAGA,EAAK,OAAO,IAAI,GACvCN,EAAe,SACfF,EACAE,EACA,EACD,CACA,EAAIF,EAERK,EAAM,KAAK,CACV,OAAAK,EACA,MAAAD,CACD,CAAC,CACF,CACKJ,EAAM,QACVA,EAAM,KAAK,CACV,OAAQ,EACR,MAAO,aACR,CAAC,EAGF,IAAMO,EAAWP,EAAMA,EAAM,OAAS,CAAC,EACnCO,EAAS,SAAW,IACnB,OAAOA,EAAS,OAAW,IAC9BA,EAAS,OAAS,EACRT,EACVE,EAAMA,EAAM,OAAS,CAAC,EAAI,CACzB,OAAQ,EACR,MAAOO,EAAS,KACjB,EAEAP,EAAM,KAAK,CACV,OAAQ,EACR,MAAOO,EAAS,KACjB,CAAC,GAIH,IAAIC,EAAe,EACfC,EAAW,EAEf,QAASC,EAAI,EAAGA,EAAIV,EAAM,OAAQU,IACjC,GAAI,OAAOV,EAAMU,CAAC,EAAE,OAAW,IAAa,CAG3C,IADID,EAAWC,IAAGD,EAAWC,GACtB,OAAOV,EAAMS,CAAQ,EAAE,OAAW,KAAaA,IAEtDT,EAAMU,CAAC,EAAE,QACNV,EAAMS,CAAQ,EAAE,OAAST,EAAMQ,CAAY,EAAE,SAC7CC,EAAWD,IACXE,EAAIF,GACNR,EAAMQ,CAAY,EAAE,MACtB,MACCA,EAAeE,EAIjB,OAAIX,IAAS,OACLC,EAAM,IAAIG,GAAQ,CACxB,IAAMC,EAAQX,GAAcU,EAAK,KAAK,EACtC,OAAKC,EACDA,EAAM,QAAU,EACZ,CAAE,GAAGD,EAAM,MAAO,kBAAmB,EAErC,CACN,GAAGA,EACH,MAAO,uBAAuBC,EAAM,KAAK,GAC1C,EAPkBD,CASpB,CAAC,EAGKH,CACR,CDpHO,SAASW,GACf,CACC,GAAAC,EACA,MAAAC,EACA,OAAAC,EACA,QAAAC,EACA,QAAAC,CACD,EAOAC,EACAC,EACAC,EACAC,EACAC,EACC,CACD,IAAMC,EAASC,GAAoBN,CAAK,EAClC,CAACO,EAAYC,CAAW,EAAIP,EAC5BQ,EAAYT,EAAM,WAAW,WAAW,EAG1CU,EAAQC,EAAQC,EAEpB,GAAIP,EAAO,YAAY,OAAS,cAC/BK,EAASG,GAAuBR,EAAO,YAAY,KAAK,EAExDM,EAAS,KAAK,KACb,KAAK,KAAKD,EAAO,GAAKA,EAAO,IAAMH,EAAY,CAAC,EAC/C,KAAK,KAAKG,EAAO,GAAKA,EAAO,IAAMF,EAAa,CAAC,CACnD,UACUH,EAAO,YAAY,OAAS,UAAW,CACjD,GAAM,CAAE,OAAQS,EAAG,GAAGC,CAAE,EAAIC,GAC1BC,GACA,GAAGZ,EAAO,YAAY,MAAM,KAAK,GAAGA,EAAO,YAAY,MAAM,IAAI,EAClE,EACC,IACA,KAAK,GACNE,EACAC,CACD,EAEAG,EAASG,EACTJ,EAASK,CACV,CAEAH,EAAMH,EACHS,GAAeb,EAAO,MAAOM,EAAQD,EAAQP,CAAgB,EAC7DO,EAEH,IAAMS,EAAQC,GACbX,EAAYY,GAAsBhB,EAAO,MAAOM,CAAM,EAAIA,EAC1DN,EAAO,MACPF,EACAM,EACAL,CACD,EAEMkB,EAAa,YAAY3B,CAAE,GAC3B4B,EAAY,kBAAkB5B,CAAE,GAEhC6B,EAAOC,EACZ,UACA,CACC,GAAIF,EACJ,EAAGrB,EAAQ,CAAC,EAAIN,EAChB,EAAGM,EAAQ,CAAC,EAAIL,EAChB,MAAOC,EAAUS,EAAaX,EAAQ,IACtC,OAAQG,EAAUS,EAAcX,EAAS,IACzC,aAAc,mBACf,EACA4B,EACC,iBACA,CACC,GAAIH,EACJ,GAAGV,EACH,aAAcH,EAAY,SAAW,KACtC,EACAU,EACE,IAAIO,GACJD,EAAe,OAAQ,CACtB,QAASC,EAAK,QAAU,GAAK,IAAM,IACnC,aAAcA,EAAK,KACpB,CAAC,CACF,EACC,KAAK,EAAE,CACV,EACCD,EAAe,OAAQ,CACtB,EAAG,EACH,EAAG,EACH,MAAOlB,EACP,OAAQC,EACR,KAAM,QAAQc,CAAU,GACzB,CAAC,CACH,EACA,MAAO,CAACC,EAAWC,CAAI,CACxB,CAEA,SAASH,GAAsBF,EAAoBR,EAAgB,CAClE,IAAMgB,EAAOR,EAAMA,EAAM,OAAS,CAAC,EAC7B,CAAE,OAAAS,CAAO,EAAID,EACnB,OAAKC,EAEDA,EAAO,OAAS,IAAa,OAAOA,EAAO,KAAK,EAAI,IAAOjB,EAExD,OAAOiB,EAAO,KAAK,EAJNjB,CAKrB,CAEA,SAASE,GAAuBgB,EAAa,CAC5C,IAAIC,EAAK,EACRC,EAAK,EACLC,EAAK,EACLC,EAAK,EAEN,OAAIJ,EAAI,SAAS,KAAK,EACrBE,EAAK,EACKF,EAAI,SAAS,QAAQ,IAC/BI,EAAK,GAGFJ,EAAI,SAAS,MAAM,EACtBC,EAAK,EACKD,EAAI,SAAS,OAAO,IAC9BG,EAAK,GAGF,CAACF,GAAM,CAACE,GAAM,CAACD,GAAM,CAACE,IACzBF,EAAK,GAGC,CAAE,GAAAD,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAC,CAAG,CACzB,CAKA,SAASjB,GAAgBkB,EAAWC,EAAWC,EAAW,CACzD,IAAMC,EAAI,KAAK,IAAID,EAAID,EAAG,CAAC,EAG3BD,GAAMA,GAAK,KAAK,GAAK,GAAM,KAAK,GAAK,IAAM,KAAK,GAAK,GAErD,IAAIJ,EAAIC,EAAIC,EAAIC,EAAItB,EAAQ2B,EAAKC,EAAGC,EAE9BC,EAAOC,GAAkB,CAC9B,GAAIA,IAAU,EAAG,CAChBZ,EAAK,EACLC,EAAKK,EACLJ,EAAK,EACLC,EAAK,EACLtB,EAASyB,EACT,MACD,SAAWM,IAAU,KAAK,GAAK,EAAG,CACjCZ,EAAK,EACLC,EAAK,EACLC,EAAKG,EACLF,EAAK,EACLtB,EAASwB,EACT,MACD,CACA,GAAIO,EAAQ,GAAKA,EAAQ,KAAK,GAAK,EAAG,CACrCZ,GACGO,EAAIF,EAAK,EAAI,KAAK,IAAIO,CAAK,EAAIN,EAAI,IACpC,KAAK,IAAIM,CAAK,EAAIL,EAAI,KAAK,IAAIK,CAAK,GACtCX,EAAK,KAAK,IAAIW,CAAK,EAAIZ,EAAKM,EAC5BJ,EAAK,KAAK,IAAIG,EAAI,EAAIL,CAAE,EAAIK,EAAI,EAChCF,EAAKG,EAAI,EAAI,KAAK,IAAIL,EAAKK,EAAI,CAAC,EAChCzB,EAAS,KAAK,KAAK,KAAK,IAAIqB,EAAKF,EAAI,CAAC,EAAI,KAAK,IAAIG,EAAKF,EAAI,CAAC,CAAC,EAG9DQ,GACEJ,EAAI,EAAI,KAAK,IAAIO,CAAK,EAAIN,EAAI,IAC9B,KAAK,IAAIM,CAAK,EAAI,EAAI,KAAK,IAAIA,CAAK,GACtCF,EAAI,KAAK,IAAIE,CAAK,EAAIH,EAAIH,EAC1BzB,EACC,EAAI,KAAK,KAAK,KAAK,IAAIwB,EAAI,EAAII,EAAG,CAAC,EAAI,KAAK,IAAIH,EAAI,EAAII,EAAG,CAAC,CAAC,EAC9D,MACD,SAAWE,EAAQ,KAAK,GAAK,GAAKA,EAAQ,KAAK,GAAI,CAClDZ,GACEM,EAAI,EAAKC,EAAIF,EAAK,EAAI,KAAK,IAAIO,CAAK,IACpC,KAAK,IAAIA,CAAK,EAAIL,EAAI,KAAK,IAAIK,CAAK,GACtCX,EAAK,KAAK,IAAIW,CAAK,EAAIZ,EACvBE,EAAK,KAAK,IAAIG,EAAI,EAAIL,CAAE,EAAIK,EAAI,EAChCF,EAAKG,EAAI,EAAI,KAAK,IAAIL,EAAKK,EAAI,CAAC,EAGhCG,GACEJ,EAAI,EAAI,KAAK,IAAIO,CAAK,EAAIN,EAAI,IAC9B,KAAK,IAAIM,CAAK,EAAI,EAAI,KAAK,IAAIA,CAAK,GACtCF,EAAI,KAAK,IAAIE,CAAK,EAAIH,EACtB5B,EACC,EAAI,KAAK,KAAK,KAAK,IAAIwB,EAAI,EAAII,EAAG,CAAC,EAAI,KAAK,IAAIH,EAAI,EAAII,EAAG,CAAC,CAAC,EAC9D,MACD,MAAWE,GAAS,KAAK,KACxBD,EAAIC,EAAQ,KAAK,EAAE,EAEnBJ,EAAMR,EACNA,EAAKE,EACLA,EAAKM,EACLA,EAAMP,EACNA,EAAKE,EACLA,EAAKK,EAEP,EAEA,OAAAG,EAAIP,CAAC,EAEE,CACN,GAAIJ,EAAKK,EACT,GAAIJ,EAAKK,EACT,GAAIJ,EAAKG,EACT,GAAIF,EAAKG,EACT,OAAAzB,CACD,CACD,CAEA,SAASO,GACRC,EACAR,EACAD,EAMAP,EACC,CACD,GAAM,CAAE,GAAA2B,EAAI,GAAAE,EAAI,GAAAD,EAAI,GAAAE,CAAG,EAAIvB,EACrBiC,EAAMxB,EAAM,CAAC,EAAE,OAElBA,EAAM,CAAC,EAAE,OAAO,OAAS,IACzB,OAAOA,EAAM,CAAC,EAAE,OAAO,KAAK,EAAI,IAChCyB,EACA,GAAGzB,EAAM,CAAC,EAAE,OAAO,KAAK,GAAGA,EAAM,CAAC,EAAE,OAAO,IAAI,GAC/ChB,EAAiB,SACjBQ,EACAR,EACA,EACA,EAAIQ,EATJ,EAUGkC,EAAM1B,EAAM,GAAG,EAAE,EAAE,OAEtBA,EAAM,GAAG,EAAE,EAAE,OAAO,OAAS,IAC7B,OAAOA,EAAM,GAAG,EAAE,EAAE,OAAO,KAAK,EAAI,IACpCyB,EACA,GAAGzB,EAAM,GAAG,EAAE,EAAE,OAAO,KAAK,GAAGA,EAAM,GAAG,EAAE,EAAE,OAAO,IAAI,GACvDhB,EAAiB,SACjBQ,EACAR,EACA,EACA,EAAIQ,EATJ,EAWGmC,GAAMd,EAAKF,GAAMa,EAAKb,EACtBiB,GAAMd,EAAKF,GAAMY,EAAKZ,EACtBiB,GAAMhB,EAAKF,GAAMe,EAAKf,EACtBmB,GAAMhB,EAAKF,GAAMc,EAAKd,EAE5B,MAAO,CACN,GAAIe,EACJ,GAAIC,EACJ,GAAIC,EACJ,GAAIC,CACL,CACD,CE7QA,OACC,uBAAAC,OAIM,sBAIA,SAASC,GACf,CACC,GAAAC,EACA,MAAAC,EACA,OAAAC,EACA,QAAAC,EACA,QAAAC,CACD,EAOAC,EACAC,EACAC,EACAC,EACAC,EACC,CA5BF,IAAAC,GA6BC,GAAM,CACL,MAAAC,EACA,MAAOC,EACP,SAAAC,EACA,KAAAC,EACA,UAAAC,CACD,EAAIC,GAAoBX,CAAK,EACvB,CAACY,EAAQC,CAAM,EAAIZ,EAErBa,EAAaF,EAAS,EACtBG,EAAaF,EAAS,EAEpBG,EAAMC,GACXT,EAAS,EACTA,EAAS,EACTI,EACAC,EACAV,EAAiB,SACjBA,CACD,EACAW,EAAKE,EAAI,EACTD,EAAKC,EAAI,EAET,IAAME,EAAuBC,GAC5BvB,EACAW,EACAG,EACAP,CACD,EAEMiB,EAAQC,GACbH,EACAX,EACAJ,EACAO,EACAN,CACD,EAEMkB,EAAa,iBAAiB3B,CAAE,GAChC4B,EAAY,kBAAkB5B,CAAE,GAChC6B,EAAS,eAAe7B,CAAE,GAG1B8B,EAASC,GACdpB,EACAG,EACAN,EAAiB,SACjB,CAAE,EAAGW,EAAI,EAAGC,CAAG,EACf,CAACH,EAAQC,CAAM,EACfV,EACAO,CACD,EAEMiB,GAAQC,GACbtB,EACAH,EAAiB,SACjBI,EACA,CAACK,EAAQC,CAAM,EACfV,EACAO,EACAe,CACD,EAGMI,GAAOC,EACZ,UACA,CACC,GAAIP,EACJ,EAAGrB,EAAQ,CAAC,EAAIN,EAChB,EAAGM,EAAQ,CAAC,EAAIL,EAChB,MAAOC,EAAUc,EAAShB,EAAQ,IAClC,OAAQG,EAAUc,EAAShB,EAAS,IACpC,aAAc,mBACf,EACAiC,EACC,iBACA,CACC,GAAIR,EACJ,GAAGK,EACJ,EACAP,EACE,IAAIW,IACJD,EAAe,OAAQ,CACtB,OAAQC,GAAK,QAAU,EACvB,aAAcA,GAAK,KACpB,CAAC,CACF,EACC,KAAK,EAAE,CACV,EACCD,EACC,OACA,CACC,GAAIN,CACL,EACAM,EAAe,OAAQ,CACtB,EAAG,EACH,EAAG,EACH,MAAOlB,EACP,OAAQC,EACR,KAAM,MACP,CAAC,CACF,EACAiB,EAAe,OAAQ,CACtB,EAAG,EACH,EAAG,EACH,MAAOlB,EACP,OAAQC,EACR,OAAMR,GAAAe,EAAM,GAAG,EAAE,IAAX,YAAAf,GAAc,QAAS,aAC9B,CAAC,EACDyB,EAAexB,EAAO,CACrB,GAAIQ,EACJ,GAAIC,EACJ,MAAOH,EACP,OAAQC,EACR,GAAGY,EACH,KAAM,QAAQH,CAAU,IACxB,KAAM,QAAQE,CAAM,GACrB,CAAC,CACH,EAGA,MADe,CAACD,EAAWM,EAAI,CAEhC,CAIA,SAASV,GACRvB,EACAwB,EACAV,EACAP,EACC,CACD,GAAI,CAACO,EAAW,OAAOd,EACvB,IAAMoC,EAAWZ,EAAM,GAAG,EAAE,EAC5B,MAAI,CAACY,GAAY,CAACA,EAAS,QAAUA,EAAS,OAAO,OAAS,IACtDpC,EAEDqC,EACN,GAAGD,EAAS,OAAO,KAAK,GAAGA,EAAS,OAAO,IAAI,GAC/C,CAAC7B,EAAiB,SAClBP,EACAO,EACA,EACD,CACD,CAEA,SAASc,GACRH,EACAC,EACAH,EACAC,EACAqB,EACAC,EACC,CACD,IAAMnB,EAAgC,CAAE,EAAGJ,EAAS,EAAG,EAAGC,EAAS,CAAE,EACrE,OAAIC,EAAG,OAAS,UACf,OAAO,OACNE,EACAoB,GAAQtB,EAAG,MAA0BF,EAAQC,EAAQ,GAAG,CACzD,EAEAG,EAAI,EACHiB,EACC,GAAGnB,EAAG,MAAM,KAAK,GAAGA,EAAG,MAAM,IAAI,GACjCoB,EACAtB,EACAuB,EACA,EACD,GAAKvB,EAAS,EAGZG,EAAG,OAAS,UACf,OAAO,OACNC,EACAoB,GAAQrB,EAAG,MAA0BH,EAAQC,EAAQ,GAAG,CACzD,EAEAG,EAAI,EACHiB,EACC,GAAGlB,EAAG,MAAM,KAAK,GAAGA,EAAG,MAAM,IAAI,GACjCmB,EACArB,EACAsB,EACA,EACD,GAAKtB,EAAS,EAGTG,CACR,CAEA,SAASoB,GACRC,EACAzB,EACAC,EACAyB,EACC,CACD,OAAQD,EAAK,CACZ,IAAK,SACJ,MAAO,CAAE,CAACC,CAAG,EAAGA,IAAQ,IAAM1B,EAAS,EAAIC,EAAS,CAAE,EACvD,IAAK,OACJ,MAAO,CAAE,EAAG,CAAE,EACf,IAAK,MACJ,MAAO,CAAE,EAAG,CAAE,EACf,IAAK,QACJ,MAAO,CAAE,EAAGD,CAAO,EACpB,IAAK,SACJ,MAAO,CAAE,EAAGC,CAAO,CACrB,CACD,CAIA,SAASe,GACRtB,EACA4B,EACA3B,EACA,CAACK,EAAQC,CAAM,EACfV,EACAO,EACAe,EACC,CACD,GAAM,CAAE,EAAAc,EAAG,GAAAC,EAAI,MAAAC,EAAQ,CAAE,EAAIhB,EAC7B,GAAI,CAACf,EACJ,MAAO,CACN,aAAc,KACf,EAED,IAAMgC,EAAOnC,EAAW,GAAG,EAAE,EACvBoC,EAASrC,IAAU,SAAWiC,EAAI,EAAIC,EAAK,EACjD,MAAO,CACN,aAAc,SACd,GAAI,MACJ,GAAI,MACJ,EACCE,EAAK,OAAO,OAAS,IAClB,GACC,OAAOA,EAAK,OAAO,KAAK,EACxB,KAAK,IAAI7B,EAASD,EAAQ,CAAC,EAC5B6B,CACA,IACA,OACAR,EACC,GAAGS,EAAK,OAAO,KAAK,GAAGA,EAAK,OAAO,IAAI,GACvCR,EACAtB,EACAT,EACA,EACD,EAAIwC,CACJ,CACL,CACD,CAEA,SAASjB,GACRpB,EACAsC,EACAV,EACAW,EACAC,EACA3C,EACAO,EACC,CACD,GAAM,CAACE,EAAQC,CAAM,EAAIiC,EACnB,CAAE,EAAGhC,EAAI,EAAGC,CAAG,EAAI8B,EACnBpB,EAAiC,CAAC,EACpCsB,EAAK,EACLC,EAAK,EAET,GAAIC,GAAgBL,CAAW,EAAG,CACjC,GAAIA,EAAY,KAAKM,GAAKA,EAAE,MAAM,MAAM,WAAW,GAAG,CAAC,EACtD,MAAM,IAAI,MACT,yIACD,EAED,OAAI5C,IAAU,SACb,OAAO,OAAOmB,EAAQ,CACrB,EAAG,OACFQ,EACC,GAAGW,EAAY,CAAC,EAAE,MAAM,KAAK,GAAGA,EAAY,CAAC,EAAE,MAAM,IAAI,GACzDV,EACAtB,EACAT,EACA,EACD,CACD,CACD,CAAC,EAED,OAAO,OAAOsB,EAAQ,CACrB,GAAI,OACHQ,EACC,GAAGW,EAAY,CAAC,EAAE,MAAM,KAAK,GAAGA,EAAY,CAAC,EAAE,MAAM,IAAI,GACzDV,EACAtB,EACAT,EACA,EACD,CACD,EACA,GAAI,OACH8B,EACC,GAAGW,EAAY,CAAC,EAAE,MAAM,KAAK,GAAGA,EAAY,CAAC,EAAE,MAAM,IAAI,GACzDV,EACArB,EACAV,EACA,EACD,CACD,CACD,CAAC,EAEFgD,GAAY1B,EAAQb,EAAQC,EAAQC,EAAIC,EAAIL,EAAWJ,CAAK,EACrDmB,CACR,CAEA,OAAQmB,EAAY,CAAC,EAAE,MAAO,CAC7B,IAAK,kBACJG,EAAK,KAAK,IAAI,KAAK,IAAInC,EAASE,CAAE,EAAG,KAAK,IAAIA,CAAE,CAAC,EACjDkC,EAAK,KAAK,IAAI,KAAK,IAAInC,EAASE,CAAE,EAAG,KAAK,IAAIA,CAAE,CAAC,EACjD,MACD,IAAK,iBACJgC,EAAK,KAAK,IAAI,KAAK,IAAInC,EAASE,CAAE,EAAG,KAAK,IAAIA,CAAE,CAAC,EACjDkC,EAAK,KAAK,IAAI,KAAK,IAAInC,EAASE,CAAE,EAAG,KAAK,IAAIA,CAAE,CAAC,EACjD,MACD,IAAK,gBACJ,OAAIT,IAAU,SACbmB,EAAO,EAAI,KAAK,IACf,KAAK,IAAIb,EAASE,CAAE,EACpB,KAAK,IAAIA,CAAE,EACX,KAAK,IAAID,EAASE,CAAE,EACpB,KAAK,IAAIA,CAAE,CACZ,GAEAU,EAAO,GAAK,KAAK,IAAI,KAAK,IAAIb,EAASE,CAAE,EAAG,KAAK,IAAIA,CAAE,CAAC,EACxDW,EAAO,GAAK,KAAK,IAAI,KAAK,IAAIZ,EAASE,CAAE,EAAG,KAAK,IAAIA,CAAE,CAAC,GAEzDoC,GAAY1B,EAAQb,EAAQC,EAAQC,EAAIC,EAAIL,EAAWJ,CAAK,EACrDmB,EACR,IAAK,eACJ,OAAInB,IAAU,SACbmB,EAAO,EAAI,KAAK,IACf,KAAK,IAAIb,EAASE,CAAE,EACpB,KAAK,IAAIA,CAAE,EACX,KAAK,IAAID,EAASE,CAAE,EACpB,KAAK,IAAIA,CAAE,CACZ,GAEAU,EAAO,GAAK,KAAK,IAAI,KAAK,IAAIb,EAASE,CAAE,EAAG,KAAK,IAAIA,CAAE,CAAC,EACxDW,EAAO,GAAK,KAAK,IAAI,KAAK,IAAIZ,EAASE,CAAE,EAAG,KAAK,IAAIA,CAAE,CAAC,GAEzDoC,GAAY1B,EAAQb,EAAQC,EAAQC,EAAIC,EAAIL,EAAWJ,CAAK,EAErDmB,CACT,CACA,OAAInB,IAAU,SACbmB,EAAO,EAAI,KAAK,KAAKsB,EAAKA,EAAKC,EAAKA,CAAE,EAEtC,OAAO,OAAOvB,EAAQ2B,GAAIL,EAAIC,CAAE,CAAC,EAGlCG,GAAY1B,EAAQb,EAAQC,EAAQC,EAAIC,EAAIL,EAAWJ,CAAK,EAErDmB,CACR,CAGA,SAAS0B,GACR1B,EACAb,EACAC,EACAC,EACAC,EACAL,EACAJ,EACC,CACD,GAAII,EACH,GAAIJ,IAAU,UAAW,CACxB,IAAM+C,EAAM,KAAK,IAAI,KAAK,IAAIzC,EAASE,CAAE,EAAG,KAAK,IAAIA,CAAE,CAAC,EAClDwC,EAAM,KAAK,IAAI,KAAK,IAAIzC,EAASE,CAAE,EAAG,KAAK,IAAIA,CAAE,CAAC,EAElD,CAAE,GAAIwC,EAAK,GAAIC,CAAI,EAAIJ,GAAIC,EAAKC,CAAG,EAEzC7B,EAAO,MAAQ,KAAK,IAAI8B,EAAM9B,EAAO,GAAI+B,EAAM/B,EAAO,EAAE,EACpDA,EAAO,MAAQ,IAClBA,EAAO,IAAMA,EAAO,MACpBA,EAAO,IAAMA,EAAO,MAEtB,KAAO,CACN,IAAM4B,EAAM,KAAK,IAAI,KAAK,IAAIzC,EAASE,CAAE,EAAG,KAAK,IAAIA,CAAE,CAAC,EAClDwC,EAAM,KAAK,IAAI,KAAK,IAAIzC,EAASE,CAAE,EAAG,KAAK,IAAIA,CAAE,CAAC,EAElD0C,EAAK,KAAK,KAAKJ,EAAMA,EAAMC,EAAMA,CAAG,EAE1C7B,EAAO,MAAQgC,EAAKhC,EAAO,EACvBA,EAAO,MAAQ,IAClBA,EAAO,EAAIgC,EAEb,CAEF,CAEA,SAASL,GAAIL,EAAYC,EAAY,CAGpC,IAAMP,EAAQO,IAAO,EAAID,EAAKC,EAAK,EAEnC,GAAID,IAAO,EACV,MAAO,CACN,GAAI,EACJ,GAAI,CACL,EACM,CAMN,IAAMW,EAAK,KAAK,KAAKX,EAAKA,EAAKC,EAAKA,EAAKP,EAAQA,CAAK,EAAIA,EAC1D,MAAO,CACN,GAAAiB,EACA,GAAIA,EAAKjB,CACV,CACD,CACD,CAEA,SAASQ,GAAgBC,EAMtB,CACF,MAAO,CAACA,EAAE,KAAKS,GAAKA,EAAE,OAAS,SAAS,CACzC,CCpcA,OAAOC,OAAmB,kBAa1B,SAASC,GAAgBC,EAAoBC,EAAc,CAC1D,OAAI,OAAOD,GAAM,UAAYA,EAAE,SAAS,GAAG,EAClCC,EAAO,WAAWD,CAAC,EAAK,IAE1B,CAACA,CACT,CAEA,SAASE,GACRC,EACAC,EACAC,EACAC,EACAC,EACmB,CACnB,GAAI,CAACD,GAAc,CAACC,EACnB,MAAO,CAACH,EAAgBC,CAAe,EAGxC,GAAIF,IAAY,QAAS,CAExB,IAAMK,EAASJ,EAAiBE,EAC1BG,EAASJ,EAAkBE,EAC3BG,EAAQ,KAAK,IAAIF,EAAQC,CAAM,EACrC,MAAO,CAACH,EAAaI,EAAOH,EAAcG,CAAK,CAChD,CAEA,GAAIP,IAAY,UAAW,CAE1B,IAAMK,EAASJ,EAAiBE,EAC1BG,EAASJ,EAAkBE,EAC3BG,EAAQ,KAAK,IAAIF,EAAQC,CAAM,EACrC,MAAO,CAACH,EAAaI,EAAOH,EAAcG,CAAK,CAChD,CAGA,GAAIP,IAAY,QAAUA,EAAQ,SAAS,MAAM,EAAG,CACnD,IAAMQ,EAAQR,EAAQ,MAAM,GAAG,EACzBS,EAAYD,EAAM,CAAC,GAAK,OACxBE,EAAaF,EAAM,CAAC,GAAKA,EAAM,CAAC,GAAK,OAEvCG,EAAaR,EACbS,EAAcR,EAElB,GAAIK,IAAc,QAAUC,IAAe,OAAQ,CAElD,IAAMG,EAAejB,GAAgBc,EAAYR,CAAe,EAChEU,EAAcC,EACdF,EAAcR,EAAaC,EAAeS,CAC3C,SAAWH,IAAe,QAAUD,IAAc,OAAQ,CAEzD,IAAMK,EAAclB,GAAgBa,EAAWR,CAAc,EAC7DU,EAAaG,EACbF,EAAeR,EAAcD,EAAcW,CAC5C,CAGA,MAAO,CAACH,EAAYC,CAAW,CAChC,CAEA,MAAO,CAACX,EAAgBC,CAAe,CACxC,CAEA,IAAMa,GAA6C,CAClD,OAAQ,OACR,OAAQ,MACR,KAAM,KACN,MAAO,OACP,IAAK,IACN,EAEO,SAASC,GAAoBC,EAAuC,CAC1E,GAAI,CAACA,EACJ,MAAO,CAAE,EAAG,KAAM,EAAG,IAAK,EAG3B,IAAMT,EAAQS,EAAI,MAAM,GAAG,EAAE,OAAO,OAAO,EAE3C,GAAIT,EAAM,SAAW,EAAG,CACvB,IAAMU,EAAOV,EAAM,CAAC,EAEpB,OAAIU,KAAQH,GACPG,IAAS,OAASA,IAAS,SACvB,CAAE,EAAG,MAAO,EAAGH,GAAmBG,CAAI,CAAE,EAGzC,CAAE,EAAGH,GAAmBG,CAAI,EAAG,EAAG,KAAM,EAGzC,CAAE,EAAGA,EAAM,EAAG,KAAM,CAC5B,CAEA,MAAO,CACN,EAAGH,GAAmBP,EAAM,CAAC,CAAC,GAAKA,EAAM,CAAC,EAC1C,EAAGO,GAAmBP,EAAM,CAAC,CAAC,GAAKA,EAAM,CAAC,CAC3C,CACD,CAEO,SAASW,GACfC,EACAC,EACAC,EACS,CACT,GAAIF,EAAS,SAAS,GAAG,EAAG,CAC3B,IAAMG,EAAa,WAAWH,CAAQ,EAAI,IAE1C,OAAQC,EAAgBC,GAAaC,CACtC,CAEA,GAAI,CACH,IAAMC,EAAS,IAAIC,GAAaL,CAAQ,EAExC,OAAOI,EAAO,OAAS,UAAYA,EAAO,OAAS,SAChDA,EAAO,MACP5B,GAAgB4B,EAAO,MAAQA,EAAO,KAAMH,CAAa,CAC7D,MAAQ,CACP,MAAO,EACR,CACD,CAEA,SAASK,GACRT,EACA,CACC,EAAAU,EACA,EAAAC,EACA,SAAAC,EACA,SAAAC,CACD,EAMC,CACD,OACCb,EACGA,EACC,MAAM,GAAG,EACT,IAAIc,GAAS,CACb,GAAI,CACH,IAAMP,EAAS,IAAIC,GAAaM,CAAK,EACrC,OAAOP,EAAO,OAAS,UACtBA,EAAO,OAAS,SACdA,EAAO,MACPA,EAAO,MAAQA,EAAO,IAC1B,MAAY,CACX,OAAO,IACR,CACD,CAAC,EACA,OAAO3B,GAAKA,IAAM,IAAI,EACvB,CAACgC,EAAUC,CAAQ,GACrB,IAAI,CAACjC,EAAGmC,IAAUpC,GAAgBC,EAAG,CAAC8B,EAAGC,CAAC,EAAEI,CAAK,CAAC,CAAC,CACtD,CAEA,eAAOC,GACN,CACC,GAAAC,EACA,MAAAC,EACA,OAAAC,EACA,KAAAC,EACA,IAAAC,CACD,EACA,CAAE,MAAAC,EAAO,KAAAC,EAAM,SAAAC,EAAU,OAAAC,CAAO,EAChCC,EACAC,EACoB,CAEpBF,EAASA,GAAU,SACnBE,EAAOA,GAAQ,aAEf,IAAMC,EAAUH,IAAW,YAAcA,IAAW,SAC9CI,EAAUJ,IAAW,YAAcA,IAAW,SAG9CK,EACLP,IACCA,IAAS,SACTA,IAAS,WACTA,IAAS,QACTA,EAAK,SAAS,MAAM,GAMhBQ,EACLT,EAAM,WAAW,kBAAkB,GACnCA,EAAM,WAAW,4BAA4B,GAC7CA,EAAM,WAAW,kBAAkB,GACnCA,EAAM,WAAW,4BAA4B,EAExCU,EACLF,GAAiBC,EACd,CAACb,EAAOC,CAAM,EACdW,EACA,CAAC,EAAG,CAAC,EACLrB,GAAiBc,EAAM,CACvB,EAAGL,EACH,EAAGC,EACH,SAAUD,EACV,SAAUC,CACV,CAAC,EACCc,EAAUxB,GAAiBe,EAAU,CAC1C,EAAGN,EACH,EAAGC,EACH,SAAU,EACV,SAAU,CACX,CAAC,EAED,GACCG,EAAM,WAAW,kBAAkB,GACnCA,EAAM,WAAW,4BAA4B,EAE7C,OAAOY,GACN,CAAE,GAAAjB,EAAI,MAAAC,EAAO,OAAAC,EAAQ,QAAAS,EAAS,QAAAC,CAAQ,EACtCP,EACAU,EACAC,EACAP,EACAC,CACD,EAGD,GACCL,EAAM,WAAW,kBAAkB,GACnCA,EAAM,WAAW,4BAA4B,EAE7C,OAAOa,GACN,CAAE,GAAAlB,EAAI,MAAAC,EAAO,OAAAC,EAAQ,QAAAS,EAAS,QAAAC,CAAQ,EACtCP,EACAU,EACAC,EACAP,EACAC,CACD,EAGD,GAAIL,EAAM,WAAW,MAAM,EAAG,CAC7B,GAAM,CAACc,EAAKlD,EAAYC,CAAW,EAAI,MAAMkD,GAC5Cf,EAAM,MAAM,EAAG,EAAE,CAClB,EAEIgB,EACAC,EAEJ,GAAIT,EAAe,CAElB,GAAM,CAACU,EAAWC,CAAU,EAAI3D,GAC/ByC,EACAL,EACAC,EACAjC,EACAC,CACD,EACAmD,EAAgBE,EAChBD,EAAiBE,CAClB,KAAO,CAEN,IAAMC,EAA4BjC,GAAiBc,EAAM,CACxD,EAAGL,EACH,EAAGC,EACH,SAAU,EACV,SAAU,CACX,CAAC,EACDmB,EACCX,IAAS,OACNzC,GAAcwD,EAA0B,CAAC,EACzCA,EAA0B,CAAC,GAAKxD,EACpCqD,EACCZ,IAAS,OACNxC,GAAeuD,EAA0B,CAAC,EAC1CA,EAA0B,CAAC,GAAKvD,CACrC,CAEA,GAAI2C,EAAe,CAGlB,IAAMa,EAAS5C,GAAoByB,CAAQ,EACrCoB,EAAe1C,GACpByC,EAAO,EACPzB,EACAoB,CACD,EACMO,EAAe3C,GACpByC,EAAO,EACPxB,EACAoB,CACD,EAEA,MAAO,CACN,YAAYtB,CAAE,GACd6B,EACC,UACA,CACC,GAAI,YAAY7B,CAAE,GAClB,oBAAqB,iBACrB,aAAc,iBACd,GAAIW,EAAUgB,EAAe,GAAKxB,EAClC,GAAIS,EAAUgB,EAAe,GAAKxB,EAClC,MAAOO,EAAUU,EAAgB,OACjC,OAAQT,EAAUU,EAAiB,MACpC,EACAO,EAAe,QAAS,CACvB,EAAGlB,EAAU,EAAIgB,EACjB,EAAGf,EAAU,EAAIgB,EACjB,MAAOP,EACP,OAAQC,EACR,oBAAqB,OACrB,KAAMH,CACP,CAAC,CACF,CACD,CACD,CAEA,MAAO,CACN,YAAYnB,CAAE,GACd6B,EACC,UACA,CACC,GAAI,YAAY7B,CAAE,GAClB,oBAAqB,iBACrB,aAAc,iBACd,EAAGgB,EAAQ,CAAC,EAAIb,EAChB,EAAGa,EAAQ,CAAC,EAAIZ,EAChB,MAAOO,EAAUU,EAAgB,OACjC,OAAQT,EAAUU,EAAiB,MACpC,EACAO,EAAe,QAAS,CACvB,EAAG,EACH,EAAG,EACH,MAAOR,EACP,OAAQC,EACR,oBAAqB,OACrB,KAAMH,CACP,CAAC,CACF,CACD,CACD,CAEA,GAAI1D,GAAc4C,CAAK,EAAG,CACzB,IAAMyB,EAAWrE,GAAc4C,CAAK,EAC9B,CAAC0B,EAAGC,EAAGC,EAAGC,CAAC,EAAIJ,EAAS,OAExBK,EAAQ,QAAQJ,CAAC,IAAIC,CAAC,IAAIC,CAAC,IADnBC,IAAM,OAAYA,EAAI,CACM,IAE1C,MAAO,CACN,YAAYlC,CAAE,GACd6B,EACC,UACA,CACC,GAAI,YAAY7B,CAAE,GAClB,oBAAqB,iBACrB,aAAc,iBACd,EAAGG,EACH,EAAGC,EACH,MAAOH,EACP,OAAQC,CACT,EACA2B,EAAe,OAAQ,CACtB,EAAG,EACH,EAAG,EACH,MAAO5B,EACP,OAAQC,EACR,KAAMiC,CACP,CAAC,CACF,CACD,CACD,CAEA,MAAM,IAAI,MAAM,8BAA8B9B,CAAK,GAAG,CACvD,CCxXA,SAAS+B,GAAmB,CAACC,EAAIC,CAAE,EAAa,CAC/C,OAAI,KAAK,MAAMD,EAAK,GAAI,IAAM,GAAK,KAAK,MAAMC,EAAK,GAAI,IAAM,EACrD,EAED,KAAK,MAAQD,EAAKC,EAAM,KAAK,KAAKD,EAAKA,EAAKC,EAAKA,CAAE,EAAK,GAAI,EAAI,GACxE,CAEA,SAASC,GAAYC,EAAWC,EAAWC,EAAe,CACzD,OAAIA,EAAQF,EAAIC,IACXC,EAAQ,EAAIF,GAAKE,EAAQ,EAAID,EAChCD,EAAIC,EAAIC,EAAQ,EACNA,EAAQ,EAAIF,EACtBA,EAAIE,EAAQD,EACFC,EAAQ,EAAID,IACtBA,EAAIC,EAAQF,IAGP,CAACA,EAAGC,CAAC,CACb,CAEA,SAASE,GAAYC,EAAuB,CAC3CA,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAI,KAAK,IAAIA,EAAI,CAAC,EAAGA,EAAI,CAAC,CAAC,CAC1C,CAGA,SAASC,GACRC,EACAC,EACAC,EACAC,EACAC,EAC0C,CAC1C,GAAI,OAAOJ,GAAM,SAAU,CAC1B,IAAMK,EAAQL,EAAE,MAAM,GAAG,EAAE,IAAIM,GAAKA,EAAE,KAAK,CAAC,EACtCC,EAAc,CAACF,EAAM,CAAC,GAAK,CAACA,EAAM,CAAC,EAAE,SAAS,GAAG,EACvD,OAAAA,EAAM,CAAC,EAAIA,EAAM,CAAC,GAAKA,EAAM,CAAC,EACvB,CACNE,EACA,CACC,KAAK,IACJC,EAAeH,EAAM,CAAC,EAAGF,EAAUF,EAAOG,EAAO,EAAI,EACrDH,CACD,EACA,KAAK,IACJO,EAAeH,EAAM,CAAC,EAAGF,EAAUD,EAAQE,EAAO,EAAI,EACtDF,CACD,CACD,CACD,CACD,CACA,OAAI,OAAOF,GAAM,SACT,CAAC,GAAM,CAAC,KAAK,IAAIA,EAAGC,CAAK,EAAG,KAAK,IAAID,EAAGE,CAAM,CAAC,CAAC,EAEjD,CAAC,GAAM,MAAS,CACxB,CAEA,IAAMO,GAAoBC,GACzBA,GAAWA,EAAQ,CAAC,IAAM,GAAKA,EAAQ,CAAC,IAAM,EAExC,SAASC,GACf,CACC,GAAAC,EACA,iBAAAC,EACA,WAAAC,EACA,KAAAC,EACA,IAAAC,EACA,MAAAf,EACA,OAAAC,CACD,EASAE,EACC,CACD,IAAMa,EAAa,cAAcL,CAAE,GAenC,MAAO,CAdMM,EACZ,WACA,CACC,GAAID,CACL,EACAC,EAAeJ,EAAY,CAC1B,EAAGC,EACH,EAAGC,EACH,MAAAf,EACA,OAAAC,EACA,EAAGW,GAAsC,MAC1C,CAAC,CACF,EAEcI,CAAU,CACzB,CAEe,SAARE,GACN,CACC,KAAAJ,EACA,IAAAC,EACA,MAAAf,EACA,OAAAC,CACD,EAMAE,EACAgB,EACC,CACD,GAAI,CACH,oBAAAC,EACA,qBAAAC,EACA,uBAAAC,EACA,wBAAAC,EACA,SAAArB,CACD,EAAIC,EAEAqB,EACAC,EACAC,EACAC,EA8BJ,GA7BA,CAACH,EAA6BJ,CAAmB,EAAItB,GACpDsB,EACApB,EACAC,EACAC,EACAC,CACD,EACA,CAACsB,EAA8BJ,CAAoB,EAAIvB,GACtDuB,EACArB,EACAC,EACAC,EACAC,CACD,EACA,CAACuB,EAAgCJ,CAAsB,EAAIxB,GAC1DwB,EACAtB,EACAC,EACAC,EACAC,CACD,EACA,CAACwB,EAAiCJ,CAAuB,EAAIzB,GAC5DyB,EACAvB,EACAC,EACAC,EACAC,CACD,EAGC,CAACgB,GACD,CAACX,GAAiBY,CAAmB,GACrC,CAACZ,GAAiBa,CAAoB,GACtC,CAACb,GAAiBc,CAAsB,GACxC,CAACd,GAAiBe,CAAuB,EAEzC,MAAO,GAERH,IAAwB,CAAC,EAAG,CAAC,EAC7BC,IAAyB,CAAC,EAAG,CAAC,EAC9BC,IAA2B,CAAC,EAAG,CAAC,EAChCC,IAA4B,CAAC,EAAG,CAAC,EAKjC,CAACH,EAAoB,CAAC,EAAGC,EAAqB,CAAC,CAAC,EAAI7B,GACnD4B,EAAoB,CAAC,EACrBC,EAAqB,CAAC,EACtBrB,CACD,EAEA,CAACsB,EAAuB,CAAC,EAAGC,EAAwB,CAAC,CAAC,EAAI/B,GACzD8B,EAAuB,CAAC,EACxBC,EAAwB,CAAC,EACzBvB,CACD,EAEA,CAACoB,EAAoB,CAAC,EAAGE,EAAuB,CAAC,CAAC,EAAI9B,GACrD4B,EAAoB,CAAC,EACrBE,EAAuB,CAAC,EACxBrB,CACD,EAEA,CAACoB,EAAqB,CAAC,EAAGE,EAAwB,CAAC,CAAC,EAAI/B,GACvD6B,EAAqB,CAAC,EACtBE,EAAwB,CAAC,EACzBtB,CACD,EAIIuB,GACH5B,GAAYwB,CAAmB,EAE5BK,GACH7B,GAAYyB,CAAoB,EAE7BK,GACH9B,GAAY0B,CAAsB,EAE/BK,GACH/B,GAAY2B,CAAuB,EAIpC,IAAMK,EAAW,CAAC,EAClBA,EAAE,CAAC,EAAI,CAACP,EAAsBA,CAAoB,EAClDO,EAAE,CAAC,EAAI,CACNL,EACA,CAAC,CAACA,EAAwB,CAAC,EAAGA,EAAwB,CAAC,CAAC,CACzD,EACAK,EAAE,CAAC,EAAI,CACNN,EACA,CAAC,CAACA,EAAuB,CAAC,EAAG,CAACA,EAAuB,CAAC,CAAC,CACxD,EACAM,EAAE,CAAC,EAAI,CACNR,EACA,CAACA,EAAoB,CAAC,EAAG,CAACA,EAAoB,CAAC,CAAC,CACjD,EAEA,IAAMS,EAAI,IAAI7B,EAAQoB,EAAoB,CAAC,EAAIC,EAAqB,CAAC,CAAC,KACrEO,EAAE,CAAC,EAAE,CAAC,CACP,UAAUA,EAAE,CAAC,EAAE,CAAC,CAAC,GACXE,EAAI,IACT7B,EAASoB,EAAqB,CAAC,EAAIE,EAAwB,CAAC,CAC7D,KAAKK,EAAE,CAAC,EAAE,CAAC,CAAC,UAAUA,EAAE,CAAC,EAAE,CAAC,CAAC,GACvBG,EAAI,IACTR,EAAwB,CAAC,EAAID,EAAuB,CAAC,EAAItB,CAC1D,KAAK4B,EAAE,CAAC,EAAE,CAAC,CAAC,UAAUA,EAAE,CAAC,EAAE,CAAC,CAAC,GACvBI,EAAI,IACTV,EAAuB,CAAC,EAAIF,EAAoB,CAAC,EAAInB,CACtD,KAAK2B,EAAE,CAAC,EAAE,CAAC,CAAC,UAAUA,EAAE,CAAC,EAAE,CAAC,CAAC,GAE7B,GAAIT,EAAc,CAgBjB,IAASc,EAAT,SAAgBC,GAAW,CAC1B,IAAMC,GAAK9C,GACV,CACC+B,EACAC,EACAE,EACAD,CACD,EAAEY,EAAC,CACJ,EACA,OAAOA,KAAM,EACV,CACA,CACCpB,EAAOM,EAAoB,CAAC,EAAIe,GAChCpB,EAAMK,EAAoB,CAAC,EAAIe,EAChC,EACA,CAACrB,EAAOM,EAAoB,CAAC,EAAGL,CAAG,CACnC,EACAmB,KAAM,EACN,CACA,CACCpB,EAAOd,EAAQqB,EAAqB,CAAC,EAAIc,GACzCpB,EAAMM,EAAqB,CAAC,EAAIc,EACjC,EACA,CAACrB,EAAOd,EAAOe,EAAMM,EAAqB,CAAC,CAAC,CAC5C,EACAa,KAAM,EACN,CACA,CACCpB,EAAOd,EAAQuB,EAAwB,CAAC,EAAIY,GAC5CpB,EAAMd,EAASsB,EAAwB,CAAC,EAAIY,EAC7C,EACA,CACCrB,EAAOd,EAAQuB,EAAwB,CAAC,EACxCR,EAAMd,CACP,CACA,EACA,CACA,CACCa,EAAOQ,EAAuB,CAAC,EAAIa,GACnCpB,EAAMd,EAASqB,EAAuB,CAAC,EAAIa,EAC5C,EACA,CAACrB,EAAMC,EAAMd,EAASqB,EAAuB,CAAC,CAAC,CAC/C,CACJ,EAxDIc,EAAQjB,EAAa,QAAQ,EAAK,EAEtC,GAAI,CAACA,EAAa,SAAS,EAAI,EAC9B,MAAM,IAAI,MAAM,yBAAyB,EAE1C,GAAIiB,IAAU,GACbA,EAAQ,MAER,MAAO,CAACjB,EAAaiB,CAAK,GACzBA,GAASA,EAAQ,GAAK,EAiDxB,IAAIC,EAAS,GAEPC,EAAOL,EAAOG,CAAK,EAErBG,EAAI,IAAID,EAAK,CAAC,CAAC,KAAKV,GAAGQ,EAAQ,GAAK,CAAC,EAAE,CAAC,CAAC,UAAUE,EAAK,CAAC,CAAC,GAE1DE,EAAM,EACV,KAAOA,EAAM,GAAKrB,GAAciB,EAAQI,GAAO,CAAC,EAAGA,IAClDH,GAAUE,EAAI,IACdA,EAAI,CAACV,EAAGC,EAAGC,EAAGC,CAAC,GAAGI,EAAQI,GAAO,CAAC,EAEnC,IAAMC,IAAOL,EAAQI,GAAO,EAG5BH,GAAUE,EAAE,MAAM,GAAG,EAAE,CAAC,EAExB,IAAMG,GAAOT,EAAOQ,EAAG,EACvB,OAAAJ,GAAU,KAAKT,GAAGa,GAAM,GAAK,CAAC,EAAE,CAAC,CAAC,UAAUC,GAAK,CAAC,CAAC,GAE5CL,CACR,CAGA,MAAO,IAAIvB,EAAOM,EAAoB,CAAC,CAAC,IAAIL,CAAG,IAAIc,CAAC,IAAIC,CAAC,IAAIC,CAAC,IAAIC,CAAC,EACpE,CC5UA,SAASW,GAAwBC,EAAWC,EAAWC,EAAY,CAClE,OACCA,EAAMF,EAAI,OAAO,IAAME,EAAMD,EAAI,OAAO,GACxCC,EAAMF,EAAI,OAAO,IAAME,EAAMD,EAAI,OAAO,GACxCC,EAAMF,EAAI,OAAO,IAAME,EAAMD,EAAI,OAAO,CAE1C,CAEO,SAASE,GACf,CACC,GAAAC,EAEA,kBAAAC,EACA,WAAAC,EACA,WAAAC,EACA,KAAAC,EACA,IAAAC,EACA,MAAAC,EACA,OAAAC,CACD,EAUAT,EACC,CAOD,GAAI,EALHA,EAAM,gBACNA,EAAM,kBACNA,EAAM,mBACNA,EAAM,iBAES,OAAO,KAMvB,IAAMU,EAAa,aAAaR,CAAE,GAkBlC,MAAO,CAjBMS,EACZ,WACA,CACC,GAAID,EACJ,YAAaP,EACV,QAAQA,CAAiB,IACzB,MACJ,EACAQ,EAAeN,EAAY,CAC1B,EAAGC,EACH,EAAGC,EACH,MAAAC,EACA,OAAAC,EACA,EAAGL,GAA0B,MAC9B,CAAC,CACF,EAEcM,CAAU,CACzB,CAEe,SAARE,GACN,CACC,KAAAN,EACA,IAAAC,EACA,MAAAC,EACA,OAAAC,EACA,MAAAI,EACA,cAAAC,EACA,eAAAC,CACD,EASAf,EACC,CACD,IAAMgB,EAAa,CAClB,YACA,cACA,eACA,YACD,EAGA,GACC,CAACF,GACD,CAACE,EAAW,KAAKC,GAAajB,EAAMiB,EAAY,OAAO,CAAC,EAExD,MAAO,GAER,IAAIC,EAAa,GAEbC,EAAQ,EACZ,KACCA,EAAQ,GACRtB,GACCmB,EAAWG,CAAK,EAChBH,GAAYG,EAAQ,GAAK,CAAC,EAC1BnB,CACD,GAEAmB,GAASA,EAAQ,GAAK,EAGvB,IAAIC,EAAe,CAAC,GAAO,GAAO,GAAO,EAAK,EAC1CC,EAAe,CAAC,EACpB,QAASC,EAAK,EAAGA,EAAK,EAAGA,IAAM,CAC9B,IAAMC,GAAKJ,EAAQG,GAAM,EACnBE,GAAML,EAAQG,EAAK,GAAK,EAExBG,EAAIT,EAAWO,CAAC,EAChBG,EAAKV,EAAWQ,CAAE,EAUxB,GARAJ,EAAaG,CAAC,EAAI,GAClBF,EAAe,CACdrB,EAAMyB,EAAI,OAAO,EACjBzB,EAAMyB,EAAI,OAAO,EACjBzB,EAAMyB,EAAI,OAAO,EACjBA,CACD,EAEI,CAAC5B,GAAwB4B,EAAGC,EAAI1B,CAAK,EAAG,CAC3C,IAAM2B,GACJN,EAAa,CAAC,GAAK,IACnBP,GAAiB,CAACC,GAChBf,EAAMyB,EAAE,QAAQ,SAAU,SAAS,CAAC,GAAK,GAEzCE,IACHT,GAAcP,EAAe,OAAQ,CACpC,MAAAH,EACA,OAAAC,EACA,GAAGI,EACH,KAAM,OACN,OAAQC,EAAgB,OAASO,EAAa,CAAC,EAC/C,eAAgBM,EAAI,EACpB,mBACC,CAACb,GAAiBO,EAAa,CAAC,IAAM,SACnCM,EAAI,EAAI,IAAMA,EACd,OACJ,EAAGC,GACF,CAAE,KAAAtB,EAAM,IAAAC,EAAK,MAAAC,EAAO,OAAAC,CAAO,EAC3BT,EACAoB,CACD,CACD,CAAC,GAEFA,EAAe,CAAC,GAAO,GAAO,GAAO,EAAK,CAC3C,CACD,CAEA,GAAIA,EAAa,KAAK,OAAO,EAAG,CAC/B,IAAMO,GACJN,EAAa,CAAC,GAAK,IACnBP,GAAiB,CAACC,GAChBf,EAAMqB,EAAa,CAAC,EAAE,QAAQ,SAAU,SAAS,CAAC,GAAK,GAEvDM,IACHT,GAAcP,EAAe,OAAQ,CACpC,MAAAH,EACA,OAAAC,EACA,GAAGI,EACH,KAAM,OACN,OAAQC,EAAgB,OAASO,EAAa,CAAC,EAC/C,eAAgBM,EAAI,EACpB,mBACC,CAACb,GAAiBO,EAAa,CAAC,IAAM,SACnCM,EAAI,EAAI,IAAMA,EACd,OACJ,EAAGC,GACF,CAAE,KAAAtB,EAAM,IAAAC,EAAK,MAAAC,EAAO,OAAAC,CAAO,EAC3BT,EACAoB,CACD,CACD,CAAC,EAEH,CAEA,OAAOF,CACR,CCpLe,SAARW,GACN,CACC,GAAAC,EACA,KAAAC,EACA,IAAAC,EACA,MAAAC,EACA,OAAAC,EACA,OAAAC,EACA,WAAAC,CACD,EASAC,EACC,CACD,IAAMC,GACHD,EAAM,iBAA8B,IACrCD,EAAa,EAAKC,EAAM,aAA0B,GAC9CE,GACHF,EAAM,gBAA6B,IACpCD,EAAa,EAAKC,EAAM,YAAyB,GAC7CG,GACHH,EAAM,kBAA+B,IACtCD,EAAa,EAAKC,EAAM,cAA2B,GAC/CI,GACHJ,EAAM,mBAAgC,IACvCD,EAAa,EAAKC,EAAM,eAA4B,GAEhDK,EAAc,CACnB,EAAGX,EAAOO,EACV,EAAGN,EAAMO,EACT,MAAON,EAAQK,EAAaE,EAC5B,OAAQN,EAASK,EAAYE,CAC9B,EAmCA,OAjCqBE,EACpB,OACA,CAAE,GAAAb,CAAG,EACLa,EAAe,OAAQ,CACtB,GAAGD,EACH,KAAM,OAIN,UACCL,EAAM,WAAa,UAAYA,EAAM,WAAaF,EAC/CA,EACA,OACJ,KAAME,EAAM,iBACT,QAAQA,EAAM,gBAAgB,IAC9B,MACJ,CAAC,EACAO,GACC,CACC,KAAAb,EACA,IAAAC,EACA,MAAAC,EACA,OAAAC,EACA,MAAO,CACN,UAAWC,GAAkB,MAC9B,EACA,cAAe,GACf,eAAgBC,CACjB,EACAC,CACD,CACF,CAGD,CCjFA,OAAS,wBAAAQ,OAA4B,sBAErC,IAAMC,GAAW,CAChB,OAAQ,iBACR,QAAS,kBACT,KAAM,eACN,QAAS,kBACT,MAAO,eACR,EAEO,SAASC,GACf,CACC,MAAAC,EACA,OAAAC,CACD,EAIAC,EACAC,EACC,CACD,SAASC,EAAYC,EAAa,CACjC,IAAMC,EAAMD,EAAI,MAAMP,GAAS,MAAS,EAExC,GAAI,CAACQ,EAAK,OAAO,KAEjB,GAAM,CAAC,CAAEC,CAAK,EAAID,EACZ,CAACE,EAAQC,EAAM,EAAE,EAAIF,EAAM,MAAM,IAAI,EAAE,IAAIG,GAAKA,EAAE,KAAK,CAAC,EACxD,CAAE,EAAAC,EAAG,EAAAC,CAAE,EAAIC,GAAgBJ,EAAKT,EAAOC,CAAM,EAEnD,MAAO,CACN,KAAM,SACN,EAAGa,EACFN,EACAL,EAAe,SACf,KAAK,KAAK,KAAK,IAAIH,EAAO,CAAC,EAAI,KAAK,IAAIC,EAAQ,CAAC,CAAC,EACjD,KAAK,KAAK,CAAC,EACZE,EACA,EACD,EACA,GAAIW,EACHH,EACAR,EAAe,SACfH,EACAG,EACA,EACD,EACA,GAAIW,EACHF,EACAT,EAAe,SACfF,EACAE,EACA,EACD,CACD,CACD,CACA,SAASY,EAAaV,EAAa,CAClC,IAAMC,EAAMD,EAAI,MAAMP,GAAS,OAAU,EAEzC,GAAI,CAACQ,EAAK,OAAO,KAEjB,GAAM,CAAC,CAAEC,CAAK,EAAID,EACZ,CAACE,EAAQC,EAAM,EAAE,EAAIF,EAAM,MAAM,IAAI,EAAE,IAAIG,GAAKA,EAAE,KAAK,CAAC,EACxD,CAACM,EAAIC,CAAE,EAAIT,EAAO,MAAM,GAAG,EAC3B,CAAE,EAAAG,EAAG,EAAAC,CAAE,EAAIC,GAAgBJ,EAAKT,EAAOC,CAAM,EAEnD,MAAO,CACN,KAAM,UACN,GAAIa,EACHE,GAAM,MACNb,EAAe,SACfH,EACAG,EACA,EACD,EACA,GAAIW,EACHG,GAAM,MACNd,EAAe,SACfF,EACAE,EACA,EACD,EACA,GAAIW,EACHH,EACAR,EAAe,SACfH,EACAG,EACA,EACD,EACA,GAAIW,EACHF,EACAT,EAAe,SACfF,EACAE,EACA,EACD,CACD,CACD,CACA,SAASe,EAAUb,EAAa,CAC/B,IAAMC,EAAMD,EAAI,MAAMP,GAAS,IAAO,EAEtC,GAAI,CAACQ,EAAK,OAAO,KAEjB,GAAM,CAACa,EAAUC,CAAC,EAAIC,GAAgBf,EAAI,CAAC,CAAC,EAE5C,MAAO,CACN,KAAM,OACN,EAAAc,EACA,YAAaD,CACd,CACD,CACA,SAASG,EAAajB,EAAa,CAClC,IAAMC,EAAMD,EAAI,MAAMP,GAAS,OAAU,EAEzC,GAAI,CAACQ,EAAK,OAAO,KAEjB,GAAM,CAACa,EAAUI,CAAM,EAAIF,GAAgBf,EAAI,CAAC,CAAC,EAEjD,MAAO,CACN,KAAM,UACN,YAAaa,EACb,OAAQI,EACN,MAAM,GAAG,EACT,IAAIb,GACJA,EACE,MAAM,GAAG,EACT,IAAI,CAACc,EAAGC,IACRX,EACCU,EACArB,EAAe,SACfsB,IAAM,EAAIzB,EAAQC,EAClBE,EACA,EACD,CACD,EACC,KAAK,GAAG,CACX,EACC,KAAK,GAAG,CACX,CACD,CACA,SAASuB,EAAWrB,EAAa,CAChC,IAAMC,EAAMD,EAAI,MAAMP,GAAS,KAAQ,EAEvC,GAAI,CAACQ,EAAK,OAAO,KAEjB,GAAM,CAACqB,EAAOnB,CAAM,GACnBF,EAAI,CAAC,EAAE,SAAS,OAAO,EAAIA,EAAI,CAAC,EAAI,GAAGA,EAAI,CAAC,EAAE,KAAK,CAAC,YACnD,MAAM,OAAO,EACTsB,EAAY/B,GAAqB,eAAgBW,EAAQ,EAAI,EAC7DqB,EAAI,OAAO,OAAOD,CAAS,EAC/B,IAAIE,GAAK,OAAOA,CAAC,CAAC,EAClB,IACA,CAACA,EAAGL,IACHX,EACCgB,EACA3B,EAAe,SACfsB,IAAM,GAAKA,IAAM,EAAIxB,EAASD,EAC9BG,EACA,EACD,GAAK,CACP,EACK4B,EAAU,OAAO,OACtBlC,GAAqB,SAAU8B,EAAO,EAAI,CAC3C,EACE,IAAIG,GAAK,OAAOA,CAAC,CAAC,EAClB,IACA,CAACA,EAAGL,IACHX,EACCgB,EACA3B,EAAe,SACfsB,IAAM,GAAKA,IAAM,EAAIxB,EAASD,EAC9BG,EACA,EACD,GAAK,CACP,EACKQ,EAAIoB,EAAQ,CAAC,EACbnB,EAAImB,EAAQ,CAAC,EACbC,EAAIhC,GAAS+B,EAAQ,CAAC,EAAIA,EAAQ,CAAC,GACnCE,EAAIhC,GAAU8B,EAAQ,CAAC,EAAIA,EAAQ,CAAC,GAE1C,OAAIF,EAAE,KAAKnB,GAAKA,EAAI,CAAC,EAMb,CAAE,KAAM,OAAQ,EALbF,GACT,CAAE,KAAMG,EAAG,IAAKC,EAAG,MAAOoB,EAAG,OAAQC,CAAE,EACvC,CAAE,GAAG/B,EAAO,GAAG0B,CAAU,CAC1B,CAEyB,EAGnB,CACN,KAAM,OACN,EAAAjB,EACA,EAAAC,EACA,MAAOoB,EACP,OAAQC,CACT,CACD,CAEA,MAAO,CACN,YAAA7B,EACA,aAAAW,EACA,UAAAG,EACA,aAAAI,EACA,WAAAI,CACD,CACD,CAEA,SAASL,GAAgBhB,EAAa,CACrC,GAAM,CAAC,CAAEc,EAAW,UAAWC,CAAC,EAC/Bf,EAAI,QAAQ,SAAU,EAAE,EAAE,MAAM,2BAA2B,GAAK,CAAC,EAElE,MAAO,CAACc,EAAUC,CAAC,CACpB,CAEA,SAASP,GAAgBqB,EAAkBC,EAAgBC,EAAgB,CAC1E,IAAM3B,EAAMyB,EAAS,MAAM,GAAG,EACxB5B,EAAkD,CACvD,EAAGG,EAAI,CAAC,GAAK,MACb,EAAGA,EAAI,CAAC,GAAK,KACd,EAEA,OAAAA,EAAI,QAAQC,GAAK,CACZA,IAAM,MACTJ,EAAI,EAAI,EACEI,IAAM,SAChBJ,EAAI,EAAI8B,EACE1B,IAAM,OAChBJ,EAAI,EAAI,EACEI,IAAM,QAChBJ,EAAI,EAAI6B,EACEzB,IAAM,WAChBJ,EAAI,EAAI6B,EAAS,EACjB7B,EAAI,EAAI8B,EAAS,EAInB,CAAC,EAEM9B,CACR,CC9OO,SAAS+B,GAAcC,EAAY,CACzC,MAAO,aAAaA,CAAE,EACvB,CACO,SAASC,GAAYD,EAAY,CACvC,MAAO,QAAQD,GAAcC,CAAE,CAAC,GACjC,CAEO,SAASE,GACfC,EAWAC,EACAC,EACC,CACD,GAAID,EAAM,WAAa,OAAQ,MAAO,GAEtC,IAAME,EAASC,GAAkBJ,EAAGC,EAAOC,CAAc,EACnDG,EAAWJ,EAAM,SAEnBK,EAAsD,CAAE,KAAM,EAAG,EAErE,QAAWC,KAAK,OAAO,KAAKJ,CAAM,EAEjC,GADAG,EAAMH,EAAOI,CAAC,EAAEF,CAAQ,EACpBC,EAAK,MAGV,GAAIA,EAAK,CACR,GAAM,CAAE,KAAAE,EAAM,GAAGC,CAAK,EAAIH,EAC1B,OAAOI,EACN,WACA,CACC,GAAId,GAAcI,EAAE,EAAE,EACtB,YAAaA,EAAE,gBACf,UAAW,aAAaA,EAAE,IAAI,KAAKA,EAAE,GAAG,GACzC,EACAU,EAAeF,EAAMC,CAAI,CAC1B,CACD,CACA,MAAO,EACR,CC1Ce,SAARE,GACN,CACC,KAAAC,EACA,IAAAC,EACA,MAAAC,EACA,OAAAC,EACA,KAAAC,EACA,OAAAC,EACA,GAAAC,EACA,gBAAAC,EACA,IAAAC,CACD,EAWAC,EACAC,EACC,CACD,IAAIC,EAAmB,GACjBC,EACLH,EAAM,UAAYA,EAAM,WAAa,OAClCI,GACA,CACC,KAAAb,EACA,IAAAC,EACA,MAAAC,EACA,OAAAC,EACA,KAAAC,EACA,GAAAE,EACA,OAAAD,EACA,gBAAAE,EACA,IAAAC,CACD,EACAC,EACAC,CACA,EACA,GAEJ,GAAID,EAAM,WAAa,UAAY,CAACD,EACnCG,EAAmB,OACb,CACN,IAAMG,EAAMF,EAAW,cAAcN,CAAE,GAAKS,GAAcT,CAAE,EAE5DK,EAAmBK,EAClB,WACA,CACC,GAAIF,EACJ,YAAaP,CACd,EACAS,EAAeZ,EAAO,OAAS,OAAQ,CACtC,EAAGJ,EACH,EAAGC,EACH,MAAAC,EACA,OAAAC,EACA,EAAGC,GAAc,OAKjB,UACCK,EAAM,WAAa,UAAYA,EAAM,WAAaJ,EAC/CA,EACA,MACL,CAAC,CACF,CACD,CAEA,IAAMY,EAAcA,GACnB,CACC,GAAI,aAAaX,CAAE,GACnB,KAAAN,EACA,IAAAC,EACA,MAAAC,EACA,OAAAC,EACA,OAAAE,EACA,WAAY,CAAAG,CACb,EACAC,CACD,EAEA,OAAOG,EAAWD,EAAmBM,CACtC,CC5FA,IAAMC,GAAkBC,GAAe,aAAaA,CAAE,GAEtD,eAAOC,GACNC,EAOAC,EACAC,EAC4B,CAC5B,GAAI,CAACD,EAAM,UAAW,MAAO,CAAC,GAAI,EAAE,EACpC,GAAM,CAAE,KAAAE,EAAM,IAAAC,EAAK,MAAAC,EAAO,OAAAC,EAAQ,GAAAR,CAAG,EAAIE,EACnCO,EAAYN,EAAM,UAClBO,EAASD,EAAU,OACzB,GAAI,CAACC,EAAQ,MAAO,CAAC,GAAI,EAAE,EAC3B,IAAMC,EAAOZ,GAAeC,CAAE,EAE1BY,EAAO,GAEX,QAASC,EAAI,EAAGA,EAAIH,EAAQG,IAAK,CAChC,IAAMC,EAAIL,EAAUI,CAAC,EAEf,CAACE,EAAKC,CAAG,EAAI,MAAMC,GACxB,CAAE,GAAI,GAAGN,CAAI,IAAIE,CAAC,GAAI,KAAAR,EAAM,IAAAC,EAAK,MAAAC,EAAO,OAAAC,CAAO,EAC/CM,EACAV,EACA,MACD,EAEAQ,GACCI,EACAE,EAAe,OAAQ,CACtB,EAAGb,EACH,EAAGC,EACH,MAAAC,EACA,OAAAC,EACA,KAAM,QAAQO,CAAG,GAClB,CAAC,CACH,CAEA,OAAAH,EAAOM,EAAe,OAAQ,CAAE,GAAIP,CAAK,EAAGC,CAAI,EAEzC,CAACD,EAAMC,CAAI,CACnB,CChCA,SAASO,GACRC,EACAC,EACAC,EACmB,CACnB,IAAMC,EAAQH,EAAS,YAAY,EAAE,KAAK,EAAE,MAAM,KAAK,EAGjDI,EAAmB,CAACC,EAAiBC,KAC9B,CACX,KAAM,KACN,OAAQ,MACR,MAAO,OACP,IAAK,KACL,OAAQ,MACT,GACWD,CAAO,GAAKA,EAGpBE,EACAC,EAEJ,GAAIL,EAAM,SAAW,EAAG,CACvB,IAAMM,EAAON,EAAM,CAAC,EAEhBM,IAAS,QAAUA,IAAS,UAAYA,IAAS,SACpDF,EAASH,EAAiBK,EAAM,GAAG,EACnCD,EAAS,OACCC,IAAS,OAASA,IAAS,UACrCF,EAAS,MACTC,EAASJ,EAAiBK,EAAM,GAAG,IAGnCF,EAASE,EACTD,EAAS,MAEX,KAAO,CAEN,IAAME,EAAQP,EAAM,CAAC,EACfQ,EAASR,EAAM,CAAC,EAGlBO,IAAU,OAASA,IAAU,UAChCF,EAASJ,EAAiBM,EAAO,GAAG,EAEnCC,IAAW,QACXA,IAAW,SACXA,IAAW,SAEXJ,EAASH,EAAiBO,EAAQ,GAAG,GAGrCJ,EAAS,MACTC,EACCE,IAAU,OAASA,IAAU,SAC1BN,EAAiBM,EAAO,GAAG,EAC3BC,KAILJ,EAASH,EAAiBM,EAAO,GAAG,EACpCF,EAASJ,EAAiBO,EAAQ,GAAG,EAEvC,CAGA,IAAMC,EAAa,CAACC,EAAeC,IAAkC,CACpE,GAAI,CACH,GAAID,EAAM,SAAS,GAAG,EACrB,OAAQC,EAAgB,WAAWD,CAAK,EAAK,IAE9C,IAAME,EAAS,IAAIC,GAAaH,CAAK,EACrC,OAAIE,EAAO,OAAS,UAAYA,EAAO,OAAS,SACxCA,EAAO,MAER,CACR,MAAY,CACX,MAAO,EACR,CACD,EAEA,MAAO,CACNH,EAAWL,EAAQN,CAAc,EACjCW,EAAWJ,EAAQN,CAAe,CACnC,CACD,CAEA,eAAOe,GACN,CACC,GAAAC,EACA,KAAAC,EACA,IAAAC,EACA,MAAAC,EACA,OAAAC,EACA,sBAAAC,EACA,IAAAC,EACA,MAAAC,CACD,EAUAC,EACAC,EACC,CACD,GAAID,EAAM,UAAY,OAAQ,MAAO,GAErC,IAAME,EAAU,CAAC,CAACJ,EAEdK,EAAwB,OACxBC,EAAS,GACTC,EAAO,GACPC,EAAkB,CAAC,EACnBC,EAAU,EACVC,EAAQ,GAERR,EAAM,iBACTM,EAAM,KAAKN,EAAM,eAAyB,EAGvCA,EAAM,UAAY,SACrBO,EAAU,CAACP,EAAM,SAGdA,EAAM,YACTI,EAASK,GACR,CACC,KAAAhB,EACA,IAAAC,EACA,MAAAC,EACA,OAAAC,CACD,EACAI,EAAM,UACNH,EACAG,EAAM,eACP,GAGD,IAAIU,EAAmB,GACvB,GAAIV,EAAM,gBAAiB,CAC1B,IAAMW,GAA0B,CAAC,EAEjC,QACKC,EAAQ,EACZA,EAASZ,EAAM,gBAAwB,OACvCY,IACC,CACD,IAAMC,GAAcb,EAAM,gBAAwBY,CAAK,EACjDE,GAAQ,MAAMC,GACnB,CAAE,GAAIvB,EAAK,IAAMoB,EAAO,MAAAjB,EAAO,OAAAC,EAAQ,KAAAH,EAAM,IAAAC,CAAI,EACjDmB,GACAZ,CACD,EACIa,IAEHH,GAAY,QAAQG,EAAK,CAE3B,CAEA,QAAWD,KAAcF,GACxBL,EAAM,KAAK,QAAQO,EAAW,CAAC,CAAC,GAAG,EACnCR,GAAQQ,EAAW,CAAC,EAChBA,EAAW,CAAC,IACfH,GAAoBG,EAAW,CAAC,EAGnC,CAEA,GAAM,CAACG,EAAMC,CAAE,EAAI,MAAMC,GACxB,CAAE,GAAA1B,EAAI,KAAAC,EAAM,IAAAC,EAAK,MAAAC,EAAO,OAAAC,CAAO,EAC/BI,EACAC,CACD,EAEAI,GAAQY,EACR,IAAME,EAASH,EACZ,QAAQA,CAAI,IACZhB,EAAM,iBACN,QAAQA,EAAM,gBAAgB,IAC9B,OAEGoB,EAAOC,GACZ,CAAE,KAAA5B,EAAM,IAAAC,EAAK,MAAAC,EAAO,OAAAC,CAAO,EAC3BI,CACD,EACIoB,IACHjB,EAAO,QAGR,IAAMmB,EAAatB,EAAM,qBAErBD,IACHS,EAAQe,EAAe,OAAQ,CAC9B,EAAG9B,EACH,EAAGC,EACH,MAAAC,EACA,OAAAC,EACA,KAAM,cACN,OAAQ,UACR,eAAgB,EAChB,UAAWQ,GAAU,OACrB,YAAakB,EAAa,QAAQA,CAAU,IAAM,MACnD,CAAC,GAGF,GAAM,CAAE,eAAAE,EAAgB,OAAQC,EAAW,aAAAC,CAAa,EAAI1B,EAEtD2B,GACL,CACCF,EAAY,UAAUA,CAAS,GAAK,OACpCC,EAAe,kBAAkBA,CAAY,GAAK,MACnD,EACE,OAAOE,IAAKA,EAAC,EACb,KAAK,GAAG,GAAK,OAEVC,GACLL,IAAmB,OAChB,mBAAmBhC,CAAE,IACrB8B,EACA,QAAQA,CAAU,IAClBtB,EAAM,SACN8B,GAAYtC,CAAE,EACd,OAEEuC,GAAOC,GACZ,CAAE,KAAAvC,EAAM,IAAAC,EAAK,MAAAC,EAAO,OAAAC,EAAQ,KAAAwB,EAAM,GAAA5B,EAAI,OAAAY,EAAQ,gBAAAyB,GAAiB,IAAA/B,CAAI,EACnEE,EACAC,CACD,EAKIgC,GAAQ3B,EACV,IAAI4B,IACJX,EAAepB,EAAM,CACpB,EAAGV,EACH,EAAGC,EACH,MAAAC,EACA,OAAAC,EACA,KAAAsC,GACA,EAAGd,GAAc,OACjB,UAAWhB,GAAkB,OAC7B,YAAaJ,EAAM,UAAY,OAAY6B,GAC3C,MAAOF,GACP,KAAM3B,EAAM,UAAY,OAAYmB,CACrC,CAAC,CACF,EACC,KAAK,EAAE,EAEHgB,GAAaC,GAClB,CACC,GAAA5C,EACA,KAAAC,EACA,IAAAC,EACA,MAAAC,EACA,OAAAC,EACA,kBAAmB0B,EACnB,WAAYF,EACZ,WAAYjB,CACb,EACAH,CACD,EAGIqC,GAGJ,GAAInC,EAAS,CAEZ,IAAMoC,IACHtC,EAAM,iBAA8B,IACpCA,EAAM,aAA0B,GAC7BuC,GACHvC,EAAM,gBAA6B,IACnCA,EAAM,YAAyB,GAC5BwC,IACHxC,EAAM,kBAA+B,IACrCA,EAAM,cAA2B,GAC9ByC,IACHzC,EAAM,mBAAgC,IACtCA,EAAM,eAA4B,GAE/B0C,GAAsB/C,EAAQ2C,GAAaE,GAC3CG,GAAuB/C,EAAS2C,EAAYE,GAG5CnE,IAAY0B,EAAM,gBAAkB,UAAU,SAAS,EACvD,CAAC4C,EAASC,CAAO,EAAIxE,GAC1BC,GACAoE,GACAC,EACD,EAGMG,EACJ9C,EAAM,gBAA6B0C,GAC/BK,GACJ/C,EAAM,iBAA8B2C,GAGlCK,GACAC,EAAaP,GACbQ,GAAcP,GACdQ,GAAS1D,EAAO6C,GAChBc,GAAS1D,EAAM6C,EAEnB,GAAIvC,EAAM,YAAc,UAAW,CAElC,IAAMqD,GAASX,GAAsBI,EAC/BQ,GAASX,GAAuBI,GAChCQ,GAAQ,KAAK,IAAIF,GAAQC,EAAM,EAErCL,EAAaH,EAAeS,GAC5BL,GAAcH,GAAgBQ,GAG9BJ,GACC1D,EACA6C,GACAM,EACCK,EAAaL,EAAWF,GAC1BU,GACC1D,EACA6C,EACAM,EACCK,GAAcL,EAAWF,GAE3BK,GAAsB,MACvB,SAAWhD,EAAM,YAAc,QAAS,CAEvC,IAAMqD,GAASX,GAAsBI,EAC/BQ,GAASX,GAAuBI,GAChCQ,GAAQ,KAAK,IAAIF,GAAQC,EAAM,EAErCL,EAAaH,EAAeS,GAC5BL,GAAcH,GAAgBQ,GAG9BJ,GACC1D,EACA6C,GACAM,EACCK,EAAaL,EAAWF,GAC1BU,GACC1D,EACA6C,EACAM,EACCK,GAAcL,EAAWF,GAE3BK,GAAsB,MACvB,SAAWhD,EAAM,YAAc,OAE9BgD,GAAsB,eACZhD,EAAM,YAAc,aAC9B,GAAI8C,GAAgBC,GAAe,CAElC,IAAMM,GAASX,GAAsBI,EAC/BQ,GAASX,GAAuBI,GAChCS,GAAW,KAAK,IAAIH,GAAQC,EAAM,EAExC,GAAIE,IAAY,EAGfP,EAAaH,EACbI,GAAcH,GACdC,GAAsB,OAGtBG,GACC1D,EACA6C,GACAM,EACCK,EAAaL,EAAWF,GAC1BU,GACC1D,EACA6C,EACAM,EACCK,GAAcL,EAAWF,OACrB,CAEN,IAAMY,GAAQC,GACdP,EAAaH,EAAeS,GAC5BL,GAAcH,GAAgBQ,GAG9BJ,GACC1D,EACA6C,GACAM,EACCK,EAAaL,EAAWF,GAC1BU,GACC1D,EACA6C,EACAM,EACCK,GAAcL,EAAWF,GAE3BK,GAAsB,MACvB,CACD,KAAO,CAEN,IAAMK,GAASX,GAAsBI,EAC/BQ,GAASX,GAAuBI,GAChCQ,GAAQ,KAAK,IAAIF,GAAQC,EAAM,EAErCL,EAAaH,EAAeS,GAC5BL,GAAcH,GAAgBQ,GAE9BJ,GACC1D,EACA6C,GACAM,EACCK,EAAaL,EAAWF,GAC1BU,GACC1D,EACA6C,EACAM,EACCK,GAAcL,EAAWF,GAE3BK,GAAsB,MACvB,MAGAA,GAAsB,OAGnBhD,EAAM,YACTqC,GAAoBoB,GACnB,CACC,GAAAjE,EACA,iBAAkB4B,EAClB,WAAYjB,EACZ,KAAAV,EACA,IAAAC,EACA,MAAAC,EACA,OAAAC,CACD,EACAI,CACD,GAGDiC,IAASV,EAAe,QAAS,CAChC,EAAG4B,GACH,EAAGC,GACH,MAAOH,EACP,OAAQC,GACR,KAAMpD,EACN,oBAAAkD,GACA,UAAW5C,GAAkB,OAC7B,MAAOuB,GACP,YAAa3B,EAAM,UAChBqC,GACC,QAAQA,GAAkB,CAAC,CAAC,IAC5B,OACD,kBAAkB7C,CAAE,IACvB,KAAMQ,EAAM,UACT,OACAgB,EACA,QAAQA,CAAI,IACZ,kBAAkBxB,CAAE,GACxB,CAAC,CACF,CAEA,GAAI2C,GAAY,CACf9B,GAAQ8B,GAAW,CAAC,EACpB,IAAMuB,GAAavB,GAAW,CAAC,EAE/BF,IAAS0B,GACR,CACC,KAAAlE,EACA,IAAAC,EACA,MAAAC,EACA,OAAAC,EACA,MAAO,CACN,UAAWQ,GAAkB,OAG7B,YAAa,QAAQsD,EAAU,GAChC,CACD,EACA1D,CACD,CACD,CAGA,IAAM4D,GAASC,GACd,CACC,MAAAlE,EACA,OAAAC,EACA,GAAAJ,EACA,QAAAe,EACA,MAAOgB,EAAepB,EAAM,CAC3B,EAAGV,EACH,EAAGC,EACH,MAAAC,EACA,OAAAC,EACA,KAAM,OACN,OAAQ,OACR,eAAgB,EAChB,EAAGwB,GAAc,OACjB,UAAWhB,GAAkB,OAC7B,YAAayB,GACb,KAAMV,CACP,CAAC,CACF,EACAnB,CACD,EAEA,OACEK,EAAOkB,EAAe,OAAQ,CAAC,EAAGlB,CAAI,EAAI,KAC1CuD,GAASA,GAAO,CAAC,EAAI,KACrBvB,GAAoBA,GAAkB,CAAC,EAAI,IAC5CN,IACCxB,IAAY,EAAI,eAAeA,CAAO,KAAO,KAC7CP,EAAM,YAAc6B,IAAmBV,GACrC,KAAKU,GAAkB,eAAeA,EAAe,IAAM,EAAE,GAC7DV,EAAS,UAAUA,CAAM,IAAM,EAC/B,IACA,KACFT,GAAoBuB,KACpBjC,EAAM,YAAc6B,IAAmBV,GAAU,OAAS,KAC1DZ,IAAY,EAAI,OAAS,KACzBqD,GAASA,GAAO,CAAC,EAAI,IACtBpD,CAEF,CCrhBA,IAAMsD,GAAoBC,GAA0B,CACnD,IAAIC,EAAa,GAGXC,EAAYF,EAAM,MAAM,yBAAyB,EACnDE,IACHD,GAAcE,EAAe,iBAAkB,CAC9C,aAAc,WAAWD,EAAU,CAAC,CAAC,CACtC,CAAC,GAIF,IAAME,EAAgBJ,EAAM,MAAM,0BAA0B,EAC5D,GAAII,EAAe,CAClB,IAAMC,EACLD,EAAc,CAAC,IAAM,IAClB,WAAWA,EAAc,CAAC,CAAC,EAAI,IAC/B,WAAWA,EAAc,CAAC,CAAC,EAC/BH,GAAcE,EAAe,gBAAiB,CAC7C,KAAM,WACN,OAAQE,CACT,CAAC,CACF,CAGA,IAAMC,EAAkBN,EAAM,MAAM,wBAAwB,EAC5D,GAAIM,EAAiB,CACpB,IAAMD,EAAM,WAAWC,EAAgB,CAAC,CAAC,EACzCL,GAAcE,EACb,sBACA,CAAC,EACDA,EAAe,UAAW,CAAE,MAAOE,EAAK,KAAM,QAAS,CAAC,EACvDF,EAAe,UAAW,CAAE,MAAOE,EAAK,KAAM,QAAS,CAAC,EACxDF,EAAe,UAAW,CAAE,MAAOE,EAAK,KAAM,QAAS,CAAC,CAC1D,CACD,CAGA,IAAME,EAAgBP,EAAM,MAAM,sBAAsB,EACxD,GAAIO,EAAe,CAClB,IAAMF,EAAM,WAAWE,EAAc,CAAC,CAAC,EACjCC,EAAY,EAAE,GAAMH,GAAO,GACjCJ,GAAcE,EACb,sBACA,CAAC,EACDA,EAAe,UAAW,CACzB,UAAAK,EACA,MAAOH,EACP,KAAM,QACP,CAAC,EACAF,EAAe,UAAW,CACzB,UAAAK,EACA,MAAOH,EACP,KAAM,QACP,CAAC,EACDF,EAAe,UAAW,CACzB,UAAAK,EACA,MAAOH,EACP,KAAM,QACP,CAAC,CACH,CACD,CAGA,IAAMI,EAAiBT,EAAM,MAAM,2BAA2B,EAC9D,GAAIS,EAAgB,CACnB,IAAMJ,EACLI,EAAe,CAAC,IAAM,IACnB,WAAWA,EAAe,CAAC,CAAC,EAAI,IAChC,WAAWA,EAAe,CAAC,CAAC,EAChCR,GAAcE,EAAe,gBAAiB,CAC7C,KAAM,WACN,OAAQ,EAAI,KAAK,IAAIE,EAAK,CAAC,CAC5B,CAAC,CACF,CAEA,OAAOJ,CACR,EAEaS,GACZC,GACY,CACZ,GAAM,CACL,UAAAC,EACA,YAAAC,EACA,OAAAC,EACA,GAAAC,EACA,KAAAC,EACA,OAAAC,EACA,MAAAC,EACA,IAAAC,EACA,MAAAC,CACD,EAAIT,EAEEV,EAAaF,GAAiBc,CAAW,EAC/C,GAAI,CAACZ,EACJ,MAAO,GAGR,IAAMoB,EAAW,aAAaN,CAAE,GAC1BO,EAAS,cAAcP,CAAE,GAGzBQ,EAAYpB,EACjB,SACA,CACC,OAAQ,OACR,GAAIkB,EACJ,MAAO,OACP,EAAG,OACH,EAAG,MACJ,EACApB,CACD,EAGMuB,EAAmBC,GAAO,CAAE,OAAAX,EAAQ,KAAAE,EAAM,IAAAG,EAAK,MAAAC,CAAM,EAAGF,CAAK,EAC7DQ,EAAcF,EACjBrB,EAAe,OAAQ,CAAE,EAAGqB,CAAiB,CAAC,EAC9CrB,EAAe,OAAQ,CAAE,OAAAW,EAAQ,MAAAM,EAAO,EAAGJ,EAAM,EAAGG,CAAI,CAAC,EACtDQ,EAAUxB,EAAe,WAAY,CAAE,GAAImB,CAAO,EAAGI,CAAW,EAEhEE,EAAOzB,EAAe,OAAQ,CAAC,EAAGoB,EAAYI,CAAO,EAGrDE,EAA4C,CACjD,YAAa,QAAQP,CAAM,IAC3B,OAAQ,QAAQD,CAAQ,IACxB,KAAM,IAAIT,CAAS,EACpB,EAEIK,IACHY,EAAS,KAAO,QAAQZ,CAAM,KAG/B,IAAMa,EAAa3B,EAAe,MAAO0B,CAAQ,EAEjD,OAAOD,EAAOE,CACf,ECzJA,IAAMC,GAAI,OAAO,IACfC,GAAID,yEACCE,GAAQ,IAAM,IAAI,OAAOF,0CAAyCC,EAAC,YAAYA,EAAC,KAAM,IAAI,ECSjG,IAAME,GAAa,IAAI,OAAOC,GAAiB,EAAG,GAAG,EAY/CC,GAAc,CACnB,MAAOF,GACP,OAAQ,WAAC,cAAW,GAAC,EACrB,KAAM,WAAC,YAAS,GAAC,CAClB,EAEMG,GAAO,CACZ,QAAS,WAAC,uEAA+D,GAAC,EAC1E,QAAS,WAAC,kBAAe,GAAC,EAC1B,QAAS,WAAC,eAAY,GAAC,EACvB,QAAS,WAAC,eAAY,GAAC,EACvB,QAAS,WAAC,eAAY,GAAC,EACvB,QAAS,WAAC,gBAAa,GAAC,EACxB,QAAS,WAAC,mBAAgB,GAAC,EAC3B,QAAS,WAAC,kBAAe,GAAC,EAC1B,QAAS,WAAC,iBAAc,GAAC,EACzB,QAAS,WAAC,qBAAkB,GAAC,EAC7B,QAAS,WAAC,kBAAe,GAAC,EAC1B,QAAS,WAAC,kBAAe,GAAC,EAC1B,WAAY,WAAC,sBAAmB,GAAC,EACjC,QAAS,WAAC,mBAAgB,GAAC,CAC5B,EAOaC,GAAU,OAAO,KAAK,CAAE,GAAGD,GAAM,GAAGD,EAAY,CAAC,EACvD,SAASG,GAAcC,EAAqB,CAClD,OAAOF,GAAQ,SAASE,CAAC,CAC1B,CAEO,SAASC,GACfC,EACAC,EACiD,CACjD,QAAWC,KAAK,OAAO,KAAKR,EAAW,EACtC,GAAIA,GAAYQ,CAAC,EAAE,KAAKF,CAAO,EAC9B,MAAO,CAACE,CAAC,EAIX,IAAMC,EAAY,OAAO,KAAKR,EAAI,EAAE,OAAOS,GAC1CT,GAAKS,CAAI,EAAE,KAAKJ,CAAO,CACxB,EAEA,GAAIG,EAAU,SAAW,EACxB,MAAO,CAAC,SAAS,EAGlB,GAAIF,EAAQ,CACX,IAAMI,EAAQF,EAAU,UAAUC,GAAQA,IAASH,CAAM,EACrDI,IAAU,KACbF,EAAU,OAAOE,EAAO,CAAC,EACzBF,EAAU,QAAQF,CAAM,EAE1B,CAEA,OAAOE,CACR,CAEO,SAASG,GAAgBL,EAAqC,CACpE,GAAIA,EACH,OAAOL,GAAQ,KAAKW,GACnBA,EAAE,YAAY,EAAE,WAAWN,EAAO,YAAY,CAAC,CAChD,CAEF,CChCA,eAAOO,GACNC,EACAC,EAKC,CAlEF,IAAAC,GAmEC,IAAMC,EAAO,MAAMC,GAAQ,EACrB,CACL,GAAAC,EACA,eAAAC,EACA,OAAAC,EACA,KAAAC,EACA,MAAAC,EACA,OAAAC,EACA,UAAAC,EAAY,GACZ,eAAAC,EACA,wBAAAC,CACD,EAAIZ,EAGJ,GAAID,IAAY,MAAQ,OAAOA,EAAY,IAC1C,aACA,MACO,GAIR,GAAI,CAACc,GAAed,CAAO,GAAKe,GAAiBf,EAAQ,IAAI,EAAG,CAC/D,IAAIgB,EAEJ,GAAI,CAACF,GAAed,CAAO,EAE1BgB,EAAOC,GAAe,OAAOjB,CAAO,EAAGC,CAAO,EAC9C,MAAO,MAAMe,EAAK,KAAK,GAAG,UAIpB,CACN,GAAIE,GAAQlB,EAAQ,IAAgB,EACnC,MAAM,IAAI,MAAM,mCAAmC,EAGpD,IAAImB,EAIAC,GAAsBpB,EAAQ,IAAI,EACrCmB,EAAUnB,EAAQ,KAAa,OAE/BmB,EAASnB,EAAQ,KAOlBgB,EAAOjB,GAAO,MAAMoB,EAAOnB,EAAQ,KAAK,EAAGC,CAAO,EAClD,MAAO,MAAMe,EAAK,KAAK,GAAG,KAI3B,CAEA,MAAMA,EAAK,KAAK,EAChB,IAAMK,EAAS,MACf,OAAQ,MAAML,EAAK,KAAKK,CAAM,GAAG,KAClC,CAGA,GAAM,CAAE,KAAMC,EAAO,MAAAC,CAAM,EAAIvB,EAEzBwB,EAAOF,EAEb,GAAIC,GAASE,GAA+BF,CAAK,EAChD,MAAM,IAAI,MACT,iIACD,EAED,GAAI,CAAE,MAAAG,EAAO,SAAAC,EAAU,KAAMC,EAAalB,CAAO,EAAIa,GAAS,CAAC,EACzDM,EAAYC,GAAgBF,CAAU,EAEtCG,EAAO5B,EAAK,KAAK,OAAO,EAC9BI,EAAO,YAAYwB,EAAMxB,EAAO,cAAc,CAAC,EAE/C,GAAM,CAACyB,EAAeC,CAAmB,EAAI,MAAMC,GAClDH,EACAP,EACAlB,EACAoB,EACAH,CACD,EAKMY,EACLH,EAAc,YAAc1B,EAAe,UA+B5C,GA9BK6B,IACHH,EAAc,UAAkB,SAAW1B,EAAe,YAM3D0B,EAAc,WAAa,UAC1BA,EAAc,UAAYA,EAAc,WAAa,UAEtDC,EAAoB,qBAAuB,aAAa5B,CAAE,GAC1D4B,EAAoB,iBAAmB,aAAa5B,CAAE,IAGnD2B,EAAc,YACjBC,EAAoB,iBAAmB,aAAa5B,CAAE,IAInD2B,EAAc,gBAAkB/B,EAAQ,yBAC3CA,EAAQ,wBAAwB,CAC/B,OAAQ+B,EAAc,eACtB,eAAgBC,EAChB,KAAAF,EACA,MAAOC,CACR,CAAC,EAKEA,EAAc,iBAAmB,OAAQ,CAC5C,IAAMI,EAAiB,CAAE,MAAO,EAAG,EACnCH,EAAoB,iCAAmCG,EACvDJ,EAAc,iCAAmCI,EAE7CJ,EAAc,kBACjBC,EAAoB,0CACnB,OACDD,EAAc,0CAA4C,OAE5D,CAGA,IAAMK,EAAqBC,GAAkBX,CAAQ,EAC/CY,EAAyC,CAAC,EAC1CC,EAA0D,CAAC,EAE7DC,GAAI,EACFC,GAA2D,CAAC,EAClE,QAAWC,KAASN,EAAoB,CACvC,IAAMO,EAAeH,GACfzB,EAAOjB,GAAO4C,EAAO,CAC1B,GAAItC,EAAK,IAAMoC,KACf,YAAaT,EACb,eAAgBC,EAChB,sBAAuB,GACvB,OAAQF,EACR,KAAAvB,EACA,UAAAG,EACA,MAAAF,EACA,eAAAG,EACA,wBAAAC,EACA,OAAQgB,EACR,eAAgB5B,EAAQ,eACxB,wBAA0B4C,IAA6B,CACtDL,EAAoBI,CAAY,EAAIC,EACrC,CACD,CAAC,EACGhC,EACH6B,GAAoB,KACnB,IAAM,MAAM1B,EAAK,KAAK,GAAG,OAAiB,CAAC,CAC5C,EAEA,MAAMA,EAAK,KAAK,EAEjBuB,EAAU,KAAKvB,CAAI,CACpB,CACA,MAAM0B,GACN,QAAW1B,KAAQuB,EAAW,MAAMvB,EAAK,KAAK,EAG9C,GAAM,CAAC8B,GAAGC,EAAC,EAAI,MACX,CAAE,KAAAC,GAAM,IAAAC,GAAK,MAAAC,GAAO,OAAAC,EAAO,EAAIpB,EAAK,kBAAkB,EAE1DiB,IAAQF,GACRG,IAAOF,GAEP,IAAIK,EAAuB,GACvBC,GAAmB,GACnBC,GAAmB,GAKjB,CAAE,SAAUC,GAAc,GAAGC,EAAU,EAAIjC,EAajD,IAZArB,GAAAD,EAAQ,iBAAR,MAAAC,GAAA,KAAAD,EAAyB,CACxB,KAAA+C,GACA,IAAAC,GACA,MAAAC,GACA,OAAAC,GACA,KAAA3B,EACA,MAAOgC,GACP,IAAKxD,EAAQ,IACb,YAAac,GAAeyC,EAAY,EAAI,OAAYA,EACzD,GAGI/B,IAAS,MAAO,CACnB,IAAMiC,EAAMzB,EAAc,MAC1BqB,GAAmB,MAAMK,GACxB,CACC,GAAArD,EACA,KAAA2C,GACA,IAAAC,GACA,MAAAC,GACA,OAAAC,GACA,IAAAM,EACA,sBAAAtB,EACA,MAAA1B,CACD,EACAuB,EACAC,CACD,CACD,SAAWT,IAAS,MAAO,CAG1B,IAAMmC,EAAe3B,EAAc,MAC7ByB,EAAM,MAAMG,GAAe5D,EAAS2D,CAAY,EACtDN,GAAmB,MAAMK,GACxB,CACC,GAAArD,EACA,KAAA2C,GACA,IAAAC,GACA,MAAAC,GACA,OAAAC,GACA,IAAAM,EACA,sBAAAtB,EACA,MAAA1B,CACD,EACAuB,EACAC,CACD,CACD,KAAO,CACN,IAAM4B,EAAUnC,GAAA,YAAAA,EAAO,QACvB,GACCF,IAAS,OACTG,GACA,OAAOA,GAAa,UACpBkC,IAAY,QACZA,IAAY,QACZA,IAAY,WAEZ,MAAM,IAAI,MACT,8HACD,EAEDR,GAAmB,MAAMK,GACxB,CAAE,GAAArD,EAAI,KAAA2C,GAAM,IAAAC,GAAK,MAAAC,GAAO,OAAAC,GAAQ,sBAAAhB,EAAuB,MAAA1B,CAAM,EAC7DuB,EACAC,CACD,CACD,CAGA,QAAS6B,EAAI,EAAGA,EAAIvB,EAAU,OAAQuB,IAAK,CAG1C,GAAItB,EAAoBsB,CAAC,EAAG,CAC3B,IAAMjB,EAAOL,EAAoBsB,CAAC,EAC5BC,EAAclB,EAAK,KAAK,kBAAkB,EAC1CmB,GAAYhB,GAAOe,EAAY,KAC/BE,GAAWhB,GAAMc,EAAY,IAC7BG,EAAaH,EAAY,MACzBI,GAAcJ,EAAY,OAE1BK,GAAY,eAAe/D,CAAE,IAAIyD,CAAC,GAClCO,GAAiBhB,GAAmBD,EAC1CC,GAAmB,UAAUe,EAAS,KAAKC,EAAc,OACzDjB,EAAuB,GAGvB,IAAMkB,GAAUjE,EAAK,IAAMyD,EACrBS,GAAS1B,EAAK,MAAM,UACvB,aAAayB,EAAO,GACpB,OAEHlB,GAAwBoB,GAAoB,CAC3C,UAAAJ,GACA,YAAavB,EAAK,OAClB,OAAQsB,GACR,GAAIG,GACJ,KAAMN,GACN,OAAAO,GACA,MAAO1B,EAAK,MACZ,IAAKoB,GACL,MAAOC,CACR,CAAC,CACF,CAEAd,IAAyB,MAAMb,EAAUuB,CAAC,EAAE,KAAK,CAACd,GAAMC,EAAG,CAAC,GAAG,KAChE,CAIA,OAAIjB,EAAc,mCACjBsB,IAAoBmB,EACnB,WACA,CACC,GAAI,cAAcpE,CAAE,GACpB,YAAa2B,EAAc,qBACxB,QAAQA,EAAc,oBAAoB,IAC1C,MACJ,EACCA,EAAc,iCAAyC,KACzD,GAGMsB,GAAmBD,GAAmBD,CAC9C,CCrXA,OAAOsB,OAAc,uBAOrB,IAAMC,GAA2B,UAmDjC,SAASC,GAAYC,EAAoD,CACxE,IAAMC,EAA0B,CAAC,EAC7BC,EAAmB,CAAC,EAAG,CAAC,EACxBC,EAAqB,CAAC,EAAG,CAAC,EAExBC,EAAW,CAACC,EAAqBC,IAAkB,CACxD,IAAIC,EAAOF,EAAO,CAAC,EACnB,QAASG,EAAI,EAAGA,GAAKF,EAAOE,IAAK,CAChC,IAAMC,EAAID,EAAIF,EACRI,EAAOC,GAAeN,EAAQI,CAAC,EACrCR,EAAS,KAAK,CAAE,KAAMM,EAAM,GAAIG,CAAK,CAAC,EACtCH,EAAOG,CACR,CACAP,EAAUE,EAAOA,EAAO,OAAS,CAAC,CACnC,EAEA,QAAWO,KAAOZ,EAAU,CAC3B,GAAIY,EAAI,OAAS,IAAK,CACrBV,EAAQC,EAAU,CAACS,EAAI,EAAGA,EAAI,CAAC,EAC/B,QACD,CAEA,GAAIA,EAAI,OAAS,IAAK,CACrB,IAAMF,EAAkB,CAACE,EAAI,EAAGA,EAAI,CAAC,EACrCX,EAAS,KAAK,CAAE,KAAME,EAAS,GAAIO,CAAK,CAAC,EACzCP,EAAUO,EACV,QACD,CAEA,GAAIE,EAAI,OAAS,IAAK,CACrBR,EAAS,CAACD,EAAS,CAACS,EAAI,GAAIA,EAAI,EAAE,EAAG,CAACA,EAAI,EAAGA,EAAI,CAAC,CAAC,EAAG,EAAE,EACxD,QACD,CAEA,GAAIA,EAAI,OAAS,IAAK,CACrBR,EACC,CAACD,EAAS,CAACS,EAAI,GAAIA,EAAI,EAAE,EAAG,CAACA,EAAI,GAAIA,EAAI,EAAE,EAAG,CAACA,EAAI,EAAGA,EAAI,CAAC,CAAC,EAC5D,EACD,EACA,QACD,CAEIA,EAAI,OAAS,MAChBX,EAAS,KAAK,CAAE,KAAME,EAAS,GAAID,CAAM,CAAC,EAC1CC,EAAUD,EAEZ,CAEA,OAAOD,CACR,CAEA,SAASU,GAAeN,EAAqBI,EAAsB,CAClE,IAAII,EAAUR,EAEd,KAAOQ,EAAQ,OAAS,GAAG,CAC1B,IAAMH,EAAoB,CAAC,EAC3B,QAASF,EAAI,EAAGA,EAAIK,EAAQ,OAAS,EAAGL,IACvCE,EAAK,KAAK,CACTG,EAAQL,CAAC,EAAE,CAAC,GAAKK,EAAQL,EAAI,CAAC,EAAE,CAAC,EAAIK,EAAQL,CAAC,EAAE,CAAC,GAAKC,EACtDI,EAAQL,CAAC,EAAE,CAAC,GAAKK,EAAQL,EAAI,CAAC,EAAE,CAAC,EAAIK,EAAQL,CAAC,EAAE,CAAC,GAAKC,CACvD,CAAC,EAEFI,EAAUH,CACX,CAEA,OAAOG,EAAQ,CAAC,CACjB,CAEA,SAASC,GACRd,EACAe,EACa,CACb,GAAI,CAACA,EAAM,MAAO,CAAC,EAEnB,IAAMC,EAAcD,EAAK,YACnBE,EAAUF,EAAK,WAAaC,EAAc,IAC1CE,EAAUH,EAAK,WAAaC,EAAc,IAE1Cf,EAAWF,GAAYC,CAAQ,EACrC,GAAI,CAACC,EAAS,OAAQ,MAAO,CAAC,EAE9B,IAAMkB,EAAaD,EAAUD,EACvBG,EAAW,KAAK,IAAI,GAAI,KAAK,KAAKD,EAAa,GAAI,CAAC,EACpDE,EAAQF,EAAaC,EACrBE,EAASL,EAAUI,EAAQ,EAE3BE,EAAa,IAAI,IAEvB,QAASf,EAAI,EAAGA,EAAIY,EAAUZ,IAAK,CAClC,IAAMgB,EAAIF,EAASD,EAAQb,EACrBiB,EAA0B,CAAC,EAEjC,QAAWC,KAAOzB,EAAU,CAC3B,GAAM,CAAC0B,EAAIC,CAAE,EAAIF,EAAI,KACf,CAACG,EAAIC,EAAE,EAAIJ,EAAI,GAErB,GAAIE,IAAOE,GAAI,SACf,IAAMC,GAAO,KAAK,IAAIH,EAAIE,EAAE,EACtBE,GAAO,KAAK,IAAIJ,EAAIE,EAAE,EAC5B,GAAIN,EAAIO,IAAQP,GAAKQ,GAAM,SAE3B,IAAMvB,IAAKe,EAAII,IAAOE,GAAKF,GACrBK,GAAIN,GAAME,EAAKF,GAAMlB,GAC3BgB,EAAc,KAAKQ,EAAC,CACrB,CAEA,GAAKR,EAAc,OACnB,CAAAA,EAAc,KAAK,CAACS,EAAGC,IAAMD,EAAIC,CAAC,EAElC,QAASC,EAAI,EAAGA,EAAIX,EAAc,OAAS,EAAGW,GAAK,EAAG,CACrD,IAAMC,EAAO,KAAK,IAAIZ,EAAcW,CAAC,EAAGX,EAAcW,EAAI,CAAC,CAAC,EACtDE,EAAK,KAAK,IAAIb,EAAcW,CAAC,EAAGX,EAAcW,EAAI,CAAC,CAAC,EACpDlC,EAAQ,KAAK,MAAMmC,CAAI,EACvBE,GAAM,KAAK,KAAKD,CAAE,EACxB,QAASE,GAAMtC,EAAOsC,GAAMD,GAAKC,KAChCjB,EAAW,IAAIiB,EAAG,CAEpB,EACD,CAEA,GAAI,CAACjB,EAAW,KAAM,MAAO,CAAC,EAE9B,IAAMkB,EAAU,MAAM,KAAKlB,EAAW,OAAO,CAAC,EAAE,KAAK,CAACW,EAAGC,IAAMD,EAAIC,CAAC,EAC9DO,EAAgC,CAAC,EAEnCC,EAAaF,EAAQ,CAAC,EACtBlC,EAAOkC,EAAQ,CAAC,EACpB,QAASjC,EAAI,EAAGA,EAAIiC,EAAQ,OAAQjC,IAAK,CACxC,IAAMgC,EAAMC,EAAQjC,CAAC,EACjBgC,EAAMjC,EAAO,IAChBmC,EAAU,KAAK,CAACC,EAAYpC,EAAO,CAAC,CAAC,EACrCoC,EAAaH,GAEdjC,EAAOiC,CACR,CACAE,EAAU,KAAK,CAACC,EAAYpC,EAAO,CAAC,CAAC,EAErC,IAAMqC,EAAoB,CAAC,EACrBC,EAAQ7B,EAAc,GACtB8B,EAAOJ,EAAU,CAAC,EAAE,CAAC,EACrBK,EAAOL,EAAUA,EAAU,OAAS,CAAC,EAAE,CAAC,EAE9C,OAAW,CAACf,EAAIE,CAAE,IAAKa,EAAW,CACjC,IAAMM,EAAO,KAAK,IAAIrB,EAAImB,CAAI,EAAID,EAC5BI,EAAQ,KAAK,IAAIpB,EAAIkB,CAAI,EAAIF,EACnCD,EAAM,KAAK,CACV,GAAII,EACJ,GAAIC,EACJ,GAAIhC,EACJ,GAAIC,CACL,CAAC,CACF,CAEA,OAAO0B,CACR,CA6BA,SAASM,GACRC,EACAC,EACA,CAACC,EAAeC,CAAY,EAC5B,CAACC,EAAYC,CAAS,EACrB,CACD,GAAIH,IAAkBE,EAErB,OAAKF,EACD,CAACE,GAGDF,IAAkBF,EAAe,GACjCI,IAAeJ,EAAe,EAG9BA,IAAW,KAAOE,IAAkB,KACpCF,IAAW,KAAOE,IAAkB,IAAY,GAChDF,IAAW,KAAOI,IAAe,KACjCJ,IAAW,KAAOI,IAAe,IAAY,EAG7CJ,EAAS,IACRE,EAAgBF,GAAUI,EAAaJ,EACnCI,EAAaF,EACjBA,EAAgBF,EAAe,GAC/BI,EAAaJ,EAAe,EACzBE,EAAgBE,EAIpBJ,EAASE,GAAiBF,EAASI,EAC/BF,EAAgBE,EACpBJ,EAASE,EAAsB,GAC/BF,EAASI,EAAmB,EACzBA,EAAaF,EA3BO,EA8B5B,GAAIC,IAAiBE,EAAW,CAE/B,GAAIF,IAAiBF,EAAO,MAAO,GACnC,GAAII,IAAcJ,EAAO,MAAO,EACjC,CAEA,MAAO,EACR,CAEA,IAAMK,GAAmB,IAAI,QAKRC,GAArB,KAAgC,CAG/B,YAAYC,EAA4B,CADxC,WAAQ,IAAI,IAEX,KAAK,SAASA,CAAW,CAC1B,CAGQ,IAAI,CACX,KAAAC,EACA,OAAAT,EACA,MAAAC,CACD,EAIG,CACF,GAAI,CAAC,KAAK,MAAM,IAAIQ,CAAI,EACvB,OAAO,KAGJT,IAAW,WAAUA,EAAS,KAC9BA,IAAW,SAAQA,EAAS,KAC5B,OAAOA,GAAW,WACrBA,EAAS,OAAO,SAASA,EAAQ,EAAE,GAEpC,IAAMU,EAAQ,CAAC,GAAG,KAAK,MAAM,IAAID,CAAI,CAAC,EAElCE,EAAcD,EAAM,CAAC,EAIzB,QAASE,EAAI,EAAGA,EAAIF,EAAM,OAAQE,IAAK,CACtC,GAAM,CAAC,CAAEC,EAASC,CAAM,EAAIH,EACtB,CAAC,CAAEI,EAASC,CAAM,EAAIN,EAAME,CAAC,EAElCb,GACCC,EACAC,EACA,CAACY,EAASC,CAAM,EAChB,CAACC,EAASC,CAAM,CACjB,EAAI,IAEJL,EAAcD,EAAME,CAAC,EAEvB,CAEA,OAAOD,EAAY,CAAC,CACrB,CAEO,SAASH,EAA4B,CAC3C,QAAWS,KAAcT,EAAa,CACrC,GAAM,CAAE,KAAAC,EAAM,KAAAS,EAAM,KAAAC,CAAK,EAAIF,EAC7B,GAAIE,GAAQ,CAACC,GAAcD,CAAI,EAC9B,MAAM,IAAI,MACT,sCAAsCA,CAAI,8CAA8CE,GAAQ,KAC/F,IACD,CAAC,GACF,EAED,IAAMC,EAAQH,GAAQI,GAClBC,EAEJ,GAAIlB,GAAiB,IAAIY,CAAI,EAC5BM,EAAOlB,GAAiB,IAAIY,CAAI,MAC1B,CACNM,EAAOC,GAAS,MAEf,WAAYP,EACTA,EAAK,OAAO,MACZA,EAAK,WACLA,EAAK,WAAaA,EAAK,UACvB,EACAA,EAEH,CAAE,UAAW,EAAK,CACnB,EAGA,IAAMQ,EAA2BF,EAAK,iBACtCA,EAAK,iBAAmBG,GAAQ,CAC/B,IAAMC,EAAQF,EAAyB,KAAKF,EAAMG,CAAI,EACtD,OAAIC,IAAU,GAERJ,EAAa,mBAChBA,EAAa,kBAAkB,KAAKG,CAAI,EAGpCC,CACR,EAEAtB,GAAiB,IAAIY,EAAMM,CAAI,CAChC,CAGK,KAAK,cAAa,KAAK,YAAcA,GAE1C,IAAMK,EAAQ,GAAGpB,EAAK,YAAY,CAAC,IAAIa,CAAK,GAEvC,KAAK,MAAM,IAAIO,CAAK,GACxB,KAAK,MAAM,IAAIA,EAAO,CAAC,CAAC,EAEzB,KAAK,MACH,IAAIA,CAAK,EACT,KAAK,CAACL,EAAMP,EAAW,OAAQA,EAAW,KAAK,CAAC,CACnD,CACD,CAEO,UACNa,EAAW,GACXC,EAA8B,SAC9B,CACC,WAAAC,EAAa,aACb,WAAAC,EAAa,IACb,UAAAC,EAAY,QACb,EAKAC,EACa,CACb,GAAI,CAAC,KAAK,MAAM,KACf,MAAM,IAAI,MACT,6EACD,EAGDH,GACC,MAAM,QAAQA,CAAU,EAAIA,EAAa,CAACA,CAAU,GACnD,IAAIvB,GAAQA,EAAK,YAAY,CAAC,EAChC,IAAMC,EAAQ,CAAC,EACfsB,EAAW,QAAQI,GAAQ,CAC1B,IAAMC,EAAY,KAAK,IAAI,CAC1B,KAAMD,EACN,OAAQH,EACR,MAAOC,CACR,CAAC,EACD,GAAIG,EAAW,CACd3B,EAAM,KAAK2B,CAAS,EACpB,MACD,CAEA,IAAMC,EAAa,KAAK,IAAI,CAC3B,KAAMF,EAAO,WACb,OAAQH,EACR,MAAOC,CACR,CAAC,EAED,GAAII,EAAY,CACf5B,EAAM,KAAK4B,CAAU,EACrB,MACD,CACD,CAAC,EAGD,IAAMC,EAAO,MAAM,KAAK,KAAK,MAAM,KAAK,CAAC,EACnCC,EAAqB,CAAC,EACtBC,EAAwB,CAAC,EACzBC,EAAkB,CAAC,EACzB,QAAWjC,KAAQ8B,EAClB,GAAI,CAAAP,EAAW,SAASvB,CAAI,EAC5B,GAAI0B,EAAQ,CACX,IAAMhB,EAAOwB,GAAoBlC,CAAI,EACjCU,EACCA,IAASgB,EACZK,EAAmB,KAClB,KAAK,IAAI,CACR,KAAA/B,EACA,OAAQwB,EACR,MAAOC,CACR,CAAC,CACF,EAEAO,EAAsB,KACrB,KAAK,IAAI,CACR,KAAAhC,EACA,OAAQwB,EACR,MAAOC,CACR,CAAC,CACF,EAGDQ,EAAgB,KACf,KAAK,IAAI,CACR,KAAAjC,EACA,OAAQwB,EACR,MAAOC,CACR,CAAC,CACF,CAEF,MACCQ,EAAgB,KACf,KAAK,IAAI,CACR,KAAAjC,EACA,OAAQwB,EACR,MAAOC,CACR,CAAC,CACF,EAIF,IAAMU,EAAqB,IAAI,IACzBC,EAAc,CAACC,EAAcC,EAAW,KAAS,CACtD,IAAMC,EAAS,CACd,GAAGtC,EACH,GAAGgC,EACH,GAAGF,EACH,GAAIO,EAAWN,EAAwB,CAAC,CACzC,EAEA,GAAI,OAAOK,EAAS,IACnB,OAAIC,EACIC,EAAOA,EAAO,OAAS,CAAC,EAEhC,OAGD,IAAMC,EAAOH,EAAK,WAAW,CAAC,EAC9B,GAAIF,EAAmB,IAAIK,CAAI,EAC9B,OAAOL,EAAmB,IAAIK,CAAI,EAEnC,IAAMzB,EAAOwB,EAAO,KAAK,CAACE,EAAOtB,IAE/B,CAAC,CAACsB,EAAM,iBAAiBJ,CAAI,GAC5BC,GAAYnB,IAAUoB,EAAO,OAAS,CAExC,EAED,OAAIxB,GACHoB,EAAmB,IAAIK,EAAMzB,CAAI,EAG3BA,CACR,EAEM2B,EAAW,CAACC,EAA6BC,EAAc,KAAU,CAphBzE,IAAAC,EAAAC,EAwhBG,QAFEF,GAAcE,GAAAD,EAAAF,EAAa,SAAb,YAAAE,EAAqB,MAArB,YAAAC,EAA0B,cAAgB,IACzDH,EAAa,UACMA,EAAa,WAActB,CAChD,EAEM0B,EAAY,CACjBJ,EACAC,EAAc,KACV,CA9hBP,IAAAC,EAAAC,EAkiBG,QAFEF,GAAcE,GAAAD,EAAAF,EAAa,SAAb,YAAAE,EAAqB,MAArB,YAAAC,EAA0B,eAAiB,IAC1DH,EAAa,WACOA,EAAa,WAActB,CACjD,EAEM2B,EAAS,CAACL,EAA6BC,EAAc,KAAU,CAriBvE,IAAAC,EAAAC,EAsiBG,GAAiB,OAAOxB,GAApB,UAA+CA,IAAb,SAAyB,CAC9D,IAAM2B,GACJL,GACEE,GAAAD,EAAAF,EAAa,SAAb,YAAAE,EAAqB,MAArB,YAAAC,EAA0B,aAC1B,IAAM,EACV,OACCJ,EAASC,EAAcC,CAAW,EAClCG,EAAUJ,EAAcC,CAAW,EAClCK,EAAWN,EAAa,WAActB,CAEzC,SAAwB,OAAOC,GAApB,SACV,OAAOD,EAAWC,CAEpB,EAEM4B,EAAWC,GACTf,EAAYe,EAAG,EAAK,EAyD5B,MAtDe,CACd,IAAMA,GAAc,CACnB,GAAIA,IAAM;AAAA,EAAM,MAAO,GACvB,IAAMpC,EAAOmC,EAAQC,CAAC,EACtB,OAAKpC,GACJA,EAAa,kBAAoB,CAAC,EACnCA,EAAK,eAAeoC,CAAC,EACfpC,EAAa,kBAAkB,QACpCA,EAAa,kBAAoB,OAC3B,IAF6C,IAHlC,EAMnB,EACA,SAAU,CACToC,EACAR,EAAe,OAAOQ,EAAM,IACzBlD,EAAM,CAAC,EACPmC,EAAYe,CAAC,IACZ,CACJ,IAAMC,EAAMV,EAASC,CAAY,EAC3BU,EAAON,EAAUJ,CAAY,EAC7BW,EAAgBF,EAAMC,EAE5B,OAAOD,GAAOJ,EAAOL,CAAY,EAAIW,GAAiB,CACvD,EACA,OAAQ,CACPH,EACAR,EAAe,OAAOQ,EAAM,IACzBlD,EAAM,CAAC,EACPmC,EAAYe,CAAC,IAETH,EAAOL,CAAY,EAE3B,QAAS,CACRQ,EACA3D,IAKO,KAAK,QAAQ4C,EAAae,EAAG3D,CAAK,EAE1C,OAAQ,CACP2D,EACA3D,EAMA+D,IAEO,KAAK,OAAOnB,EAAae,EAAG3D,EAAO+D,CAAI,CAEhD,CAGD,CAEQ,0BACPxC,EACAqB,EACC,CACD,IAAMoB,EAAc,CAAC,EACpBzC,EAAa,kBAAoByC,EAElC,IAAMC,EAAyB1C,EAAK,eACpC,OAAAA,EAAK,eAAiB,CAACoC,KAAcO,IAAc,CAClD,IAAMC,EAASF,EAAuB,KAAK1C,EAAMoC,EAAG,GAAGO,CAAI,EAE3D,QAASvD,EAAI,EAAGA,EAAIwD,EAAO,OAAQxD,IAIlC,GAAIwD,EAAOxD,CAAC,EAAE,UAAY,OAAW,CACpC,IAAMe,EAAOsC,EAAY,MAAM,EACzBI,EAAcxB,EAAYlB,CAAI,EACpC,GAAI0C,IAAgB7C,EAAM,CACzB,IAAM8C,EAAQD,EAAY,YAAY1C,CAAI,EAEpC4C,EAAQ/C,EAAK,WAAa6C,EAAY,WACtCG,EAAI,IAAI/C,GAAS,KACvB+C,EAAE,WAAahD,EAAK,WACpBgD,EAAE,SAAWF,EAAM,KAAK,SAAS,IAAIG,GAAW,CAC/C,IAAMC,EAAgB,CAAE,GAAGD,CAAQ,EACnC,QAASE,KAAKD,EACT,OAAOA,EAAcC,CAAC,GAAM,WAC/BD,EAAcC,CAAC,GAAKJ,GAGtB,OAAOG,CACR,CAAC,EACD,IAAME,EAAI,IAAInD,GAAS,MAAM,CAC5B,GAAG6C,EACH,aAAcA,EAAM,aAAeC,EACnC,KAAMD,EAAM,KAAOC,EACnB,KAAMD,EAAM,KAAOC,EACnB,KAAMD,EAAM,KAAOC,EACnB,KAAMD,EAAM,KAAOC,EACnB,KAAMC,CACP,CAAC,EAEDJ,EAAOxD,CAAC,EAAIgE,CACb,CACD,CAGD,OAAOR,CACR,EAEO,IAAM,CACZ5C,EAAK,eAAiB0C,EACrB1C,EAAa,kBAAoB,MACnC,CACD,CAEQ,QACPqB,EACAgC,EACA,CACC,SAAA/C,EACA,cAAAgD,EAAgB,CACjB,EAIC,CACD,IAAMtD,EAAOqB,EAAYgC,CAAO,EAC1BE,EAAU,KAAK,0BAA0BvD,EAAMqB,CAAW,EAEhE,GAAI,CACH,OAAOrB,EAAK,gBAAgBqD,EAAS/C,EAAU,CAC9C,cAAegD,EAAgBhD,CAChC,CAAC,CACF,QAAE,CACDiD,EAAQ,CACT,CACD,CAEQ,OACPlC,EACAgC,EACA,CACC,SAAA/C,EACA,IAAAkD,EACA,KAAAC,EACA,cAAAH,EAAgB,CACjB,EAMAd,EACsC,CACtC,IAAMxC,EAAOqB,EAAYgC,CAAO,EAC1BE,EAAU,KAAK,0BAA0BvD,EAAMqB,CAAW,EAEhE,GAAI,CACH,GAAIf,IAAa,EAChB,MAAO,CAAE,KAAM,GAAI,MAAO,CAAC,CAAE,EAG9B,IAAMoD,EAAW,IAAIzD,GAAS,KACxB0D,EAAoB,CAAC,EAErBC,EAAU,CACf,cAAeN,EAAgBhD,CAChC,EAEMuD,EAAa,IAAI,QAKvB,OAAA7D,EAAK,aACJqD,EAAQ,QAAQ,MAAO,EAAE,EACzBI,EACAD,EACAlD,EACAsD,EACA,SAAUd,EAAOgB,EAAIC,EAAIC,EAAW,CACnC,IAAIC,EACJ,GAAI,CAACJ,EAAW,IAAIf,CAAK,EACxBmB,EAAYnB,EAAM,QAAQgB,EAAIC,EAAIC,EAAWJ,CAAO,EACpDC,EAAW,IAAIf,EAAO,CAACgB,EAAIC,EAAIE,CAAS,CAAC,MACnC,CACN,GAAM,CAACC,EAAIC,EAAIC,CAAU,EAAIP,EAAW,IAAIf,CAAK,EACjDmB,EAAY,IAAIhE,GAAS,KACzBgE,EAAU,SAAWG,EAAW,SAAS,IACxCnB,GAAW,CACV,IAAMoB,EAAe,CAAE,GAAGpB,CAAQ,EAClC,QAASE,KAAKkB,EACT,OAAOA,EAAalB,CAAC,GAAM,YAE7BA,IAAM,KACNA,IAAM,MACNA,IAAM,QAENkB,EAAalB,CAAC,GAAKW,EAAKI,IAGxBf,IAAM,KACNA,IAAM,MACNA,IAAM,QAENkB,EAAalB,CAAC,GAAKY,EAAKI,IAI3B,OAAOE,CACR,CACD,CACD,CAEA,IAAMC,EAAY9B,EACf+B,GAAeN,EAAU,SAAUzB,CAAI,EACvC,CAAC,EACA8B,EAAU,QACbX,EAAM,KAAK,GAAGW,CAAS,EAGxBZ,EAAS,OAAOO,CAAS,CAC1B,CACD,EAEO,CACN,KAAMP,EAAS,WAAW,CAAC,EAC3B,MAAAC,CACD,CACD,QAAE,CACDJ,EAAQ,CACT,CACD,CACD,EAEA,SAASpC,GAAoBlC,EAAkC,CAC9D,IAAMuF,EAAMvF,EAAK,MAAM,GAAG,EACpBU,EAAO6E,EAAIA,EAAI,OAAS,CAAC,EAE/B,OAAO7E,IAASI,GAA2B,OAAaJ,CACzD,CCtyBe,SAAR8E,GAAqB,CAC3B,MAAAC,EACA,OAAAC,EACA,QAAAC,CACD,EAIG,CACF,OAAOC,EACN,MACA,CACC,MAAAH,EACA,OAAAC,EACA,QAAS,OAAOD,CAAK,IAAIC,CAAM,GAC/B,MAAO,4BACR,EACAC,CACD,CACD,CCRA,IAAME,GAAY,IAAI,QA2BtB,eAAOC,GACNC,EACAC,EACkB,CAClB,IAAMC,EAAO,MAAMC,GAAQ,EAC3B,GAAI,CAACD,GAAQ,CAACA,EAAK,KAClB,MAAM,IAAI,MACT,8DAAgEA,CACjE,EAEDD,EAAQ,MAAQA,EAAQ,OAAS,CAAC,EAElC,IAAIG,EACAN,GAAU,IAAIG,EAAQ,KAAK,EAC9BG,EAAON,GAAU,IAAIG,EAAQ,KAAK,EAElCH,GAAU,IAAIG,EAAQ,MAAQG,EAAO,IAAIC,GAAWJ,EAAQ,KAAK,CAAE,EAGpE,IAAMK,EAAe,UAAWL,EAAUA,EAAQ,MAAQ,OACpDM,EAAgB,WAAYN,EAAUA,EAAQ,OAAS,OAEvDO,EAAOC,GAAYP,EAAMD,EAAQ,gBAAgB,EACnDK,GAAcE,EAAK,SAASF,CAAY,EACxCC,GAAeC,EAAK,UAAUD,CAAa,EAC/CC,EAAK,iBAAiBN,EAAK,kBAAkB,EAC7CM,EAAK,YAAYN,EAAK,SAAS,EAC/BM,EAAK,gBAAgBN,EAAK,UAAU,EACpCM,EAAK,cAAcN,EAAK,gBAAgB,EACxCM,EAAK,kBAAkBN,EAAK,kBAAkB,EAC9CM,EAAK,YAAYN,EAAK,eAAe,EAErC,IAAMQ,EAAiB,CAAE,GAAGT,EAAQ,cAAe,EAa7CU,EAA6B,IAAI,IAEvCC,GAAM,MAAM,EACZC,GAAiB,MAAM,EACvB,MAAMC,GAAed,CAAO,EAE5B,IAAMe,EAAUC,GAAOhB,EAAS,CAC/B,GAAI,KACJ,YAAa,CAAC,EACd,eAAgB,CACf,SAAU,GACV,WAAY,SACZ,WAAY,QACZ,UAAW,SACX,WAAY,SACZ,MAAO,QACP,QAAS,EACT,WAAY,SAGZ,eAAgBM,EAChB,gBAAiBC,CAClB,EACA,OAAQC,EACR,KAAAJ,EACA,UAAWH,EAAQ,UACnB,MAAOA,EAAQ,MACf,eAAAS,EACA,wBAAyB,CAAC,CAACT,EAAQ,oBACnC,eAAgBA,EAAQ,cACzB,CAAC,EAEKgB,GAAuB,MAAMF,EAAQ,KAAK,GAAG,MAKnD,GAAId,EAAQ,qBACPgB,EAAoB,OAAQ,CAC/B,IAAMC,EAAgBC,GAAuBF,CAAmB,EAC1DG,EAAuB,CAAC,EACxBC,EAAiC,CAAC,EAExC,MAAM,QAAQ,IACb,OAAO,QAAQH,CAAa,EAAE,QAAQ,CAAC,CAACI,EAAMC,CAAQ,IACrDA,EAAS,IAAIC,GAAY,CACxB,IAAMC,EAAM,GAAGH,CAAI,IAAIE,CAAQ,GAC/B,OAAIb,EAA2B,IAAIc,CAAG,EAC9B,MAERd,EAA2B,IAAIc,CAAG,EAE3BxB,EACL,oBAAoBqB,EAAME,CAAQ,EAClC,KAAME,GAAe,CACjB,OAAOA,GAAU,SACpBL,EAAOG,CAAQ,EAAIE,EACTA,IACN,MAAM,QAAQA,CAAK,EACtBN,EAAM,KAAK,GAAGM,CAAK,EAEnBN,EAAM,KAAKM,CAAK,EAGnB,CAAC,EACH,CAAC,CACF,CACD,EAGAtB,EAAK,SAASgB,CAAK,EACnB,OAAO,OAAOV,EAAgBW,CAAM,CACrC,CAGD,MAAMN,EAAQ,KAAK,EACnBP,EAAK,gBAAgBF,EAAcC,EAAeL,EAAK,aAAa,EAEpE,IAAMyB,GAAW,MAAMZ,EAAQ,KAAK,CAAC,EAAG,CAAC,CAAC,GAAG,MAEvCa,EAAgBpB,EAAK,iBAAiB,EACtCqB,EAAiBrB,EAAK,kBAAkB,EAE9C,OAAAA,EAAK,cAAc,EAEZsB,GAAI,CAAE,MAAOF,EAAe,OAAQC,EAAgB,QAAAF,CAAQ,CAAC,CACrE,CAEA,SAASlB,GACRP,EACA6B,EACC,CACD,GAAKA,EAEE,CACN,IAAMC,EAAS9B,EAAK,OAAO,OAAO,EAClC,OAAA8B,EAAO,oBAAoBD,CAAgB,EACpC7B,EAAK,KAAK,iBAAiB8B,CAAM,CACzC,KALC,QAAO9B,EAAK,KAAK,OAAO,CAM1B,CAEA,SAASiB,GACRF,EACsC,CACtC,IAAMC,EAAgB,CAAC,EACnBe,EAAc,CAAC,EAEnB,OAAW,CAAE,KAAAC,EAAM,OAAAC,CAAO,IAAKlB,EAAqB,CACnD,IAAMK,EAAOc,GAAmBF,EAAMC,CAAM,EAAE,KAAK,GAAG,EACtDF,EAAYX,CAAI,EAAIW,EAAYX,CAAI,GAAK,GACzCW,EAAYX,CAAI,GAAKY,CACtB,CAEA,cAAO,KAAKD,CAAW,EAAE,QAASX,GAAmB,CACpDJ,EAAcI,CAAI,EAAIJ,EAAcI,CAAI,GAAK,CAAC,EAC1CA,IAAS,QACZJ,EAAcI,CAAI,EAAE,KACnB,GAAGe,GAAOC,GAAQL,EAAYX,CAAI,EAAG,UAAU,CAAC,CACjD,GAEAJ,EAAcI,CAAI,EAAE,CAAC,EAAIJ,EAAcI,CAAI,EAAE,CAAC,GAAK,GACnDJ,EAAcI,CAAI,EAAE,CAAC,GAAKe,GACzBC,GACCL,EAAYX,CAAI,EAChB,WACAA,IAAS,UAAY,OAAYA,CAClC,CACD,EAAE,KAAK,EAAE,EAEX,CAAC,EAEMJ,CACR,CAEA,SAASmB,GAAUE,EAAe,CACjC,OAAO,MAAM,KAAK,IAAI,IAAIA,CAAG,CAAC,CAC/B","names":["loadYoga","yoga_wasm_base64_esm_default","init_yoga_wasm_base64_esm","__esmMin","_scriptDir","h","aa","ca","a","b","da","q","ea","v","w","noExitRuntime","x","fa","ha","z","c","d","e","f","g","ia","ja","A","C","ka","E","la","ma","na","oa","pa","qa","ra","sa","F","ta","G","ua","H","va","wa","xa","ya","za","Aa","Ba","J","Ca","Da","K","L","M","Ea","Fa","Ga","N","O","Ha","P","Q","Ia","R","Ja","Ka","S","La","Ma","Na","Oa","Pa","Qa","Ra","Sa","Ta","Ua","T","Va","Wa","Xa","U","Ya","V","m","W","Za","$a","X","ab","bb","cb","db","eb","fb","gb","hb","Y","ib","jb","Z","mb","nb","ob","l","n","p","r","u","t","y","B","pb","qb","rb","sb","tb","ub","vb","wb","xb","yb","zb","Ab","Bb","Cb","Db","Eb","Fb","Gb","Hb","Jb","ba","I","kb","lb","Ib","Kb","Lb","Mb","Align","BoxSizing","Dimension","Direction","Display","Edge","Errata","ExperimentalFeature","FlexDirection","Gutter","Justify","LogLevel","MeasureMode","NodeType","Overflow","PositionType","Unit","Wrap","constants","YGEnums_default","init_YGEnums","__esmMin","ALIGN_AUTO","Auto","ALIGN_FLEX_START","FlexStart","ALIGN_CENTER","Center","ALIGN_FLEX_END","FlexEnd","ALIGN_STRETCH","Stretch","ALIGN_BASELINE","Baseline","ALIGN_SPACE_BETWEEN","SpaceBetween","ALIGN_SPACE_AROUND","SpaceAround","ALIGN_SPACE_EVENLY","SpaceEvenly","BOX_SIZING_BORDER_BOX","BorderBox","BOX_SIZING_CONTENT_BOX","ContentBox","DIMENSION_WIDTH","Width","DIMENSION_HEIGHT","Height","DIRECTION_INHERIT","Inherit","DIRECTION_LTR","LTR","DIRECTION_RTL","RTL","DISPLAY_FLEX","Flex","DISPLAY_NONE","None","DISPLAY_CONTENTS","Contents","EDGE_LEFT","Left","EDGE_TOP","Top","EDGE_RIGHT","Right","EDGE_BOTTOM","Bottom","EDGE_START","Start","EDGE_END","End","EDGE_HORIZONTAL","Horizontal","EDGE_VERTICAL","Vertical","EDGE_ALL","All","ERRATA_NONE","ERRATA_STRETCH_FLEX_BASIS","StretchFlexBasis","ERRATA_ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING","AbsolutePositionWithoutInsetsExcludesPadding","ERRATA_ABSOLUTE_PERCENT_AGAINST_INNER_SIZE","AbsolutePercentAgainstInnerSize","ERRATA_ALL","ERRATA_CLASSIC","Classic","EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS","WebFlexBasis","FLEX_DIRECTION_COLUMN","Column","FLEX_DIRECTION_COLUMN_REVERSE","ColumnReverse","FLEX_DIRECTION_ROW","Row","FLEX_DIRECTION_ROW_REVERSE","RowReverse","GUTTER_COLUMN","GUTTER_ROW","GUTTER_ALL","JUSTIFY_FLEX_START","JUSTIFY_CENTER","JUSTIFY_FLEX_END","JUSTIFY_SPACE_BETWEEN","JUSTIFY_SPACE_AROUND","JUSTIFY_SPACE_EVENLY","LOG_LEVEL_ERROR","Error","LOG_LEVEL_WARN","Warn","LOG_LEVEL_INFO","Info","LOG_LEVEL_DEBUG","Debug","LOG_LEVEL_VERBOSE","Verbose","LOG_LEVEL_FATAL","Fatal","MEASURE_MODE_UNDEFINED","Undefined","MEASURE_MODE_EXACTLY","Exactly","MEASURE_MODE_AT_MOST","AtMost","NODE_TYPE_DEFAULT","Default","NODE_TYPE_TEXT","Text","OVERFLOW_VISIBLE","Visible","OVERFLOW_HIDDEN","Hidden","OVERFLOW_SCROLL","Scroll","POSITION_TYPE_STATIC","Static","POSITION_TYPE_RELATIVE","Relative","POSITION_TYPE_ABSOLUTE","Absolute","UNIT_UNDEFINED","UNIT_POINT","Point","UNIT_PERCENT","Percent","UNIT_AUTO","WRAP_NO_WRAP","NoWrap","WRAP_WRAP","WRAP_WRAP_REVERSE","WrapReverse","wrapAssembly","lib","patch","prototype","name","fn","original","_len","arguments","length","args","Array","_key","call","fnName","methods","Unit","Point","Node","Percent","Auto","_len2","_key2","value","pop","unit","asNumber","undefined","valueOf","endsWith","parseFloat","Number","isNaN","Error","wrapMeasureFunction","measureFunction","MeasureCallback","implement","measure","width","height","NaN","measureFunc","unsetMeasureFunc","wrapDirtiedFunc","dirtiedFunction","DirtiedCallback","dirtied","dirtiedFunc","Config","destroy","_","config","createWithConfig","createDefault","t","T","getChildCount","getChild","freeRecursive","free","direction","Direction","LTR","YGEnums","init_wrapAssembly","__esmMin","init_YGEnums","loadYoga","wrapAssembly","loadYogaImpl","init_load","__esmMin","init_yoga_wasm_base64_esm","init_wrapAssembly","init_YGEnums","yoga_external_exports","__export","getYoga","init","loadWasm","input","imports","source","e","bytes","instantiated","loadYoga","successCallback","instance","rejectYoga","resolveYoga","yogaPromise","init_yoga_external","__esmMin","init_load","resolve","reject","yoga_bundled_exports","__export","getYoga","loadingYoga","init_yoga_bundled","__esmMin","init_load","loadYoga","LineBreaker","e","t","r","u","k","g","a","z","v","c","L","w","h","$","y","m","j","b","q","f","p","l","d","s","x","o","O","F","U","E","n","D","i","isReactElement","node","type","isClass","f","isForwardRefComponent","isReactComponent","hasDangerouslySetInnerHTMLProp","props","normalizeChildren","children","flattend","res","i","value","lengthToNumber","length","baseFontSize","baseLength","inheritedStyle","percentage","parsed","U","calcDegree","deg","multiply","m1","m2","v","field","map","fallback","errorIfNotAllowedForProperty","_v","wordSegmenter","graphemeSegmenter","wordSeparators","point","segmentCache","MAX_SEGMENT_CACHE_SIZE","segment","content","granularity","locale","cacheKey","result","seg","segmented","output","s","previousWord","nextWord","firstKey","buildXMLString","attrs","attrString","k","createLRU","max","store","get","key","set","clear","parseViewBox","viewBox","isString","x","isNumber","isUndefined","asPointPercentageLength","propertyName","percentageValue","asPointAutoPercentageLength","splitByBreakOpportunities","content","wordBreak","segment","breaker","LineBreaker","last","bk","words","requiredBreaks","word","midline","s","_","letter","splitEffects","input","separator","result","l","parenCount","i","init","input","mod","getYoga","AVIF","WEBP","APNG","PNG","JPEG","GIF","SVG","parseJPEG","buf","view","offset","len","i","next","parseGIF","parsePNG","v","cache","createLRU","inflightRequests","ALLOWED_IMAGE_TYPES","SVG_ATTRS_REGEX","VIEWBOX_REGEX","WIDTH_REGEX","HEIGHT_REGEX","arrayBufferToBase64","buffer","bytes","CHUNK_SIZE","binary","chunk","base64ToArrayBuffer","base64","binaryString","parseSvgImageSize","src","data","svgMatch","svgTag","viewBoxMatch","widthMatch","heightMatch","viewBox","parseViewBox","size","ratio","arrayBufferToDataUri","imageSize","imageType","detectContentType","resolveImageData","newSrc","decodedURI","encodingType","dataString","utf8Src","base64Src","cached","url","promise","res","type","e","result","err","b","detectAPNG","dv","length","off","isAPNG","chars","ATTRIBUTE_MAPPING","SVGSymbols","translateSVGNodeToSVGString","node","inheritedColor","n","type","children","style","restProps","currentColor","attrs","k","_v","cache","styles","midline","preProcessNode","set","walk","_node","isReactElement","v","imageSrc","c","s","resolveImageData","SVGNodeToImage","viewBox","viewbox","width","height","className","viewBoxSize","parseViewBox","ratio","DEFAULT_DISPLAY","presets_default","list","inheritable","style","inheritedStyle","prop","getPropertyName","getStylesForProperty","parseElementStyle","parseBoxShadow","cssColorParse","valueParser","parseUnit","word","baseFontSize","parsed","U","handleWord","unitIsHorizontal","parsedUnit","parseTransformOrigin","value","words","valueParser","node","getPropertyName","getMaskProperty","style","name","key","getPropertyName","parseMask","maskImage","common","splitEffects","v","m","valueParser","extractCustomProperties","style","variables","remainingStyle","prop","mergeVariables","inherited","current","resolveVariables","value","visitedVars","parsed","hasChanges","node","args","extractVarArgs","varName","fallback","replaceNode","variableValue","newVisitedVars","resolvedValue","resolvedFallback","varNameNode","commaIndex","i","child","fallbackNodes","optOutPx","keepNumber","handleFallbackColor","prop","parsed","rawInput","currentColor","purify","name","value","num","handleSpecialCase","_v","horizontal","vertical","vh","getStylesForProperty","vv","k","resolved","purified","v","full","p","parseBoxShadow","symbols","replaced","_","symbol","t","result","shadows","splitEffects","shadow","styles","values","normalized","getErrorHint","RGB_SLASH","normalizeColor","r","g","b","a","expand","style","inheritedStyle","serializedStyle","inheritedVariables","currentVariables","processableStyle","variables","remainingStyle","extractCustomProperties","mergedVariables","mergeVariables","varName","resolvedColor","resolveVariables","getCurrentColor","getPropertyName","resolvedValue","preprocess","resolvedStyle","err","backgrounds","parseElementStyle","parseMask","baseFontSize","calcBaseFontSize","parseTransformOrigin","lengthToNumber","len","color","transforms","transform","type","textShadowRadius","textShadowOffset","height","width","size","inheritedSize","U","refineHSL","cssColorParse","h","s","l","inheritedColor","convertCurrentColorToActualValue","isString","compute","node","type","inheritedStyle","definedStyle","props","Yoga","getYoga","style","expand","presets_default","resolvedSrc","imageWidth","imageHeight","resolveImageData","r","extraHorizontal","extraVertical","contentBoxWidth","contentBoxHeight","isAbsoluteContentSize","viewBox","viewBoxSize","parseViewBox","ratio","width","height","lengthToNumber","v","asPointAutoPercentageLength","asPointPercentageLength","inheritable","escapeHTML","baseMatrix","resolveTransforms","transforms","width","height","matrix","transform","type","v","len","transformMatrix","rad","c","multiply","left","top","isInheritingTransform","transformOrigin","result","xOrigin","yOrigin","x","y","container","left","top","width","height","isInheritingTransform","style","matrix","opacity","transform","buildText","id","content","filter","image","clipPathId","debug","shape","decorationShape","extra","buildXMLString","shapeProps","escapeHTML","shiftPath","path","dx","dy","_","command","x","y","SCALE","buildDropShadow","id","width","height","style","transparentText","shadowCount","effects","merge","left","right","top","bottom","i","grow","resultId","buildXMLString","boxShadow","shape","opacity","shadow","innerShadow","s","shadowStyle","sid","maskId","shapeWithSpread","finalShape","buildSkipInkSegments","start","end","glyphBoxes","y","strokeWidth","baseline","halfStroke","bleed","skipRanges","box","from","to","last","segments","cursor","buildDecoration","width","left","top","ascender","clipPathId","matrix","style","textDecorationColor","textDecorationStyle","textDecorationLine","textDecorationSkipInk","fontSize","color","height","dasharray","applySkipInk","extraLine","x1","x2","buildXMLString","stringFromCode","code","Space","Tab","HorizontalEllipsis","genMeasurer","engine","isImage","style","fontSize","letterSpacing","cache","measureGrapheme","grapheme","width","measureGraphemeArray","graphemes","measureText","text","segment","preprocess","content","style","locale","textTransform","whiteSpace","wordBreak","processTextTransform","processedContent","shouldCollapseTabsAndSpaces","allowSoftWrap","processWhiteSpace","words","requiredBreaks","allowBreakWord","processWordBreak","lineLimit","blockEllipsis","processTextOverflow","segment","word","grapheme","index","textOverflow","lineClamp","WebkitLineClamp","WebkitBoxOrient","overflow","display","HorizontalEllipsis","parseLineClamp","isNumber","splitByBreakOpportunities","shouldKeepLinebreak","Space","input","regex1","regex2","match1","match2","number","text","cssColorParse","skippedWordWhenFindingMissingFont","Tab","shouldSkipWhenFindingMissingFont","word","isFullyTransparent","color","parsed","isOpaqueWhite","r","g","b","a","buildTextNodes","content","context","Yoga","getYoga","parentStyle","inheritedStyle","parent","font","id","isInheritingTransform","debug","embedFont","graphemeImages","locale","canLoadAdditionalAssets","textAlign","textIndent","lineHeight","textWrap","fontSize","cssFilter","tabSize","letterSpacing","_inheritedBackgroundClipTextPath","_inheritedBackgroundClipTextHasBackground","flexShrink","words","requiredBreaks","allowSoftWrap","allowBreakWord","processedContent","shouldCollapseTabsAndSpaces","lineLimit","blockEllipsis","preprocess","textContainer","createTextContainerNode","isUndefined","engine","wordsMissingFont","segment","isImage","s","measureGrapheme","measureGraphemeArray","measureText","genMeasurer","tabWidth","isString","lengthToNumber","Space","calc","text","currentWidth","index","tabCount","detectTabs","originWidth","textBeforeTab","textAfterTab","textWidthBeforeTab","offsetBeforeTab","afterTrimEndWidth","lineWidths","baselines","lineSegmentNumber","texts","wordPositionInLayout","flow","width","lines","maxWidth","lineIndex","height","currentLineHeight","currentBaselineOffset","i","prevLineEndingSpacesWidth","forceBreak","w","endingSpacesWidth","_word","lineEndingSpacesWidth","allowedToJustify","willWrap","chars","glyphHeight","x","_texts","j","_text","_width","_isImage","measuredTextSize","containerWidth","l","m","mHeight","adjustedWidth","result","y","backgroundClipDef","clipPathId","overflowMaskId","containerLeft","containerTop","containerHeight","textIndentNumber","parentContainerInnerWidth","left","top","matrix","opacity","container","filter","textShadowColor","textShadowOffset","textShadowRadius","buildDropShadow","buildXMLString","decorationShape","mergedPath","extra","skippedLine","decorationLines","decorationGlyphs","wordBuffer","bufferedOffset","layout","nextLayout","path","isLastDisplayedBeforeEllipsis","image","topOffset","leftOffset","line","shouldCollectDecorationBoxes","extendedWidth","remainingWidth","segments","gutter","baselineOfLine","baselineOfWord","heightOfWord","baselineDelta","buildUnderlineBand","offset","calcEllipsis","baseWidth","subset","resolvedWidth","char","ellipsisWidth","_blockEllipsis","HorizontalEllipsis","spaceWidth","isNotLastLine","nextLineText","wordSeparators","finalizedSegment","finalizedLeftOffset","finalizedWidth","band","svg","t","shape","buildText","deco","glyphBoxes","buildDecoration","p","v","parseLinearGradient","cssColorParse","normalizeStops","totalLength","colorStops","inheritedStyle","repeating","from","stops","lastColorStop","totalPercentage","stop","color","offset","lengthToNumber","lastStop","previousStop","nextStop","i","buildLinearGradient","id","width","height","repeatX","repeatY","image","dimensions","offsets","inheritableStyle","from","parsed","parseLinearGradient","imageWidth","imageHeight","repeating","points","length","xys","resolveXYFromDirection","l","p","calcNormalPoint","calcDegree","calcPercentage","stops","normalizeStops","resolveRepeatingCycle","gradientId","patternId","defs","buildXMLString","stop","last","offset","dir","x1","y1","x2","y2","v","w","h","r","tmp","a","b","dfs","angle","p1","lengthToNumber","p2","sx","sy","ex","ey","parseRadialGradient","buildRadialGradient","id","width","height","repeatX","repeatY","image","dimensions","offsets","inheritableStyle","from","_a","shape","colorStops","position","size","repeating","parseRadialGradient","xDelta","yDelta","cx","cy","pos","calcRadialGradient","colorStopTotalLength","calcColorStopTotalLength","stops","normalizeStops","gradientId","patternId","maskId","spread","calcRadius","props","calcRadialGradientProps","defs","buildXMLString","stop","lastStop","lengthToNumber","baseFontSize","style","calcPos","key","dir","r","rx","ratio","last","radius","endingShape","centerAxis","length","fx","fy","isSizeAllLength","v","patchSpread","f2r","mfx","mfy","mrx","mry","mr","ry","s","cssColorParse","toAbsoluteValue","v","base","calculateKeywordSize","keyword","containerWidth","containerHeight","imageWidth","imageHeight","scaleX","scaleY","scale","parts","widthPart","heightPart","finalWidth","finalHeight","parsedHeight","parsedWidth","positionKeywordMap","parsePositionValues","str","part","computeBgPositionOffset","rawValue","containerSize","imageSize","percentage","parsed","U","parseLengthPairs","x","y","defaultX","defaultY","value","index","backgroundImage","id","width","height","left","top","image","size","position","repeat","inheritableStyle","from","repeatX","repeatY","isKeywordSize","isGradient","dimensions","offsets","buildLinearGradient","buildRadialGradient","src","resolveImageData","resolvedWidth","resolvedHeight","calcWidth","calcHeight","dimensionsWithoutFallback","rawPos","imageOffsetX","imageOffsetY","buildXMLString","colorObj","r","g","b","a","color","svgArcCenterOffset","rx","ry","resolveSize","a","b","limit","makeSmaller","arr","resolveRadius","v","width","height","fontSize","style","sides","s","singleValue","lengthToNumber","radiusZeroOrNull","_radius","getBorderRadiusClipPath","id","borderRadiusPath","borderType","left","top","rectClipId","buildXMLString","radius","partialSides","borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius","singleAbsValueTopLeftCorner","singleAbsValueTopRightCorner","singleAbsValueBottomLeftCorner","singleAbsValueBottomRightCorner","p","T","R","B","L","getArc","i","c0","start","result","arc0","l","len","end","arc1","compareBorderDirections","a","b","style","getBorderClipPath","id","currentClipPathId","borderPath","borderType","left","top","width","height","rectClipId","buildXMLString","border","props","asContentMask","maskBorderOnly","directions","direction","fullBorder","start","partialSides","currentStyle","_i","i","ni","d","nd","w","radius","contentMask","id","left","top","width","height","matrix","borderOnly","style","offsetLeft","offsetTop","offsetRight","offsetBottom","contentArea","buildXMLString","border","getStylesForProperty","regexMap","createShapeParser","width","height","style","inheritedStyle","parseCircle","str","res","value","radius","pos","v","x","y","resolvePosition","lengthToNumber","parseEllipse","rx","ry","parsePath","fillRule","d","resolveFillRule","parsePolygon","points","k","i","parseInset","inset","radiusMap","r","s","offsets","w","h","position","xDelta","yDelta","genClipPathId","id","genClipPath","buildClipPath","v","style","inheritedStyle","parser","createShapeParser","clipPath","tmp","k","type","rest","buildXMLString","overflow","left","top","width","height","path","matrix","id","currentClipPath","src","style","inheritableStyle","overflowClipPath","clipPath","buildClipPath","_id","genClipPathId","buildXMLString","contentMask","genMaskImageId","id","buildMaskImage","v","style","inheritedStyle","left","top","width","height","maskImage","length","miId","mask","i","m","_id","def","backgroundImage","buildXMLString","parseObjectPosition","position","containerWidth","containerHeight","parts","keywordToPercent","keyword","axis","xValue","yValue","part","first","second","parseValue","value","containerSize","parsed","U","rect","id","left","top","width","height","isInheritingTransform","src","debug","style","inheritableStyle","isImage","type","matrix","defs","fills","opacity","extra","transform","backgroundShapes","backgrounds","index","background","image","backgroundImage","miId","mi","buildMaskImage","maskId","path","radius","clipPathId","buildXMLString","backgroundClip","cssFilter","mixBlendMode","inlineStyle","v","currentClipPath","genClipPath","clip","overflow","shape","fill","borderClip","getBorderClipPath","imageBorderRadius","offsetLeft","offsetTop","offsetRight","offsetBottom","containerInnerWidth","containerInnerHeight","objPosX","objPosY","naturalWidth","naturalHeight","preserveAspectRatio","imageWidth","imageHeight","imageX","imageY","scaleX","scaleY","scale","minScale","getBorderRadiusClipPath","rectClipId","border","shadow","boxShadow","parseFilterValue","value","primitives","blurMatch","buildXMLString","saturateMatch","val","brightnessMatch","contrastMatch","intercept","grayscaleMatch","buildBackdropFilter","options","bgGroupId","filterValue","height","id","left","maskId","style","top","width","filterId","clipId","filterDef","borderRadiusPath","radius","clipContent","clipDef","defs","useAttrs","useElement","r","e","emoji_regex_xs_default","emojiRegex","emoji_regex_xs_default","specialCode","code","locales","isValidLocale","x","detectLanguageCode","segment","locale","c","languages","lang","index","normalizeLocale","l","layout","element","context","_a","Yoga","getYoga","id","inheritedStyle","parent","font","debug","locale","embedFont","graphemeImages","canLoadAdditionalAssets","isReactElement","isReactComponent","iter","buildTextNodes","isClass","render","isForwardRefComponent","offset","$type","props","type","hasDangerouslySetInnerHTMLProp","style","children","_newLocale","newLocale","normalizeLocale","node","computedStyle","newInheritableStyle","compute","isInheritingTransform","mutateRefValue","normalizedChildren","normalizeChildren","iterators","backdropInfoByIndex","i","segmentsMissingFont","child","currentIndex","info","x","y","left","top","width","height","childrenRenderResult","baseRenderResult","depsRenderResult","childrenNode","restProps","src","rect","currentColor","SVGNodeToImage","display","j","childLayout","childLeft","childTop","childWidth","childHeight","bgGroupId","currentContent","childId","maskId","buildBackdropFilter","buildXMLString","opentype","SUFFIX_WHEN_LANG_NOT_SET","flattenPath","commands","segments","start","current","addCurve","points","steps","prev","i","t","next","evaluateBezier","cmd","working","computeBandBox","band","strokeWidth","bandMin","bandMax","bandHeight","ySamples","yStep","yStart","columnHits","y","intersections","seg","x1","y1","x2","y2","yMin","yMax","x","a","b","j","from","to","end","col","columns","inkRanges","rangeStart","boxes","bleed","minX","maxX","left","right","compareFont","weight","style","matchedWeight","matchedStyle","nextWeight","nextStyle","cachedParsedFont","FontLoader","fontOptions","name","fonts","matchedFont","i","weight1","style1","weight2","style2","fontOption","data","lang","isValidLocale","locales","_lang","SUFFIX_WHEN_LANG_NOT_SET","font","opentype","originalCharToGlyphIndex","char","index","_name","fontSize","lineHeight","fontFamily","fontWeight","fontStyle","locale","face","getNormal","getUnknown","keys","specifiedLangFonts","nonSpecifiedLangFonts","additionalFonts","getLangFromFontName","cachedFontResolver","resolveFont","word","fallback","_fonts","code","_font","ascender","resolvedFont","useOS2Table","_a","_b","descender","height","_lineGap","resolve","s","asc","desc","contentHeight","band","brokenChars","originalStringToGlyphs","args","glyphs","anotherFont","glyph","scale","p","command","scaledCommand","k","g","content","letterSpacing","unpatch","top","left","fullPath","boxes","options","cachedPath","gX","gY","gFontSize","glyphPath","_x","_y","_glyphPath","movedCommand","bandBoxes","computeBandBox","arr","svg","width","height","content","buildXMLString","fontCache","satori","element","options","Yoga","getYoga","font","FontLoader","definedWidth","definedHeight","root","getRootNode","graphemeImages","processedWordsMissingFonts","cache","inflightRequests","preProcessNode","handler","layout","segmentsMissingFont","languageCodes","convertToLanguageCodes","fonts","images","code","segments","_segment","key","asset","content","computedWidth","computedHeight","svg","pointScaleFactor","config","wordsByCode","word","locale","detectLanguageCode","unique","segment","arr"]}
1
+ {"version":3,"sources":["../node_modules/yoga-layout/dist/binaries/yoga-wasm-base64-esm.js","../node_modules/yoga-layout/src/generated/YGEnums.ts","../node_modules/yoga-layout/src/wrapAssembly.ts","../node_modules/yoga-layout/src/load.ts","../src/yoga.external.ts","../src/yoga.bundled.ts","../src/utils.ts","../src/vendor/parse-css-dimension/index.js","../src/yoga.ts","../src/handler/image.ts","../src/handler/preprocess.ts","../src/handler/presets.ts","../src/handler/inheritable.ts","../src/handler/expand.ts","../src/transform-origin.ts","../src/parser/mask.ts","../src/handler/variables.ts","../src/handler/compute.ts","../src/builder/text.ts","../src/builder/transform.ts","../src/builder/shadow.ts","../src/builder/text-decoration.ts","../src/text/characters.ts","../src/text/measurer.ts","../src/text/processor.ts","../src/text/index.ts","../src/builder/gradient/linear.ts","../src/builder/gradient/utils.ts","../src/builder/gradient/radial.ts","../src/builder/background-image.ts","../src/builder/border-radius.ts","../src/builder/border.ts","../src/builder/content-mask.ts","../src/parser/shape.ts","../src/builder/clip-path.ts","../src/builder/overflow.ts","../src/builder/mask-image.ts","../src/builder/rect.ts","../src/builder/backdrop-filter.ts","../node_modules/emoji-regex-xs/index.mjs","../src/language.ts","../src/layout.ts","../src/font.ts","../src/builder/svg.ts","../src/satori.ts"],"sourcesContent":["\nvar loadYoga = (() => {\n var _scriptDir = import.meta.url;\n \n return (\nfunction(loadYoga) {\n loadYoga = loadYoga || {};\n\n\nvar h;h||(h=typeof loadYoga !== 'undefined' ? loadYoga : {});var aa,ca;h.ready=new Promise(function(a,b){aa=a;ca=b});var da=Object.assign({},h),q=\"\";\"undefined\"!=typeof document&&document.currentScript&&(q=document.currentScript.src);_scriptDir&&(q=_scriptDir);0!==q.indexOf(\"blob:\")?q=q.substr(0,q.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1):q=\"\";var ea=h.print||console.log.bind(console),v=h.printErr||console.warn.bind(console);Object.assign(h,da);da=null;var w;h.wasmBinary&&(w=h.wasmBinary);\nvar noExitRuntime=h.noExitRuntime||!0;\"object\"!=typeof WebAssembly&&x(\"no native wasm support detected\");var fa,ha=!1;function z(a,b,c){c=b+c;for(var d=\"\";!(b>=c);){var e=a[b++];if(!e)break;if(e&128){var f=a[b++]&63;if(192==(e&224))d+=String.fromCharCode((e&31)<<6|f);else{var g=a[b++]&63;e=224==(e&240)?(e&15)<<12|f<<6|g:(e&7)<<18|f<<12|g<<6|a[b++]&63;65536>e?d+=String.fromCharCode(e):(e-=65536,d+=String.fromCharCode(55296|e>>10,56320|e&1023))}}else d+=String.fromCharCode(e)}return d}\nvar ia,ja,A,C,ka,D,E,la,ma;function na(){var a=fa.buffer;ia=a;h.HEAP8=ja=new Int8Array(a);h.HEAP16=C=new Int16Array(a);h.HEAP32=D=new Int32Array(a);h.HEAPU8=A=new Uint8Array(a);h.HEAPU16=ka=new Uint16Array(a);h.HEAPU32=E=new Uint32Array(a);h.HEAPF32=la=new Float32Array(a);h.HEAPF64=ma=new Float64Array(a)}var oa,pa=[],qa=[],ra=[];function sa(){var a=h.preRun.shift();pa.unshift(a)}var F=0,ta=null,G=null;\nfunction x(a){if(h.onAbort)h.onAbort(a);a=\"Aborted(\"+a+\")\";v(a);ha=!0;a=new WebAssembly.RuntimeError(a+\". Build with -sASSERTIONS for more info.\");ca(a);throw a;}function ua(a){return a.startsWith(\"data:application/octet-stream;base64,\")}var H;H=\"data:application/octet-stream;base64,AGFzbQEAAAABugM3YAF/AGACf38AYAF/AX9gA39/fwBgAn98AGACf38Bf2ADf39/AX9gBH9/f30BfWADf398AGAAAGAEf39/fwBgAX8BfGACf38BfGAFf39/f38Bf2AAAX9gA39/fwF9YAZ/f31/fX8AYAV/f39/fwBgAn9/AX1gBX9/f319AX1gAX8BfWADf35/AX5gB39/f39/f38AYAZ/f39/f38AYAR/f39/AX9gBn9/f319fQF9YAR/f31/AGADf399AX1gBn98f39/fwF/YAR/fHx/AGACf30AYAh/f39/f39/fwBgDX9/f39/f39/f39/f38AYAp/f39/f39/f39/AGAFf39/f38BfGAEfHx/fwF9YA1/fX1/f399fX9/f39/AX9gB39/f319f38AYAJ+fwF/YAN/fX0BfWABfAF8YAN/fHwAYAR/f319AGAHf39/fX19fQF9YA1/fX99f31/fX19fX1/AX9gC39/f39/f399fX19AX9gCH9/f39/f319AGAEf39+fgBgB39/f39/f38Bf2ACfH8BfGAFf398fH8AYAN/f38BfGAEf39/fABgA39/fQBgBn9/fX99fwF/ArUBHgFhAWEAHwFhAWIAAwFhAWMACQFhAWQAFgFhAWUAEQFhAWYAIAFhAWcAAAFhAWgAIQFhAWkAAwFhAWoAAAFhAWsAFwFhAWwACgFhAW0ABQFhAW4AAwFhAW8AAQFhAXAAFwFhAXEABgFhAXIAAAFhAXMAIgFhAXQACgFhAXUADQFhAXYAFgFhAXcAAgFhAXgAAwFhAXkAGAFhAXoAAgFhAUEAAQFhAUIAEQFhAUMAAQFhAUQAAAOiAqACAgMSBwcACRkDAAoRBgYKEwAPDxMBBiMTCgcHGgMUASQFJRQHAwMKCgMmAQYYDxobFAAKBw8KBwMDAgkCAAAFGwACBwIHBgIDAQMIDAABKAkHBQURACkZASoAAAIrLAIALQcHBy4HLwkFCgMCMA0xAgMJAgACAQYKAQIBBQEACQIFAQEABQAODQ0GFQIBHBUGAgkCEAAAAAUyDzMMBQYINAUCAwUODg41AgMCAgIDBgICNgIBDAwMAQsLCwsLCx0CAAIAAAABABABBQICAQMCEgMMCwEBAQEBAQsLAQICAwICAgICAgIDAgIICAEICAgEBAQEBAQEBAQABAQABAQEBAAE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GiABQQA2AvADIAFCADcC6AMgAigC7AMiAyACKALoAyIERwRAIAMgBGsiBEEASA0FIAEgBBAeIgM2AuwDIAEgAzYC6AMgASADIARqNgLwAyACKALoAyIEIAIoAuwDIghHBEADQCADIAQoAgA2AgAgA0EEaiEDIARBBGoiBCAIRw0ACwsgASADNgLsAwsgASACKQL0AzcC9AMgASACKAKEBDYChAQgASACKQL8AzcC/AMgAUEANgLkAwsgBSABNgIAIAEgADYC5AMLIAZBAWohBiAFQQRqIgUgB0cNAAsLDwsQAgALUAACQAJAAkACQAJAIAIOBAQAAQIDCyAAIAEgAUEwahBDDwsgACABIAFBMGogAxBEDwsgACABIAFBMGoQQg8LECQACyAAIAEgAUEwaiADEEULcAIBfwF9IwBBEGsiBCQAIARBCGogACABQQJ0QdwlaigCACACEDZDAADAfyEFAkACQAJAIAQtAAxBAWsOAgABAgsgBCoCCCEFDAELIAQqAgggA5RDCtcjPJQhBQsgBEEQaiQAIAVDAAAAACAFIAVbGwt5AgF/AX0jAEEQayIDJAAgA0EIaiAAIAFBAnRB7CVqKAIAIAIQU0MAAMB/IQQCQAJAAkAgAy0ADEEBaw4CAAECCyADKgIIIQQMAQsgAyoCCEMAAAAAlEMK1yM8lCEECyADQRBqJAAgBEMAAAAAl0MAAAAAIAQgBFsbC1QAAkACQAJAAkACQCACDgQEAAECAwsgACABIAFBwgBqEEMPCyAAIAEgAUHCAGogAxBEDwsgACABIAFBwgBqEEIPCxAkAAsgACABIAFBwgBqIAMQRQsvACAAIAJFQQF0IgIgASADEGAgACACIAEQS5IgACACIAEgAxB/IAAgAiABEFKSkgvOAQIDfwJ9IwBBEGsiAyQAQQEhBCADQQhqIABB/ABqIgUgACABQQF0akH2AGoiAS8BABAfAkACQCADKgIIIgcgAioCACIGXARAIAcgB1sEQCACLQAEIQIMAgsgBiAGXCEECyACLQAEIQIgBEUNACADLQAMIAJB/wFxRg0BCyAFIAEgBiACEDkDQCAALQAAIgFBBHENASAAIAFBBHI6AAAgACgCECIBBEAgACABEQAACyAAQYCAgP4HNgKcASAAKALkAyIADQALCyADQRBqJAALzgECA38CfSMAQRBrIgMk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AWsOAgABAgsgBCoCCCEFDAELIAQqAgggA5RDCtcjPJQhBQsgBEEQaiQAIAVDAAAAACAFIAVbGwscACAAIAFBCCACpyACQiCIpyADpyADQiCIpxAVCwUAEFgACzkAIABFBEBBAA8LAn8gAUGAf3FBgL8DRiABQf8ATXJFBEBB/DtBGTYCAEF/DAELIAAgAToAAEEBCwvEAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABQQlrDhIACgsMCgsCAwQFDAsMDAoLBwgJCyACIAIoAgAiAUEEajYCACAAIAEoAgA2AgAPCwALIAIgAigCACIBQQRqNgIAIAAgATIBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATMBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATAAADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATEAADcDAA8LAAsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRAQALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC84BAgN/An0jAEEQayIDJABBASEEIANBCGogAEH8AGoiBSAAIAFBAXRqQegAaiIBLwEAEB8CQAJAIAMqAggiByACKgIAIgZcBEAgByAHWwRAIAItAAQhAgwCCyAGIAZcIQQLIAItAAQhAiAERQ0AIAMtAAwgAkH/AXFGDQELIAUgASAGIAIQOQNAIAAtAAAiAUEEcQ0BIAAgAUEEcjoAACAAKAIQIgEEQCAAIAERAAALIABBgICA/gc2ApwBIAAoAuQDIgANAAsLIANBEGokAAtdAQR/IAAoAgAhAgNAIAIsAAAiAxBXBEBBfyEEIAAgAkEBaiICNgIAIAFBzJmz5gBNBH9BfyADQTBrIgMgAUEKbCIEaiADIARB/////wdzShsFIAQLIQEMAQsLIAELrhQCEn8BfiMAQdAAayIIJAAgCCABNgJMIAhBN2ohFyAIQThqIRQCQAJAAkACQANAIAEhDSAHIA5B/////wdzSg0BIAcgDmohDgJAAkACQCANIgctAAAiCQRAA0ACQAJAIAlB/wFxIgFFBEAgByEBDAELIAFBJUcNASAH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IQEgAEIANwIEIAAgATYCACABIAA2AgQgAkEQaiQAIAALGwEBfyAABEAgACgCACIBBEAgARAjCyAAECMLC0kBAn9BBBAeIQFBIBAeIgBBADYCHCAAQoCAgICAgIDAPzcCFCAAQgA3AgwgAEEAOgAIIABBAzYCBCAAQQA2AgAgASAANgIAIAELIAAgAkEFR0EAIAIbRQRAQbgwIAMgBBBJDwsgAyAEEHALIgEBfiABIAKtIAOtQiCGhCAEIAARFQAiBUIgiKckASAFpwuoAQEFfyAAKAJUIgMoAgAhBSADKAIEIgQgACgCFCAAKAIcIgdrIgYgBCAGSRsiBgRAIAUgByAGECsaIAMgAygCACAGaiIFNgIAIAMgAygCBCAGayIENgIECyAEIAIgAiAESxsiBARAIAUgASAEECsaIAMgAygCACAEaiIFNgIAIAMgAygCBCAEazYCBAsgBUEAOgAAIAAgACgCLCIBNgIcIAAgATYCFCACCwQAQgALBABBAAuKBQIGfgJ/IAEgASgCAEEHakF4cSIBQRBqNgIAIAAhCSABKQMAIQMgASkDCCEGIwBBIGsiCCQAAkAgBkL///////////8AgyIEQoCAgICAgMCAPH0gBEKAgICAgIDA/8MAfVQEQCAGQgSGIANCPIiEIQQgA0L//////////w+DIgNCgYCAgICAgIAIWgRAIARCgYCAgICAgIDAAHwhAgwCCyAEQoCAgICAgICAQH0hAiADQoCAgICAgICACFINASACIARCAYN8IQIMAQsgA1AgBEKAgICAgIDA//8AVCAEQoCAgICAgMD//wBRG0UEQCAGQgSGIANCPIiEQv////////8Dg0KAgICAgICA/P8AhCECDAELQoCAgICAgID4/wAhAiAEQv///////7//wwBWDQBCACECIARCMIinIgBBkfcASQ0AIAMhAiAGQv///////z+DQoCAgICAgMAAhCIFIQcCQCAAQYH3AGsiAUHAAHEEQCACIAFBQGqthiEHQgAhAgwBCyABRQ0AIAcgAa0iBIYgAkHAACABa62IhCEHIAIgBIYhAgsgCCACNwMQIAggBzcDGAJAQYH4ACAAayIAQcAAcQRAIAUgAEFAaq2IIQNCACEFDAELIABFDQAgBUHAACAAa62GIAMgAK0iAoiEIQMgBSACiCEFCyAIIAM3AwAgCCAF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ASAAKAIAIQAgASACQQFxBH8gASgCACAAaigCAAUgAAsRCwALYQECfyMAQRBrIgIkACABIAAoAgQiA0EBdWohASAAKAIAIQAgAiABIANBAXEEfyABKAIAIABqKAIABSAACxEBAEEQEB4iACACKQMINwMIIAAgAikDADcDACACQRBqJAAgAAtjAQJ/IwBBEGsiAyQAIAEgACgCBCIEQQF1aiEBIAAoAgAhACADIAEgAiAEQQFxBH8gASgCACAAaigCAAUgAAsRAwBBEBAeIgAgAykDCDcDCCAAIAMpAwA3AwAgA0EQaiQAIAALNwEBfyABIAAoAgQiA0EBdWohASAAKAIAIQAgASACIANBAXEEfyABKAIAIABqKAIABSAACxEEAAs5AQF/IAEgACgCBCIEQQF1aiEBIAAoAgAhACABIAIgAyAEQQFxBH8gASgCACAAaigCAAUgAAsRCAALCQAgASAAEQIACwUAQcM7Cw8AIAEgACgCAGogAjYCAAsNACABIAAoAgBqKAIACxgBAX9BEBAeIgBCADcDCCAAQQA2AgAgAAsYAQF/QRAQHiIAQgA3AwAgAEIANwMIIAALDABBMBAeQQBBMBAqCzcBAX8gASAAKAIEIgNBAXVqIQEgACgCACEAIAEgAiADQQFxBH8gASgCACAAaigCAAUgAAsRHgALBQBBvjsLIQAgACABKAIAIAEgASwAC0EASBtBuzsgAigCABAQNgIACyoBAX9BDBAeIgFBADoABCABIAAoAgA2AgggAEEANgIAIAFB2Cc2AgAgAQsFAEG7OwsFAEG4OwshACAAIAEoAgAgASABLAALQQBIG0GkOyACKAIAEBA2AgAL2AEBBH8jAEEgayIDJAAgASgCACIEQfD///8HSQRAAkACQCAEQQtPBEAgBEEPckEBaiIFEB4hBiADIAVBgICAgHhyNgIQIAMgBjYCCCADIAQ2AgwgBCAGaiEFDAELIAMgBDoAEyADQQhqIgYgBGohBSAERQ0BCyAGIAFBBGogBBArGgsgBUEAOgAAIAMgAjYCACADQRhqIANBCGogAyAAEQMAIAMoAhgQHSADKAIYIgAQBiADKAIAEAYgAywAE0EASARAIAMoAggQIwsgA0EgaiQAIAAPCxACAAsqAQF/QQwQHiIBQQA6AAQgASAAKAIANgIIIABBADYCACABQeAmNgIA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AkEIaiAIIAYQHyACIAcgAC8AABAfQQEhAyACKgIIIgogAioCACILXAR/IAogClsNAyALIAtcBSADC0UNAiACLQAMIAItAARHDQILIABBAmohAEEBIQMgBCEGQQEhBCAGRQ0ACyABLwB6IgBBB3FFBEAgBS0AekEHcUUNAgsgCCAAECAiCiAHIAUvAHoQICILWw0BIAogClsNACALIAtcDQELIAFBFGogBUEUakHoABArGiABQfwAaiAFQfwAahCgAQNAIAEtAAAiAEEEcQ0BIAEgAEEEcjoAACABKAIQIgAEQCABIAARAAALIAFBgICA/gc2ApwBIAEoAuQDIgENAAsLIAJBEGokAAvGAwEEfyMAQaAEayICJAAgACgCBCEBIABBADYCBCABBEAgASABKAIAKAIEEQAACyAAKAIIIQEgAEEANgIIIAEEQCABIAEoAgAoAgQRAAALAkAgACgCACIAKALoAyAAKALsA0YEQCAAKALkAw0BIAAgAkEYaiAAKAL0AxBcIgEpAgA3AgAgACABKAIQNgIQIAAgASkCCDcCCCAAQRRqIAFBFGpB6AAQKxogACABKQKMATcCjAEgACABKQKEATcChAEgACABKQJ8NwJ8IAEoApQBIQQgAUEANgKUASAAKAKUASEDIAAgBDYClAEgAwRAIAMQWwsgAEGYAWogAUGYAWpB0AIQKxogACgC6AMiAwRAIAAgAzYC7AMgAxAjCyAAIAEoAugDNgLoAyAAIAEoAuwDNgLsAyAAIAEoAvADNgLwAyABQQA2AvADIAFCADcC6AMgACABKQL8AzcC/AMgACABKQL0AzcC9AMgACABKAKEBDYChAQgASgClAEhACABQQA2ApQBIAAEQCAAEFsLIAJBoARqJAAPCyACQfAcNgIQIABBBUHYJSACQRBqECwQJAALIAJB5hE2AgAgAEEFQdglIAIQLBAkAAsLAEEMEB4gABCiAQsLAEEMEB5BABCiAQsNACAAKAIALQAIQQFxCwoAIAAoAgAoAhQLGQAgAUH/AXEEQBACAAsgACgCACgCEEEBcQsYACAAKAIAIgAgAC0ACEH+AXEgAXI6AAgLJgAgASAAKAIAIgAoAhRHBEAgACABNgIUIAAgACgCDEEBajYCDAsLkgEBAn8jAEEQayICJAAgACgCACEAIAFDAAAAAGAEQCABIAAqAhhcBEAgACABOAIYIAAgACgCDEEBajYCDAsgAkEQaiQADwsgAkGIFDYCACMAQRBrIgMkACADIAI2AgwCQCAARQRAQbgwQdglIAIQSRoMAQsgAEEAQQVB2CUgAiAAKAIEEQ0AGgsgA0EQaiQAECQACz8AIAFB/wFxRQRAIAIgACgCACIAKAIQIgFBAXFHBEAgACABQX5xIAJyNgIQIAAgACgCDEEBajYCDAsPCxACAAsL4CYjAEGACAuBHk9ubHkgbGVhZiBub2RlcyB3aXRoIGN1c3RvbSBtZWFzdXJlIGZ1bmN0aW9ucyBzaG91bGQgbWFudWFsbHkgbWFyayB0aGVtc2VsdmVzIGFzIGRpcnR5AGlzRGlydHkAbWFya0RpcnR5AGRlc3Ryb3kAc2V0RGlzcGxheQBnZXREaXNwbGF5AHNldEZsZXgALSsgICAwWDB4AC0wWCswWCAwWC0weCsweCAweABzZXRGbGV4R3JvdwBnZXRGbGV4R3JvdwBzZXRPdmVyZmxvdwBnZXRPdmVyZmxvdwBoYXNOZXdMYXlvdXQAY2FsY3VsYXRlTGF5b3V0AGdldENvbXB1dGVkTGF5b3V0AHVuc2lnbmVkIHNob3J0AGdldENoaWxkQ291bnQAdW5zaWduZWQgaW50AHNldEp1c3RpZnlDb250ZW50AGdldEp1c3RpZnlDb250ZW50AGF2YWlsYWJsZUhlaWdodCBpcyBpbmRlZmluaXRlIHNvIGhlaWdodFNpemluZ01vZGUgbXVzdCBiZSBTaXppbmdNb2RlOjpNYXhDb250ZW50AGF2YWlsYWJsZVdpZHRoIGlzIGluZGVmaW5pdGUgc28gd2lkdGhTaXppbmdNb2RlIG11c3QgYmUgU2l6aW5nTW9kZTo6TWF4Q29udGVudABzZXRBbGlnbkNvbnRlbnQAZ2V0QWxpZ25Db250ZW50AGdldFBhcmVudABpbXBsZW1lbnQAc2V0TWF4SGVpZ2h0UGVyY2VudABzZXRIZWlnaHRQZXJjZW50AHNldE1pbkhlaWdodFBlcmNlbnQAc2V0RmxleEJhc2lzUGVyY2VudABzZXRHYXBQZXJjZW50AHNldFBvc2l0aW9uUGVyY2VudABzZXRNYXJnaW5QZXJjZW50AHNldE1heFdpZHRoUGVyY2VudABzZXRXaWR0aFBlcmNlbnQAc2V0TWluV2lkdGhQZXJjZW50AHNldFBhZGRpbmdQZXJjZW50AGhhbmRsZS50eXBlKCkgPT0gU3R5bGVWYWx1ZUhhbmRsZTo6VHlwZTo6UG9pbnQgfHwgaGFuZGxlLnR5cGUoKSA9PSBTdHlsZVZhbHVlSGFuZGxlOjpUeXBlOjpQZXJjZW50AGNyZWF0ZURlZmF1bHQAdW5pdAByaWdodABoZWlnaHQAc2V0TWF4SGVpZ2h0AGdldE1heEhlaWdodABzZXRIZWlnaHQAZ2V0SGVpZ2h0AHNldE1pbkhlaWdodABnZXRNaW5IZWlnaHQAZ2V0Q29tcHV0ZWRIZWlnaHQAZ2V0Q29tcHV0ZWRSaWdodABsZWZ0AGdldENvbXB1dGVkTGVmdAByZXNldABfX2Rlc3RydWN0AGZsb2F0AHVpbnQ2NF90AHVzZVdlYkRlZmF1bHRzAHNldFVzZVdlYkRlZmF1bHRzAHNldEFsaWduSXRlbXMAZ2V0QWxpZ25JdGVtcwBzZXRGbGV4QmFzaXMAZ2V0RmxleEJhc2lzAENhbm5vdCBnZXQgbGF5b3V0IHByb3BlcnRpZXMgb2YgbXVsdGktZWRnZSBzaG9ydGhhbmRzAHNldFBvaW50U2NhbGVGYWN0b3IATWVhc3VyZUNhbGxiYWNrV3JhcHBlcgBEaXJ0aWVkQ2FsbGJhY2tXcmFwcGVyAENhbm5vdCByZXNldCBhIG5vZGUgc3RpbGwgYXR0YWNoZWQgdG8gYSBvd25lcgBzZXRCb3JkZXIAZ2V0Qm9yZGVyAGdldENvbXB1dGVkQm9yZGVyAGdldE51bWJlcgBoYW5kbGUudHlwZSgpID09IFN0eWxlVmFsdWVIYW5kbGU6OlR5cGU6Ok51bWJlcgB1bnNpZ25lZCBjaGFyAHRvcABnZXRDb21wdXRlZFRvcABzZXRGbGV4V3JhcABnZXRGbGV4V3JhcABzZXRHYXAAZ2V0R2FwACVwAHNldEhlaWdodEF1dG8Ac2V0RmxleEJhc2lzQXV0bwBzZXRQb3NpdGlvbkF1dG8Ac2V0TWFyZ2luQXV0bwBzZXRXaWR0aEF1dG8AU2NhbGUgZmFjdG9yIHNob3VsZCBub3QgYmUgbGVzcyB0aGFuIHplcm8Ac2V0QXNwZWN0UmF0aW8AZ2V0QXNwZWN0UmF0aW8Ac2V0UG9zaXRpb24AZ2V0UG9zaXRpb24Abm90aWZ5T25EZXN0cnVjdGlvbgBzZXRGbGV4RGlyZWN0aW9uAGdldEZsZXhEaXJlY3Rpb24Ac2V0RGlyZWN0aW9uAGdldERpcmVjdGlvbgBzZXRNYXJnaW4AZ2V0TWFyZ2luAGdldENvbXB1dGVkTWFyZ2luAG1hcmtMYXlvdXRTZWVuAG5hbgBib3R0b20AZ2V0Q29tcHV0ZWRCb3R0b20AYm9vbABlbXNjcmlwdGVuOjp2YWwAc2V0RmxleFNocmluawBnZXRGbGV4U2hyaW5rAHNldEFsd2F5c0Zvcm1zQ29udGFpbmluZ0Jsb2NrAE1lYXN1cmVDYWxsYmFjawBEaXJ0aWVkQ2FsbGJhY2sAZ2V0TGVuZ3RoAHdpZHRoAHNldE1heFdpZHRoAGdldE1heFdpZHRoAHNldFdpZHRoAGdldFdpZHRoAHNldE1pbldpZHRoAGdldE1pbldpZHRoAGdldENvbXB1dGVkV2lkdGgAcHVzaAAvaG9tZS9ydW5uZXIvd29yay95b2dhL3lvZ2EvamF2YXNjcmlwdC8uLi95b2dhL3N0eWxlL1NtYWxsVmFsdWVCdWZmZXIuaAAvaG9tZS9ydW5uZXIvd29yay95b2dhL3lvZ2EvamF2YXNjcmlwdC8uLi95b2dhL3N0eWxlL1N0eWxlVmFsdWVQb29sLmgAdW5zaWduZWQgbG9uZwBzZXRCb3hTaXppbmcAZ2V0Qm94U2l6aW5nAHN0ZDo6d3N0cmluZwBzdGQ6OnN0cmluZwBzdGQ6OnUxNnN0cmluZwBzdGQ6OnUzMnN0cmluZwBzZXRQYWRkaW5nAGdldFBhZGRpbmcAZ2V0Q29tcHV0ZWRQYWRkaW5nAFRyaWVkIHRvIGNvbnN0cnVjdCBZR05vZGUgd2l0aCBudWxsIGNvbmZpZwBBdHRlbXB0aW5nIHRvIGNvbnN0cnVjdCBOb2RlIHdpdGggbnVsbCBjb25maWcAY3JlYXRlV2l0aENvbmZpZwBpbmYAc2V0QWxpZ25TZWxmAGdldEFsaWduU2VsZgBTaXplAHZhbHVlAFZhbHVlAGNyZWF0ZQBtZWFzdXJlAHNldFBvc2l0aW9uVHlwZQBnZXRQb3NpdGlvblR5cGUAaXNSZWZlcmVuY2VCYXNlbGluZQBzZXRJc1JlZmVyZW5jZUJhc2VsaW5lAGNvcHlTdHlsZQBkb3VibGUATm9kZQBleHRlbmQAaW5zZXJ0Q2hpbGQAZ2V0Q2hpbGQAcmVtb3ZlQ2hpbGQAdm9pZABzZXRFeHBlcmltZW50YWxGZWF0dXJlRW5hYmxlZABpc0V4cGVyaW1lbnRhbEZlYXR1cmVFbmFibGVkAGRpcnRpZWQAQ2Fubm90IHJlc2V0IGEgbm9kZSB3aGljaCBzdGlsbCBoYXMgY2hpbGRyZW4gYXR0YWNoZWQAdW5zZXRNZWFzdXJlRnVuYwB1bnNldERpcnRpZWRGdW5jAHNldEVycmF0YQBnZXRFcnJhdGEATWVhc3VyZSBmdW5jdGlvbiByZXR1cm5lZCBhbiBpbnZhbGlkIGRpbWVuc2lvbiB0byBZb2dhOiBbd2lkdGg9JWYsIGhlaWdodD0lZl0ARXhwZWN0IGN1c3RvbSBiYXNlbGluZSBmdW5jdGlvbiB0byBub3QgcmV0dXJuIE5hTgBOQU4ASU5GAGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHNob3J0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBzaG9ydD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBpbnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGZsb2F0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50OF90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQ4X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQxNl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQxNl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8Y2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgY2hhcj4Ac3RkOjpiYXNpY19zdHJpbmc8dW5zaWduZWQgY2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8c2lnbmVk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\";if(!ua(H)){var va=H;H=h.locateFile?h.locateFile(va,q):q+va}\nfunction wa(){var a=H;try{if(a==H&&w)return new Uint8Array(w);if(ua(a))try{var b=xa(a.slice(37)),c=new Uint8Array(b.length);for(a=0;a<b.length;++a)c[a]=b.charCodeAt(a);var d=c}catch(f){throw Error(\"Converting base64 string to bytes failed.\");}else d=void 0;var e=d;if(e)return e;throw\"both async and sync fetching of the wasm failed\";}catch(f){x(f)}}\nfunction ya(){return w||\"function\"!=typeof fetch?Promise.resolve().then(function(){return wa()}):fetch(H,{credentials:\"same-origin\"}).then(function(a){if(!a.ok)throw\"failed to load wasm binary file at '\"+H+\"'\";return a.arrayBuffer()}).catch(function(){return wa()})}function za(a){for(;0<a.length;)a.shift()(h)}function Aa(a){if(void 0===a)return\"_unknown\";a=a.replace(/[^a-zA-Z0-9_]/g,\"$\");var b=a.charCodeAt(0);return 48<=b&&57>=b?\"_\"+a:a}\nfunction Ba(a,b){a=Aa(a);return function(){return b.apply(this,arguments)}}var J=[{},{value:void 0},{value:null},{value:!0},{value:!1}],Ca=[];function Da(a){var b=Error,c=Ba(a,function(d){this.name=a;this.message=d;d=Error(d).stack;void 0!==d&&(this.stack=this.toString()+\"\\n\"+d.replace(/^Error(:[^\\n]*)?\\n/,\"\"))});c.prototype=Object.create(b.prototype);c.prototype.constructor=c;c.prototype.toString=function(){return void 0===this.message?this.name:this.name+\": \"+this.message};return c}var K=void 0;\nfunction L(a){throw new K(a);}var M=a=>{a||L(\"Cannot use deleted val. handle = \"+a);return J[a].value},Ea=a=>{switch(a){case void 0:return 1;case null:return 2;case !0:return 3;case !1:return 4;default:var b=Ca.length?Ca.pop():J.length;J[b]={ga:1,value:a};return b}},Fa=void 0,Ga=void 0;function N(a){for(var b=\"\";A[a];)b+=Ga[A[a++]];return b}var O=[];function Ha(){for(;O.length;){var a=O.pop();a.M.$=!1;a[\"delete\"]()}}var P=void 0,Q={};\nfunction Ia(a,b){for(void 0===b&&L(\"ptr should not be undefined\");a.R;)b=a.ba(b),a=a.R;return b}var R={};function Ja(a){a=Ka(a);var b=N(a);S(a);return b}function La(a,b){var c=R[a];void 0===c&&L(b+\" has unknown type \"+Ja(a));return c}function Ma(){}var Na=!1;function Oa(a){--a.count.value;0===a.count.value&&(a.T?a.U.W(a.T):a.P.N.W(a.O))}function Pa(a,b,c){if(b===c)return a;if(void 0===c.R)return null;a=Pa(a,b,c.R);return null===a?null:c.na(a)}var Qa={};function Ra(a,b){b=Ia(a,b);return Q[b]}\nvar Sa=void 0;function Ta(a){throw new Sa(a);}function Ua(a,b){b.P&&b.O||Ta(\"makeClassHandle requires ptr and ptrType\");!!b.U!==!!b.T&&Ta(\"Both smartPtrType and smartPtr must be specified\");b.count={value:1};return T(Object.create(a,{M:{value:b}}))}function T(a){if(\"undefined\"===typeof FinalizationRegistry)return T=b=>b,a;Na=new FinalizationRegistry(b=>{Oa(b.M)});T=b=>{var c=b.M;c.T&&Na.register(b,{M:c},b);return b};Ma=b=>{Na.unregister(b)};return T(a)}var Va={};\nfunction Wa(a){for(;a.length;){var b=a.pop();a.pop()(b)}}function Xa(a){return this.fromWireType(D[a>>2])}var U={},Ya={};function V(a,b,c){function d(k){k=c(k);k.length!==a.length&&Ta(\"Mismatched type converter count\");for(var m=0;m<a.length;++m)W(a[m],k[m])}a.forEach(function(k){Ya[k]=b});var e=Array(b.length),f=[],g=0;b.forEach((k,m)=>{R.hasOwnProperty(k)?e[m]=R[k]:(f.push(k),U.hasOwnProperty(k)||(U[k]=[]),U[k].push(()=>{e[m]=R[k];++g;g===f.length&&d(e)}))});0===f.length&&d(e)}\nfunction Za(a){switch(a){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError(\"Unknown type size: \"+a);}}\nfunction W(a,b,c={}){if(!(\"argPackAdvance\"in b))throw new TypeError(\"registerType registeredInstance requires argPackAdvance\");var d=b.name;a||L('type \"'+d+'\" must have a positive integer typeid pointer');if(R.hasOwnProperty(a)){if(c.ua)return;L(\"Cannot register type '\"+d+\"' twice\")}R[a]=b;delete Ya[a];U.hasOwnProperty(a)&&(b=U[a],delete U[a],b.forEach(e=>e()))}function $a(a){L(a.M.P.N.name+\" instance already deleted\")}function X(){}\nfunction ab(a,b,c){if(void 0===a[b].S){var d=a[b];a[b]=function(){a[b].S.hasOwnProperty(arguments.length)||L(\"Function '\"+c+\"' called with an invalid number of arguments (\"+arguments.length+\") - expects one of (\"+a[b].S+\")!\");return a[b].S[arguments.length].apply(this,arguments)};a[b].S=[];a[b].S[d.Z]=d}}\nfunction bb(a,b){h.hasOwnProperty(a)?(L(\"Cannot register public name '\"+a+\"' twice\"),ab(h,a,a),h.hasOwnProperty(void 0)&&L(\"Cannot register multiple overloads of a function with the same number of arguments (undefined)!\"),h[a].S[void 0]=b):h[a]=b}function cb(a,b,c,d,e,f,g,k){this.name=a;this.constructor=b;this.X=c;this.W=d;this.R=e;this.pa=f;this.ba=g;this.na=k;this.ja=[]}\nfunction db(a,b,c){for(;b!==c;)b.ba||L(\"Expected null or instance of \"+c.name+\", got an instance of \"+b.name),a=b.ba(a),b=b.R;return a}function eb(a,b){if(null===b)return this.ea&&L(\"null is not a valid \"+this.name),0;b.M||L('Cannot pass \"'+fb(b)+'\" as a '+this.name);b.M.O||L(\"Cannot pass deleted object as a pointer of type \"+this.name);return db(b.M.O,b.M.P.N,this.N)}\nfunction gb(a,b){if(null===b){this.ea&&L(\"null is not a valid \"+this.name);if(this.da){var c=this.fa();null!==a&&a.push(this.W,c);return c}return 0}b.M||L('Cannot pass \"'+fb(b)+'\" as a '+this.name);b.M.O||L(\"Cannot pass deleted object as a pointer of type \"+this.name);!this.ca&&b.M.P.ca&&L(\"Cannot convert argument of type \"+(b.M.U?b.M.U.name:b.M.P.name)+\" to parameter type \"+this.name);c=db(b.M.O,b.M.P.N,this.N);if(this.da)switch(void 0===b.M.T&&L(\"Passing raw pointer to smart pointer is illegal\"),\nthis.Ba){case 0:b.M.U===this?c=b.M.T:L(\"Cannot convert argument of type \"+(b.M.U?b.M.U.name:b.M.P.name)+\" to parameter type \"+this.name);break;case 1:c=b.M.T;break;case 2:if(b.M.U===this)c=b.M.T;else{var d=b.clone();c=this.xa(c,Ea(function(){d[\"delete\"]()}));null!==a&&a.push(this.W,c)}break;default:L(\"Unsupporting sharing policy\")}return c}\nfunction hb(a,b){if(null===b)return this.ea&&L(\"null is not a valid \"+this.name),0;b.M||L('Cannot pass \"'+fb(b)+'\" as a '+this.name);b.M.O||L(\"Cannot pass deleted object as a pointer of type \"+this.name);b.M.P.ca&&L(\"Cannot convert argument of type \"+b.M.P.name+\" to parameter type \"+this.name);return db(b.M.O,b.M.P.N,this.N)}\nfunction Y(a,b,c,d){this.name=a;this.N=b;this.ea=c;this.ca=d;this.da=!1;this.W=this.xa=this.fa=this.ka=this.Ba=this.wa=void 0;void 0!==b.R?this.toWireType=gb:(this.toWireType=d?eb:hb,this.V=null)}function ib(a,b){h.hasOwnProperty(a)||Ta(\"Replacing nonexistant public symbol\");h[a]=b;h[a].Z=void 0}\nfunction jb(a,b){var c=[];return function(){c.length=0;Object.assign(c,arguments);if(a.includes(\"j\")){var d=h[\"dynCall_\"+a];d=c&&c.length?d.apply(null,[b].concat(c)):d.call(null,b)}else d=oa.get(b).apply(null,c);return d}}function Z(a,b){a=N(a);var c=a.includes(\"j\")?jb(a,b):oa.get(b);\"function\"!=typeof c&&L(\"unknown function pointer with signature \"+a+\": \"+b);return c}var mb=void 0;\nfunction nb(a,b){function c(f){e[f]||R[f]||(Ya[f]?Ya[f].forEach(c):(d.push(f),e[f]=!0))}var d=[],e={};b.forEach(c);throw new mb(a+\": \"+d.map(Ja).join([\", \"]));}\nfunction ob(a,b,c,d,e){var f=b.length;2>f&&L(\"argTypes array size mismatch! Must at least get return value and 'this' types!\");var g=null!==b[1]&&null!==c,k=!1;for(c=1;c<b.length;++c)if(null!==b[c]&&void 0===b[c].V){k=!0;break}var m=\"void\"!==b[0].name,l=f-2,n=Array(l),p=[],r=[];return function(){arguments.length!==l&&L(\"function \"+a+\" called with \"+arguments.length+\" arguments, expected \"+l+\" args!\");r.length=0;p.length=g?2:1;p[0]=e;if(g){var u=b[1].toWireType(r,this);p[1]=u}for(var t=0;t<l;++t)n[t]=\nb[t+2].toWireType(r,arguments[t]),p.push(n[t]);t=d.apply(null,p);if(k)Wa(r);else for(var y=g?1:2;y<b.length;y++){var B=1===y?u:n[y-2];null!==b[y].V&&b[y].V(B)}u=m?b[0].fromWireType(t):void 0;return u}}function pb(a,b){for(var c=[],d=0;d<a;d++)c.push(E[b+4*d>>2]);return c}function qb(a){4<a&&0===--J[a].ga&&(J[a]=void 0,Ca.push(a))}function fb(a){if(null===a)return\"null\";var b=typeof a;return\"object\"===b||\"array\"===b||\"function\"===b?a.toString():\"\"+a}\nfunction rb(a,b){switch(b){case 2:return function(c){return this.fromWireType(la[c>>2])};case 3:return function(c){return this.fromWireType(ma[c>>3])};default:throw new TypeError(\"Unknown float type: \"+a);}}\nfunction sb(a,b,c){switch(b){case 0:return c?function(d){return ja[d]}:function(d){return A[d]};case 1:return c?function(d){return C[d>>1]}:function(d){return ka[d>>1]};case 2:return c?function(d){return D[d>>2]}:function(d){return E[d>>2]};default:throw new TypeError(\"Unknown integer type: \"+a);}}function tb(a,b){for(var c=\"\",d=0;!(d>=b/2);++d){var e=C[a+2*d>>1];if(0==e)break;c+=String.fromCharCode(e)}return c}\nfunction ub(a,b,c){void 0===c&&(c=2147483647);if(2>c)return 0;c-=2;var d=b;c=c<2*a.length?c/2:a.length;for(var e=0;e<c;++e)C[b>>1]=a.charCodeAt(e),b+=2;C[b>>1]=0;return b-d}function vb(a){return 2*a.length}function wb(a,b){for(var c=0,d=\"\";!(c>=b/4);){var e=D[a+4*c>>2];if(0==e)break;++c;65536<=e?(e-=65536,d+=String.fromCharCode(55296|e>>10,56320|e&1023)):d+=String.fromCharCode(e)}return d}\nfunction xb(a,b,c){void 0===c&&(c=2147483647);if(4>c)return 0;var d=b;c=d+c-4;for(var e=0;e<a.length;++e){var f=a.charCodeAt(e);if(55296<=f&&57343>=f){var g=a.charCodeAt(++e);f=65536+((f&1023)<<10)|g&1023}D[b>>2]=f;b+=4;if(b+4>c)break}D[b>>2]=0;return b-d}function yb(a){for(var b=0,c=0;c<a.length;++c){var d=a.charCodeAt(c);55296<=d&&57343>=d&&++c;b+=4}return b}var zb={};function Ab(a){var b=zb[a];return void 0===b?N(a):b}var Bb=[];function Cb(a){var b=Bb.length;Bb.push(a);return b}\nfunction Db(a,b){for(var c=Array(a),d=0;d<a;++d)c[d]=La(E[b+4*d>>2],\"parameter \"+d);return c}var Eb=[],Fb=[null,[],[]];K=h.BindingError=Da(\"BindingError\");h.count_emval_handles=function(){for(var a=0,b=5;b<J.length;++b)void 0!==J[b]&&++a;return a};h.get_first_emval=function(){for(var a=5;a<J.length;++a)if(void 0!==J[a])return J[a];return null};Fa=h.PureVirtualError=Da(\"PureVirtualError\");for(var Gb=Array(256),Hb=0;256>Hb;++Hb)Gb[Hb]=String.fromCharCode(Hb);Ga=Gb;h.getInheritedInstanceCount=function(){return Object.keys(Q).length};\nh.getLiveInheritedInstances=function(){var a=[],b;for(b in Q)Q.hasOwnProperty(b)&&a.push(Q[b]);return a};h.flushPendingDeletes=Ha;h.setDelayFunction=function(a){P=a;O.length&&P&&P(Ha)};Sa=h.InternalError=Da(\"InternalError\");X.prototype.isAliasOf=function(a){if(!(this instanceof X&&a instanceof X))return!1;var b=this.M.P.N,c=this.M.O,d=a.M.P.N;for(a=a.M.O;b.R;)c=b.ba(c),b=b.R;for(;d.R;)a=d.ba(a),d=d.R;return b===d&&c===a};\nX.prototype.clone=function(){this.M.O||$a(this);if(this.M.aa)return this.M.count.value+=1,this;var a=T,b=Object,c=b.create,d=Object.getPrototypeOf(this),e=this.M;a=a(c.call(b,d,{M:{value:{count:e.count,$:e.$,aa:e.aa,O:e.O,P:e.P,T:e.T,U:e.U}}}));a.M.count.value+=1;a.M.$=!1;return a};X.prototype[\"delete\"]=function(){this.M.O||$a(this);this.M.$&&!this.M.aa&&L(\"Object already scheduled for deletion\");Ma(this);Oa(this.M);this.M.aa||(this.M.T=void 0,this.M.O=void 0)};X.prototype.isDeleted=function(){return!this.M.O};\nX.prototype.deleteLater=function(){this.M.O||$a(this);this.M.$&&!this.M.aa&&L(\"Object already scheduled for deletion\");O.push(this);1===O.length&&P&&P(Ha);this.M.$=!0;return this};Y.prototype.qa=function(a){this.ka&&(a=this.ka(a));return a};Y.prototype.ha=function(a){this.W&&this.W(a)};Y.prototype.argPackAdvance=8;Y.prototype.readValueFromPointer=Xa;Y.prototype.deleteObject=function(a){if(null!==a)a[\"delete\"]()};\nY.prototype.fromWireType=function(a){function b(){return this.da?Ua(this.N.X,{P:this.wa,O:c,U:this,T:a}):Ua(this.N.X,{P:this,O:a})}var c=this.qa(a);if(!c)return this.ha(a),null;var d=Ra(this.N,c);if(void 0!==d){if(0===d.M.count.value)return d.M.O=c,d.M.T=a,d.clone();d=d.clone();this.ha(a);return d}d=this.N.pa(c);d=Qa[d];if(!d)return b.call(this);d=this.ca?d.la:d.pointerType;var e=Pa(c,this.N,d.N);return null===e?b.call(this):this.da?Ua(d.N.X,{P:d,O:e,U:this,T:a}):Ua(d.N.X,{P:d,O:e})};\nmb=h.UnboundTypeError=Da(\"UnboundTypeError\");\nvar xa=\"function\"==typeof atob?atob:function(a){var b=\"\",c=0;a=a.replace(/[^A-Za-z0-9\\+\\/=]/g,\"\");do{var d=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(c++));var e=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(c++));var f=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(c++));var g=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(c++));d=d<<2|e>>4;\ne=(e&15)<<4|f>>2;var k=(f&3)<<6|g;b+=String.fromCharCode(d);64!==f&&(b+=String.fromCharCode(e));64!==g&&(b+=String.fromCharCode(k))}while(c<a.length);return b},Jb={l:function(a,b,c,d){x(\"Assertion failed: \"+(a?z(A,a):\"\")+\", at: \"+[b?b?z(A,b):\"\":\"unknown filename\",c,d?d?z(A,d):\"\":\"unknown function\"])},q:function(a,b,c){a=N(a);b=La(b,\"wrapper\");c=M(c);var d=[].slice,e=b.N,f=e.X,g=e.R.X,k=e.R.constructor;a=Ba(a,function(){e.R.ja.forEach(function(l){if(this[l]===g[l])throw new Fa(\"Pure virtual function \"+\nl+\" must be implemented in JavaScript\");}.bind(this));Object.defineProperty(this,\"__parent\",{value:f});this.__construct.apply(this,d.call(arguments))});f.__construct=function(){this===f&&L(\"Pass correct 'this' to __construct\");var l=k.implement.apply(void 0,[this].concat(d.call(arguments)));Ma(l);var n=l.M;l.notifyOnDestruction();n.aa=!0;Object.defineProperties(this,{M:{value:n}});T(this);l=n.O;l=Ia(e,l);Q.hasOwnProperty(l)?L(\"Tried to register registered instance: \"+l):Q[l]=this};f.__destruct=function(){this===\nf&&L(\"Pass correct 'this' to __destruct\");Ma(this);var l=this.M.O;l=Ia(e,l);Q.hasOwnProperty(l)?delete Q[l]:L(\"Tried to unregister unregistered instance: \"+l)};a.prototype=Object.create(f);for(var m in c)a.prototype[m]=c[m];return Ea(a)},j:function(a){var b=Va[a];delete Va[a];var c=b.fa,d=b.W,e=b.ia,f=e.map(g=>g.ta).concat(e.map(g=>g.za));V([a],f,g=>{var k={};e.forEach((m,l)=>{var n=g[l],p=m.ra,r=m.sa,u=g[l+e.length],t=m.ya,y=m.Aa;k[m.oa]={read:B=>n.fromWireType(p(r,B)),write:(B,ba)=>{var I=[];t(y,\nB,u.toWireType(I,ba));Wa(I)}}});return[{name:b.name,fromWireType:function(m){var l={},n;for(n in k)l[n]=k[n].read(m);d(m);return l},toWireType:function(m,l){for(var n in k)if(!(n in l))throw new TypeError('Missing field: \"'+n+'\"');var p=c();for(n in k)k[n].write(p,l[n]);null!==m&&m.push(d,p);return p},argPackAdvance:8,readValueFromPointer:Xa,V:d}]})},v:function(){},B:function(a,b,c,d,e){var f=Za(c);b=N(b);W(a,{name:b,fromWireType:function(g){return!!g},toWireType:function(g,k){return k?d:e},argPackAdvance:8,\nreadValueFromPointer:function(g){if(1===c)var k=ja;else if(2===c)k=C;else if(4===c)k=D;else throw new TypeError(\"Unknown boolean type size: \"+b);return this.fromWireType(k[g>>f])},V:null})},f:function(a,b,c,d,e,f,g,k,m,l,n,p,r){n=N(n);f=Z(e,f);k&&(k=Z(g,k));l&&(l=Z(m,l));r=Z(p,r);var u=Aa(n);bb(u,function(){nb(\"Cannot construct \"+n+\" due to unbound types\",[d])});V([a,b,c],d?[d]:[],function(t){t=t[0];if(d){var y=t.N;var B=y.X}else B=X.prototype;t=Ba(u,function(){if(Object.getPrototypeOf(this)!==ba)throw new K(\"Use 'new' to construct \"+\nn);if(void 0===I.Y)throw new K(n+\" has no accessible constructor\");var kb=I.Y[arguments.length];if(void 0===kb)throw new K(\"Tried to invoke ctor of \"+n+\" with invalid number of parameters (\"+arguments.length+\") - expected (\"+Object.keys(I.Y).toString()+\") parameters instead!\");return kb.apply(this,arguments)});var ba=Object.create(B,{constructor:{value:t}});t.prototype=ba;var I=new cb(n,t,ba,r,y,f,k,l);y=new Y(n,I,!0,!1);B=new Y(n+\"*\",I,!1,!1);var lb=new Y(n+\" const*\",I,!1,!0);Qa[a]={pointerType:B,\nla:lb};ib(u,t);return[y,B,lb]})},d:function(a,b,c,d,e,f,g){var k=pb(c,d);b=N(b);f=Z(e,f);V([],[a],function(m){function l(){nb(\"Cannot call \"+n+\" due to unbound types\",k)}m=m[0];var n=m.name+\".\"+b;b.startsWith(\"@@\")&&(b=Symbol[b.substring(2)]);var p=m.N.constructor;void 0===p[b]?(l.Z=c-1,p[b]=l):(ab(p,b,n),p[b].S[c-1]=l);V([],k,function(r){r=ob(n,[r[0],null].concat(r.slice(1)),null,f,g);void 0===p[b].S?(r.Z=c-1,p[b]=r):p[b].S[c-1]=r;return[]});return[]})},p:function(a,b,c,d,e,f){0<b||x();var g=pb(b,\nc);e=Z(d,e);V([],[a],function(k){k=k[0];var m=\"constructor \"+k.name;void 0===k.N.Y&&(k.N.Y=[]);if(void 0!==k.N.Y[b-1])throw new K(\"Cannot register multiple constructors with identical number of parameters (\"+(b-1)+\") for class '\"+k.name+\"'! Overload resolution is currently only performed using the parameter count, not actual type info!\");k.N.Y[b-1]=()=>{nb(\"Cannot construct \"+k.name+\" due to unbound types\",g)};V([],g,function(l){l.splice(1,0,null);k.N.Y[b-1]=ob(m,l,null,e,f);return[]});return[]})},\na:function(a,b,c,d,e,f,g,k){var m=pb(c,d);b=N(b);f=Z(e,f);V([],[a],function(l){function n(){nb(\"Cannot call \"+p+\" due to unbound types\",m)}l=l[0];var p=l.name+\".\"+b;b.startsWith(\"@@\")&&(b=Symbol[b.substring(2)]);k&&l.N.ja.push(b);var r=l.N.X,u=r[b];void 0===u||void 0===u.S&&u.className!==l.name&&u.Z===c-2?(n.Z=c-2,n.className=l.name,r[b]=n):(ab(r,b,p),r[b].S[c-2]=n);V([],m,function(t){t=ob(p,t,l,f,g);void 0===r[b].S?(t.Z=c-2,r[b]=t):r[b].S[c-2]=t;return[]});return[]})},A:function(a,b){b=N(b);W(a,\n{name:b,fromWireType:function(c){var d=M(c);qb(c);return d},toWireType:function(c,d){return Ea(d)},argPackAdvance:8,readValueFromPointer:Xa,V:null})},n:function(a,b,c){c=Za(c);b=N(b);W(a,{name:b,fromWireType:function(d){return d},toWireType:function(d,e){return e},argPackAdvance:8,readValueFromPointer:rb(b,c),V:null})},e:function(a,b,c,d,e){b=N(b);-1===e&&(e=4294967295);e=Za(c);var f=k=>k;if(0===d){var g=32-8*c;f=k=>k<<g>>>g}c=b.includes(\"unsigned\")?function(k,m){return m>>>0}:function(k,m){return m};\nW(a,{name:b,fromWireType:f,toWireType:c,argPackAdvance:8,readValueFromPointer:sb(b,e,0!==d),V:null})},b:function(a,b,c){function d(f){f>>=2;var g=E;return new e(ia,g[f+1],g[f])}var e=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=N(c);W(a,{name:c,fromWireType:d,argPackAdvance:8,readValueFromPointer:d},{ua:!0})},o:function(a,b){b=N(b);var c=\"std::string\"===b;W(a,{name:b,fromWireType:function(d){var e=E[d>>2],f=d+4;if(c)for(var g=f,k=0;k<=e;++k){var m=\nf+k;if(k==e||0==A[m]){g=g?z(A,g,m-g):\"\";if(void 0===l)var l=g;else l+=String.fromCharCode(0),l+=g;g=m+1}}else{l=Array(e);for(k=0;k<e;++k)l[k]=String.fromCharCode(A[f+k]);l=l.join(\"\")}S(d);return l},toWireType:function(d,e){e instanceof ArrayBuffer&&(e=new Uint8Array(e));var f,g=\"string\"==typeof e;g||e instanceof Uint8Array||e instanceof Uint8ClampedArray||e instanceof Int8Array||L(\"Cannot pass non-string to std::string\");if(c&&g){var k=0;for(f=0;f<e.length;++f){var m=e.charCodeAt(f);127>=m?k++:2047>=\nm?k+=2:55296<=m&&57343>=m?(k+=4,++f):k+=3}f=k}else f=e.length;k=Ib(4+f+1);m=k+4;E[k>>2]=f;if(c&&g){if(g=m,m=f+1,f=A,0<m){m=g+m-1;for(var l=0;l<e.length;++l){var n=e.charCodeAt(l);if(55296<=n&&57343>=n){var p=e.charCodeAt(++l);n=65536+((n&1023)<<10)|p&1023}if(127>=n){if(g>=m)break;f[g++]=n}else{if(2047>=n){if(g+1>=m)break;f[g++]=192|n>>6}else{if(65535>=n){if(g+2>=m)break;f[g++]=224|n>>12}else{if(g+3>=m)break;f[g++]=240|n>>18;f[g++]=128|n>>12&63}f[g++]=128|n>>6&63}f[g++]=128|n&63}}f[g]=0}}else if(g)for(g=\n0;g<f;++g)l=e.charCodeAt(g),255<l&&(S(m),L(\"String has UTF-16 code units that do not fit in 8 bits\")),A[m+g]=l;else for(g=0;g<f;++g)A[m+g]=e[g];null!==d&&d.push(S,k);return k},argPackAdvance:8,readValueFromPointer:Xa,V:function(d){S(d)}})},i:function(a,b,c){c=N(c);if(2===b){var d=tb;var e=ub;var f=vb;var g=()=>ka;var k=1}else 4===b&&(d=wb,e=xb,f=yb,g=()=>E,k=2);W(a,{name:c,fromWireType:function(m){for(var l=E[m>>2],n=g(),p,r=m+4,u=0;u<=l;++u){var t=m+4+u*b;if(u==l||0==n[t>>k])r=d(r,t-r),void 0===\np?p=r:(p+=String.fromCharCode(0),p+=r),r=t+b}S(m);return p},toWireType:function(m,l){\"string\"!=typeof l&&L(\"Cannot pass non-string to C++ string type \"+c);var n=f(l),p=Ib(4+n+b);E[p>>2]=n>>k;e(l,p+4,n+b);null!==m&&m.push(S,p);return p},argPackAdvance:8,readValueFromPointer:Xa,V:function(m){S(m)}})},k:function(a,b,c,d,e,f){Va[a]={name:N(b),fa:Z(c,d),W:Z(e,f),ia:[]}},h:function(a,b,c,d,e,f,g,k,m,l){Va[a].ia.push({oa:N(b),ta:c,ra:Z(d,e),sa:f,za:g,ya:Z(k,m),Aa:l})},C:function(a,b){b=N(b);W(a,{va:!0,name:b,\nargPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},s:function(a,b,c,d,e){a=Bb[a];b=M(b);c=Ab(c);var f=[];E[d>>2]=Ea(f);return a(b,c,f,e)},t:function(a,b,c,d){a=Bb[a];b=M(b);c=Ab(c);a(b,c,null,d)},g:qb,m:function(a,b){var c=Db(a,b),d=c[0];b=d.name+\"_$\"+c.slice(1).map(function(g){return g.name}).join(\"_\")+\"$\";var e=Eb[b];if(void 0!==e)return e;var f=Array(a-1);e=Cb((g,k,m,l)=>{for(var n=0,p=0;p<a-1;++p)f[p]=c[p+1].readValueFromPointer(l+n),n+=c[p+1].argPackAdvance;g=g[k].apply(g,\nf);for(p=0;p<a-1;++p)c[p+1].ma&&c[p+1].ma(f[p]);if(!d.va)return d.toWireType(m,g)});return Eb[b]=e},D:function(a){4<a&&(J[a].ga+=1)},r:function(a){var b=M(a);Wa(b);qb(a)},c:function(){x(\"\")},x:function(a,b,c){A.copyWithin(a,b,b+c)},w:function(a){var b=A.length;a>>>=0;if(2147483648<a)return!1;for(var c=1;4>=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);var e=Math;d=Math.max(a,d);e=e.min.call(e,2147483648,d+(65536-d%65536)%65536);a:{try{fa.grow(e-ia.byteLength+65535>>>16);na();var f=1;break a}catch(g){}f=\nvoid 0}if(f)return!0}return!1},z:function(){return 52},u:function(){return 70},y:function(a,b,c,d){for(var e=0,f=0;f<c;f++){var g=E[b>>2],k=E[b+4>>2];b+=8;for(var m=0;m<k;m++){var l=A[g+m],n=Fb[a];0===l||10===l?((1===a?ea:v)(z(n,0)),n.length=0):n.push(l)}e+=k}E[d>>2]=e;return 0}};\n(function(){function a(e){h.asm=e.exports;fa=h.asm.E;na();oa=h.asm.J;qa.unshift(h.asm.F);F--;h.monitorRunDependencies&&h.monitorRunDependencies(F);0==F&&(null!==ta&&(clearInterval(ta),ta=null),G&&(e=G,G=null,e()))}function b(e){a(e.instance)}function c(e){return ya().then(function(f){return WebAssembly.instantiate(f,d)}).then(function(f){return f}).then(e,function(f){v(\"failed to asynchronously prepare wasm: \"+f);x(f)})}var d={a:Jb};F++;h.monitorRunDependencies&&h.monitorRunDependencies(F);if(h.instantiateWasm)try{return h.instantiateWasm(d,\na)}catch(e){v(\"Module.instantiateWasm callback failed with error: \"+e),ca(e)}(function(){return w||\"function\"!=typeof WebAssembly.instantiateStreaming||ua(H)||\"function\"!=typeof fetch?c(b):fetch(H,{credentials:\"same-origin\"}).then(function(e){return WebAssembly.instantiateStreaming(e,d).then(b,function(f){v(\"wasm streaming compile failed: \"+f);v(\"falling back to ArrayBuffer instantiation\");return c(b)})})})().catch(ca);return{}})();\nh.___wasm_call_ctors=function(){return(h.___wasm_call_ctors=h.asm.F).apply(null,arguments)};var Ka=h.___getTypeName=function(){return(Ka=h.___getTypeName=h.asm.G).apply(null,arguments)};h.__embind_initialize_bindings=function(){return(h.__embind_initialize_bindings=h.asm.H).apply(null,arguments)};var Ib=h._malloc=function(){return(Ib=h._malloc=h.asm.I).apply(null,arguments)},S=h._free=function(){return(S=h._free=h.asm.K).apply(null,arguments)};\nh.dynCall_jiji=function(){return(h.dynCall_jiji=h.asm.L).apply(null,arguments)};var Kb;G=function Lb(){Kb||Mb();Kb||(G=Lb)};\nfunction Mb(){function a(){if(!Kb&&(Kb=!0,h.calledRun=!0,!ha)){za(qa);aa(h);if(h.onRuntimeInitialized)h.onRuntimeInitialized();if(h.postRun)for(\"function\"==typeof h.postRun&&(h.postRun=[h.postRun]);h.postRun.length;){var b=h.postRun.shift();ra.unshift(b)}za(ra)}}if(!(0<F)){if(h.preRun)for(\"function\"==typeof h.preRun&&(h.preRun=[h.preRun]);h.preRun.length;)sa();za(pa);0<F||(h.setStatus?(h.setStatus(\"Running...\"),setTimeout(function(){setTimeout(function(){h.setStatus(\"\")},1);a()},1)):a())}}\nif(h.preInit)for(\"function\"==typeof h.preInit&&(h.preInit=[h.preInit]);0<h.preInit.length;)h.preInit.pop()();Mb();\n\n\n return loadYoga.ready\n}\n);\n})();\nexport default loadYoga;","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// @generated by enums.py\n\nexport enum Align {\n Auto = 0,\n FlexStart = 1,\n Center = 2,\n FlexEnd = 3,\n Stretch = 4,\n Baseline = 5,\n SpaceBetween = 6,\n SpaceAround = 7,\n SpaceEvenly = 8,\n}\n\nexport enum BoxSizing {\n BorderBox = 0,\n ContentBox = 1,\n}\n\nexport enum Dimension {\n Width = 0,\n Height = 1,\n}\n\nexport enum Direction {\n Inherit = 0,\n LTR = 1,\n RTL = 2,\n}\n\nexport enum Display {\n Flex = 0,\n None = 1,\n Contents = 2,\n}\n\nexport enum Edge {\n Left = 0,\n Top = 1,\n Right = 2,\n Bottom = 3,\n Start = 4,\n End = 5,\n Horizontal = 6,\n Vertical = 7,\n All = 8,\n}\n\nexport enum Errata {\n None = 0,\n StretchFlexBasis = 1,\n AbsolutePositionWithoutInsetsExcludesPadding = 2,\n AbsolutePercentAgainstInnerSize = 4,\n All = 2147483647,\n Classic = 2147483646,\n}\n\nexport enum ExperimentalFeature {\n WebFlexBasis = 0,\n}\n\nexport enum FlexDirection {\n Column = 0,\n ColumnReverse = 1,\n Row = 2,\n RowReverse = 3,\n}\n\nexport enum Gutter {\n Column = 0,\n Row = 1,\n All = 2,\n}\n\nexport enum Justify {\n FlexStart = 0,\n Center = 1,\n FlexEnd = 2,\n SpaceBetween = 3,\n SpaceAround = 4,\n SpaceEvenly = 5,\n}\n\nexport enum LogLevel {\n Error = 0,\n Warn = 1,\n Info = 2,\n Debug = 3,\n Verbose = 4,\n Fatal = 5,\n}\n\nexport enum MeasureMode {\n Undefined = 0,\n Exactly = 1,\n AtMost = 2,\n}\n\nexport enum NodeType {\n Default = 0,\n Text = 1,\n}\n\nexport enum Overflow {\n Visible = 0,\n Hidden = 1,\n Scroll = 2,\n}\n\nexport enum PositionType {\n Static = 0,\n Relative = 1,\n Absolute = 2,\n}\n\nexport enum Unit {\n Undefined = 0,\n Point = 1,\n Percent = 2,\n Auto = 3,\n}\n\nexport enum Wrap {\n NoWrap = 0,\n Wrap = 1,\n WrapReverse = 2,\n}\n\nconst constants = {\n ALIGN_AUTO: Align.Auto,\n ALIGN_FLEX_START: Align.FlexStart,\n ALIGN_CENTER: Align.Center,\n ALIGN_FLEX_END: Align.FlexEnd,\n ALIGN_STRETCH: Align.Stretch,\n ALIGN_BASELINE: Align.Baseline,\n ALIGN_SPACE_BETWEEN: Align.SpaceBetween,\n ALIGN_SPACE_AROUND: Align.SpaceAround,\n ALIGN_SPACE_EVENLY: Align.SpaceEvenly,\n BOX_SIZING_BORDER_BOX: BoxSizing.BorderBox,\n BOX_SIZING_CONTENT_BOX: BoxSizing.ContentBox,\n DIMENSION_WIDTH: Dimension.Width,\n DIMENSION_HEIGHT: Dimension.Height,\n DIRECTION_INHERIT: Direction.Inherit,\n DIRECTION_LTR: Direction.LTR,\n DIRECTION_RTL: Direction.RTL,\n DISPLAY_FLEX: Display.Flex,\n DISPLAY_NONE: Display.None,\n DISPLAY_CONTENTS: Display.Contents,\n EDGE_LEFT: Edge.Left,\n EDGE_TOP: Edge.Top,\n EDGE_RIGHT: Edge.Right,\n EDGE_BOTTOM: Edge.Bottom,\n EDGE_START: Edge.Start,\n EDGE_END: Edge.End,\n EDGE_HORIZONTAL: Edge.Horizontal,\n EDGE_VERTICAL: Edge.Vertical,\n EDGE_ALL: Edge.All,\n ERRATA_NONE: Errata.None,\n ERRATA_STRETCH_FLEX_BASIS: Errata.StretchFlexBasis,\n ERRATA_ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING: Errata.AbsolutePositionWithoutInsetsExcludesPadding,\n ERRATA_ABSOLUTE_PERCENT_AGAINST_INNER_SIZE: Errata.AbsolutePercentAgainstInnerSize,\n ERRATA_ALL: Errata.All,\n ERRATA_CLASSIC: Errata.Classic,\n EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS: ExperimentalFeature.WebFlexBasis,\n FLEX_DIRECTION_COLUMN: FlexDirection.Column,\n FLEX_DIRECTION_COLUMN_REVERSE: FlexDirection.ColumnReverse,\n FLEX_DIRECTION_ROW: FlexDirection.Row,\n FLEX_DIRECTION_ROW_REVERSE: FlexDirection.RowReverse,\n GUTTER_COLUMN: Gutter.Column,\n GUTTER_ROW: Gutter.Row,\n GUTTER_ALL: Gutter.All,\n JUSTIFY_FLEX_START: Justify.FlexStart,\n JUSTIFY_CENTER: Justify.Center,\n JUSTIFY_FLEX_END: Justify.FlexEnd,\n JUSTIFY_SPACE_BETWEEN: Justify.SpaceBetween,\n JUSTIFY_SPACE_AROUND: Justify.SpaceAround,\n JUSTIFY_SPACE_EVENLY: Justify.SpaceEvenly,\n LOG_LEVEL_ERROR: LogLevel.Error,\n LOG_LEVEL_WARN: LogLevel.Warn,\n LOG_LEVEL_INFO: LogLevel.Info,\n LOG_LEVEL_DEBUG: LogLevel.Debug,\n LOG_LEVEL_VERBOSE: LogLevel.Verbose,\n LOG_LEVEL_FATAL: LogLevel.Fatal,\n MEASURE_MODE_UNDEFINED: MeasureMode.Undefined,\n MEASURE_MODE_EXACTLY: MeasureMode.Exactly,\n MEASURE_MODE_AT_MOST: MeasureMode.AtMost,\n NODE_TYPE_DEFAULT: NodeType.Default,\n NODE_TYPE_TEXT: NodeType.Text,\n OVERFLOW_VISIBLE: Overflow.Visible,\n OVERFLOW_HIDDEN: Overflow.Hidden,\n OVERFLOW_SCROLL: Overflow.Scroll,\n POSITION_TYPE_STATIC: PositionType.Static,\n POSITION_TYPE_RELATIVE: PositionType.Relative,\n POSITION_TYPE_ABSOLUTE: PositionType.Absolute,\n UNIT_UNDEFINED: Unit.Undefined,\n UNIT_POINT: Unit.Point,\n UNIT_PERCENT: Unit.Percent,\n UNIT_AUTO: Unit.Auto,\n WRAP_NO_WRAP: Wrap.NoWrap,\n WRAP_WRAP: Wrap.Wrap,\n WRAP_WRAP_REVERSE: Wrap.WrapReverse,\n}\nexport default constants","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @format\n */\n\n// @ts-nocheck\n\nimport {Unit, Direction} from './generated/YGEnums.ts';\nimport YGEnums from './generated/YGEnums.ts';\n\nimport type {\n Align,\n BoxSizing,\n Display,\n Edge,\n Errata,\n ExperimentalFeature,\n FlexDirection,\n Gutter,\n Justify,\n MeasureMode,\n Overflow,\n PositionType,\n Wrap,\n} from './generated/YGEnums.ts';\n\ntype Layout = {\n left: number;\n right: number;\n top: number;\n bottom: number;\n width: number;\n height: number;\n};\n\ntype Size = {\n width: number;\n height: number;\n};\n\ntype Value = {\n unit: Unit;\n value: number;\n};\n\nexport type Config = {\n free(): void;\n isExperimentalFeatureEnabled(feature: ExperimentalFeature): boolean;\n setExperimentalFeatureEnabled(\n feature: ExperimentalFeature,\n enabled: boolean,\n ): void;\n setPointScaleFactor(factor: number): void;\n getErrata(): Errata;\n setErrata(errata: Errata): void;\n useWebDefaults(): boolean;\n setUseWebDefaults(useWebDefaults: boolean): void;\n};\n\nexport type DirtiedFunction = (node: Node) => void;\n\nexport type MeasureFunction = (\n width: number,\n widthMode: MeasureMode,\n height: number,\n heightMode: MeasureMode,\n) => Size;\n\nexport type Node = {\n calculateLayout(\n width: number | 'auto' | undefined,\n height: number | 'auto' | undefined,\n direction?: Direction,\n ): void;\n copyStyle(node: Node): void;\n free(): void;\n freeRecursive(): void;\n getAlignContent(): Align;\n getAlignItems(): Align;\n getAlignSelf(): Align;\n getAspectRatio(): number;\n getBorder(edge: Edge): number;\n getChild(index: number): Node;\n getChildCount(): number;\n getComputedBorder(edge: Edge): number;\n getComputedBottom(): number;\n getComputedHeight(): number;\n getComputedLayout(): Layout;\n getComputedLeft(): number;\n getComputedMargin(edge: Edge): number;\n getComputedPadding(edge: Edge): number;\n getComputedRight(): number;\n getComputedTop(): number;\n getComputedWidth(): number;\n getDirection(): Direction;\n getDisplay(): Display;\n getFlexBasis(): Value;\n getFlexDirection(): FlexDirection;\n getFlexGrow(): number;\n getFlexShrink(): number;\n getFlexWrap(): Wrap;\n getHeight(): Value;\n getJustifyContent(): Justify;\n getGap(gutter: Gutter): Value;\n getMargin(edge: Edge): Value;\n getMaxHeight(): Value;\n getMaxWidth(): Value;\n getMinHeight(): Value;\n getMinWidth(): Value;\n getOverflow(): Overflow;\n getPadding(edge: Edge): Value;\n getParent(): Node | null;\n getPosition(edge: Edge): Value;\n getPositionType(): PositionType;\n getBoxSizing(): BoxSizing;\n getWidth(): Value;\n insertChild(child: Node, index: number): void;\n isDirty(): boolean;\n isReferenceBaseline(): boolean;\n markDirty(): void;\n hasNewLayout(): boolean;\n markLayoutSeen(): void;\n removeChild(child: Node): void;\n reset(): void;\n setAlignContent(alignContent: Align): void;\n setAlignItems(alignItems: Align): void;\n setAlignSelf(alignSelf: Align): void;\n setAspectRatio(aspectRatio: number | undefined): void;\n setBorder(edge: Edge, borderWidth: number | undefined): void;\n setDirection(direction: Direction): void;\n setDisplay(display: Display): void;\n setFlex(flex: number | undefined): void;\n setFlexBasis(flexBasis: number | 'auto' | `${number}%` | undefined): void;\n setFlexBasisPercent(flexBasis: number | undefined): void;\n setFlexBasisAuto(): void;\n setFlexDirection(flexDirection: FlexDirection): void;\n setFlexGrow(flexGrow: number | undefined): void;\n setFlexShrink(flexShrink: number | undefined): void;\n setFlexWrap(flexWrap: Wrap): void;\n setHeight(height: number | 'auto' | `${number}%` | undefined): void;\n setIsReferenceBaseline(isReferenceBaseline: boolean): void;\n setHeightAuto(): void;\n setHeightPercent(height: number | undefined): void;\n setJustifyContent(justifyContent: Justify): void;\n setGap(gutter: Gutter, gapLength: number | `${number}%` | undefined): Value;\n setGapPercent(gutter: Gutter, gapLength: number | undefined): Value;\n setMargin(\n edge: Edge,\n margin: number | 'auto' | `${number}%` | undefined,\n ): void;\n setMarginAuto(edge: Edge): void;\n setMarginPercent(edge: Edge, margin: number | undefined): void;\n setMaxHeight(maxHeight: number | `${number}%` | undefined): void;\n setMaxHeightPercent(maxHeight: number | undefined): void;\n setMaxWidth(maxWidth: number | `${number}%` | undefined): void;\n setMaxWidthPercent(maxWidth: number | undefined): void;\n setDirtiedFunc(dirtiedFunc: DirtiedFunction | null): void;\n setMeasureFunc(measureFunc: MeasureFunction | null): void;\n setMinHeight(minHeight: number | `${number}%` | undefined): void;\n setMinHeightPercent(minHeight: number | undefined): void;\n setMinWidth(minWidth: number | `${number}%` | undefined): void;\n setMinWidthPercent(minWidth: number | undefined): void;\n setOverflow(overflow: Overflow): void;\n setPadding(edge: Edge, padding: number | `${number}%` | undefined): void;\n setPaddingPercent(edge: Edge, padding: number | undefined): void;\n setPosition(edge: Edge, position: number | `${number}%` | undefined): void;\n setPositionPercent(edge: Edge, position: number | undefined): void;\n setPositionType(positionType: PositionType): void;\n setPositionAuto(edge: Edge): void;\n setBoxSizing(boxSizing: BoxSizing): void;\n setWidth(width: number | 'auto' | `${number}%` | undefined): void;\n setWidthAuto(): void;\n setWidthPercent(width: number | undefined): void;\n unsetDirtiedFunc(): void;\n unsetMeasureFunc(): void;\n setAlwaysFormsContainingBlock(alwaysFormsContainingBlock: boolean): void;\n};\n\nexport type Yoga = {\n Config: {\n create(): Config;\n destroy(config: Config): void;\n };\n Node: {\n create(config?: Config): Node;\n createDefault(): Node;\n createWithConfig(config: Config): Node;\n destroy(node: Node): void;\n };\n} & typeof YGEnums;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default function wrapAssembly(lib: any): Yoga {\n function patch(prototype, name, fn) {\n const original = prototype[name];\n\n prototype[name] = function (...args) {\n return fn.call(this, original, ...args);\n };\n }\n\n for (const fnName of [\n 'setPosition',\n 'setMargin',\n 'setFlexBasis',\n 'setWidth',\n 'setHeight',\n 'setMinWidth',\n 'setMinHeight',\n 'setMaxWidth',\n 'setMaxHeight',\n 'setPadding',\n 'setGap',\n ]) {\n const methods = {\n [Unit.Point]: lib.Node.prototype[fnName],\n [Unit.Percent]: lib.Node.prototype[`${fnName}Percent`],\n [Unit.Auto]: lib.Node.prototype[`${fnName}Auto`],\n };\n\n patch(lib.Node.prototype, fnName, function (original, ...args) {\n // We patch all these functions to add support for the following calls:\n // .setWidth(100) / .setWidth(\"100%\") / .setWidth(.getWidth()) / .setWidth(\"auto\")\n\n const value = args.pop();\n let unit, asNumber;\n\n if (value === 'auto') {\n unit = Unit.Auto;\n asNumber = undefined;\n } else if (typeof value === 'object') {\n unit = value.unit;\n asNumber = value.valueOf();\n } else {\n unit =\n typeof value === 'string' && value.endsWith('%')\n ? Unit.Percent\n : Unit.Point;\n asNumber = parseFloat(value);\n if (\n value !== undefined &&\n !Number.isNaN(value) &&\n Number.isNaN(asNumber)\n ) {\n throw new Error(`Invalid value ${value} for ${fnName}`);\n }\n }\n\n if (!methods[unit])\n throw new Error(\n `Failed to execute \"${fnName}\": Unsupported unit '${value}'`,\n );\n\n if (asNumber !== undefined) {\n return methods[unit].call(this, ...args, asNumber);\n } else {\n return methods[unit].call(this, ...args);\n }\n });\n }\n\n function wrapMeasureFunction(measureFunction) {\n return lib.MeasureCallback.implement({\n measure: (...args) => {\n const {width, height} = measureFunction(...args);\n return {\n width: width ?? NaN,\n height: height ?? NaN,\n };\n },\n });\n }\n\n patch(lib.Node.prototype, 'setMeasureFunc', function (original, measureFunc) {\n // This patch is just a convenience patch, since it helps write more\n // idiomatic source code (such as .setMeasureFunc(null))\n if (measureFunc) {\n return original.call(this, wrapMeasureFunction(measureFunc));\n } else {\n return this.unsetMeasureFunc();\n }\n });\n\n function wrapDirtiedFunc(dirtiedFunction) {\n return lib.DirtiedCallback.implement({dirtied: dirtiedFunction});\n }\n\n patch(lib.Node.prototype, 'setDirtiedFunc', function (original, dirtiedFunc) {\n original.call(this, wrapDirtiedFunc(dirtiedFunc));\n });\n\n patch(lib.Config.prototype, 'free', function () {\n // Since we handle the memory allocation ourselves (via lib.Config.create),\n // we also need to handle the deallocation\n lib.Config.destroy(this);\n });\n\n patch(lib.Node, 'create', (_, config) => {\n // We decide the constructor we want to call depending on the parameters\n return config\n ? lib.Node.createWithConfig(config)\n : lib.Node.createDefault();\n });\n\n patch(lib.Node.prototype, 'free', function () {\n // Since we handle the memory allocation ourselves (via lib.Node.create),\n // we also need to handle the deallocation\n lib.Node.destroy(this);\n });\n\n patch(lib.Node.prototype, 'freeRecursive', function () {\n for (let t = 0, T = this.getChildCount(); t < T; ++t) {\n this.getChild(0).freeRecursive();\n }\n this.free();\n });\n\n patch(\n lib.Node.prototype,\n 'calculateLayout',\n function (original, width = NaN, height = NaN, direction = Direction.LTR) {\n // Just a small patch to add support for the function default parameters\n return original.call(this, width, height, direction);\n },\n );\n\n return {\n Config: lib.Config,\n Node: lib.Node,\n ...YGEnums,\n };\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @format\n */\n\n// @ts-ignore untyped from Emscripten\nimport loadYogaImpl from '../binaries/yoga-wasm-base64-esm.js';\nimport wrapAssembly from './wrapAssembly.ts';\n\nexport type {\n Config,\n DirtiedFunction,\n MeasureFunction,\n Node,\n Yoga,\n} from './wrapAssembly.ts';\n\nexport async function loadYoga() {\n return wrapAssembly(await loadYogaImpl());\n}\nexport * from './generated/YGEnums.ts';\n","import { loadYoga as loadYogaUntyped, type Yoga } from 'yoga-layout/load';\n\nconst loadYoga = loadYogaUntyped as (options: {\n\twasmBinary?: ArrayBuffer | ArrayBufferLike;\n\tinstantiateWasm?: (\n\t\timports: WebAssembly.Imports,\n\t\tsuccessCallback: (instance: WebAssembly.Instance) => void\n\t) => WebAssembly.Exports | false | undefined;\n}) => Promise<Yoga>;\n\nlet resolveYoga: (yoga: Yoga) => void;\nlet rejectYoga: (error: unknown) => void;\nconst yogaPromise: Promise<Yoga> = new Promise((resolve, reject) => {\n\tresolveYoga = resolve;\n\trejectYoga = reject;\n});\n\nexport type InitInput =\n\t| string\n\t| Request\n\t| URL\n\t| Response\n\t| BufferSource\n\t| Buffer\n\t| WebAssembly.Module\n\t| Promise<Response | BufferSource | Buffer | WebAssembly.Module>;\n\nasync function loadWasm(\n\tinput: InitInput,\n\timports: WebAssembly.Imports\n): Promise<WebAssembly.WebAssemblyInstantiatedSource> {\n\tlet source: Response | BufferSource | Buffer | WebAssembly.Module;\n\n\tif (\n\t\ttypeof input === 'string' ||\n\t\t(typeof Request === 'function' && input instanceof Request) ||\n\t\t(typeof URL === 'function' && input instanceof URL)\n\t) {\n\t\tsource = await fetch(input);\n\t} else {\n\t\tsource = await input;\n\t}\n\n\tif (typeof Response === 'function' && source instanceof Response) {\n\t\tif (typeof WebAssembly.instantiateStreaming === 'function') {\n\t\t\ttry {\n\t\t\t\treturn await WebAssembly.instantiateStreaming(source, imports);\n\t\t\t} catch (e) {\n\t\t\t\tif (source.headers.get('Content-Type') !== 'application/wasm') {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t'`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n',\n\t\t\t\t\t\te\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst bytes = await source.arrayBuffer();\n\t\treturn await WebAssembly.instantiate(bytes, imports);\n\t}\n\n\tconst instantiated = (await WebAssembly.instantiate(\n\t\t'buffer' in source\n\t\t\t? source.buffer.slice(\n\t\t\t\t\tsource.byteOffset,\n\t\t\t\t\tsource.byteOffset + source.byteLength\n\t\t\t )\n\t\t\t: source,\n\t\timports\n\t)) as WebAssembly.Instance | WebAssembly.WebAssemblyInstantiatedSource;\n\n\tif (instantiated instanceof WebAssembly.Instance) {\n\t\treturn { instance: instantiated, module: source as WebAssembly.Module };\n\t}\n\n\treturn instantiated;\n}\n\nexport function init(input: InitInput) {\n\tloadYoga({\n\t\tinstantiateWasm(imports, successCallback) {\n\t\t\tloadWasm(input, imports)\n\t\t\t\t.then(({ instance }) => {\n\t\t\t\t\tsuccessCallback(instance);\n\t\t\t\t})\n\t\t\t\t.catch(rejectYoga);\n\n\t\t\treturn {};\n\t\t}\n\t})\n\t\t.then(resolveYoga)\n\t\t.catch(rejectYoga);\n}\n\nexport function getYoga() {\n\treturn yogaPromise;\n}\n","import { loadYoga } from 'yoga-layout/load';\n\n// Always preload Yoga.\nconst loadingYoga = loadYoga();\nexport function getYoga() {\n\treturn loadingYoga;\n}\n","import type { ReactNode, ReactElement } from 'react';\nimport LineBreaker from 'linebreak';\n\nimport CssDimension from './vendor/parse-css-dimension/index.js';\n\nexport function isReactElement(node: ReactNode): node is ReactElement {\n\tconst type = typeof node;\n\tif (\n\t\ttype === 'number' ||\n\t\ttype === 'bigint' ||\n\t\ttype === 'string' ||\n\t\ttype === 'boolean'\n\t) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nexport function isClass(f: Function) {\n\treturn /^class\\s/.test(f.toString());\n}\n\nexport function isForwardRefComponent(type: any) {\n\treturn type && type.$$typeof === Symbol.for('react.forward_ref');\n}\n\nexport function isReactComponent(type: any) {\n\treturn typeof type === 'function' || isForwardRefComponent(type);\n}\n\nexport function hasDangerouslySetInnerHTMLProp(props: any) {\n\treturn 'dangerouslySetInnerHTML' in props;\n}\n\nexport function normalizeChildren(children: any) {\n\tconst flattend =\n\t\ttypeof children === 'undefined'\n\t\t\t? []\n\t\t\t: [].concat(children).flat(Infinity);\n\n\tconst res = [];\n\tfor (let i = 0; i < flattend.length; i++) {\n\t\tlet value = flattend[i];\n\t\tif (\n\t\t\ttypeof value === 'undefined' ||\n\t\t\ttypeof value === 'boolean' ||\n\t\t\tvalue === null\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === 'number') {\n\t\t\tvalue = String(value);\n\t\t}\n\t\tif (\n\t\t\ttypeof value === 'string' &&\n\t\t\tres.length &&\n\t\t\ttypeof res[res.length - 1] === 'string'\n\t\t) {\n\t\t\tres[res.length - 1] += value;\n\t\t} else {\n\t\t\tres.push(value);\n\t\t}\n\t}\n\treturn res;\n}\n\nexport function lengthToNumber(\n\tlength: string | number,\n\tbaseFontSize: number,\n\tbaseLength: number,\n\tinheritedStyle: Record<string, string | number>,\n\tpercentage = false\n): number | undefined {\n\tif (typeof length === 'number') return length;\n\n\t// Convert em and rem values to number (px), convert rad to deg.\n\ttry {\n\t\tlength = length.trim();\n\n\t\t// Not length: `1px/2px`, `1px 2px`, `1px, 2px`, `calc(1px)`.\n\t\tif (/[ /\\(,]/.test(length)) return;\n\n\t\t// Just a number as string: '100'\n\t\tif (length === String(+length)) return +length;\n\n\t\tconst parsed = new CssDimension(length);\n\t\tif (parsed.type === 'length') {\n\t\t\tswitch (parsed.unit) {\n\t\t\t\tcase 'em':\n\t\t\t\t\treturn parsed.value * baseFontSize;\n\t\t\t\tcase 'rem':\n\t\t\t\t\treturn parsed.value * 16;\n\t\t\t\tcase 'vw':\n\t\t\t\t\treturn ~~(\n\t\t\t\t\t\t(parsed.value *\n\t\t\t\t\t\t\t(inheritedStyle._viewportWidth as number)) /\n\t\t\t\t\t\t100\n\t\t\t\t\t);\n\t\t\t\tcase 'vh':\n\t\t\t\t\treturn ~~(\n\t\t\t\t\t\t(parsed.value *\n\t\t\t\t\t\t\t(inheritedStyle._viewportHeight as number)) /\n\t\t\t\t\t\t100\n\t\t\t\t\t);\n\t\t\t\tdefault:\n\t\t\t\t\treturn parsed.value;\n\t\t\t}\n\t\t} else if (parsed.type === 'angle') {\n\t\t\treturn calcDegree(length);\n\t\t} else if (parsed.type === 'percentage') {\n\t\t\tif (percentage) {\n\t\t\t\treturn (parsed.value / 100) * baseLength;\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Not a length unit, silently ignore.\n\t}\n}\n\nexport function calcDegree(deg: string) {\n\tconst parsed = new CssDimension(deg);\n\n\tswitch (parsed.unit) {\n\t\tcase 'deg':\n\t\t\treturn parsed.value;\n\t\tcase 'rad':\n\t\t\treturn (parsed.value * 180) / Math.PI;\n\t\tcase 'turn':\n\t\t\treturn parsed.value * 360;\n\t\tcase 'grad':\n\t\t\treturn 0.9 * parsed.value;\n\t}\n}\n\n// Multiplies two 2d transform matrices.\nexport function multiply(m1: number[], m2: number[]) {\n\treturn [\n\t\tm1[0] * m2[0] + m1[2] * m2[1],\n\t\tm1[1] * m2[0] + m1[3] * m2[1],\n\t\tm1[0] * m2[2] + m1[2] * m2[3],\n\t\tm1[1] * m2[2] + m1[3] * m2[3],\n\t\tm1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n\t\tm1[1] * m2[4] + m1[3] * m2[5] + m1[5]\n\t];\n}\n\nexport function v(\n\tfield: string | number | undefined,\n\tmap: Record<string, any>,\n\tfallback: any,\n\terrorIfNotAllowedForProperty?: string\n) {\n\tlet value = map[field];\n\tif (typeof value === 'undefined') {\n\t\tif (errorIfNotAllowedForProperty && typeof field !== 'undefined') {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid value for CSS property \"${errorIfNotAllowedForProperty}\". Allowed values: ${Object.keys(\n\t\t\t\t\tmap\n\t\t\t\t)\n\t\t\t\t\t.map(_v => `\"${_v}\"`)\n\t\t\t\t\t.join(' | ')}. Received: \"${field}\".`\n\t\t\t);\n\t\t}\n\t\tvalue = fallback;\n\t}\n\treturn value;\n}\n\nlet wordSegmenter;\nlet graphemeSegmenter;\n\n// Implementation modified from\n// https://github.com/niklasvh/html2canvas/blob/6521a487d78172f7179f7c973c1a3af40eb92009/src/css/layout/text.ts\n// https://drafts.csswg.org/css-text/#word-separator\nexport const wordSeparators = [\n\t0x0020, 0x00a0, 0x1361, 0x10100, 0x10101, 0x1039, 0x1091, 0xa\n].map(point => String.fromCodePoint(point));\n\nconst segmentCache = new Map<string, string[]>();\nconst MAX_SEGMENT_CACHE_SIZE = 500;\n\nexport function segment(\n\tcontent: string,\n\tgranularity: 'word' | 'grapheme',\n\tlocale?: string\n): string[] {\n\tconst cacheKey = `${granularity}:${locale || ''}:${content}`;\n\n\tif (segmentCache.has(cacheKey)) {\n\t\treturn segmentCache.get(cacheKey)!;\n\t}\n\tif (!wordSegmenter || !graphemeSegmenter) {\n\t\tif (!(typeof Intl !== 'undefined' && 'Segmenter' in Intl)) {\n\t\t\t// https://caniuse.com/mdn-javascript_builtins_intl_segments\n\t\t\tthrow new Error(\n\t\t\t\t'Intl.Segmenter does not exist, please use import a polyfill.'\n\t\t\t);\n\t\t}\n\n\t\twordSegmenter = new Intl.Segmenter(locale, { granularity: 'word' });\n\t\tgraphemeSegmenter = new Intl.Segmenter(locale, {\n\t\t\tgranularity: 'grapheme'\n\t\t});\n\t}\n\n\tlet result: string[];\n\n\tif (granularity === 'grapheme') {\n\t\tresult = [...graphemeSegmenter.segment(content)].map(\n\t\t\tseg => seg.segment\n\t\t);\n\t} else {\n\t\tconst segmented = [...wordSegmenter.segment(content)].map(\n\t\t\tseg => seg.segment\n\t\t) as string[];\n\n\t\tconst output = [];\n\n\t\tlet i = 0;\n\t\t// When there is a non-breaking space, join the previous and next words together.\n\t\t// This change causes them to be treated as a single segment.\n\t\twhile (i < segmented.length) {\n\t\t\tconst s = segmented[i];\n\n\t\t\tif (s == '\\u00a0') {\n\t\t\t\tconst previousWord = i === 0 ? '' : output.pop();\n\t\t\t\tconst nextWord =\n\t\t\t\t\ti === segmented.length - 1 ? '' : segmented[i + 1];\n\n\t\t\t\toutput.push(previousWord + '\\u00a0' + nextWord);\n\t\t\t\ti += 2;\n\t\t\t} else {\n\t\t\t\toutput.push(s);\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\n\t\tresult = output;\n\t}\n\n\tif (segmentCache.size >= MAX_SEGMENT_CACHE_SIZE) {\n\t\tconst firstKey = segmentCache.keys().next().value;\n\t\tsegmentCache.delete(firstKey);\n\t}\n\n\tsegmentCache.set(cacheKey, result);\n\treturn result;\n}\n\nexport function buildXMLString(\n\ttype: string,\n\tattrs: Record<string, string | number>,\n\tchildren?: string\n) {\n\tlet attrString = '';\n\n\tfor (const [k, _v] of Object.entries(attrs)) {\n\t\tif (typeof _v !== 'undefined') {\n\t\t\tattrString += ` ${k}=\"${_v}\"`;\n\t\t}\n\t}\n\n\tif (children) {\n\t\treturn `<${type}${attrString}>${children}</${type}>`;\n\t}\n\treturn `<${type}${attrString}/>`;\n}\n\nexport function createLRU<T>(max = 20) {\n\tconst store: Map<string, T> = new Map();\n\tfunction get(key: string): T | undefined {\n\t\tconst value = store.get(key);\n\t\tif (value === undefined) return undefined;\n\n\t\t// Move to end (most recently used)\n\t\tstore.delete(key);\n\t\tstore.set(key, value);\n\t\treturn value;\n\t}\n\tfunction set(key: string, value: T) {\n\t\tif (store.has(key)) {\n\t\t\tstore.delete(key);\n\t\t} else if (store.size >= max) {\n\t\t\tconst firstKey = store.keys().next().value;\n\t\t\tstore.delete(firstKey);\n\t\t}\n\n\t\tstore.set(key, value);\n\t}\n\tfunction clear() {\n\t\tstore.clear();\n\t}\n\n\treturn {\n\t\tset,\n\t\tget,\n\t\tclear\n\t};\n}\n\nexport function parseViewBox(viewBox?: string | null | undefined) {\n\treturn viewBox ? viewBox.split(/[, ]/).filter(Boolean).map(Number) : null;\n}\n\nexport function toString(x: unknown): string {\n\treturn Object.prototype.toString.call(x);\n}\n\nexport function isString(x: unknown): x is string {\n\treturn typeof x === 'string';\n}\n\nexport function isNumber(x: unknown): x is number {\n\treturn typeof x === 'number';\n}\n\nexport function isUndefined(x: unknown): x is undefined {\n\treturn typeof x === 'undefined';\n}\n\nexport function asPointPercentageLength(\n\tx: string | number,\n\tpropertyName?: string\n): number | `${number}%` | undefined {\n\tif (typeof x === 'number') {\n\t\treturn x;\n\t}\n\tif (x.endsWith('%')) {\n\t\tconst percentageValue = parseFloat(x.slice(0, -1));\n\t\tif (isNaN(percentageValue)) {\n\t\t\tconsole.warn(\n\t\t\t\t`Invalid value \"${x}\"${\n\t\t\t\t\ttypeof propertyName === 'string'\n\t\t\t\t\t\t? ` for \"${propertyName}\"`\n\t\t\t\t\t\t: ''\n\t\t\t\t}. Expected a percentage value (e.g., \"50%\").`\n\t\t\t);\n\t\t\treturn undefined;\n\t\t}\n\t\treturn `${percentageValue}%`;\n\t}\n\n\tconsole.warn(\n\t\t`Invalid value \"${x}\"${\n\t\t\ttypeof propertyName === 'string' ? ` for \"${propertyName}\"` : ''\n\t\t}. Expected a number or a percentage value (e.g., \"50%\").`\n\t);\n\treturn undefined;\n}\n\nexport function asPointAutoPercentageLength(\n\tx: string | number,\n\tpropertyName?: string\n): number | 'auto' | `${number}%` | undefined {\n\tif (typeof x === 'number') {\n\t\treturn x;\n\t}\n\tif (x === 'auto') {\n\t\treturn 'auto';\n\t}\n\tif (x.endsWith('%')) {\n\t\tconst percentageValue = parseFloat(x.slice(0, -1));\n\t\tif (isNaN(percentageValue)) {\n\t\t\tconsole.warn(\n\t\t\t\t`Invalid value \"${x}\"${\n\t\t\t\t\ttypeof propertyName === 'string'\n\t\t\t\t\t\t? ` for \"${propertyName}\"`\n\t\t\t\t\t\t: ''\n\t\t\t\t}. Expected a percentage value (e.g., \"50%\").`\n\t\t\t);\n\t\t\treturn undefined;\n\t\t}\n\t\treturn `${percentageValue}%`;\n\t}\n\n\tconsole.warn(\n\t\t`Invalid value \"${x}\"${\n\t\t\ttypeof propertyName === 'string' ? ` for \"${propertyName}\"` : ''\n\t\t}. Expected a number, \"auto\", or a percentage value (e.g., \"50%\").`\n\t);\n\treturn undefined;\n}\n\nexport function splitByBreakOpportunities(\n\tcontent: string,\n\twordBreak: string\n): {\n\twords: string[];\n\trequiredBreaks: boolean[];\n} {\n\tif (wordBreak === 'break-all') {\n\t\treturn { words: segment(content, 'grapheme'), requiredBreaks: [] };\n\t}\n\n\tif (wordBreak === 'keep-all') {\n\t\treturn { words: segment(content, 'word'), requiredBreaks: [] };\n\t}\n\n\tconst breaker = new LineBreaker(content);\n\tlet last = 0;\n\tlet bk = breaker.nextBreak();\n\tconst words = [];\n\tconst requiredBreaks = [false];\n\n\twhile (bk) {\n\t\tconst word = content.slice(last, bk.position);\n\t\twords.push(word);\n\n\t\tif (bk.required) {\n\t\t\trequiredBreaks.push(true);\n\t\t} else {\n\t\t\trequiredBreaks.push(false);\n\t\t}\n\n\t\tlast = bk.position;\n\t\tbk = breaker.nextBreak();\n\t}\n\n\treturn { words, requiredBreaks };\n}\n\nexport const midline = (s: string) => {\n\treturn s.replaceAll(\n\t\t/([A-Z])/g,\n\t\t(_, letter: string) => `-${letter.toLowerCase()}`\n\t);\n};\n\nexport function splitEffects(\n\tinput: string,\n\tseparator: string | RegExp = ','\n): string[] {\n\tconst result = [];\n\tlet l = 0;\n\tlet parenCount = 0;\n\tseparator = new RegExp(separator);\n\n\tfor (let i = 0; i < input.length; i++) {\n\t\tif (input[i] === '(') {\n\t\t\tparenCount++;\n\t\t} else if (input[i] === ')') {\n\t\t\tparenCount--;\n\t\t}\n\n\t\tif (parenCount === 0 && separator.test(input[i])) {\n\t\t\tresult.push(input.slice(l, i).trim());\n\t\t\tl = i + 1;\n\t\t}\n\t}\n\n\tresult.push(input.slice(l).trim());\n\n\treturn result;\n}\n","var e=(t,r)=>()=>(r||t((r={exports:{}}).exports,r),r.exports);var u=e((k,g)=>{g.exports=[\"em\",\"ex\",\"ch\",\"rem\",\"vh\",\"vw\",\"vmin\",\"vmax\",\"px\",\"mm\",\"cm\",\"in\",\"pt\",\"pc\",\"mozmm\"]});var a=e((z,v)=>{v.exports=[\"deg\",\"grad\",\"rad\",\"turn\"]});var c=e((L,w)=>{w.exports=[\"dpi\",\"dpcm\",\"dppx\"]});var h=e(($,y)=>{y.exports=[\"Hz\",\"kHz\"]});var m=e((j,b)=>{b.exports=[\"s\",\"ms\"]});var q=u(),f=a(),p=c(),l=h(),d=m();function s(t){if(/\\.\\D?$/.test(t))throw new Error(\"The dot should be followed by a number\");if(/^[+-]{2}/.test(t))throw new Error(\"Only one leading +/- is allowed\");if(x(t)>1)throw new Error(\"Only one dot is allowed\");if(/%$/.test(t)){this.type=\"percentage\",this.value=o(t),this.unit=\"%\";return}var r=O(t);if(!r){this.type=\"number\",this.value=o(t);return}this.type=F(r),this.value=o(t.substr(0,t.length-r.length)),this.unit=r}s.prototype.valueOf=function(){return this.value};s.prototype.toString=function(){return this.value+(this.unit||\"\")};function U(t){return new s(t)}function x(t){var r=t.match(/\\./g);return r?r.length:0}function o(t){var r=parseFloat(t);if(isNaN(r))throw new Error(\"Invalid number: \"+t);return r}var E=[].concat(f,l,q,p,d);function O(t){var r=t.match(/\\D+$/),n=r&&r[0];if(n&&E.indexOf(n)===-1)throw new Error(\"Invalid unit: \"+n);return n}var D=Object.assign(i(f,\"angle\"),i(l,\"frequency\"),i(p,\"resolution\"),i(d,\"time\"));function i(t,r){return Object.fromEntries(t.map(n=>[n,r]))}function F(t){return D[t]||\"length\"}export{U as default};\n","import { type Yoga } from 'yoga-layout/load';\nimport { type Node } from 'yoga-layout';\nimport { type InitInput } from './yoga.external.js';\n\nexport { Yoga as TYoga, Node as YogaNode, type InitInput };\n\nexport function init(input: InitInput) {\n\tif (process.env.SATORI_STANDALONE === '1') {\n\t\treturn import('./yoga.external.js').then(mod => mod.init(input));\n\t} else {\n\t\t// Do nothing. It's bundled.\n\t}\n}\n\nexport function getYoga() {\n\tif (process.env.SATORI_STANDALONE === '1') {\n\t\treturn import('./yoga.external.js').then(mod => mod.getYoga());\n\t} else {\n\t\treturn import('./yoga.bundled.js').then(mod => mod.getYoga());\n\t}\n}\n\nif (process.env.SATORI_STANDALONE !== '1') {\n\t// Preload Yoga in bundled mode.\n\timport('./yoga.bundled.js');\n}\n","/**\n * This module is used to fetch image from the given URL and resolve it as\n * base64 inlined data URI, so the toolchain can process it.\n * The image data will be cached in a LRU so we don't need to fetch it again\n * in new render processes. But to invalidate the cache the workaround is to\n * add a random query string to the URL.\n * TODO: We might want another option to disable image caching by default.\n */\n\nconst AVIF = 'image/avif';\nconst WEBP = 'image/webp';\nconst APNG = 'image/apng';\nconst PNG = 'image/png';\nconst JPEG = 'image/jpeg';\nconst GIF = 'image/gif';\nconst SVG = 'image/svg+xml';\n\nfunction parseJPEG(buf: ArrayBuffer) {\n\tconst view = new DataView(buf);\n\n\t// Skip magic bytes\n\tlet offset = 4;\n\n\tconst len = view.byteLength;\n\twhile (offset < len) {\n\t\tconst i = view.getUint16(offset, false);\n\n\t\tif (i > len) {\n\t\t\tthrow new TypeError('Invalid JPEG');\n\t\t}\n\n\t\tconst next = view.getUint8(i + 1 + offset);\n\t\tif (next === 0xc0 || next === 0xc1 || next === 0xc2) {\n\t\t\treturn [\n\t\t\t\tview.getUint16(i + 7 + offset, false),\n\t\t\t\tview.getUint16(i + 5 + offset, false)\n\t\t\t] as [number, number];\n\t\t}\n\n\t\t// TODO: Support orientations from EXIF.\n\n\t\toffset += i + 2;\n\t}\n\n\tthrow new TypeError('Invalid JPEG');\n}\n\nfunction parseGIF(buf: ArrayBuffer) {\n\tconst view = new Uint8Array(buf.slice(6, 10));\n\treturn [view[0] | (view[1] << 8), view[2] | (view[3] << 8)] as [\n\t\tnumber,\n\t\tnumber\n\t];\n}\n\nfunction parsePNG(buf: ArrayBuffer) {\n\tconst v = new DataView(buf);\n\treturn [v.getUint16(18, false), v.getUint16(22, false)] as [number, number];\n}\n\nimport { createLRU, parseViewBox } from '../utils.js';\n\ntype ResolvedImageData = [string, number?, number?] | readonly [];\nexport const cache = createLRU<ResolvedImageData>(500);\nexport const inflightRequests = new Map<string, Promise<ResolvedImageData>>();\n\nconst ALLOWED_IMAGE_TYPES = [PNG, APNG, JPEG, GIF, SVG];\n\n// Pre-compiled regex patterns for SVG parsing\nconst SVG_ATTRS_REGEX = /<svg[^>]*>/i;\nconst VIEWBOX_REGEX = /viewBox=['\"]([^'\"]+)['\"]/;\nconst WIDTH_REGEX = /width=['\"](\\d*\\.?\\d+)['\"]/;\nconst HEIGHT_REGEX = /height=['\"](\\d*\\.?\\d+)['\"]/;\n\nfunction arrayBufferToBase64(buffer) {\n\tconst bytes = new Uint8Array(buffer);\n\tconst CHUNK_SIZE = 0x8000; // 32KB chunks\n\tlet binary = '';\n\n\tfor (let i = 0; i < bytes.length; i += CHUNK_SIZE) {\n\t\tconst chunk = bytes.subarray(i, Math.min(i + CHUNK_SIZE, bytes.length));\n\t\tbinary += String.fromCharCode(...chunk);\n\t}\n\n\treturn btoa(binary);\n}\n\nfunction base64ToArrayBuffer(base64: string): ArrayBuffer {\n\tlet binaryString = atob(base64);\n\tlet len = binaryString.length;\n\tlet bytes = new Uint8Array(len);\n\tfor (let i = 0; i < len; i++) {\n\t\tbytes[i] = binaryString.charCodeAt(i);\n\t}\n\treturn bytes.buffer;\n}\n\nfunction parseSvgImageSize(src: string, data: string) {\n\t// Parse the SVG image size\n\tconst svgMatch = data.match(SVG_ATTRS_REGEX);\n\tif (!svgMatch) throw new Error(`Failed to parse SVG from ${src}`);\n\n\tconst svgTag = svgMatch[0];\n\tconst viewBoxMatch = VIEWBOX_REGEX.exec(svgTag);\n\tconst widthMatch = WIDTH_REGEX.exec(svgTag);\n\tconst heightMatch = HEIGHT_REGEX.exec(svgTag);\n\n\tlet viewBox = viewBoxMatch ? parseViewBox(viewBoxMatch[1]) : null;\n\n\tif (!viewBox && (!widthMatch || !heightMatch)) {\n\t\tthrow new Error(`Failed to parse SVG from ${src}: missing \"viewBox\"`);\n\t}\n\n\tconst size = viewBox\n\t\t? [viewBox[2], viewBox[3]]\n\t\t: [+widthMatch[1], +heightMatch[1]];\n\n\tconst ratio = size[0] / size[1];\n\tconst imageSize: [number, number] =\n\t\twidthMatch && heightMatch\n\t\t\t? [+widthMatch[1], +heightMatch[1]]\n\t\t\t: widthMatch\n\t\t\t? [+widthMatch[1], +widthMatch[1] / ratio]\n\t\t\t: heightMatch\n\t\t\t? [+heightMatch[1] * ratio, +heightMatch[1]]\n\t\t\t: [size[0], size[1]];\n\n\treturn imageSize;\n}\n\nfunction arrayBufferToDataUri(data: ArrayBuffer) {\n\tlet imageSize: [number, number];\n\n\tconst imageType = detectContentType(new Uint8Array(data));\n\n\tswitch (imageType) {\n\t\tcase PNG:\n\t\tcase APNG:\n\t\t\timageSize = parsePNG(data);\n\t\t\tbreak;\n\t\tcase GIF:\n\t\t\timageSize = parseGIF(data);\n\t\t\tbreak;\n\t\tcase JPEG:\n\t\t\timageSize = parseJPEG(data);\n\t\t\tbreak;\n\t}\n\n\tif (!ALLOWED_IMAGE_TYPES.includes(imageType)) {\n\t\tthrow new Error(`Unsupported image type: ${imageType || 'unknown'}`);\n\t}\n\treturn [\n\t\t`data:${imageType};base64,${arrayBufferToBase64(data)}`,\n\t\timageSize\n\t] as const;\n}\n\nexport async function resolveImageData(\n\tsrc: string | ArrayBuffer\n): Promise<ResolvedImageData> {\n\tif (!src) {\n\t\tthrow new Error('Image source is not provided.');\n\t}\n\n\t// ArrayBuffer\n\tif (typeof src === 'object') {\n\t\tconst [newSrc, imageSize] = arrayBufferToDataUri(src);\n\t\treturn [newSrc, ...imageSize] as ResolvedImageData;\n\t}\n\n\tif (\n\t\t(src.startsWith('\"') && src.endsWith('\"')) ||\n\t\t(src.startsWith(\"'\") && src.endsWith(\"'\"))\n\t) {\n\t\tsrc = src.slice(1, -1);\n\t}\n\n\t// Throw error if the image source is not an absolute URL in server environment\n\t// Should be after slicing quotes to avoid throwing error too early\n\tif (typeof window === 'undefined') {\n\t\tif (!src.startsWith('http') && !src.startsWith('data:')) {\n\t\t\tthrow new Error(`Image source must be an absolute URL: ${src}`);\n\t\t}\n\t}\n\n\tif (src.startsWith('data:')) {\n\t\tlet decodedURI: { imageType; encodingType; dataString };\n\n\t\ttry {\n\t\t\tdecodedURI =\n\t\t\t\t/data:(?<imageType>[a-z/+]+)(;[^;=]+=[^;=]+)*?(;(?<encodingType>[^;,]+))?,(?<dataString>.*)/g.exec(\n\t\t\t\t\tsrc\n\t\t\t\t).groups as typeof decodedURI;\n\t\t} catch (err) {\n\t\t\tconsole.warn('Image data URI resolved without size:' + src);\n\t\t\treturn [src];\n\t\t}\n\n\t\tconst { imageType, encodingType, dataString } = decodedURI;\n\t\tif (imageType === SVG) {\n\t\t\tconst utf8Src =\n\t\t\t\tencodingType === 'base64'\n\t\t\t\t\t? atob(dataString)\n\t\t\t\t\t: decodeURIComponent(dataString.replace(/ /g, '%20'));\n\t\t\tconst base64Src =\n\t\t\t\tencodingType === 'base64'\n\t\t\t\t\t? src\n\t\t\t\t\t: `data:image/svg+xml;base64,${btoa(utf8Src)}`;\n\t\t\tlet imageSize = parseSvgImageSize(src, utf8Src);\n\t\t\tcache.set(src, [base64Src, ...imageSize]);\n\t\t\treturn [base64Src, ...imageSize];\n\t\t} else if (encodingType === 'base64') {\n\t\t\tlet imageSize: [number, number];\n\t\t\tconst data = base64ToArrayBuffer(dataString);\n\t\t\tswitch (imageType) {\n\t\t\t\tcase PNG:\n\t\t\t\tcase APNG:\n\t\t\t\t\timageSize = parsePNG(data);\n\t\t\t\t\tbreak;\n\t\t\t\tcase GIF:\n\t\t\t\t\timageSize = parseGIF(data);\n\t\t\t\t\tbreak;\n\t\t\t\tcase JPEG:\n\t\t\t\t\timageSize = parseJPEG(data);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcache.set(src, [src, ...imageSize]);\n\t\t\treturn [src, ...imageSize];\n\t\t} else {\n\t\t\tconsole.warn('Image data URI resolved without size:' + src);\n\t\t\tcache.set(src, [src]);\n\t\t\treturn [src];\n\t\t}\n\t}\n\n\tif (!globalThis.fetch) {\n\t\tthrow new Error('`fetch` is required to be polyfilled to load images.');\n\t}\n\n\tif (inflightRequests.has(src)) {\n\t\treturn inflightRequests.get(src);\n\t}\n\tconst cached = cache.get(src);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tconst url = src;\n\tconst promise = fetch(url)\n\t\t.then((res): Promise<string | ArrayBuffer> => {\n\t\t\tconst type = res.headers.get('content-type');\n\n\t\t\t// Handle SVG specially\n\t\t\tif (type === 'image/svg+xml' || type === 'application/svg+xml') {\n\t\t\t\treturn res.text();\n\t\t\t}\n\n\t\t\treturn res.arrayBuffer();\n\t\t})\n\t\t.then(data => {\n\t\t\tif (typeof data === 'string') {\n\t\t\t\ttry {\n\t\t\t\t\tconst newSrc = `data:image/svg+xml;base64,${btoa(data)}`;\n\t\t\t\t\t// Parse the SVG image size\n\t\t\t\t\tconst imageSize = parseSvgImageSize(url, data);\n\t\t\t\t\treturn [newSrc, ...imageSize] as ResolvedImageData;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthrow new Error(`Failed to parse SVG image: ${e.message}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst [newSrc, imageSize] = arrayBufferToDataUri(data);\n\t\t\treturn [newSrc, ...imageSize] as ResolvedImageData;\n\t\t})\n\t\t.then(result => {\n\t\t\tcache.set(url, result);\n\t\t\treturn result;\n\t\t})\n\t\t.catch(err => {\n\t\t\tconsole.error(`Can't load image ${url}: ` + err.message);\n\t\t\tcache.set(url, []);\n\t\t\treturn [] as const;\n\t\t});\n\n\tinflightRequests.set(url, promise);\n\treturn promise;\n}\n\n/**\n * Inspects the first few bytes of a buffer to determine if\n * it matches the \"magic number\" of known file signatures.\n * https://en.wikipedia.org/wiki/List_of_file_signatures\n */\nfunction detectContentType(buffer: Uint8Array) {\n\tif ([0xff, 0xd8, 0xff].every((b, i) => buffer[i] === b)) {\n\t\treturn JPEG;\n\t}\n\tif (\n\t\t[0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a].every(\n\t\t\t(b, i) => buffer[i] === b\n\t\t)\n\t) {\n\t\tif (detectAPNG(buffer)) {\n\t\t\treturn APNG;\n\t\t}\n\t\treturn PNG;\n\t}\n\tif ([0x47, 0x49, 0x46, 0x38].every((b, i) => buffer[i] === b)) {\n\t\treturn GIF;\n\t}\n\tif (\n\t\t[0x52, 0x49, 0x46, 0x46, 0, 0, 0, 0, 0x57, 0x45, 0x42, 0x50].every(\n\t\t\t(b, i) => !b || buffer[i] === b\n\t\t)\n\t) {\n\t\treturn WEBP;\n\t}\n\tif ([0x3c, 0x3f, 0x78, 0x6d, 0x6c].every((b, i) => buffer[i] === b)) {\n\t\treturn SVG;\n\t}\n\tif (\n\t\t[0, 0, 0, 0, 0x66, 0x74, 0x79, 0x70, 0x61, 0x76, 0x69, 0x66].every(\n\t\t\t(b, i) => !b || buffer[i] === b\n\t\t)\n\t) {\n\t\treturn AVIF;\n\t}\n\treturn null;\n}\n\nfunction detectAPNG(bytes: Uint8Array) {\n\tconst dv = new DataView(bytes.buffer);\n\tlet type: string,\n\t\tlength: number,\n\t\toff = 8,\n\t\tisAPNG = false;\n\twhile (!isAPNG && type !== 'IEND' && off < bytes.length) {\n\t\tlength = dv.getUint32(off);\n\t\tconst chars = bytes.subarray(off + 4, off + 8);\n\t\ttype = String.fromCharCode(...chars);\n\t\tisAPNG = type === 'acTL';\n\t\toff += 12 + length;\n\t}\n\treturn isAPNG;\n}\n","import type { ReactElement, ReactNode } from 'react';\nimport { resolveImageData, cache } from './image.js';\nimport { isReactElement, parseViewBox, midline } from '../utils.js';\n\n// Based on\n// https://raw.githubusercontent.com/facebook/react/master/packages/react-dom/src/shared/possibleStandardNames.js\nconst ATTRIBUTE_MAPPING = {\n\taccentHeight: 'accent-height',\n\talignmentBaseline: 'alignment-baseline',\n\tarabicForm: 'arabic-form',\n\tbaselineShift: 'baseline-shift',\n\tcapHeight: 'cap-height',\n\tclipPath: 'clip-path',\n\tclipRule: 'clip-rule',\n\tcolorInterpolation: 'color-interpolation',\n\tcolorInterpolationFilters: 'color-interpolation-filters',\n\tcolorProfile: 'color-profile',\n\tcolorRendering: 'color-rendering',\n\tdominantBaseline: 'dominant-baseline',\n\tenableBackground: 'enable-background',\n\tfillOpacity: 'fill-opacity',\n\tfillRule: 'fill-rule',\n\tfloodColor: 'flood-color',\n\tfloodOpacity: 'flood-opacity',\n\tfontFamily: 'font-family',\n\tfontSize: 'font-size',\n\tfontSizeAdjust: 'font-size-adjust',\n\tfontStretch: 'font-stretch',\n\tfontStyle: 'font-style',\n\tfontVariant: 'font-variant',\n\tfontWeight: 'font-weight',\n\tglyphName: 'glyph-name',\n\tglyphOrientationHorizontal: 'glyph-orientation-horizontal',\n\tglyphOrientationVertical: 'glyph-orientation-vertical',\n\thorizAdvX: 'horiz-adv-x',\n\thorizOriginX: 'horiz-origin-x',\n\thref: 'href',\n\timageRendering: 'image-rendering',\n\tletterSpacing: 'letter-spacing',\n\tlightingColor: 'lighting-color',\n\tmarkerEnd: 'marker-end',\n\tmarkerMid: 'marker-mid',\n\tmarkerStart: 'marker-start',\n\toverlinePosition: 'overline-position',\n\toverlineThickness: 'overline-thickness',\n\tpaintOrder: 'paint-order',\n\tpanose1: 'panose-1',\n\tpointerEvents: 'pointer-events',\n\trenderingIntent: 'rendering-intent',\n\tshapeRendering: 'shape-rendering',\n\tstopColor: 'stop-color',\n\tstopOpacity: 'stop-opacity',\n\tstrikethroughPosition: 'strikethrough-position',\n\tstrikethroughThickness: 'strikethrough-thickness',\n\tstrokeDasharray: 'stroke-dasharray',\n\tstrokeDashoffset: 'stroke-dashoffset',\n\tstrokeLinecap: 'stroke-linecap',\n\tstrokeLinejoin: 'stroke-linejoin',\n\tstrokeMiterlimit: 'stroke-miterlimit',\n\tstrokeOpacity: 'stroke-opacity',\n\tstrokeWidth: 'stroke-width',\n\ttextAnchor: 'text-anchor',\n\ttextDecoration: 'text-decoration',\n\ttextRendering: 'text-rendering',\n\tunderlinePosition: 'underline-position',\n\tunderlineThickness: 'underline-thickness',\n\tunicodeBidi: 'unicode-bidi',\n\tunicodeRange: 'unicode-range',\n\tunitsPerEm: 'units-per-em',\n\tvAlphabetic: 'v-alphabetic',\n\tvHanging: 'v-hanging',\n\tvIdeographic: 'v-ideographic',\n\tvMathematical: 'v-mathematical',\n\tvectorEffect: 'vector-effect',\n\tvertAdvY: 'vert-adv-y',\n\tvertOriginX: 'vert-origin-x',\n\tvertOriginY: 'vert-origin-y',\n\twordSpacing: 'word-spacing',\n\twritingMode: 'writing-mode',\n\txHeight: 'x-height',\n\txlinkActuate: 'xlink:actuate',\n\txlinkArcrole: 'xlink:arcrole',\n\txlinkHref: 'xlink:href',\n\txlinkRole: 'xlink:role',\n\txlinkShow: 'xlink:show',\n\txlinkTitle: 'xlink:title',\n\txlinkType: 'xlink:type',\n\txmlBase: 'xml:base',\n\txmlLang: 'xml:lang',\n\txmlSpace: 'xml:space',\n\txmlnsXlink: 'xmlns:xlink'\n} as const;\n\n// From https://github.com/yoksel/url-encoder/blob/master/src/js/script.js\nconst SVGSymbols = /[\\r\\n%#()<>?[\\\\\\]^`{|}\"']/g;\n\nfunction translateSVGNodeToSVGString(\n\tnode: ReactElement | string | (ReactElement | string)[],\n\tinheritedColor: string\n): string {\n\tif (!node) return '';\n\tif (Array.isArray(node)) {\n\t\treturn node\n\t\t\t.map(n => translateSVGNodeToSVGString(n, inheritedColor))\n\t\t\t.join('');\n\t}\n\tif (typeof node !== 'object') return String(node);\n\n\tconst type = node.type;\n\tif (type === 'text') {\n\t\tthrow new Error(\n\t\t\t'<text> nodes are not currently supported, please convert them to <path>'\n\t\t);\n\t}\n\n\tconst { children, style, ...restProps } = node.props || {};\n\tconst currentColor = style?.color || inheritedColor;\n\n\tconst attrs = `${Object.entries(restProps)\n\t\t.map(([k, _v]) => {\n\t\t\tif (typeof _v === 'string' && _v.toLowerCase() === 'currentcolor') {\n\t\t\t\t_v = currentColor;\n\t\t\t}\n\n\t\t\tif ((k === 'href' || k === 'xlinkHref') && type === 'image') {\n\t\t\t\treturn ` ${ATTRIBUTE_MAPPING[k] || k}=\"${\n\t\t\t\t\tcache.get(_v as string)[0]\n\t\t\t\t}\"`;\n\t\t\t}\n\t\t\treturn ` ${ATTRIBUTE_MAPPING[k] || k}=\"${_v}\"`;\n\t\t})\n\t\t.join('')}`;\n\n\tconst styles = style\n\t\t? ` style=\"${Object.entries(style)\n\t\t\t\t.map(([k, _v]) => `${midline(k)}:${_v}`)\n\t\t\t\t.join(';')}\"`\n\t\t: '';\n\n\treturn `<${type}${attrs}${styles}>${translateSVGNodeToSVGString(\n\t\tchildren,\n\t\tcurrentColor\n\t)}</${type}>`;\n}\n/**\n * pre process node and resolve absolute link to img data for image element\n * @param node ReactNode\n * @returns\n */\nexport async function preProcessNode(node: ReactNode) {\n\tconst set = new Set<string | Buffer | ArrayBuffer>();\n\tconst walk = (_node: ReactNode) => {\n\t\tif (!_node) return;\n\t\tif (!isReactElement(_node)) return;\n\n\t\tif (Array.isArray(_node)) {\n\t\t\t_node.forEach(v => walk(v));\n\t\t\treturn;\n\t\t} else if (typeof _node === 'object') {\n\t\t\tif (_node.type === 'image') {\n\t\t\t\tconst imageSrc = _node.props.href || _node.props.xlinkHref;\n\t\t\t\tif (imageSrc) {\n\t\t\t\t\tif (set.has(imageSrc)) {\n\t\t\t\t\t\t// do nothing\n\t\t\t\t\t} else {\n\t\t\t\t\t\tset.add(imageSrc);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (_node.type === 'img') {\n\t\t\t\tif (set.has(_node.props.src)) {\n\t\t\t\t\t// do nothing\n\t\t\t\t} else {\n\t\t\t\t\tset.add(_node.props.src);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// do nothing\n\t\t\t}\n\t\t}\n\n\t\tArray.isArray(_node.props.children)\n\t\t\t? _node.props.children.map(c => walk(c))\n\t\t\t: walk(_node.props.children);\n\t};\n\n\twalk(node);\n\n\treturn Promise.all(Array.from(set).map(s => resolveImageData(s)));\n}\n\nexport async function SVGNodeToImage(\n\tnode: ReactElement,\n\tinheritedColor: string\n): Promise<string> {\n\tlet {\n\t\tviewBox,\n\t\tviewbox,\n\t\twidth,\n\t\theight,\n\t\tclassName,\n\t\tstyle,\n\t\tchildren,\n\t\t...restProps\n\t} = node.props || {};\n\n\tviewBox ||= viewbox;\n\n\t// We directly assign the xmlns attribute here to deduplicate.\n\trestProps.xmlns = 'http://www.w3.org/2000/svg';\n\n\tconst currentColor = style?.color || inheritedColor;\n\tconst viewBoxSize = parseViewBox(viewBox);\n\n\t// ratio = height / width\n\tconst ratio = viewBoxSize ? viewBoxSize[3] / viewBoxSize[2] : null;\n\twidth = width || (ratio && height) ? height / ratio : null;\n\theight = height || (ratio && width) ? width * ratio : null;\n\n\trestProps.width = width;\n\trestProps.height = height;\n\tif (viewBox) restProps.viewBox = viewBox;\n\n\treturn `data:image/svg+xml;utf8,${`<svg ${Object.entries(restProps)\n\t\t.map(([k, _v]) => {\n\t\t\tif (typeof _v === 'string' && _v.toLowerCase() === 'currentcolor') {\n\t\t\t\t_v = currentColor;\n\t\t\t}\n\t\t\treturn ` ${ATTRIBUTE_MAPPING[k] || k}=\"${_v}\"`;\n\t\t})\n\t\t.join('')}>${translateSVGNodeToSVGString(\n\t\tchildren,\n\t\tcurrentColor\n\t)}</svg>`.replace(SVGSymbols, encodeURIComponent)}`;\n}\n","/**\n * Pre-defined styles for elements. Here we hand pick some from Chromium's\n * default styles:\n * https://chromium.googlesource.com/chromium/blink/+/master/Source/core/css/html.css\n *\n * We try to only include commonly used, styling elements rather than semantic elements.\n */\n\nconst DEFAULT_DISPLAY = 'flex';\n\nexport default {\n\t// Generic block-level elements\n\tp: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tmarginTop: '1em',\n\t\tmarginBottom: '1em'\n\t},\n\tdiv: {\n\t\tdisplay: DEFAULT_DISPLAY\n\t},\n\tblockquote: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tmarginTop: '1em',\n\t\tmarginBottom: '1em',\n\t\tmarginLeft: 40,\n\t\tmarginRight: 40\n\t},\n\tcenter: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\ttextAlign: 'center'\n\t},\n\thr: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tmarginTop: '0.5em',\n\t\tmarginBottom: '0.5em',\n\t\tmarginLeft: 'auto',\n\t\tmarginRight: 'auto',\n\t\tborderWidth: 1,\n\t\t// We don't have `inset`\n\t\tborderStyle: 'solid'\n\t},\n\t// Heading elements\n\th1: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tfontSize: '2em',\n\t\tmarginTop: '0.67em',\n\t\tmarginBottom: '0.67em',\n\t\tmarginLeft: 0,\n\t\tmarginRight: 0,\n\t\tfontWeight: 'bold'\n\t},\n\th2: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tfontSize: '1.5em',\n\t\tmarginTop: '0.83em',\n\t\tmarginBottom: '0.83em',\n\t\tmarginLeft: 0,\n\t\tmarginRight: 0,\n\t\tfontWeight: 'bold'\n\t},\n\th3: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tfontSize: '1.17em',\n\t\tmarginTop: '1em',\n\t\tmarginBottom: '1em',\n\t\tmarginLeft: 0,\n\t\tmarginRight: 0,\n\t\tfontWeight: 'bold'\n\t},\n\th4: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tmarginTop: '1.33em',\n\t\tmarginBottom: '1.33em',\n\t\tmarginLeft: 0,\n\t\tmarginRight: 0,\n\t\tfontWeight: 'bold'\n\t},\n\th5: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tfontSize: '0.83em',\n\t\tmarginTop: '1.67em',\n\t\tmarginBottom: '1.67em',\n\t\tmarginLeft: 0,\n\t\tmarginRight: 0,\n\t\tfontWeight: 'bold'\n\t},\n\th6: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tfontSize: '0.67em',\n\t\tmarginTop: '2.33em',\n\t\tmarginBottom: '2.33em',\n\t\tmarginLeft: 0,\n\t\tmarginRight: 0,\n\t\tfontWeight: 'bold'\n\t},\n\t// Tables\n\t// Lists\n\t// Form elements\n\t// Inline elements\n\tu: {\n\t\ttextDecoration: 'underline'\n\t},\n\tstrong: {\n\t\tfontWeight: 'bold'\n\t},\n\tb: {\n\t\tfontWeight: 'bold'\n\t},\n\ti: {\n\t\tfontStyle: 'italic'\n\t},\n\tem: {\n\t\tfontStyle: 'italic'\n\t},\n\tcode: {\n\t\tfontFamily: 'monospace'\n\t},\n\tkbd: {\n\t\tfontFamily: 'monospace'\n\t},\n\tpre: {\n\t\tdisplay: DEFAULT_DISPLAY,\n\t\tfontFamily: 'monospace',\n\t\twhiteSpace: 'pre',\n\t\tmarginTop: '1em',\n\t\tmarginBottom: '1em'\n\t},\n\tmark: {\n\t\tbackgroundColor: 'yellow',\n\t\tcolor: 'black'\n\t},\n\tbig: {\n\t\tfontSize: 'larger'\n\t},\n\tsmall: {\n\t\tfontSize: 'smaller'\n\t},\n\ts: {\n\t\ttextDecoration: 'line-through'\n\t}\n};\n","import { SerializedStyle } from './expand.js';\n\nconst list = new Set([\n\t'color',\n\t'font',\n\t'fontFamily',\n\t'fontSize',\n\t'fontStyle',\n\t'fontWeight',\n\t'letterSpacing',\n\t'lineHeight',\n\t'textAlign',\n\t'textIndent',\n\t'textTransform',\n\t'textShadowOffset',\n\t'textShadowColor',\n\t'textShadowRadius',\n\t'WebkitTextStrokeWidth',\n\t'WebkitTextStrokeColor',\n\t'textDecorationLine',\n\t'textDecorationStyle',\n\t'textDecorationColor',\n\t'textDecorationSkipInk',\n\t'whiteSpace',\n\t'transform',\n\t'wordBreak',\n\t'tabSize',\n\n\t// Special case: SVG doesn't apply these to children elements so we need to\n\t// make it inheritable here.\n\t'opacity',\n\t'filter',\n\n\t// Special properties of Satori:\n\t'_viewportWidth',\n\t'_viewportHeight',\n\t'_inheritedClipPathId',\n\t'_inheritedMaskId',\n\t'_inheritedBackgroundClipTextPath',\n\t'_inheritedBackgroundClipTextHasBackground'\n]);\n\nexport default function inheritable(style: SerializedStyle): SerializedStyle {\n\tconst inheritedStyle: SerializedStyle = {};\n\tfor (const prop in style) {\n\t\t// CSS custom properties (--*) always inherit\n\t\tif (list.has(prop) || prop.startsWith('--')) {\n\t\t\tinheritedStyle[prop] = style[prop];\n\t\t}\n\t}\n\treturn inheritedStyle;\n}\n","/**\n * This module expands the CSS properties to get rid of shorthands, as well as\n * cleaning up some properties.\n */\n\nimport { getPropertyName, getStylesForProperty } from 'css-to-react-native';\nimport { parseElementStyle } from 'css-background-parser';\nimport { parse as parseBoxShadow } from 'css-box-shadow';\nimport cssColorParse from 'parse-css-color';\n\nimport CssDimension from '../vendor/parse-css-dimension/index.js';\nimport parseTransformOrigin, {\n\tParsedTransformOrigin\n} from '../transform-origin.js';\nimport { isString, lengthToNumber, v, splitEffects } from '../utils.js';\nimport { MaskProperty, parseMask } from '../parser/mask.js';\nimport { FontWeight, FontStyle } from '../font.js';\nimport {\n\textractCustomProperties,\n\tmergeVariables,\n\tresolveVariables,\n\tCSSVariables\n} from './variables.js';\n\n// https://react-cn.github.io/react/tips/style-props-value-px.html\nconst optOutPx = new Set([\n\t'flex',\n\t'flexGrow',\n\t'flexShrink',\n\t'flexBasis',\n\t'fontWeight',\n\t'lineHeight',\n\t'opacity',\n\t'scale',\n\t'scaleX',\n\t'scaleY'\n]);\nconst keepNumber = new Set(['lineHeight']);\n\nfunction handleFallbackColor(\n\tprop: string,\n\tparsed: Record<string, string>,\n\trawInput: string,\n\tcurrentColor: string\n) {\n\tif (\n\t\tprop === 'textDecoration' &&\n\t\t!rawInput.includes(parsed.textDecorationColor)\n\t) {\n\t\tparsed.textDecorationColor = currentColor;\n\t}\n\treturn parsed;\n}\n\nfunction purify(name: string, value?: string | number) {\n\tconst num = Number(value);\n\tif (isNaN(num)) return value;\n\tif (!optOutPx.has(name)) return num + 'px';\n\tif (keepNumber.has(name)) return num;\n\treturn String(value);\n}\n\nfunction handleSpecialCase(\n\tname: string,\n\tvalue: string | number,\n\tcurrentColor: string\n) {\n\tif (name === 'zIndex') {\n\t\tconsole.warn('`z-index` is currently not supported.');\n\t\treturn { [name]: value };\n\t}\n\n\tif (name === 'lineHeight') {\n\t\treturn { lineHeight: purify(name, value) };\n\t}\n\n\tif (name === 'fontFamily') {\n\t\treturn {\n\t\t\tfontFamily: (value as string).split(',').map(_v => {\n\t\t\t\treturn _v\n\t\t\t\t\t.trim()\n\t\t\t\t\t.replace(/(^['\"])|(['\"]$)/g, '')\n\t\t\t\t\t.toLocaleLowerCase();\n\t\t\t})\n\t\t};\n\t}\n\n\tif (name === 'borderRadius') {\n\t\tif (typeof value !== 'string' || !value.includes('/')) {\n\t\t\t// Regular border radius\n\t\t\treturn;\n\t\t}\n\t\t// Support the `border-radius: 10px / 20px` syntax.\n\t\tconst [horizontal, vertical] = value.split('/');\n\t\tconst vh = getStylesForProperty(name, horizontal, true);\n\t\tconst vv = getStylesForProperty(name, vertical, true);\n\t\tfor (const k in vh) {\n\t\t\tvv[k] = purify(name, vh[k]) + ' ' + purify(name, vv[k]);\n\t\t}\n\t\treturn vv;\n\t}\n\n\tif (/^border(Top|Right|Bottom|Left)?$/.test(name)) {\n\t\tconst resolved = getStylesForProperty('border', value, true);\n\n\t\t// Border width should be default to 3px (medium) instead of 1px:\n\t\t// https://w3c.github.io/csswg-drafts/css-backgrounds-3/#border-width\n\t\t// Although on Chrome it will be displayed as 1.5px but let's stick to the\n\t\t// spec.\n\t\tif (resolved.borderWidth === 1 && !String(value).includes('1px')) {\n\t\t\tresolved.borderWidth = 3;\n\t\t}\n\n\t\t// A trick to fix `border: 1px solid` to not use `black` but the inherited\n\t\t// `color` value. This is necessary because css-to-react-native automatically\n\t\t// fallbacks to default color values.\n\t\tif (\n\t\t\tresolved.borderColor === 'black' &&\n\t\t\t!String(value).includes('black')\n\t\t) {\n\t\t\tresolved.borderColor = currentColor;\n\t\t}\n\n\t\tconst purified = {\n\t\t\tWidth: purify(name + 'Width', resolved.borderWidth),\n\t\t\tStyle: v(\n\t\t\t\tresolved.borderStyle,\n\t\t\t\t{\n\t\t\t\t\tsolid: 'solid',\n\t\t\t\t\tdashed: 'dashed'\n\t\t\t\t},\n\t\t\t\t'solid',\n\t\t\t\tname + 'Style'\n\t\t\t),\n\t\t\tColor: resolved.borderColor\n\t\t};\n\n\t\tconst full = {};\n\t\tfor (const k of name === 'border'\n\t\t\t? ['Top', 'Right', 'Bottom', 'Left']\n\t\t\t: [name.slice(6)]) {\n\t\t\tfor (const p in purified) {\n\t\t\t\tfull['border' + k + p] = purified[p];\n\t\t\t}\n\t\t}\n\t\treturn full;\n\t}\n\n\tif (name === 'boxShadow') {\n\t\tif (!value) {\n\t\t\tthrow new Error('Invalid `boxShadow` value: \"' + value + '\".');\n\t\t}\n\t\treturn {\n\t\t\t[name]: typeof value === 'string' ? parseBoxShadow(value) : value\n\t\t};\n\t}\n\n\tif (name === 'transform') {\n\t\tif (typeof value !== 'string')\n\t\t\tthrow new Error('Invalid `transform` value.');\n\t\t// To support percentages in transform (which is not supported in RN), we\n\t\t// replace them with random symbols and then replace them back after parsing.\n\t\tconst symbols = {};\n\t\tconst replaced = value.replace(/(-?[\\d.]+%)/g, (_, _v) => {\n\t\t\tconst symbol = ~~(Math.random() * 1e9);\n\t\t\tsymbols[symbol] = _v;\n\t\t\treturn symbol + 'px';\n\t\t});\n\t\tconst parsed = getStylesForProperty('transform', replaced, true);\n\t\tfor (const t of parsed.transform) {\n\t\t\tfor (const k in t) {\n\t\t\t\tif (symbols[t[k]]) {\n\t\t\t\t\tt[k] = symbols[t[k]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn parsed;\n\t}\n\n\tif (name === 'background') {\n\t\tvalue = value.toString().trim();\n\t\tif (\n\t\t\t/^(linear-gradient|radial-gradient|url|repeating-linear-gradient|repeating-radial-gradient)\\(/.test(\n\t\t\t\tvalue\n\t\t\t)\n\t\t) {\n\t\t\treturn getStylesForProperty('backgroundImage', value, true);\n\t\t}\n\t\treturn getStylesForProperty('background', value, true);\n\t}\n\n\tif (name === 'textShadow') {\n\t\t// Handle multiple text shadows if provided.\n\t\tvalue = value.toString().trim();\n\t\tconst result = {};\n\n\t\tconst shadows = splitEffects(value);\n\n\t\tfor (const shadow of shadows) {\n\t\t\tconst styles = getStylesForProperty('textShadow', shadow, true);\n\t\t\tfor (const k in styles) {\n\t\t\t\tif (!result[k]) {\n\t\t\t\t\tresult[k] = [styles[k]];\n\t\t\t\t} else {\n\t\t\t\t\tresult[k].push(styles[k]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tif (name === 'WebkitTextStroke') {\n\t\tvalue = value.toString().trim();\n\t\tconst values = value.split(' ');\n\t\tif (values.length !== 2) {\n\t\t\tthrow new Error('Invalid `WebkitTextStroke` value.');\n\t\t}\n\n\t\treturn {\n\t\t\tWebkitTextStrokeWidth: purify(name, values[0]),\n\t\t\tWebkitTextStrokeColor: purify(name, values[1])\n\t\t};\n\t}\n\n\tif (name === 'backdropFilter' || name === 'WebkitBackdropFilter') {\n\t\treturn { backdropFilter: value };\n\t}\n\n\tif (name === 'textDecorationSkipInk') {\n\t\tconst normalized = value.toString().trim().toLowerCase();\n\t\tif (!['auto', 'none', 'all'].includes(normalized)) {\n\t\t\tthrow new Error('Invalid `textDecorationSkipInk` value.');\n\t\t}\n\n\t\treturn { textDecorationSkipInk: normalized };\n\t}\n\n\treturn;\n}\n\nfunction getErrorHint(name: string) {\n\tif (name === 'transform') {\n\t\treturn ' Only absolute lengths such as `10px` are supported.';\n\t}\n\treturn '';\n}\n\nconst RGB_SLASH = /rgb\\((\\d+)\\s+(\\d+)\\s+(\\d+)\\s*\\/\\s*([\\.\\d]+)\\)/;\nfunction normalizeColor(value: string | object) {\n\tif (typeof value === 'string') {\n\t\tif (RGB_SLASH.test(value.trim())) {\n\t\t\t// rgb(255 122 127 / .2) -> rgba(255, 122, 127, .2)\n\t\t\treturn value.trim().replace(RGB_SLASH, (_, r, g, b, a) => {\n\t\t\t\treturn `rgba(${r}, ${g}, ${b}, ${a})`;\n\t\t\t});\n\t\t}\n\t}\n\n\t// Recursively normalize colors in arrays and objects.\n\tif (typeof value === 'object' && value !== null) {\n\t\tfor (const k in value) {\n\t\t\tvalue[k] = normalizeColor(value[k]);\n\t\t}\n\t\treturn value;\n\t}\n\n\treturn value;\n}\n\ntype MainStyle = {\n\tcolor: string;\n\tfontSize: number;\n\ttransformOrigin: ParsedTransformOrigin;\n\tmaskImage: MaskProperty[];\n\topacity: number;\n\ttextTransform: string;\n\twhiteSpace: string;\n\twordBreak: string;\n\ttextAlign: string;\n\ttextIndent: number | string;\n\tlineHeight: number | string;\n\tletterSpacing: number;\n\n\tfontFamily: string | string[];\n\tfontWeight: FontWeight;\n\tfontStyle: FontStyle;\n\n\tborderTopWidth: number;\n\tborderLeftWidth: number;\n\tborderRightWidth: number;\n\tborderBottomWidth: number;\n\n\tpaddingTop: number;\n\tpaddingLeft: number;\n\tpaddingRight: number;\n\tpaddingBottom: number;\n\n\tflexGrow: number;\n\tflexShrink: number;\n\n\tgap: number;\n\trowGap: number;\n\tcolumnGap: number;\n\n\ttextShadowOffset: {\n\t\twidth: number;\n\t\theight: number;\n\t}[];\n\ttextShadowColor: string[];\n\ttextShadowRadius: number[];\n\tWebkitTextStrokeWidth: number;\n\tWebkitTextStrokeColor: string;\n\ttextDecorationSkipInk: 'auto' | 'none' | 'all';\n};\n\ntype OtherStyle = Exclude<\n\tRecord<PropertyKey, string | number>,\n\tkeyof MainStyle\n>;\n\nexport type SerializedStyle = Partial<MainStyle & OtherStyle>;\n\nexport default function expand(\n\tstyle: Record<string, string | number> | undefined,\n\tinheritedStyle: SerializedStyle\n): SerializedStyle {\n\tconst serializedStyle: SerializedStyle = {};\n\n\t// Extract inherited CSS variables\n\tconst inheritedVariables: CSSVariables = {};\n\tfor (const prop in inheritedStyle) {\n\t\tif (prop.startsWith('--')) {\n\t\t\tinheritedVariables[prop] = String(inheritedStyle[prop]);\n\t\t}\n\t}\n\n\t// Extract and resolve CSS variables from current style\n\tlet currentVariables: CSSVariables = {};\n\tlet processableStyle = style;\n\n\tif (style) {\n\t\tconst { variables, remainingStyle } = extractCustomProperties(style);\n\t\tcurrentVariables = variables;\n\t\tprocessableStyle = remainingStyle;\n\t}\n\n\t// Merge variables (current overrides inherited)\n\tconst mergedVariables = mergeVariables(\n\t\tinheritedVariables,\n\t\tcurrentVariables\n\t);\n\n\t// Store merged variables in the serialized style for inheritance\n\tfor (const varName in mergedVariables) {\n\t\tserializedStyle[varName] = mergedVariables[varName];\n\t}\n\n\tif (processableStyle) {\n\t\t// Resolve CSS variables in color property before processing\n\t\tconst resolvedColor = processableStyle.color\n\t\t\t? resolveVariables(processableStyle.color, mergedVariables)\n\t\t\t: undefined;\n\n\t\tconst currentColor = getCurrentColor(\n\t\t\tresolvedColor as string,\n\t\t\tinheritedStyle.color\n\t\t);\n\n\t\tserializedStyle.color = currentColor;\n\n\t\tfor (const prop in processableStyle) {\n\t\t\t// Internal properties.\n\t\t\tif (prop.startsWith('_')) {\n\t\t\t\tserializedStyle[prop] = processableStyle[prop];\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (prop === 'color') {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst name = getPropertyName(prop);\n\t\t\t// Resolve CSS variables before preprocessing\n\t\t\tconst resolvedValue = resolveVariables(\n\t\t\t\tprocessableStyle[prop],\n\t\t\t\tmergedVariables\n\t\t\t);\n\t\t\tconst value = preprocess(resolvedValue, currentColor);\n\n\t\t\ttry {\n\t\t\t\tconst resolvedStyle =\n\t\t\t\t\thandleSpecialCase(name, value, currentColor) ||\n\t\t\t\t\thandleFallbackColor(\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tgetStylesForProperty(name, purify(name, value), true),\n\t\t\t\t\t\tvalue as string,\n\t\t\t\t\t\tcurrentColor\n\t\t\t\t\t);\n\n\t\t\t\tObject.assign(serializedStyle, resolvedStyle);\n\t\t\t} catch (err) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\terr.message +\n\t\t\t\t\t\t// Attach the extra information of the rule itself if it's not included in\n\t\t\t\t\t\t// the error message.\n\t\t\t\t\t\t(err.message.includes(value)\n\t\t\t\t\t\t\t? '\\n ' + getErrorHint(name)\n\t\t\t\t\t\t\t: `\\n in CSS rule \\`${name}: ${value}\\`.${getErrorHint(\n\t\t\t\t\t\t\t\t\tname\n\t\t\t\t\t\t\t )}`)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Parse background images.\n\tif (serializedStyle.backgroundImage) {\n\t\tconst { backgrounds } = parseElementStyle(serializedStyle);\n\t\tserializedStyle.backgroundImage = backgrounds;\n\t}\n\n\tif (serializedStyle.maskImage || serializedStyle['WebkitMaskImage']) {\n\t\tserializedStyle.maskImage = parseMask(serializedStyle);\n\t}\n\n\t// Calculate the base font size.\n\tconst baseFontSize = calcBaseFontSize(\n\t\tserializedStyle.fontSize,\n\t\tinheritedStyle.fontSize\n\t);\n\tif (typeof serializedStyle.fontSize !== 'undefined') {\n\t\tserializedStyle.fontSize = baseFontSize;\n\t}\n\n\tif (serializedStyle.transformOrigin) {\n\t\tserializedStyle.transformOrigin = parseTransformOrigin(\n\t\t\tserializedStyle.transformOrigin as any,\n\t\t\tbaseFontSize\n\t\t);\n\t}\n\n\tfor (const prop in serializedStyle) {\n\t\tlet value = serializedStyle[prop];\n\n\t\t// Line height needs to be relative.\n\t\tif (prop === 'lineHeight') {\n\t\t\tif (typeof value === 'string' && value !== 'normal') {\n\t\t\t\tvalue = serializedStyle[prop] =\n\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\tinheritedStyle,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) / baseFontSize;\n\t\t\t}\n\t\t} else {\n\t\t\t// Convert em and rem values to px (number).\n\t\t\tif (typeof value === 'string') {\n\t\t\t\tconst len = lengthToNumber(\n\t\t\t\t\tvalue,\n\t\t\t\t\tbaseFontSize,\n\t\t\t\t\tbaseFontSize,\n\t\t\t\t\tinheritedStyle\n\t\t\t\t);\n\t\t\t\tif (typeof len !== 'undefined') serializedStyle[prop] = len;\n\t\t\t\tvalue = serializedStyle[prop];\n\t\t\t}\n\n\t\t\tif (typeof value === 'string' || typeof value === 'object') {\n\t\t\t\tconst color = normalizeColor(value);\n\t\t\t\tif (color) {\n\t\t\t\t\tserializedStyle[prop] = color as any;\n\t\t\t\t}\n\t\t\t\tvalue = serializedStyle[prop];\n\t\t\t}\n\t\t}\n\n\t\t// Inherit the opacity.\n\t\tif (prop === 'opacity' && typeof value === 'number') {\n\t\t\tserializedStyle.opacity = value * inheritedStyle.opacity;\n\t\t}\n\n\t\tif (prop === 'transform') {\n\t\t\tconst transforms = value as any as {\n\t\t\t\t[type: string]: number | string;\n\t\t\t}[];\n\n\t\t\tfor (const transform of transforms) {\n\t\t\t\tconst type = Object.keys(transform)[0];\n\t\t\t\tconst _v = transform[type];\n\n\t\t\t\t// Convert em, rem, vw, vh values to px (number), but keep % values.\n\t\t\t\tconst len =\n\t\t\t\t\ttypeof _v === 'string'\n\t\t\t\t\t\t? lengthToNumber(\n\t\t\t\t\t\t\t\t_v,\n\t\t\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\t\t\tinheritedStyle\n\t\t\t\t\t\t ) ?? _v\n\t\t\t\t\t\t: _v;\n\t\t\t\ttransform[type] = len;\n\t\t\t}\n\t\t}\n\n\t\tif (prop === 'textShadowRadius') {\n\t\t\tconst textShadowRadius = value as unknown as Array<number | string>;\n\n\t\t\tserializedStyle.textShadowRadius = textShadowRadius.map(_v =>\n\t\t\t\tlengthToNumber(_v, baseFontSize, 0, inheritedStyle, false)\n\t\t\t);\n\t\t}\n\n\t\tif (prop === 'textShadowOffset') {\n\t\t\tconst textShadowOffset = value as unknown as Array<{\n\t\t\t\twidth: number | string;\n\t\t\t\theight: number | string;\n\t\t\t}>;\n\n\t\t\tserializedStyle.textShadowOffset = textShadowOffset.map(\n\t\t\t\t({ height, width }) => ({\n\t\t\t\t\theight: lengthToNumber(\n\t\t\t\t\t\theight,\n\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tinheritedStyle,\n\t\t\t\t\t\tfalse\n\t\t\t\t\t),\n\t\t\t\t\twidth: lengthToNumber(\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tinheritedStyle,\n\t\t\t\t\t\tfalse\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t}\n\n\treturn serializedStyle;\n}\n\nfunction calcBaseFontSize(\n\tsize: number | string,\n\tinheritedSize: number\n): number {\n\tif (typeof size === 'number') return size;\n\n\ttry {\n\t\tconst parsed = new CssDimension(size);\n\t\tswitch (parsed.unit) {\n\t\t\tcase 'em':\n\t\t\t\treturn parsed.value * inheritedSize;\n\t\t\tcase 'rem':\n\t\t\t\treturn parsed.value * 16;\n\t\t}\n\t} catch (err) {\n\t\treturn inheritedSize;\n\t}\n}\n\n/**\n * @see https://github.com/RazrFalcon/resvg/issues/579\n */\nfunction refineHSL(color: string) {\n\tif (color.startsWith('hsl')) {\n\t\tconst t = cssColorParse(color);\n\t\tconst [h, s, l] = t.values;\n\n\t\treturn `hsl(${[h, `${s}%`, `${l}%`]\n\t\t\t.concat(t.alpha === 1 ? [] : [t.alpha])\n\t\t\t.join(',')})`;\n\t}\n\n\treturn color;\n}\n\nfunction getCurrentColor(\n\tcolor: string | undefined,\n\tinheritedColor: string\n): string {\n\tif (color && color.toLowerCase() !== 'currentcolor') {\n\t\treturn refineHSL(color);\n\t}\n\n\treturn refineHSL(inheritedColor);\n}\n\nfunction convertCurrentColorToActualValue(\n\tvalue: string,\n\tcurrentColor: string\n): string {\n\treturn value.replace(/currentcolor/gi, currentColor);\n}\n\nfunction preprocess(\n\tvalue: string | number,\n\tcurrentColor: string\n): string | number {\n\tif (isString(value)) {\n\t\tvalue = convertCurrentColorToActualValue(value, currentColor);\n\t}\n\n\treturn value;\n}\n","import valueParser from 'postcss-value-parser';\n\nimport CssDimension from './vendor/parse-css-dimension/index.js';\n\n/**\n * If key for each direction is missing, assume default (50%)\n */\nexport interface ParsedTransformOrigin {\n\t/** Relative horizontal transform origin in % */\n\txRelative?: number;\n\t/** Relative vertical transform origin in % */\n\tyRelative?: number;\n\t/** Absolute horizontal transform origin in pixels */\n\txAbsolute?: number;\n\t/** Absolute horizontal transform origin in pixels */\n\tyAbsolute?: number;\n}\n\ninterface ParsedUnit {\n\t/** Relative unit in % */\n\trelative?: number;\n\t/** Absolute unit in pixels */\n\tabsolute?: number;\n}\n\nfunction parseUnit(word: string, baseFontSize: number): ParsedUnit {\n\ttry {\n\t\tconst parsed = new CssDimension(word);\n\t\tswitch (parsed.unit) {\n\t\t\tcase 'px':\n\t\t\t\treturn { absolute: parsed.value };\n\t\t\tcase 'em':\n\t\t\t\treturn { absolute: parsed.value * baseFontSize };\n\t\t\tcase 'rem':\n\t\t\t\treturn { absolute: parsed.value * 16 };\n\t\t\tcase '%':\n\t\t\t\treturn { relative: parsed.value };\n\t\t\tdefault:\n\t\t\t\treturn {};\n\t\t}\n\t} catch (e) {\n\t\treturn {};\n\t}\n}\n\nfunction handleWord(\n\tword: string,\n\tbaseFontSize: number,\n\tunitIsHorizontal: boolean\n) {\n\tswitch (word) {\n\t\tcase 'top':\n\t\t\treturn { yRelative: 0 };\n\t\tcase 'left':\n\t\t\treturn { xRelative: 0 };\n\t\tcase 'right':\n\t\t\treturn { xRelative: 100 };\n\t\tcase 'bottom':\n\t\t\treturn { yRelative: 100 };\n\t\tcase 'center':\n\t\t\treturn {};\n\t\tdefault: {\n\t\t\tconst parsedUnit = parseUnit(word, baseFontSize);\n\t\t\treturn parsedUnit.absolute\n\t\t\t\t? {\n\t\t\t\t\t\t[unitIsHorizontal ? 'xAbsolute' : 'yAbsolute']:\n\t\t\t\t\t\t\tparsedUnit.absolute\n\t\t\t\t }\n\t\t\t\t: parsedUnit.relative\n\t\t\t\t? {\n\t\t\t\t\t\t[unitIsHorizontal ? 'xRelative' : 'yRelative']:\n\t\t\t\t\t\t\tparsedUnit.relative\n\t\t\t\t }\n\t\t\t\t: {};\n\t\t}\n\t}\n}\n\nexport default function parseTransformOrigin(\n\tvalue: string | number,\n\tbaseFontSize: number\n): ParsedTransformOrigin {\n\t// If it's a single value and a number, then it's horizontal\n\tif (typeof value === 'number') {\n\t\treturn { xAbsolute: value };\n\t}\n\tlet words: string[];\n\ttry {\n\t\twords = valueParser(value)\n\t\t\t.nodes.filter(node => node.type === 'word')\n\t\t\t.map(node => node.value);\n\t} catch (e) {\n\t\treturn {};\n\t}\n\n\tif (words.length === 1) {\n\t\t// If it's a single value and a number, then it's horizontal, so\n\t\t// pass `true` to `unitIsHorizontal`\n\t\treturn handleWord(words[0], baseFontSize, true);\n\t} else if (words.length === 2) {\n\t\t// Make words to be [horizontal, vertical]\n\t\tif (\n\t\t\twords[0] === 'top' ||\n\t\t\twords[0] === 'bottom' ||\n\t\t\twords[1] === 'left' ||\n\t\t\twords[1] === 'right'\n\t\t) {\n\t\t\twords.reverse();\n\t\t}\n\n\t\treturn {\n\t\t\t...handleWord(words[0], baseFontSize, true),\n\t\t\t...handleWord(words[1], baseFontSize, false)\n\t\t};\n\t} else {\n\t\treturn {};\n\t}\n}\n","import { getPropertyName } from 'css-to-react-native';\nimport { splitEffects } from '../utils.js';\n\nfunction getMaskProperty(style: Record<string, string | number>, name: string) {\n\tconst key = getPropertyName(`mask-${name}`);\n\treturn (style[key] || style[`WebkitM${key.substring(1)}`]) as string;\n}\n\nexport interface MaskProperty {\n\timage: string;\n\tposition: string;\n\tsize: string;\n\trepeat: string;\n\torigin: string;\n\tclip: string;\n}\n\nexport function parseMask(\n\tstyle: Record<string, string | number>\n): MaskProperty[] {\n\tconst maskImage = (style.maskImage || style.WebkitMaskImage) as string;\n\n\tconst common = {\n\t\tposition: getMaskProperty(style, 'position') || '0% 0%',\n\t\tsize: getMaskProperty(style, 'size') || '100% 100%',\n\t\trepeat: getMaskProperty(style, 'repeat') || 'repeat',\n\t\torigin: getMaskProperty(style, 'origin') || 'border-box',\n\t\tclip: getMaskProperty(style, 'origin') || 'border-box'\n\t};\n\n\tlet maskImages = splitEffects(maskImage).filter(v => v && v !== 'none');\n\n\treturn maskImages.reverse().map(m => ({\n\t\timage: m,\n\t\t...common\n\t}));\n}\n","/**\n * This module handles CSS custom properties (CSS variables) including:\n * - Extracting custom properties from styles (--property-name)\n * - Resolving var() references\n * - Handling fallback values\n * - Detecting circular references\n */\n\nimport valueParser from 'postcss-value-parser';\n\nexport type CSSVariables = Record<string, string>;\n\n/**\n * Extracts custom properties (--*) from a style object\n * Returns both the variables and the remaining style properties\n */\nexport function extractCustomProperties(\n\tstyle: Record<string, string | number>\n): {\n\tvariables: CSSVariables;\n\tremainingStyle: Record<string, string | number>;\n} {\n\tconst variables: CSSVariables = {};\n\tconst remainingStyle: Record<string, string | number> = {};\n\n\tfor (const prop in style) {\n\t\tif (prop.startsWith('--')) {\n\t\t\t// Custom property\n\t\t\tvariables[prop] = String(style[prop]);\n\t\t} else {\n\t\t\tremainingStyle[prop] = style[prop];\n\t\t}\n\t}\n\n\treturn { variables, remainingStyle };\n}\n\n/**\n * Merges inherited variables with current variables\n * Current variables override inherited ones (cascading)\n */\nexport function mergeVariables(\n\tinherited: CSSVariables,\n\tcurrent: CSSVariables\n): CSSVariables {\n\treturn { ...inherited, ...current };\n}\n\n/**\n * Resolves var() references in a CSS value\n * Supports fallback values: var(--name, fallback)\n * Handles nested var() calls\n */\nexport function resolveVariables(\n\tvalue: string | number,\n\tvariables: CSSVariables,\n\tvisitedVars = new Set<string>()\n): string | number {\n\t// Only process strings\n\tif (typeof value !== 'string') {\n\t\treturn value;\n\t}\n\n\t// Quick check: does this value contain var()?\n\tif (!value.includes('var(')) {\n\t\treturn value;\n\t}\n\n\ttry {\n\t\tconst parsed = valueParser(value);\n\t\tlet hasChanges = false;\n\n\t\tparsed.walk(node => {\n\t\t\tif (node.type === 'function' && node.value === 'var') {\n\t\t\t\thasChanges = true;\n\n\t\t\t\t// Extract variable name and optional fallback\n\t\t\t\tconst args = extractVarArgs(node);\n\t\t\t\tif (!args) {\n\t\t\t\t\t// Invalid var() syntax, leave as-is\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst { varName, fallback } = args;\n\n\t\t\t\t// Check for circular reference\n\t\t\t\tif (visitedVars.has(varName)) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`Circular reference detected for CSS variable: ${varName}`\n\t\t\t\t\t);\n\t\t\t\t\t// Use fallback if available, otherwise use invalid value\n\t\t\t\t\tif (fallback !== undefined) {\n\t\t\t\t\t\treplaceNode(node, fallback);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treplaceNode(node, 'initial');\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Look up the variable\n\t\t\t\tconst variableValue = variables[varName];\n\n\t\t\t\tif (variableValue !== undefined) {\n\t\t\t\t\t// Mark this variable as being resolved to detect circular references\n\t\t\t\t\tconst newVisitedVars = new Set(visitedVars);\n\t\t\t\t\tnewVisitedVars.add(varName);\n\n\t\t\t\t\t// Recursively resolve the variable value in case it contains more var()\n\t\t\t\t\tconst resolvedValue = resolveVariables(\n\t\t\t\t\t\tvariableValue,\n\t\t\t\t\t\tvariables,\n\t\t\t\t\t\tnewVisitedVars\n\t\t\t\t\t);\n\n\t\t\t\t\treplaceNode(node, String(resolvedValue));\n\t\t\t\t} else if (fallback !== undefined) {\n\t\t\t\t\t// Variable not found, use fallback\n\t\t\t\t\t// Recursively resolve fallback in case it contains var()\n\t\t\t\t\tconst resolvedFallback = resolveVariables(\n\t\t\t\t\t\tfallback,\n\t\t\t\t\t\tvariables,\n\t\t\t\t\t\tvisitedVars\n\t\t\t\t\t);\n\t\t\t\t\treplaceNode(node, String(resolvedFallback));\n\t\t\t\t} else {\n\t\t\t\t\t// Variable not found and no fallback, use initial value\n\t\t\t\t\t// According to CSS spec, this should be treated as invalid\n\t\t\t\t\treplaceNode(node, 'initial');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif (hasChanges) {\n\t\t\treturn parsed.toString();\n\t\t}\n\t} catch (err) {\n\t\t// If parsing fails, return the original value\n\t\tconsole.warn(\n\t\t\t`Failed to parse CSS value for variable resolution: ${value}`\n\t\t);\n\t}\n\n\treturn value;\n}\n\n/**\n * Extracts variable name and fallback from var() function arguments\n * Handles: var(--name) and var(--name, fallback)\n */\nfunction extractVarArgs(\n\tnode: valueParser.FunctionNode\n): { varName: string; fallback?: string } | null {\n\tif (!node.nodes || node.nodes.length === 0) {\n\t\treturn null;\n\t}\n\n\t// Find the variable name (first word node)\n\tlet varNameNode: valueParser.Node | undefined;\n\tlet commaIndex = -1;\n\n\tfor (let i = 0; i < node.nodes.length; i++) {\n\t\tconst child = node.nodes[i];\n\t\tif (child.type === 'word' && !varNameNode) {\n\t\t\tvarNameNode = child;\n\t\t} else if (child.type === 'div' && child.value === ',') {\n\t\t\tcommaIndex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (!varNameNode || varNameNode.type !== 'word') {\n\t\treturn null;\n\t}\n\n\tconst varName = varNameNode.value.trim();\n\n\t// Check if there's a fallback value after the comma\n\tif (commaIndex !== -1 && commaIndex < node.nodes.length - 1) {\n\t\t// Collect all nodes after the comma as the fallback\n\t\tconst fallbackNodes = node.nodes.slice(commaIndex + 1);\n\t\tconst fallback = valueParser.stringify(fallbackNodes).trim();\n\t\treturn { varName, fallback };\n\t}\n\n\treturn { varName };\n}\n\n/**\n * Replaces a function node with a raw string value\n */\nfunction replaceNode(node: valueParser.Node, value: string) {\n\t// Replace the function node with a word node\n\tnode.type = 'word';\n\tnode.value = value;\n\t// Remove function-specific properties\n\tdelete (node as any).nodes;\n}\n\n/**\n * Resolves all variables in a style object\n * Returns a new style object with var() references resolved\n */\nexport function resolveStyleVariables(\n\tstyle: Record<string, string | number>,\n\tvariables: CSSVariables\n): Record<string, string | number> {\n\tconst resolved: Record<string, string | number> = {};\n\n\tfor (const prop in style) {\n\t\tresolved[prop] = resolveVariables(style[prop], variables);\n\t}\n\n\treturn resolved;\n}\n","/**\n * Handler to update the Yoga node properties with the given element type and\n * style. Each supported element has its own preset styles, so this function\n * also returns the inherited style for children of the element.\n */\n\nimport presets from './presets.js';\nimport inheritable from './inheritable.js';\nimport expand, { SerializedStyle } from './expand.js';\nimport {\n\tasPointAutoPercentageLength,\n\tasPointPercentageLength,\n\tlengthToNumber,\n\tparseViewBox,\n\tv\n} from '../utils.js';\nimport { getYoga, YogaNode } from '../yoga.js';\nimport { resolveImageData } from './image.js';\n\ntype SatoriElement = keyof typeof presets;\n\nexport default async function compute(\n\tnode: YogaNode,\n\ttype: SatoriElement | string,\n\tinheritedStyle: SerializedStyle,\n\tdefinedStyle: Record<string, string | number>,\n\tprops: Record<string, any>\n): Promise<[SerializedStyle, SerializedStyle]> {\n\tconst Yoga = await getYoga();\n\n\t// Extend the default style with defined and inherited styles.\n\tconst style: SerializedStyle = Object.assign(\n\t\t{},\n\t\tinheritedStyle,\n\t\texpand(presets[type], inheritedStyle),\n\t\texpand(definedStyle, inheritedStyle)\n\t);\n\n\tif (type === 'img') {\n\t\tlet [resolvedSrc, imageWidth, imageHeight] = await resolveImageData(\n\t\t\tprops.src\n\t\t);\n\n\t\t// Cannot parse the image size (e.g. base64 data URI).\n\t\tif (imageWidth === undefined && imageHeight === undefined) {\n\t\t\tif (props.width === undefined || props.height === undefined) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Image size cannot be determined. Please provide the width and height of the image.'\n\t\t\t\t);\n\t\t\t}\n\t\t\timageWidth = parseInt(props.width);\n\t\t\timageHeight = parseInt(props.height);\n\t\t}\n\t\tconst r = imageHeight / imageWidth;\n\n\t\t// Before calculating the missing width or height based on the image ratio,\n\t\t// we must subtract the padding and border due to how box model works.\n\t\t// TODO: Ensure these are absolute length values, not relative values.\n\t\tlet extraHorizontal =\n\t\t\t(style.borderLeftWidth || 0) +\n\t\t\t(style.borderRightWidth || 0) +\n\t\t\t(style.paddingLeft || 0) +\n\t\t\t(style.paddingRight || 0);\n\t\tlet extraVertical =\n\t\t\t(style.borderTopWidth || 0) +\n\t\t\t(style.borderBottomWidth || 0) +\n\t\t\t(style.paddingTop || 0) +\n\t\t\t(style.paddingBottom || 0);\n\n\t\tlet contentBoxWidth = style.width || props.width;\n\t\tlet contentBoxHeight = style.height || props.height;\n\n\t\tconst isAbsoluteContentSize =\n\t\t\ttypeof contentBoxWidth === 'number' &&\n\t\t\ttypeof contentBoxHeight === 'number';\n\n\t\tif (isAbsoluteContentSize) {\n\t\t\tcontentBoxWidth -= extraHorizontal;\n\t\t\tcontentBoxHeight -= extraVertical;\n\t\t}\n\n\t\t// When no content size is defined, we use the image size as the content size.\n\t\tif (contentBoxWidth === undefined && contentBoxHeight === undefined) {\n\t\t\tcontentBoxWidth = '100%';\n\t\t\tnode.setAspectRatio(1 / r);\n\t\t} else {\n\t\t\t// If only one sisde is not defined, we can calculate the other one.\n\t\t\tif (contentBoxWidth === undefined) {\n\t\t\t\tif (typeof contentBoxHeight === 'number') {\n\t\t\t\t\tcontentBoxWidth = contentBoxHeight / r;\n\t\t\t\t} else {\n\t\t\t\t\t// If it uses a relative value (e.g. 50%), we can rely on aspect ratio.\n\t\t\t\t\t// Note: this doesn't work well if there are paddings or borders.\n\t\t\t\t\tnode.setAspectRatio(1 / r);\n\t\t\t\t}\n\t\t\t} else if (contentBoxHeight === undefined) {\n\t\t\t\tif (typeof contentBoxWidth === 'number') {\n\t\t\t\t\tcontentBoxHeight = contentBoxWidth * r;\n\t\t\t\t} else {\n\t\t\t\t\t// If it uses a relative value (e.g. 50%), we can rely on aspect ratio.\n\t\t\t\t\t// Note: this doesn't work well if there are paddings or borders.\n\t\t\t\t\tnode.setAspectRatio(1 / r);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tstyle.width = isAbsoluteContentSize\n\t\t\t? (contentBoxWidth as number) + extraHorizontal\n\t\t\t: contentBoxWidth;\n\t\tstyle.height = isAbsoluteContentSize\n\t\t\t? (contentBoxHeight as number) + extraVertical\n\t\t\t: contentBoxHeight;\n\t\tstyle.__src = resolvedSrc;\n\t\tstyle.__naturalWidth = imageWidth;\n\t\tstyle.__naturalHeight = imageHeight;\n\t}\n\n\tif (type === 'svg') {\n\t\tconst viewBox = props.viewBox || props.viewbox;\n\t\tconst viewBoxSize = parseViewBox(viewBox);\n\t\tconst ratio = viewBoxSize ? viewBoxSize[3] / viewBoxSize[2] : null;\n\n\t\tlet { width, height } = props;\n\t\tif (typeof width === 'undefined' && height) {\n\t\t\tif (ratio == null) {\n\t\t\t\twidth = 0;\n\t\t\t} else if (typeof height === 'string' && height.endsWith('%')) {\n\t\t\t\twidth = parseInt(height) / ratio + '%';\n\t\t\t} else {\n\t\t\t\theight = lengthToNumber(\n\t\t\t\t\theight,\n\t\t\t\t\tinheritedStyle.fontSize,\n\t\t\t\t\t1,\n\t\t\t\t\tinheritedStyle\n\t\t\t\t);\n\t\t\t\twidth = height / ratio;\n\t\t\t}\n\t\t} else if (typeof height === 'undefined' && width) {\n\t\t\tif (ratio == null) {\n\t\t\t\twidth = 0;\n\t\t\t} else if (typeof width === 'string' && width.endsWith('%')) {\n\t\t\t\theight = parseInt(width) * ratio + '%';\n\t\t\t} else {\n\t\t\t\twidth = lengthToNumber(\n\t\t\t\t\twidth,\n\t\t\t\t\tinheritedStyle.fontSize,\n\t\t\t\t\t1,\n\t\t\t\t\tinheritedStyle\n\t\t\t\t);\n\t\t\t\theight = width * ratio;\n\t\t\t}\n\t\t} else {\n\t\t\tif (typeof width !== 'undefined') {\n\t\t\t\twidth =\n\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\tinheritedStyle.fontSize,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\tinheritedStyle\n\t\t\t\t\t) || width;\n\t\t\t}\n\t\t\tif (typeof height !== 'undefined') {\n\t\t\t\theight =\n\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\theight,\n\t\t\t\t\t\tinheritedStyle.fontSize,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\tinheritedStyle\n\t\t\t\t\t) || height;\n\t\t\t}\n\t\t\twidth ||= viewBoxSize?.[2];\n\t\t\theight ||= viewBoxSize?.[3];\n\t\t}\n\n\t\tif (!style.width && width) style.width = width;\n\t\tif (!style.height && height) style.height = height;\n\t}\n\n\t// Set properties for Yoga.\n\tnode.setDisplay(\n\t\tv(\n\t\t\tstyle.display,\n\t\t\t{\n\t\t\t\tflex: Yoga.DISPLAY_FLEX,\n\t\t\t\tblock: Yoga.DISPLAY_FLEX,\n\t\t\t\tcontents: Yoga.DISPLAY_CONTENTS,\n\t\t\t\tnone: Yoga.DISPLAY_NONE,\n\t\t\t\t'-webkit-box': Yoga.DISPLAY_FLEX\n\t\t\t},\n\t\t\tYoga.DISPLAY_FLEX,\n\t\t\t'display'\n\t\t)\n\t);\n\n\tnode.setAlignContent(\n\t\tv(\n\t\t\tstyle.alignContent,\n\t\t\t{\n\t\t\t\tstretch: Yoga.ALIGN_STRETCH,\n\t\t\t\tcenter: Yoga.ALIGN_CENTER,\n\t\t\t\t'flex-start': Yoga.ALIGN_FLEX_START,\n\t\t\t\t'flex-end': Yoga.ALIGN_FLEX_END,\n\t\t\t\t'space-between': Yoga.ALIGN_SPACE_BETWEEN,\n\t\t\t\t'space-around': Yoga.ALIGN_SPACE_AROUND,\n\t\t\t\tbaseline: Yoga.ALIGN_BASELINE,\n\t\t\t\tnormal: Yoga.ALIGN_AUTO\n\t\t\t},\n\t\t\tYoga.ALIGN_AUTO,\n\t\t\t'alignContent'\n\t\t)\n\t);\n\n\tnode.setAlignItems(\n\t\tv(\n\t\t\tstyle.alignItems,\n\t\t\t{\n\t\t\t\tstretch: Yoga.ALIGN_STRETCH,\n\t\t\t\tcenter: Yoga.ALIGN_CENTER,\n\t\t\t\t'flex-start': Yoga.ALIGN_FLEX_START,\n\t\t\t\t'flex-end': Yoga.ALIGN_FLEX_END,\n\t\t\t\tbaseline: Yoga.ALIGN_BASELINE,\n\t\t\t\tnormal: Yoga.ALIGN_AUTO\n\t\t\t},\n\t\t\tYoga.ALIGN_STRETCH,\n\t\t\t'alignItems'\n\t\t)\n\t);\n\tnode.setAlignSelf(\n\t\tv(\n\t\t\tstyle.alignSelf,\n\t\t\t{\n\t\t\t\tstretch: Yoga.ALIGN_STRETCH,\n\t\t\t\tcenter: Yoga.ALIGN_CENTER,\n\t\t\t\t'flex-start': Yoga.ALIGN_FLEX_START,\n\t\t\t\t'flex-end': Yoga.ALIGN_FLEX_END,\n\t\t\t\tbaseline: Yoga.ALIGN_BASELINE,\n\t\t\t\tnormal: Yoga.ALIGN_AUTO\n\t\t\t},\n\t\t\tYoga.ALIGN_AUTO,\n\t\t\t'alignSelf'\n\t\t)\n\t);\n\tnode.setJustifyContent(\n\t\tv(\n\t\t\tstyle.justifyContent,\n\t\t\t{\n\t\t\t\tcenter: Yoga.JUSTIFY_CENTER,\n\t\t\t\t'flex-start': Yoga.JUSTIFY_FLEX_START,\n\t\t\t\t'flex-end': Yoga.JUSTIFY_FLEX_END,\n\t\t\t\t'space-between': Yoga.JUSTIFY_SPACE_BETWEEN,\n\t\t\t\t'space-around': Yoga.JUSTIFY_SPACE_AROUND\n\t\t\t},\n\t\t\tYoga.JUSTIFY_FLEX_START,\n\t\t\t'justifyContent'\n\t\t)\n\t);\n\t// @TODO: node.setAspectRatio\n\n\tnode.setFlexDirection(\n\t\tv(\n\t\t\tstyle.flexDirection,\n\t\t\t{\n\t\t\t\trow: Yoga.FLEX_DIRECTION_ROW,\n\t\t\t\tcolumn: Yoga.FLEX_DIRECTION_COLUMN,\n\t\t\t\t'row-reverse': Yoga.FLEX_DIRECTION_ROW_REVERSE,\n\t\t\t\t'column-reverse': Yoga.FLEX_DIRECTION_COLUMN_REVERSE\n\t\t\t},\n\t\t\tYoga.FLEX_DIRECTION_ROW,\n\t\t\t'flexDirection'\n\t\t)\n\t);\n\tnode.setFlexWrap(\n\t\tv(\n\t\t\tstyle.flexWrap,\n\t\t\t{\n\t\t\t\twrap: Yoga.WRAP_WRAP,\n\t\t\t\tnowrap: Yoga.WRAP_NO_WRAP,\n\t\t\t\t'wrap-reverse': Yoga.WRAP_WRAP_REVERSE\n\t\t\t},\n\t\t\tYoga.WRAP_NO_WRAP,\n\t\t\t'flexWrap'\n\t\t)\n\t);\n\n\tif (typeof style.gap !== 'undefined') {\n\t\tnode.setGap(Yoga.GUTTER_ALL, style.gap);\n\t}\n\n\tif (typeof style.rowGap !== 'undefined') {\n\t\tnode.setGap(Yoga.GUTTER_ROW, style.rowGap);\n\t}\n\n\tif (typeof style.columnGap !== 'undefined') {\n\t\tnode.setGap(Yoga.GUTTER_COLUMN, style.columnGap);\n\t}\n\n\t// @TODO: node.setFlex\n\n\tif (typeof style.flexBasis !== 'undefined') {\n\t\tnode.setFlexBasis(\n\t\t\tasPointAutoPercentageLength(style.flexBasis, 'flexBasis')\n\t\t);\n\t}\n\tnode.setFlexGrow(\n\t\ttypeof style.flexGrow === 'undefined' ? 0 : style.flexGrow\n\t);\n\tnode.setFlexShrink(\n\t\ttypeof style.flexShrink === 'undefined' ? 0 : style.flexShrink\n\t);\n\n\tif (typeof style.maxHeight !== 'undefined') {\n\t\tnode.setMaxHeight(\n\t\t\tasPointPercentageLength(style.maxHeight, 'maxHeight')\n\t\t);\n\t}\n\tif (typeof style.maxWidth !== 'undefined') {\n\t\tnode.setMaxWidth(asPointPercentageLength(style.maxWidth, 'maxWidth'));\n\t}\n\tif (typeof style.minHeight !== 'undefined') {\n\t\tnode.setMinHeight(\n\t\t\tasPointPercentageLength(style.minHeight, 'minHeight')\n\t\t);\n\t}\n\tif (typeof style.minWidth !== 'undefined') {\n\t\tnode.setMinWidth(asPointPercentageLength(style.minWidth, 'minWidth'));\n\t}\n\n\tnode.setOverflow(\n\t\tv(\n\t\t\tstyle.overflow,\n\t\t\t{\n\t\t\t\tvisible: Yoga.OVERFLOW_VISIBLE,\n\t\t\t\thidden: Yoga.OVERFLOW_HIDDEN\n\t\t\t},\n\t\t\tYoga.OVERFLOW_VISIBLE,\n\t\t\t'overflow'\n\t\t)\n\t);\n\n\tnode.setMargin(\n\t\tYoga.EDGE_TOP,\n\t\tasPointAutoPercentageLength(style.marginTop || 0)\n\t);\n\tnode.setMargin(\n\t\tYoga.EDGE_BOTTOM,\n\t\tasPointAutoPercentageLength(style.marginBottom || 0)\n\t);\n\tnode.setMargin(\n\t\tYoga.EDGE_LEFT,\n\t\tasPointAutoPercentageLength(style.marginLeft || 0)\n\t);\n\tnode.setMargin(\n\t\tYoga.EDGE_RIGHT,\n\t\tasPointAutoPercentageLength(style.marginRight || 0)\n\t);\n\n\tnode.setBorder(Yoga.EDGE_TOP, style.borderTopWidth || 0);\n\tnode.setBorder(Yoga.EDGE_BOTTOM, style.borderBottomWidth || 0);\n\tnode.setBorder(Yoga.EDGE_LEFT, style.borderLeftWidth || 0);\n\tnode.setBorder(Yoga.EDGE_RIGHT, style.borderRightWidth || 0);\n\n\tnode.setPadding(Yoga.EDGE_TOP, style.paddingTop || 0);\n\tnode.setPadding(Yoga.EDGE_BOTTOM, style.paddingBottom || 0);\n\tnode.setPadding(Yoga.EDGE_LEFT, style.paddingLeft || 0);\n\tnode.setPadding(Yoga.EDGE_RIGHT, style.paddingRight || 0);\n\n\tnode.setBoxSizing(\n\t\tv(\n\t\t\tstyle.boxSizing,\n\t\t\t{\n\t\t\t\t'border-box': Yoga.BOX_SIZING_BORDER_BOX,\n\t\t\t\t'content-box': Yoga.BOX_SIZING_CONTENT_BOX\n\t\t\t},\n\t\t\tYoga.BOX_SIZING_BORDER_BOX,\n\t\t\t'boxSizing'\n\t\t)\n\t);\n\n\tnode.setPositionType(\n\t\tv(\n\t\t\tstyle.position,\n\t\t\t{\n\t\t\t\tabsolute: Yoga.POSITION_TYPE_ABSOLUTE,\n\t\t\t\trelative: Yoga.POSITION_TYPE_RELATIVE,\n\t\t\t\tstatic: Yoga.POSITION_TYPE_STATIC\n\t\t\t},\n\t\t\tYoga.POSITION_TYPE_RELATIVE,\n\t\t\t'position'\n\t\t)\n\t);\n\n\tif (typeof style.top !== 'undefined') {\n\t\tnode.setPosition(\n\t\t\tYoga.EDGE_TOP,\n\t\t\tasPointPercentageLength(style.top, 'top')\n\t\t);\n\t}\n\tif (typeof style.bottom !== 'undefined') {\n\t\tnode.setPosition(\n\t\t\tYoga.EDGE_BOTTOM,\n\t\t\tasPointPercentageLength(style.bottom, 'bottom')\n\t\t);\n\t}\n\tif (typeof style.left !== 'undefined') {\n\t\tnode.setPosition(\n\t\t\tYoga.EDGE_LEFT,\n\t\t\tasPointPercentageLength(style.left, 'left')\n\t\t);\n\t}\n\tif (typeof style.right !== 'undefined') {\n\t\tnode.setPosition(\n\t\t\tYoga.EDGE_RIGHT,\n\t\t\tasPointPercentageLength(style.right, 'right')\n\t\t);\n\t}\n\n\tif (typeof style.height !== 'undefined') {\n\t\tnode.setHeight(asPointAutoPercentageLength(style.height, 'height'));\n\t} else {\n\t\tnode.setHeightAuto();\n\t}\n\tif (typeof style.width !== 'undefined') {\n\t\tnode.setWidth(asPointAutoPercentageLength(style.width, 'width'));\n\t} else {\n\t\tnode.setWidthAuto();\n\t}\n\n\treturn [style, inheritable(style)];\n}\n","import escapeHTML from 'escape-html';\nimport type { ParsedTransformOrigin } from '../transform-origin.js';\nimport transform from './transform.js';\nimport { buildXMLString } from '../utils.js';\n\nexport function container(\n\t{\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight,\n\t\tisInheritingTransform\n\t}: {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t\tisInheritingTransform: boolean;\n\t},\n\tstyle: Record<string, number | string>\n) {\n\tlet matrix = '';\n\tlet opacity = 1;\n\n\tif (style.transform) {\n\t\tmatrix = transform(\n\t\t\t{\n\t\t\t\tleft,\n\t\t\t\ttop,\n\t\t\t\twidth,\n\t\t\t\theight\n\t\t\t},\n\t\t\tstyle.transform as unknown as number[],\n\t\t\tisInheritingTransform,\n\t\t\tstyle.transformOrigin as ParsedTransformOrigin | undefined\n\t\t);\n\t}\n\n\tif (style.opacity !== undefined) {\n\t\topacity = +style.opacity;\n\t}\n\n\treturn { matrix, opacity };\n}\n\nexport default function buildText(\n\t{\n\t\tid,\n\t\tcontent,\n\t\tfilter,\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight,\n\t\tmatrix,\n\t\topacity,\n\t\timage,\n\t\tclipPathId,\n\t\tdebug,\n\t\tshape,\n\t\tdecorationShape\n\t}: {\n\t\tcontent: string;\n\t\tfilter: string;\n\t\tid: string;\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t\tmatrix: string;\n\t\topacity: number;\n\t\timage: string | null;\n\t\tclipPathId?: string;\n\t\tdebug?: boolean;\n\t\tshape?: boolean;\n\t\tdecorationShape?: string;\n\t},\n\tstyle: Record<string, number | string>\n) {\n\tlet extra = '';\n\tif (debug) {\n\t\textra = buildXMLString('rect', {\n\t\t\tx: left,\n\t\t\ty: top - height,\n\t\t\twidth,\n\t\t\theight,\n\t\t\tfill: 'transparent',\n\t\t\tstroke: '#575eff',\n\t\t\t'stroke-width': 1,\n\t\t\ttransform: matrix || undefined,\n\t\t\t'clip-path': clipPathId ? `url(#${clipPathId})` : undefined\n\t\t});\n\t}\n\n\t// This grapheme should be rendered as an image.\n\tif (image) {\n\t\tconst shapeProps = {\n\t\t\thref: image,\n\t\t\tx: left,\n\t\t\ty: top,\n\t\t\twidth,\n\t\t\theight,\n\t\t\ttransform: matrix || undefined,\n\t\t\t'clip-path': clipPathId ? `url(#${clipPathId})` : undefined,\n\t\t\tstyle: style.filter ? `filter:${style.filter}` : undefined\n\t\t};\n\t\treturn [\n\t\t\t(filter ? `${filter}<g filter=\"url(#satori_s-${id})\">` : '') +\n\t\t\t\tbuildXMLString('image', {\n\t\t\t\t\t...shapeProps,\n\t\t\t\t\topacity: opacity !== 1 ? opacity : undefined\n\t\t\t\t}) +\n\t\t\t\t(decorationShape || '') +\n\t\t\t\t(filter ? '</g>' : '') +\n\t\t\t\textra,\n\t\t\t// SVG doesn't support `<image>` as the shape.\n\t\t\t''\n\t\t];\n\t}\n\n\t// Do not embed the font, use <text> with the raw content instead.\n\tconst shapeProps = {\n\t\tx: left,\n\t\ty: top,\n\t\twidth,\n\t\theight,\n\t\t'font-weight': style.fontWeight,\n\t\t'font-style': style.fontStyle,\n\t\t'font-size': style.fontSize,\n\t\t'font-family': style.fontFamily,\n\t\t'letter-spacing': style.letterSpacing || undefined,\n\t\ttransform: matrix || undefined,\n\t\t'clip-path': clipPathId ? `url(#${clipPathId})` : undefined,\n\t\tstyle: style.filter ? `filter:${style.filter}` : undefined,\n\t\t'stroke-width': style.WebkitTextStrokeWidth\n\t\t\t? `${style.WebkitTextStrokeWidth}px`\n\t\t\t: undefined,\n\t\tstroke: style.WebkitTextStrokeWidth\n\t\t\t? style.WebkitTextStrokeColor\n\t\t\t: undefined,\n\t\t'stroke-linejoin': style.WebkitTextStrokeWidth ? 'round' : undefined,\n\t\t'paint-order': style.WebkitTextStrokeWidth ? 'stroke' : undefined\n\t};\n\treturn [\n\t\t(filter ? `${filter}<g filter=\"url(#satori_s-${id})\">` : '') +\n\t\t\tbuildXMLString(\n\t\t\t\t'text',\n\t\t\t\t{\n\t\t\t\t\t...shapeProps,\n\t\t\t\t\tfill: style.color,\n\t\t\t\t\topacity: opacity !== 1 ? opacity : undefined\n\t\t\t\t},\n\t\t\t\tescapeHTML(content)\n\t\t\t) +\n\t\t\t(decorationShape || '') +\n\t\t\t(filter ? '</g>' : '') +\n\t\t\textra,\n\t\tshape ? buildXMLString('text', shapeProps, escapeHTML(content)) : ''\n\t];\n}\n","import { multiply } from '../utils.js';\nimport type { ParsedTransformOrigin } from '../transform-origin.js';\n\nconst baseMatrix = [1, 0, 0, 1, 0, 0];\n\n// Mutate the array in place.\nfunction resolveTransforms(transforms: any[], width: number, height: number) {\n\tlet matrix = [...baseMatrix];\n\n\t// Handle CSS transforms To make it easier, we convert different transform\n\t// types directly to a matrix and apply it recursively to all its children.\n\t// Transforms are applied from right to left.\n\t// eslint-disable-next-line @typescript-eslint/no-shadow\n\tfor (const transform of transforms) {\n\t\tconst type = Object.keys(transform)[0];\n\t\tlet v = transform[type];\n\n\t\t// Resolve percentages based on the element's final size.\n\t\tif (typeof v === 'string') {\n\t\t\tif (type === 'translateX') {\n\t\t\t\tv = (parseFloat(v) / 100) * width;\n\t\t\t\t// Override the original object.\n\t\t\t\ttransform[type] = v;\n\t\t\t} else if (type === 'translateY') {\n\t\t\t\tv = (parseFloat(v) / 100) * height;\n\t\t\t\ttransform[type] = v;\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Invalid transform: \"${type}: ${v}\".`);\n\t\t\t}\n\t\t}\n\n\t\tlet len = v as number;\n\n\t\tconst transformMatrix = [...baseMatrix];\n\t\tswitch (type) {\n\t\t\tcase 'translateX':\n\t\t\t\ttransformMatrix[4] = len;\n\t\t\t\tbreak;\n\t\t\tcase 'translateY':\n\t\t\t\ttransformMatrix[5] = len;\n\t\t\t\tbreak;\n\t\t\tcase 'scale':\n\t\t\t\ttransformMatrix[0] = len;\n\t\t\t\ttransformMatrix[3] = len;\n\t\t\t\tbreak;\n\t\t\tcase 'scaleX':\n\t\t\t\ttransformMatrix[0] = len;\n\t\t\t\tbreak;\n\t\t\tcase 'scaleY':\n\t\t\t\ttransformMatrix[3] = len;\n\t\t\t\tbreak;\n\t\t\tcase 'rotate': {\n\t\t\t\tconst rad = (len * Math.PI) / 180;\n\t\t\t\tconst c = Math.cos(rad);\n\t\t\t\tconst s = Math.sin(rad);\n\t\t\t\ttransformMatrix[0] = c;\n\t\t\t\ttransformMatrix[1] = s;\n\t\t\t\ttransformMatrix[2] = -s;\n\t\t\t\ttransformMatrix[3] = c;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'skewX':\n\t\t\t\ttransformMatrix[2] = Math.tan((len * Math.PI) / 180);\n\t\t\t\tbreak;\n\t\t\tcase 'skewY':\n\t\t\t\ttransformMatrix[1] = Math.tan((len * Math.PI) / 180);\n\t\t\t\tbreak;\n\t\t}\n\t\tmatrix = multiply(transformMatrix, matrix);\n\t}\n\n\ttransforms.splice(0, transforms.length);\n\ttransforms.push(...matrix);\n\t(transforms as any).__resolved = true;\n}\n\nexport default function transform(\n\t{\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight\n\t}: {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t},\n\ttransforms: number[],\n\tisInheritingTransform: boolean,\n\ttransformOrigin?: ParsedTransformOrigin\n) {\n\tlet result: number[];\n\n\tif (!(transforms as any).__resolved) {\n\t\tresolveTransforms(transforms, width, height);\n\t}\n\n\tlet matrix = transforms;\n\n\t// Calculate the transform origin.\n\tif (isInheritingTransform) {\n\t\tresult = matrix;\n\t} else {\n\t\tconst xOrigin =\n\t\t\ttransformOrigin?.xAbsolute ??\n\t\t\t((transformOrigin?.xRelative ?? 50) * width) / 100;\n\t\tconst yOrigin =\n\t\t\ttransformOrigin?.yAbsolute ??\n\t\t\t((transformOrigin?.yRelative ?? 50) * height) / 100;\n\n\t\t// If this element is the transform target, we attach the origin coordinates\n\t\t// to this matrix.\n\t\tconst x = left + xOrigin;\n\t\tconst y = top + yOrigin;\n\n\t\t// Due to the different coordinate systems, we need to move the shape to the\n\t\t// origin first, then apply the matrix, then move it back.\n\t\tresult = multiply(\n\t\t\t[1, 0, 0, 1, x, y],\n\t\t\tmultiply(matrix, [1, 0, 0, 1, -x, -y])\n\t\t);\n\n\t\t// And we need to apply its parent transform if it has one.\n\t\tif ((matrix as any).__parent) {\n\t\t\tresult = multiply((matrix as any).__parent, result);\n\t\t}\n\n\t\t// Mutate self.\n\t\tmatrix.splice(0, 6, ...result);\n\t}\n\n\treturn `matrix(${result.map(v => v.toFixed(2)).join(',')})`;\n}\n","// @TODO: It seems that SVG filters are pretty expensive for resvg, PNG\n// generation time 10x'd when adding this filter (WASM in browser).\n// https://drafts.fxtf.org/filter-effects/#feGaussianBlurElement\n\nimport { buildXMLString } from '../utils.js';\n\nfunction shiftPath(path: string, dx: number, dy: number) {\n\treturn path.replace(\n\t\t/([MA])([0-9.-]+),([0-9.-]+)/g,\n\t\tfunction (_, command, x, y) {\n\t\t\treturn command + (parseFloat(x) + dx) + ',' + (parseFloat(y) + dy);\n\t\t}\n\t);\n}\n\n// The scale is used to make the filter area larger than the bounding box,\n// because usually the given measured text bounding is larger than the path\n// bounding.\n// The text bounding box is measured via the font metrics, which is not the same\n// as the actual content. For example, the text bounding box of \"A\" is larger\n// than the actual \"a\" path but they have the same font metrics.\n// This scale can be adjusted to prevent the filter from cutting off the text.\nconst SCALE = 1.1;\n\nexport function buildDropShadow(\n\t{ id, width, height }: { id: string; width: number; height: number },\n\tstyle: {\n\t\tshadowColor: string[];\n\t\tshadowOffset: {\n\t\t\twidth: number;\n\t\t\theight: number;\n\t\t}[];\n\t\tshadowRadius: number[];\n\t},\n\ttransparentText = false\n) {\n\tif (\n\t\t!style.shadowColor ||\n\t\t!style.shadowOffset ||\n\t\ttypeof style.shadowRadius === 'undefined'\n\t) {\n\t\treturn '';\n\t}\n\n\tconst shadowCount = style.shadowColor.length;\n\tlet effects = '';\n\tlet merge = '';\n\n\t// There could be multiple shadows, we need to get the maximum bounding box\n\t// and use `feMerge` to merge them together.\n\tlet left = 0;\n\tlet right = width;\n\tlet top = 0;\n\tlet bottom = height;\n\tfor (let i = 0; i < shadowCount; i++) {\n\t\t// Expand the area for the filter to prevent it from cutting off.\n\t\tconst grow = (style.shadowRadius[i] * style.shadowRadius[i]) / 4;\n\t\tleft = Math.min(style.shadowOffset[i].width - grow, left);\n\t\tright = Math.max(style.shadowOffset[i].width + grow + width, right);\n\t\ttop = Math.min(style.shadowOffset[i].height - grow, top);\n\t\tbottom = Math.max(style.shadowOffset[i].height + grow + height, bottom);\n\n\t\tif (transparentText) {\n\t\t\t// For transparent text, use primitive filters instead of feDropShadow\n\t\t\t// because feDropShadow automatically includes source in output and\n\t\t\t// source has unwanted text color\n\t\t\tconst resultId = `satori_s-${id}-result-${i}`;\n\t\t\teffects +=\n\t\t\t\tbuildXMLString('feGaussianBlur', {\n\t\t\t\t\tin: 'SourceAlpha',\n\t\t\t\t\tstdDeviation: style.shadowRadius[i] / 2,\n\t\t\t\t\tresult: `${resultId}-blur`\n\t\t\t\t}) +\n\t\t\t\tbuildXMLString('feOffset', {\n\t\t\t\t\tin: `${resultId}-blur`,\n\t\t\t\t\tdx: style.shadowOffset[i].width,\n\t\t\t\t\tdy: style.shadowOffset[i].height,\n\t\t\t\t\tresult: `${resultId}-offset`\n\t\t\t\t}) +\n\t\t\t\tbuildXMLString('feFlood', {\n\t\t\t\t\t'flood-color': style.shadowColor[i],\n\t\t\t\t\t'flood-opacity': 1,\n\t\t\t\t\tresult: `${resultId}-color`\n\t\t\t\t}) +\n\t\t\t\tbuildXMLString('feComposite', {\n\t\t\t\t\tin: `${resultId}-color`,\n\t\t\t\t\tin2: `${resultId}-offset`,\n\t\t\t\t\toperator: 'in',\n\t\t\t\t\tresult: shadowCount > 1 ? resultId : undefined\n\t\t\t\t});\n\t\t} else {\n\t\t\teffects += buildXMLString('feDropShadow', {\n\t\t\t\tdx: style.shadowOffset[i].width,\n\t\t\t\tdy: style.shadowOffset[i].height,\n\t\t\t\tstdDeviation:\n\t\t\t\t\t// According to the spec, we use the half of the blur radius as the standard\n\t\t\t\t\t// deviation for the filter.\n\t\t\t\t\t// > the image that would be generated by applying to the shadow a Gaussian\n\t\t\t\t\t// > blur with a standard deviation equal to half the blur radius\n\t\t\t\t\t// > https://www.w3.org/TR/css-backgrounds-3/#shadow-blur\n\t\t\t\t\tstyle.shadowRadius[i] / 2,\n\t\t\t\t'flood-color': style.shadowColor[i],\n\t\t\t\t'flood-opacity': 1,\n\t\t\t\t...(shadowCount > 1\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tin: 'SourceGraphic',\n\t\t\t\t\t\t\tresult: `satori_s-${id}-result-${i}`\n\t\t\t\t\t }\n\t\t\t\t\t: {})\n\t\t\t});\n\t\t}\n\n\t\tif (shadowCount > 1) {\n\t\t\t// Merge needs to be in reverse order.\n\t\t\tmerge =\n\t\t\t\tbuildXMLString('feMergeNode', {\n\t\t\t\t\tin: `satori_s-${id}-result-${i}`\n\t\t\t\t}) + merge;\n\t\t}\n\t}\n\n\treturn buildXMLString(\n\t\t'filter',\n\t\t{\n\t\t\tid: `satori_s-${id}`,\n\t\t\tx: ((left / width) * 100 * SCALE).toFixed(2) + '%',\n\t\t\ty: ((top / height) * 100 * SCALE).toFixed(2) + '%',\n\t\t\twidth: (((right - left) / width) * 100 * SCALE).toFixed(2) + '%',\n\t\t\theight: (((bottom - top) / height) * 100 * SCALE).toFixed(2) + '%'\n\t\t},\n\t\teffects + (merge ? buildXMLString('feMerge', {}, merge) : '')\n\t);\n}\n\nexport function boxShadow(\n\t{\n\t\twidth,\n\t\theight,\n\t\tshape,\n\t\topacity,\n\t\tid\n\t}: {\n\t\twidth: number;\n\t\theight: number;\n\t\tshape: string;\n\t\topacity: number;\n\t\tid: string;\n\t},\n\tstyle: Record<string, any>\n) {\n\tif (!style.boxShadow) return null;\n\n\tlet shadow = '';\n\tlet innerShadow = '';\n\n\tfor (let i = style.boxShadow.length - 1; i >= 0; i--) {\n\t\tlet s = '';\n\n\t\tconst shadowStyle = style.boxShadow[i];\n\n\t\tif (shadowStyle.spreadRadius && shadowStyle.inset) {\n\t\t\tshadowStyle.spreadRadius = -shadowStyle.spreadRadius;\n\t\t}\n\n\t\t// Expand the area for the filter to prevent it from cutting off.\n\t\tconst grow =\n\t\t\t(shadowStyle.blurRadius * shadowStyle.blurRadius) / 4 +\n\t\t\t(shadowStyle.spreadRadius || 0);\n\n\t\tconst left = Math.min(\n\t\t\t-grow - (shadowStyle.inset ? shadowStyle.offsetX : 0),\n\t\t\t0\n\t\t);\n\t\tconst right = Math.max(\n\t\t\tgrow + width - (shadowStyle.inset ? shadowStyle.offsetX : 0),\n\t\t\twidth\n\t\t);\n\t\tconst top = Math.min(\n\t\t\t-grow - (shadowStyle.inset ? shadowStyle.offsetY : 0),\n\t\t\t0\n\t\t);\n\t\tconst bottom = Math.max(\n\t\t\tgrow + height - (shadowStyle.inset ? shadowStyle.offsetY : 0),\n\t\t\theight\n\t\t);\n\n\t\tconst sid = `satori_s-${id}-${i}`;\n\t\tconst maskId = `satori_ms-${id}-${i}`;\n\t\tconst shapeWithSpread = shadowStyle.spreadRadius\n\t\t\t? shape.replace(\n\t\t\t\t\t'stroke-width=\"0\"',\n\t\t\t\t\t`stroke-width=\"${shadowStyle.spreadRadius * 2}\"`\n\t\t\t )\n\t\t\t: shape;\n\n\t\ts += buildXMLString(\n\t\t\t'mask',\n\t\t\t{\n\t\t\t\tid: maskId,\n\t\t\t\tmaskUnits: 'userSpaceOnUse'\n\t\t\t},\n\t\t\tbuildXMLString('rect', {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\twidth: style._viewportWidth || '100%',\n\t\t\t\theight: style._viewportHeight || '100%',\n\t\t\t\tfill: shadowStyle.inset ? '#000' : '#fff'\n\t\t\t}) +\n\t\t\t\tshapeWithSpread\n\t\t\t\t\t.replace(\n\t\t\t\t\t\t'fill=\"#fff\"',\n\t\t\t\t\t\tshadowStyle.inset ? 'fill=\"#fff\"' : 'fill=\"#000\"'\n\t\t\t\t\t)\n\t\t\t\t\t.replace('stroke=\"#fff\"', '')\n\t\t);\n\n\t\tlet finalShape = shapeWithSpread\n\t\t\t.replace(/d=\"([^\"]+)\"/, (_, path) => {\n\t\t\t\treturn (\n\t\t\t\t\t'd=\"' +\n\t\t\t\t\tshiftPath(path, shadowStyle.offsetX, shadowStyle.offsetY) +\n\t\t\t\t\t'\"'\n\t\t\t\t);\n\t\t\t})\n\t\t\t.replace(/x=\"([^\"]+)\"/, (_, x) => {\n\t\t\t\treturn 'x=\"' + (parseFloat(x) + shadowStyle.offsetX) + '\"';\n\t\t\t})\n\t\t\t.replace(/y=\"([^\"]+)\"/, (_, y) => {\n\t\t\t\treturn 'y=\"' + (parseFloat(y) + shadowStyle.offsetY) + '\"';\n\t\t\t});\n\n\t\t// Negative spread radius, we need another mask here.\n\t\tif (shadowStyle.spreadRadius && shadowStyle.spreadRadius < 0) {\n\t\t\ts += buildXMLString(\n\t\t\t\t'mask',\n\t\t\t\t{\n\t\t\t\t\tid: maskId + '-neg',\n\t\t\t\t\tmaskUnits: 'userSpaceOnUse'\n\t\t\t\t},\n\t\t\t\tfinalShape\n\t\t\t\t\t.replace('stroke=\"#fff\"', 'stroke=\"#000\"')\n\t\t\t\t\t.replace(\n\t\t\t\t\t\t/stroke-width=\"[^\"]+\"/,\n\t\t\t\t\t\t`stroke-width=\"${-shadowStyle.spreadRadius * 2}\"`\n\t\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tif (shadowStyle.spreadRadius && shadowStyle.spreadRadius < 0) {\n\t\t\tfinalShape = buildXMLString(\n\t\t\t\t'g',\n\t\t\t\t{\n\t\t\t\t\tmask: `url(#${maskId}-neg)`\n\t\t\t\t},\n\t\t\t\tfinalShape\n\t\t\t);\n\t\t}\n\n\t\ts +=\n\t\t\tbuildXMLString(\n\t\t\t\t'defs',\n\t\t\t\t{},\n\t\t\t\tbuildXMLString(\n\t\t\t\t\t'filter',\n\t\t\t\t\t{\n\t\t\t\t\t\tid: sid,\n\t\t\t\t\t\tx: `${(left / width) * 100}%`,\n\t\t\t\t\t\ty: `${(top / height) * 100}%`,\n\t\t\t\t\t\twidth: `${((right - left) / width) * 100}%`,\n\t\t\t\t\t\theight: `${((bottom - top) / height) * 100}%`\n\t\t\t\t\t},\n\t\t\t\t\tbuildXMLString('feGaussianBlur', {\n\t\t\t\t\t\t// According to the spec, we use the half of the blur radius as the standard\n\t\t\t\t\t\t// deviation for the filter.\n\t\t\t\t\t\t// > the image that would be generated by applying to the shadow a Gaussian\n\t\t\t\t\t\t// > blur with a standard deviation equal to half the blur radius\n\t\t\t\t\t\t// > https://www.w3.org/TR/css-backgrounds-3/#shadow-blur\n\t\t\t\t\t\tstdDeviation: shadowStyle.blurRadius / 2,\n\t\t\t\t\t\tresult: 'b'\n\t\t\t\t\t}) +\n\t\t\t\t\t\tbuildXMLString('feFlood', {\n\t\t\t\t\t\t\t'flood-color': shadowStyle.color,\n\t\t\t\t\t\t\tin: 'SourceGraphic',\n\t\t\t\t\t\t\tresult: 'f'\n\t\t\t\t\t\t}) +\n\t\t\t\t\t\tbuildXMLString('feComposite', {\n\t\t\t\t\t\t\tin: 'f',\n\t\t\t\t\t\t\tin2: 'b',\n\t\t\t\t\t\t\toperator: shadowStyle.inset ? 'out' : 'in'\n\t\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t) +\n\t\t\tbuildXMLString(\n\t\t\t\t'g',\n\t\t\t\t{\n\t\t\t\t\tmask: `url(#${maskId})`,\n\t\t\t\t\tfilter: `url(#${sid})`,\n\t\t\t\t\topacity: opacity\n\t\t\t\t},\n\t\t\t\tfinalShape\n\t\t\t);\n\n\t\tif (shadowStyle.inset) {\n\t\t\tinnerShadow += s;\n\t\t} else {\n\t\t\tshadow += s;\n\t\t}\n\t}\n\n\treturn [shadow, innerShadow];\n}\n","import { buildXMLString } from '../utils.js';\nimport type { GlyphBox } from '../font.js';\n\nfunction buildSkipInkSegments(\n\tstart: number,\n\tend: number,\n\tglyphBoxes: GlyphBox[],\n\ty: number,\n\tstrokeWidth: number,\n\tbaseline: number\n) {\n\tconst halfStroke = strokeWidth / 2;\n\tconst bleed = Math.max(halfStroke, strokeWidth * 1.25);\n\tconst skipRanges: [number, number][] = [];\n\n\tfor (const box of glyphBoxes) {\n\t\t// Only skip glyphs that actually cross the underline position and extend below the baseline.\n\t\tif (box.y2 < baseline + halfStroke || box.y1 > y + halfStroke) continue;\n\n\t\tconst from = Math.max(start, box.x1 - bleed);\n\t\tconst to = Math.min(end, box.x2 + bleed);\n\n\t\tif (from >= to) continue;\n\t\tif (skipRanges.length === 0) {\n\t\t\tskipRanges.push([from, to]);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst last = skipRanges[skipRanges.length - 1];\n\t\tif (from <= last[1]) {\n\t\t\tlast[1] = Math.max(last[1], to);\n\t\t} else {\n\t\t\tskipRanges.push([from, to]);\n\t\t}\n\t}\n\n\tif (!skipRanges.length) {\n\t\treturn [[start, end]] as [number, number][];\n\t}\n\n\tconst segments: [number, number][] = [];\n\tlet cursor = start;\n\n\tfor (const [from, to] of skipRanges) {\n\t\tif (from > cursor) {\n\t\t\tsegments.push([cursor, from]);\n\t\t}\n\t\tcursor = Math.max(cursor, to);\n\t\tif (cursor >= end) break;\n\t}\n\n\tif (cursor < end) {\n\t\tsegments.push([cursor, end]);\n\t}\n\n\treturn segments;\n}\n\nexport default function buildDecoration(\n\t{\n\t\twidth,\n\t\tleft,\n\t\ttop,\n\t\tascender,\n\t\tclipPathId,\n\t\tmatrix,\n\t\tglyphBoxes\n\t}: {\n\t\twidth: number;\n\t\tleft: number;\n\t\ttop: number;\n\t\tascender: number;\n\t\tclipPathId?: string;\n\t\tmatrix?: string;\n\t\tglyphBoxes?: GlyphBox[];\n\t},\n\tstyle: Record<string, any>\n) {\n\tconst {\n\t\ttextDecorationColor,\n\t\ttextDecorationStyle,\n\t\ttextDecorationLine,\n\t\ttextDecorationSkipInk,\n\t\tfontSize,\n\t\tcolor\n\t} = style;\n\tif (!textDecorationLine || textDecorationLine === 'none') return '';\n\n\t// The UA should use such font-based information when choosing auto line thicknesses wherever appropriate.\n\t// https://drafts.csswg.org/css-text-decor-4/#text-decoration-thickness\n\tconst height = Math.max(1, fontSize * 0.1);\n\n\tconst y =\n\t\ttextDecorationLine === 'line-through'\n\t\t\t? top + ascender * 0.7\n\t\t\t: textDecorationLine === 'underline'\n\t\t\t? top + ascender * 1.1\n\t\t\t: top;\n\n\tconst dasharray =\n\t\ttextDecorationStyle === 'dashed'\n\t\t\t? `${height * 1.2} ${height * 2}`\n\t\t\t: textDecorationStyle === 'dotted'\n\t\t\t? `0 ${height * 2}`\n\t\t\t: undefined;\n\n\tconst applySkipInk =\n\t\ttextDecorationLine === 'underline' &&\n\t\t(textDecorationSkipInk || 'auto') !== 'none' &&\n\t\tglyphBoxes?.length;\n\n\tconst baseline = top + ascender;\n\n\tconst segments = applySkipInk\n\t\t? buildSkipInkSegments(\n\t\t\t\tleft,\n\t\t\t\tleft + width,\n\t\t\t\tglyphBoxes,\n\t\t\t\ty,\n\t\t\t\theight,\n\t\t\t\tbaseline\n\t\t )\n\t\t: ([[left, left + width]] as [number, number][]);\n\n\t// https://www.w3.org/TR/css-backgrounds-3/#valdef-line-style-double\n\tconst extraLine =\n\t\ttextDecorationStyle === 'double'\n\t\t\t? segments\n\t\t\t\t\t.map(([x1, x2]) =>\n\t\t\t\t\t\tbuildXMLString('line', {\n\t\t\t\t\t\t\tx1,\n\t\t\t\t\t\t\ty1: y + height + 1,\n\t\t\t\t\t\t\tx2,\n\t\t\t\t\t\t\ty2: y + height + 1,\n\t\t\t\t\t\t\tstroke: textDecorationColor || color,\n\t\t\t\t\t\t\t'stroke-width': height,\n\t\t\t\t\t\t\t'stroke-dasharray': dasharray,\n\t\t\t\t\t\t\t'stroke-linecap':\n\t\t\t\t\t\t\t\ttextDecorationStyle === 'dotted'\n\t\t\t\t\t\t\t\t\t? 'round'\n\t\t\t\t\t\t\t\t\t: 'square',\n\t\t\t\t\t\t\ttransform: matrix\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\t\t.join('')\n\t\t\t: '';\n\n\treturn (\n\t\t(clipPathId ? `<g clip-path=\"url(#${clipPathId})\">` : '') +\n\t\tsegments\n\t\t\t.map(([x1, x2]) =>\n\t\t\t\tbuildXMLString('line', {\n\t\t\t\t\tx1,\n\t\t\t\t\ty1: y,\n\t\t\t\t\tx2,\n\t\t\t\t\ty2: y,\n\t\t\t\t\tstroke: textDecorationColor || color,\n\t\t\t\t\t'stroke-width': height,\n\t\t\t\t\t'stroke-dasharray': dasharray,\n\t\t\t\t\t'stroke-linecap':\n\t\t\t\t\t\ttextDecorationStyle === 'dotted' ? 'round' : 'square',\n\t\t\t\t\ttransform: matrix\n\t\t\t\t})\n\t\t\t)\n\t\t\t.join('') +\n\t\textraLine +\n\t\t(clipPathId ? '</g>' : '')\n\t);\n}\n","export function stringFromCode(code: string): string {\n\tcode = code.replace('U+', '0x');\n\n\treturn String.fromCodePoint(Number(code));\n}\n\nexport const Space = stringFromCode('U+0020');\nexport const Tab = stringFromCode('U+0009');\nexport const HorizontalEllipsis = stringFromCode('U+2026');\n","import { FontEngine } from '../font.js';\nimport { segment } from '../utils.js';\n\nexport function genMeasurer(\n\tengine: FontEngine,\n\tisImage: (grapheme: string) => boolean,\n\tstyle: {\n\t\tfontSize: number;\n\t\tletterSpacing: number;\n\t}\n): {\n\tmeasureGrapheme: (grapheme: string) => number;\n\tmeasureGraphemeArray: (graphemes: string[]) => number;\n\tmeasureText: (text: string) => number;\n} {\n\tconst { fontSize, letterSpacing } = style;\n\n\tconst cache = new Map<string, number>();\n\n\tfunction measureGrapheme(grapheme: string): number {\n\t\tlet width = cache.get(grapheme);\n\n\t\tif (width === undefined) {\n\t\t\twidth = engine.measure(grapheme, { fontSize, letterSpacing });\n\t\t\tcache.set(grapheme, width);\n\t\t}\n\n\t\treturn width;\n\t}\n\n\tfunction measureGraphemeArray(graphemes: string[]): number {\n\t\tlet width = 0;\n\n\t\tfor (const grapheme of graphemes) {\n\t\t\tif (isImage(grapheme)) {\n\t\t\t\twidth += fontSize;\n\t\t\t} else {\n\t\t\t\twidth += measureGrapheme(grapheme);\n\t\t\t}\n\t\t}\n\n\t\treturn width;\n\t}\n\n\tfunction measureText(text: string): number {\n\t\treturn measureGraphemeArray(segment(text, 'grapheme'));\n\t}\n\n\treturn {\n\t\tmeasureGrapheme,\n\t\tmeasureGraphemeArray,\n\t\tmeasureText\n\t};\n}\n","import { Locale } from '../language.js';\nimport { isNumber, segment, splitByBreakOpportunities } from '../utils.js';\nimport { HorizontalEllipsis, Space } from './characters.js';\nimport { SerializedStyle } from '../handler/expand.js';\n\nexport function preprocess(\n\tcontent: string,\n\tstyle: SerializedStyle,\n\tlocale?: Locale\n): {\n\twords: string[];\n\trequiredBreaks: boolean[];\n\tallowSoftWrap: boolean;\n\tallowBreakWord: boolean;\n\tprocessedContent: string;\n\tshouldCollapseTabsAndSpaces: boolean;\n\tlineLimit: number;\n\tblockEllipsis: string;\n} {\n\tconst { textTransform, whiteSpace, wordBreak } = style;\n\n\tcontent = processTextTransform(content, textTransform, locale);\n\n\tconst {\n\t\tcontent: processedContent,\n\t\tshouldCollapseTabsAndSpaces,\n\t\tallowSoftWrap\n\t} = processWhiteSpace(content, whiteSpace);\n\n\tconst { words, requiredBreaks, allowBreakWord } = processWordBreak(\n\t\tprocessedContent,\n\t\twordBreak\n\t);\n\n\tconst [lineLimit, blockEllipsis] = processTextOverflow(\n\t\tstyle,\n\t\tallowSoftWrap\n\t);\n\n\treturn {\n\t\twords,\n\t\trequiredBreaks,\n\t\tallowSoftWrap,\n\t\tallowBreakWord,\n\t\tprocessedContent,\n\t\tshouldCollapseTabsAndSpaces,\n\t\tlineLimit,\n\t\tblockEllipsis\n\t};\n}\n\nfunction processTextTransform(\n\tcontent: string,\n\ttextTransform: string,\n\tlocale?: Locale\n): string {\n\tif (textTransform === 'uppercase') {\n\t\tcontent = content.toLocaleUpperCase(locale);\n\t} else if (textTransform === 'lowercase') {\n\t\tcontent = content.toLocaleLowerCase(locale);\n\t} else if (textTransform === 'capitalize') {\n\t\tcontent = segment(content, 'word', locale)\n\t\t\t// For each word...\n\t\t\t.map(word => {\n\t\t\t\t// ...split into graphemes...\n\t\t\t\treturn segment(word, 'grapheme', locale)\n\t\t\t\t\t.map((grapheme, index) => {\n\t\t\t\t\t\t// ...and make the first grapheme uppercase\n\t\t\t\t\t\treturn index === 0\n\t\t\t\t\t\t\t? grapheme.toLocaleUpperCase(locale)\n\t\t\t\t\t\t\t: grapheme;\n\t\t\t\t\t})\n\t\t\t\t\t.join('');\n\t\t\t})\n\t\t\t.join('');\n\t}\n\n\treturn content;\n}\n\nfunction processTextOverflow(\n\tstyle: SerializedStyle,\n\tallowSoftWrap: boolean\n): [number, string?] {\n\tconst {\n\t\ttextOverflow,\n\t\tlineClamp,\n\t\tWebkitLineClamp,\n\t\tWebkitBoxOrient,\n\t\toverflow,\n\t\tdisplay\n\t} = style;\n\n\tif (display === 'block' && lineClamp) {\n\t\tconst [lineLimit, blockEllipsis = HorizontalEllipsis] =\n\t\t\tparseLineClamp(lineClamp);\n\t\tif (lineLimit) {\n\t\t\treturn [lineLimit, blockEllipsis];\n\t\t}\n\t}\n\n\tif (\n\t\ttextOverflow === 'ellipsis' &&\n\t\tdisplay === '-webkit-box' &&\n\t\tWebkitBoxOrient === 'vertical' &&\n\t\tisNumber(WebkitLineClamp) &&\n\t\tWebkitLineClamp > 0\n\t) {\n\t\treturn [WebkitLineClamp, HorizontalEllipsis];\n\t}\n\n\tif (\n\t\ttextOverflow === 'ellipsis' &&\n\t\toverflow === 'hidden' &&\n\t\t!allowSoftWrap\n\t) {\n\t\treturn [1, HorizontalEllipsis];\n\t}\n\n\treturn [Infinity];\n}\n\nfunction processWordBreak(\n\tcontent,\n\twordBreak: string\n): { words: string[]; requiredBreaks: boolean[]; allowBreakWord: boolean } {\n\tconst allowBreakWord = ['break-all', 'break-word'].includes(wordBreak);\n\n\tconst { words, requiredBreaks } = splitByBreakOpportunities(\n\t\tcontent,\n\t\twordBreak\n\t);\n\n\treturn { words, requiredBreaks, allowBreakWord };\n}\n\nfunction processWhiteSpace(\n\tcontent: string,\n\twhiteSpace: string\n): {\n\tcontent: string;\n\tshouldCollapseTabsAndSpaces: boolean;\n\tallowSoftWrap: boolean;\n} {\n\tconst shouldKeepLinebreak = ['pre', 'pre-wrap', 'pre-line'].includes(\n\t\twhiteSpace\n\t);\n\n\tconst shouldCollapseTabsAndSpaces = [\n\t\t'normal',\n\t\t'nowrap',\n\t\t'pre-line'\n\t].includes(whiteSpace);\n\n\tconst allowSoftWrap = !['pre', 'nowrap'].includes(whiteSpace);\n\n\tif (!shouldKeepLinebreak) {\n\t\tcontent = content.replace(/\\n/g, Space);\n\t}\n\n\tif (shouldCollapseTabsAndSpaces) {\n\t\tcontent = content\n\t\t\t.replace(/([ ]|\\t)+/g, Space)\n\t\t\t.replace(/^[ ]|[ ]$/g, '');\n\t}\n\n\treturn { content, shouldCollapseTabsAndSpaces, allowSoftWrap };\n}\n\nfunction parseLineClamp(input: number | string): [number?, string?] {\n\tif (typeof input === 'number') return [input];\n\n\tconst regex1 = /^(\\d+)\\s*\"(.*)\"$/;\n\tconst regex2 = /^(\\d+)\\s*'(.*)'$/;\n\tconst match1 = regex1.exec(input);\n\tconst match2 = regex2.exec(input);\n\n\tif (match1) {\n\t\tconst number = +match1[1];\n\t\tconst text = match1[2];\n\n\t\treturn [number, text];\n\t} else if (match2) {\n\t\tconst number = +match2[1];\n\t\tconst text = match2[2];\n\n\t\treturn [number, text];\n\t}\n\n\treturn [];\n}\n","/**\n * This module calculates the layout of a text string. Currently the only\n * supported inline node is text. All other nodes are using block layout.\n */\nimport type { LayoutContext } from '../layout.js';\nimport {\n\tv,\n\tsegment,\n\twordSeparators,\n\tbuildXMLString,\n\tisUndefined,\n\tisString,\n\tlengthToNumber\n} from '../utils.js';\nimport { getYoga, TYoga, YogaNode } from '../yoga.js';\nimport buildText, { container } from '../builder/text.js';\nimport { buildDropShadow } from '../builder/shadow.js';\nimport buildDecoration from '../builder/text-decoration.js';\nimport type { GlyphBox } from '../font.js';\nimport { Locale } from '../language.js';\nimport { HorizontalEllipsis, Space, Tab } from './characters.js';\nimport { genMeasurer } from './measurer.js';\nimport { preprocess } from './processor.js';\nimport cssColorParse from 'parse-css-color';\n\nconst skippedWordWhenFindingMissingFont = new Set([Tab]);\n\nfunction shouldSkipWhenFindingMissingFont(word: string): boolean {\n\treturn skippedWordWhenFindingMissingFont.has(word);\n}\n\nfunction isFullyTransparent(color: string): boolean {\n\tif (color === 'transparent') return true;\n\tconst parsed = cssColorParse(color);\n\treturn parsed ? parsed.alpha === 0 : false;\n}\n\nfunction isOpaqueWhite(color: string): boolean {\n\tif (!color) return false;\n\tconst parsed = cssColorParse(color);\n\tif (!parsed) return false;\n\tconst [r, g, b, a] = parsed.values;\n\treturn r === 255 && g === 255 && b === 255 && (a === undefined || a === 1);\n}\n\nexport default async function* buildTextNodes(\n\tcontent: string,\n\tcontext: LayoutContext\n): AsyncGenerator<{ word: string; locale?: Locale }[], string, [any, any]> {\n\tconst Yoga = await getYoga();\n\n\tconst {\n\t\tparentStyle,\n\t\tinheritedStyle,\n\t\tparent,\n\t\tfont,\n\t\tid,\n\t\tisInheritingTransform,\n\t\tdebug,\n\t\tembedFont,\n\t\tgraphemeImages,\n\t\tlocale,\n\t\tcanLoadAdditionalAssets\n\t} = context;\n\n\tconst {\n\t\ttextAlign,\n\t\ttextIndent = 0,\n\t\tlineHeight,\n\t\ttextWrap,\n\t\tfontSize,\n\t\tfilter: cssFilter,\n\t\ttabSize = 8,\n\t\tletterSpacing,\n\t\t_inheritedBackgroundClipTextPath,\n\t\t_inheritedBackgroundClipTextHasBackground,\n\t\tflexShrink\n\t} = parentStyle;\n\n\tconst {\n\t\twords,\n\t\trequiredBreaks,\n\t\tallowSoftWrap,\n\t\tallowBreakWord,\n\t\tprocessedContent,\n\t\tshouldCollapseTabsAndSpaces,\n\t\tlineLimit,\n\t\tblockEllipsis\n\t} = preprocess(content, parentStyle, locale);\n\n\tconst textContainer = createTextContainerNode(Yoga, textAlign);\n\tparent.insertChild(textContainer, parent.getChildCount());\n\n\tif (isUndefined(flexShrink)) {\n\t\tparent.setFlexShrink(1);\n\t}\n\n\t// Get the correct font according to the container style.\n\t// https://www.w3.org/TR/CSS2/visudet.html\n\tlet engine = font.getEngine(fontSize, lineHeight, parentStyle, locale);\n\n\t// Yield segments that are missing a font.\n\tconst wordsMissingFont = canLoadAdditionalAssets\n\t\t? segment(processedContent, 'grapheme').filter(\n\t\t\t\tword =>\n\t\t\t\t\t!shouldSkipWhenFindingMissingFont(word) && !engine.has(word)\n\t\t )\n\t\t: [];\n\n\tyield wordsMissingFont.map(word => {\n\t\treturn {\n\t\t\tword,\n\t\t\tlocale\n\t\t};\n\t});\n\n\tif (wordsMissingFont.length) {\n\t\t// Reload the engine with additional fonts.\n\t\tengine = font.getEngine(fontSize, lineHeight, parentStyle, locale);\n\t}\n\n\tfunction isImage(s: string): boolean {\n\t\treturn !!(graphemeImages && graphemeImages[s]);\n\t}\n\n\tconst { measureGrapheme, measureGraphemeArray, measureText } = genMeasurer(\n\t\tengine,\n\t\tisImage,\n\t\t{\n\t\t\tfontSize,\n\t\t\tletterSpacing\n\t\t}\n\t);\n\n\tconst tabWidth = isString(tabSize)\n\t\t? lengthToNumber(tabSize, fontSize, 1, parentStyle)\n\t\t: measureGrapheme(Space) * tabSize;\n\n\tconst calc = (\n\t\ttext: string,\n\t\tcurrentWidth: number\n\t): {\n\t\toriginWidth: number;\n\t\tendingSpacesWidth: number;\n\t\ttext: string;\n\t} => {\n\t\tif (text.length === 0) {\n\t\t\treturn {\n\t\t\t\toriginWidth: 0,\n\t\t\t\tendingSpacesWidth: 0,\n\t\t\t\ttext\n\t\t\t};\n\t\t}\n\n\t\tconst { index, tabCount } = detectTabs(text);\n\n\t\tlet originWidth = 0;\n\n\t\tif (tabCount > 0) {\n\t\t\tconst textBeforeTab = text.slice(0, index);\n\t\t\tconst textAfterTab = text.slice(index + tabCount);\n\t\t\tconst textWidthBeforeTab = measureText(textBeforeTab);\n\t\t\tconst offsetBeforeTab = textWidthBeforeTab + currentWidth;\n\t\t\tconst tabMoveDistance =\n\t\t\t\ttabWidth === 0\n\t\t\t\t\t? textWidthBeforeTab\n\t\t\t\t\t: (Math.floor(offsetBeforeTab / tabWidth) + tabCount) *\n\t\t\t\t\t tabWidth;\n\t\t\toriginWidth = tabMoveDistance + measureText(textAfterTab);\n\t\t} else {\n\t\t\toriginWidth = measureText(text);\n\t\t}\n\n\t\tconst afterTrimEndWidth =\n\t\t\ttext.trimEnd() === text ? originWidth : measureText(text.trimEnd());\n\n\t\treturn {\n\t\t\toriginWidth,\n\t\t\tendingSpacesWidth: originWidth - afterTrimEndWidth,\n\t\t\ttext\n\t\t};\n\t};\n\n\t// Global variables used to compute the text layout.\n\t// @TODO: Use segments instead of words to properly support kerning.\n\tlet lineWidths = [];\n\tlet baselines = [];\n\tlet lineSegmentNumber = [];\n\tlet texts: string[] = [];\n\tlet wordPositionInLayout: (null | {\n\t\tx: number;\n\t\ty: number;\n\t\twidth: number;\n\t\tline: number;\n\t\tlineIndex: number;\n\t\tisImage: boolean;\n\t})[] = [];\n\n\t// With the given container width, compute the text layout.\n\tfunction flow(width: number) {\n\t\tlet lines = 0;\n\t\tlet maxWidth = 0;\n\t\tlet lineIndex = -1;\n\t\tlet height = 0;\n\t\tlet currentWidth = 0;\n\t\tlet currentLineHeight = 0;\n\t\tlet currentBaselineOffset = 0;\n\n\t\tlineWidths = [];\n\t\tlineSegmentNumber = [0];\n\t\ttexts = [];\n\t\twordPositionInLayout = [];\n\n\t\t// We naively implement the width calculation without proper kerning.\n\t\t// @TODO: Support different writing modes.\n\t\t// @TODO: Support RTL languages.\n\t\tlet i = 0;\n\t\tlet prevLineEndingSpacesWidth = 0;\n\t\twhile (i < words.length && lines < lineLimit) {\n\t\t\tlet word = words[i];\n\t\t\tconst forceBreak = requiredBreaks[i];\n\n\t\t\tlet w = 0;\n\n\t\t\tconst {\n\t\t\t\toriginWidth,\n\t\t\t\tendingSpacesWidth,\n\t\t\t\ttext: _word\n\t\t\t} = calc(word, currentWidth);\n\t\t\tword = _word;\n\n\t\t\tw = originWidth;\n\t\t\tconst lineEndingSpacesWidth = endingSpacesWidth;\n\n\t\t\t// When starting a new line from an empty line, we should push one extra\n\t\t\t// line height.\n\t\t\tif (forceBreak && currentLineHeight === 0) {\n\t\t\t\tcurrentLineHeight = engine.height(word);\n\t\t\t}\n\n\t\t\tconst allowedToJustify = textAlign === 'justify';\n\n\t\t\tconst willWrap =\n\t\t\t\ti &&\n\t\t\t\t// When determining whether a line break is necessary, the width of the\n\t\t\t\t// trailing spaces is not included in the calculation, as the end boundary\n\t\t\t\t// can be closely adjacent to the last non-space character.\n\t\t\t\t// e.g.\n\t\t\t\t// 'aaa bbb ccc'\n\t\t\t\t// When the break line happens at the end of the `bbb`, what we see looks like this\n\t\t\t\t// |aaa bbb|\n\t\t\t\t// |ccc |\n\t\t\t\tcurrentWidth + w > width + lineEndingSpacesWidth &&\n\t\t\t\tallowSoftWrap;\n\n\t\t\t// Need to break the word if:\n\t\t\t// - we have break-word\n\t\t\t// - the word is wider than the container width\n\t\t\t// - the word will be put at the beginning of the line\n\t\t\tconst needToBreakWord =\n\t\t\t\tallowBreakWord &&\n\t\t\t\tw > width &&\n\t\t\t\t(!currentWidth || willWrap || forceBreak);\n\n\t\t\tif (needToBreakWord) {\n\t\t\t\t// Break the word into multiple segments and continue the loop.\n\t\t\t\tconst chars = segment(word, 'grapheme');\n\t\t\t\twords.splice(i, 1, ...chars);\n\t\t\t\tif (currentWidth > 0) {\n\t\t\t\t\t// Start a new line, spaces can be ignored.\n\t\t\t\t\tlineWidths.push(currentWidth - prevLineEndingSpacesWidth);\n\t\t\t\t\tbaselines.push(currentBaselineOffset);\n\t\t\t\t\tlines++;\n\t\t\t\t\theight += currentLineHeight;\n\t\t\t\t\tcurrentWidth = 0;\n\t\t\t\t\tcurrentLineHeight = 0;\n\t\t\t\t\tcurrentBaselineOffset = 0;\n\t\t\t\t\tlineSegmentNumber.push(1);\n\t\t\t\t\tlineIndex = -1;\n\t\t\t\t}\n\t\t\t\tprevLineEndingSpacesWidth = lineEndingSpacesWidth;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (forceBreak || willWrap) {\n\t\t\t\t// Start a new line, spaces can be ignored.\n\t\t\t\tif (shouldCollapseTabsAndSpaces && word === Space) {\n\t\t\t\t\tw = 0;\n\t\t\t\t}\n\n\t\t\t\tlineWidths.push(currentWidth - prevLineEndingSpacesWidth);\n\t\t\t\tbaselines.push(currentBaselineOffset);\n\t\t\t\tlines++;\n\t\t\t\theight += currentLineHeight;\n\t\t\t\tcurrentWidth = w;\n\t\t\t\tcurrentLineHeight = w ? Math.round(engine.height(word)) : 0;\n\t\t\t\tcurrentBaselineOffset = w\n\t\t\t\t\t? Math.round(engine.baseline(word))\n\t\t\t\t\t: 0;\n\t\t\t\tlineSegmentNumber.push(1);\n\t\t\t\tlineIndex = -1;\n\n\t\t\t\t// If it's naturally broken, we update the max width.\n\t\t\t\t// Since if there are multiple lines, the width should fit the\n\t\t\t\t// container.\n\t\t\t\tif (!forceBreak) {\n\t\t\t\t\tmaxWidth = Math.max(maxWidth, width);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// It fits into the current line.\n\t\t\t\tcurrentWidth += w;\n\t\t\t\tconst glyphHeight = Math.round(engine.height(word));\n\t\t\t\tif (glyphHeight > currentLineHeight) {\n\t\t\t\t\t// Use the baseline of the highest segment as the baseline of the line.\n\t\t\t\t\tcurrentLineHeight = glyphHeight;\n\t\t\t\t\tcurrentBaselineOffset = Math.round(engine.baseline(word));\n\t\t\t\t}\n\t\t\t\tif (allowedToJustify) {\n\t\t\t\t\tlineSegmentNumber[lineSegmentNumber.length - 1]++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (allowedToJustify) {\n\t\t\t\tlineIndex++;\n\t\t\t}\n\n\t\t\tmaxWidth = Math.max(maxWidth, currentWidth);\n\n\t\t\tlet x = currentWidth - w;\n\n\t\t\tif (w === 0) {\n\t\t\t\twordPositionInLayout.push({\n\t\t\t\t\ty: height,\n\t\t\t\t\tx,\n\t\t\t\t\twidth: 0,\n\t\t\t\t\tline: lines,\n\t\t\t\t\tlineIndex,\n\t\t\t\t\tisImage: false\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst _texts = segment(word, 'word');\n\n\t\t\t\tfor (let j = 0; j < _texts.length; j++) {\n\t\t\t\t\tconst _text = _texts[j];\n\t\t\t\t\tlet _width = 0;\n\t\t\t\t\tlet _isImage = false;\n\n\t\t\t\t\tif (isImage(_text)) {\n\t\t\t\t\t\t_width = fontSize;\n\t\t\t\t\t\t_isImage = true;\n\t\t\t\t\t} else if (!embedFont && _text.length > 1) {\n\t\t\t\t\t\t// When embedFont is false, use measureText for multi-character strings\n\t\t\t\t\t\t// to ensure consistency with how currentWidth is accumulated (sum of\n\t\t\t\t\t\t// grapheme widths). measureGrapheme uses getAdvanceWidth which includes\n\t\t\t\t\t\t// kerning, causing position mismatches between consecutive <text> elements.\n\t\t\t\t\t\t_width = measureText(_text);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_width = measureGrapheme(_text);\n\t\t\t\t\t}\n\n\t\t\t\t\ttexts.push(_text);\n\t\t\t\t\twordPositionInLayout.push({\n\t\t\t\t\t\ty: height,\n\t\t\t\t\t\tx,\n\t\t\t\t\t\twidth: _width,\n\t\t\t\t\t\tline: lines,\n\t\t\t\t\t\tlineIndex,\n\t\t\t\t\t\tisImage: _isImage\n\t\t\t\t\t});\n\n\t\t\t\t\tx += _width;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ti++;\n\t\t\tprevLineEndingSpacesWidth = lineEndingSpacesWidth;\n\t\t}\n\n\t\tif (currentWidth) {\n\t\t\tif (lines < lineLimit) {\n\t\t\t\theight += currentLineHeight;\n\t\t\t}\n\t\t\tlines++;\n\t\t\tlineWidths.push(currentWidth);\n\t\t\tbaselines.push(currentBaselineOffset);\n\t\t}\n\n\t\t// @TODO: Support `line-height`.\n\t\treturn { width: maxWidth, height };\n\t}\n\n\t// It's possible that the text's measured size is different from the container's\n\t// size, because the container might have a fixed width or height or being\n\t// expanded by its parent.\n\tlet measuredTextSize = { width: 0, height: 0 };\n\ttextContainer.setMeasureFunc(containerWidth => {\n\t\tconst { width, height } = flow(containerWidth);\n\n\t\t// When doing `text-wrap: balance`, we reflow the text multiple times\n\t\t// using binary search to find the best width.\n\t\t// https://www.w3.org/TR/css-text-4/#valdef-text-wrap-balance\n\t\tif (textWrap === 'balance') {\n\t\t\tlet l = width / 2;\n\t\t\tlet r = width;\n\t\t\tlet m: number = width;\n\t\t\twhile (l + 1 < r) {\n\t\t\t\tm = (l + r) / 2;\n\t\t\t\tconst { height: mHeight } = flow(m);\n\t\t\t\tif (mHeight > height) {\n\t\t\t\t\tl = m;\n\t\t\t\t} else {\n\t\t\t\t\tr = m;\n\t\t\t\t}\n\t\t\t}\n\t\t\tflow(r);\n\t\t\tconst _width = Math.ceil(r);\n\t\t\tmeasuredTextSize = { width: _width, height };\n\t\t\treturn { width: _width, height };\n\t\t}\n\n\t\t// When doing `text-wrap: pretty`, we try to avoid ending a paragraph with a single word\n\t\t// by reshaping all lines in a way that achieves more balanced line lengths\n\t\t// This \"pretty\" line breaking algorithm tries to achieve optimal line breaks\n\t\t// that avoid orphans (single words at the end of a paragraph) and create\n\t\t// visually pleasing line lengths.\n\t\tif (textWrap === 'pretty') {\n\t\t\t// Check if the last line has a single word or is very short\n\t\t\t// (typically less than 1/3 of the container width)\n\t\t\tconst lastLineWidth = lineWidths[lineWidths.length - 1];\n\t\t\tconst isLastLineShort = lastLineWidth < width / 3;\n\n\t\t\tif (isLastLineShort) {\n\t\t\t\t// Reflow the paragraph with slightly adjusted line breaks\n\t\t\t\t// to avoid orphans and create more even line lengths\n\t\t\t\t// This is a simplified approach - a real implementation would use a\n\t\t\t\t// more sophisticated algorithm to find optimal line breaks\n\n\t\t\t\t// We'll just reflow once with slightly reduced width to force\n\t\t\t\t// redistribution of words. This is much simplified from the actual\n\t\t\t\t// paragraph-level line breaking algorithm which would compute scores\n\t\t\t\t// for different line break combinations.\n\t\t\t\tconst adjustedWidth = width * 0.9;\n\t\t\t\tconst result = flow(adjustedWidth);\n\n\t\t\t\t// Use the result if it reduces orphans without adding too many lines\n\t\t\t\tif (result.height <= height * 1.3) {\n\t\t\t\t\tmeasuredTextSize = { width, height: result.height };\n\t\t\t\t\treturn { width, height: result.height };\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst _width = Math.ceil(width);\n\t\tmeasuredTextSize = { width: _width, height };\n\t\t// This may be a temporary fix, I didn't dig deep into yoga.\n\t\t// But when the return value of width here doesn't change (assuming the value of width is 216.9),\n\t\t// when we later get the width through `parent.getComputedWidth()`, sometimes it returns 216 and sometimes 217.\n\t\t// I'm not sure if this is a yoga bug, but it seems related to the entire page width.\n\t\t// So I use Math.ceil.\n\t\treturn { width: _width, height };\n\t});\n\n\tconst [x, y] = yield;\n\n\tlet result = '';\n\tlet backgroundClipDef = '';\n\n\tconst clipPathId = inheritedStyle._inheritedClipPathId as\n\t\t| string\n\t\t| undefined;\n\tconst overflowMaskId = inheritedStyle._inheritedMaskId as\n\t\t| number\n\t\t| undefined;\n\n\tconst {\n\t\tleft: containerLeft,\n\t\ttop: containerTop,\n\t\twidth: containerWidth,\n\t\theight: containerHeight\n\t} = textContainer.getComputedLayout();\n\n\t// Convert textIndent to number if it's a string (e.g., percentage)\n\tconst textIndentNumber =\n\t\ttypeof textIndent === 'string'\n\t\t\t? lengthToNumber(\n\t\t\t\t\ttextIndent,\n\t\t\t\t\tfontSize,\n\t\t\t\t\tcontainerWidth,\n\t\t\t\t\tparentStyle,\n\t\t\t\t\ttrue\n\t\t\t ) || 0\n\t\t\t: textIndent;\n\n\tconst parentContainerInnerWidth =\n\t\tparent.getComputedWidth() -\n\t\tparent.getComputedPadding(Yoga.EDGE_LEFT) -\n\t\tparent.getComputedPadding(Yoga.EDGE_RIGHT) -\n\t\tparent.getComputedBorder(Yoga.EDGE_LEFT) -\n\t\tparent.getComputedBorder(Yoga.EDGE_RIGHT);\n\n\t// Attach offset to the current node.\n\tconst left = x + containerLeft;\n\tconst top = y + containerTop;\n\n\tconst { matrix, opacity } = container(\n\t\t{\n\t\t\tleft: containerLeft,\n\t\t\ttop: containerTop,\n\t\t\twidth: containerWidth,\n\t\t\theight: containerHeight,\n\t\t\tisInheritingTransform\n\t\t},\n\t\tparentStyle\n\t);\n\n\tlet filter = '';\n\tif (parentStyle.textShadowOffset) {\n\t\tconst { textShadowColor, textShadowOffset, textShadowRadius } =\n\t\t\tparentStyle;\n\n\t\tfilter = buildDropShadow(\n\t\t\t{\n\t\t\t\twidth: measuredTextSize.width,\n\t\t\t\theight: measuredTextSize.height,\n\t\t\t\tid\n\t\t\t},\n\t\t\t{\n\t\t\t\tshadowColor: textShadowColor,\n\t\t\t\tshadowOffset: textShadowOffset,\n\t\t\t\tshadowRadius: textShadowRadius\n\t\t\t},\n\t\t\tisFullyTransparent(parentStyle.color) ||\n\t\t\t\t(_inheritedBackgroundClipTextHasBackground &&\n\t\t\t\t\tisOpaqueWhite(parentStyle.color))\n\t\t);\n\n\t\tfilter = buildXMLString('defs', {}, filter);\n\t}\n\n\tlet decorationShape = '';\n\tlet mergedPath = '';\n\tlet extra = '';\n\tlet skippedLine = -1;\n\ttype DecorationLine = {\n\t\tleft: number;\n\t\ttop: number;\n\t\tascender: number;\n\t\twidth: number;\n\t};\n\tlet decorationLines: Record<number, DecorationLine | null> = {};\n\tlet decorationGlyphs: Record<number, GlyphBox[]> = {};\n\tlet wordBuffer: string | null = null;\n\tlet bufferedOffset = 0;\n\n\tfor (let i = 0; i < texts.length; i++) {\n\t\t// Skip whitespace and empty characters.\n\t\tconst layout = wordPositionInLayout[i];\n\t\tconst nextLayout = wordPositionInLayout[i + 1];\n\n\t\tif (!layout) continue;\n\n\t\tlet text = texts[i];\n\t\tlet path: string | null = null;\n\t\tlet isLastDisplayedBeforeEllipsis = false;\n\n\t\tconst image = graphemeImages ? graphemeImages[text] : null;\n\n\t\tlet topOffset = layout.y;\n\t\tlet leftOffset = layout.x;\n\t\tconst width = layout.width;\n\t\tconst line = layout.line;\n\t\tconst shouldCollectDecorationBoxes =\n\t\t\tparentStyle.textDecorationLine === 'underline' &&\n\t\t\t(parentStyle.textDecorationSkipInk || 'auto') !== 'none';\n\n\t\tif (line === skippedLine) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// When `text-align` is `justify`, the width of the line will be adjusted.\n\t\tlet extendedWidth = false;\n\n\t\t// Apply text-indent to the first line (for both single and multi-line text)\n\t\tif (line === 0 && textIndentNumber !== 0) {\n\t\t\tleftOffset += textIndentNumber;\n\t\t}\n\n\t\tif (lineWidths.length > 1) {\n\t\t\t// Calculate alignment. Note that for Flexbox, there is only text\n\t\t\t// alignment when the container is multi-line.\n\t\t\tconst remainingWidth = containerWidth - lineWidths[line];\n\t\t\tif (textAlign === 'right' || textAlign === 'end') {\n\t\t\t\tleftOffset += remainingWidth;\n\t\t\t} else if (textAlign === 'center') {\n\t\t\t\tleftOffset += remainingWidth / 2;\n\t\t\t} else if (textAlign === 'justify') {\n\t\t\t\t// Don't justify the last line.\n\t\t\t\tif (line < lineWidths.length - 1) {\n\t\t\t\t\tconst segments = lineSegmentNumber[line];\n\t\t\t\t\tconst gutter =\n\t\t\t\t\t\tsegments > 1 ? remainingWidth / (segments - 1) : 0;\n\t\t\t\t\tleftOffset += gutter * layout.lineIndex;\n\t\t\t\t\textendedWidth = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Only round for embedded fonts (paths benefit from pixel alignment).\n\t\t\t// For non-embedded fonts (<text> elements), keep fractional positions\n\t\t\t// to maintain consistent spacing between consecutive elements.\n\t\t\tif (embedFont) {\n\t\t\t\tleftOffset = Math.round(leftOffset);\n\t\t\t}\n\t\t}\n\n\t\tconst baselineOfLine = baselines[line];\n\t\tconst baselineOfWord = engine.baseline(text);\n\t\tconst heightOfWord = engine.height(text);\n\t\tconst baselineDelta = baselineOfLine - baselineOfWord;\n\n\t\tconst buildUnderlineBand = (offset: number) => {\n\t\t\tif (\n\t\t\t\t!shouldCollectDecorationBoxes ||\n\t\t\t\tparentStyle.textDecorationLine !== 'underline'\n\t\t\t) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst baseline = top + offset + baselineDelta + baselineOfWord;\n\t\t\treturn {\n\t\t\t\tunderlineY: baseline + baselineOfWord * 0.1,\n\t\t\t\tstrokeWidth: Math.max(1, fontSize * 0.1)\n\t\t\t};\n\t\t};\n\n\t\tif (!decorationLines[line]) {\n\t\t\tdecorationLines[line] = {\n\t\t\t\tleft: leftOffset,\n\t\t\t\ttop: top + topOffset + baselineDelta,\n\t\t\t\tascender: baselineOfWord,\n\t\t\t\twidth: extendedWidth ? containerWidth : lineWidths[line]\n\t\t\t};\n\t\t}\n\n\t\tif (lineLimit !== Infinity) {\n\t\t\tlet _blockEllipsis = blockEllipsis;\n\t\t\tlet ellipsisWidth = measureGrapheme(blockEllipsis);\n\t\t\tif (ellipsisWidth > parentContainerInnerWidth) {\n\t\t\t\t_blockEllipsis = HorizontalEllipsis;\n\t\t\t\tellipsisWidth = measureGrapheme(_blockEllipsis);\n\t\t\t}\n\t\t\tconst spaceWidth = measureGrapheme(Space);\n\t\t\tconst isNotLastLine = line < lineWidths.length - 1;\n\t\t\tconst isLastAllowedLine = line + 1 === lineLimit;\n\n\t\t\tfunction calcEllipsis(baseWidth: number, _text: string) {\n\t\t\t\tconst chars = segment(_text, 'grapheme', locale);\n\n\t\t\t\tlet subset = '';\n\t\t\t\tlet resolvedWidth = 0;\n\n\t\t\t\tfor (const char of chars) {\n\t\t\t\t\tconst w = baseWidth + measureGraphemeArray([subset + char]);\n\t\t\t\t\tif (\n\t\t\t\t\t\t// Keep at least one character:\n\t\t\t\t\t\t// > The first character or atomic inline-level element on a line\n\t\t\t\t\t\t// must be clipped rather than ellipsed.\n\t\t\t\t\t\t// https://drafts.csswg.org/css-overflow/#text-overflow\n\t\t\t\t\t\tsubset &&\n\t\t\t\t\t\tw + ellipsisWidth > parentContainerInnerWidth\n\t\t\t\t\t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tsubset += char;\n\t\t\t\t\tresolvedWidth = w;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tsubset,\n\t\t\t\t\tresolvedWidth\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tisLastAllowedLine &&\n\t\t\t\t(isNotLastLine || lineWidths[line] > parentContainerInnerWidth)\n\t\t\t) {\n\t\t\t\tif (\n\t\t\t\t\tleftOffset + width + ellipsisWidth + spaceWidth >\n\t\t\t\t\tparentContainerInnerWidth\n\t\t\t\t) {\n\t\t\t\t\tconst { subset, resolvedWidth } = calcEllipsis(\n\t\t\t\t\t\tleftOffset,\n\t\t\t\t\t\ttext\n\t\t\t\t\t);\n\n\t\t\t\t\ttext = subset + _blockEllipsis;\n\t\t\t\t\tskippedLine = line;\n\t\t\t\t\tdecorationLines[line].width = Math.max(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tresolvedWidth - decorationLines[line].left\n\t\t\t\t\t);\n\t\t\t\t\tisLastDisplayedBeforeEllipsis = true;\n\t\t\t\t} else if (nextLayout && nextLayout.line !== line) {\n\t\t\t\t\tif (textAlign === 'center') {\n\t\t\t\t\t\tconst { subset, resolvedWidth } = calcEllipsis(\n\t\t\t\t\t\t\tleftOffset,\n\t\t\t\t\t\t\ttext\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\ttext = subset + _blockEllipsis;\n\t\t\t\t\t\tskippedLine = line;\n\t\t\t\t\t\tdecorationLines[line].width = Math.max(\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\tresolvedWidth - decorationLines[line].left\n\t\t\t\t\t\t);\n\t\t\t\t\t\tisLastDisplayedBeforeEllipsis = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst nextLineText = texts[i + 1];\n\n\t\t\t\t\t\tconst { subset, resolvedWidth } = calcEllipsis(\n\t\t\t\t\t\t\twidth + leftOffset,\n\t\t\t\t\t\t\tnextLineText\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\ttext = text + subset + _blockEllipsis;\n\t\t\t\t\t\tskippedLine = line;\n\t\t\t\t\t\tdecorationLines[line].width = Math.max(\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\tresolvedWidth - decorationLines[line].left\n\t\t\t\t\t\t);\n\t\t\t\t\t\tisLastDisplayedBeforeEllipsis = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (image) {\n\t\t\t// For images, we remove the baseline offset.\n\t\t\ttopOffset += 0;\n\t\t} else if (embedFont) {\n\t\t\t// If the current word and the next word are on the same line, we try to\n\t\t\t// merge them together to better handle the kerning.\n\t\t\tif (\n\t\t\t\t!text.includes(Tab) &&\n\t\t\t\t!wordSeparators.includes(text) &&\n\t\t\t\ttexts[i + 1] &&\n\t\t\t\tnextLayout &&\n\t\t\t\t!nextLayout.isImage &&\n\t\t\t\ttopOffset === nextLayout.y &&\n\t\t\t\t!isLastDisplayedBeforeEllipsis\n\t\t\t) {\n\t\t\t\tif (wordBuffer === null) {\n\t\t\t\t\tbufferedOffset = leftOffset;\n\t\t\t\t}\n\t\t\t\twordBuffer = wordBuffer === null ? text : wordBuffer + text;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst finalizedSegment =\n\t\t\t\twordBuffer === null ? text : wordBuffer + text;\n\t\t\tconst finalizedLeftOffset =\n\t\t\t\twordBuffer === null ? leftOffset : bufferedOffset;\n\t\t\tconst finalizedWidth =\n\t\t\t\tlayout.width + leftOffset - finalizedLeftOffset;\n\n\t\t\tconst band = buildUnderlineBand(topOffset);\n\n\t\t\tconst svg = engine.getSVG(\n\t\t\t\tfinalizedSegment.replace(/(\\t)+/g, ''),\n\t\t\t\t{\n\t\t\t\t\tfontSize,\n\t\t\t\t\tleft: left + finalizedLeftOffset,\n\t\t\t\t\t// Since we need to pass the baseline position, add the ascender to the top.\n\t\t\t\t\ttop: top + topOffset + baselineOfWord + baselineDelta,\n\t\t\t\t\tletterSpacing\n\t\t\t\t},\n\t\t\t\tband\n\t\t\t);\n\n\t\t\tpath = svg.path;\n\n\t\t\tif (shouldCollectDecorationBoxes && svg.boxes && svg.boxes.length) {\n\t\t\t\t(decorationGlyphs[line] || (decorationGlyphs[line] = [])).push(\n\t\t\t\t\t...svg.boxes\n\t\t\t\t);\n\t\t\t}\n\n\t\t\twordBuffer = null;\n\n\t\t\tif (debug) {\n\t\t\t\textra +=\n\t\t\t\t\t// Glyph\n\t\t\t\t\tbuildXMLString('rect', {\n\t\t\t\t\t\tx: left + finalizedLeftOffset,\n\t\t\t\t\t\ty: top + topOffset + baselineDelta,\n\t\t\t\t\t\twidth: finalizedWidth,\n\t\t\t\t\t\theight: heightOfWord,\n\t\t\t\t\t\tfill: 'transparent',\n\t\t\t\t\t\tstroke: '#575eff',\n\t\t\t\t\t\t'stroke-width': 1,\n\t\t\t\t\t\ttransform: matrix ? matrix : undefined,\n\t\t\t\t\t\t'clip-path': clipPathId\n\t\t\t\t\t\t\t? `url(#${clipPathId})`\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}) +\n\t\t\t\t\t// Baseline\n\t\t\t\t\tbuildXMLString('line', {\n\t\t\t\t\t\tx1: left + leftOffset,\n\t\t\t\t\t\tx2: left + leftOffset + layout.width,\n\t\t\t\t\t\ty1: top + topOffset + baselineDelta + baselineOfWord,\n\t\t\t\t\t\ty2: top + topOffset + baselineDelta + baselineOfWord,\n\t\t\t\t\t\tstroke: '#14c000',\n\t\t\t\t\t\t'stroke-width': 1,\n\t\t\t\t\t\ttransform: matrix ? matrix : undefined,\n\t\t\t\t\t\t'clip-path': clipPathId\n\t\t\t\t\t\t\t? `url(#${clipPathId})`\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\t// We need manually add the font ascender height to ensure it starts\n\t\t\t// at the baseline because <text>'s alignment baseline is set to `hanging`\n\t\t\t// by default and supported to change in SVG 1.1.\n\t\t\ttopOffset += baselineOfWord + baselineDelta;\n\n\t\t\tif (shouldCollectDecorationBoxes && !image) {\n\t\t\t\tconst band = buildUnderlineBand(topOffset);\n\n\t\t\t\tconst svg = engine.getSVG(\n\t\t\t\t\ttext.replace(/(\\t)+/g, ''),\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize,\n\t\t\t\t\t\tleft: left + leftOffset,\n\t\t\t\t\t\ttop: top + topOffset,\n\t\t\t\t\t\tletterSpacing\n\t\t\t\t\t},\n\t\t\t\t\tband\n\t\t\t\t);\n\n\t\t\t\tif (svg.boxes && svg.boxes.length) {\n\t\t\t\t\t(\n\t\t\t\t\t\tdecorationGlyphs[line] || (decorationGlyphs[line] = [])\n\t\t\t\t\t).push(...svg.boxes);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (path !== null) {\n\t\t\tmergedPath += path + ' ';\n\t\t} else {\n\t\t\tconst [t, shape] = buildText(\n\t\t\t\t{\n\t\t\t\t\tcontent: text,\n\t\t\t\t\tfilter,\n\t\t\t\t\tid,\n\t\t\t\t\tleft: left + leftOffset,\n\t\t\t\t\ttop: top + topOffset,\n\t\t\t\t\twidth,\n\t\t\t\t\theight: heightOfWord,\n\t\t\t\t\tmatrix,\n\t\t\t\t\topacity,\n\t\t\t\t\timage,\n\t\t\t\t\tclipPathId,\n\t\t\t\t\tdebug,\n\t\t\t\t\tshape: !!_inheritedBackgroundClipTextPath\n\t\t\t\t},\n\t\t\t\tparentStyle\n\t\t\t);\n\t\t\tresult += t;\n\t\t\tbackgroundClipDef += shape;\n\t\t}\n\n\t\tif (isLastDisplayedBeforeEllipsis) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (parentStyle.textDecorationLine) {\n\t\tdecorationShape = Object.entries(decorationLines)\n\t\t\t.map(([lineIndex, deco]) => {\n\t\t\t\tif (!deco) return '';\n\t\t\t\tconst glyphBoxes = decorationGlyphs[lineIndex] || [];\n\n\t\t\t\treturn buildDecoration(\n\t\t\t\t\t{\n\t\t\t\t\t\tleft: left + deco.left,\n\t\t\t\t\t\ttop: deco.top,\n\t\t\t\t\t\twidth: deco.width,\n\t\t\t\t\t\tascender: deco.ascender,\n\t\t\t\t\t\tclipPathId,\n\t\t\t\t\t\tmatrix,\n\t\t\t\t\t\tglyphBoxes\n\t\t\t\t\t},\n\t\t\t\t\tparentStyle\n\t\t\t\t);\n\t\t\t})\n\t\t\t.join('');\n\t}\n\n\t// Embed the font as path.\n\tif (mergedPath) {\n\t\tconst p =\n\t\t\t(!isFullyTransparent(parentStyle.color) || filter) && opacity !== 0\n\t\t\t\t? `<g ${\n\t\t\t\t\t\toverflowMaskId ? `mask=\"url(#${overflowMaskId})\"` : ''\n\t\t\t\t } ${clipPathId ? `clip-path=\"url(#${clipPathId})\"` : ''}>` +\n\t\t\t\t buildXMLString('path', {\n\t\t\t\t\t\tfill:\n\t\t\t\t\t\t\tfilter &&\n\t\t\t\t\t\t\t(isFullyTransparent(parentStyle.color) ||\n\t\t\t\t\t\t\t\t(_inheritedBackgroundClipTextHasBackground &&\n\t\t\t\t\t\t\t\t\tisOpaqueWhite(parentStyle.color)))\n\t\t\t\t\t\t\t\t? 'black'\n\t\t\t\t\t\t\t\t: parentStyle.color,\n\t\t\t\t\t\td: mergedPath,\n\t\t\t\t\t\ttransform: matrix ? matrix : undefined,\n\t\t\t\t\t\topacity: opacity !== 1 ? opacity : undefined,\n\t\t\t\t\t\tstyle: cssFilter ? `filter:${cssFilter}` : undefined,\n\t\t\t\t\t\t'stroke-width': inheritedStyle.WebkitTextStrokeWidth\n\t\t\t\t\t\t\t? `${inheritedStyle.WebkitTextStrokeWidth}px`\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\tstroke: inheritedStyle.WebkitTextStrokeWidth\n\t\t\t\t\t\t\t? inheritedStyle.WebkitTextStrokeColor\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t'stroke-linejoin': inheritedStyle.WebkitTextStrokeWidth\n\t\t\t\t\t\t\t? 'round'\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t'paint-order': inheritedStyle.WebkitTextStrokeWidth\n\t\t\t\t\t\t\t? 'stroke'\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t }) +\n\t\t\t\t '</g>'\n\t\t\t\t: '';\n\n\t\tif (_inheritedBackgroundClipTextPath) {\n\t\t\tbackgroundClipDef = buildXMLString('path', {\n\t\t\t\td: mergedPath,\n\t\t\t\ttransform: matrix ? matrix : undefined\n\t\t\t});\n\t\t}\n\n\t\tresult +=\n\t\t\t(filter\n\t\t\t\t? filter +\n\t\t\t\t buildXMLString(\n\t\t\t\t\t\t'g',\n\t\t\t\t\t\t{ filter: `url(#satori_s-${id})` },\n\t\t\t\t\t\tp + decorationShape\n\t\t\t\t )\n\t\t\t\t: p + decorationShape) + extra;\n\t} else if (decorationShape) {\n\t\tresult += filter\n\t\t\t? buildXMLString(\n\t\t\t\t\t'g',\n\t\t\t\t\t{ filter: `url(#satori_s-${id})` },\n\t\t\t\t\tdecorationShape\n\t\t\t )\n\t\t\t: decorationShape;\n\t}\n\n\t// Attach information to the parent node.\n\tif (backgroundClipDef) {\n\t\t(parentStyle._inheritedBackgroundClipTextPath as any).value +=\n\t\t\tbackgroundClipDef;\n\t}\n\n\treturn result;\n}\n\nfunction createTextContainerNode(Yoga: TYoga, textAlign: string): YogaNode {\n\t// Create a container node for this text fragment.\n\tconst textContainer = Yoga.Node.create();\n\ttextContainer.setAlignItems(Yoga.ALIGN_BASELINE);\n\ttextContainer.setJustifyContent(\n\t\tv(\n\t\t\ttextAlign,\n\t\t\t{\n\t\t\t\tleft: Yoga.JUSTIFY_FLEX_START,\n\t\t\t\tright: Yoga.JUSTIFY_FLEX_END,\n\t\t\t\tcenter: Yoga.JUSTIFY_CENTER,\n\t\t\t\tjustify: Yoga.JUSTIFY_SPACE_BETWEEN,\n\t\t\t\t// We don't have other writing modes yet.\n\t\t\t\tstart: Yoga.JUSTIFY_FLEX_START,\n\t\t\t\tend: Yoga.JUSTIFY_FLEX_END\n\t\t\t},\n\t\t\tYoga.JUSTIFY_FLEX_START,\n\t\t\t'textAlign'\n\t\t)\n\t);\n\n\treturn textContainer;\n}\n\nfunction detectTabs(text: string):\n\t| {\n\t\t\tindex: null;\n\t\t\ttabCount: 0;\n\t }\n\t| {\n\t\t\tindex: number;\n\t\t\ttabCount: number;\n\t } {\n\tconst result = /(\\t)+/.exec(text);\n\treturn result\n\t\t? {\n\t\t\t\tindex: result.index,\n\t\t\t\ttabCount: result[0].length\n\t\t }\n\t\t: {\n\t\t\t\tindex: null,\n\t\t\t\ttabCount: 0\n\t\t };\n}\n","import { parseLinearGradient, ColorStop } from 'css-gradient-parser';\nimport { normalizeStops } from './utils.js';\nimport { buildXMLString, calcDegree, lengthToNumber } from '../../utils.js';\n\nexport function buildLinearGradient(\n\t{\n\t\tid,\n\t\twidth,\n\t\theight,\n\t\trepeatX,\n\t\trepeatY\n\t}: {\n\t\tid: string;\n\t\twidth: number;\n\t\theight: number;\n\t\trepeatX: boolean;\n\t\trepeatY: boolean;\n\t},\n\timage: string,\n\tdimensions: number[],\n\toffsets: number[],\n\tinheritableStyle: Record<string, number | string>,\n\tfrom?: 'background' | 'mask'\n) {\n\tconst parsed = parseLinearGradient(image);\n\tconst [imageWidth, imageHeight] = dimensions;\n\tconst repeating = image.startsWith('repeating');\n\n\t// Calculate the direction.\n\tlet points, length, xys;\n\n\tif (parsed.orientation.type === 'directional') {\n\t\tpoints = resolveXYFromDirection(parsed.orientation.value);\n\n\t\tlength = Math.sqrt(\n\t\t\tMath.pow((points.x2 - points.x1) * imageWidth, 2) +\n\t\t\t\tMath.pow((points.y2 - points.y1) * imageHeight, 2)\n\t\t);\n\t} else if (parsed.orientation.type === 'angular') {\n\t\tconst { length: l, ...p } = calcNormalPoint(\n\t\t\t(calcDegree(\n\t\t\t\t`${parsed.orientation.value.value}${parsed.orientation.value.unit}`\n\t\t\t) /\n\t\t\t\t180) *\n\t\t\t\tMath.PI,\n\t\t\timageWidth,\n\t\t\timageHeight\n\t\t);\n\n\t\tlength = l;\n\t\tpoints = p;\n\t}\n\n\txys = repeating\n\t\t? calcPercentage(parsed.stops, length, points, inheritableStyle)\n\t\t: points;\n\n\tconst stops = normalizeStops(\n\t\trepeating ? resolveRepeatingCycle(parsed.stops, length) : length,\n\t\tparsed.stops,\n\t\tinheritableStyle,\n\t\trepeating,\n\t\tfrom\n\t);\n\n\tconst gradientId = `satori_bi${id}`;\n\tconst patternId = `satori_pattern_${id}`;\n\n\tconst defs = buildXMLString(\n\t\t'pattern',\n\t\t{\n\t\t\tid: patternId,\n\t\t\tx: offsets[0] / width,\n\t\t\ty: offsets[1] / height,\n\t\t\twidth: repeatX ? imageWidth / width : '1',\n\t\t\theight: repeatY ? imageHeight / height : '1',\n\t\t\tpatternUnits: 'objectBoundingBox'\n\t\t},\n\t\tbuildXMLString(\n\t\t\t'linearGradient',\n\t\t\t{\n\t\t\t\tid: gradientId,\n\t\t\t\t...xys,\n\t\t\t\tspreadMethod: repeating ? 'repeat' : 'pad'\n\t\t\t},\n\t\t\tstops\n\t\t\t\t.map(stop =>\n\t\t\t\t\tbuildXMLString('stop', {\n\t\t\t\t\t\toffset: (stop.offset ?? 0) * 100 + '%',\n\t\t\t\t\t\t'stop-color': stop.color\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t\t.join('')\n\t\t) +\n\t\t\tbuildXMLString('rect', {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\twidth: imageWidth,\n\t\t\t\theight: imageHeight,\n\t\t\t\tfill: `url(#${gradientId})`\n\t\t\t})\n\t);\n\treturn [patternId, defs];\n}\n\nfunction resolveRepeatingCycle(stops: ColorStop[], length: number) {\n\tconst last = stops[stops.length - 1];\n\tconst { offset } = last;\n\tif (!offset) return length;\n\n\tif (offset.unit === '%') return (Number(offset.value) / 100) * length;\n\n\treturn Number(offset.value);\n}\n\nfunction resolveXYFromDirection(dir: string) {\n\tlet x1 = 0,\n\t\ty1 = 0,\n\t\tx2 = 0,\n\t\ty2 = 0;\n\n\tif (dir.includes('top')) {\n\t\ty1 = 1;\n\t} else if (dir.includes('bottom')) {\n\t\ty2 = 1;\n\t}\n\n\tif (dir.includes('left')) {\n\t\tx1 = 1;\n\t} else if (dir.includes('right')) {\n\t\tx2 = 1;\n\t}\n\n\tif (!x1 && !x2 && !y1 && !y2) {\n\t\ty1 = 1;\n\t}\n\n\treturn { x1, y1, x2, y2 };\n}\n\n/**\n * calc start point and end point of linear gradient\n */\nfunction calcNormalPoint(v: number, w: number, h: number) {\n\tconst r = Math.pow(h / w, 2);\n\n\t// make sure angle is 0 <= angle <= 360\n\tv = ((v % (Math.PI * 2)) + Math.PI * 2) % (Math.PI * 2);\n\n\tlet x1, y1, x2, y2, length, tmp, a, b;\n\n\tconst dfs = (angle: number) => {\n\t\tif (angle === 0) {\n\t\t\tx1 = 0;\n\t\t\ty1 = h;\n\t\t\tx2 = 0;\n\t\t\ty2 = 0;\n\t\t\tlength = h;\n\t\t\treturn;\n\t\t} else if (angle === Math.PI / 2) {\n\t\t\tx1 = 0;\n\t\t\ty1 = 0;\n\t\t\tx2 = w;\n\t\t\ty2 = 0;\n\t\t\tlength = w;\n\t\t\treturn;\n\t\t}\n\t\tif (angle > 0 && angle < Math.PI / 2) {\n\t\t\tx1 =\n\t\t\t\t((r * w) / 2 / Math.tan(angle) - h / 2) /\n\t\t\t\t(Math.tan(angle) + r / Math.tan(angle));\n\t\t\ty1 = Math.tan(angle) * x1 + h;\n\t\t\tx2 = Math.abs(w / 2 - x1) + w / 2;\n\t\t\ty2 = h / 2 - Math.abs(y1 - h / 2);\n\t\t\tlength = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));\n\t\t\t// y = -1 / tan * x = h / 2 +1 / tan * w/2\n\t\t\t// y = tan * x + h\n\t\t\ta =\n\t\t\t\t(w / 2 / Math.tan(angle) - h / 2) /\n\t\t\t\t(Math.tan(angle) + 1 / Math.tan(angle));\n\t\t\tb = Math.tan(angle) * a + h;\n\t\t\tlength =\n\t\t\t\t2 * Math.sqrt(Math.pow(w / 2 - a, 2) + Math.pow(h / 2 - b, 2));\n\t\t\treturn;\n\t\t} else if (angle > Math.PI / 2 && angle < Math.PI) {\n\t\t\tx1 =\n\t\t\t\t(h / 2 + (r * w) / 2 / Math.tan(angle)) /\n\t\t\t\t(Math.tan(angle) + r / Math.tan(angle));\n\t\t\ty1 = Math.tan(angle) * x1;\n\t\t\tx2 = Math.abs(w / 2 - x1) + w / 2;\n\t\t\ty2 = h / 2 + Math.abs(y1 - h / 2);\n\t\t\t// y = -1 / tan * x + h / 2 + 1 / tan * w / 2\n\t\t\t// y = tan * x\n\t\t\ta =\n\t\t\t\t(w / 2 / Math.tan(angle) + h / 2) /\n\t\t\t\t(Math.tan(angle) + 1 / Math.tan(angle));\n\t\t\tb = Math.tan(angle) * a;\n\t\t\tlength =\n\t\t\t\t2 * Math.sqrt(Math.pow(w / 2 - a, 2) + Math.pow(h / 2 - b, 2));\n\t\t\treturn;\n\t\t} else if (angle >= Math.PI) {\n\t\t\tdfs(angle - Math.PI);\n\n\t\t\ttmp = x1;\n\t\t\tx1 = x2;\n\t\t\tx2 = tmp;\n\t\t\ttmp = y1;\n\t\t\ty1 = y2;\n\t\t\ty2 = tmp;\n\t\t}\n\t};\n\n\tdfs(v);\n\n\treturn {\n\t\tx1: x1 / w,\n\t\ty1: y1 / h,\n\t\tx2: x2 / w,\n\t\ty2: y2 / h,\n\t\tlength\n\t};\n}\n\nfunction calcPercentage(\n\tstops: ColorStop[],\n\tlength: number,\n\tpoints: {\n\t\tx1: number;\n\t\ty1: number;\n\t\tx2: number;\n\t\ty2: number;\n\t},\n\tinheritableStyle: Record<string, string | number>\n) {\n\tconst { x1, x2, y1, y2 } = points;\n\tconst p1 = !stops[0].offset\n\t\t? 0\n\t\t: stops[0].offset.unit === '%'\n\t\t? Number(stops[0].offset.value) / 100\n\t\t: lengthToNumber(\n\t\t\t\t`${stops[0].offset.value}${stops[0].offset.unit}`,\n\t\t\t\tinheritableStyle.fontSize as number,\n\t\t\t\tlength,\n\t\t\t\tinheritableStyle,\n\t\t\t\ttrue\n\t\t ) / length;\n\tconst p2 = !stops.at(-1).offset\n\t\t? 1\n\t\t: stops.at(-1).offset.unit === '%'\n\t\t? Number(stops.at(-1).offset.value) / 100\n\t\t: lengthToNumber(\n\t\t\t\t`${stops.at(-1).offset.value}${stops.at(-1).offset.unit}`,\n\t\t\t\tinheritableStyle.fontSize as number,\n\t\t\t\tlength,\n\t\t\t\tinheritableStyle,\n\t\t\t\ttrue\n\t\t ) / length;\n\n\tconst sx = (x2 - x1) * p1 + x1;\n\tconst sy = (y2 - y1) * p1 + y1;\n\tconst ex = (x2 - x1) * p2 + x1;\n\tconst ey = (y2 - y1) * p2 + y1;\n\n\treturn {\n\t\tx1: sx,\n\t\ty1: sy,\n\t\tx2: ex,\n\t\ty2: ey\n\t};\n}\n","import { lengthToNumber } from '../../utils.js';\nimport cssColorParse from 'parse-css-color';\nimport type { ColorStop } from 'css-gradient-parser';\n\ninterface Stop {\n\tcolor: string;\n\toffset?: number;\n}\n\nexport function normalizeStops(\n\ttotalLength: number,\n\tcolorStops: ColorStop[],\n\tinheritedStyle: Record<string, string | number>,\n\trepeating: boolean,\n\tfrom?: 'background' | 'mask'\n) {\n\t// Resolve the color stops based on the spec:\n\t// https://drafts.csswg.org/css-images/#color-stop-syntax\n\tconst stops: Stop[] = [];\n\tconst lastColorStop = colorStops.at(-1);\n\tconst totalPercentage =\n\t\tlastColorStop &&\n\t\tlastColorStop.offset &&\n\t\tlastColorStop.offset.unit === '%' &&\n\t\trepeating\n\t\t\t? +lastColorStop.offset.value\n\t\t\t: 100;\n\tfor (const stop of colorStops) {\n\t\tconst { color } = stop;\n\t\tif (!stops.length) {\n\t\t\t// First stop, ensure it's at the start.\n\t\t\tstops.push({\n\t\t\t\toffset: 0,\n\t\t\t\tcolor\n\t\t\t});\n\n\t\t\tif (!stop.offset) continue;\n\t\t\tif (stop.offset.value === '0') continue;\n\t\t}\n\n\t\t// All offsets are relative values (0-1) in SVG.\n\t\tconst offset =\n\t\t\ttypeof stop.offset === 'undefined'\n\t\t\t\t? undefined\n\t\t\t\t: stop.offset.unit === '%'\n\t\t\t\t? +stop.offset.value / totalPercentage\n\t\t\t\t: Number(\n\t\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\t\t`${stop.offset.value}${stop.offset.unit}`,\n\t\t\t\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\t\t\t\ttotalLength,\n\t\t\t\t\t\t\tinheritedStyle,\n\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t)\n\t\t\t\t ) / totalLength;\n\n\t\tstops.push({\n\t\t\toffset,\n\t\t\tcolor\n\t\t});\n\t}\n\tif (!stops.length) {\n\t\tstops.push({\n\t\t\toffset: 0,\n\t\t\tcolor: 'transparent'\n\t\t});\n\t}\n\t// Last stop, ensure it's at the end.\n\tconst lastStop = stops[stops.length - 1];\n\tif (lastStop.offset !== 1) {\n\t\tif (typeof lastStop.offset === 'undefined') {\n\t\t\tlastStop.offset = 1;\n\t\t} else if (repeating) {\n\t\t\tstops[stops.length - 1] = {\n\t\t\t\toffset: 1,\n\t\t\t\tcolor: lastStop.color\n\t\t\t};\n\t\t} else {\n\t\t\tstops.push({\n\t\t\t\toffset: 1,\n\t\t\t\tcolor: lastStop.color\n\t\t\t});\n\t\t}\n\t}\n\n\tlet previousStop = 0;\n\tlet nextStop = 1;\n\t// Evenly distribute the missing stop offsets.\n\tfor (let i = 0; i < stops.length; i++) {\n\t\tif (typeof stops[i].offset === 'undefined') {\n\t\t\t// Find the next stop that has an offset.\n\t\t\tif (nextStop < i) nextStop = i;\n\t\t\twhile (typeof stops[nextStop].offset === 'undefined') nextStop++;\n\n\t\t\tstops[i].offset =\n\t\t\t\t((stops[nextStop].offset - stops[previousStop].offset) /\n\t\t\t\t\t(nextStop - previousStop)) *\n\t\t\t\t\t(i - previousStop) +\n\t\t\t\tstops[previousStop].offset;\n\t\t} else {\n\t\t\tpreviousStop = i;\n\t\t}\n\t}\n\n\tif (from === 'mask') {\n\t\treturn stops.map(stop => {\n\t\t\tconst color = cssColorParse(stop.color);\n\t\t\tif (!color) return stop;\n\t\t\tif (color.alpha === 0) {\n\t\t\t\treturn { ...stop, color: `rgba(0, 0, 0, 1)` };\n\t\t\t} else {\n\t\t\t\treturn {\n\t\t\t\t\t...stop,\n\t\t\t\t\tcolor: `rgba(255, 255, 255, ${color.alpha})`\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\t}\n\n\treturn stops;\n}\n","import {\n\tparseRadialGradient,\n\tRadialResult,\n\tRadialPropertyValue,\n\tColorStop\n} from 'css-gradient-parser';\nimport { buildXMLString, lengthToNumber } from '../../utils.js';\nimport { normalizeStops } from './utils.js';\n\nexport function buildRadialGradient(\n\t{\n\t\tid,\n\t\twidth,\n\t\theight,\n\t\trepeatX,\n\t\trepeatY\n\t}: {\n\t\tid: string;\n\t\twidth: number;\n\t\theight: number;\n\t\trepeatX: boolean;\n\t\trepeatY: boolean;\n\t},\n\timage: string,\n\tdimensions: number[],\n\toffsets: number[],\n\tinheritableStyle: Record<string, number | string>,\n\tfrom?: 'background' | 'mask'\n) {\n\tconst {\n\t\tshape,\n\t\tstops: colorStops,\n\t\tposition,\n\t\tsize,\n\t\trepeating\n\t} = parseRadialGradient(image);\n\tconst [xDelta, yDelta] = dimensions;\n\n\tlet cx: number = xDelta / 2;\n\tlet cy: number = yDelta / 2;\n\n\tconst pos = calcRadialGradient(\n\t\tposition.x,\n\t\tposition.y,\n\t\txDelta,\n\t\tyDelta,\n\t\tinheritableStyle.fontSize as number,\n\t\tinheritableStyle\n\t);\n\tcx = pos.x;\n\tcy = pos.y;\n\n\tconst colorStopTotalLength = calcColorStopTotalLength(\n\t\twidth,\n\t\tcolorStops,\n\t\trepeating,\n\t\tinheritableStyle\n\t);\n\n\tconst stops = normalizeStops(\n\t\tcolorStopTotalLength,\n\t\tcolorStops,\n\t\tinheritableStyle,\n\t\trepeating,\n\t\tfrom\n\t);\n\n\tconst gradientId = `satori_radial_${id}`;\n\tconst patternId = `satori_pattern_${id}`;\n\tconst maskId = `satori_mask_${id}`;\n\n\t// https://developer.mozilla.org/en-US/docs/Web/CSS/gradient/radial-gradient()#values\n\tconst spread = calcRadius(\n\t\tshape as Shape,\n\t\tsize,\n\t\tinheritableStyle.fontSize as number,\n\t\t{ x: cx, y: cy },\n\t\t[xDelta, yDelta],\n\t\tinheritableStyle,\n\t\trepeating\n\t);\n\n\tconst props = calcRadialGradientProps(\n\t\tshape as Shape,\n\t\tinheritableStyle.fontSize as number,\n\t\tcolorStops,\n\t\t[xDelta, yDelta],\n\t\tinheritableStyle,\n\t\trepeating,\n\t\tspread\n\t);\n\n\t// TODO: check for repeat-x/repeat-y\n\tconst defs = buildXMLString(\n\t\t'pattern',\n\t\t{\n\t\t\tid: patternId,\n\t\t\tx: offsets[0] / width,\n\t\t\ty: offsets[1] / height,\n\t\t\twidth: repeatX ? xDelta / width : '1',\n\t\t\theight: repeatY ? yDelta / height : '1',\n\t\t\tpatternUnits: 'objectBoundingBox'\n\t\t},\n\t\tbuildXMLString(\n\t\t\t'radialGradient',\n\t\t\t{\n\t\t\t\tid: gradientId,\n\t\t\t\t...props\n\t\t\t},\n\t\t\tstops\n\t\t\t\t.map(stop =>\n\t\t\t\t\tbuildXMLString('stop', {\n\t\t\t\t\t\toffset: stop.offset || 0,\n\t\t\t\t\t\t'stop-color': stop.color\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t\t.join('')\n\t\t) +\n\t\t\tbuildXMLString(\n\t\t\t\t'mask',\n\t\t\t\t{\n\t\t\t\t\tid: maskId\n\t\t\t\t},\n\t\t\t\tbuildXMLString('rect', {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0,\n\t\t\t\t\twidth: xDelta,\n\t\t\t\t\theight: yDelta,\n\t\t\t\t\tfill: '#fff'\n\t\t\t\t})\n\t\t\t) +\n\t\t\tbuildXMLString('rect', {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\twidth: xDelta,\n\t\t\t\theight: yDelta,\n\t\t\t\tfill: stops.at(-1)?.color || 'transparent'\n\t\t\t}) +\n\t\t\tbuildXMLString(shape, {\n\t\t\t\tcx: cx,\n\t\t\t\tcy: cy,\n\t\t\t\twidth: xDelta,\n\t\t\t\theight: yDelta,\n\t\t\t\t...spread,\n\t\t\t\tfill: `url(#${gradientId})`,\n\t\t\t\tmask: `url(#${maskId})`\n\t\t\t})\n\t);\n\n\tconst result = [patternId, defs];\n\treturn result;\n}\n\ntype PositionKeyWord = 'center' | 'left' | 'right' | 'top' | 'bottom';\n\nfunction calcColorStopTotalLength(\n\twidth: number,\n\tstops: ColorStop[],\n\trepeating: boolean,\n\tinheritableStyle: Record<string, string | number>\n) {\n\tif (!repeating) return width;\n\tconst lastStop = stops.at(-1);\n\tif (!lastStop || !lastStop.offset || lastStop.offset.unit === '%')\n\t\treturn width;\n\n\treturn lengthToNumber(\n\t\t`${lastStop.offset.value}${lastStop.offset.unit}`,\n\t\t+inheritableStyle.fontSize,\n\t\twidth,\n\t\tinheritableStyle,\n\t\ttrue\n\t);\n}\n\nfunction calcRadialGradient(\n\tcx: RadialPropertyValue,\n\tcy: RadialPropertyValue,\n\txDelta: number,\n\tyDelta: number,\n\tbaseFontSize: number,\n\tstyle: Record<string, string | number>\n) {\n\tconst pos: { x: number; y: number } = { x: xDelta / 2, y: yDelta / 2 };\n\tif (cx.type === 'keyword') {\n\t\tObject.assign(\n\t\t\tpos,\n\t\t\tcalcPos(cx.value as PositionKeyWord, xDelta, yDelta, 'x')\n\t\t);\n\t} else {\n\t\tpos.x =\n\t\t\tlengthToNumber(\n\t\t\t\t`${cx.value.value}${cx.value.unit}`,\n\t\t\t\tbaseFontSize,\n\t\t\t\txDelta,\n\t\t\t\tstyle,\n\t\t\t\ttrue\n\t\t\t) ?? xDelta / 2;\n\t}\n\n\tif (cy.type === 'keyword') {\n\t\tObject.assign(\n\t\t\tpos,\n\t\t\tcalcPos(cy.value as PositionKeyWord, xDelta, yDelta, 'y')\n\t\t);\n\t} else {\n\t\tpos.y =\n\t\t\tlengthToNumber(\n\t\t\t\t`${cy.value.value}${cy.value.unit}`,\n\t\t\t\tbaseFontSize,\n\t\t\t\tyDelta,\n\t\t\t\tstyle,\n\t\t\t\ttrue\n\t\t\t) ?? yDelta / 2;\n\t}\n\n\treturn pos;\n}\n\nfunction calcPos(\n\tkey: PositionKeyWord,\n\txDelta: number,\n\tyDelta: number,\n\tdir: 'x' | 'y'\n) {\n\tswitch (key) {\n\t\tcase 'center':\n\t\t\treturn { [dir]: dir === 'x' ? xDelta / 2 : yDelta / 2 };\n\t\tcase 'left':\n\t\t\treturn { x: 0 };\n\t\tcase 'top':\n\t\t\treturn { y: 0 };\n\t\tcase 'right':\n\t\t\treturn { x: xDelta };\n\t\tcase 'bottom':\n\t\t\treturn { y: yDelta };\n\t}\n}\n\ntype Shape = 'circle' | 'ellipse';\n\nfunction calcRadialGradientProps(\n\tshape: Shape,\n\tbaseFontSize: number,\n\tcolorStops: ColorStop[],\n\t[xDelta, yDelta]: [number, number],\n\tinheritableStyle: Record<string, string | number>,\n\trepeating: boolean,\n\tspread: Record<string, number>\n) {\n\tconst { r, rx, ratio = 1 } = spread;\n\tif (!repeating) {\n\t\treturn {\n\t\t\tspreadMethod: 'pad'\n\t\t};\n\t}\n\tconst last = colorStops.at(-1);\n\tconst radius = shape === 'circle' ? r * 2 : rx * 2;\n\treturn {\n\t\tspreadMethod: 'repeat',\n\t\tcx: '50%',\n\t\tcy: '50%',\n\t\tr:\n\t\t\tlast.offset.unit === '%'\n\t\t\t\t? `${\n\t\t\t\t\t\t(Number(last.offset.value) *\n\t\t\t\t\t\t\tMath.min(yDelta / xDelta, 1)) /\n\t\t\t\t\t\tratio\n\t\t\t\t }%`\n\t\t\t\t: Number(\n\t\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\t\t`${last.offset.value}${last.offset.unit}`,\n\t\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\t\txDelta,\n\t\t\t\t\t\t\tinheritableStyle,\n\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t) / radius\n\t\t\t\t )\n\t};\n}\n\nfunction calcRadius(\n\tshape: Shape,\n\tendingShape: RadialResult['size'],\n\tbaseFontSize: number,\n\tcenterAxis: { x: number; y: number },\n\tlength: [number, number],\n\tinheritableStyle: Record<string, string | number>,\n\trepeating: boolean\n) {\n\tconst [xDelta, yDelta] = length;\n\tconst { x: cx, y: cy } = centerAxis;\n\tconst spread: Record<string, number> = {};\n\tlet fx = 0;\n\tlet fy = 0;\n\n\tif (isSizeAllLength(endingShape)) {\n\t\tif (endingShape.some(v => v.value.value.startsWith('-'))) {\n\t\t\tthrow new Error(\n\t\t\t\t'disallow setting negative values to the size of the shape. Check https://w3c.github.io/csswg-drafts/css-images/#valdef-rg-size-length-0'\n\t\t\t);\n\t\t}\n\t\tif (shape === 'circle') {\n\t\t\tObject.assign(spread, {\n\t\t\t\tr: Number(\n\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\t`${endingShape[0].value.value}${endingShape[0].value.unit}`,\n\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\txDelta,\n\t\t\t\t\t\tinheritableStyle,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t});\n\t\t} else {\n\t\t\tObject.assign(spread, {\n\t\t\t\trx: Number(\n\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\t`${endingShape[0].value.value}${endingShape[0].value.unit}`,\n\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\txDelta,\n\t\t\t\t\t\tinheritableStyle,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t\t\try: Number(\n\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\t`${endingShape[1].value.value}${endingShape[1].value.unit}`,\n\t\t\t\t\t\tbaseFontSize,\n\t\t\t\t\t\tyDelta,\n\t\t\t\t\t\tinheritableStyle,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t});\n\t\t}\n\t\tpatchSpread(spread, xDelta, yDelta, cx, cy, repeating, shape);\n\t\treturn spread;\n\t}\n\n\tswitch (endingShape[0].value) {\n\t\tcase 'farthest-corner':\n\t\t\tfx = Math.max(Math.abs(xDelta - cx), Math.abs(cx));\n\t\t\tfy = Math.max(Math.abs(yDelta - cy), Math.abs(cy));\n\t\t\tbreak;\n\t\tcase 'closest-corner':\n\t\t\tfx = Math.min(Math.abs(xDelta - cx), Math.abs(cx));\n\t\t\tfy = Math.min(Math.abs(yDelta - cy), Math.abs(cy));\n\t\t\tbreak;\n\t\tcase 'farthest-side':\n\t\t\tif (shape === 'circle') {\n\t\t\t\tspread.r = Math.max(\n\t\t\t\t\tMath.abs(xDelta - cx),\n\t\t\t\t\tMath.abs(cx),\n\t\t\t\t\tMath.abs(yDelta - cy),\n\t\t\t\t\tMath.abs(cy)\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tspread.rx = Math.max(Math.abs(xDelta - cx), Math.abs(cx));\n\t\t\t\tspread.ry = Math.max(Math.abs(yDelta - cy), Math.abs(cy));\n\t\t\t}\n\t\t\tpatchSpread(spread, xDelta, yDelta, cx, cy, repeating, shape);\n\t\t\treturn spread;\n\t\tcase 'closest-side':\n\t\t\tif (shape === 'circle') {\n\t\t\t\tspread.r = Math.min(\n\t\t\t\t\tMath.abs(xDelta - cx),\n\t\t\t\t\tMath.abs(cx),\n\t\t\t\t\tMath.abs(yDelta - cy),\n\t\t\t\t\tMath.abs(cy)\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tspread.rx = Math.min(Math.abs(xDelta - cx), Math.abs(cx));\n\t\t\t\tspread.ry = Math.min(Math.abs(yDelta - cy), Math.abs(cy));\n\t\t\t}\n\t\t\tpatchSpread(spread, xDelta, yDelta, cx, cy, repeating, shape);\n\n\t\t\treturn spread;\n\t}\n\tif (shape === 'circle') {\n\t\tspread.r = Math.sqrt(fx * fx + fy * fy);\n\t} else {\n\t\tObject.assign(spread, f2r(fx, fy));\n\t}\n\n\tpatchSpread(spread, xDelta, yDelta, cx, cy, repeating, shape);\n\n\treturn spread;\n}\n\n// compare with farthest-corner to make it cover the whole container\nfunction patchSpread(\n\tspread: Record<string, number>,\n\txDelta: number,\n\tyDelta: number,\n\tcx: number,\n\tcy: number,\n\trepeating: boolean,\n\tshape: Shape\n) {\n\tif (repeating) {\n\t\tif (shape === 'ellipse') {\n\t\t\tconst mfx = Math.max(Math.abs(xDelta - cx), Math.abs(cx));\n\t\t\tconst mfy = Math.max(Math.abs(yDelta - cy), Math.abs(cy));\n\n\t\t\tconst { rx: mrx, ry: mry } = f2r(mfx, mfy);\n\n\t\t\tspread.ratio = Math.max(mrx / spread.rx, mry / spread.ry);\n\t\t\tif (spread.ratio > 1) {\n\t\t\t\tspread.rx *= spread.ratio;\n\t\t\t\tspread.ry *= spread.ratio;\n\t\t\t}\n\t\t} else {\n\t\t\tconst mfx = Math.max(Math.abs(xDelta - cx), Math.abs(cx));\n\t\t\tconst mfy = Math.max(Math.abs(yDelta - cy), Math.abs(cy));\n\n\t\t\tconst mr = Math.sqrt(mfx * mfx + mfy * mfy);\n\n\t\t\tspread.ratio = mr / spread.r;\n\t\t\tif (spread.ratio > 1) {\n\t\t\t\tspread.r = mr;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction f2r(fx: number, fy: number) {\n\t// Spec: https://drafts.csswg.org/css-images/#typedef-size\n\t// Get the aspect ratio of the closest-side size.\n\tconst ratio = fy !== 0 ? fx / fy : 1;\n\n\tif (fx === 0) {\n\t\treturn {\n\t\t\trx: 0,\n\t\t\try: 0\n\t\t};\n\t} else {\n\t\t// fx^2/a^2 + fy^2/b^2 = 1\n\t\t// fx^2/(b*ratio)^2 + fy^2/b^2 = 1\n\t\t// (fx^2+fy^2*ratio^2) = (b*ratio)^2\n\t\t// b = sqrt(fx^2+fy^2*ratio^2)/ratio\n\n\t\tconst ry = Math.sqrt(fx * fx + fy * fy * ratio * ratio) / ratio;\n\t\treturn {\n\t\t\try,\n\t\t\trx: ry * ratio\n\t\t};\n\t}\n}\n\nfunction isSizeAllLength(v: RadialPropertyValue[]): v is Array<{\n\ttype: 'length';\n\tvalue: {\n\t\tunit: string;\n\t\tvalue: string;\n\t};\n}> {\n\treturn !v.some(s => s.type === 'keyword');\n}\n","import CssDimension from '../vendor/parse-css-dimension/index.js';\nimport { buildXMLString } from '../utils.js';\n\nimport { resolveImageData } from '../handler/image.js';\nimport { buildLinearGradient } from './gradient/linear.js';\nimport { buildRadialGradient } from './gradient/radial.js';\nimport cssColorParse from 'parse-css-color';\n\ninterface Background {\n\tattachment?: string;\n\tcolor?: string;\n\tclip: string;\n\timage: string;\n\torigin?: string;\n\tposition: string;\n\tsize: string;\n\trepeat: string;\n}\n\nfunction toAbsoluteValue(v: string | number, base: number) {\n\tif (typeof v === 'string' && v.endsWith('%')) {\n\t\treturn (base * parseFloat(v)) / 100;\n\t}\n\treturn +v;\n}\n\nfunction calculateKeywordSize(\n\tkeyword: string,\n\tcontainerWidth: number,\n\tcontainerHeight: number,\n\timageWidth: number,\n\timageHeight: number\n): [number, number] {\n\tif (!imageWidth || !imageHeight) {\n\t\treturn [containerWidth, containerHeight];\n\t}\n\n\tif (keyword === 'cover') {\n\t\t// Scale to cover the container (use max scale to ensure it covers)\n\t\tconst scaleX = containerWidth / imageWidth;\n\t\tconst scaleY = containerHeight / imageHeight;\n\t\tconst scale = Math.max(scaleX, scaleY);\n\t\treturn [imageWidth * scale, imageHeight * scale];\n\t}\n\n\tif (keyword === 'contain') {\n\t\t// Scale to fit within the container (use min scale to ensure it fits)\n\t\tconst scaleX = containerWidth / imageWidth;\n\t\tconst scaleY = containerHeight / imageHeight;\n\t\tconst scale = Math.min(scaleX, scaleY);\n\t\treturn [imageWidth * scale, imageHeight * scale];\n\t}\n\n\t// For 'auto' or other values, handle auto\n\tif (keyword === 'auto' || keyword.includes('auto')) {\n\t\tconst parts = keyword.split(' ');\n\t\tconst widthPart = parts[0] || 'auto';\n\t\tconst heightPart = parts[1] || parts[0] || 'auto';\n\n\t\tlet finalWidth = imageWidth;\n\t\tlet finalHeight = imageHeight;\n\n\t\tif (widthPart === 'auto' && heightPart !== 'auto') {\n\t\t\t// Width is auto, height is specified\n\t\t\tconst parsedHeight = toAbsoluteValue(heightPart, containerHeight);\n\t\t\tfinalHeight = parsedHeight;\n\t\t\tfinalWidth = (imageWidth / imageHeight) * parsedHeight;\n\t\t} else if (heightPart === 'auto' && widthPart !== 'auto') {\n\t\t\t// Height is auto, width is specified\n\t\t\tconst parsedWidth = toAbsoluteValue(widthPart, containerWidth);\n\t\t\tfinalWidth = parsedWidth;\n\t\t\tfinalHeight = (imageHeight / imageWidth) * parsedWidth;\n\t\t}\n\t\t// If both are auto, use intrinsic dimensions\n\n\t\treturn [finalWidth, finalHeight];\n\t}\n\n\treturn [containerWidth, containerHeight];\n}\n\nconst positionKeywordMap: Record<string, string> = {\n\tbottom: '100%',\n\tcenter: '50%',\n\tleft: '0%',\n\tright: '100%',\n\ttop: '0%'\n};\n\nexport function parsePositionValues(str: string): { x: string; y: string } {\n\tif (!str) {\n\t\treturn { x: '0%', y: '0%' };\n\t}\n\n\tconst parts = str.split(' ').filter(Boolean);\n\n\tif (parts.length === 1) {\n\t\tconst part = parts[0];\n\n\t\tif (part in positionKeywordMap) {\n\t\t\tif (part === 'top' || part === 'bottom') {\n\t\t\t\treturn { x: '50%', y: positionKeywordMap[part] };\n\t\t\t}\n\n\t\t\treturn { x: positionKeywordMap[part], y: '50%' };\n\t\t}\n\n\t\treturn { x: part, y: '50%' };\n\t}\n\n\treturn {\n\t\tx: positionKeywordMap[parts[0]] || parts[0],\n\t\ty: positionKeywordMap[parts[1]] || parts[1]\n\t};\n}\n\nexport function computeBgPositionOffset(\n\trawValue: string,\n\tcontainerSize: number,\n\timageSize: number\n): number {\n\tif (rawValue.endsWith('%')) {\n\t\tconst percentage = parseFloat(rawValue) / 100;\n\t\t// CSS spec: offset = (containerSize - imageSize) * percentage\n\t\treturn (containerSize - imageSize) * percentage;\n\t}\n\n\ttry {\n\t\tconst parsed = new CssDimension(rawValue);\n\n\t\treturn parsed.type === 'length' || parsed.type === 'number'\n\t\t\t? parsed.value\n\t\t\t: toAbsoluteValue(parsed.value + parsed.unit, containerSize);\n\t} catch {\n\t\treturn 0;\n\t}\n}\n\nfunction parseLengthPairs(\n\tstr: string,\n\t{\n\t\tx,\n\t\ty,\n\t\tdefaultX,\n\t\tdefaultY\n\t}: {\n\t\tx: number;\n\t\ty: number;\n\t\tdefaultX: number | string;\n\t\tdefaultY: number | string;\n\t}\n) {\n\treturn (\n\t\tstr\n\t\t\t? str\n\t\t\t\t\t.split(' ')\n\t\t\t\t\t.map(value => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst parsed = new CssDimension(value);\n\t\t\t\t\t\t\treturn parsed.type === 'length' ||\n\t\t\t\t\t\t\t\tparsed.type === 'number'\n\t\t\t\t\t\t\t\t? parsed.value\n\t\t\t\t\t\t\t\t: parsed.value + parsed.unit;\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.filter(v => v !== null)\n\t\t\t: [defaultX, defaultY]\n\t).map((v, index) => toAbsoluteValue(v, [x, y][index]));\n}\n\nexport default async function backgroundImage(\n\t{\n\t\tid,\n\t\twidth,\n\t\theight,\n\t\tleft,\n\t\ttop\n\t}: { id: string; width: number; height: number; left: number; top: number },\n\t{ image, size, position, repeat }: Background,\n\tinheritableStyle: Record<string, number | string>,\n\tfrom?: 'background' | 'mask'\n): Promise<string[]> {\n\t// Default to `repeat`.\n\trepeat = repeat || 'repeat';\n\tfrom = from || 'background';\n\n\tconst repeatX = repeat === 'repeat-x' || repeat === 'repeat';\n\tconst repeatY = repeat === 'repeat-y' || repeat === 'repeat';\n\n\t// Check if size is a keyword (cover, contain, auto) that needs to be calculated later\n\tconst isKeywordSize =\n\t\tsize &&\n\t\t(size === 'cover' ||\n\t\t\tsize === 'contain' ||\n\t\t\tsize === 'auto' ||\n\t\t\tsize.includes('auto'));\n\n\t// For gradients, keyword sizes (cover, contain, auto) resolve to the\n\t// container dimensions since gradients have no intrinsic size.\n\t// For url() images, keyword sizes are calculated later using the image's\n\t// intrinsic dimensions.\n\tconst isGradient =\n\t\timage.startsWith('linear-gradient(') ||\n\t\timage.startsWith('repeating-linear-gradient(') ||\n\t\timage.startsWith('radial-gradient(') ||\n\t\timage.startsWith('repeating-radial-gradient(');\n\n\tconst dimensions =\n\t\tisKeywordSize && isGradient\n\t\t\t? [width, height] // Gradients have no intrinsic size; keyword sizes resolve to container\n\t\t\t: isKeywordSize\n\t\t\t? [0, 0] // Will be calculated later when we have image dimensions\n\t\t\t: parseLengthPairs(size, {\n\t\t\t\t\tx: width,\n\t\t\t\t\ty: height,\n\t\t\t\t\tdefaultX: width,\n\t\t\t\t\tdefaultY: height\n\t\t\t });\n\tconst offsets = parseLengthPairs(position, {\n\t\tx: width,\n\t\ty: height,\n\t\tdefaultX: 0,\n\t\tdefaultY: 0\n\t});\n\n\tif (\n\t\timage.startsWith('linear-gradient(') ||\n\t\timage.startsWith('repeating-linear-gradient(')\n\t) {\n\t\treturn buildLinearGradient(\n\t\t\t{ id, width, height, repeatX, repeatY },\n\t\t\timage,\n\t\t\tdimensions,\n\t\t\toffsets,\n\t\t\tinheritableStyle,\n\t\t\tfrom\n\t\t);\n\t}\n\n\tif (\n\t\timage.startsWith('radial-gradient(') ||\n\t\timage.startsWith('repeating-radial-gradient(')\n\t) {\n\t\treturn buildRadialGradient(\n\t\t\t{ id, width, height, repeatX, repeatY },\n\t\t\timage,\n\t\t\tdimensions,\n\t\t\toffsets,\n\t\t\tinheritableStyle,\n\t\t\tfrom\n\t\t);\n\t}\n\n\tif (image.startsWith('url(')) {\n\t\tconst [src, imageWidth, imageHeight] = await resolveImageData(\n\t\t\timage.slice(4, -1)\n\t\t);\n\n\t\tlet resolvedWidth: number;\n\t\tlet resolvedHeight: number;\n\n\t\tif (isKeywordSize) {\n\t\t\t// Calculate dimensions based on keyword (cover, contain, auto)\n\t\t\tconst [calcWidth, calcHeight] = calculateKeywordSize(\n\t\t\t\tsize,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\timageWidth,\n\t\t\t\timageHeight\n\t\t\t);\n\t\t\tresolvedWidth = calcWidth;\n\t\t\tresolvedHeight = calcHeight;\n\t\t} else {\n\t\t\t// Use the previously parsed dimensions\n\t\t\tconst dimensionsWithoutFallback = parseLengthPairs(size, {\n\t\t\t\tx: width,\n\t\t\t\ty: height,\n\t\t\t\tdefaultX: 0,\n\t\t\t\tdefaultY: 0\n\t\t\t});\n\t\t\tresolvedWidth =\n\t\t\t\tfrom === 'mask'\n\t\t\t\t\t? imageWidth || dimensionsWithoutFallback[0]\n\t\t\t\t\t: dimensionsWithoutFallback[0] || imageWidth;\n\t\t\tresolvedHeight =\n\t\t\t\tfrom === 'mask'\n\t\t\t\t\t? imageHeight || dimensionsWithoutFallback[1]\n\t\t\t\t\t: dimensionsWithoutFallback[1] || imageHeight;\n\t\t}\n\n\t\tif (isKeywordSize) {\n\t\t\t// For keyword sizes (cover, contain, auto), apply CSS background-position\n\t\t\t// formula: offset = (containerSize - imageSize) * percentage\n\t\t\tconst rawPos = parsePositionValues(position);\n\t\t\tconst imageOffsetX = computeBgPositionOffset(\n\t\t\t\trawPos.x,\n\t\t\t\twidth,\n\t\t\t\tresolvedWidth\n\t\t\t);\n\t\t\tconst imageOffsetY = computeBgPositionOffset(\n\t\t\t\trawPos.y,\n\t\t\t\theight,\n\t\t\t\tresolvedHeight\n\t\t\t);\n\n\t\t\treturn [\n\t\t\t\t`satori_bi${id}`,\n\t\t\t\tbuildXMLString(\n\t\t\t\t\t'pattern',\n\t\t\t\t\t{\n\t\t\t\t\t\tid: `satori_bi${id}`,\n\t\t\t\t\t\tpatternContentUnits: 'userSpaceOnUse',\n\t\t\t\t\t\tpatternUnits: 'userSpaceOnUse',\n\t\t\t\t\t\tx: (repeatX ? imageOffsetX : 0) + left,\n\t\t\t\t\t\ty: (repeatY ? imageOffsetY : 0) + top,\n\t\t\t\t\t\twidth: repeatX ? resolvedWidth : '100%',\n\t\t\t\t\t\theight: repeatY ? resolvedHeight : '100%'\n\t\t\t\t\t},\n\t\t\t\t\tbuildXMLString('image', {\n\t\t\t\t\t\tx: repeatX ? 0 : imageOffsetX,\n\t\t\t\t\t\ty: repeatY ? 0 : imageOffsetY,\n\t\t\t\t\t\twidth: resolvedWidth,\n\t\t\t\t\t\theight: resolvedHeight,\n\t\t\t\t\t\tpreserveAspectRatio: 'none',\n\t\t\t\t\t\thref: src\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t];\n\t\t}\n\n\t\treturn [\n\t\t\t`satori_bi${id}`,\n\t\t\tbuildXMLString(\n\t\t\t\t'pattern',\n\t\t\t\t{\n\t\t\t\t\tid: `satori_bi${id}`,\n\t\t\t\t\tpatternContentUnits: 'userSpaceOnUse',\n\t\t\t\t\tpatternUnits: 'userSpaceOnUse',\n\t\t\t\t\tx: offsets[0] + left,\n\t\t\t\t\ty: offsets[1] + top,\n\t\t\t\t\twidth: repeatX ? resolvedWidth : '100%',\n\t\t\t\t\theight: repeatY ? resolvedHeight : '100%'\n\t\t\t\t},\n\t\t\t\tbuildXMLString('image', {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0,\n\t\t\t\t\twidth: resolvedWidth,\n\t\t\t\t\theight: resolvedHeight,\n\t\t\t\t\tpreserveAspectRatio: 'none',\n\t\t\t\t\thref: src\n\t\t\t\t})\n\t\t\t)\n\t\t];\n\t}\n\n\tif (cssColorParse(image)) {\n\t\tconst colorObj = cssColorParse(image);\n\t\tconst [r, g, b, a] = colorObj.values;\n\t\tconst alpha = a !== undefined ? a : 1;\n\t\tconst color = `rgba(${r},${g},${b},${alpha})`;\n\n\t\treturn [\n\t\t\t`satori_bi${id}`,\n\t\t\tbuildXMLString(\n\t\t\t\t'pattern',\n\t\t\t\t{\n\t\t\t\t\tid: `satori_bi${id}`,\n\t\t\t\t\tpatternContentUnits: 'userSpaceOnUse',\n\t\t\t\t\tpatternUnits: 'userSpaceOnUse',\n\t\t\t\t\tx: left,\n\t\t\t\t\ty: top,\n\t\t\t\t\twidth: width,\n\t\t\t\t\theight: height\n\t\t\t\t},\n\t\t\t\tbuildXMLString('rect', {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0,\n\t\t\t\t\twidth: width,\n\t\t\t\t\theight: height,\n\t\t\t\t\tfill: color\n\t\t\t\t})\n\t\t\t)\n\t\t];\n\t}\n\n\tthrow new Error(`Invalid background image: \"${image}\"`);\n}\n","/**\n * CSS border radius to SVG path.\n */\n\n// TODO: Support the `border-radius: 10px / 20px` syntax.\n// https://developer.mozilla.org/en-US/docs/Web/CSS/border-radius\n\nimport { buildXMLString, lengthToNumber } from '../utils.js';\n\n// Getting the intersection of a 45deg ray with the elliptical arc x^2/rx^2 + y^2/ry^2 = 1.\n// Reference:\n// https://www.w3.org/TR/SVG/implnote.html#ArcConversionEndpointToCenter\nfunction svgArcCenterOffset([rx, ry]: number[]) {\n\tif (Math.round(rx * 1000) === 0 && Math.round(ry * 1000) === 0) {\n\t\treturn 0;\n\t}\n\treturn Math.round(((rx * ry) / Math.sqrt(rx * rx + ry * ry)) * 1000) / 1000;\n}\n\nfunction resolveSize(a: number, b: number, limit: number) {\n\tif (limit < a + b) {\n\t\tif (limit / 2 < a && limit / 2 < b) {\n\t\t\ta = b = limit / 2;\n\t\t} else if (limit / 2 < a) {\n\t\t\ta = limit - b;\n\t\t} else if (limit / 2 < b) {\n\t\t\tb = limit - a;\n\t\t}\n\t}\n\treturn [a, b];\n}\n\nfunction makeSmaller(arr: [number, number]) {\n\tarr[0] = arr[1] = Math.min(arr[0], arr[1]);\n}\n\n// Each corner can have 2 values, the first is the horizontal radius, the second is the vertical radius.\nfunction resolveRadius(\n\tv: number | string | undefined,\n\twidth: number,\n\theight: number,\n\tfontSize: number,\n\tstyle: any\n): [boolean, undefined | [number, number]] {\n\tif (typeof v === 'string') {\n\t\tconst sides = v.split(' ').map(s => s.trim());\n\t\tconst singleValue = !sides[1] && !sides[0].endsWith('%');\n\t\tsides[1] = sides[1] || sides[0];\n\t\treturn [\n\t\t\tsingleValue,\n\t\t\t[\n\t\t\t\tMath.min(\n\t\t\t\t\tlengthToNumber(sides[0], fontSize, width, style, true),\n\t\t\t\t\twidth\n\t\t\t\t),\n\t\t\t\tMath.min(\n\t\t\t\t\tlengthToNumber(sides[1], fontSize, height, style, true),\n\t\t\t\t\theight\n\t\t\t\t)\n\t\t\t]\n\t\t];\n\t}\n\tif (typeof v === 'number') {\n\t\treturn [true, [Math.min(v, width), Math.min(v, height)]];\n\t}\n\treturn [true, undefined];\n}\n\nconst radiusZeroOrNull = (_radius?: [number, number]) =>\n\t_radius && _radius[0] !== 0 && _radius[1] !== 0;\n\nexport function getBorderRadiusClipPath(\n\t{\n\t\tid,\n\t\tborderRadiusPath,\n\t\tborderType,\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight\n\t}: {\n\t\tid: string;\n\t\tborderRadiusPath?: string;\n\t\tborderType?: 'rect' | 'path';\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t},\n\tstyle: Record<string, number | string>\n) {\n\tconst rectClipId = `satori_brc-${id}`;\n\tconst defs = buildXMLString(\n\t\t'clipPath',\n\t\t{\n\t\t\tid: rectClipId\n\t\t},\n\t\tbuildXMLString(borderType, {\n\t\t\tx: left,\n\t\t\ty: top,\n\t\t\twidth,\n\t\t\theight,\n\t\t\td: borderRadiusPath ? borderRadiusPath : undefined\n\t\t})\n\t);\n\n\treturn [defs, rectClipId];\n}\n\nexport default function radius(\n\t{\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight\n\t}: {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t},\n\tstyle: Record<string, any>,\n\tpartialSides?: boolean[]\n) {\n\tlet {\n\t\tborderTopLeftRadius,\n\t\tborderTopRightRadius,\n\t\tborderBottomLeftRadius,\n\t\tborderBottomRightRadius,\n\t\tfontSize\n\t} = style;\n\n\tlet singleAbsValueTopLeftCorner;\n\tlet singleAbsValueTopRightCorner;\n\tlet singleAbsValueBottomLeftCorner;\n\tlet singleAbsValueBottomRightCorner;\n\t[singleAbsValueTopLeftCorner, borderTopLeftRadius] = resolveRadius(\n\t\tborderTopLeftRadius,\n\t\twidth,\n\t\theight,\n\t\tfontSize,\n\t\tstyle\n\t);\n\t[singleAbsValueTopRightCorner, borderTopRightRadius] = resolveRadius(\n\t\tborderTopRightRadius,\n\t\twidth,\n\t\theight,\n\t\tfontSize,\n\t\tstyle\n\t);\n\t[singleAbsValueBottomLeftCorner, borderBottomLeftRadius] = resolveRadius(\n\t\tborderBottomLeftRadius,\n\t\twidth,\n\t\theight,\n\t\tfontSize,\n\t\tstyle\n\t);\n\t[singleAbsValueBottomRightCorner, borderBottomRightRadius] = resolveRadius(\n\t\tborderBottomRightRadius,\n\t\twidth,\n\t\theight,\n\t\tfontSize,\n\t\tstyle\n\t);\n\n\tif (\n\t\t!partialSides &&\n\t\t!radiusZeroOrNull(borderTopLeftRadius) &&\n\t\t!radiusZeroOrNull(borderTopRightRadius) &&\n\t\t!radiusZeroOrNull(borderBottomLeftRadius) &&\n\t\t!radiusZeroOrNull(borderBottomRightRadius)\n\t) {\n\t\treturn '';\n\t}\n\tborderTopLeftRadius ||= [0, 0];\n\tborderTopRightRadius ||= [0, 0];\n\tborderBottomLeftRadius ||= [0, 0];\n\tborderBottomRightRadius ||= [0, 0];\n\n\t// Limit the radius sizes of each edge to make sure they will never overlap.\n\n\t// Top\n\t[borderTopLeftRadius[0], borderTopRightRadius[0]] = resolveSize(\n\t\tborderTopLeftRadius[0],\n\t\tborderTopRightRadius[0],\n\t\twidth\n\t);\n\t// Bottom\n\t[borderBottomLeftRadius[0], borderBottomRightRadius[0]] = resolveSize(\n\t\tborderBottomLeftRadius[0],\n\t\tborderBottomRightRadius[0],\n\t\twidth\n\t);\n\t// Left\n\t[borderTopLeftRadius[1], borderBottomLeftRadius[1]] = resolveSize(\n\t\tborderTopLeftRadius[1],\n\t\tborderBottomLeftRadius[1],\n\t\theight\n\t);\n\t// Right\n\t[borderTopRightRadius[1], borderBottomRightRadius[1]] = resolveSize(\n\t\tborderTopRightRadius[1],\n\t\tborderBottomRightRadius[1],\n\t\theight\n\t);\n\n\t// If the specified border radius is a single value (e.g. 10px or 10em), we take\n\t// the minimum of the resolved horizontal and vertical radius and apply to both.\n\tif (singleAbsValueTopLeftCorner) {\n\t\tmakeSmaller(borderTopLeftRadius);\n\t}\n\tif (singleAbsValueTopRightCorner) {\n\t\tmakeSmaller(borderTopRightRadius);\n\t}\n\tif (singleAbsValueBottomLeftCorner) {\n\t\tmakeSmaller(borderBottomLeftRadius);\n\t}\n\tif (singleAbsValueBottomRightCorner) {\n\t\tmakeSmaller(borderBottomRightRadius);\n\t}\n\n\ttype Arc = [[number, number], [number, number]];\n\tconst p: Arc[] = [];\n\tp[0] = [borderTopRightRadius, borderTopRightRadius];\n\tp[1] = [\n\t\tborderBottomRightRadius,\n\t\t[-borderBottomRightRadius[0], borderBottomRightRadius[1]]\n\t];\n\tp[2] = [\n\t\tborderBottomLeftRadius,\n\t\t[-borderBottomLeftRadius[0], -borderBottomLeftRadius[1]]\n\t];\n\tp[3] = [\n\t\tborderTopLeftRadius,\n\t\t[borderTopLeftRadius[0], -borderTopLeftRadius[1]]\n\t];\n\n\tconst T = `h${width - borderTopLeftRadius[0] - borderTopRightRadius[0]} a${\n\t\tp[0][0]\n\t} 0 0 1 ${p[0][1]}`;\n\tconst R = `v${\n\t\theight - borderTopRightRadius[1] - borderBottomRightRadius[1]\n\t} a${p[1][0]} 0 0 1 ${p[1][1]}`;\n\tconst B = `h${\n\t\tborderBottomRightRadius[0] + borderBottomLeftRadius[0] - width\n\t} a${p[2][0]} 0 0 1 ${p[2][1]}`;\n\tconst L = `v${\n\t\tborderBottomLeftRadius[1] + borderTopLeftRadius[1] - height\n\t} a${p[3][0]} 0 0 1 ${p[3][1]}`;\n\n\tif (partialSides) {\n\t\t// \"However it is not defined what these transitions look like or what function maps from this ratio to a point on the curve.\"\n\t\t// https://w3c.github.io/csswg-drafts/css-backgrounds-3/#corner-transitions\n\t\tlet start = partialSides.indexOf(false);\n\n\t\tif (!partialSides.includes(true))\n\t\t\tthrow new Error('Invalid `partialSides`.');\n\n\t\tif (start === -1) {\n\t\t\tstart = 0;\n\t\t} else {\n\t\t\twhile (!partialSides[start]) {\n\t\t\t\tstart = (start + 1) % 4;\n\t\t\t}\n\t\t}\n\n\t\tfunction getArc(i: number) {\n\t\t\tconst c0 = svgArcCenterOffset(\n\t\t\t\t[\n\t\t\t\t\tborderTopLeftRadius,\n\t\t\t\t\tborderTopRightRadius,\n\t\t\t\t\tborderBottomRightRadius,\n\t\t\t\t\tborderBottomLeftRadius\n\t\t\t\t][i]\n\t\t\t);\n\t\t\treturn i === 0\n\t\t\t\t? [\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tleft + borderTopLeftRadius[0] - c0,\n\t\t\t\t\t\t\ttop + borderTopLeftRadius[1] - c0\n\t\t\t\t\t\t],\n\t\t\t\t\t\t[left + borderTopLeftRadius[0], top]\n\t\t\t\t ]\n\t\t\t\t: i === 1\n\t\t\t\t? [\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tleft + width - borderTopRightRadius[0] + c0,\n\t\t\t\t\t\t\ttop + borderTopRightRadius[1] - c0\n\t\t\t\t\t\t],\n\t\t\t\t\t\t[left + width, top + borderTopRightRadius[1]]\n\t\t\t\t ]\n\t\t\t\t: i === 2\n\t\t\t\t? [\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tleft + width - borderBottomRightRadius[0] + c0,\n\t\t\t\t\t\t\ttop + height - borderBottomRightRadius[1] + c0\n\t\t\t\t\t\t],\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tleft + width - borderBottomRightRadius[0],\n\t\t\t\t\t\t\ttop + height\n\t\t\t\t\t\t]\n\t\t\t\t ]\n\t\t\t\t: [\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tleft + borderBottomLeftRadius[0] - c0,\n\t\t\t\t\t\t\ttop + height - borderBottomLeftRadius[1] + c0\n\t\t\t\t\t\t],\n\t\t\t\t\t\t[left, top + height - borderBottomLeftRadius[1]]\n\t\t\t\t ];\n\t\t}\n\n\t\tlet result = '';\n\n\t\tconst arc0 = getArc(start);\n\n\t\tlet l = `M${arc0[0]} A${p[(start + 3) % 4][0]} 0 0 1 ${arc0[1]}`;\n\n\t\tlet len = 0;\n\t\tfor (; len < 4 && partialSides[(start + len) % 4]; len++) {\n\t\t\tresult += l + ' ';\n\t\t\tl = [T, R, B, L][(start + len) % 4];\n\t\t}\n\t\tconst end = (start + len) % 4;\n\n\t\t// For the last segment, we skip the full arc and add the half arc.\n\t\tresult += l.split(' ')[0];\n\n\t\tconst arc1 = getArc(end);\n\t\tresult += ` A${p[(end + 3) % 4][0]} 0 0 1 ${arc1[0]}`;\n\n\t\treturn result;\n\t}\n\n\t// Generate the path\n\treturn `M${left + borderTopLeftRadius[0]},${top} ${T} ${R} ${B} ${L}`;\n}\n","import { buildXMLString } from '../utils.js';\nimport radius from './border-radius.js';\n\nfunction compareBorderDirections(a: string, b: string, style: any) {\n\treturn (\n\t\tstyle[a + 'Width'] === style[b + 'Width'] &&\n\t\tstyle[a + 'Style'] === style[b + 'Style'] &&\n\t\tstyle[a + 'Color'] === style[b + 'Color']\n\t);\n}\n\nexport function getBorderClipPath(\n\t{\n\t\tid,\n\t\t// Can be `overflow: hidden` from parent containers.\n\t\tcurrentClipPathId,\n\t\tborderPath,\n\t\tborderType,\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight\n\t}: {\n\t\tid: string;\n\t\tcurrentClipPathId?: string | number;\n\t\tborderPath?: string;\n\t\tborderType?: 'rect' | 'path';\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t},\n\tstyle: Record<string, number | string>\n) {\n\tconst hasBorder =\n\t\tstyle.borderTopWidth ||\n\t\tstyle.borderRightWidth ||\n\t\tstyle.borderBottomWidth ||\n\t\tstyle.borderLeftWidth;\n\n\tif (!hasBorder) return null;\n\n\t// In SVG, stroke is always centered on the path and there is no\n\t// existing property to make it behave like CSS border. So here we\n\t// 2x the border width and introduce another clip path to clip the\n\t// overflowed part.\n\tconst rectClipId = `satori_bc-${id}`;\n\tconst defs = buildXMLString(\n\t\t'clipPath',\n\t\t{\n\t\t\tid: rectClipId,\n\t\t\t'clip-path': currentClipPathId\n\t\t\t\t? `url(#${currentClipPathId})`\n\t\t\t\t: undefined\n\t\t},\n\t\tbuildXMLString(borderType, {\n\t\t\tx: left,\n\t\t\ty: top,\n\t\t\twidth,\n\t\t\theight,\n\t\t\td: borderPath ? borderPath : undefined\n\t\t})\n\t);\n\n\treturn [defs, rectClipId];\n}\n\nexport default function border(\n\t{\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight,\n\t\tprops,\n\t\tasContentMask,\n\t\tmaskBorderOnly\n\t}: {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t\tprops: any;\n\t\tasContentMask?: boolean;\n\t\tmaskBorderOnly?: boolean;\n\t},\n\tstyle: Record<string, number | string>\n) {\n\tconst directions = [\n\t\t'borderTop',\n\t\t'borderRight',\n\t\t'borderBottom',\n\t\t'borderLeft'\n\t];\n\n\t// No border\n\tif (\n\t\t!asContentMask &&\n\t\t!directions.some(direction => style[direction + 'Width'])\n\t)\n\t\treturn '';\n\n\tlet fullBorder = '';\n\n\tlet start = 0;\n\twhile (\n\t\tstart > 0 &&\n\t\tcompareBorderDirections(\n\t\t\tdirections[start],\n\t\t\tdirections[(start + 3) % 4],\n\t\t\tstyle\n\t\t)\n\t) {\n\t\tstart = (start + 3) % 4;\n\t}\n\n\tlet partialSides = [false, false, false, false];\n\tlet currentStyle = [];\n\tfor (let _i = 0; _i < 4; _i++) {\n\t\tconst i = (start + _i) % 4;\n\t\tconst ni = (start + _i + 1) % 4;\n\n\t\tconst d = directions[i];\n\t\tconst nd = directions[ni];\n\n\t\tpartialSides[i] = true;\n\t\tcurrentStyle = [\n\t\t\tstyle[d + 'Width'],\n\t\t\tstyle[d + 'Style'],\n\t\t\tstyle[d + 'Color'],\n\t\t\td\n\t\t];\n\n\t\tif (!compareBorderDirections(d, nd, style)) {\n\t\t\tconst w =\n\t\t\t\t(currentStyle[0] || 0) +\n\t\t\t\t(asContentMask && !maskBorderOnly\n\t\t\t\t\t? style[d.replace('border', 'padding')] || 0\n\t\t\t\t\t: 0);\n\t\t\tif (w) {\n\t\t\t\tfullBorder += buildXMLString('path', {\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\t...props,\n\t\t\t\t\tfill: 'none',\n\t\t\t\t\tstroke: asContentMask ? '#000' : currentStyle[2],\n\t\t\t\t\t'stroke-width': w * 2,\n\t\t\t\t\t'stroke-dasharray':\n\t\t\t\t\t\t!asContentMask && currentStyle[1] === 'dashed'\n\t\t\t\t\t\t\t? w * 2 + ' ' + w\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\td: radius(\n\t\t\t\t\t\t{ left, top, width, height },\n\t\t\t\t\t\tstyle as Record<string, number>,\n\t\t\t\t\t\tpartialSides\n\t\t\t\t\t)\n\t\t\t\t});\n\t\t\t}\n\t\t\tpartialSides = [false, false, false, false];\n\t\t}\n\t}\n\n\tif (partialSides.some(Boolean)) {\n\t\tconst w =\n\t\t\t(currentStyle[0] || 0) +\n\t\t\t(asContentMask && !maskBorderOnly\n\t\t\t\t? style[currentStyle[3].replace('border', 'padding')] || 0\n\t\t\t\t: 0);\n\t\tif (w) {\n\t\t\tfullBorder += buildXMLString('path', {\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\t...props,\n\t\t\t\tfill: 'none',\n\t\t\t\tstroke: asContentMask ? '#000' : currentStyle[2],\n\t\t\t\t'stroke-width': w * 2,\n\t\t\t\t'stroke-dasharray':\n\t\t\t\t\t!asContentMask && currentStyle[1] === 'dashed'\n\t\t\t\t\t\t? w * 2 + ' ' + w\n\t\t\t\t\t\t: undefined,\n\t\t\t\td: radius(\n\t\t\t\t\t{ left, top, width, height },\n\t\t\t\t\tstyle as Record<string, number>,\n\t\t\t\t\tpartialSides\n\t\t\t\t)\n\t\t\t});\n\t\t}\n\t}\n\n\treturn fullBorder;\n}\n","/**\n * When there is border radius, the content area should be clipped by the\n * inner path of border + padding. This applies to <img> element as well as any\n * child element inside a `overflow: hidden` container.\n */\n\nimport { buildXMLString } from '../utils.js';\nimport border from './border.js';\n\nexport default function contentMask(\n\t{\n\t\tid,\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight,\n\t\tmatrix,\n\t\tborderOnly\n\t}: {\n\t\tid: string;\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t\tmatrix: string | undefined;\n\t\tborderOnly?: boolean;\n\t},\n\tstyle: Record<string, number | string>\n) {\n\tconst offsetLeft =\n\t\t((style.borderLeftWidth as number) || 0) +\n\t\t(borderOnly ? 0 : (style.paddingLeft as number) || 0);\n\tconst offsetTop =\n\t\t((style.borderTopWidth as number) || 0) +\n\t\t(borderOnly ? 0 : (style.paddingTop as number) || 0);\n\tconst offsetRight =\n\t\t((style.borderRightWidth as number) || 0) +\n\t\t(borderOnly ? 0 : (style.paddingRight as number) || 0);\n\tconst offsetBottom =\n\t\t((style.borderBottomWidth as number) || 0) +\n\t\t(borderOnly ? 0 : (style.paddingBottom as number) || 0);\n\n\tconst contentArea = {\n\t\tx: left + offsetLeft,\n\t\ty: top + offsetTop,\n\t\twidth: width - offsetLeft - offsetRight,\n\t\theight: height - offsetTop - offsetBottom\n\t};\n\n\tconst _contentMask = buildXMLString(\n\t\t'mask',\n\t\t{ id },\n\t\tbuildXMLString('rect', {\n\t\t\t...contentArea,\n\t\t\tfill: '#fff',\n\t\t\t// add transformation matrix to mask if overflow is hidden AND a\n\t\t\t// transformation style is defined, otherwise children will be clipped\n\t\t\t// incorrectly\n\t\t\ttransform:\n\t\t\t\tstyle.overflow === 'hidden' && style.transform && matrix\n\t\t\t\t\t? matrix\n\t\t\t\t\t: undefined,\n\t\t\tmask: style._inheritedMaskId\n\t\t\t\t? `url(#${style._inheritedMaskId})`\n\t\t\t\t: undefined\n\t\t}) +\n\t\t\tborder(\n\t\t\t\t{\n\t\t\t\t\tleft,\n\t\t\t\t\ttop,\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\ttransform: matrix ? matrix : undefined\n\t\t\t\t\t},\n\t\t\t\t\tasContentMask: true,\n\t\t\t\t\tmaskBorderOnly: borderOnly\n\t\t\t\t},\n\t\t\t\tstyle\n\t\t\t)\n\t);\n\n\treturn _contentMask;\n}\n","import { lengthToNumber } from '../utils.js';\nimport { default as buildBorderRadius } from '../builder/border-radius.js';\nimport { getStylesForProperty } from 'css-to-react-native';\n\nconst regexMap = {\n\tcircle: /circle\\((.+)\\)/,\n\tellipse: /ellipse\\((.+)\\)/,\n\tpath: /path\\((.+)\\)/,\n\tpolygon: /polygon\\((.+)\\)/,\n\tinset: /inset\\((.+)\\)/\n};\n\nexport function createShapeParser(\n\t{\n\t\twidth,\n\t\theight\n\t}: {\n\t\twidth: number;\n\t\theight: number;\n\t},\n\tstyle: Record<string, string | number>,\n\tinheritedStyle: Record<string, string | number>\n) {\n\tfunction parseCircle(str: string) {\n\t\tconst res = str.match(regexMap['circle']);\n\n\t\tif (!res) return null;\n\n\t\tconst [, value] = res;\n\t\tconst [radius, pos = ''] = value.split('at').map(v => v.trim());\n\t\tconst { x, y } = resolvePosition(pos, width, height);\n\n\t\treturn {\n\t\t\ttype: 'circle',\n\t\t\tr: lengthToNumber(\n\t\t\t\tradius,\n\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\tMath.sqrt(Math.pow(width, 2) + Math.pow(height, 2)) /\n\t\t\t\t\tMath.sqrt(2),\n\t\t\t\tinheritedStyle,\n\t\t\t\ttrue\n\t\t\t),\n\t\t\tcx: lengthToNumber(\n\t\t\t\tx,\n\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\twidth,\n\t\t\t\tinheritedStyle,\n\t\t\t\ttrue\n\t\t\t),\n\t\t\tcy: lengthToNumber(\n\t\t\t\ty,\n\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\theight,\n\t\t\t\tinheritedStyle,\n\t\t\t\ttrue\n\t\t\t)\n\t\t};\n\t}\n\tfunction parseEllipse(str: string) {\n\t\tconst res = str.match(regexMap['ellipse']);\n\n\t\tif (!res) return null;\n\n\t\tconst [, value] = res;\n\t\tconst [radius, pos = ''] = value.split('at').map(v => v.trim());\n\t\tconst [rx, ry] = radius.split(' ');\n\t\tconst { x, y } = resolvePosition(pos, width, height);\n\n\t\treturn {\n\t\t\ttype: 'ellipse',\n\t\t\trx: lengthToNumber(\n\t\t\t\trx || '50%',\n\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\twidth,\n\t\t\t\tinheritedStyle,\n\t\t\t\ttrue\n\t\t\t),\n\t\t\try: lengthToNumber(\n\t\t\t\try || '50%',\n\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\theight,\n\t\t\t\tinheritedStyle,\n\t\t\t\ttrue\n\t\t\t),\n\t\t\tcx: lengthToNumber(\n\t\t\t\tx,\n\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\twidth,\n\t\t\t\tinheritedStyle,\n\t\t\t\ttrue\n\t\t\t),\n\t\t\tcy: lengthToNumber(\n\t\t\t\ty,\n\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\theight,\n\t\t\t\tinheritedStyle,\n\t\t\t\ttrue\n\t\t\t)\n\t\t};\n\t}\n\tfunction parsePath(str: string) {\n\t\tconst res = str.match(regexMap['path']);\n\n\t\tif (!res) return null;\n\n\t\tconst [fillRule, d] = resolveFillRule(res[1]);\n\n\t\treturn {\n\t\t\ttype: 'path',\n\t\t\td,\n\t\t\t'fill-rule': fillRule\n\t\t};\n\t}\n\tfunction parsePolygon(str: string) {\n\t\tconst res = str.match(regexMap['polygon']);\n\n\t\tif (!res) return null;\n\n\t\tconst [fillRule, points] = resolveFillRule(res[1]);\n\n\t\treturn {\n\t\t\ttype: 'polygon',\n\t\t\t'fill-rule': fillRule,\n\t\t\tpoints: points\n\t\t\t\t.split(',')\n\t\t\t\t.map(v =>\n\t\t\t\t\tv\n\t\t\t\t\t\t.split(' ')\n\t\t\t\t\t\t.map((k, i) =>\n\t\t\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\t\t\tk,\n\t\t\t\t\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\t\t\t\t\ti === 0 ? width : height,\n\t\t\t\t\t\t\t\tinheritedStyle,\n\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join(' ')\n\t\t\t\t)\n\t\t\t\t.join(',')\n\t\t};\n\t}\n\tfunction parseInset(str: string) {\n\t\tconst res = str.match(regexMap['inset']);\n\n\t\tif (!res) return null;\n\n\t\tconst [inset, radius] = (\n\t\t\tres[1].includes('round') ? res[1] : `${res[1].trim()} round 0`\n\t\t).split('round');\n\t\tconst radiusMap = getStylesForProperty('borderRadius', radius, true);\n\t\tconst r = Object.values(radiusMap)\n\t\t\t.map(s => String(s))\n\t\t\t.map(\n\t\t\t\t(s, i) =>\n\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\ts,\n\t\t\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\t\t\ti === 0 || i === 2 ? height : width,\n\t\t\t\t\t\tinheritedStyle,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) || 0\n\t\t\t);\n\t\tconst offsets = Object.values(\n\t\t\tgetStylesForProperty('margin', inset, true)\n\t\t)\n\t\t\t.map(s => String(s))\n\t\t\t.map(\n\t\t\t\t(s, i) =>\n\t\t\t\t\tlengthToNumber(\n\t\t\t\t\t\ts,\n\t\t\t\t\t\tinheritedStyle.fontSize as number,\n\t\t\t\t\t\ti === 0 || i === 2 ? height : width,\n\t\t\t\t\t\tinheritedStyle,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) || 0\n\t\t\t);\n\t\tconst x = offsets[3];\n\t\tconst y = offsets[0];\n\t\tconst w = width - (offsets[1] + offsets[3]);\n\t\tconst h = height - (offsets[0] + offsets[2]);\n\n\t\tif (r.some(v => v > 0)) {\n\t\t\tconst d = buildBorderRadius(\n\t\t\t\t{ left: x, top: y, width: w, height: h },\n\t\t\t\t{ ...style, ...radiusMap }\n\t\t\t);\n\n\t\t\treturn { type: 'path', d };\n\t\t}\n\n\t\treturn {\n\t\t\ttype: 'rect',\n\t\t\tx,\n\t\t\ty,\n\t\t\twidth: w,\n\t\t\theight: h\n\t\t};\n\t}\n\n\treturn {\n\t\tparseCircle,\n\t\tparseEllipse,\n\t\tparsePath,\n\t\tparsePolygon,\n\t\tparseInset\n\t};\n}\n\nfunction resolveFillRule(str: string) {\n\tconst [, fillRule = 'nonzero', d] =\n\t\tstr.replace(/('|\")/g, '').match(/^(nonzero|evenodd)?,?(.+)/) || [];\n\n\treturn [fillRule, d];\n}\n\nfunction resolvePosition(position: string, xDelta: number, yDelta: number) {\n\tconst pos = position.split(' ');\n\tconst res: { x: number | string; y: number | string } = {\n\t\tx: pos[0] || '50%',\n\t\ty: pos[1] || '50%'\n\t};\n\n\tpos.forEach(v => {\n\t\tif (v === 'top') {\n\t\t\tres.y = 0;\n\t\t} else if (v === 'bottom') {\n\t\t\tres.y = yDelta;\n\t\t} else if (v === 'left') {\n\t\t\tres.x = 0;\n\t\t} else if (v === 'right') {\n\t\t\tres.x = xDelta;\n\t\t} else if (v === 'center') {\n\t\t\tres.x = xDelta / 2;\n\t\t\tres.y = yDelta / 2;\n\t\t} else {\n\t\t\t// do nothing\n\t\t}\n\t});\n\n\treturn res;\n}\n","import { buildXMLString } from '../utils.js';\nimport { createShapeParser } from '../parser/shape.js';\n\nexport function genClipPathId(id: string) {\n\treturn `satori_cp-${id}`;\n}\nexport function genClipPath(id: string) {\n\treturn `url(#${genClipPathId(id)})`;\n}\n\nexport function buildClipPath(\n\tv: {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t\tpath: string;\n\t\tmatrix: string | undefined;\n\t\tid: string;\n\t\tcurrentClipPath: string | string;\n\t\tsrc?: string;\n\t},\n\tstyle: Record<string, string | number>,\n\tinheritedStyle: Record<string, string | number>\n) {\n\tif (style.clipPath === 'none') return '';\n\n\tconst parser = createShapeParser(v, style, inheritedStyle);\n\tconst clipPath = style.clipPath as string;\n\n\tlet tmp: { type: string; [p: string]: string | number } = { type: '' };\n\n\tfor (const k of Object.keys(parser)) {\n\t\ttmp = parser[k](clipPath);\n\t\tif (tmp) break;\n\t}\n\n\tif (tmp) {\n\t\tconst { type, ...rest } = tmp;\n\t\treturn buildXMLString(\n\t\t\t'clipPath',\n\t\t\t{\n\t\t\t\tid: genClipPathId(v.id),\n\t\t\t\t'clip-path': v.currentClipPath,\n\t\t\t\ttransform: `translate(${v.left}, ${v.top})`\n\t\t\t},\n\t\t\tbuildXMLString(type, rest)\n\t\t);\n\t}\n\treturn '';\n}\n","/**\n * Generate clip path for the given element.\n */\n\nimport { buildXMLString } from '../utils.js';\nimport mask from './content-mask.js';\nimport { buildClipPath, genClipPathId } from './clip-path.js';\n\nexport default function overflow(\n\t{\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight,\n\t\tpath,\n\t\tmatrix,\n\t\tid,\n\t\tcurrentClipPath,\n\t\tsrc\n\t}: {\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t\tpath: string;\n\t\tmatrix: string | undefined;\n\t\tid: string;\n\t\tcurrentClipPath: string | string;\n\t\tsrc?: string;\n\t},\n\tstyle: Record<string, string | number>,\n\tinheritableStyle: Record<string, string | number>\n) {\n\tlet overflowClipPath = '';\n\tconst clipPath =\n\t\tstyle.clipPath && style.clipPath !== 'none'\n\t\t\t? buildClipPath(\n\t\t\t\t\t{\n\t\t\t\t\t\tleft,\n\t\t\t\t\t\ttop,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\theight,\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tmatrix,\n\t\t\t\t\t\tcurrentClipPath,\n\t\t\t\t\t\tsrc\n\t\t\t\t\t},\n\t\t\t\t\tstyle as Record<string, number>,\n\t\t\t\t\tinheritableStyle\n\t\t\t )\n\t\t\t: '';\n\n\tif (style.overflow !== 'hidden' && !src) {\n\t\toverflowClipPath = '';\n\t} else {\n\t\tconst _id = clipPath ? `satori_ocp-${id}` : genClipPathId(id);\n\n\t\toverflowClipPath = buildXMLString(\n\t\t\t'clipPath',\n\t\t\t{\n\t\t\t\tid: _id,\n\t\t\t\t'clip-path': currentClipPath\n\t\t\t},\n\t\t\tbuildXMLString(path ? 'path' : 'rect', {\n\t\t\t\tx: left,\n\t\t\t\ty: top,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\td: path ? path : undefined,\n\t\t\t\t// add transformation matrix to clip path if overflow is hidden AND a\n\t\t\t\t// transformation style is defined, otherwise children will be clipped\n\t\t\t\t// relative to the parent's original plane instead of the transformed\n\t\t\t\t// plane\n\t\t\t\ttransform:\n\t\t\t\t\tstyle.overflow === 'hidden' && style.transform && matrix\n\t\t\t\t\t\t? matrix\n\t\t\t\t\t\t: undefined\n\t\t\t})\n\t\t);\n\t}\n\n\tconst contentMask = mask(\n\t\t{\n\t\t\tid: `satori_om-${id}`,\n\t\t\tleft,\n\t\t\ttop,\n\t\t\twidth,\n\t\t\theight,\n\t\t\tmatrix,\n\t\t\tborderOnly: src ? false : true\n\t\t},\n\t\tstyle\n\t);\n\n\treturn clipPath + overflowClipPath + contentMask;\n}\n","import { buildXMLString } from '../utils.js';\nimport buildBackgroundImage from './background-image.js';\nimport type { MaskProperty } from '../parser/mask.js';\n\nconst genMaskImageId = (id: string) => `satori_mi-${id}`;\n\nexport default async function buildMaskImage(\n\tv: {\n\t\tid: string;\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t},\n\tstyle: Record<string, string | number>,\n\tinheritedStyle: Record<string, string | number>\n): Promise<[string, string]> {\n\tif (!style.maskImage) return ['', ''];\n\tconst { left, top, width, height, id } = v;\n\tconst maskImage = style.maskImage as unknown as MaskProperty[];\n\tconst length = maskImage.length;\n\tif (!length) return ['', ''];\n\tconst miId = genMaskImageId(id);\n\n\tlet mask = '';\n\n\tfor (let i = 0; i < length; i++) {\n\t\tconst m = maskImage[i];\n\n\t\tconst [_id, def] = await buildBackgroundImage(\n\t\t\t{ id: `${miId}-${i}`, left, top, width, height },\n\t\t\tm,\n\t\t\tinheritedStyle,\n\t\t\t'mask'\n\t\t);\n\n\t\tmask +=\n\t\t\tdef +\n\t\t\tbuildXMLString('rect', {\n\t\t\t\tx: left,\n\t\t\t\ty: top,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\tfill: `url(#${_id})`\n\t\t\t});\n\t}\n\n\tmask = buildXMLString('mask', { id: miId }, mask);\n\n\treturn [miId, mask];\n}\n","import type { ParsedTransformOrigin } from '../transform-origin.js';\n\nimport backgroundImage from './background-image.js';\nimport radius, { getBorderRadiusClipPath } from './border-radius.js';\nimport { boxShadow } from './shadow.js';\nimport transform from './transform.js';\nimport overflow from './overflow.js';\nimport { buildXMLString } from '../utils.js';\nimport border, { getBorderClipPath } from './border.js';\nimport { genClipPath } from './clip-path.js';\nimport buildMaskImage from './mask-image.js';\nimport CssDimension from '../vendor/parse-css-dimension/index.js';\n\n/**\n * Parse object-position value into [xOffset, yOffset] in pixels.\n * Supports keywords (left, center, right, top, bottom), percentages, and lengths.\n * Similar to background-position parsing.\n */\nfunction parseObjectPosition(\n\tposition: string,\n\tcontainerWidth: number,\n\tcontainerHeight: number\n): [number, number] {\n\tconst parts = position.toLowerCase().trim().split(/\\s+/);\n\n\t// Convert keyword to percentage\n\tconst keywordToPercent = (keyword: string, axis: 'x' | 'y'): string => {\n\t\tconst map = {\n\t\t\tleft: '0%',\n\t\t\tcenter: '50%',\n\t\t\tright: '100%',\n\t\t\ttop: '0%',\n\t\t\tbottom: '100%'\n\t\t};\n\t\treturn map[keyword] || keyword;\n\t};\n\n\tlet xValue: string;\n\tlet yValue: string;\n\n\tif (parts.length === 1) {\n\t\tconst part = parts[0];\n\t\t// Single value\n\t\tif (part === 'left' || part === 'center' || part === 'right') {\n\t\t\txValue = keywordToPercent(part, 'x');\n\t\t\tyValue = '50%'; // center\n\t\t} else if (part === 'top' || part === 'bottom') {\n\t\t\txValue = '50%'; // center\n\t\t\tyValue = keywordToPercent(part, 'y');\n\t\t} else {\n\t\t\t// Assume it's x value, y defaults to center\n\t\t\txValue = part;\n\t\t\tyValue = '50%';\n\t\t}\n\t} else {\n\t\t// Two or more values\n\t\tconst first = parts[0];\n\t\tconst second = parts[1];\n\n\t\t// Check if first is a y-axis keyword (top/bottom)\n\t\tif (first === 'top' || first === 'bottom') {\n\t\t\tyValue = keywordToPercent(first, 'y');\n\t\t\tif (\n\t\t\t\tsecond === 'left' ||\n\t\t\t\tsecond === 'right' ||\n\t\t\t\tsecond === 'center'\n\t\t\t) {\n\t\t\t\txValue = keywordToPercent(second, 'x');\n\t\t\t} else {\n\t\t\t\t// Second is a length/percentage, default x to center\n\t\t\t\txValue = '50%';\n\t\t\t\tyValue =\n\t\t\t\t\tfirst === 'top' || first === 'bottom'\n\t\t\t\t\t\t? keywordToPercent(first, 'y')\n\t\t\t\t\t\t: second;\n\t\t\t}\n\t\t} else {\n\t\t\t// Normal order: x then y\n\t\t\txValue = keywordToPercent(first, 'x');\n\t\t\tyValue = keywordToPercent(second, 'y');\n\t\t}\n\t}\n\n\t// Convert to absolute pixels\n\tconst parseValue = (value: string, containerSize: number): number => {\n\t\ttry {\n\t\t\tif (value.endsWith('%')) {\n\t\t\t\treturn (containerSize * parseFloat(value)) / 100;\n\t\t\t}\n\t\t\tconst parsed = new CssDimension(value);\n\t\t\tif (parsed.type === 'length' || parsed.type === 'number') {\n\t\t\t\treturn parsed.value;\n\t\t\t}\n\t\t\treturn 0;\n\t\t} catch (e) {\n\t\t\treturn 0;\n\t\t}\n\t};\n\n\treturn [\n\t\tparseValue(xValue, containerWidth),\n\t\tparseValue(yValue, containerHeight)\n\t];\n}\n\nexport default async function rect(\n\t{\n\t\tid,\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight,\n\t\tisInheritingTransform,\n\t\tsrc,\n\t\tdebug\n\t}: {\n\t\tid: string;\n\t\tleft: number;\n\t\ttop: number;\n\t\twidth: number;\n\t\theight: number;\n\t\tisInheritingTransform: boolean;\n\t\tsrc?: string;\n\t\tdebug?: boolean;\n\t},\n\tstyle: Record<string, number | string>,\n\tinheritableStyle: Record<string, number | string>\n) {\n\tif (style.display === 'none') return '';\n\n\tconst isImage = !!src;\n\n\tlet type: 'rect' | 'path' = 'rect';\n\tlet matrix = '';\n\tlet defs = '';\n\tlet fills: string[] = [];\n\tlet opacity = 1;\n\tlet extra = '';\n\n\tif (style.backgroundColor) {\n\t\tfills.push(style.backgroundColor as string);\n\t}\n\n\tif (style.opacity !== undefined) {\n\t\topacity = +style.opacity;\n\t}\n\n\tif (style.transform) {\n\t\tmatrix = transform(\n\t\t\t{\n\t\t\t\tleft,\n\t\t\t\ttop,\n\t\t\t\twidth,\n\t\t\t\theight\n\t\t\t},\n\t\t\tstyle.transform as unknown as number[],\n\t\t\tisInheritingTransform,\n\t\t\tstyle.transformOrigin as ParsedTransformOrigin | undefined\n\t\t);\n\t}\n\n\tlet backgroundShapes = '';\n\tif (style.backgroundImage) {\n\t\tconst backgrounds: string[][] = [];\n\n\t\tfor (\n\t\t\tlet index = 0;\n\t\t\tindex < (style.backgroundImage as any).length;\n\t\t\tindex++\n\t\t) {\n\t\t\tconst background = (style.backgroundImage as any)[index];\n\t\t\tconst image = await backgroundImage(\n\t\t\t\t{ id: id + '_' + index, width, height, left, top },\n\t\t\t\tbackground,\n\t\t\t\tinheritableStyle\n\t\t\t);\n\t\t\tif (image) {\n\t\t\t\t// Background images that come first in the array are rendered last.\n\t\t\t\tbackgrounds.unshift(image);\n\t\t\t}\n\t\t}\n\n\t\tfor (const background of backgrounds) {\n\t\t\tfills.push(`url(#${background[0]})`);\n\t\t\tdefs += background[1];\n\t\t\tif (background[2]) {\n\t\t\t\tbackgroundShapes += background[2];\n\t\t\t}\n\t\t}\n\t}\n\n\tconst [miId, mi] = await buildMaskImage(\n\t\t{ id, left, top, width, height },\n\t\tstyle,\n\t\tinheritableStyle\n\t);\n\n\tdefs += mi;\n\tconst maskId = miId\n\t\t? `url(#${miId})`\n\t\t: style._inheritedMaskId\n\t\t? `url(#${style._inheritedMaskId})`\n\t\t: undefined;\n\n\tconst path = radius(\n\t\t{ left, top, width, height },\n\t\tstyle as Record<string, number>\n\t);\n\tif (path) {\n\t\ttype = 'path';\n\t}\n\n\tconst clipPathId = style._inheritedClipPathId as number | undefined;\n\n\tif (debug) {\n\t\textra = buildXMLString('rect', {\n\t\t\tx: left,\n\t\t\ty: top,\n\t\t\twidth,\n\t\t\theight,\n\t\t\tfill: 'transparent',\n\t\t\tstroke: '#ff5757',\n\t\t\t'stroke-width': 1,\n\t\t\ttransform: matrix || undefined,\n\t\t\t'clip-path': clipPathId ? `url(#${clipPathId})` : undefined\n\t\t});\n\t}\n\n\tconst { backgroundClip, filter: cssFilter, mixBlendMode } = style;\n\n\tconst inlineStyle =\n\t\t[\n\t\t\tcssFilter ? `filter:${cssFilter}` : undefined,\n\t\t\tmixBlendMode ? `mix-blend-mode:${mixBlendMode}` : undefined\n\t\t]\n\t\t\t.filter(v => v)\n\t\t\t.join(';') || undefined;\n\n\tconst currentClipPath =\n\t\tbackgroundClip === 'text'\n\t\t\t? `url(#satori_bct-${id})`\n\t\t\t: clipPathId\n\t\t\t? `url(#${clipPathId})`\n\t\t\t: style.clipPath\n\t\t\t? genClipPath(id)\n\t\t\t: undefined;\n\n\tconst clip = overflow(\n\t\t{ left, top, width, height, path, id, matrix, currentClipPath, src },\n\t\tstyle as Record<string, number>,\n\t\tinheritableStyle\n\t);\n\n\t// Each background generates a new rectangle.\n\t// @TODO: Not sure if this is the best way to do it, maybe <pattern> with\n\t// multiple <image>s is better.\n\tlet shape = fills\n\t\t.map(fill =>\n\t\t\tbuildXMLString(type, {\n\t\t\t\tx: left,\n\t\t\t\ty: top,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\tfill,\n\t\t\t\td: path ? path : undefined,\n\t\t\t\ttransform: matrix ? matrix : undefined,\n\t\t\t\t'clip-path': style.transform ? undefined : currentClipPath,\n\t\t\t\tstyle: inlineStyle,\n\t\t\t\tmask: style.transform ? undefined : maskId\n\t\t\t})\n\t\t)\n\t\t.join('');\n\n\tconst borderClip = getBorderClipPath(\n\t\t{\n\t\t\tid,\n\t\t\tleft,\n\t\t\ttop,\n\t\t\twidth,\n\t\t\theight,\n\t\t\tcurrentClipPathId: clipPathId,\n\t\t\tborderPath: path,\n\t\t\tborderType: type\n\t\t},\n\t\tstyle\n\t);\n\n\t// border radius for images with transform property\n\tlet imageBorderRadius = undefined;\n\n\t// If it's an image (<img>) tag, we add an extra layer of the image itself.\n\tif (isImage) {\n\t\t// We need to subtract the border and padding sizes from the image size.\n\t\tconst offsetLeft =\n\t\t\t((style.borderLeftWidth as number) || 0) +\n\t\t\t((style.paddingLeft as number) || 0);\n\t\tconst offsetTop =\n\t\t\t((style.borderTopWidth as number) || 0) +\n\t\t\t((style.paddingTop as number) || 0);\n\t\tconst offsetRight =\n\t\t\t((style.borderRightWidth as number) || 0) +\n\t\t\t((style.paddingRight as number) || 0);\n\t\tconst offsetBottom =\n\t\t\t((style.borderBottomWidth as number) || 0) +\n\t\t\t((style.paddingBottom as number) || 0);\n\n\t\tconst containerInnerWidth = width - offsetLeft - offsetRight;\n\t\tconst containerInnerHeight = height - offsetTop - offsetBottom;\n\n\t\t// Parse object-position\n\t\tconst position = (style.objectPosition || 'center').toString();\n\t\tconst [objPosX, objPosY] = parseObjectPosition(\n\t\t\tposition,\n\t\t\tcontainerInnerWidth,\n\t\t\tcontainerInnerHeight\n\t\t);\n\n\t\t// Get natural image dimensions if available\n\t\tconst naturalWidth =\n\t\t\t(style.__naturalWidth as number) || containerInnerWidth;\n\t\tconst naturalHeight =\n\t\t\t(style.__naturalHeight as number) || containerInnerHeight;\n\n\t\t// Calculate objectFit behavior\n\t\tlet preserveAspectRatio: string;\n\t\tlet imageWidth = containerInnerWidth;\n\t\tlet imageHeight = containerInnerHeight;\n\t\tlet imageX = left + offsetLeft;\n\t\tlet imageY = top + offsetTop;\n\n\t\tif (style.objectFit === 'contain') {\n\t\t\t// Scale to fit within container while preserving aspect ratio\n\t\t\tconst scaleX = containerInnerWidth / naturalWidth;\n\t\t\tconst scaleY = containerInnerHeight / naturalHeight;\n\t\t\tconst scale = Math.min(scaleX, scaleY);\n\n\t\t\timageWidth = naturalWidth * scale;\n\t\t\timageHeight = naturalHeight * scale;\n\n\t\t\t// Apply object-position to center the image within the container\n\t\t\timageX =\n\t\t\t\tleft +\n\t\t\t\toffsetLeft +\n\t\t\t\tobjPosX -\n\t\t\t\t(imageWidth * objPosX) / containerInnerWidth;\n\t\t\timageY =\n\t\t\t\ttop +\n\t\t\t\toffsetTop +\n\t\t\t\tobjPosY -\n\t\t\t\t(imageHeight * objPosY) / containerInnerHeight;\n\n\t\t\tpreserveAspectRatio = 'none';\n\t\t} else if (style.objectFit === 'cover') {\n\t\t\t// Scale to cover the container while preserving aspect ratio\n\t\t\tconst scaleX = containerInnerWidth / naturalWidth;\n\t\t\tconst scaleY = containerInnerHeight / naturalHeight;\n\t\t\tconst scale = Math.max(scaleX, scaleY);\n\n\t\t\timageWidth = naturalWidth * scale;\n\t\t\timageHeight = naturalHeight * scale;\n\n\t\t\t// Apply object-position\n\t\t\timageX =\n\t\t\t\tleft +\n\t\t\t\toffsetLeft +\n\t\t\t\tobjPosX -\n\t\t\t\t(imageWidth * objPosX) / containerInnerWidth;\n\t\t\timageY =\n\t\t\t\ttop +\n\t\t\t\toffsetTop +\n\t\t\t\tobjPosY -\n\t\t\t\t(imageHeight * objPosY) / containerInnerHeight;\n\n\t\t\tpreserveAspectRatio = 'none';\n\t\t} else if (style.objectFit === 'fill') {\n\t\t\t// Stretch to fill (ignore aspect ratio)\n\t\t\tpreserveAspectRatio = 'none';\n\t\t} else if (style.objectFit === 'scale-down') {\n\t\t\tif (naturalWidth && naturalHeight) {\n\t\t\t\t// Calculate if we need to scale down\n\t\t\t\tconst scaleX = containerInnerWidth / naturalWidth;\n\t\t\t\tconst scaleY = containerInnerHeight / naturalHeight;\n\t\t\t\tconst minScale = Math.min(scaleX, scaleY);\n\n\t\t\t\tif (minScale >= 1) {\n\t\t\t\t\t// Image is smaller than or equal to container\n\t\t\t\t\t// Use natural size (don't scale up)\n\t\t\t\t\timageWidth = naturalWidth;\n\t\t\t\t\timageHeight = naturalHeight;\n\t\t\t\t\tpreserveAspectRatio = 'none';\n\n\t\t\t\t\t// Apply object-position to position the un-scaled image\n\t\t\t\t\timageX =\n\t\t\t\t\t\tleft +\n\t\t\t\t\t\toffsetLeft +\n\t\t\t\t\t\tobjPosX -\n\t\t\t\t\t\t(imageWidth * objPosX) / containerInnerWidth;\n\t\t\t\t\timageY =\n\t\t\t\t\t\ttop +\n\t\t\t\t\t\toffsetTop +\n\t\t\t\t\t\tobjPosY -\n\t\t\t\t\t\t(imageHeight * objPosY) / containerInnerHeight;\n\t\t\t\t} else {\n\t\t\t\t\t// Image is larger than container, scale down like 'contain'\n\t\t\t\t\tconst scale = minScale;\n\t\t\t\t\timageWidth = naturalWidth * scale;\n\t\t\t\t\timageHeight = naturalHeight * scale;\n\n\t\t\t\t\t// Apply object-position\n\t\t\t\t\timageX =\n\t\t\t\t\t\tleft +\n\t\t\t\t\t\toffsetLeft +\n\t\t\t\t\t\tobjPosX -\n\t\t\t\t\t\t(imageWidth * objPosX) / containerInnerWidth;\n\t\t\t\t\timageY =\n\t\t\t\t\t\ttop +\n\t\t\t\t\t\toffsetTop +\n\t\t\t\t\t\tobjPosY -\n\t\t\t\t\t\t(imageHeight * objPosY) / containerInnerHeight;\n\n\t\t\t\t\tpreserveAspectRatio = 'none';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Fall back to 'contain' behavior if natural dimensions are unavailable\n\t\t\t\tconst scaleX = containerInnerWidth / naturalWidth;\n\t\t\t\tconst scaleY = containerInnerHeight / naturalHeight;\n\t\t\t\tconst scale = Math.min(scaleX, scaleY);\n\n\t\t\t\timageWidth = naturalWidth * scale;\n\t\t\t\timageHeight = naturalHeight * scale;\n\n\t\t\t\timageX =\n\t\t\t\t\tleft +\n\t\t\t\t\toffsetLeft +\n\t\t\t\t\tobjPosX -\n\t\t\t\t\t(imageWidth * objPosX) / containerInnerWidth;\n\t\t\t\timageY =\n\t\t\t\t\ttop +\n\t\t\t\t\toffsetTop +\n\t\t\t\t\tobjPosY -\n\t\t\t\t\t(imageHeight * objPosY) / containerInnerHeight;\n\n\t\t\t\tpreserveAspectRatio = 'none';\n\t\t\t}\n\t\t} else {\n\t\t\t// Default/none: fill (stretch)\n\t\t\tpreserveAspectRatio = 'none';\n\t\t}\n\n\t\tif (style.transform) {\n\t\t\timageBorderRadius = getBorderRadiusClipPath(\n\t\t\t\t{\n\t\t\t\t\tid,\n\t\t\t\t\tborderRadiusPath: path,\n\t\t\t\t\tborderType: type,\n\t\t\t\t\tleft,\n\t\t\t\t\ttop,\n\t\t\t\t\twidth,\n\t\t\t\t\theight\n\t\t\t\t},\n\t\t\t\tstyle\n\t\t\t);\n\t\t}\n\n\t\tshape += buildXMLString('image', {\n\t\t\tx: imageX,\n\t\t\ty: imageY,\n\t\t\twidth: imageWidth,\n\t\t\theight: imageHeight,\n\t\t\thref: src,\n\t\t\tpreserveAspectRatio,\n\t\t\ttransform: matrix ? matrix : undefined,\n\t\t\tstyle: inlineStyle,\n\t\t\t'clip-path': style.transform\n\t\t\t\t? imageBorderRadius\n\t\t\t\t\t? `url(#${imageBorderRadius[1]})`\n\t\t\t\t\t: undefined\n\t\t\t\t: `url(#satori_cp-${id})`,\n\t\t\tmask: style.transform\n\t\t\t\t? undefined\n\t\t\t\t: miId\n\t\t\t\t? `url(#${miId})`\n\t\t\t\t: `url(#satori_om-${id})`\n\t\t});\n\t}\n\n\tif (borderClip) {\n\t\tdefs += borderClip[0];\n\t\tconst rectClipId = borderClip[1];\n\n\t\tshape += border(\n\t\t\t{\n\t\t\t\tleft,\n\t\t\t\ttop,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\tprops: {\n\t\t\t\t\ttransform: matrix ? matrix : undefined,\n\t\t\t\t\t// When using `background-clip: text`, we need to draw the extra border because\n\t\t\t\t\t// it shouldn't be clipped by the clip path, so we are not using currentClipPath here.\n\t\t\t\t\t'clip-path': `url(#${rectClipId})`\n\t\t\t\t}\n\t\t\t},\n\t\t\tstyle\n\t\t);\n\t}\n\n\t// box-shadow.\n\tconst shadow = boxShadow(\n\t\t{\n\t\t\twidth,\n\t\t\theight,\n\t\t\tid,\n\t\t\topacity,\n\t\t\tshape: buildXMLString(type, {\n\t\t\t\tx: left,\n\t\t\t\ty: top,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\tfill: '#fff',\n\t\t\t\tstroke: '#fff',\n\t\t\t\t'stroke-width': 0,\n\t\t\t\td: path ? path : undefined,\n\t\t\t\ttransform: matrix ? matrix : undefined,\n\t\t\t\t'clip-path': currentClipPath,\n\t\t\t\tmask: maskId\n\t\t\t})\n\t\t},\n\t\tstyle\n\t);\n\n\treturn (\n\t\t(defs ? buildXMLString('defs', {}, defs) : '') +\n\t\t(shadow ? shadow[0] : '') +\n\t\t(imageBorderRadius ? imageBorderRadius[0] : '') +\n\t\tclip +\n\t\t(opacity !== 1 ? `<g opacity=\"${opacity}\">` : '') +\n\t\t(style.transform && (currentClipPath || maskId)\n\t\t\t? `<g${currentClipPath ? ` clip-path=\"${currentClipPath}\"` : ''}${\n\t\t\t\t\tmaskId ? ` mask=\"${maskId}\"` : ''\n\t\t\t }>`\n\t\t\t: '') +\n\t\t(backgroundShapes || shape) +\n\t\t(style.transform && (currentClipPath || maskId) ? '</g>' : '') +\n\t\t(opacity !== 1 ? `</g>` : '') +\n\t\t(shadow ? shadow[1] : '') +\n\t\textra\n\t);\n}\n","import { buildXMLString } from '../utils.js';\nimport radius from './border-radius.js';\n\ntype BuildBackdropFilterOptions = {\n\tbgGroupId: string;\n\tfilterValue: string;\n\theight: number;\n\tid: string;\n\tleft: number;\n\tmaskId?: string;\n\tstyle: Record<string, any>;\n\ttop: number;\n\twidth: number;\n};\n\nconst parseFilterValue = (value: string): string => {\n\tlet primitives = '';\n\tlet lastResult = 'SourceGraphic';\n\tlet hasBlur = false;\n\n\t// blur(Npx)\n\tconst blurMatch = value.match(/blur\\(([\\d.]+)(?:px)?\\)/);\n\tif (blurMatch) {\n\t\thasBlur = true;\n\t\tconst result = 'satori_bfblur';\n\t\tprimitives += buildXMLString('feGaussianBlur', {\n\t\t\tedgeMode: 'duplicate',\n\t\t\tin: lastResult,\n\t\t\tresult,\n\t\t\tstdDeviation: parseFloat(blurMatch[1])\n\t\t});\n\t\tlastResult = result;\n\t}\n\n\t// saturate(N) or saturate(N%)\n\tconst saturateMatch = value.match(/saturate\\(([\\d.]+)(%?)\\)/);\n\tif (saturateMatch) {\n\t\tconst val =\n\t\t\tsaturateMatch[2] === '%'\n\t\t\t\t? parseFloat(saturateMatch[1]) / 100\n\t\t\t\t: parseFloat(saturateMatch[1]);\n\t\tconst result = 'satori_bfsat';\n\t\tprimitives += buildXMLString('feColorMatrix', {\n\t\t\tin: lastResult,\n\t\t\tresult,\n\t\t\ttype: 'saturate',\n\t\t\tvalues: val\n\t\t});\n\t\tlastResult = result;\n\t}\n\n\t// brightness(N)\n\tconst brightnessMatch = value.match(/brightness\\(([\\d.]+)\\)/);\n\tif (brightnessMatch) {\n\t\tconst val = parseFloat(brightnessMatch[1]);\n\t\tconst result = 'satori_bfbri';\n\t\tprimitives += buildXMLString(\n\t\t\t'feComponentTransfer',\n\t\t\t{ in: lastResult, result },\n\t\t\tbuildXMLString('feFuncR', { slope: val, type: 'linear' }) +\n\t\t\t\tbuildXMLString('feFuncG', { slope: val, type: 'linear' }) +\n\t\t\t\tbuildXMLString('feFuncB', { slope: val, type: 'linear' })\n\t\t);\n\t\tlastResult = result;\n\t}\n\n\t// contrast(N)\n\tconst contrastMatch = value.match(/contrast\\(([\\d.]+)\\)/);\n\tif (contrastMatch) {\n\t\tconst val = parseFloat(contrastMatch[1]);\n\t\tconst intercept = -(0.5 * val) + 0.5;\n\t\tconst result = 'satori_bfcon';\n\t\tprimitives += buildXMLString(\n\t\t\t'feComponentTransfer',\n\t\t\t{ in: lastResult, result },\n\t\t\tbuildXMLString('feFuncR', {\n\t\t\t\tintercept,\n\t\t\t\tslope: val,\n\t\t\t\ttype: 'linear'\n\t\t\t}) +\n\t\t\t\tbuildXMLString('feFuncG', {\n\t\t\t\t\tintercept,\n\t\t\t\t\tslope: val,\n\t\t\t\t\ttype: 'linear'\n\t\t\t\t}) +\n\t\t\t\tbuildXMLString('feFuncB', {\n\t\t\t\t\tintercept,\n\t\t\t\t\tslope: val,\n\t\t\t\t\ttype: 'linear'\n\t\t\t\t})\n\t\t);\n\t\tlastResult = result;\n\t}\n\n\t// grayscale(N) or grayscale(N%)\n\tconst grayscaleMatch = value.match(/grayscale\\(([\\d.]+)(%?)\\)/);\n\tif (grayscaleMatch) {\n\t\tconst val =\n\t\t\tgrayscaleMatch[2] === '%'\n\t\t\t\t? parseFloat(grayscaleMatch[1]) / 100\n\t\t\t\t: parseFloat(grayscaleMatch[1]);\n\t\tconst result = 'satori_bfgray';\n\t\tprimitives += buildXMLString('feColorMatrix', {\n\t\t\tin: lastResult,\n\t\t\tresult,\n\t\t\ttype: 'saturate',\n\t\t\tvalues: 1 - Math.min(val, 1)\n\t\t});\n\t\tlastResult = result;\n\t}\n\n\t// Fix blur edge transparency: composite with source to force opaque output\n\t// where the original was opaque. Without this, feGaussianBlur fades to\n\t// transparent at content boundaries (edgeMode=\"duplicate\" is not widely\n\t// supported by SVG renderers like resvg).\n\tif (hasBlur) {\n\t\tprimitives += buildXMLString('feComposite', {\n\t\t\tin: lastResult,\n\t\t\tin2: 'SourceGraphic',\n\t\t\toperator: 'atop'\n\t\t});\n\t}\n\n\treturn primitives;\n};\n\nexport const buildBackdropFilter = (\n\toptions: BuildBackdropFilterOptions\n): string => {\n\tconst {\n\t\tbgGroupId,\n\t\tfilterValue,\n\t\theight,\n\t\tid,\n\t\tleft,\n\t\tmaskId,\n\t\tstyle,\n\t\ttop,\n\t\twidth\n\t} = options;\n\n\tconst primitives = parseFilterValue(filterValue);\n\tif (!primitives) {\n\t\treturn '';\n\t}\n\n\tconst filterId = `satori_bf-${id}`;\n\tconst clipId = `satori_bfc-${id}`;\n\n\t// Filter definition with generous region for blur overflow.\n\tconst filterDef = buildXMLString(\n\t\t'filter',\n\t\t{\n\t\t\theight: '200%',\n\t\t\tid: filterId,\n\t\t\twidth: '200%',\n\t\t\tx: '-50%',\n\t\t\ty: '-50%'\n\t\t},\n\t\tprimitives\n\t);\n\n\t// Clip path — use border-radius path when available, else a rect.\n\tconst borderRadiusPath = radius({ height, left, top, width }, style);\n\tconst clipContent = borderRadiusPath\n\t\t? buildXMLString('path', { d: borderRadiusPath })\n\t\t: buildXMLString('rect', { height, width, x: left, y: top });\n\tconst clipDef = buildXMLString('clipPath', { id: clipId }, clipContent);\n\n\tconst defs = buildXMLString('defs', {}, filterDef + clipDef);\n\n\t// <use> referencing the background group with filter + clip + optional mask.\n\tconst useAttrs: Record<string, string | number> = {\n\t\t'clip-path': `url(#${clipId})`,\n\t\tfilter: `url(#${filterId})`,\n\t\thref: `#${bgGroupId}`\n\t};\n\n\tif (maskId) {\n\t\tuseAttrs.mask = `url(#${maskId})`;\n\t}\n\n\tconst useElement = buildXMLString('use', useAttrs);\n\n\treturn defs + useElement;\n};\n","const r = String.raw,\n e = r`\\p{Emoji}(?:\\p{EMod}|[\\u{E0020}-\\u{E007E}]+\\u{E007F}|\\uFE0F?\\u20E3?)`;\nexport default () => new RegExp(r`\\p{RI}{2}|(?![#*\\d](?!\\uFE0F?\\u20E3))${e}(?:\\u200D${e})*`, 'gu');\n","// This function guesses the human language (writing system) of the given\n// JavaScript string, using the Unicode Alias in extended RegExp.\n//\n// You can learn more about this in:\n// - https://en.wikipedia.org/wiki/Script_(Unicode)\n// - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Unicode_Property_Escapes\n// - https://unicode.org/reports/tr18/#General_Category_Property\n// - https://tc39.es/ecma262/multipage/text-processing.html#table-unicode-script-values\n\nimport createEmojiRegex from 'emoji-regex-xs';\n\nconst emojiRegex = new RegExp(createEmojiRegex(), 'u');\n\n// Supported languages. The order matters.\n// Usually, this is only for \"special cases\" like CJKV languages as latin\n// characters are usually included in the base font, and can be safely fallback\n// to the Noto Sans font. A list of special cases we want to support can be\n// found here (sort by popularity):\n// - https://fonts.google.com/noto/fonts?sort=popularity&noto.query=sans\n//\n// We can't tell if a hanzi(kanji) is Chinese or Japanese by regular expressions.\n// - https://unicode.org/faq/han_cjk.html\n\nconst specialCode = {\n\temoji: emojiRegex,\n\tsymbol: /\\p{Symbol}/u,\n\tmath: /\\p{Math}/u\n} as const;\n\nconst code = {\n\t'ja-JP': /\\p{scx=Hira}|\\p{scx=Kana}|\\p{scx=Han}|[\\u3000]|[\\uFF00-\\uFFEF]/u,\n\t'ko-KR': /\\p{scx=Hangul}/u,\n\t'zh-CN': /\\p{scx=Han}/u,\n\t'zh-TW': /\\p{scx=Han}/u,\n\t'zh-HK': /\\p{scx=Han}/u,\n\t'th-TH': /\\p{scx=Thai}/u,\n\t'bn-IN': /\\p{scx=Bengali}/u,\n\t'ar-AR': /\\p{scx=Arabic}/u,\n\t'ta-IN': /\\p{scx=Tamil}/u,\n\t'ml-IN': /\\p{scx=Malayalam}/u,\n\t'he-IL': /\\p{scx=Hebrew}/u,\n\t'te-IN': /\\p{scx=Telugu}/u,\n\tdevanagari: /\\p{scx=Devanagari}/u,\n\tkannada: /\\p{scx=Kannada}/u\n} as const;\n\ntype SpecialCodeKey = keyof typeof specialCode;\ntype CodeKey = keyof typeof specialCode | keyof typeof code;\nexport type Locale = keyof typeof code;\nexport type LangCode = CodeKey | 'unknown';\n\nexport const locales = Object.keys({ ...code, ...specialCode }) as Locale[];\nexport function isValidLocale(x: any): x is Locale {\n\treturn locales.includes(x);\n}\n\nexport function detectLanguageCode(\n\tsegment: string,\n\tlocale?: Locale\n): Array<Locale> | ['unknown'] | [SpecialCodeKey] {\n\tfor (const c of Object.keys(specialCode) as SpecialCodeKey[]) {\n\t\tif (specialCode[c].test(segment)) {\n\t\t\treturn [c];\n\t\t}\n\t}\n\n\tconst languages = Object.keys(code).filter(lang =>\n\t\tcode[lang].test(segment)\n\t) as Locale[];\n\n\tif (languages.length === 0) {\n\t\treturn ['unknown'];\n\t}\n\n\tif (locale) {\n\t\tconst index = languages.findIndex(lang => lang === locale);\n\t\tif (index !== -1) {\n\t\t\tlanguages.splice(index, 1);\n\t\t\tlanguages.unshift(locale);\n\t\t}\n\t}\n\n\treturn languages;\n}\n\nexport function normalizeLocale(locale?: string): Locale | undefined {\n\tif (locale) {\n\t\treturn locales.find(l =>\n\t\t\tl.toLowerCase().startsWith(locale.toLowerCase())\n\t\t);\n\t}\n}\n","/**\n * This module is used to calculate the layout of the current sub-tree.\n */\n\nimport type { ReactNode } from 'react';\nimport {\n\tisReactElement,\n\tisClass,\n\tbuildXMLString,\n\tnormalizeChildren,\n\thasDangerouslySetInnerHTMLProp,\n\tisReactComponent,\n\tisForwardRefComponent\n} from './utils.js';\nimport { getYoga, YogaNode } from './yoga.js';\nimport { SVGNodeToImage } from './handler/preprocess.js';\nimport computeStyle from './handler/compute.js';\nimport FontLoader from './font.js';\nimport buildTextNodes from './text/index.js';\nimport rect from './builder/rect.js';\nimport { buildBackdropFilter } from './builder/backdrop-filter.js';\nimport { Locale, normalizeLocale } from './language.js';\nimport { SerializedStyle } from './handler/expand.js';\n\nexport type BackdropFilterInfo = {\n\tfilter: string;\n\tinheritedStyle: SerializedStyle;\n\tnode: YogaNode;\n\tstyle: SerializedStyle;\n};\n\nexport interface LayoutContext {\n\tid: string;\n\tparentStyle: SerializedStyle;\n\tinheritedStyle: SerializedStyle;\n\tisInheritingTransform?: boolean;\n\tparent: YogaNode;\n\tfont: FontLoader;\n\tembedFont: boolean;\n\tdebug?: boolean;\n\tgraphemeImages?: Record<string, string>;\n\tcanLoadAdditionalAssets: boolean;\n\tlocale?: Locale;\n\tonNodeDetected?: (node: SatoriNode) => void;\n\t_registerBackdropFilter?: (info: BackdropFilterInfo) => void;\n}\n\nexport interface SatoriNode {\n\t// Layout information.\n\tleft: number;\n\ttop: number;\n\twidth: number;\n\theight: number;\n\ttype: string;\n\tkey?: string | number;\n\tprops: Record<string, any>;\n\ttextContent?: string;\n}\n\nexport default async function* layout(\n\telement: ReactNode,\n\tcontext: LayoutContext\n): AsyncGenerator<\n\t{ word: string; locale?: string }[],\n\tstring,\n\t[number, number]\n> {\n\tconst Yoga = await getYoga();\n\tconst {\n\t\tid,\n\t\tinheritedStyle,\n\t\tparent,\n\t\tfont,\n\t\tdebug,\n\t\tlocale,\n\t\tembedFont = true,\n\t\tgraphemeImages,\n\t\tcanLoadAdditionalAssets\n\t} = context;\n\n\t// 1. Pre-process the node.\n\tif (element === null || typeof element === 'undefined') {\n\t\tyield;\n\t\tyield;\n\t\treturn '';\n\t}\n\n\t// Not a regular element.\n\tif (!isReactElement(element) || isReactComponent(element.type)) {\n\t\tlet iter: ReturnType<typeof layout>;\n\n\t\tif (!isReactElement(element)) {\n\t\t\t// Process as text node.\n\t\t\titer = buildTextNodes(String(element), context);\n\t\t\tyield (await iter.next()).value as {\n\t\t\t\tword: string;\n\t\t\t\tlocale?: Locale;\n\t\t\t}[];\n\t\t} else {\n\t\t\tif (isClass(element.type as Function)) {\n\t\t\t\tthrow new Error('Class component is not supported.');\n\t\t\t}\n\n\t\t\tlet render: Function;\n\n\t\t\t// This is a hack to support React.forwardRef wrapped components.\n\t\t\t// https://github.com/vercel/satori/issues/600\n\t\t\tif (isForwardRefComponent(element.type)) {\n\t\t\t\trender = (element.type as any).render;\n\t\t\t} else {\n\t\t\t\trender = element.type as Function;\n\t\t\t}\n\n\t\t\t// If it's a custom component, Satori strictly requires it to be pure,\n\t\t\t// stateless, and not relying on any React APIs such as hooks or suspense.\n\t\t\t// So we can safely evaluate it to render. Otherwise, an error will be\n\t\t\t// thrown by React.\n\t\t\titer = layout(await render(element.props), context);\n\t\t\tyield (await iter.next()).value as {\n\t\t\t\tword: string;\n\t\t\t\tlocale?: string;\n\t\t\t}[];\n\t\t}\n\n\t\tawait iter.next();\n\t\tconst offset = yield;\n\t\treturn (await iter.next(offset)).value as string;\n\t}\n\n\t// Process as element.\n\tconst { type: $type, props } = element;\n\t// type must be a string here.\n\tconst type = $type as string;\n\n\tif (props && hasDangerouslySetInnerHTMLProp(props)) {\n\t\tthrow new Error(\n\t\t\t'dangerouslySetInnerHTML property is not supported. See documentation for more information https://github.com/vercel/satori#jsx.'\n\t\t);\n\t}\n\tlet { style, children, lang: _newLocale = locale } = props || {};\n\tconst newLocale = normalizeLocale(_newLocale);\n\n\tconst node = Yoga.Node.create();\n\tparent.insertChild(node, parent.getChildCount());\n\n\tconst [computedStyle, newInheritableStyle] = await computeStyle(\n\t\tnode,\n\t\ttype,\n\t\tinheritedStyle,\n\t\tstyle,\n\t\tprops\n\t);\n\t// Post-process styles to attach inheritable properties for Satori.\n\n\t// If the element is inheriting the parent `transform`, or applying its own.\n\t// This affects the coordinate system.\n\tconst isInheritingTransform =\n\t\tcomputedStyle.transform === inheritedStyle.transform;\n\tif (!isInheritingTransform) {\n\t\t(computedStyle.transform as any).__parent = inheritedStyle.transform;\n\t}\n\n\t// If the element has `overflow` set to `hidden` or clip-path is set, we need to create a clip\n\t// path and use it in all its children.\n\tif (\n\t\tcomputedStyle.overflow === 'hidden' ||\n\t\t(computedStyle.clipPath && computedStyle.clipPath !== 'none')\n\t) {\n\t\tnewInheritableStyle._inheritedClipPathId = `satori_cp-${id}`;\n\t\tnewInheritableStyle._inheritedMaskId = `satori_om-${id}`;\n\t}\n\n\tif (computedStyle.maskImage) {\n\t\tnewInheritableStyle._inheritedMaskId = `satori_mi-${id}`;\n\t}\n\n\t// Register backdrop-filter with parent so it can inject the effect.\n\tif (computedStyle.backdropFilter && context._registerBackdropFilter) {\n\t\tcontext._registerBackdropFilter({\n\t\t\tfilter: computedStyle.backdropFilter as string,\n\t\t\tinheritedStyle: newInheritableStyle,\n\t\t\tnode,\n\t\t\tstyle: computedStyle\n\t\t});\n\t}\n\n\t// If the element has `background-clip: text` set, we need to create a clip\n\t// path and use it in all its children.\n\tif (computedStyle.backgroundClip === 'text') {\n\t\tconst mutateRefValue = { value: '' } as any;\n\t\tnewInheritableStyle._inheritedBackgroundClipTextPath = mutateRefValue;\n\t\tcomputedStyle._inheritedBackgroundClipTextPath = mutateRefValue;\n\n\t\tif (computedStyle.backgroundImage) {\n\t\t\tnewInheritableStyle._inheritedBackgroundClipTextHasBackground =\n\t\t\t\t'true';\n\t\t\tcomputedStyle._inheritedBackgroundClipTextHasBackground = 'true';\n\t\t}\n\t}\n\n\t// 2. Do layout recursively for its children.\n\tconst normalizedChildren = normalizeChildren(children);\n\tconst iterators: ReturnType<typeof layout>[] = [];\n\tconst backdropInfoByIndex: Record<number, BackdropFilterInfo> = {};\n\n\tlet i = 0;\n\tconst segmentsMissingFont: { word: string; locale?: string }[] = [];\n\tfor (const child of normalizedChildren) {\n\t\tconst currentIndex = i;\n\t\tconst iter = layout(child, {\n\t\t\tid: id + '-' + i++,\n\t\t\tparentStyle: computedStyle,\n\t\t\tinheritedStyle: newInheritableStyle,\n\t\t\tisInheritingTransform: true,\n\t\t\tparent: node,\n\t\t\tfont,\n\t\t\tembedFont,\n\t\t\tdebug,\n\t\t\tgraphemeImages,\n\t\t\tcanLoadAdditionalAssets,\n\t\t\tlocale: newLocale,\n\t\t\tonNodeDetected: context.onNodeDetected,\n\t\t\t_registerBackdropFilter: (info: BackdropFilterInfo) => {\n\t\t\t\tbackdropInfoByIndex[currentIndex] = info;\n\t\t\t}\n\t\t});\n\t\tif (canLoadAdditionalAssets) {\n\t\t\tsegmentsMissingFont.push(\n\t\t\t\t...(((await iter.next()).value as any) || [])\n\t\t\t);\n\t\t} else {\n\t\t\tawait iter.next();\n\t\t}\n\t\titerators.push(iter);\n\t}\n\tyield segmentsMissingFont;\n\tfor (const iter of iterators) await iter.next();\n\n\t// 3. Post-process the node.\n\tconst [x, y] = yield;\n\tlet { left, top, width, height } = node.getComputedLayout();\n\t// Attach offset to the current node.\n\tleft += x;\n\ttop += y;\n\n\tlet childrenRenderResult = '';\n\tlet baseRenderResult = '';\n\tlet depsRenderResult = '';\n\n\t// Emit event for the current node. We don't pass the children prop to the\n\t// event handler because everything is already flattened, unless it's a text\n\t// node.\n\tconst { children: childrenNode, ...restProps } = props;\n\tcontext.onNodeDetected?.({\n\t\tleft,\n\t\ttop,\n\t\twidth,\n\t\theight,\n\t\ttype,\n\t\tprops: restProps,\n\t\tkey: element.key,\n\t\ttextContent: isReactElement(childrenNode) ? undefined : childrenNode\n\t});\n\n\t// Generate the rendered markup for the current node.\n\tif (type === 'img') {\n\t\tconst src = computedStyle.__src as string;\n\t\tbaseRenderResult = await rect(\n\t\t\t{\n\t\t\t\tid,\n\t\t\t\tleft,\n\t\t\t\ttop,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\tsrc,\n\t\t\t\tisInheritingTransform,\n\t\t\t\tdebug\n\t\t\t},\n\t\t\tcomputedStyle,\n\t\t\tnewInheritableStyle\n\t\t);\n\t} else if (type === 'svg') {\n\t\t// When entering a <svg> node, we need to convert it to a <img> with the\n\t\t// SVG data URL embedded.\n\t\tconst currentColor = computedStyle.color;\n\t\tconst src = await SVGNodeToImage(element, currentColor);\n\t\tbaseRenderResult = await rect(\n\t\t\t{\n\t\t\t\tid,\n\t\t\t\tleft,\n\t\t\t\ttop,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\tsrc,\n\t\t\t\tisInheritingTransform,\n\t\t\t\tdebug\n\t\t\t},\n\t\t\tcomputedStyle,\n\t\t\tnewInheritableStyle\n\t\t);\n\t} else {\n\t\tconst display = style?.display;\n\t\tif (\n\t\t\ttype === 'div' &&\n\t\t\tchildren &&\n\t\t\ttypeof children !== 'string' &&\n\t\t\tdisplay !== 'flex' &&\n\t\t\tdisplay !== 'none' &&\n\t\t\tdisplay !== 'contents'\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t`Expected <div> to have explicit \"display: flex\", \"display: contents\", or \"display: none\" if it has more than one child node.`\n\t\t\t);\n\t\t}\n\t\tbaseRenderResult = await rect(\n\t\t\t{ id, left, top, width, height, isInheritingTransform, debug },\n\t\t\tcomputedStyle,\n\t\t\tnewInheritableStyle\n\t\t);\n\t}\n\n\t// Generate the rendered markup for the children.\n\tfor (let j = 0; j < iterators.length; j++) {\n\t\t// If this child has backdrop-filter, wrap all prior content in a <g> and\n\t\t// insert a <use> with the SVG filter + clip before the child.\n\t\tif (backdropInfoByIndex[j]) {\n\t\t\tconst info = backdropInfoByIndex[j];\n\t\t\tconst childLayout = info.node.getComputedLayout();\n\t\t\tconst childLeft = left + childLayout.left;\n\t\t\tconst childTop = top + childLayout.top;\n\t\t\tconst childWidth = childLayout.width;\n\t\t\tconst childHeight = childLayout.height;\n\n\t\t\tconst bgGroupId = `satori_bfbg-${id}-${j}`;\n\t\t\tconst currentContent = baseRenderResult + childrenRenderResult;\n\t\t\tbaseRenderResult = `<g id=\"${bgGroupId}\">${currentContent}</g>`;\n\t\t\tchildrenRenderResult = '';\n\n\t\t\t// Forward-reference the child's mask (generated by the child later).\n\t\t\tconst childId = id + '-' + j;\n\t\t\tconst maskId = info.style.maskImage\n\t\t\t\t? `satori_mi-${childId}`\n\t\t\t\t: undefined;\n\n\t\t\tchildrenRenderResult += buildBackdropFilter({\n\t\t\t\tbgGroupId,\n\t\t\t\tfilterValue: info.filter,\n\t\t\t\theight: childHeight,\n\t\t\t\tid: childId,\n\t\t\t\tleft: childLeft,\n\t\t\t\tmaskId,\n\t\t\t\tstyle: info.style as Record<string, any>,\n\t\t\t\ttop: childTop,\n\t\t\t\twidth: childWidth\n\t\t\t});\n\t\t}\n\n\t\tchildrenRenderResult += (await iterators[j].next([left, top])).value;\n\t}\n\n\t// An extra pass to generate the special background-clip shape collected from\n\t// children.\n\tif (computedStyle._inheritedBackgroundClipTextPath) {\n\t\tdepsRenderResult += buildXMLString(\n\t\t\t'clipPath',\n\t\t\t{\n\t\t\t\tid: `satori_bct-${id}`,\n\t\t\t\t'clip-path': computedStyle._inheritedClipPathId\n\t\t\t\t\t? `url(#${computedStyle._inheritedClipPathId})`\n\t\t\t\t\t: undefined\n\t\t\t},\n\t\t\t(computedStyle._inheritedBackgroundClipTextPath as any).value\n\t\t);\n\t}\n\n\treturn depsRenderResult + baseRenderResult + childrenRenderResult;\n}\n","/**\n * This class handles everything related to fonts.\n */\nimport opentype from '@shuding/opentype.js';\nimport { Locale, locales, isValidLocale } from './language.js';\n\nexport type Weight = 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\nexport type WeightName = 'normal' | 'bold';\nexport type FontWeight = Weight | WeightName;\nexport type FontStyle = 'normal' | 'italic';\nconst SUFFIX_WHEN_LANG_NOT_SET = 'unknown';\n\nexport interface FontOptions {\n\tdata: Buffer | ArrayBuffer;\n\tname: string;\n\tweight?: Weight;\n\tstyle?: FontStyle;\n\tlang?: string;\n}\n\nexport type GlyphBox = {\n\tx1: number;\n\tx2: number;\n\ty1: number;\n\ty2: number;\n};\ntype SkipInkBand = {\n\tunderlineY: number;\n\tstrokeWidth: number;\n};\n\nexport type FontEngine = {\n\thas: (s: string) => boolean;\n\tbaseline: (s?: string, resolvedFont?: any) => number;\n\theight: (s?: string, resolvedFont?: any) => number;\n\tmeasure: (\n\t\ts: string,\n\t\tstyle: {\n\t\t\tfontSize: number;\n\t\t\tletterSpacing: number;\n\t\t}\n\t) => number;\n\tgetSVG: (\n\t\ts: string,\n\t\tstyle: {\n\t\t\tfontSize: number;\n\t\t\ttop: number;\n\t\t\tleft: number;\n\t\t\tletterSpacing: number;\n\t\t},\n\t\tband?: SkipInkBand\n\t) => { path: string; boxes: GlyphBox[] };\n};\n\ntype BandPoint = [number, number];\n\ntype LineSegment = {\n\tfrom: BandPoint;\n\tto: BandPoint;\n};\n\nfunction flattenPath(commands: opentype.Path['commands']): LineSegment[] {\n\tconst segments: LineSegment[] = [];\n\tlet start: BandPoint = [0, 0];\n\tlet current: BandPoint = [0, 0];\n\n\tconst addCurve = (points: BandPoint[], steps: number) => {\n\t\tlet prev = points[0];\n\t\tfor (let i = 1; i <= steps; i++) {\n\t\t\tconst t = i / steps;\n\t\t\tconst next = evaluateBezier(points, t);\n\t\t\tsegments.push({ from: prev, to: next });\n\t\t\tprev = next;\n\t\t}\n\t\tcurrent = points[points.length - 1];\n\t};\n\n\tfor (const cmd of commands) {\n\t\tif (cmd.type === 'M') {\n\t\t\tstart = current = [cmd.x, cmd.y];\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (cmd.type === 'L') {\n\t\t\tconst next: BandPoint = [cmd.x, cmd.y];\n\t\t\tsegments.push({ from: current, to: next });\n\t\t\tcurrent = next;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (cmd.type === 'Q') {\n\t\t\taddCurve([current, [cmd.x1, cmd.y1], [cmd.x, cmd.y]], 12);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (cmd.type === 'C') {\n\t\t\taddCurve(\n\t\t\t\t[current, [cmd.x1, cmd.y1], [cmd.x2, cmd.y2], [cmd.x, cmd.y]],\n\t\t\t\t16\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (cmd.type === 'Z') {\n\t\t\tsegments.push({ from: current, to: start });\n\t\t\tcurrent = start;\n\t\t}\n\t}\n\n\treturn segments;\n}\n\nfunction evaluateBezier(points: BandPoint[], t: number): BandPoint {\n\tlet working = points;\n\n\twhile (working.length > 1) {\n\t\tconst next: BandPoint[] = [];\n\t\tfor (let i = 0; i < working.length - 1; i++) {\n\t\t\tnext.push([\n\t\t\t\tworking[i][0] + (working[i + 1][0] - working[i][0]) * t,\n\t\t\t\tworking[i][1] + (working[i + 1][1] - working[i][1]) * t\n\t\t\t]);\n\t\t}\n\t\tworking = next;\n\t}\n\n\treturn working[0];\n}\n\nfunction computeBandBox(\n\tcommands: opentype.Path['commands'],\n\tband?: SkipInkBand\n): GlyphBox[] {\n\tif (!band) return [];\n\n\tconst strokeWidth = band.strokeWidth;\n\tconst bandMin = band.underlineY - strokeWidth * 0.25;\n\tconst bandMax = band.underlineY + strokeWidth * 2.5;\n\n\tconst segments = flattenPath(commands);\n\tif (!segments.length) return [];\n\n\tconst bandHeight = bandMax - bandMin;\n\tconst ySamples = Math.max(12, Math.ceil(bandHeight / 0.25));\n\tconst yStep = bandHeight / ySamples;\n\tconst yStart = bandMin + yStep / 2;\n\n\tconst columnHits = new Set<number>();\n\n\tfor (let i = 0; i < ySamples; i++) {\n\t\tconst y = yStart + yStep * i;\n\t\tconst intersections: number[] = [];\n\n\t\tfor (const seg of segments) {\n\t\t\tconst [x1, y1] = seg.from;\n\t\t\tconst [x2, y2] = seg.to;\n\n\t\t\tif (y1 === y2) continue;\n\t\t\tconst yMin = Math.min(y1, y2);\n\t\t\tconst yMax = Math.max(y1, y2);\n\t\t\tif (y < yMin || y >= yMax) continue;\n\n\t\t\tconst t = (y - y1) / (y2 - y1);\n\t\t\tconst x = x1 + (x2 - x1) * t;\n\t\t\tintersections.push(x);\n\t\t}\n\n\t\tif (!intersections.length) continue;\n\t\tintersections.sort((a, b) => a - b);\n\n\t\tfor (let j = 0; j < intersections.length - 1; j += 2) {\n\t\t\tconst from = Math.min(intersections[j], intersections[j + 1]);\n\t\t\tconst to = Math.max(intersections[j], intersections[j + 1]);\n\t\t\tconst start = Math.floor(from);\n\t\t\tconst end = Math.ceil(to);\n\t\t\tfor (let col = start; col < end; col++) {\n\t\t\t\tcolumnHits.add(col);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!columnHits.size) return [];\n\n\tconst columns = Array.from(columnHits.values()).sort((a, b) => a - b);\n\tconst inkRanges: [number, number][] = [];\n\n\tlet rangeStart = columns[0];\n\tlet prev = columns[0];\n\tfor (let i = 1; i < columns.length; i++) {\n\t\tconst col = columns[i];\n\t\tif (col > prev + 1) {\n\t\t\tinkRanges.push([rangeStart, prev + 1]);\n\t\t\trangeStart = col;\n\t\t}\n\t\tprev = col;\n\t}\n\tinkRanges.push([rangeStart, prev + 1]);\n\n\tconst boxes: GlyphBox[] = [];\n\tconst bleed = strokeWidth * 0.6;\n\tconst minX = inkRanges[0][0];\n\tconst maxX = inkRanges[inkRanges.length - 1][1];\n\n\tfor (const [x1, x2] of inkRanges) {\n\t\tconst left = Math.min(x1, minX) - bleed;\n\t\tconst right = Math.max(x2, maxX) + bleed;\n\t\tboxes.push({\n\t\t\tx1: left,\n\t\t\tx2: right,\n\t\t\ty1: bandMin,\n\t\t\ty2: bandMax\n\t\t});\n\t}\n\n\treturn boxes;\n}\n\nfunction computeBoundingBox(\n\tcommands: opentype.Path['commands']\n): GlyphBox | null {\n\tconst xs: number[] = [];\n\tconst ys: number[] = [];\n\n\tfor (const cmd of commands) {\n\t\tif ('x' in cmd && typeof cmd.x === 'number') xs.push(cmd.x);\n\t\tif ('y' in cmd && typeof cmd.y === 'number') ys.push(cmd.y);\n\t\tif ('x1' in cmd && typeof cmd.x1 === 'number') xs.push(cmd.x1);\n\t\tif ('y1' in cmd && typeof cmd.y1 === 'number') ys.push(cmd.y1);\n\t\tif ('x2' in cmd && typeof cmd.x2 === 'number') xs.push(cmd.x2);\n\t\tif ('y2' in cmd && typeof cmd.y2 === 'number') ys.push(cmd.y2);\n\t}\n\n\tif (!xs.length || !ys.length) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tx1: Math.min(...xs),\n\t\tx2: Math.max(...xs),\n\t\ty1: Math.min(...ys),\n\t\ty2: Math.max(...ys)\n\t};\n}\n\nfunction compareFont(\n\tweight,\n\tstyle,\n\t[matchedWeight, matchedStyle],\n\t[nextWeight, nextStyle]\n) {\n\tif (matchedWeight !== nextWeight) {\n\t\t// Put the defined weight first.\n\t\tif (!matchedWeight) return 1;\n\t\tif (!nextWeight) return -1;\n\n\t\t// Exact match.\n\t\tif (matchedWeight === weight) return -1;\n\t\tif (nextWeight === weight) return 1;\n\n\t\t// 400 and 500.\n\t\tif (weight === 400 && matchedWeight === 500) return -1;\n\t\tif (weight === 500 && matchedWeight === 400) return -1;\n\t\tif (weight === 400 && nextWeight === 500) return 1;\n\t\tif (weight === 500 && nextWeight === 400) return 1;\n\n\t\t// Less than 400.\n\t\tif (weight < 400) {\n\t\t\tif (matchedWeight < weight && nextWeight < weight)\n\t\t\t\treturn nextWeight - matchedWeight;\n\t\t\tif (matchedWeight < weight) return -1;\n\t\t\tif (nextWeight < weight) return 1;\n\t\t\treturn matchedWeight - nextWeight;\n\t\t}\n\n\t\t// Greater than 500.\n\t\tif (weight < matchedWeight && weight < nextWeight)\n\t\t\treturn matchedWeight - nextWeight;\n\t\tif (weight < matchedWeight) return -1;\n\t\tif (weight < nextWeight) return 1;\n\t\treturn nextWeight - matchedWeight;\n\t}\n\n\tif (matchedStyle !== nextStyle) {\n\t\t// Exact match.\n\t\tif (matchedStyle === style) return -1;\n\t\tif (nextStyle === style) return 1;\n\t}\n\n\treturn -1;\n}\n\nconst cachedParsedFont = new WeakMap<\n\tBuffer | ArrayBuffer,\n\topentype.Font | null | undefined\n>();\n\nexport default class FontLoader {\n\tdefaultFont: opentype.Font;\n\tfonts = new Map<string, [opentype.Font, Weight?, FontStyle?][]>();\n\tconstructor(fontOptions: FontOptions[]) {\n\t\tthis.addFonts(fontOptions);\n\t}\n\n\t// Get font by name and weight.\n\tprivate get({\n\t\tname,\n\t\tweight,\n\t\tstyle\n\t}: {\n\t\tname: string;\n\t\tweight: Weight | WeightName;\n\t\tstyle: FontStyle;\n\t}) {\n\t\tif (!this.fonts.has(name)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (weight === 'normal') weight = 400;\n\t\tif (weight === 'bold') weight = 700;\n\t\tif (typeof weight === 'string')\n\t\t\tweight = Number.parseInt(weight, 10) as Weight;\n\n\t\tconst fonts = [...this.fonts.get(name)];\n\n\t\tlet matchedFont = fonts[0];\n\n\t\t// Fallback to the closest weight and style according to the strategy here:\n\t\t// https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight#fallback_weights\n\t\tfor (let i = 1; i < fonts.length; i++) {\n\t\t\tconst [, weight1, style1] = matchedFont;\n\t\t\tconst [, weight2, style2] = fonts[i];\n\t\t\tif (\n\t\t\t\tcompareFont(\n\t\t\t\t\tweight,\n\t\t\t\t\tstyle,\n\t\t\t\t\t[weight1, style1],\n\t\t\t\t\t[weight2, style2]\n\t\t\t\t) > 0\n\t\t\t) {\n\t\t\t\tmatchedFont = fonts[i];\n\t\t\t}\n\t\t}\n\n\t\treturn matchedFont[0];\n\t}\n\n\tpublic addFonts(fontOptions: FontOptions[]) {\n\t\tfor (const fontOption of fontOptions) {\n\t\t\tconst { name, data, lang } = fontOption;\n\t\t\tif (lang && !isValidLocale(lang)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid value for props \\`lang\\`: \"${lang}\". The value must be one of the following: ${locales.join(\n\t\t\t\t\t\t', '\n\t\t\t\t\t)}.`\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst _lang = lang ?? SUFFIX_WHEN_LANG_NOT_SET;\n\t\t\tlet font;\n\n\t\t\tif (cachedParsedFont.has(data)) {\n\t\t\t\tfont = cachedParsedFont.get(data);\n\t\t\t} else {\n\t\t\t\tfont = opentype.parse(\n\t\t\t\t\t// Buffer to ArrayBuffer.\n\t\t\t\t\t'buffer' in data\n\t\t\t\t\t\t? data.buffer.slice(\n\t\t\t\t\t\t\t\tdata.byteOffset,\n\t\t\t\t\t\t\t\tdata.byteOffset + data.byteLength\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: data,\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t{ lowMemory: true }\n\t\t\t\t);\n\t\t\t\t// Modify the `charToGlyphIndex` method, so we can know which char is\n\t\t\t\t// being mapped to which glyph.\n\t\t\t\tconst originalCharToGlyphIndex = font.charToGlyphIndex;\n\t\t\t\tfont.charToGlyphIndex = char => {\n\t\t\t\t\tconst index = originalCharToGlyphIndex.call(font, char);\n\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\t// The current requested char is missing a glyph.\n\t\t\t\t\t\tif ((font as any)._trackBrokenChars) {\n\t\t\t\t\t\t\t(font as any)._trackBrokenChars.push(char);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn index;\n\t\t\t\t};\n\n\t\t\t\tcachedParsedFont.set(data, font);\n\t\t\t}\n\n\t\t\t// We use the first font as the default font fallback.\n\t\t\tif (!this.defaultFont) this.defaultFont = font;\n\n\t\t\tconst _name = `${name.toLowerCase()}_${_lang}`;\n\n\t\t\tif (!this.fonts.has(_name)) {\n\t\t\t\tthis.fonts.set(_name, []);\n\t\t\t}\n\t\t\tthis.fonts\n\t\t\t\t.get(_name)\n\t\t\t\t.push([font, fontOption.weight, fontOption.style]);\n\t\t}\n\t}\n\n\tpublic getEngine(\n\t\tfontSize = 16,\n\t\tlineHeight: number | string = 'normal',\n\t\t{\n\t\t\tfontFamily = 'sans-serif',\n\t\t\tfontWeight = 400,\n\t\t\tfontStyle = 'normal'\n\t\t}: {\n\t\t\tfontFamily?: string | string[];\n\t\t\tfontWeight?: FontWeight;\n\t\t\tfontStyle?: FontStyle;\n\t\t},\n\t\tlocale: Locale | undefined\n\t): FontEngine {\n\t\tif (!this.fonts.size) {\n\t\t\tthrow new Error(\n\t\t\t\t'No fonts are loaded. At least one font is required to calculate the layout.'\n\t\t\t);\n\t\t}\n\n\t\tfontFamily = (\n\t\t\tArray.isArray(fontFamily) ? fontFamily : [fontFamily]\n\t\t).map(name => name.toLowerCase());\n\t\tconst fonts = [];\n\t\tfontFamily.forEach(face => {\n\t\t\tconst getNormal = this.get({\n\t\t\t\tname: face,\n\t\t\t\tweight: fontWeight,\n\t\t\t\tstyle: fontStyle\n\t\t\t});\n\t\t\tif (getNormal) {\n\t\t\t\tfonts.push(getNormal);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst getUnknown = this.get({\n\t\t\t\tname: face + '_unknown',\n\t\t\t\tweight: fontWeight,\n\t\t\t\tstyle: fontStyle\n\t\t\t});\n\n\t\t\tif (getUnknown) {\n\t\t\t\tfonts.push(getUnknown);\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\n\t\t// Add additional fonts as the fallback.\n\t\tconst keys = Array.from(this.fonts.keys());\n\t\tconst specifiedLangFonts = [];\n\t\tconst nonSpecifiedLangFonts = [];\n\t\tconst additionalFonts = [];\n\t\tfor (const name of keys) {\n\t\t\tif (fontFamily.includes(name)) continue;\n\t\t\tif (locale) {\n\t\t\t\tconst lang = getLangFromFontName(name);\n\t\t\t\tif (lang) {\n\t\t\t\t\tif (lang === locale) {\n\t\t\t\t\t\tspecifiedLangFonts.push(\n\t\t\t\t\t\t\tthis.get({\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\tweight: fontWeight,\n\t\t\t\t\t\t\t\tstyle: fontStyle\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnonSpecifiedLangFonts.push(\n\t\t\t\t\t\t\tthis.get({\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\tweight: fontWeight,\n\t\t\t\t\t\t\t\tstyle: fontStyle\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tadditionalFonts.push(\n\t\t\t\t\t\tthis.get({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tweight: fontWeight,\n\t\t\t\t\t\t\tstyle: fontStyle\n\t\t\t\t\t\t})\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tadditionalFonts.push(\n\t\t\t\t\tthis.get({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tweight: fontWeight,\n\t\t\t\t\t\tstyle: fontStyle\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst cachedFontResolver = new Map<number, opentype.Font | undefined>();\n\t\tconst resolveFont = (word: string, fallback = true) => {\n\t\t\tconst _fonts = [\n\t\t\t\t...fonts,\n\t\t\t\t...additionalFonts,\n\t\t\t\t...specifiedLangFonts,\n\t\t\t\t...(fallback ? nonSpecifiedLangFonts : [])\n\t\t\t];\n\n\t\t\tif (typeof word === 'undefined') {\n\t\t\t\tif (fallback) {\n\t\t\t\t\treturn _fonts[_fonts.length - 1];\n\t\t\t\t}\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst code = word.charCodeAt(0);\n\t\t\tif (cachedFontResolver.has(code))\n\t\t\t\treturn cachedFontResolver.get(code);\n\n\t\t\tconst font = _fonts.find((_font, index) => {\n\t\t\t\treturn (\n\t\t\t\t\t!!_font.charToGlyphIndex(word) ||\n\t\t\t\t\t(fallback && index === _fonts.length - 1)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tif (font) {\n\t\t\t\tcachedFontResolver.set(code, font);\n\t\t\t}\n\n\t\t\treturn font;\n\t\t};\n\n\t\tconst ascender = (resolvedFont: opentype.Font, useOS2Table = false) => {\n\t\t\tconst _ascender =\n\t\t\t\t(useOS2Table ? resolvedFont.tables?.os2?.sTypoAscender : 0) ||\n\t\t\t\tresolvedFont.ascender;\n\t\t\treturn (_ascender / resolvedFont.unitsPerEm) * fontSize;\n\t\t};\n\n\t\tconst descender = (\n\t\t\tresolvedFont: opentype.Font,\n\t\t\tuseOS2Table = false\n\t\t) => {\n\t\t\tconst _descender =\n\t\t\t\t(useOS2Table ? resolvedFont.tables?.os2?.sTypoDescender : 0) ||\n\t\t\t\tresolvedFont.descender;\n\t\t\treturn (_descender / resolvedFont.unitsPerEm) * fontSize;\n\t\t};\n\n\t\tconst height = (resolvedFont: opentype.Font, useOS2Table = false) => {\n\t\t\tif ('string' === typeof lineHeight && 'normal' === lineHeight) {\n\t\t\t\tconst _lineGap =\n\t\t\t\t\t(useOS2Table\n\t\t\t\t\t\t? resolvedFont.tables?.os2?.sTypoLineGap\n\t\t\t\t\t\t: 0) || 0;\n\t\t\t\treturn (\n\t\t\t\t\tascender(resolvedFont, useOS2Table) -\n\t\t\t\t\tdescender(resolvedFont, useOS2Table) +\n\t\t\t\t\t(_lineGap / resolvedFont.unitsPerEm) * fontSize\n\t\t\t\t);\n\t\t\t} else if ('number' === typeof lineHeight) {\n\t\t\t\treturn fontSize * lineHeight;\n\t\t\t}\n\t\t};\n\n\t\tconst resolve = (s: string) => {\n\t\t\treturn resolveFont(s, false);\n\t\t};\n\n\t\tconst engine = {\n\t\t\thas: (s: string) => {\n\t\t\t\tif (s === '\\n') return true;\n\t\t\t\tconst font = resolve(s);\n\t\t\t\tif (!font) return false;\n\t\t\t\t(font as any)._trackBrokenChars = [];\n\t\t\t\tfont.stringToGlyphs(s);\n\t\t\t\tif (!(font as any)._trackBrokenChars.length) return true;\n\t\t\t\t(font as any)._trackBrokenChars = undefined;\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tbaseline: (\n\t\t\t\ts?: string,\n\t\t\t\tresolvedFont = typeof s === 'undefined'\n\t\t\t\t\t? fonts[0]\n\t\t\t\t\t: resolveFont(s)\n\t\t\t) => {\n\t\t\t\tconst asc = ascender(resolvedFont);\n\t\t\t\tconst desc = descender(resolvedFont);\n\t\t\t\tconst contentHeight = asc - desc;\n\n\t\t\t\treturn asc + (height(resolvedFont) - contentHeight) / 2;\n\t\t\t},\n\t\t\theight: (\n\t\t\t\ts?: string,\n\t\t\t\tresolvedFont = typeof s === 'undefined'\n\t\t\t\t\t? fonts[0]\n\t\t\t\t\t: resolveFont(s)\n\t\t\t) => {\n\t\t\t\treturn height(resolvedFont);\n\t\t\t},\n\t\t\tmeasure: (\n\t\t\t\ts: string,\n\t\t\t\tstyle: {\n\t\t\t\t\tfontSize: number;\n\t\t\t\t\tletterSpacing: number;\n\t\t\t\t}\n\t\t\t) => {\n\t\t\t\treturn this.measure(resolveFont, s, style);\n\t\t\t},\n\t\t\tgetSVG: (\n\t\t\t\ts: string,\n\t\t\t\tstyle: {\n\t\t\t\t\tfontSize: number;\n\t\t\t\t\ttop: number;\n\t\t\t\t\tleft: number;\n\t\t\t\t\tletterSpacing: number;\n\t\t\t\t},\n\t\t\t\tband?: SkipInkBand\n\t\t\t) => {\n\t\t\t\treturn this.getSVG(resolveFont, s, style, band);\n\t\t\t}\n\t\t};\n\n\t\treturn engine;\n\t}\n\n\tprivate patchFontFallbackResolver(\n\t\tfont: opentype.Font,\n\t\tresolveFont: (word: string, fallback?: boolean) => opentype.Font\n\t) {\n\t\tconst brokenChars = [];\n\t\t(font as any)._trackBrokenChars = brokenChars;\n\n\t\tconst originalStringToGlyphs = font.stringToGlyphs;\n\t\tfont.stringToGlyphs = (s: string, ...args: any) => {\n\t\t\tconst glyphs = originalStringToGlyphs.call(font, s, ...args);\n\n\t\t\tfor (let i = 0; i < glyphs.length; i++) {\n\t\t\t\t// Hitting an undefined glyph. We have to try to resolve it from other\n\t\t\t\t// fonts.\n\t\t\t\t// @TODO: This affects the kerning resolution but should be fine for now.\n\t\t\t\tif (glyphs[i].unicode === undefined) {\n\t\t\t\t\tconst char = brokenChars.shift();\n\t\t\t\t\tconst anotherFont = resolveFont(char);\n\t\t\t\t\tif (anotherFont !== font) {\n\t\t\t\t\t\tconst glyph = anotherFont.charToGlyph(char);\n\t\t\t\t\t\t// Scale the glyph to match the current units per em.\n\t\t\t\t\t\tconst scale = font.unitsPerEm / anotherFont.unitsPerEm;\n\t\t\t\t\t\tconst p = new opentype.Path();\n\t\t\t\t\t\tp.unitsPerEm = font.unitsPerEm;\n\t\t\t\t\t\tp.commands = glyph.path.commands.map(command => {\n\t\t\t\t\t\t\tconst scaledCommand = { ...command };\n\t\t\t\t\t\t\tfor (let k in scaledCommand) {\n\t\t\t\t\t\t\t\tif (typeof scaledCommand[k] === 'number') {\n\t\t\t\t\t\t\t\t\tscaledCommand[k] *= scale;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn scaledCommand;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst g = new opentype.Glyph({\n\t\t\t\t\t\t\t...glyph,\n\t\t\t\t\t\t\tadvanceWidth: glyph.advanceWidth * scale,\n\t\t\t\t\t\t\txMin: glyph.xMin * scale,\n\t\t\t\t\t\t\txMax: glyph.xMax * scale,\n\t\t\t\t\t\t\tyMin: glyph.yMin * scale,\n\t\t\t\t\t\t\tyMax: glyph.yMax * scale,\n\t\t\t\t\t\t\tpath: p\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tglyphs[i] = g;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn glyphs;\n\t\t};\n\n\t\treturn () => {\n\t\t\tfont.stringToGlyphs = originalStringToGlyphs;\n\t\t\t(font as any)._trackBrokenChars = undefined;\n\t\t};\n\t}\n\n\tprivate measure(\n\t\tresolveFont: (word: string, fallback?: boolean) => opentype.Font,\n\t\tcontent: string,\n\t\t{\n\t\t\tfontSize,\n\t\t\tletterSpacing = 0\n\t\t}: {\n\t\t\tfontSize: number;\n\t\t\tletterSpacing: number;\n\t\t}\n\t) {\n\t\tconst font = resolveFont(content);\n\t\tconst unpatch = this.patchFontFallbackResolver(font, resolveFont);\n\n\t\ttry {\n\t\t\treturn font.getAdvanceWidth(content, fontSize, {\n\t\t\t\tletterSpacing: letterSpacing / fontSize\n\t\t\t});\n\t\t} finally {\n\t\t\tunpatch();\n\t\t}\n\t}\n\n\tprivate getSVG(\n\t\tresolveFont: (word: string, fallback?: boolean) => opentype.Font,\n\t\tcontent: string,\n\t\t{\n\t\t\tfontSize,\n\t\t\ttop,\n\t\t\tleft,\n\t\t\tletterSpacing = 0\n\t\t}: {\n\t\t\tfontSize: number;\n\t\t\ttop: number;\n\t\t\tleft: number;\n\t\t\tletterSpacing: number;\n\t\t},\n\t\tband?: SkipInkBand\n\t): { path: string; boxes: GlyphBox[] } {\n\t\tconst font = resolveFont(content);\n\t\tconst unpatch = this.patchFontFallbackResolver(font, resolveFont);\n\n\t\ttry {\n\t\t\tif (fontSize === 0) {\n\t\t\t\treturn { path: '', boxes: [] };\n\t\t\t}\n\n\t\t\tconst fullPath = new opentype.Path();\n\t\t\tconst boxes: GlyphBox[] = [];\n\n\t\t\tconst options = {\n\t\t\t\tletterSpacing: letterSpacing / fontSize\n\t\t\t};\n\n\t\t\tconst cachedPath = new WeakMap<\n\t\t\t\topentype.Glyph,\n\t\t\t\t[number, number, opentype.Path]\n\t\t\t>();\n\n\t\t\tfont.forEachGlyph(\n\t\t\t\tcontent.replace(/\\n/g, ''),\n\t\t\t\tleft,\n\t\t\t\ttop,\n\t\t\t\tfontSize,\n\t\t\t\toptions,\n\t\t\t\tfunction (glyph, gX, gY, gFontSize) {\n\t\t\t\t\tlet glyphPath: opentype.Path;\n\t\t\t\t\tif (!cachedPath.has(glyph)) {\n\t\t\t\t\t\tglyphPath = glyph.getPath(gX, gY, gFontSize, options);\n\t\t\t\t\t\tcachedPath.set(glyph, [gX, gY, glyphPath]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst [_x, _y, _glyphPath] = cachedPath.get(glyph);\n\t\t\t\t\t\tglyphPath = new opentype.Path();\n\t\t\t\t\t\tglyphPath.commands = _glyphPath.commands.map(\n\t\t\t\t\t\t\tcommand => {\n\t\t\t\t\t\t\t\tconst movedCommand = { ...command };\n\t\t\t\t\t\t\t\tfor (let k in movedCommand) {\n\t\t\t\t\t\t\t\t\tif (typeof movedCommand[k] === 'number') {\n\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\tk === 'x' ||\n\t\t\t\t\t\t\t\t\t\t\tk === 'x1' ||\n\t\t\t\t\t\t\t\t\t\t\tk === 'x2'\n\t\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t\tmovedCommand[k] += gX - _x;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\tk === 'y' ||\n\t\t\t\t\t\t\t\t\t\t\tk === 'y1' ||\n\t\t\t\t\t\t\t\t\t\t\tk === 'y2'\n\t\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t\tmovedCommand[k] += gY - _y;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn movedCommand;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst bandBoxes = band\n\t\t\t\t\t\t? computeBandBox(glyphPath.commands, band)\n\t\t\t\t\t\t: [];\n\t\t\t\t\tif (bandBoxes.length) {\n\t\t\t\t\t\tboxes.push(...bandBoxes);\n\t\t\t\t\t}\n\n\t\t\t\t\tfullPath.extend(glyphPath);\n\t\t\t\t}\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tpath: fullPath.toPathData(1),\n\t\t\t\tboxes\n\t\t\t};\n\t\t} finally {\n\t\t\tunpatch();\n\t\t}\n\t}\n}\n\nfunction getLangFromFontName(name: string): Locale | undefined {\n\tconst arr = name.split('_');\n\tconst lang = arr[arr.length - 1];\n\n\treturn lang === SUFFIX_WHEN_LANG_NOT_SET ? undefined : (lang as Locale);\n}\n","import { buildXMLString } from '../utils.js';\n\nexport default function svg({\n\twidth,\n\theight,\n\tcontent\n}: {\n\twidth: number;\n\theight: number;\n\tcontent: string;\n}) {\n\treturn buildXMLString(\n\t\t'svg',\n\t\t{\n\t\t\twidth,\n\t\t\theight,\n\t\t\tviewBox: `0 0 ${width} ${height}`,\n\t\t\txmlns: 'http://www.w3.org/2000/svg'\n\t\t},\n\t\tcontent\n\t);\n}\n","import type { ReactNode } from 'react';\nimport type { SatoriNode } from './layout.js';\n\nimport layout from './layout.js';\nimport FontLoader, { FontOptions } from './font.js';\nimport svg from './builder/svg.js';\nimport { getYoga, TYoga } from './yoga.js';\nimport { detectLanguageCode, LangCode, Locale } from './language.js';\nimport { preProcessNode } from './handler/preprocess.js';\nimport { cache, inflightRequests } from './handler/image.js';\nimport { segment } from './utils.js';\n\n// We don't need to initialize the opentype instances every time.\nconst fontCache = new WeakMap();\n\nexport type SatoriOptions = (\n\t| {\n\t\t\twidth: number;\n\t\t\theight: number;\n\t }\n\t| {\n\t\t\twidth: number;\n\t }\n\t| {\n\t\t\theight: number;\n\t }\n) & {\n\tfonts: FontOptions[];\n\tembedFont?: boolean;\n\tdebug?: boolean;\n\tgraphemeImages?: Record<string, string>;\n\tloadAdditionalAsset?: (\n\t\tlanguageCode: string,\n\t\tsegment: string\n\t) => Promise<string | Array<FontOptions>>;\n\tonNodeDetected?: (node: SatoriNode) => void;\n\tpointScaleFactor?: number;\n};\nexport type { SatoriNode };\n\nexport default async function satori(\n\telement: ReactNode,\n\toptions: SatoriOptions\n): Promise<string> {\n\tconst Yoga = await getYoga();\n\tif (!Yoga || !Yoga.Node) {\n\t\tthrow new Error(\n\t\t\t'Satori is not initialized: expect `yoga` to be loaded, got ' + Yoga\n\t\t);\n\t}\n\toptions.fonts = options.fonts || [];\n\n\tlet font: FontLoader;\n\tif (fontCache.has(options.fonts)) {\n\t\tfont = fontCache.get(options.fonts);\n\t} else {\n\t\tfontCache.set(options.fonts, (font = new FontLoader(options.fonts)));\n\t}\n\n\tconst definedWidth = 'width' in options ? options.width : undefined;\n\tconst definedHeight = 'height' in options ? options.height : undefined;\n\n\tconst root = getRootNode(Yoga, options.pointScaleFactor);\n\tif (definedWidth) root.setWidth(definedWidth);\n\tif (definedHeight) root.setHeight(definedHeight);\n\troot.setFlexDirection(Yoga.FLEX_DIRECTION_ROW);\n\troot.setFlexWrap(Yoga.WRAP_WRAP);\n\troot.setAlignContent(Yoga.ALIGN_AUTO);\n\troot.setAlignItems(Yoga.ALIGN_FLEX_START);\n\troot.setJustifyContent(Yoga.JUSTIFY_FLEX_START);\n\troot.setOverflow(Yoga.OVERFLOW_HIDDEN);\n\n\tconst graphemeImages = { ...options.graphemeImages };\n\t// Some Chinese characters have different glyphs in Chinese and\n\t// Japanese, but their Unicode is the same. If the user needs to display\n\t// the Chinese and Japanese characters simultaneously correctly, the user\n\t// needs to download the Chinese and Japanese fonts, respectively.\n\t// Assuming that the user has downloaded the corresponding Japanese font,\n\t// to let the program realize that the font has not been downloaded in Chinese,\n\t// we need to prohibit Japanese as the fallback when executing `engine.has`.\n\t//\n\t// This causes a problem. Consider a scenario where we need to display Chinese\n\t// correctly under tags with `lang=\"ja\"` set. `engine.has` will repeatedly treat\n\t// the Chinese as missing font because we have removed the Chinese as a fallback.\n\t// To address this situation, we may need to add `processedWordsMissingFont`\n\tconst processedWordsMissingFonts = new Set();\n\n\tcache.clear();\n\tinflightRequests.clear();\n\tawait preProcessNode(element);\n\n\tconst handler = layout(element, {\n\t\tid: 'id',\n\t\tparentStyle: {},\n\t\tinheritedStyle: {\n\t\t\tfontSize: 16,\n\t\t\tfontWeight: 'normal',\n\t\t\tfontFamily: 'serif',\n\t\t\tfontStyle: 'normal',\n\t\t\tlineHeight: 'normal',\n\t\t\tcolor: 'black',\n\t\t\topacity: 1,\n\t\t\twhiteSpace: 'normal',\n\n\t\t\t// Special style properties:\n\t\t\t_viewportWidth: definedWidth,\n\t\t\t_viewportHeight: definedHeight\n\t\t},\n\t\tparent: root,\n\t\tfont,\n\t\tembedFont: options.embedFont,\n\t\tdebug: options.debug,\n\t\tgraphemeImages,\n\t\tcanLoadAdditionalAssets: !!options.loadAdditionalAsset,\n\t\tonNodeDetected: options.onNodeDetected\n\t});\n\n\tconst segmentsMissingFont = (await handler.next()).value as {\n\t\tword: string;\n\t\tlocale?: Locale;\n\t}[];\n\n\tif (options.loadAdditionalAsset) {\n\t\tif (segmentsMissingFont.length) {\n\t\t\tconst languageCodes = convertToLanguageCodes(segmentsMissingFont);\n\t\t\tconst fonts: FontOptions[] = [];\n\t\t\tconst images: Record<string, string> = {};\n\n\t\t\tawait Promise.all(\n\t\t\t\tObject.entries(languageCodes).flatMap(([code, segments]) =>\n\t\t\t\t\tsegments.map(_segment => {\n\t\t\t\t\t\tconst key = `${code}_${_segment}`;\n\t\t\t\t\t\tif (processedWordsMissingFonts.has(key)) {\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprocessedWordsMissingFonts.add(key);\n\n\t\t\t\t\t\treturn options\n\t\t\t\t\t\t\t.loadAdditionalAsset(code, _segment)\n\t\t\t\t\t\t\t.then((asset: any) => {\n\t\t\t\t\t\t\t\tif (typeof asset === 'string') {\n\t\t\t\t\t\t\t\t\timages[_segment] = asset;\n\t\t\t\t\t\t\t\t} else if (asset) {\n\t\t\t\t\t\t\t\t\tif (Array.isArray(asset)) {\n\t\t\t\t\t\t\t\t\t\tfonts.push(...asset);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tfonts.push(asset);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t);\n\n\t\t\t// Directly mutate the font provider and the grapheme map.\n\t\t\tfont.addFonts(fonts);\n\t\t\tObject.assign(graphemeImages, images);\n\t\t}\n\t}\n\n\tawait handler.next();\n\troot.calculateLayout(definedWidth, definedHeight, Yoga.DIRECTION_LTR);\n\n\tconst content = (await handler.next([0, 0])).value as string;\n\n\tconst computedWidth = root.getComputedWidth();\n\tconst computedHeight = root.getComputedHeight();\n\n\troot.freeRecursive();\n\n\treturn svg({ width: computedWidth, height: computedHeight, content });\n}\n\nfunction getRootNode(\n\tYoga: TYoga,\n\tpointScaleFactor?: SatoriOptions['pointScaleFactor']\n) {\n\tif (!pointScaleFactor) {\n\t\treturn Yoga.Node.create();\n\t} else {\n\t\tconst config = Yoga.Config.create();\n\t\tconfig.setPointScaleFactor(pointScaleFactor);\n\t\treturn Yoga.Node.createWithConfig(config);\n\t}\n}\n\nfunction convertToLanguageCodes(\n\tsegmentsMissingFont: { word: string; locale?: Locale }[]\n): Partial<Record<LangCode, string[]>> {\n\tconst languageCodes = {};\n\tlet wordsByCode = {};\n\n\tfor (const { word, locale } of segmentsMissingFont) {\n\t\tconst code = detectLanguageCode(word, locale).join('|');\n\t\twordsByCode[code] = wordsByCode[code] || '';\n\t\twordsByCode[code] += word;\n\t}\n\n\tObject.keys(wordsByCode).forEach((code: LangCode) => {\n\t\tlanguageCodes[code] = languageCodes[code] || [];\n\t\tif (code === 'emoji') {\n\t\t\tlanguageCodes[code].push(\n\t\t\t\t...unique(segment(wordsByCode[code], 'grapheme'))\n\t\t\t);\n\t\t} else {\n\t\t\tlanguageCodes[code][0] = languageCodes[code][0] || '';\n\t\t\tlanguageCodes[code][0] += unique(\n\t\t\t\tsegment(\n\t\t\t\t\twordsByCode[code],\n\t\t\t\t\t'grapheme',\n\t\t\t\t\tcode === 'unknown' ? undefined : code\n\t\t\t\t)\n\t\t\t).join('');\n\t\t}\n\t});\n\n\treturn languageCodes;\n}\n\nfunction unique<T>(arr: T[]): T[] {\n\treturn Array.from(new Set(arr));\n}\n"],"mappings":"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CACD,CAAC,SAAS,QAAQT,GAAY,kBAAkB,CAAC,EAClD,CChOA,IAAMmC,GAAkB,OAEjBC,GAAQ,CAEd,EAAG,CACF,QAASD,GACT,UAAW,MACX,aAAc,KACf,EACA,IAAK,CACJ,QAASA,EACV,EACA,WAAY,CACX,QAASA,GACT,UAAW,MACX,aAAc,MACd,WAAY,GACZ,YAAa,EACd,EACA,OAAQ,CACP,QAASA,GACT,UAAW,QACZ,EACA,GAAI,CACH,QAASA,GACT,UAAW,QACX,aAAc,QACd,WAAY,OACZ,YAAa,OACb,YAAa,EAEb,YAAa,OACd,EAEA,GAAI,CACH,QAASA,GACT,SAAU,MACV,UAAW,SACX,aAAc,SACd,WAAY,EACZ,YAAa,EACb,WAAY,MACb,EACA,GAAI,CACH,QAASA,GACT,SAAU,QACV,UAAW,SACX,aAAc,SACd,WAAY,EACZ,YAAa,EACb,WAAY,MACb,EACA,GAAI,CACH,QAASA,GACT,SAAU,SACV,UAAW,MACX,aAAc,MACd,WAAY,EACZ,YAAa,EACb,WAAY,MACb,EACA,GAAI,CACH,QAASA,GACT,UAAW,SACX,aAAc,SACd,WAAY,EACZ,YAAa,EACb,WAAY,MACb,EACA,GAAI,CACH,QAASA,GACT,SAAU,SACV,UAAW,SACX,aAAc,SACd,WAAY,EACZ,YAAa,EACb,WAAY,MACb,EACA,GAAI,CACH,QAASA,GACT,SAAU,SACV,UAAW,SACX,aAAc,SACd,WAAY,EACZ,YAAa,EACb,WAAY,MACb,EAKA,EAAG,CACF,eAAgB,WACjB,EACA,OAAQ,CACP,WAAY,MACb,EACA,EAAG,CACF,WAAY,MACb,EACA,EAAG,CACF,UAAW,QACZ,EACA,GAAI,CACH,UAAW,QACZ,EACA,KAAM,CACL,WAAY,WACb,EACA,IAAK,CACJ,WAAY,WACb,EACA,IAAK,CACJ,QAASA,GACT,WAAY,YACZ,WAAY,MACZ,UAAW,MACX,aAAc,KACf,EACA,KAAM,CACL,gBAAiB,SACjB,MAAO,OACR,EACA,IAAK,CACJ,SAAU,QACX,EACA,MAAO,CACN,SAAU,SACX,EACA,EAAG,CACF,eAAgB,cACjB,C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","names":["loadYoga","yoga_wasm_base64_esm_default","init_yoga_wasm_base64_esm","__esmMin","_scriptDir","h","aa","ca","a","b","da","q","ea","v","w","noExitRuntime","x","fa","ha","z","c","d","e","f","g","ia","ja","A","C","ka","E","la","ma","na","oa","pa","qa","ra","sa","F","ta","G","ua","H","va","wa","xa","ya","za","Aa","Ba","J","Ca","Da","K","L","M","Ea","Fa","Ga","N","O","Ha","P","Q","Ia","R","Ja","Ka","S","La","Ma","Na","Oa","Pa","Qa","Ra","Sa","Ta","Ua","T","Va","Wa","Xa","U","Ya","V","m","W","Za","$a","X","ab","bb","cb","db","eb","fb","gb","hb","Y","ib","jb","Z","mb","nb","ob","l","n","p","r","u","t","y","B","pb","qb","rb","sb","tb","ub","vb","wb","xb","yb","zb","Ab","Bb","Cb","Db","Eb","Fb","Gb","Hb","Jb","ba","I","kb","lb","Ib","Kb","Lb","Mb","Align","BoxSizing","Dimension","Direction","Display","Edge","Errata","ExperimentalFeature","FlexDirection","Gutter","Justify","LogLevel","MeasureMode","NodeType","Overflow","PositionType","Unit","Wrap","constants","YGEnums_default","init_YGEnums","__esmMin","ALIGN_AUTO","Auto","ALIGN_FLEX_START","FlexStart","ALIGN_CENTER","Center","ALIGN_FLEX_END","FlexEnd","ALIGN_STRETCH","Stretch","ALIGN_BASELINE","Baseline","ALIGN_SPACE_BETWEEN","SpaceBetween","ALIGN_SPACE_AROUND","SpaceAround","ALIGN_SPACE_EVENLY","SpaceEvenly","BOX_SIZING_BORDER_BOX","BorderBox","BOX_SIZING_CONTENT_BOX","ContentBox","DIMENSION_WIDTH","Width","DIMENSION_HEIGHT","Height","DIRECTION_INHERIT","Inherit","DIRECTION_LTR","LTR","DIRECTION_RTL","RTL","DISPLAY_FLEX","Flex","DISPLAY_NONE","None","DISPLAY_CONTENTS","Contents","EDGE_LEFT","Left","EDGE_TOP","Top","EDGE_RIGHT","Right","EDGE_BOTTOM","Bottom","EDGE_START","Start","EDGE_END","End","EDGE_HORIZONTAL","Horizontal","EDGE_VERTICAL","Vertical","EDGE_ALL","All","ERRATA_NONE","ERRATA_STRETCH_FLEX_BASIS","StretchFlexBasis","ERRATA_ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING","AbsolutePositionWithoutInsetsExcludesPadding","ERRATA_ABSOLUTE_PERCENT_AGAINST_INNER_SIZE","AbsolutePercentAgainstInnerSize","ERRATA_ALL","ERRATA_CLASSIC","Classic","EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS","WebFlexBasis","FLEX_DIRECTION_COLUMN","Column","FLEX_DIRECTION_COLUMN_REVERSE","ColumnReverse","FLEX_DIRECTION_ROW","Row","FLEX_DIRECTION_ROW_REVERSE","RowReverse","GUTTER_COLUMN","GUTTER_ROW","GUTTER_ALL","JUSTIFY_FLEX_START","JUSTIFY_CENTER","JUSTIFY_FLEX_END","JUSTIFY_SPACE_BETWEEN","JUSTIFY_SPACE_AROUND","JUSTIFY_SPACE_EVENLY","LOG_LEVEL_ERROR","Error","LOG_LEVEL_WARN","Warn","LOG_LEVEL_INFO","Info","LOG_LEVEL_DEBUG","Debug","LOG_LEVEL_VERBOSE","Verbose","LOG_LEVEL_FATAL","Fatal","MEASURE_MODE_UNDEFINED","Undefined","MEASURE_MODE_EXACTLY","Exactly","MEASURE_MODE_AT_MOST","AtMost","NODE_TYPE_DEFAULT","Default","NODE_TYPE_TEXT","Text","OVERFLOW_VISIBLE","Visible","OVERFLOW_HIDDEN","Hidden","OVERFLOW_SCROLL","Scroll","POSITION_TYPE_STATIC","Static","POSITION_TYPE_RELATIVE","Relative","POSITION_TYPE_ABSOLUTE","Absolute","UNIT_UNDEFINED","UNIT_POINT","Point","UNIT_PERCENT","Percent","UNIT_AUTO","WRAP_NO_WRAP","NoWrap","WRAP_WRAP","WRAP_WRAP_REVERSE","WrapReverse","wrapAssembly","lib","patch","prototype","name","fn","original","_len","arguments","length","args","Array","_key","call","fnName","methods","Unit","Point","Node","Percent","Auto","_len2","_key2","value","pop","unit","asNumber","undefined","valueOf","endsWith","parseFloat","Number","isNaN","Error","wrapMeasureFunction","measureFunction","MeasureCallback","implement","measure","width","height","NaN","measureFunc","unsetMeasureFunc","wrapDirtiedFunc","dirtiedFunction","DirtiedCallback","dirtied","dirtiedFunc","Config","destroy","_","config","createWithConfig","createDefault","t","T","getChildCount","getChild","freeRecursive","free","direction","Direction","LTR","YGEnums","init_wrapAssembly","__esmMin","init_YGEnums","loadYoga","wrapAssembly","loadYogaImpl","init_load","__esmMin","init_yoga_wasm_base64_esm","init_wrapAssembly","init_YGEnums","yoga_external_exports","__export","getYoga","init","loadWasm","input","imports","source","e","bytes","instantiated","loadYoga","successCallback","instance","rejectYoga","resolveYoga","yogaPromise","init_yoga_external","__esmMin","init_load","resolve","reject","yoga_bundled_exports","__export","getYoga","loadingYoga","init_yoga_bundled","__esmMin","init_load","loadYoga","LineBreaker","e","t","r","u","k","g","a","z","v","c","L","w","h","$","y","m","j","b","q","f","p","l","d","s","x","o","O","F","U","E","n","D","i","isReactElement","node","type","isClass","f","isForwardRefComponent","isReactComponent","hasDangerouslySetInnerHTMLProp","props","normalizeChildren","children","flattend","res","i","value","lengthToNumber","length","baseFontSize","baseLength","inheritedStyle","percentage","parsed","U","calcDegree","deg","multiply","m1","m2","v","field","map","fallback","errorIfNotAllowedForProperty","_v","wordSegmenter","graphemeSegmenter","wordSeparators","point","segmentCache","MAX_SEGMENT_CACHE_SIZE","segment","content","granularity","locale","cacheKey","result","seg","segmented","output","s","previousWord","nextWord","firstKey","buildXMLString","attrs","attrString","k","createLRU","max","store","get","key","set","clear","parseViewBox","viewBox","isString","x","isNumber","isUndefined","asPointPercentageLength","propertyName","percentageValue","asPointAutoPercentageLength","splitByBreakOpportunities","content","wordBreak","segment","breaker","LineBreaker","last","bk","words","requiredBreaks","word","midline","s","_","letter","splitEffects","input","separator","result","l","parenCount","i","init","input","mod","getYoga","AVIF","WEBP","APNG","PNG","JPEG","GIF","SVG","parseJPEG","buf","view","offset","len","i","next","parseGIF","parsePNG","v","cache","createLRU","inflightRequests","ALLOWED_IMAGE_TYPES","SVG_ATTRS_REGEX","VIEWBOX_REGEX","WIDTH_REGEX","HEIGHT_REGEX","arrayBufferToBase64","buffer","bytes","CHUNK_SIZE","binary","chunk","base64ToArrayBuffer","base64","binaryString","parseSvgImageSize","src","data","svgMatch","svgTag","viewBoxMatch","widthMatch","heightMatch","viewBox","parseViewBox","size","ratio","arrayBufferToDataUri","imageSize","imageType","detectContentType","resolveImageData","newSrc","decodedURI","encodingType","dataString","utf8Src","base64Src","cached","url","promise","res","type","e","result","err","b","detectAPNG","dv","length","off","isAPNG","chars","ATTRIBUTE_MAPPING","SVGSymbols","translateSVGNodeToSVGString","node","inheritedColor","n","type","children","style","restProps","currentColor","attrs","k","_v","cache","styles","midline","preProcessNode","set","walk","_node","isReactElement","v","imageSrc","c","s","resolveImageData","SVGNodeToImage","viewBox","viewbox","width","height","className","viewBoxSize","parseViewBox","ratio","DEFAULT_DISPLAY","presets_default","list","inheritable","style","inheritedStyle","prop","getPropertyName","getStylesForProperty","parseElementStyle","parseBoxShadow","cssColorParse","valueParser","parseUnit","word","baseFontSize","parsed","U","handleWord","unitIsHorizontal","parsedUnit","parseTransformOrigin","value","words","valueParser","node","getPropertyName","getMaskProperty","style","name","key","getPropertyName","parseMask","maskImage","common","splitEffects","v","m","valueParser","extractCustomProperties","style","variables","remainingStyle","prop","mergeVariables","inherited","current","resolveVariables","value","visitedVars","parsed","hasChanges","node","args","extractVarArgs","varName","fallback","replaceNode","variableValue","newVisitedVars","resolvedValue","resolvedFallback","varNameNode","commaIndex","i","child","fallbackNodes","optOutPx","keepNumber","handleFallbackColor","prop","parsed","rawInput","currentColor","purify","name","value","num","handleSpecialCase","_v","horizontal","vertical","vh","getStylesForProperty","vv","k","resolved","purified","v","full","p","parseBoxShadow","symbols","replaced","_","symbol","t","result","shadows","splitEffects","shadow","styles","values","normalized","getErrorHint","RGB_SLASH","normalizeColor","r","g","b","a","expand","style","inheritedStyle","serializedStyle","inheritedVariables","currentVariables","processableStyle","variables","remainingStyle","extractCustomProperties","mergedVariables","mergeVariables","varName","resolvedColor","resolveVariables","getCurrentColor","getPropertyName","resolvedValue","preprocess","resolvedStyle","err","backgrounds","parseElementStyle","parseMask","baseFontSize","calcBaseFontSize","parseTransformOrigin","lengthToNumber","len","color","transforms","transform","type","textShadowRadius","textShadowOffset","height","width","size","inheritedSize","U","refineHSL","cssColorParse","h","s","l","inheritedColor","convertCurrentColorToActualValue","isString","compute","node","type","inheritedStyle","definedStyle","props","Yoga","getYoga","style","expand","presets_default","resolvedSrc","imageWidth","imageHeight","resolveImageData","r","extraHorizontal","extraVertical","contentBoxWidth","contentBoxHeight","isAbsoluteContentSize","viewBox","viewBoxSize","parseViewBox","ratio","width","height","lengthToNumber","v","asPointAutoPercentageLength","asPointPercentageLength","inheritable","escapeHTML","baseMatrix","resolveTransforms","transforms","width","height","matrix","transform","type","v","len","transformMatrix","rad","c","s","multiply","left","top","isInheritingTransform","transformOrigin","result","xOrigin","yOrigin","x","y","container","left","top","width","height","isInheritingTransform","style","matrix","opacity","transform","buildText","id","content","filter","image","clipPathId","debug","shape","decorationShape","extra","buildXMLString","shapeProps","escapeHTML","shiftPath","path","dx","dy","_","command","x","y","SCALE","buildDropShadow","id","width","height","style","transparentText","shadowCount","effects","merge","left","right","top","bottom","i","grow","resultId","buildXMLString","boxShadow","shape","opacity","shadow","innerShadow","shadowStyle","sid","maskId","shapeWithSpread","finalShape","buildSkipInkSegments","start","end","glyphBoxes","y","strokeWidth","baseline","halfStroke","bleed","skipRanges","box","from","to","last","segments","cursor","buildDecoration","width","left","top","ascender","clipPathId","matrix","style","textDecorationColor","textDecorationStyle","textDecorationLine","textDecorationSkipInk","fontSize","color","height","dasharray","applySkipInk","extraLine","x1","x2","buildXMLString","stringFromCode","code","Space","Tab","HorizontalEllipsis","genMeasurer","engine","isImage","style","fontSize","letterSpacing","cache","measureGrapheme","grapheme","width","measureGraphemeArray","graphemes","measureText","text","segment","preprocess","content","style","locale","textTransform","whiteSpace","wordBreak","processTextTransform","processedContent","shouldCollapseTabsAndSpaces","allowSoftWrap","processWhiteSpace","words","requiredBreaks","allowBreakWord","processWordBreak","lineLimit","blockEllipsis","processTextOverflow","segment","word","grapheme","index","textOverflow","lineClamp","WebkitLineClamp","WebkitBoxOrient","overflow","display","HorizontalEllipsis","parseLineClamp","isNumber","splitByBreakOpportunities","shouldKeepLinebreak","Space","input","regex1","regex2","match1","match2","number","text","cssColorParse","skippedWordWhenFindingMissingFont","Tab","shouldSkipWhenFindingMissingFont","word","isFullyTransparent","color","parsed","isOpaqueWhite","r","g","b","a","buildTextNodes","content","context","Yoga","getYoga","parentStyle","inheritedStyle","parent","font","id","isInheritingTransform","debug","embedFont","graphemeImages","locale","canLoadAdditionalAssets","textAlign","textIndent","lineHeight","textWrap","fontSize","cssFilter","tabSize","letterSpacing","_inheritedBackgroundClipTextPath","_inheritedBackgroundClipTextHasBackground","flexShrink","words","requiredBreaks","allowSoftWrap","allowBreakWord","processedContent","shouldCollapseTabsAndSpaces","lineLimit","blockEllipsis","preprocess","textContainer","createTextContainerNode","isUndefined","engine","wordsMissingFont","segment","isImage","s","measureGrapheme","measureGraphemeArray","measureText","genMeasurer","tabWidth","isString","lengthToNumber","Space","calc","text","currentWidth","index","tabCount","detectTabs","originWidth","textBeforeTab","textAfterTab","textWidthBeforeTab","offsetBeforeTab","afterTrimEndWidth","lineWidths","baselines","lineSegmentNumber","texts","wordPositionInLayout","flow","width","lines","maxWidth","lineIndex","height","currentLineHeight","currentBaselineOffset","i","prevLineEndingSpacesWidth","forceBreak","w","endingSpacesWidth","_word","lineEndingSpacesWidth","allowedToJustify","willWrap","chars","glyphHeight","x","_texts","j","_text","_width","_isImage","measuredTextSize","containerWidth","l","m","mHeight","adjustedWidth","result","y","backgroundClipDef","clipPathId","overflowMaskId","containerLeft","containerTop","containerHeight","textIndentNumber","parentContainerInnerWidth","left","top","matrix","opacity","container","filter","textShadowColor","textShadowOffset","textShadowRadius","buildDropShadow","buildXMLString","decorationShape","mergedPath","extra","skippedLine","decorationLines","decorationGlyphs","wordBuffer","bufferedOffset","layout","nextLayout","path","isLastDisplayedBeforeEllipsis","image","topOffset","leftOffset","line","shouldCollectDecorationBoxes","extendedWidth","remainingWidth","segments","gutter","baselineOfLine","baselineOfWord","heightOfWord","baselineDelta","buildUnderlineBand","offset","calcEllipsis","baseWidth","subset","resolvedWidth","char","ellipsisWidth","_blockEllipsis","HorizontalEllipsis","spaceWidth","isNotLastLine","nextLineText","wordSeparators","finalizedSegment","finalizedLeftOffset","finalizedWidth","band","svg","t","shape","buildText","deco","glyphBoxes","buildDecoration","p","v","parseLinearGradient","cssColorParse","normalizeStops","totalLength","colorStops","inheritedStyle","repeating","from","stops","lastColorStop","totalPercentage","stop","color","offset","lengthToNumber","lastStop","previousStop","nextStop","i","buildLinearGradient","id","width","height","repeatX","repeatY","image","dimensions","offsets","inheritableStyle","from","parsed","parseLinearGradient","imageWidth","imageHeight","repeating","points","length","xys","resolveXYFromDirection","l","p","calcNormalPoint","calcDegree","calcPercentage","stops","normalizeStops","resolveRepeatingCycle","gradientId","patternId","defs","buildXMLString","stop","last","offset","dir","x1","y1","x2","y2","v","w","h","r","tmp","a","b","dfs","angle","p1","lengthToNumber","p2","sx","sy","ex","ey","parseRadialGradient","buildRadialGradient","id","width","height","repeatX","repeatY","image","dimensions","offsets","inheritableStyle","from","_a","shape","colorStops","position","size","repeating","parseRadialGradient","xDelta","yDelta","cx","cy","pos","calcRadialGradient","colorStopTotalLength","calcColorStopTotalLength","stops","normalizeStops","gradientId","patternId","maskId","spread","calcRadius","props","calcRadialGradientProps","defs","buildXMLString","stop","lastStop","lengthToNumber","baseFontSize","style","calcPos","key","dir","r","rx","ratio","last","radius","endingShape","centerAxis","length","fx","fy","isSizeAllLength","v","patchSpread","f2r","mfx","mfy","mrx","mry","mr","ry","s","cssColorParse","toAbsoluteValue","v","base","calculateKeywordSize","keyword","containerWidth","containerHeight","imageWidth","imageHeight","scaleX","scaleY","scale","parts","widthPart","heightPart","finalWidth","finalHeight","parsedHeight","parsedWidth","positionKeywordMap","parsePositionValues","str","part","computeBgPositionOffset","rawValue","containerSize","imageSize","percentage","parsed","U","parseLengthPairs","x","y","defaultX","defaultY","value","index","backgroundImage","id","width","height","left","top","image","size","position","repeat","inheritableStyle","from","repeatX","repeatY","isKeywordSize","isGradient","dimensions","offsets","buildLinearGradient","buildRadialGradient","src","resolveImageData","resolvedWidth","resolvedHeight","calcWidth","calcHeight","dimensionsWithoutFallback","rawPos","imageOffsetX","imageOffsetY","buildXMLString","colorObj","r","g","b","a","color","svgArcCenterOffset","rx","ry","resolveSize","a","b","limit","makeSmaller","arr","resolveRadius","v","width","height","fontSize","style","sides","s","singleValue","lengthToNumber","radiusZeroOrNull","_radius","getBorderRadiusClipPath","id","borderRadiusPath","borderType","left","top","rectClipId","buildXMLString","radius","partialSides","borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius","singleAbsValueTopLeftCorner","singleAbsValueTopRightCorner","singleAbsValueBottomLeftCorner","singleAbsValueBottomRightCorner","p","T","R","B","L","getArc","i","c0","start","result","arc0","l","len","end","arc1","compareBorderDirections","a","b","style","getBorderClipPath","id","currentClipPathId","borderPath","borderType","left","top","width","height","rectClipId","buildXMLString","border","props","asContentMask","maskBorderOnly","directions","direction","fullBorder","start","partialSides","currentStyle","_i","i","ni","d","nd","w","radius","contentMask","id","left","top","width","height","matrix","borderOnly","style","offsetLeft","offsetTop","offsetRight","offsetBottom","contentArea","buildXMLString","border","getStylesForProperty","regexMap","createShapeParser","width","height","style","inheritedStyle","parseCircle","str","res","value","radius","pos","v","x","y","resolvePosition","lengthToNumber","parseEllipse","rx","ry","parsePath","fillRule","d","resolveFillRule","parsePolygon","points","k","i","parseInset","inset","radiusMap","r","s","offsets","w","h","position","xDelta","yDelta","genClipPathId","id","genClipPath","buildClipPath","v","style","inheritedStyle","parser","createShapeParser","clipPath","tmp","k","type","rest","buildXMLString","overflow","left","top","width","height","path","matrix","id","currentClipPath","src","style","inheritableStyle","overflowClipPath","clipPath","buildClipPath","_id","genClipPathId","buildXMLString","contentMask","genMaskImageId","id","buildMaskImage","v","style","inheritedStyle","left","top","width","height","maskImage","length","miId","mask","i","m","_id","def","backgroundImage","buildXMLString","parseObjectPosition","position","containerWidth","containerHeight","parts","keywordToPercent","keyword","axis","xValue","yValue","part","first","second","parseValue","value","containerSize","parsed","U","rect","id","left","top","width","height","isInheritingTransform","src","debug","style","inheritableStyle","isImage","type","matrix","defs","fills","opacity","extra","transform","backgroundShapes","backgrounds","index","background","image","backgroundImage","miId","mi","buildMaskImage","maskId","path","radius","clipPathId","buildXMLString","backgroundClip","cssFilter","mixBlendMode","inlineStyle","v","currentClipPath","genClipPath","clip","overflow","shape","fill","borderClip","getBorderClipPath","imageBorderRadius","offsetLeft","offsetTop","offsetRight","offsetBottom","containerInnerWidth","containerInnerHeight","objPosX","objPosY","naturalWidth","naturalHeight","preserveAspectRatio","imageWidth","imageHeight","imageX","imageY","scaleX","scaleY","scale","minScale","getBorderRadiusClipPath","rectClipId","border","shadow","boxShadow","parseFilterValue","value","primitives","lastResult","hasBlur","blurMatch","result","buildXMLString","saturateMatch","val","brightnessMatch","contrastMatch","intercept","grayscaleMatch","buildBackdropFilter","options","bgGroupId","filterValue","height","id","left","maskId","style","top","width","filterId","clipId","filterDef","borderRadiusPath","radius","clipContent","clipDef","defs","useAttrs","useElement","r","e","emoji_regex_xs_default","emojiRegex","emoji_regex_xs_default","specialCode","code","locales","isValidLocale","x","detectLanguageCode","segment","locale","c","languages","lang","index","normalizeLocale","l","layout","element","context","_a","Yoga","getYoga","id","inheritedStyle","parent","font","debug","locale","embedFont","graphemeImages","canLoadAdditionalAssets","isReactElement","isReactComponent","iter","buildTextNodes","isClass","render","isForwardRefComponent","offset","$type","props","type","hasDangerouslySetInnerHTMLProp","style","children","_newLocale","newLocale","normalizeLocale","node","computedStyle","newInheritableStyle","compute","isInheritingTransform","mutateRefValue","normalizedChildren","normalizeChildren","iterators","backdropInfoByIndex","i","segmentsMissingFont","child","currentIndex","info","x","y","left","top","width","height","childrenRenderResult","baseRenderResult","depsRenderResult","childrenNode","restProps","src","rect","currentColor","SVGNodeToImage","display","j","childLayout","childLeft","childTop","childWidth","childHeight","bgGroupId","currentContent","childId","maskId","buildBackdropFilter","buildXMLString","opentype","SUFFIX_WHEN_LANG_NOT_SET","flattenPath","commands","segments","start","current","addCurve","points","steps","prev","t","next","evaluateBezier","cmd","working","i","computeBandBox","band","strokeWidth","bandMin","bandMax","bandHeight","ySamples","yStep","yStart","columnHits","y","intersections","seg","x1","y1","x2","y2","yMin","yMax","x","a","b","j","from","to","end","col","columns","inkRanges","rangeStart","boxes","bleed","minX","maxX","left","right","compareFont","weight","style","matchedWeight","matchedStyle","nextWeight","nextStyle","cachedParsedFont","FontLoader","fontOptions","name","fonts","matchedFont","i","weight1","style1","weight2","style2","fontOption","data","lang","isValidLocale","locales","_lang","SUFFIX_WHEN_LANG_NOT_SET","font","opentype","originalCharToGlyphIndex","char","index","_name","fontSize","lineHeight","fontFamily","fontWeight","fontStyle","locale","face","getNormal","getUnknown","keys","specifiedLangFonts","nonSpecifiedLangFonts","additionalFonts","getLangFromFontName","cachedFontResolver","resolveFont","word","fallback","_fonts","code","_font","ascender","resolvedFont","useOS2Table","_a","_b","descender","height","_lineGap","resolve","s","asc","desc","contentHeight","band","brokenChars","originalStringToGlyphs","args","glyphs","anotherFont","glyph","scale","p","command","scaledCommand","k","g","content","letterSpacing","unpatch","top","left","fullPath","boxes","options","cachedPath","gX","gY","gFontSize","glyphPath","_x","_y","_glyphPath","movedCommand","bandBoxes","computeBandBox","arr","svg","width","height","content","buildXMLString","fontCache","satori","element","options","Yoga","getYoga","font","FontLoader","definedWidth","definedHeight","root","getRootNode","graphemeImages","processedWordsMissingFonts","cache","inflightRequests","preProcessNode","handler","layout","segmentsMissingFont","languageCodes","convertToLanguageCodes","fonts","images","code","segments","_segment","key","asset","content","computedWidth","computedHeight","svg","pointScaleFactor","config","wordsByCode","word","locale","detectLanguageCode","unique","segment","arr"]}