@photivra/engine 2.4.1 → 2.6.0

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.
Files changed (85) hide show
  1. package/CHANGELOG.md +53 -1
  2. package/CITATION.cff +1 -1
  3. package/README.md +6 -6
  4. package/SECURITY.md +1 -1
  5. package/THIRD_PARTY.md +1 -0
  6. package/dist/capture/native-environment-lean.d.ts +1 -1
  7. package/dist/capture/native-environment-lean.js +17 -3
  8. package/dist/capture/native-environment-lean.js.map +1 -1
  9. package/dist/capture/native-environment-raw.d.ts +0 -4
  10. package/dist/capture/native-environment-raw.js +6 -2
  11. package/dist/capture/native-environment-raw.js.map +1 -1
  12. package/dist/color/illuminants.d.ts +15 -0
  13. package/dist/color/illuminants.js +81 -24
  14. package/dist/color/illuminants.js.map +1 -1
  15. package/dist/color/srgb-transfer.d.ts +6 -0
  16. package/dist/color/srgb-transfer.js +9 -0
  17. package/dist/color/srgb-transfer.js.map +1 -1
  18. package/dist/color/white-balance.d.ts +6 -0
  19. package/dist/color/white-balance.js +15 -2
  20. package/dist/color/white-balance.js.map +1 -1
  21. package/dist/core/internal-radiance-evaluator.d.ts +6 -0
  22. package/dist/core/internal-radiance-evaluator.js +33 -0
  23. package/dist/core/internal-radiance-evaluator.js.map +1 -0
  24. package/dist/core/portable-math.d.ts +33 -0
  25. package/dist/core/portable-math.js +342 -0
  26. package/dist/core/portable-math.js.map +1 -1
  27. package/dist/core/version.d.ts +1 -1
  28. package/dist/core/version.js +1 -1
  29. package/dist/core/version.js.map +1 -1
  30. package/dist/facade/chart-scenes.d.ts +9 -0
  31. package/dist/facade/chart-scenes.js +17 -4
  32. package/dist/facade/chart-scenes.js.map +1 -1
  33. package/dist/facade/diffraction-provider.d.ts +10 -0
  34. package/dist/facade/diffraction-provider.js +38 -17
  35. package/dist/facade/diffraction-provider.js.map +1 -1
  36. package/dist/facade/display-view.d.ts +208 -0
  37. package/dist/facade/display-view.js +1461 -0
  38. package/dist/facade/display-view.js.map +1 -0
  39. package/dist/facade/scene-radiance.d.ts +7 -0
  40. package/dist/facade/scene-radiance.js +18 -5
  41. package/dist/facade/scene-radiance.js.map +1 -1
  42. package/dist/facade/simulate-capture.d.ts +229 -5
  43. package/dist/facade/simulate-capture.js +119 -35
  44. package/dist/facade/simulate-capture.js.map +1 -1
  45. package/dist/facade/simulate-display-view.d.ts +21 -0
  46. package/dist/facade/simulate-display-view.js +168 -0
  47. package/dist/facade/simulate-display-view.js.map +1 -0
  48. package/dist/facade/subject-framing.d.ts +78 -0
  49. package/dist/facade/subject-framing.js +69 -20
  50. package/dist/facade/subject-framing.js.map +1 -1
  51. package/dist/index.d.ts +3 -2
  52. package/dist/index.js +3 -2
  53. package/dist/index.js.map +1 -1
  54. package/dist/optics/diffraction-psf-profile.d.ts +59 -3
  55. package/dist/optics/diffraction-psf-profile.js +147 -5
  56. package/dist/optics/diffraction-psf-profile.js.map +1 -1
  57. package/dist/optics/irradiance-convolution.js +1 -1
  58. package/dist/optics/irradiance-convolution.js.map +1 -1
  59. package/dist/optics/scene-to-sensor-irradiance.d.ts +7 -0
  60. package/dist/optics/scene-to-sensor-irradiance.js +10 -5
  61. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
  62. package/dist/output/print-plan.d.ts +8 -1
  63. package/dist/output/print-plan.js +8 -1
  64. package/dist/output/print-plan.js.map +1 -1
  65. package/dist/schema/scene-radiance.d.ts +16 -0
  66. package/dist/schema/scene-radiance.js +25 -4
  67. package/dist/schema/scene-radiance.js.map +1 -1
  68. package/dist/sensor/raw-readout.d.ts +12 -0
  69. package/dist/sensor/raw-readout.js +131 -9
  70. package/dist/sensor/raw-readout.js.map +1 -1
  71. package/dist/sensor/stochastic-seed.d.ts +13 -0
  72. package/dist/sensor/stochastic-seed.js +42 -8
  73. package/dist/sensor/stochastic-seed.js.map +1 -1
  74. package/docs/AGENT_GUIDE.md +1 -0
  75. package/docs/API_REFERENCE.md +16 -1
  76. package/docs/QUICK_START.md +245 -9
  77. package/docs/USAGE.md +15 -0
  78. package/docs/api/core-version.md +1 -1
  79. package/docs/api/exports.json +37 -2
  80. package/docs/api/facade-simulate-capture.md +70 -2
  81. package/docs/api/facade-simulate-display-view.md +18 -0
  82. package/docs/api/facade-subject-framing.md +83 -0
  83. package/docs/api/optics-diffraction-psf-profile.md +8 -1
  84. package/docs/api/output-print-plan.md +8 -1
  85. package/package.json +3 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-view.js","sourceRoot":"","sources":["../../src/facade/display-view.ts"],"names":[],"mappings":"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AC,EAAE,CAAE,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,CAAE,CAAC,CAAC;gBACrI,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,CAAE,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,CAAE,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,CAAE,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,CAAE,CAAC,CAAC;gBACrI,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC,CAAC;gBACnJ,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC,CAAC;gBACnJ,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC,CAAC;gBACnJ,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC,CAAC;gBACnJ,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;gBACvH,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChK,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClK,CAAC;QACD,MAAM,MAAM,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC;QACjJ,WAAW,CAAC,GAAG,CAAC,CAAC,CAAE,EAAE,GAAG,CAAC,CAAC,CAAE,EAAE,GAAG,CAAC,CAAC,CAAE,EAAE,QAAQ,CAAC,CAAC;QACjD,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAE,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAE,EAAE,MAAM,CAAC,CAAC;QAC5E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,GAAG,MAAM,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC;QACnE,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAE,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAE,EAAE,MAAM,CAAC,CAAC;QAC5E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,GAAG,MAAM,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC;IAChE,CAAC;IACD,0HAA0H;IAC1H,SAAS,cAAc,CAAC,IAAY,EAAE,CAAS,EAAE,CAAS;QACxD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,EAAE,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;QACjF,4GAA4G;QAC5G,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACnC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,MAAM,GAAG,QAAQ,EAAE,CAAC;YAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;QAAC,CAAC;aAC7F,CAAC;YAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QAAC,CAAC;IACnG,CAAC;IACD,IAAI,SAAS,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACpF,wHAAwH;IACxH,MAAM,UAAU,GAAG,IAAI,GAAG,EAAwB,CAAC;IACnD,6HAA6H;IAC7H,0HAA0H;IAC1H,wHAAwH;IACxH,qDAAqD;IACrD,MAAM,YAAY,GAAG,CAAC,EAAU,EAAE,EAAU,EAAW,EAAE;QACvD,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,GAAG,UAAU,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,UAAU,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,GAAG,UAAU,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,UAAU,CAAC;QACrK,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QAC7D,IAAI,KAAK,GAAG,GAAG,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;oBAAE,KAAK,GAAG,KAAK,CAAC;qBAAM,IAAI,KAAK,KAAK,KAAK;oBAAE,OAAO,KAAK,CAAC;YAChF,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,+FAA+F;IAC/F,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,QAAQ,GAAiB,EAAE,CAAC;IAChE,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAc,EAAE;QAC1C,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,UAAU;YAAE,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;YAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QAC3I,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IACF,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QAC1C,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,GAAG,QAAQ,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QACvF,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC1C,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC;YACzC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,GAAG,SAAS,GAAG,EAAE,CAAC;YACtD,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9C,IAAI,IAAI,GAAG,IAAI,CAAC;YAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE;gBAAE,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE;oBAAE,IAAI,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;wBAAC,IAAI,GAAG,KAAK,CAAC;wBAAC,MAAM;oBAAC,CAAC;YAC1H,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7C,IAAI,IAAI;gBAAE,OAAO,EAAE,CAAC;;gBAAM,MAAM,EAAE,CAAC;YACnC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,WAAW,EACzJ,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,WAAW,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,gCAAgC,CAAC,gCAAgC,CAAC,IAAI,EAAE,KAAK,EAAE,6BAA6B,CAAC,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC;YACtK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC;YAC/I,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACvD,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;oBACzF,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC;oBACpH,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC,KAAK,CAAE,CAAC;oBAC9D,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;oBAClB,gHAAgH;oBAChH,qHAAqH;oBACrH,qEAAqE;oBACrE,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;wBACxC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAE,CAAC;wBACvB,SAAS,EAAE,CAAC;wBACZ,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,KAAK,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;wBAC3E,IAAI,GAAG,GAAG,CAAC;4BAAE,GAAG,GAAG,CAAC,GAAG,CAAC;6BAAM,IAAI,GAAG,IAAI,WAAW;4BAAE,GAAG,GAAG,CAAC,GAAG,WAAW,GAAG,CAAC,GAAG,GAAG,CAAC;wBACtF,IAAI,GAAG,GAAG,CAAC;4BAAE,GAAG,GAAG,CAAC,GAAG,CAAC;6BAAM,IAAI,GAAG,IAAI,YAAY;4BAAE,GAAG,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,GAAG,GAAG,CAAC;wBACxF,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAClF,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;wBACjD,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBACtB,IAAI,QAAQ,EAAE,CAAC;4BAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;4BAAC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC;4BAAC,QAAQ,GAAG,QAAQ,KAAK,CAAC,CAAC,IAAI,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;4BAAC,SAAS;wBAAC,CAAC;wBACzJ,sEAAsE;wBACtE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,EAAE,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;wBACjF,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;wBACnC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,MAAM,GAAG,QAAQ,EAAE,CAAC;4BAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;4BAAC,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;wBAAC,CAAC;6BAC7F,CAAC;4BAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;4BAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;4BAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;wBAAC,CAAC;oBACnG,CAAC;oBACD,IAAI,CAAC,QAAQ;wBAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;oBAC7B,uHAAuH;oBACvH,uGAAuG;oBACvG,MAAM,OAAO,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBACrH,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,CAAE,EAAE,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAE,EAAE,KAAK,GAAG,EAAE,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC;oBACvG,IAAI,IAAI,EAAE,CAAC;wBACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;4BAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gCAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,EAAE,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;gCACnH,GAAG,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;gCAAC,GAAG,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;gCAAC,GAAG,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;gCAAC,GAAG,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;gCAAC,GAAG,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;gCAAC,GAAG,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;4BACrI,CAAC;4BACD,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAE,CAAC;4BAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAE,CAAC;4BAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAE,CAAC;wBAC5E,CAAC;wBACD,EAAE,IAAI,IAAI,CAAC,EAAE,CAAE,CAAC;wBAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAE,CAAC;wBAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAE,CAAC;wBAClD,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;4BAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAE,CAAC;4BAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAE,CAAC;4BAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAE,CAAC;wBAAC,CAAC;wBACvE,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;4BAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAE,CAAC;4BAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAE,CAAC;4BAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAE,CAAC;4BAAC,SAAS,GAAG,IAAI,CAAC;wBAAC,CAAC;wBAC5F,SAAS;oBACX,CAAC;oBACD,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBACtE,IAAI,QAAQ;wBAAE,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;4BAAC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAE,CAAC;4BAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAE,EAAE,aAAa,CAAC,IAAI,CAAE,CAAC,CAAC;wBAAC,CAAC;oBAClJ,sHAAsH;oBACtH,sGAAsG;oBACtG,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAE,EAAE,OAAO,GAAG,YAAY,CAAC,KAAK,CAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC3B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;wBACvC,IAAI,QAAQ,GAAG,CAAC,CAAC;wBACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE;4BAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAE,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAE,CAAE,CAAC;wBACnF,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC;oBAC7B,CAAC;oBACD,0HAA0H;oBAC1H,oHAAoH;oBACpH,uDAAuD;oBACvD,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;oBAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;4BAC3B,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC;4BACvC,IAAI,IAAI,GAAG,CAAC,CAAC;4BACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE;gCAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAE,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAE,CAAE,CAAC;4BACvE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;4BACb,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;wBAC9D,CAAC;wBACD,yHAAyH;wBACzH,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAE,CAAC,CAAC,CAAE,EAAE,IAAI,GAAG,aAAa,CAAC,KAAK,CAAE,CAAC,CAAC,CAAE,CAAC;wBAC3E,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;wBACzD,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;4BACxC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAE,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAE,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAE,EAAE,EAAE,GAAG,KAAK,CAAC,UAAU,GAAG,IAAI,CAAE,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI,CAAE,CAAC;4BAClI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;4BAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;4BAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;4BAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;4BAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;4BAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;wBACzH,CAAC;wBACD,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBAC3G,sHAAsH;wBACtH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;4BAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAE,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;4BAC1C,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;4BACjB,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;4BACnG,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,MAAM,GAAG,EAAE,EAAE,CAAC;gCAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;gCAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;gCAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;4BAAC,CAAC;iCAC1E,CAAC;gCAAC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;gCAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;gCAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;gCAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;4BAAC,CAAC;wBACjG,CAAC;wBACD,oFAAoF;wBACpF,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;4BACpC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;4BACxJ,MAAM,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC;4BACxD,MAAM,QAAQ,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAE;gCAC3E,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;4BACxH,IAAI,CAAC,QAAQ,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM,GAAG,QAAQ,EAAE,CAAC;gCAAC,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;gCAAC,EAAE,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;gCAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;4BAAC,CAAC;iCAC3K,IAAI,QAAQ,EAAE,CAAC;gCAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;gCAAC,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;gCAAC,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;gCAAC,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;4BAAC,CAAC;iCACvH,CAAC;gCACJ,6FAA6F;gCAC7F,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAE,CAAC,CAAC,CAAE,EAAE,IAAI,GAAG,aAAa,CAAC,KAAK,CAAE,CAAC,CAAC,CAAE,CAAC;gCAC3E,IAAI,KAAK,GAAG,CAAC,CAAC;gCACd,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;oCACxC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAE,EAAE,WAAW,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,IAAI,CAAE,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,UAAU,GAAG,IAAI,CAAE,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI,CAAE,CAAC;oCAC5J,KAAK,IAAI,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC,IAAI,CAAE,CAAC;gCACtE,CAAC;gCACD,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gCAC5F,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;gCAAC,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;gCAAC,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;4BAChE,CAAC;wBACH,CAAC;wBACD,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC;wBAAC,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC;wBAAC,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC;wBACjE,sHAAsH;wBACtH,sEAAsE;wBACtE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;wBAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;4BAC3B,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC;4BAC/L,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;4BACpC,GAAG,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;4BAAC,GAAG,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;4BAAC,GAAG,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;4BAAC,GAAG,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;4BAAC,GAAG,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;4BAAC,GAAG,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;4BACnI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;4BAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;4BAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;4BAC3C,IAAI,MAAM,EAAE,CAAC;gCAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gCAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;gCAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gCAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;4BAAC,CAAC;wBACxG,CAAC;wBACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;4BAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gCAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAE,CAAC;gCAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAE,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC;gCAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,GAAG,CAAC;gCAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,GAAG,CAAC;4BAAC,CAAC;wBAC7L,MAAM,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAE,GAAG,EAAE,CAAC,CAAC;wBAC1H,EAAE,IAAI,EAAE,CAAC;wBAAC,EAAE,IAAI,EAAE,CAAC;wBAAC,EAAE,IAAI,EAAE,CAAC;wBAC7B,IAAI,MAAM,EAAE,CAAC;4BAAC,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;4BAAC,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;4BAAC,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;wBAAC,CAAC;wBAC1F,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC;oBAClE,CAAC;oBACD,EAAE,IAAI,EAAE,CAAC;oBAAC,EAAE,IAAI,EAAE,CAAC;oBAAC,EAAE,IAAI,EAAE,CAAC;oBAC7B,IAAI,MAAM,EAAE,CAAC;wBAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;wBAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;wBAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;wBAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;wBAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;wBAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;oBAAC,CAAC;oBACjI,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;wBAChB,iHAAiH;wBACjH,8GAA8G;wBAC9G,uBAAuB;wBACvB,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,CAAE,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,cAAc,CAAC,KAAK,CAAE,CAAC,CAAC,CAAE,EAAE,IAAI,GAAG,SAAS,CAAC,KAAK,CAAE,CAAC;wBACjG,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;wBAC3B,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;4BACxC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAE,GAAG,EAAE,CAAC,IAAI,CAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,CAAC,EAAE,CAAC,UAAU,GAAG,IAAI,CAAE,GAAG,EAAE,CAAC,UAAU,GAAG,IAAI,CAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI,CAAE,GAAG,EAAE,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI,CAAE,CAAC,CAAC;4BACxM,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC;4BACtK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;4BAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;4BAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBACpD,CAAC;wBACD,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;wBAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;wBAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;wBACzC,IAAI,MAAM,EAAE,CAAC;4BAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;4BAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;4BAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;wBAAC,CAAC;oBAChF,CAAC;oBACD,sHAAsH;oBACtH,uHAAuH;oBACvH,uHAAuH;oBACvH,8GAA8G;oBAC9G,0BAA0B;oBAC1B,IAAI,aAAa,IAAI,aAAa,GAAG,aAAa,CAAC,iBAAiB,EAAE,CAAC;wBACrE,MAAM,GAAG,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC,CAAE,EAAE,SAAS,CAAC,CAAC,CAAE,EAAE,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC;wBACxE,EAAE,IAAI,GAAG,CAAC,CAAC,CAAE,CAAC;wBAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAE,CAAC;wBAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAE,CAAC;wBAAC,SAAS,GAAG,IAAI,CAAC;wBAC9D,IAAI,MAAM,EAAE,CAAC;4BAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;4BAAC,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;4BAAC,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;4BAAC,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;wBAAC,CAAC;oBACnG,CAAC;oBACD,IAAI,MAAM;wBAAE,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;oBAC5C,aAAa,GAAG,CAAC,CAAC;gBACpB,CAAC;YACD,WAAW,IAAI,CAAC,CAAC;YACjB,IAAI,SAAS;gBAAE,eAAe,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;YACrE,sGAAsG;YACtG,MAAM,EAAE,GAAG,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC7H,qGAAqG;YACrG,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;YAC1K,MAAM,KAAK,GAAG,gCAAgC,CAAC,gCAAgC,CAAC,IAAI,EAAE,KAAK,EAAE,4BAA4B,CAAC,CAAC,CAAC;YAC5H,MAAM,EAAE,GAAG,4BAA4B,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,4BAA4B,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAC;YACnI,0GAA0G;YAC1G,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACtG,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACjG,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;YAChE,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YACvC,qHAAqH;YACrH,oHAAoH;YACpH,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;YAC9J,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;YAC7F,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;YACjG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;YACjG,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;YAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;YACtE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACxI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,CAAC,EAAE,CAAC;gBAAC,MAAM,KAAK,CAAC,YAAY,EAAE,CAAC;gBAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAAC,CAAC;QAC9G,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,CAAC;AAChK,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,MAAc,EAAE,CAAS;IAC3C,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3D,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,EAAE,GAAG,MAAM,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC;IAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAAC,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAAC,IAAI,OAAO,CAAC,CAAC,CAAE,GAAG,MAAM;YAAE,EAAE,GAAG,GAAG,CAAC;;YAAM,EAAE,GAAG,GAAG,CAAC;IAAC,CAAC;IACzI,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;AACvB,CAAC;AACD,+HAA+H;AAC/H,SAAS,oBAAoB,CAAC,MAAc,EAAE,IAAY;IACxD,MAAM,CAAC,GAAG,2BAA2B,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC;IACxK,OAAO,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;AAC1C,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Display view (`simulateDisplayView`): the image that the real full-resolution capture of a `simulateCapture`\n * request would give after it is resized to a small display size by area averaging in linear light, computed\n * without rendering the full-resolution capture. Internal; the public entry point and the renderer that sets it up live in\n * `simulate-display-view.ts`, the option parsing in `simulate-capture.ts`. The design and its error analysis are in docs/DISPLAY_VIEW.md.\n *\n * Definition (the reference this module estimates): let L_j be the linear-light value of output pixel j of the\n * real capture (its sRGB samples decoded with the sRGB EOTF). Display pixel P covers the rectangle F_P of\n * real output pixels [P_x·s_x, (P_x + 1)·s_x) × [P_y·s_y, (P_y + 1)·s_y), s = frame size ÷ view size, and\n * D_P = Σ_j (w_j / A) · L_j,\n * w_j = the area of pixel j inside F_P, A = s_x·s_y (the \"area\" or box resampling filter). D_P is then\n * sRGB-encoded and rounded.\n *\n * Estimation, per display pixel:\n * 1. Expected value. The expectation E[D_P] = Σ_j (w_j/A)·E[L_j] is estimated by stratified Monte Carlo over the\n * footprint: K × K strata, one uniformly jittered point in each (deterministic, seeded by the capture seed and the\n * display pixel index); the real pixel containing the point is the sample. A point drawn uniformly in F_P lands in\n * pixel j with probability w_j/A, so the sample mean is unbiased for E[D_P]. For each sampled pixel the module\n * computes, at the real pitch, the exact expected electrons of the real sites its demosaic reads (the scene sampled\n * at those sites, through the declared pixel aperture, anti-aliasing filter and diffraction kernels, so the real\n * colour mosaic and its aliasing are kept), the moments of each site's normalized RAW value (shot, dark, read and\n * ADC noise; clipped at the white level), the demosaic's linear kernels, the development (white balance,\n * highlight clip, colour matrix) and the output rendering (tone curve, clip to [0, 1]). The non-linear steps act\n * on the pixel's own distribution, approximated as normal with the propagated mean and variance, so a clipped\n * noise floor or a clipped highlight moves the mean as it does in the real image.\n * 2. Noise. D_P − E[D_P] is a weighted sum of the independent site noises. Linearizing the non-linear steps with\n * their expected slopes (Stein's lemma), its covariance is A·Γ·diag(B_c·σ_c²)·Γᵀ·Aᵀ, where σ_c² is the site\n * variance of CFA channel c and B_c = Σ_k β_k² with β_k the total weight of site k in the display pixel after\n * demosaicing and averaging. B_c holds the demosaic correlation exactly for the linear kernels and is computed in\n * closed form from the footprint. The rest of each pixel's variance that the linearization misses (clipping) is\n * added as independent per-pixel variance, weighted by Σ_j (w_j/A)², as is the output quantization (Δ²/12).\n * One correlated normal draw per display pixel (the sum of hundreds of independent site noises) gives the noise.\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { createDeterministicUniformStream, createPortableStandardNormalPairs, deriveNativeSiteStreamSeedUint32, fmix32, samplePortableStandardNormal } from \"../sensor/stochastic-seed.js\";\nimport { encodeSrgbComponentPortable } from \"../color/srgb-transfer.js\";\nimport { createPoissonSampler } from \"../sensor/raw-readout.js\";\nimport { portableCbrt, portableCosTwoPi, portableExp, portableExp2, portableLog2, portablePow } from \"../core/portable-math.js\";\n\n/** Stream IDs of the display view's two seeded streams, distinct from the native charge (0) and read-noise (1) streams. */\nexport const DISPLAY_VIEW_JITTER_STREAM_ID = 32 as const;\nexport const DISPLAY_VIEW_NOISE_STREAM_ID = 33 as const;\nexport const DISPLAY_VIEW_AHD_STREAM_ID = 34 as const;\n\n/** A query offset from a site centre in sites (+x right, +y down) and its weight (pixel-aperture node × filter spot). */\nexport interface DisplayViewQueryOffset { x: number; y: number; weight: number }\n\n/** Scene access for the expected signal: chart materials (fast tables) or a radiance function. */\nexport type DisplayViewScene =\n | { kind: \"materials\"; materialAt(u: number, v: number): number;\n /** Per material: `{ neutral: reflectance }` (radiance = reflectance × illuminant) or the spectral radiance at each node. */\n materials: readonly ({ neutral: number } | { radiance: Float64Array })[];\n /** Illuminant radiance of a perfect white diffuser at each spectral node: irradianceScale·shape(λ)/π. */\n whiteRadiance: Float64Array }\n | { kind: \"radiance\"; radianceAt(u: number, v: number, nm: number): number };\n\nexport interface DisplayViewExpectedSignalInput {\n nativeWidth: number;\n nativeHeight: number;\n /** Frame output width: plane coordinates are 2 / outputWidth frame units per site. */\n outputWidth: number;\n /** Spectral nodes and, per CFA channel (red, green, blue), the expected electrons per unit spectral radiance at each node. */\n wavelengthsNm: readonly number[];\n electronsPerRadiance: readonly [Float64Array, Float64Array, Float64Array];\n offsets: readonly DisplayViewQueryOffset[];\n /** Diffraction: per-node kernels on the site lattice, (2R + 1)² taps in row-major order, out(x) = Σ in(x − t)·K(t). */\n kernels?: { radius: number; perNode: readonly Float64Array[] };\n scene: DisplayViewScene;\n /** CFA channel index (0 red, 1 green, 2 blue) of native site (x, y). */\n channelAt(x: number, y: number): number;\n /**\n * Without diffraction: the plane point (frame units) that the environment queries for offset `o` of native site (x, y),\n * computed with the environment's own arithmetic, so points that fall exactly on a chart boundary resolve to the same\n * material as in the capture. With diffraction the facade's object-space convolution uses the lattice formula, as here.\n */\n queryPoint?(x: number, y: number, offset: number, out: Float64Array): void;\n}\n\n/** Expected photo electrons of real native sites. */\nexport interface DisplayViewExpectedSignal {\n /**\n * Starts a new cache window: native sites [x0, x1) × [y0, y1) that the following `site` calls mostly read. Sites and\n * scene lookups inside it are computed once; anything outside is computed without caching.\n */\n window(x0: number, y0: number, x1: number, y1: number): void;\n /** Expected photo electrons of native site (x, y) for its own CFA channel (x, y inside the native raster). */\n site(x: number, y: number): number;\n /** A cheap classifier value of the scene at plane point (u, v) frame units: the material, or the radiance at one node. */\n pilot(u: number, v: number): number;\n /** Scene lookups performed so far (material or radiance queries), for diagnostics. */\n readonly lookups: number;\n /**\n * The chart material that every kernel tap of the last `site` call read, when they all read one material (its value is\n * then a function of that material and the site's CFA channel only); −1 when unknown or mixed.\n */\n readonly uniformMaterial: number;\n /** Whether `uniformMaterial` is tracked in the current window (otherwise it is not meaningful). */\n readonly tracksMaterial: boolean;\n}\n\nconst OFFSET_TOLERANCE = 1e-9;\n/** Largest cache window, in sites or lattice points; larger windows are evaluated without caching. */\nconst CACHE_LIMIT = 1 << 22;\n/** Largest band of looked-up lattice materials per group, in lattice points (a band that would be larger restarts at the window). */\nconst BAND_LIMIT = 1 << 22;\n\n/**\n * Expected photo electrons per site: μ_c(i, j) = Σ_o w_o Σ_λ A_c(λ) Σ_t K_λ(t)·L(p_o(i, j) − t, λ), where p_o is the\n * query point of offset o and K the diffraction kernel (a single unit tap without diffraction). This is the sum the\n * facade's environment chain forms for a still, rectilinear, distortion-free planar scene, where the\n * radiance-to-irradiance factor is the same at every site (docs/DISPLAY_VIEW.md, \"Expected signal\").\n *\n * With diffraction, offsets that share a fractional shift read one lattice, and their kernels are combined in advance:\n * C_c(d) = Σ_members w·Σ_λ A_c(λ)·K_λ(t)·L(λ) over the taps t that reach lattice offset d. A neutral material's radiance\n * is its reflectance times the white radiance, so all neutral materials share one combined kernel per channel.\n */\nexport function createDisplayViewExpectedSignal(input: DisplayViewExpectedSignalInput): DisplayViewExpectedSignal {\n const W = input.nativeWidth, H = input.nativeHeight, g = 2 / input.outputWidth, nodes = input.wavelengthsNm.length;\n const R = input.kernels ? input.kernels.radius : 0, size = 2 * R + 1;\n if (input.kernels && input.kernels.perNode.length !== nodes) throw new InvalidConfigurationError(\"Display view kernels must match the spectral nodes.\");\n if (!input.kernels && !input.queryPoint) throw new InvalidConfigurationError(\"Display view needs the environment query points without diffraction.\");\n const A = input.electronsPerRadiance, scene = input.scene, offsets = input.offsets, channelAt = input.channelAt;\n const kernelAt = (node: number, t: number): number => (input.kernels ? input.kernels.perNode[node]![t]! : 1);\n // Materials: neutral ones by reflectance, spectral ones by index.\n let reflectance = new Float64Array(0), spectralIndex = new Int32Array(0);\n const spectral: Float64Array[] = [];\n if (scene.kind === \"materials\") {\n reflectance = new Float64Array(scene.materials.length); spectralIndex = new Int32Array(scene.materials.length).fill(-1);\n scene.materials.forEach((m, index) => { if (\"neutral\" in m) reflectance[index] = m.neutral; else { spectralIndex[index] = spectral.length; spectral.push(m.radiance); } });\n }\n // Offsets grouped by fractional shift: offsets that differ by whole sites share one lattice.\n const frac = (v: number): number => { const f = v - Math.floor(v); return f > 1 - OFFSET_TOLERANCE || f < OFFSET_TOLERANCE ? 0 : f; };\n interface Group { fx: number; fy: number; members: { ix: number; iy: number; weight: number }[]; minIx: number; maxIx: number; minIy: number; maxIy: number;\n cw: number; ch: number; neutral: Float64Array[]; spectral: Float64Array[][]; perNode: Float64Array[][]; cache: Int32Array | Float64Array; cx0: number; cy0: number; cpw: number; cph: number }\n const groups: Group[] = [];\n for (const o of offsets) {\n const fx = frac(o.x), fy = frac(o.y), ix = Math.round(o.x - fx), iy = Math.round(o.y - fy);\n let group = groups.find((q) => Math.abs(q.fx - fx) <= OFFSET_TOLERANCE && Math.abs(q.fy - fy) <= OFFSET_TOLERANCE);\n if (!group) { group = { fx, fy, members: [], minIx: ix, maxIx: ix, minIy: iy, maxIy: iy, cw: 0, ch: 0, neutral: [], spectral: [], perNode: [], cache: new Int32Array(0), cx0: 0, cy0: 0, cpw: 0, cph: 0 }; groups.push(group); }\n group.members.push({ ix, iy, weight: o.weight });\n group.minIx = Math.min(group.minIx, ix); group.maxIx = Math.max(group.maxIx, ix); group.minIy = Math.min(group.minIy, iy); group.maxIy = Math.max(group.maxIy, iy);\n }\n if (input.kernels) for (const group of groups) {\n // Combined kernel over lattice offsets d = (ix − tu, iy − tv), stored at (d − min + R).\n const cw = group.maxIx - group.minIx + size, ch = group.maxIy - group.minIy + size;\n group.cw = cw; group.ch = ch;\n const combine = (value: (c: number, node: number, t: number) => number): Float64Array[] => [0, 1, 2].map((c) => {\n const out = new Float64Array(cw * ch);\n for (const member of group.members) for (let tv = -R, t = 0; tv <= R; tv++) for (let tu = -R; tu <= R; tu++, t++) {\n let sum = 0;\n for (let n = 0; n < nodes; n++) sum += value(c, n, t);\n const index = (member.iy - tv - group.minIy + R) * cw + (member.ix - tu - group.minIx + R);\n out[index] = out[index]! + member.weight * sum;\n }\n return out;\n });\n if (scene.kind === \"materials\") {\n group.neutral = combine((c, n, t) => A[c]![n]! * kernelAt(n, t) * scene.whiteRadiance[n]!);\n const perMaterial = spectral.map((radiance) => combine((c, n, t) => A[c]![n]! * kernelAt(n, t) * radiance[n]!));\n group.spectral = [0, 1, 2].map((c) => perMaterial.map((tables) => tables[c]!));\n } else {\n // Radiance scenes: combined kernels per node, applied to the cached radiance at each node.\n group.perNode = Array.from({ length: nodes }, (_, n) => combine((c, node, t) => (node === n ? A[c]![n]! * kernelAt(n, t) : 0)));\n }\n }\n // Neutral tap-0 signal per channel and spectral per material, for the direct (no-kernel) path.\n const neutralDirect = scene.kind === \"materials\" ? [0, 1, 2].map((c) => { let s = 0; for (let n = 0; n < nodes; n++) s += A[c]![n]! * scene.whiteRadiance[n]!; return s; }) : [];\n const spectralDirect = [0, 1, 2].map((c) => spectral.map((radiance) => { let s = 0; for (let n = 0; n < nodes; n++) s += A[c]![n]! * radiance[n]!; return s; }));\n let lookups = 0;\n const point = new Float64Array(2);\n const materialSignalDirect = (m: number, c: number): number => {\n const si = spectralIndex[m];\n if (si === undefined) throw new InvalidConfigurationError(\"Unknown chart material.\");\n return si < 0 ? reflectance[m]! * neutralDirect[c]! : spectralDirect[c]![si]!;\n };\n /** Without diffraction: one site from the environment's own query points. */\n function directSite(x: number, y: number): number {\n const c = channelAt(x, y);\n let sum = 0;\n for (let o = 0; o < offsets.length; o++) {\n input.queryPoint!(x, y, o, point);\n let value: number;\n if (scene.kind === \"materials\") { value = materialSignalDirect(scene.materialAt(point[0]!, point[1]!), c); lookups++; }\n else { value = 0; for (let n = 0; n < nodes; n++) value += A[c]![n]! * scene.radianceAt(point[0]!, point[1]!, input.wavelengthsNm[n]!); lookups += nodes; }\n sum += offsets[o]!.weight * value;\n }\n return sum;\n }\n // Lattice point (p, q) of a group: the facade's lattice formula (createDiffractedPlanarProvider).\n const latticeU = (group: Group, p: number): number => (group.fx === 0 ? (p + 0.5 - W / 2) * g : (p + 0.5 + group.fx - W / 2) * g);\n const latticeV = (group: Group, q: number): number => (group.fy === 0 ? -(q + 0.5 - H / 2) * g : -(q + 0.5 + group.fy - H / 2) * g);\n const radianceScratch = new Float64Array(nodes);\n /** Material (or radiance at each node, into radianceScratch) of a group's lattice point, from the window cache when it holds it. */\n function latticeMaterial(group: Group, p: number, q: number): number {\n const i = p - group.cx0, j = q - group.cy0, cached = i >= 0 && j >= 0 && i < group.cpw && j < group.cph;\n if (cached) { const m = group.cache[j * group.cpw + i]!; if (m >= 0) return m; }\n const m = (scene as Extract<DisplayViewScene, { kind: \"materials\" }>).materialAt(latticeU(group, p), latticeV(group, q));\n lookups++;\n if (cached) group.cache[j * group.cpw + i] = m;\n return m;\n }\n function latticeRadiance(group: Group, p: number, q: number): Float64Array {\n const i = p - group.cx0, j = q - group.cy0, cached = i >= 0 && j >= 0 && i < group.cpw && j < group.cph, cache = group.cache as Float64Array;\n if (cached && !Number.isNaN(cache[(j * group.cpw + i) * nodes]!)) { for (let n = 0; n < nodes; n++) radianceScratch[n] = cache[(j * group.cpw + i) * nodes + n]!; return radianceScratch; }\n const u = latticeU(group, p), v = latticeV(group, q);\n for (let n = 0; n < nodes; n++) radianceScratch[n] = (scene as Extract<DisplayViewScene, { kind: \"radiance\" }>).radianceAt(u, v, input.wavelengthsNm[n]!);\n lookups += nodes;\n if (cached) for (let n = 0; n < nodes; n++) cache[(j * group.cpw + i) * nodes + n] = radianceScratch[n]!;\n return radianceScratch;\n }\n /** With diffraction: one site through the combined kernels on each group's lattice. */\n function kernelSite(x: number, y: number): number {\n const c = channelAt(x, y);\n let sum = 0;\n for (const group of groups) {\n const p0 = x + group.minIx - R, q0 = y + group.minIy - R, cw = group.cw, ch = group.ch;\n if (scene.kind === \"materials\") {\n const nk = group.neutral[c]!, sk = group.spectral[c]!;\n for (let dy = 0; dy < ch; dy++) for (let dx = 0; dx < cw; dx++) {\n const m = latticeMaterial(group, p0 + dx, q0 + dy), si = spectralIndex[m];\n if (si === undefined) throw new InvalidConfigurationError(\"Unknown chart material.\");\n sum += si < 0 ? reflectance[m]! * nk[dy * cw + dx]! : sk[si]![dy * cw + dx]!;\n }\n } else {\n for (let dy = 0; dy < ch; dy++) for (let dx = 0; dx < cw; dx++) {\n const radiance = latticeRadiance(group, p0 + dx, q0 + dy);\n for (let n = 0; n < nodes; n++) sum += group.perNode[n]![c]![dy * cw + dx]! * radiance[n]!;\n }\n }\n }\n return sum;\n }\n // Filled windows (chart materials with diffraction, every lattice point of the window cacheable): each group keeps a band of\n // looked-up lattice materials that covers the window's rows and grows to the right as the windows of a display row move\n // right, with summed-area tables of material changes. A site whose kernel reads one material only (each group's rectangle\n // uniform, the same material in all) takes the value of the same sum over that material, precomputed below in the same\n // order; other sites run the same sum from the band. Either way each site's value is the same sequence of operations as\n // kernelSite, so it is bit-identical. The scene lookup count stays the count kernelSite's lazy window cache makes (each\n // cache point a computed site reads counts once per window, points outside the cache once per read): the rectangles of\n // the sites computed in a window are counted when the window closes (windowLookups).\n const uniformSite = scene.kind === \"materials\" && input.kernels ? [0, 1, 2].map((c) => Float64Array.from(scene.materials, (_, m) => {\n const si = spectralIndex[m]!;\n let sum = 0;\n for (const group of groups) {\n const nk = group.neutral[c]!, sk = si < 0 ? nk : group.spectral[c]![si]!;\n for (let t = 0; t < group.cw * group.ch; t++) sum += si < 0 ? reflectance[m]! * nk[t]! : sk[t]!;\n }\n return sum;\n })) : [];\n const allNeutral = spectral.length === 0;\n /**\n * A group's band: lattice rows [y0, y0 + rows), columns [x0, x0 + filled) looked up, row stride `capacity`. `material`,\n * `reflectance` (neutral-only charts) and the summed-area tables of left changes (`changeLeft`, 1 where a point's material\n * differs from its left neighbour's) and upper changes (`changeUp`), (rows + 1) × (capacity + 1).\n */\n interface Band { x0: number; y0: number; rows: number; capacity: number; filled: number; material: Int32Array; reflectance: Float64Array; changeLeft: Int32Array; changeUp: Int32Array; v: Float64Array }\n const bands: Band[] = groups.map(() => ({ x0: 0, y0: 0, rows: 0, capacity: 0, filled: 0, material: new Int32Array(0), reflectance: new Float64Array(0),\n changeLeft: new Int32Array(0), changeUp: new Int32Array(0), v: new Float64Array(0) }));\n /** Makes the band of group g cover lattice columns [x0, x1) of rows [y0, y0 + rows), extending it to the right when it can. */\n function coverBand(g: number, x0: number, x1: number, y0: number, rows: number): void {\n const group = groups[g]!, band = bands[g]!, materials = scene as Extract<DisplayViewScene, { kind: \"materials\" }>;\n if (!(band.rows === rows && band.y0 === y0 && x0 >= band.x0 && x1 - band.x0 <= band.capacity)) {\n const capacity = Math.max(x1 - x0, Math.min(Math.floor(BAND_LIMIT / rows), W + 2 * (x1 - x0)));\n const size = rows * capacity, tables = (rows + 1) * (capacity + 1);\n band.x0 = x0; band.y0 = y0; band.rows = rows; band.capacity = capacity; band.filled = 0;\n if (band.material.length < size) { band.material = new Int32Array(size); band.reflectance = new Float64Array(allNeutral ? size : 0); }\n if (band.changeLeft.length < tables) { band.changeLeft = new Int32Array(tables); band.changeUp = new Int32Array(tables); }\n band.changeLeft.fill(0, 0, capacity + 1); band.changeUp.fill(0, 0, capacity + 1);\n for (let j = 0; j < rows; j++) { band.changeLeft[(j + 1) * (capacity + 1)] = 0; band.changeUp[(j + 1) * (capacity + 1)] = 0; }\n if (band.v.length < rows) band.v = new Float64Array(rows);\n for (let j = 0; j < rows; j++) band.v[j] = latticeV(group, y0 + j);\n }\n const stride = band.capacity, S1 = stride + 1, material = band.material, left = band.changeLeft, up = band.changeUp;\n for (let i = band.filled; i < x1 - band.x0; i++) {\n const u = latticeU(group, band.x0 + i);\n for (let j = 0; j < rows; j++) {\n const m = materials.materialAt(u, band.v[j]!);\n if (spectralIndex[m] === undefined) throw new InvalidConfigurationError(\"Unknown chart material.\");\n material[j * stride + i] = m;\n if (allNeutral) band.reflectance[j * stride + i] = reflectance[m]!;\n const changedLeft = i > 0 && material[j * stride + i - 1] !== m ? 1 : 0, changedUp = j > 0 && material[(j - 1) * stride + i] !== m ? 1 : 0;\n left[(j + 1) * S1 + i + 1] = left[j * S1 + i + 1]! + left[(j + 1) * S1 + i]! - left[j * S1 + i]! + changedLeft;\n up[(j + 1) * S1 + i + 1] = up[j * S1 + i + 1]! + up[(j + 1) * S1 + i]! - up[j * S1 + i]! + changedUp;\n }\n }\n band.filled = Math.max(band.filled, x1 - band.x0);\n }\n const rectSum = (sat: Int32Array, S1: number, i0: number, j0: number, i1: number, j1: number): number =>\n sat[j1 * S1 + i1]! - sat[j0 * S1 + i1]! - sat[j1 * S1 + i0]! + sat[j0 * S1 + i0]!;\n let filled = false;\n /** Sites outside the site window computed in this window (x, y pairs in window coordinates); their rectangles count when the window closes. */\n let outsideSites: number[] = [];\n let marks = new Uint8Array(0), cover = new Uint8Array(0);\n /** A site of a filled window: (i, j) are its coordinates in the site window, inside or outside it. */\n function filledSite(x: number, y: number, i: number, j: number): number {\n const c = channelAt(x, y), inside = i >= 0 && j >= 0 && i < sw && j < sh;\n if (inside) {\n let m = -1;\n for (let g = 0; g < groups.length; g++) {\n const group = groups[g]!, band = bands[g]!, S1 = band.capacity + 1, bi = x + group.minIx - R - band.x0, bj = y + group.minIy - R - band.y0;\n if (rectSum(band.changeLeft, S1, bi + 1, bj, bi + group.cw, bj + group.ch) !== 0 || rectSum(band.changeUp, S1, bi, bj + 1, bi + group.cw, bj + group.ch) !== 0) { m = -2; break; }\n const own = band.material[bj * band.capacity + bi]!;\n if (m === -1) m = own; else if (own !== m) { m = -2; break; }\n }\n if (m >= 0) { lastMaterial = m; return uniformSite[c]![m]!; }\n }\n lastMaterial = -1;\n let sum = 0;\n for (let g = 0; g < groups.length; g++) {\n const group = groups[g]!, band = bands[g]!, cw = group.cw, ch = group.ch, nk = group.neutral[c]!, sk = group.spectral[c]!, stride = band.capacity;\n const p0 = x + group.minIx - R, q0 = y + group.minIy - R, bi = p0 - band.x0, bj = q0 - band.y0;\n if (inside && allNeutral) {\n const refl = band.reflectance;\n for (let dy = 0, t = 0; dy < ch; dy++) {\n const row = (bj + dy) * stride + bi;\n for (let dx = 0; dx < cw; dx++, t++) sum += refl[row + dx]! * nk[t]!;\n }\n } else if (inside) {\n const material = band.material;\n for (let dy = 0, t = 0; dy < ch; dy++) {\n const row = (bj + dy) * stride + bi;\n for (let dx = 0; dx < cw; dx++, t++) {\n const m = material[row + dx]!, si = spectralIndex[m]!;\n sum += si < 0 ? reflectance[m]! * nk[t]! : sk[si]![t]!;\n }\n }\n } else {\n for (let dy = 0; dy < ch; dy++) for (let dx = 0; dx < cw; dx++) {\n const ci = i + dx, cj = j + dy;\n let m: number;\n if (ci >= 0 && cj >= 0 && ci < group.cpw && cj < group.cph) m = band.material[(bj + dy) * stride + bi + dx]!;\n else m = (scene as Extract<DisplayViewScene, { kind: \"materials\" }>).materialAt(latticeU(group, p0 + dx), latticeV(group, q0 + dy));\n const si = spectralIndex[m];\n if (si === undefined) throw new InvalidConfigurationError(\"Unknown chart material.\");\n sum += si < 0 ? reflectance[m]! * nk[dy * cw + dx]! : sk[si]![dy * cw + dx]!;\n }\n }\n }\n return sum;\n }\n /** Lattice points of an outside site's rectangles that lie outside the window caches (kernelSite looks these up on every read). */\n function outsideLookups(i: number, j: number): number {\n let count = 0;\n for (const group of groups) {\n const w = Math.max(0, Math.min(i + group.cw, group.cpw) - Math.max(i, 0)), h = Math.max(0, Math.min(j + group.ch, group.cph) - Math.max(j, 0));\n count += group.cw * group.ch - w * h;\n }\n return count;\n }\n // Site values of filled windows persist across windows (a site's value does not depend on the window): rows of native\n // sites in a ring of a power-of-two number of rows, row y in slot y mod ringRows. The window's site cache still holds the\n // sites read in the window, which is also what its lookup count needs.\n let ringRows = 0, ringOn = false, ring = new Float64Array(0), ringMaterial = new Int32Array(0), ringRowId = new Int32Array(0), windowMaterial = new Int32Array(0), lastMaterial = -1;\n /** A filled-window site read outside the site window: counted as kernelSite counts it. */\n function outsideRead(i: number, j: number): void { lookups += outsideLookups(i, j); outsideSites.push(i, j); }\n /** A site from the ring; on a miss (re)claims the row's slot when another row holds it, computes the site and stores it. */\n function ringRead(x: number, y: number, i: number, j: number): number {\n const slot = y & (ringRows - 1), q = slot * W + x;\n if (ringRowId[slot] === y) { const v = ring[q]!; if (v === v) { lastMaterial = ringMaterial[q]!; return v; } }\n else { ringRowId[slot] = y; ring.fill(NaN, slot * W, (slot + 1) * W); }\n const v = filledSite(x, y, i, j);\n ring[q] = v; ringMaterial[q] = lastMaterial;\n return v;\n }\n /** A site not in the window's site cache: from the ring, a filled window without the ring, the lazy window caches, or uncached. */\n function siteMiss(x: number, y: number, i: number, j: number, cached: boolean): number {\n if (ringOn) {\n if (!cached) { outsideRead(i, j); return ringRead(x, y, i, j); }\n const v = ringRead(x, y, i, j);\n siteCache[j * sw + i] = v; windowMaterial[j * sw + i] = lastMaterial;\n return v;\n }\n if (filled && !cached) outsideRead(i, j);\n const v = filled ? filledSite(x, y, i, j) : input.kernels ? kernelSite(x, y) : directSite(x, y);\n if (cached) siteCache[j * sw + i] = v;\n return v;\n }\n /**\n * Lattice points of the closing window that kernelSite's lazy cache would have looked up: per group, the window cache points\n * covered by the rectangles of the computed sites (the site cache's filled entries and the outside sites), a box dilation.\n */\n function windowLookups(): number {\n let total = 0;\n for (const group of groups) {\n const cw = group.cw, ch = group.ch, cpw = group.cpw, cph = group.cph, ew = cpw + cw - 1, eh = cph + ch - 1;\n // Top-left marks in extended coordinates (window coordinates + (cw − 1, ch − 1)), and their bounding box.\n if (marks.length < ew * eh) { marks = new Uint8Array(ew * eh); }\n let x0 = ew, x1 = -1, y0 = eh, y1 = -1;\n const mark = (ei: number, ej: number): void => {\n if (ei < 0 || ej < 0 || ei >= ew || ej >= eh) return;\n marks[ej * ew + ei] = 1;\n if (ei < x0) x0 = ei; if (ei > x1) x1 = ei; if (ej < y0) y0 = ej; if (ej > y1) y1 = ej;\n };\n for (let j = 0; j < sh; j++) for (let i = 0; i < sw; i++) if (!Number.isNaN(siteCache[j * sw + i]!)) mark(i + cw - 1, j + ch - 1);\n for (let k = 0; k < outsideSites.length; k += 2) mark(outsideSites[k]! + cw - 1, outsideSites[k + 1]! + ch - 1);\n if (x1 < 0) continue;\n // Cache point (i, j) is covered when a mark lies in extended columns [i, i + cw) and rows [j, j + ch): a horizontal\n // then a vertical running count over the marks' box (outside it nothing is covered).\n const i0 = Math.max(0, x0 - cw + 1), i1 = Math.min(cpw - 1, x1), cwid = i1 - i0 + 1;\n if (cover.length < cwid * (y1 - y0 + 1)) cover = new Uint8Array(cwid * (y1 - y0 + 1));\n for (let r = y0; r <= y1; r++) {\n let run = 0;\n for (let e = i0; e <= i1 + cw - 1; e++) {\n run += marks[r * ew + e]!;\n if (e - cw >= i0) run -= marks[r * ew + e - cw]!;\n if (e >= i0 + cw - 1) cover[(r - y0) * cwid + e - cw + 1 - i0] = run > 0 ? 1 : 0;\n }\n marks.fill(0, r * ew + x0, r * ew + x1 + 1);\n }\n for (let i = 0; i < cwid; i++) {\n let run = 0;\n for (let r = y0; r <= y1 + ch - 1; r++) {\n if (r <= y1) run += cover[(r - y0) * cwid + i]!;\n if (r - ch >= y0 && r - ch <= y1) run -= cover[(r - ch - y0) * cwid + i]!;\n const j = r - ch + 1;\n if (j >= 0 && j < cph && run > 0) total++;\n }\n }\n }\n return total;\n }\n let sx0 = 0, sy0 = 0, sw = 0, sh = 0, siteCache = new Float64Array(0);\n const pilotNode = input.wavelengthsNm[Math.floor(nodes / 2)]!;\n return {\n get lookups(): number { return lookups + (filled ? windowLookups() : 0); },\n get uniformMaterial(): number { return lastMaterial; },\n get tracksMaterial(): boolean { return ringOn; },\n window(x0: number, y0: number, x1: number, y1: number): void {\n if (filled) lookups += windowLookups();\n filled = false; ringOn = false; outsideSites = [];\n sx0 = x0; sy0 = y0; sw = Math.max(0, x1 - x0); sh = Math.max(0, y1 - y0);\n if (sw * sh > CACHE_LIMIT) { sw = 0; sh = 0; }\n if (siteCache.length < sw * sh) siteCache = new Float64Array(sw * sh);\n siteCache.fill(NaN, 0, sw * sh);\n if (!input.kernels) return;\n for (const group of groups) {\n group.cx0 = x0 + group.minIx - R; group.cy0 = y0 + group.minIy - R;\n group.cpw = sw === 0 ? 0 : sw + group.cw - 1; group.cph = sh === 0 ? 0 : sh + group.ch - 1;\n if (group.cpw * group.cph * (scene.kind === \"materials\" ? 1 : nodes) > CACHE_LIMIT) { group.cpw = 0; group.cph = 0; }\n }\n // Chart materials whose every group caches the whole window: the filled path (bands). Otherwise the lazy window caches.\n if (scene.kind === \"materials\" && sw > 0 && groups.every((group) => group.cpw > 0)) {\n groups.forEach((group, g) => coverBand(g, group.cx0, group.cx0 + group.cpw, group.cy0, group.cph));\n filled = true;\n if (windowMaterial.length < sw * sh) windowMaterial = new Int32Array(sw * sh);\n // A ring of at least twice the window's rows keeps the rows of the previous display row's windows.\n if (ringRows < 2 * sh) {\n let rows = 1;\n while (rows < 2 * sh) rows *= 2;\n if (rows * W <= CACHE_LIMIT) { ringRows = rows; ring = new Float64Array(rows * W).fill(NaN); ringMaterial = new Int32Array(rows * W); ringRowId = new Int32Array(rows).fill(-1); }\n }\n ringOn = ringRows >= 2 * sh;\n return;\n }\n for (const group of groups) {\n const n = group.cpw * group.cph * (scene.kind === \"materials\" ? 1 : nodes);\n if (scene.kind === \"materials\") { if (group.cache.length < n || !(group.cache instanceof Int32Array)) group.cache = new Int32Array(n); group.cache.fill(-1, 0, n); }\n else { if (group.cache.length < n || !(group.cache instanceof Float64Array)) group.cache = new Float64Array(n); group.cache.fill(NaN, 0, n); }\n }\n },\n site(x: number, y: number): number {\n // The window's site cache first (with the ring: the sites read in this window, which its lookup count needs too).\n const i = x - sx0, j = y - sy0, cached = i >= 0 && j >= 0 && i < sw && j < sh;\n if (cached) { const w = j * sw + i, v = siteCache[w]!; if (v === v) { if (ringOn) lastMaterial = windowMaterial[w]!; return v; } }\n return siteMiss(x, y, i, j, cached);\n },\n pilot(u: number, v: number): number {\n lookups++;\n return scene.kind === \"materials\" ? scene.materialAt(u, v) : scene.radianceAt(u, v, pilotNode);\n }\n };\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// Normal-distribution helpers.\n\n/** Standard normal density. */\nfunction phi(z: number): number { return 0.3989422804014327 * portableExp(-0.5 * z * z); }\n/**\n * Standard normal distribution function, Φ(z) = 1 − Q(z), with Q from the rational approximation 26.2.17 of\n * Abramowitz & Stegun, Handbook of Mathematical Functions (NBS AMS 55, 1964; free, US government work):\n * absolute error below 7.5e-8.\n */\nfunction bigPhi(z: number): number {\n const x = Math.abs(z), t = 1 / (1 + 0.2316419 * x);\n const q = phi(x) * t * (0.319381530 + t * (-0.356563782 + t * (1.781477937 + t * (-1.821255978 + t * 1.330274429))));\n return z >= 0 ? 1 - q : q;\n}\n/** Beyond this many standard deviations from a clip level the clip changes the moments by less than 1e-15 of σ². */\nconst CLIP_REACH_SIGMA = 8.5;\n\n/**\n * Internal (exported for tests). Moments of min(Y, top) for Y ~ N(m, v): mean, variance and the slope d E/d m = P(Y < top). Exact for a normal Y:\n * E[min(Y,t)] = m − s·(φ(z) − z·(1 − Φ(z))), z = (t − m)/s.\n */\nexport function upperClip(m: number, v: number, top: number, out: Float64Array): void {\n if (!(v > 0)) { const c = m < top ? m : top; out[0] = c; out[1] = 0; out[2] = m < top ? 1 : 0; return; }\n const s = Math.sqrt(v), z = (top - m) / s;\n if (z > CLIP_REACH_SIGMA) { out[0] = m; out[1] = v; out[2] = 1; return; }\n if (z < -CLIP_REACH_SIGMA) { out[0] = top; out[1] = 0; out[2] = 0; return; }\n const P = bigPhi(z), d = phi(z);\n const mean = m - s * (d - z * (1 - P));\n // E[min(Y,t)²] = m²Φ − 2msφ + s²(Φ − zφ) + t²(1 − Φ).\n const second = m * m * P - 2 * m * s * d + v * (P - z * d) + top * top * (1 - P);\n out[0] = mean; out[1] = Math.max(0, second - mean * mean); out[2] = P;\n}\n/**\n * Internal (exported for tests). Moments of clip(Y, 0, 1) for Y with mean m, variance v and standardized skewness γ\n * (default 0: normal, closed form). The mean carries the first-order Edgeworth term of a skewed Y: for\n * E[(Y − t)₊] it adds s·γ·z·φ(z)/6 at z = (t − m)/s, so E[clip] gains (s·γ/6)·(a·φ(a) − b·φ(b)) with a = −m/s,\n * b = (1 − m)/s (docs/DISPLAY_VIEW.md, \"Readout\"). |γ| is limited to 1, where the first-order term is still a small part.\n */\nexport function unitClip(m: number, v: number, out: Float64Array, skewness = 0): void {\n if (!(v > 0)) { const c = m < 0 ? 0 : m > 1 ? 1 : m; out[0] = c; out[1] = 0; out[2] = m > 0 && m < 1 ? 1 : 0; return; }\n const s = Math.sqrt(v), a = -m / s, b = (1 - m) / s;\n if (a < -CLIP_REACH_SIGMA && b > CLIP_REACH_SIGMA) { out[0] = m; out[1] = v; out[2] = 1; return; }\n const Pa = a < -CLIP_REACH_SIGMA ? 0 : bigPhi(a), Pb = b > CLIP_REACH_SIGMA ? 1 : bigPhi(b), da = a < -CLIP_REACH_SIGMA ? 0 : phi(a), db = b > CLIP_REACH_SIGMA ? 0 : phi(b);\n const inside = Pb - Pa, gamma = skewness > 1 ? 1 : skewness < -1 ? -1 : skewness;\n const mean = m * inside + s * (da - db) + (1 - Pb) + (gamma === 0 ? 0 : s * gamma / 6 * ((a < -CLIP_REACH_SIGMA ? 0 : a * da) - (b > CLIP_REACH_SIGMA ? 0 : b * db)));\n // E[Y² 1(0<Y<1)] = (m² + s²)(Φb − Φa) + 2ms(φa − φb) + s²(aφa − bφb); plus P(Y ≥ 1).\n const aa = a < -CLIP_REACH_SIGMA ? 0 : a * da, bb = b > CLIP_REACH_SIGMA ? 0 : b * db;\n const second = (m * m + v) * inside + 2 * m * s * (da - db) + v * (aa - bb) + (1 - Pb);\n out[0] = mean; out[1] = Math.max(0, second - mean * mean); out[2] = inside;\n}\n/** Gauss–Legendre nodes and weights on [−1, 1], 16 points (computed once by Newton iteration on P_16 from cos(π(i + ¾)/(n + ½))). */\nconst GL = ((): { x: Float64Array; w: Float64Array } => {\n const n = 16, x = new Float64Array(n), w = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n let z = portableCosTwoPi((i + 0.75) / (2 * n + 1)), dp = 0;\n for (let it = 0; it < 100; it++) {\n let p0 = 1, p1 = z;\n for (let k = 2; k <= n; k++) { const p2 = ((2 * k - 1) * z * p1 - (k - 1) * p0) / k; p0 = p1; p1 = p2; }\n dp = n * (z * p1 - p0) / (z * z - 1);\n const dz = p1 / dp;\n z -= dz;\n if (Math.abs(dz) < 1e-16) break;\n }\n x[i] = z; w[i] = 2 / ((1 - z * z) * dp * dp);\n }\n return { x, w };\n})();\n/** Internal (exported for tests). Positive Reinhard per channel then the clip to [0, 1]: h(x) = x/(1 + x) for x > 0, else 0 (its slope h' = 1/(1 + x)²). */\nexport function reinhardMoments(m: number, v: number, out: Float64Array): void {\n if (!(v > 0)) { out[0] = m > 0 ? m / (1 + m) : 0; out[1] = 0; out[2] = m > 0 ? 1 / ((1 + m) * (1 + m)) : 0; return; }\n const s = Math.sqrt(v), lo = Math.max(0, m - CLIP_REACH_SIGMA * s), hi = m + CLIP_REACH_SIGMA * s;\n if (!(hi > lo)) { out[0] = 0; out[1] = 0; out[2] = 0; return; }\n // Composite 16-point Gauss–Legendre over [lo, hi] in 4 panels; h is smooth there (the kink at 0 is an end point).\n let e1 = 0, e2 = 0, ed = 0;\n const panels = 4, width = (hi - lo) / panels;\n for (let p = 0; p < panels; p++) {\n const c = lo + (p + 0.5) * width, half = width / 2;\n for (let k = 0; k < 16; k++) {\n const x = c + half * GL.x[k]!, weight = half * GL.w[k]! * phi((x - m) / s) / s, h = x / (1 + x);\n e1 += weight * h; e2 += weight * h * h; ed += weight / ((1 + x) * (1 + x));\n }\n }\n out[0] = e1; out[1] = Math.max(0, e2 - e1 * e1); out[2] = ed;\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// The display view renderer.\n\n/** Per CFA channel: normalized RAW value = (code − black)/(white − black) of a site with e expected electrons. */\nexport interface DisplayViewChannelReadout {\n /** Normalized value per electron: digitalGain / (conversionGain·(white − black)). */\n perElectron: number;\n /** Mean dark electrons per site during the exposure. */\n darkElectrons: number;\n /** Variance of the normalized value not proportional to the electrons: read noise and ADC quantization. */\n constantVariance: number;\n}\n\nexport interface DisplayViewSetup {\n frameWidth: number;\n frameHeight: number;\n /** Native site of output pixel (0, 0). */\n margin: number;\n nativeWidth: number;\n nativeHeight: number;\n viewWidth: number;\n viewHeight: number;\n region: { x: number; y: number; width: number; height: number };\n /** Samples per axis in display pixels whose pilot finds detail; uniform ones use a quarter (at least 1). */\n samplesPerAxis: number;\n /** Sites beyond the footprint that can affect its pixels (demosaic, filter and kernel reach), for the pilot. */\n reachSites: number;\n bitDepth: 8 | 16;\n seed: number;\n signal: DisplayViewExpectedSignal;\n readout: readonly [DisplayViewChannelReadout, DisplayViewChannelReadout, DisplayViewChannelReadout];\n /** Bilinear demosaic kernels per absolute CFA phase (phaseY·2 + phaseX): for each output channel, (dx, dy, weight) triples. */\n demosaic: readonly (readonly (readonly DisplayViewKernelTap[])[])[];\n /**\n * The demosaic whose pixel statistics the view reproduces, per phase: one candidate (bilinear) or AHD's two directional\n * linear candidates (`ahdCandidateKernels`), each a kernel per output channel. Default: the bilinear kernels.\n */\n candidates?: readonly (readonly (readonly (readonly DisplayViewKernelTap[])[])[])[];\n /** White-balance gains applied to the normalized camera channels and the highlight clip level (the smallest gain). */\n gains: readonly [number, number, number];\n clipLevel: number;\n /** Camera channels (after WB and the highlight clip) → linear sRGB: rows are output components. */\n matrix: readonly (readonly number[])[];\n toneCurve: \"identity\" | \"positive-reinhard-per-channel\";\n /**\n * AHD only: the low-signal correction. `labMatrix` is the camera → XYZ matrix AHD measures homogeneity with (the profile's\n * matrix times the white-balance gains); samples whose pixel variance (linear light) exceeds `thresholdVariance` add the\n * correction of a flat neighbourhood with their channel means, estimated once per quantized state with `drawsPerState` draws.\n */\n ahdCorrection?: { labMatrix: readonly (readonly number[])[]; drawsPerState: number; thresholdVariance: number };\n yieldControl(): Promise<void>;\n checkAbort(): void;\n}\n\nexport interface DisplayViewRenderResult {\n samples: Uint8Array | Uint16Array;\n /** Mean linear-light value of each display pixel before the noise draw (diagnostics and validation). */\n expected: Float64Array;\n /** Noise standard deviation of each display pixel's components in linear light (square root of the covariance diagonal). */\n noiseStd: Float64Array;\n sampleCount: number;\n siteCount: number;\n /** Display pixels whose pilot found detail (full samples) and uniform ones (a quarter per axis). */\n detailPixelCount: number;\n uniformPixelCount: number;\n /** Display pixels whose expected value includes the AHD low-signal correction. */\n ahdCorrectedPixelCount: number;\n}\n\n/** One tap of a linear demosaic kernel: the site at (dx, dy) from the pixel, and its weight. */\nexport interface DisplayViewKernelTap { dx: number; dy: number; weight: number }\n\n/**\n * AHD's two directional candidates (`createAhdDemosaicTask`, after Hirakawa & Parks 2005) as linear kernels, for a pixel of\n * CFA phase (phaseX, phaseY) of an RGGB mosaic: green along the rows (or columns) with the 5-tap filter\n * [−1/4, 1/2, 1/2, 1/2, −1/4], then red and blue from bilinearly interpolated colour differences against that green. Each\n * candidate is linear in the mosaic, so its kernel is its response to a unit site; AHD then picks one candidate per pixel\n * by homogeneity, which is the only non-linear step. Returns [horizontal, vertical], each [red, green, blue] kernels.\n */\nexport function ahdCandidateKernels(phaseX: number, phaseY: number): DisplayViewKernelTap[][][] {\n const role = (dx: number, dy: number): number => { const x = (phaseX + dx) & 1, y = (phaseY + dy) & 1; return y === 0 ? (x === 0 ? 0 : 1) : (x === 0 ? 1 : 2); };\n const evaluate = (site: (dx: number, dy: number) => number, horizontal: boolean): number[] => {\n const green = (dx: number, dy: number): number => {\n const c = site(dx, dy);\n if (role(dx, dy) === 1) return c;\n return horizontal ? (site(dx - 1, dy) + site(dx + 1, dy)) / 2 + (2 * c - site(dx - 2, dy) - site(dx + 2, dy)) / 4\n : (site(dx, dy - 1) + site(dx, dy + 1)) / 2 + (2 * c - site(dx, dy - 2) - site(dx, dy + 2)) / 4;\n };\n const diff = (dx: number, dy: number): number => site(dx, dy) - green(dx, dy);\n const out = [0, 0, 0], own = role(0, 0), g = green(0, 0);\n out[1] = g;\n if (own === 1) {\n const hRole = role(1, 0), vRole = 2 - hRole;\n out[hRole] = g + (diff(-1, 0) + diff(1, 0)) / 2;\n out[vRole] = g + (diff(0, -1) + diff(0, 1)) / 2;\n } else {\n out[own] = site(0, 0);\n out[2 - own] = g + (diff(-1, -1) + diff(1, -1) + diff(-1, 1) + diff(1, 1)) / 4;\n }\n return out;\n };\n return [true, false].map((horizontal) => {\n const kernels: DisplayViewKernelTap[][] = [[], [], []];\n for (let dy = -3; dy <= 3; dy++) for (let dx = -3; dx <= 3; dx++) {\n const response = evaluate((x, y) => (x === dx && y === dy ? 1 : 0), horizontal);\n for (let c = 0; c < 3; c++) if (response[c] !== 0) kernels[c]!.push({ dx, dy, weight: response[c]! });\n }\n return kernels;\n });\n}\n\n/** 1-D overlaps of real output columns with one display column: first column index and the overlaps. */\nfunction overlaps(start: number, end: number, limit: number): { first: number; w: Float64Array } {\n const first = Math.floor(start), last = Math.min(limit - 1, Math.ceil(end) - 1), w = new Float64Array(last - first + 1);\n for (let k = first; k <= last; k++) w[k - first] = Math.min(end, k + 1) - Math.max(start, k);\n return { first, w };\n}\n/**\n * Internal (exported for tests). Footprint sums along one axis, for the closed-form B_c (docs/DISPLAY_VIEW.md, \"Demosaic correlation\"). Native\n * coordinate parity decides the CFA: red columns/rows are even, blue odd. With w(k) the overlap of real column k:\n * - b(k) = w(k) + ½(w(k − 1) + w(k + 1)), the bilinear red/blue spread; sums of b² over even and odd native k;\n * - p(k) = w(k), q(k) = ¼(w(k − 1) + w(k + 1)) for green: sums of p², q² and p·q over even and odd native k;\n * - Σ w².\n */\nexport interface AxisSums { bEven: number; bOdd: number; ppEven: number; ppOdd: number; qqEven: number; qqOdd: number; pqEven: number; pqOdd: number; ww: number }\nexport function axisSums(start: number, end: number, limit: number, margin: number): AxisSums {\n const { first, w } = overlaps(start, end, limit);\n const at = (k: number): number => (k >= first && k < first + w.length ? w[k - first]! : 0);\n const s: AxisSums = { bEven: 0, bOdd: 0, ppEven: 0, ppOdd: 0, qqEven: 0, qqOdd: 0, pqEven: 0, pqOdd: 0, ww: 0 };\n for (let k = first - 1; k <= first + w.length; k++) {\n const p = at(k), q = (at(k - 1) + at(k + 1)) / 4, b = p + 2 * q, even = ((k + margin) & 1) === 0;\n if (even) { s.bEven += b * b; s.ppEven += p * p; s.qqEven += q * q; s.pqEven += p * q; } else { s.bOdd += b * b; s.ppOdd += p * p; s.qqOdd += q * q; s.pqOdd += p * q; }\n s.ww += p * p;\n }\n return s;\n}\n/** Internal (exported for tests). B for red, green and blue (Σ β² over the channel's sites, β normalized to unit sum) and Σ (w/A)². */\nexport function footprintWeights(x: AxisSums, y: AxisSums, area: number, out: Float64Array): void {\n const a2 = area * area;\n const green = (xpp: number, xqq: number, xpq: number, ypp: number, yqq: number, ypq: number): number =>\n xpp * ypp + xqq * ypp + xpp * yqq + 2 * xpq * ypp + 2 * xpp * ypq + 2 * xpq * ypq;\n out[0] = x.bEven * y.bEven / a2;\n // Green sites: (odd x, even y) and (even x, odd y).\n out[1] = (green(x.ppOdd, x.qqOdd, x.pqOdd, y.ppEven, y.qqEven, y.pqEven) + green(x.ppEven, x.qqEven, x.pqEven, y.ppOdd, y.qqOdd, y.pqOdd)) / a2;\n out[2] = x.bOdd * y.bOdd / a2;\n out[3] = x.ww * y.ww / a2;\n}\n/** AHD's dependence reach in sites (directional green ±2, colour differences ±1, homogeneity 4-neighbours and 3 × 3 sum). */\nconst AHD_REACH = 5, AHD_SIDE = 2 * AHD_REACH + 1;\n/** Grid of flat-neighbourhood states for the AHD correction: steps per octave of the normalized channel mean, octaves below white. */\nconst AHD_KEY_STEPS = 8, AHD_KEY_OCTAVES = 12;\n/** CFA role (0 red, 1 green, 2 blue) of each patch site (dy + 5)·11 + dx + 5, per phase (phaseY·2 + phaseX) of the centre. */\nconst AHD_ROLES = [0, 1, 2, 3].map((phase) => {\n const roles = new Uint8Array(AHD_SIDE * AHD_SIDE), px = phase & 1, py = phase >> 1;\n for (let dy = -AHD_REACH; dy <= AHD_REACH; dy++) for (let dx = -AHD_REACH; dx <= AHD_REACH; dx++) {\n const xx = (px + dx) & 1, yy = (py + dy) & 1;\n roles[(dy + AHD_REACH) * AHD_SIDE + dx + AHD_REACH] = yy === 0 ? (xx === 0 ? 0 : 1) : (xx === 0 ? 1 : 2);\n }\n return roles;\n});\n/**\n * 1 for the patch sites the AHD steps read (directional greens within 3 sites read 2 further along their axis, the candidates\n * within 2 read 1 further): |dy| ≤ 3 or |dx| ≤ 3. The 16 sites with |dx| ≥ 4 and |dy| ≥ 4 are never read.\n */\nconst AHD_READ = Uint8Array.from({ length: AHD_SIDE * AHD_SIDE }, (_, p) => {\n const dx = (p % AHD_SIDE) - AHD_REACH, dy = Math.floor(p / AHD_SIDE) - AHD_REACH;\n return Math.abs(dx) <= 3 || Math.abs(dy) <= 3 ? 1 : 0;\n});\n/** x², as one correctly rounded product (`**` is implementation-approximated in ECMA-262). */\nfunction square(x: number): number { return x * x; }\n/** CIELAB's f(t) constants (CIE 15:2004): linear below (6/29)³ with slope (29/3)³/116. */\nconst LAB_EPSILON = 216 / 24389, LAB_KAPPA = 24389 / 27;\n/** A 32-bit hash of a correction key (MurmurHash3 finalizer of the three quantized means). */\nfunction fmixKey(a: number, b: number, c: number): number { return fmix32((Math.imul(a + 1, 0x9e3779b1) ^ Math.imul(b + 1, 0x85ebca77) ^ Math.imul(c + 1, 0xc2b2ae3d)) >>> 0); }\n/** Lowest grid level, 2^-AHD_KEY_OCTAVES of white (exact). */\nconst AHD_KEY_FLOOR = 1 / 4096;\n/** Grid levels per channel (indices 0 to AHD_KEY_OCTAVES·AHD_KEY_STEPS). */\nconst AHD_KEY_LEVELS = AHD_KEY_OCTAVES * AHD_KEY_STEPS + 1;\n/** Correction states kept per setup, and setups kept (least recently used first out); about 50 bytes per state. */\nconst AHD_STATE_LIMIT = 1 << 16, AHD_SETUP_LIMIT = 4;\n/** The correction states of one setup: the three values of state n at values[3·n …], found by its grid key. */\ninterface CorrectionStates { index: Map<number, number>; values: Float64Array }\nconst ahdStateCache = new Map<string, CorrectionStates>();\n/** Every input a correction state depends on besides its indices, as exact decimal text (JavaScript numbers round-trip). */\nfunction correctionKey(seed: number, correction: NonNullable<DisplayViewSetup[\"ahdCorrection\"]>, perElectron: readonly number[], constantVariance: readonly number[],\n gains: readonly number[], clipLevel: number, matrix: readonly (readonly number[])[], toneCurve: string): string {\n return [seed, correction.drawsPerState, ...perElectron, ...constantVariance, ...correction.labMatrix.flat(), ...gains, clipLevel, ...matrix.flat(), toneCurve].join(\",\");\n}\n/** Internal (exported for tests): the correction states kept across calls, and clearing them. */\nexport function displayViewCorrectionStateCount(): number { let n = 0; for (const states of ahdStateCache.values()) n += states.index.size; return n; }\nexport function clearDisplayViewCorrectionStates(): void { ahdStateCache.clear(); }\n/** The state map of one setup (moved to the most recently used end). */\nfunction correctionStates(key: string): CorrectionStates {\n let states = ahdStateCache.get(key);\n if (states) ahdStateCache.delete(key);\n else {\n states = { index: new Map(), values: new Float64Array(3 * 256) };\n if (ahdStateCache.size >= AHD_SETUP_LIMIT) ahdStateCache.delete(ahdStateCache.keys().next().value!);\n }\n ahdStateCache.set(key, states);\n return states;\n}\n/**\n * Recorded terms of a one-material sample: [0, 3) the channel site variances csv; [3, 21) per candidate d and channel c the\n * linear slopes a (3 + (3d + c)·3); [21, 27) per candidate the residual terms; [27, 30) the expected-value sums; [30, 33) the\n * AHD choice terms; 33 a 1 when the AHD correction applies and [34, 37) its values.\n */\nconst MEMO_SIZE = 37;\n/** Pilot points per axis: about one per two sites of the footprint plus its reach, 4 to 16. */\nfunction pilotCount(span: number): number { return Math.max(4, Math.min(16, Math.ceil(span / 2))); }\n\n/** Renders the display view (docs/DISPLAY_VIEW.md). */\nexport async function renderDisplayView(setup: DisplayViewSetup): Promise<DisplayViewRenderResult> {\n const { frameWidth, frameHeight, margin, nativeWidth, nativeHeight, viewWidth, viewHeight, region, seed, reachSites } = setup;\n const sx = frameWidth / viewWidth, sy = frameHeight / viewHeight, area = sx * sy, g = 2 / frameWidth;\n const fullK = setup.samplesPerAxis, uniformK = Math.max(1, Math.round(fullK / 4));\n const maximum = setup.bitDepth === 8 ? 255 : 65535, step = 1 / maximum;\n const pixelCount = region.width * region.height;\n const samples = setup.bitDepth === 8 ? new Uint8Array(pixelCount * 3) : new Uint16Array(pixelCount * 3);\n const expected = new Float64Array(pixelCount * 3), noiseStd = new Float64Array(pixelCount * 3);\n const columns = Array.from({ length: region.width }, (_, i) => axisSums((region.x + i) * sx, (region.x + i + 1) * sx, frameWidth, margin));\n const M = setup.matrix, m00 = M[0]![0]!, m01 = M[0]![1]!, m02 = M[0]![2]!, m10 = M[1]![0]!, m11 = M[1]![1]!, m12 = M[1]![2]!, m20 = M[2]![0]!, m21 = M[2]![1]!, m22 = M[2]![2]!;\n const g0 = setup.gains[0], g1 = setup.gains[1], g2 = setup.gains[2], L = setup.clipLevel, reinhard = setup.toneCurve === \"positive-reinhard-per-channel\";\n const k = setup.readout.map((r) => r.perElectron), dark = setup.readout.map((r) => r.darkElectrons), c0 = setup.readout.map((r) => r.constantVariance);\n // Site window: 3 × 3 for the bilinear kernels, 7 × 7 when AHD's candidates read up to 3 sites away. Slot (dy + r)·(2r + 1) + dx + r.\n const candidates = setup.candidates ?? setup.demosaic.map((phase) => [phase]);\n const reach = Math.max(1, ...candidates.flat(3).map((t) => Math.max(Math.abs(t.dx), Math.abs(t.dy)))), side = 2 * reach + 1, slotsCount = side * side;\n const slotOf = (t: DisplayViewKernelTap): number => (t.dy + reach) * side + t.dx + reach;\n // Per phase: the bilinear kernels (for the site variance of each channel), the candidates, and the slots they read.\n const phaseSlots: Int32Array[][] = [], phaseWeights: Float64Array[][] = [], phaseW2: Float64Array[] = [], phaseList: Int32Array[] = [];\n const candidateSlots: Int32Array[][][] = [], candidateWeights: Float64Array[][][] = [], candidateDense: Float64Array[][] = [], candidateList: Int32Array[][] = [];\n for (let p = 0; p < 4; p++) {\n const kernels = setup.demosaic[p]!;\n phaseSlots[p] = kernels.map((list) => Int32Array.from(list, slotOf));\n phaseWeights[p] = kernels.map((list) => Float64Array.from(list, (t) => t.weight));\n phaseW2[p] = Float64Array.from(kernels, (list) => list.reduce((sum, t) => sum + t.weight * t.weight, 0));\n candidateSlots[p] = candidates[p]!.map((candidate) => candidate.map((list) => Int32Array.from(list, slotOf)));\n candidateDense[p] = candidates[p]!.map((candidate) => { const dense = new Float64Array(3 * slotsCount); candidate.forEach((list, c) => { for (const t of list) { const i = c * slotsCount + slotOf(t); dense[i] = dense[i]! + t.weight; } }); return dense; });\n candidateWeights[p] = candidates[p]!.map((candidate) => candidate.map((list) => Float64Array.from(list, (t) => t.weight)));\n const used = new Set<number>([...phaseSlots[p]!.flatMap((a) => Array.from(a)), ...candidateSlots[p]!.flat().flatMap((a) => Array.from(a))]);\n phaseList[p] = Int32Array.from([...used].sort((a, b) => a - b));\n // The slots of phaseList (same order) where a candidate has a non-zero weight in some channel. A sum over phaseList adds\n // ±0 at the other slots, which leaves a sum that starts at +0 unchanged, so the sums below skip them.\n candidateList[p] = candidateDense[p]!.map((dense) => phaseList[p]!.filter((slot) => dense[slot] !== 0 || dense[slotsCount + slot] !== 0 || dense[2 * slotsCount + slot] !== 0));\n }\n const siteElectrons = new Float64Array(slotsCount), siteMean = new Float64Array(slotsCount), siteVar = new Float64Array(slotsCount), siteThird = new Float64Array(slotsCount), siteChannel = new Int32Array(slotsCount), clip = new Float64Array(3), B = new Float64Array(4), C = new Float64Array(9);\n const cm = new Float64Array(3), cv = new Float64Array(3), csv = new Float64Array(3), bm = new Float64Array(3), bv = new Float64Array(3), bs = new Float64Array(3);\n const hm = new Float64Array(3), hv = new Float64Array(3), hs = new Float64Array(3), an = new Float64Array(9);\n const reach2 = CLIP_REACH_SIGMA * CLIP_REACH_SIGMA;\n // AHD low-signal correction: an 11 × 11 noisy neighbourhood (AHD reads up to 5 sites away) and the local AHD steps.\n const ahdCorrection = setup.ahdCorrection, windowReach = ahdCorrection ? Math.max(reach, AHD_REACH) : reach;\n const correction = new Float64Array(3), patch = new Float64Array(AHD_SIDE * AHD_SIDE), cmAverage = new Float64Array(3);\n let correctedPixels = 0;\n const readStd = c0.map((v) => Math.sqrt(v));\n // The correction of a flat neighbourhood whose sites of channel c have normalized mean μ_c, on a logarithmic grid of states\n // (AHD_KEY_STEPS per octave from 2^-AHD_KEY_OCTAVES of white); each grid state is computed once with draws seeded by the state\n // alone, so it is the same in every display pixel and region, and a pixel interpolates trilinearly between the 8 states\n // around its own channel means.\n // Grid states are shared across display pixels and across calls: a state depends only on its indices and on the inputs in\n // `correctionKey` (the seed, the draws, the readout scale and noise, the homogeneity matrix and the development), so a cached\n // state is the same value the draws would give again.\n const states = ahdCorrection ? correctionStates(correctionKey(seed, ahdCorrection, k, c0, setup.gains, L, M, setup.toneCurve)) : { index: new Map<number, number>(), values: new Float64Array(0) };\n /** The offset of a grid state's three values in states.values (computed and stored on first use). */\n function gridCorrection(i0: number, i1: number, i2: number): number {\n const key = (i0 * AHD_KEY_LEVELS + i1) * AHD_KEY_LEVELS + i2, cached = states.index.get(key);\n if (cached !== undefined) return 3 * cached;\n const electrons = [i0, i1, i2].map((i, c) => portableExp2(i / AHD_KEY_STEPS - AHD_KEY_OCTAVES) / k[c]!);\n const random = createDeterministicUniformStream(deriveNativeSiteStreamSeedUint32(seed, fmixKey(i0, i1, i2), DISPLAY_VIEW_AHD_STREAM_ID));\n const sum = new Float64Array(3), draws = ahdCorrection!.drawsPerState, poisson = electrons.map((e) => createPoissonSampler(e, true));\n const normal = createPortableStandardNormalPairs(random);\n for (let draw = 0; draw < draws; draw++) {\n const phase = draw & 3, roles = AHD_ROLES[phase]!;\n for (let p = 0; p < AHD_SIDE * AHD_SIDE; p++) {\n // The 16 sites the AHD steps never read are not drawn.\n if (AHD_READ[p] === 0) continue;\n const c = roles[p]!, value = k[c]! * poisson[c]!(random) + readStd[c]! * normal();\n patch[p] = value < 1 ? value : 1;\n }\n ahdDifference(phase, correction);\n for (let comp = 0; comp < 3; comp++) sum[comp] = sum[comp]! + correction[comp]! / draws;\n }\n if (states.index.size >= AHD_STATE_LIMIT) states.index.clear();\n const n = states.index.size;\n if (states.values.length < 3 * (n + 1)) { const grown = new Float64Array(2 * states.values.length); grown.set(states.values); states.values = grown; }\n states.values.set(sum, 3 * n);\n states.index.set(key, n);\n return 3 * n;\n }\n const interpolated = new Float64Array(3);\n const gridBase = new Float64Array(3), gridFrac = new Float64Array(3);\n function flatCorrection(m0: number, m1: number, m2: number): Float64Array {\n for (let i = 0; i < 3; i++) {\n const m = i === 0 ? m0 : i === 1 ? m1 : m2, g = (portableLog2(Math.min(1, Math.max(AHD_KEY_FLOOR, m))) + AHD_KEY_OCTAVES) * AHD_KEY_STEPS;\n const base = Math.min(Math.floor(g), AHD_KEY_OCTAVES * AHD_KEY_STEPS - 1);\n gridBase[i] = base; gridFrac[i] = g - base;\n }\n interpolated.fill(0);\n for (let corner = 0; corner < 8; corner++) {\n let weight = 1;\n for (let i = 0; i < 3; i++) weight *= (corner >> i) & 1 ? gridFrac[i]! : 1 - gridFrac[i]!;\n if (weight === 0) continue;\n const at = gridCorrection(gridBase[0]! + (corner & 1), gridBase[1]! + ((corner >> 1) & 1), gridBase[2]! + ((corner >> 2) & 1)), value = states.values;\n for (let comp = 0; comp < 3; comp++) interpolated[comp] = interpolated[comp]! + weight * value[at + comp]!;\n }\n return interpolated;\n }\n const lab = ahdCorrection?.labMatrix ?? [[1, 0, 0], [0, 1, 0], [0, 0, 1]], labWhite = lab.map((row) => row[0]! + row[1]! + row[2]!);\n const l00 = lab[0]![0]!, l01 = lab[0]![1]!, l02 = lab[0]![2]!, l10 = lab[1]![0]!, l11 = lab[1]![1]!, l12 = lab[1]![2]!, l20 = lab[2]![0]!, l21 = lab[2]![1]!, l22 = lab[2]![2]!;\n const lw0 = labWhite[0]!, lw1 = labWhite[1]!, lw2 = labWhite[2]!;\n const gh = new Float64Array(49), gv = new Float64Array(49), cand = [new Float64Array(75), new Float64Array(75)], labs = [new Float64Array(75), new Float64Array(75)];\n const rgb = new Float64Array(3), rendered = new Float64Array(3), linear = new Float64Array(3);\n /** Develops one deterministic camera pixel and renders it: WB, highlight clip, colour matrix, tone curve, clip to [0, 1]. */\n function renderPixel(r: number, gr: number, b: number, out: Float64Array): void {\n const u0 = Math.min(L, g0 * r), u1 = Math.min(L, g1 * gr), u2 = Math.min(L, g2 * b);\n for (let comp = 0; comp < 3; comp++) {\n let v = comp === 0 ? m00 * u0 + m01 * u1 + m02 * u2 : comp === 1 ? m10 * u0 + m11 * u1 + m12 * u2 : m20 * u0 + m21 * u1 + m22 * u2;\n if (reinhard) v = v > 0 ? v / (1 + v) : v;\n out[comp] = v < 0 ? 0 : v > 1 ? 1 : v;\n }\n }\n /**\n * h(AHD) − ½(h(H) + h(V)) at the centre of the drawn neighbourhood (createAhdDemosaicTask's steps, centre pixel only). The\n * patch and the greens are read by flat index (patch (dy + 5)·11 + dx + 5, greens (dy + 3)·7 + dx + 3); every value is formed\n * with the same operations in the same order as the steps themselves, except that CIELAB's cube root is `portableCbrt`\n * (within 1 ulp of Math.cbrt) and squares are products, so the result has the same bits in every JavaScript engine.\n */\n function ahdDifference(phase: number, out: Float64Array): void {\n const roles = AHD_ROLES[phase]!;\n // 1. Directional greens within 3 sites.\n for (let dy = -3; dy <= 3; dy++) for (let dx = -3; dx <= 3; dx++) {\n const i = (dy + 3) * 7 + dx + 3, p = (dy + AHD_REACH) * AHD_SIDE + dx + AHD_REACH, c = patch[p]!;\n if (roles[p] === 1) { gh[i] = c; gv[i] = c; continue; }\n gh[i] = (patch[p - 1]! + patch[p + 1]!) / 2 + (2 * c - patch[p - 2]! - patch[p + 2]!) / 4;\n gv[i] = (patch[p - AHD_SIDE]! + patch[p + AHD_SIDE]!) / 2 + (2 * c - patch[p - 2 * AHD_SIDE]! - patch[p + 2 * AHD_SIDE]!) / 4;\n }\n // 2. Candidates within 2 sites; 3. their CIELAB. The four corners (±2, ±2) are not read by step 4 and are skipped.\n for (let d = 0; d < 2; d++) {\n const g = d === 0 ? gh : gv, o = cand[d]!, ol = labs[d]!;\n for (let dy = -2; dy <= 2; dy++) for (let dx = -2; dx <= 2; dx++) {\n if ((dx === -2 || dx === 2) && (dy === -2 || dy === 2)) continue;\n const i = (dy + 2) * 5 + dx + 2, p = (dy + AHD_REACH) * AHD_SIDE + dx + AHD_REACH, q = (dy + 3) * 7 + dx + 3, own = roles[p]!, gc = g[q]!;\n o[3 * i + 1] = gc;\n if (own === 1) {\n const hRole = roles[p + 1]!, vRole = 2 - hRole;\n o[3 * i + hRole] = gc + ((patch[p - 1]! - g[q - 1]!) + (patch[p + 1]! - g[q + 1]!)) / 2;\n o[3 * i + vRole] = gc + ((patch[p - AHD_SIDE]! - g[q - 7]!) + (patch[p + AHD_SIDE]! - g[q + 7]!)) / 2;\n } else {\n o[3 * i + own] = patch[p]!;\n o[3 * i + 2 - own] = gc + ((patch[p - AHD_SIDE - 1]! - g[q - 8]!) + (patch[p - AHD_SIDE + 1]! - g[q - 6]!) + (patch[p + AHD_SIDE - 1]! - g[q + 6]!) +\n (patch[p + AHD_SIDE + 1]! - g[q + 8]!)) / 4;\n }\n const R = o[3 * i]!, G = o[3 * i + 1]!, Bc = o[3 * i + 2]!;\n let tx = (l00 * R + l01 * G + l02 * Bc) / lw0, ty = (l10 * R + l11 * G + l12 * Bc) / lw1, tz = (l20 * R + l21 * G + l22 * Bc) / lw2;\n tx = tx > LAB_EPSILON ? portableCbrt(tx) : (LAB_KAPPA * tx + 16) / 116;\n ty = ty > LAB_EPSILON ? portableCbrt(ty) : (LAB_KAPPA * ty + 16) / 116;\n tz = tz > LAB_EPSILON ? portableCbrt(tz) : (LAB_KAPPA * tz + 16) / 116;\n ol[3 * i] = 116 * ty - 16; ol[3 * i + 1] = 500 * (tx - ty); ol[3 * i + 2] = 200 * (ty - tz);\n }\n }\n // 4. Homogeneity within 1 site, with the adaptive tolerances (neighbours left, right, up, down); 5. the 3 × 3 sum selects\n // the candidate.\n const h = labs[0]!, v = labs[1]!;\n let sh = 0, sv = 0;\n for (let dy = -1; dy <= 1; dy++) for (let dx = -1; dx <= 1; dx++) {\n const i = 3 * ((dy + 2) * 5 + dx + 2), j0 = i - 3, j1 = i + 3, j2 = i - 15, j3 = i + 15;\n const hL0 = Math.abs(h[i]! - h[j0]!), hL1 = Math.abs(h[i]! - h[j1]!), hL2 = Math.abs(h[i]! - h[j2]!), hL3 = Math.abs(h[i]! - h[j3]!);\n const vL0 = Math.abs(v[i]! - v[j0]!), vL1 = Math.abs(v[i]! - v[j1]!), vL2 = Math.abs(v[i]! - v[j2]!), vL3 = Math.abs(v[i]! - v[j3]!);\n const hC0 = square(h[i + 1]! - h[j0 + 1]!) + square(h[i + 2]! - h[j0 + 2]!), hC1 = square(h[i + 1]! - h[j1 + 1]!) + square(h[i + 2]! - h[j1 + 2]!);\n const hC2 = square(h[i + 1]! - h[j2 + 1]!) + square(h[i + 2]! - h[j2 + 2]!), hC3 = square(h[i + 1]! - h[j3 + 1]!) + square(h[i + 2]! - h[j3 + 2]!);\n const vC0 = square(v[i + 1]! - v[j0 + 1]!) + square(v[i + 2]! - v[j0 + 2]!), vC1 = square(v[i + 1]! - v[j1 + 1]!) + square(v[i + 2]! - v[j1 + 2]!);\n const vC2 = square(v[i + 1]! - v[j2 + 1]!) + square(v[i + 2]! - v[j2 + 2]!), vC3 = square(v[i + 1]! - v[j3 + 1]!) + square(v[i + 2]! - v[j3 + 2]!);\n const epsL = Math.min(Math.max(hL0, hL1), Math.max(vL2, vL3)), epsC = Math.min(Math.max(hC0, hC1), Math.max(vC2, vC3));\n sh += (hL0 <= epsL && hC0 <= epsC ? 1 : 0) + (hL1 <= epsL && hC1 <= epsC ? 1 : 0) + (hL2 <= epsL && hC2 <= epsC ? 1 : 0) + (hL3 <= epsL && hC3 <= epsC ? 1 : 0);\n sv += (vL0 <= epsL && vC0 <= epsC ? 1 : 0) + (vL1 <= epsL && vC1 <= epsC ? 1 : 0) + (vL2 <= epsL && vC2 <= epsC ? 1 : 0) + (vL3 <= epsL && vC3 <= epsC ? 1 : 0);\n }\n const centre = 12, a = cand[0]!, b = cand[1]!;\n for (let c = 0; c < 3; c++) rgb[c] = sh > sv ? a[3 * centre + c]! : sv > sh ? b[3 * centre + c]! : (a[3 * centre + c]! + b[3 * centre + c]!) / 2;\n renderPixel(rgb[0]!, rgb[1]!, rgb[2]!, rendered);\n renderPixel(a[3 * centre]!, a[3 * centre + 1]!, a[3 * centre + 2]!, linear);\n for (let c = 0; c < 3; c++) out[c] = rendered[c]! - linear[c]! / 2;\n renderPixel(b[3 * centre]!, b[3 * centre + 1]!, b[3 * centre + 2]!, linear);\n for (let c = 0; c < 3; c++) out[c] = out[c]! - linear[c]! / 2;\n }\n /** Normalized site value of a slot: normal with mean k·e and variance k²·e + constant, clipped at the white level (1). */\n function siteStatistics(slot: number, c: number, e: number): void {\n const kc = k[c]!, mean = kc * e, variance = kc * kc * e + c0[c]!, gap = 1 - mean;\n // Third cumulant of the normalized value: Poisson electrons have κ₃ = e (read and rounding noise add none).\n siteThird[slot] = kc * kc * kc * e;\n if (gap > 0 && gap * gap > reach2 * variance) { siteMean[slot] = mean; siteVar[slot] = variance; }\n else { upperClip(mean, variance, 1, clip); siteMean[slot] = clip[0]!; siteVar[slot] = clip[1]!; }\n }\n let siteCount = 0, sampleCount = 0, detail = 0, uniform = 0, lastYield = Date.now();\n /** Recorded terms of samples whose sites all read one chart material, by material·4 + CFA phase (layout: MEMO_SIZE). */\n const sampleMemo = new Map<number, Float64Array>();\n // Pilot: the scene at a deterministic grid over each display pixel's footprint widened by the reach; a pixel is uniform when\n // every point returns the same value. Pixels next to a detailed pixel count as detailed too, so an edge that only clips a\n // footprint's corner (too thin for the grid) still gets the full samples. The grid is fixed, so the sample count is not\n // random and the estimate stays unbiased either way.\n const pilotUniform = (vx: number, vy: number): boolean => {\n const ax0 = vx * sx + margin - reachSites, ax1 = (vx + 1) * sx + margin + reachSites, ay0 = vy * sy + margin - reachSites, ay1 = (vy + 1) * sy + margin + reachSites;\n const px = pilotCount(ax1 - ax0), py = pilotCount(ay1 - ay0);\n let first = NaN;\n for (let j = 0; j < py; j++) {\n const v = -(ay0 + (j + 0.5) * (ay1 - ay0) / py - nativeHeight / 2) * g;\n for (let i = 0; i < px; i++) {\n const value = setup.signal.pilot((ax0 + (i + 0.5) * (ax1 - ax0) / px - nativeWidth / 2) * g, v);\n if (i === 0 && j === 0) first = value; else if (value !== first) return false;\n }\n }\n return true;\n };\n // Pilot flags for the region and a one-pixel ring (clipped to the view), three rows at a time.\n const ringWidth = region.width + 2, flagRows: Uint8Array[] = [];\n const pilotRow = (vy: number): Uint8Array => {\n const row = new Uint8Array(ringWidth);\n if (vy < 0 || vy >= viewHeight) return row.fill(1);\n for (let i = 0; i < ringWidth; i++) { const vx = region.x - 1 + i; row[i] = vx < 0 || vx >= viewWidth ? 1 : pilotUniform(vx, vy) ? 1 : 0; }\n return row;\n };\n flagRows.push(pilotRow(region.y - 1), pilotRow(region.y));\n for (let ry = 0; ry < region.height; ry++) {\n const vy = region.y + ry, rows = axisSums(vy * sy, (vy + 1) * sy, frameHeight, margin);\n flagRows.push(pilotRow(vy + 1));\n if (flagRows.length > 3) flagRows.shift();\n for (let rx = 0; rx < region.width; rx++) {\n const vx = region.x + rx, index = vy * viewWidth + vx;\n footprintWeights(columns[rx]!, rows, area, B);\n let same = true;\n for (let j = 0; j < 3 && same; j++) for (let i = rx; i <= rx + 2; i++) if (flagRows[j]![i] === 0) { same = false; break; }\n const K = same ? uniformK : fullK, Q = K * K;\n if (same) uniform++; else detail++;\n setup.signal.window(Math.floor(vx * sx) + margin - windowReach, Math.floor(vy * sy) + margin - windowReach, Math.ceil((vx + 1) * sx) + margin + windowReach,\n Math.ceil((vy + 1) * sy) + margin + windowReach);\n const jitter = createDeterministicUniformStream(deriveNativeSiteStreamSeedUint32(seed, index, DISPLAY_VIEW_JITTER_STREAM_ID)), tracking = setup.signal.tracksMaterial;\n let s0 = 0, s1 = 0, s2 = 0, c00 = 0, c01 = 0, c02 = 0, c11 = 0, c12 = 0, c22 = 0, r0 = 0, r1 = 0, r2 = 0, pixelVariance = 0, corrected = false;\n for (let b = 0; b < K; b++) for (let a = 0; a < K; a++) {\n const fx = (vx + (a + jitter.next()) / K) * sx, fy = (vy + (b + jitter.next()) / K) * sy;\n const x = Math.min(frameWidth - 1, Math.floor(fx)) + margin, y = Math.min(frameHeight - 1, Math.floor(fy)) + margin;\n const phase = (y & 1) * 2 + (x & 1), list = phaseList[phase]!;\n let material = -2;\n // The expected electrons of the sites the demosaic reads (sites outside the raster, at mirror borders, are read\n // reflect-101); where the signal tracks it, whether they all read one chart material, with the statistics below only\n // when the sample is not replayed; otherwise the statistics at once.\n for (let li = 0; li < list.length; li++) {\n const slot = list[li]!;\n siteCount++;\n let sxs = x + (slot % side) - reach, sys = y + ((slot / side) | 0) - reach;\n if (sxs < 0) sxs = -sxs; else if (sxs >= nativeWidth) sxs = 2 * nativeWidth - 2 - sxs;\n if (sys < 0) sys = -sys; else if (sys >= nativeHeight) sys = 2 * nativeHeight - 2 - sys;\n const c = (sys & 1) === 0 ? ((sxs & 1) === 0 ? 0 : 1) : ((sxs & 1) === 0 ? 1 : 2);\n const e = setup.signal.site(sxs, sys) + dark[c]!;\n siteChannel[slot] = c;\n if (tracking) { siteElectrons[slot] = e; const own = setup.signal.uniformMaterial; material = material === -2 || material === own ? own : -1; continue; }\n // As siteStatistics, written out here for the untracked (Speed) path.\n const kc = k[c]!, mean = kc * e, variance = kc * kc * e + c0[c]!, gap = 1 - mean;\n siteThird[slot] = kc * kc * kc * e;\n if (gap > 0 && gap * gap > reach2 * variance) { siteMean[slot] = mean; siteVar[slot] = variance; }\n else { upperClip(mean, variance, 1, clip); siteMean[slot] = clip[0]!; siteVar[slot] = clip[1]!; }\n }\n if (!tracking) material = -1;\n // A sample whose sites all read one chart material only has the statistics of every other such sample of that material\n // and CFA phase: replay its recorded terms (the same values added to the same sums in the same order).\n const memoKey = material >= 0 ? material * 4 + phase : -1, memo = memoKey >= 0 ? sampleMemo.get(memoKey) : undefined;\n const cs = candidateSlots[phase]!, cw = candidateWeights[phase]!, count = cs.length, share = 1 / count;\n if (memo) {\n for (let d = 0; d < count; d++) {\n for (let c = 0; c < 3; c++) {\n const o = 3 + (d * 3 + c) * 3, a0 = memo[o]!, a1 = memo[o + 1]!, a2 = memo[o + 2]!, wgt = share * B[c]! * memo[c]!;\n c00 += wgt * a0 * a0; c01 += wgt * a0 * a1; c02 += wgt * a0 * a2; c11 += wgt * a1 * a1; c12 += wgt * a1 * a2; c22 += wgt * a2 * a2;\n }\n r0 += memo[21 + d * 3]!; r1 += memo[22 + d * 3]!; r2 += memo[23 + d * 3]!;\n }\n s0 += memo[27]!; s1 += memo[28]!; s2 += memo[29]!;\n if (count === 2) { r0 += memo[30]!; r1 += memo[31]!; r2 += memo[32]!; }\n if (memo[33] === 1) { s0 += memo[34]!; s1 += memo[35]!; s2 += memo[36]!; corrected = true; }\n continue;\n }\n const record = memoKey >= 0 ? new Float64Array(MEMO_SIZE) : undefined;\n if (tracking) for (let li = 0; li < list.length; li++) { const slot = list[li]!; siteStatistics(slot, siteChannel[slot]!, siteElectrons[slot]!); }\n // Site variance of each channel through the bilinear kernels (for B_c), then the demosaic's own pixel statistics: the\n // mean and covariance of its camera channels, averaged over its candidates (AHD picks one per pixel).\n const slots = phaseSlots[phase]!, weights = phaseWeights[phase]!, w2 = phaseW2[phase]!;\n for (let c = 0; c < 3; c++) {\n const sl = slots[c]!, wt = weights[c]!;\n let variance = 0;\n for (let t = 0; t < sl.length; t++) variance += wt[t]! * wt[t]! * siteVar[sl[t]!]!;\n csv[c] = variance / w2[c]!;\n }\n // Each candidate of the demosaic (one for bilinear; AHD's horizontal and vertical ones, of which AHD picks one per pixel)\n // is propagated on its own: camera-channel mean and covariance, white balance and highlight clip, colour matrix and\n // rendering; the pixel's statistics are their average.\n let e0 = 0, e1 = 0, e2 = 0;\n for (let d = 0; d < count; d++) {\n for (let c = 0; c < 3; c++) {\n const sl = cs[d]![c]!, wt = cw[d]![c]!;\n let mean = 0;\n for (let t = 0; t < sl.length; t++) mean += wt[t]! * siteMean[sl[t]!]!;\n cm[c] = mean;\n cmAverage[c] = (d === 0 ? 0 : cmAverage[c]!) + mean * share;\n }\n // Covariance of channels i, j: Σ over the sites of w_i·w_j·Var(site), with the kernels as dense weights over the window.\n const dense = candidateDense[phase]![d]!, list = candidateList[phase]![d]!;\n let v00 = 0, v01 = 0, v02 = 0, v11 = 0, v12 = 0, v22 = 0;\n for (let li = 0; li < list.length; li++) {\n const slot = list[li]!, v = siteVar[slot]!, w0 = dense[slot]!, w1 = dense[slotsCount + slot]!, w2 = dense[2 * slotsCount + slot]!;\n v00 += w0 * w0 * v; v01 += w0 * w1 * v; v02 += w0 * w2 * v; v11 += w1 * w1 * v; v12 += w1 * w2 * v; v22 += w2 * w2 * v;\n }\n C[0] = v00; C[1] = v01; C[2] = v02; C[3] = v01; C[4] = v11; C[5] = v12; C[6] = v02; C[7] = v12; C[8] = v22;\n // White balance and the highlight clip at the smallest gain (per channel; covariances scaled by the expected slopes).\n for (let c = 0; c < 3; c++) {\n const mean = cm[c]!, variance = C[c * 4]!;\n cv[c] = variance;\n const gc = c === 0 ? g0 : c === 1 ? g1 : g2, um = gc * mean, uv = gc * gc * variance, gap = L - um;\n if (gap > 0 && gap * gap > reach2 * uv) { bm[c] = um; bv[c] = uv; bs[c] = gc; }\n else { upperClip(um, uv, L, clip); bm[c] = clip[0]!; bv[c] = clip[1]!; bs[c] = gc * clip[2]!; }\n }\n // Colour matrix, then the rendering of each component (tone curve, clip to [0, 1]).\n for (let comp = 0; comp < 3; comp++) {\n const r0m = comp === 0 ? m00 : comp === 1 ? m10 : m20, r1m = comp === 0 ? m01 : comp === 1 ? m11 : m21, r2m = comp === 0 ? m02 : comp === 1 ? m12 : m22;\n const mean = r0m * bm[0]! + r1m * bm[1]! + r2m * bm[2]!;\n const variance = r0m * r0m * bv[0]! + r1m * r1m * bv[1]! + r2m * r2m * bv[2]! +\n 2 * (r0m * r1m * bs[0]! * bs[1]! * C[1]! + r0m * r2m * bs[0]! * bs[2]! * C[2]! + r1m * r2m * bs[1]! * bs[2]! * C[5]!);\n if (!reinhard && mean > 0 && mean < 1 && mean * mean > reach2 * variance && (1 - mean) * (1 - mean) > reach2 * variance) { hm[comp] = mean; hv[comp] = variance; hs[comp] = 1; }\n else if (reinhard) { reinhardMoments(mean, variance, clip); hm[comp] = clip[0]!; hv[comp] = clip[1]!; hs[comp] = clip[2]!; }\n else {\n // The component is a linear combination of the sites: κ₃ = Σ (Σ_c M·Γ_c·w_c,site)³·κ₃(site).\n const dense = candidateDense[phase]![d]!, list = candidateList[phase]![d]!;\n let third = 0;\n for (let li = 0; li < list.length; li++) {\n const slot = list[li]!, coefficient = r0m * bs[0]! * dense[slot]! + r1m * bs[1]! * dense[slotsCount + slot]! + r2m * bs[2]! * dense[2 * slotsCount + slot]!;\n third += coefficient * coefficient * coefficient * siteThird[slot]!;\n }\n unitClip(mean, variance, clip, variance > 0 ? third / (variance * Math.sqrt(variance)) : 0);\n hm[comp] = clip[0]!; hv[comp] = clip[1]!; hs[comp] = clip[2]!;\n }\n }\n e0 += share * hm[0]!; e1 += share * hm[1]!; e2 += share * hm[2]!;\n // Linear (Stein) part: a_c = J ∘ M[:, c]·Γ_c, accumulated with B_c·σ_c² (site variance of channel c); the pixel's own\n // linear variance (aᵀ·C·a, full channel covariance) for the residual.\n let l0 = 0, l1 = 0, l2 = 0;\n for (let c = 0; c < 3; c++) {\n const a0 = hs[0]! * (c === 0 ? m00 : c === 1 ? m01 : m02) * bs[c]!, a1 = hs[1]! * (c === 0 ? m10 : c === 1 ? m11 : m12) * bs[c]!, a2 = hs[2]! * (c === 0 ? m20 : c === 1 ? m21 : m22) * bs[c]!;\n const wgt = share * B[c]! * csv[c]!;\n c00 += wgt * a0 * a0; c01 += wgt * a0 * a1; c02 += wgt * a0 * a2; c11 += wgt * a1 * a1; c12 += wgt * a1 * a2; c22 += wgt * a2 * a2;\n an[c] = a0; an[3 + c] = a1; an[6 + c] = a2;\n if (record) { const o = 3 + (d * 3 + c) * 3; record[o] = a0; record[o + 1] = a1; record[o + 2] = a2; }\n }\n for (let i = 0; i < 3; i++) for (let j = 0; j < 3; j++) { const cij = C[i * 3 + j]!; l0 += an[i]! * an[j]! * cij; l1 += an[3 + i]! * an[3 + j]! * cij; l2 += an[6 + i]! * an[6 + j]! * cij; }\n const t0 = share * Math.max(0, hv[0]! - l0), t1 = share * Math.max(0, hv[1]! - l1), t2 = share * Math.max(0, hv[2]! - l2);\n r0 += t0; r1 += t1; r2 += t2;\n if (record) { record[21 + d * 3] = t0; record[22 + d * 3] = t1; record[23 + d * 3] = t2; }\n pixelVariance = Math.max(pixelVariance, hv[0]!, hv[1]!, hv[2]!);\n }\n s0 += e0; s1 += e1; s2 += e2;\n if (record) { record[0] = csv[0]!; record[1] = csv[1]!; record[2] = csv[2]!; record[27] = e0; record[28] = e1; record[29] = e2; }\n if (count === 2) {\n // AHD's per-pixel choice between the candidates adds independent variance: with a noise-driven choice each pixel\n // deviates from the candidates' average by ±½(H − V), variance ¼·Var(H − V) (linear in the sites, at the last\n // candidate's slopes).\n const dh = candidateDense[phase]![0]!, dv = candidateDense[phase]![1]!, list = phaseList[phase]!;\n let x0 = 0, x1 = 0, x2 = 0;\n for (let li = 0; li < list.length; li++) {\n const slot = list[li]!, d0 = bs[0]! * (dh[slot]! - dv[slot]!), d1 = bs[1]! * (dh[slotsCount + slot]! - dv[slotsCount + slot]!), d2 = bs[2]! * (dh[2 * slotsCount + slot]! - dv[2 * slotsCount + slot]!);\n const v = siteVar[slot]!, a = hs[0]! * (m00 * d0 + m01 * d1 + m02 * d2), b = hs[1]! * (m10 * d0 + m11 * d1 + m12 * d2), c = hs[2]! * (m20 * d0 + m21 * d1 + m22 * d2);\n x0 += a * a * v; x1 += b * b * v; x2 += c * c * v;\n }\n r0 += x0 / 4; r1 += x1 / 4; r2 += x2 / 4;\n if (record) { record[30] = x0 / 4; record[31] = x1 / 4; record[32] = x2 / 4; }\n }\n // AHD at low signal: its homogeneity choice reacts to the noise, which the linear candidates cannot express. A sample\n // whose pixel noise exceeds the threshold adds the correction of a flat neighbourhood with its channel means, from the\n // shared grid of states (flatCorrection): there AHD and the two linear candidates run on the same drawn neighbourhoods\n // and the difference of the rendered results is averaged, a control variate whose expectation is the AHD bias\n // (docs/DISPLAY_VIEW.md).\n if (ahdCorrection && pixelVariance > ahdCorrection.thresholdVariance) {\n const fix = flatCorrection(cmAverage[0]!, cmAverage[1]!, cmAverage[2]!);\n s0 += fix[0]!; s1 += fix[1]!; s2 += fix[2]!; corrected = true;\n if (record) { record[33] = 1; record[34] = fix[0]!; record[35] = fix[1]!; record[36] = fix[2]!; }\n }\n if (record) sampleMemo.set(memoKey, record);\n pixelVariance = 0;\n }\n sampleCount += Q;\n if (corrected) correctedPixels++;\n const mean0 = s0 / Q, mean1 = s1 / Q, mean2 = s2 / Q, pixels = B[3]!;\n // The real pixels' output rounding (Δ²/12 in the encoded domain), mapped to linear light at the mean.\n const q0 = quantizationVariance(mean0, step), q1 = quantizationVariance(mean1, step), q2 = quantizationVariance(mean2, step);\n // Covariance in linear light: the linear part plus the independent per-pixel residuals and rounding.\n const v00 = c00 / Q + pixels * (r0 / Q + q0), v01 = c01 / Q, v02 = c02 / Q, v11 = c11 / Q + pixels * (r1 / Q + q1), v12 = c12 / Q, v22 = c22 / Q + pixels * (r2 / Q + q2);\n const noise = createDeterministicUniformStream(deriveNativeSiteStreamSeedUint32(seed, index, DISPLAY_VIEW_NOISE_STREAM_ID));\n const z0 = samplePortableStandardNormal(noise), z1 = samplePortableStandardNormal(noise), z2 = samplePortableStandardNormal(noise);\n // Cholesky factor of the 3 × 3 covariance (positive semidefinite; tiny negative pivots are treated as 0).\n const l00 = Math.sqrt(Math.max(0, v00)), l10 = l00 > 0 ? v01 / l00 : 0, l20 = l00 > 0 ? v02 / l00 : 0;\n const l11 = Math.sqrt(Math.max(0, v11 - l10 * l10)), l21 = l11 > 0 ? (v12 - l20 * l10) / l11 : 0;\n const l22 = Math.sqrt(Math.max(0, v22 - l20 * l20 - l21 * l21));\n const o = (ry * region.width + rx) * 3;\n // The drawn value is clipped to [0, 1] like any light level; where the noise reaches a bound, the normal's centre is\n // moved so that the clipped draw keeps the expected value (the mean of real pixels in [0, 1] is in [0, 1] already).\n const n0 = clipCentre(mean0, v00) + l00 * z0, n1 = clipCentre(mean1, v11) + l10 * z0 + l11 * z1, n2 = clipCentre(mean2, v22) + l20 * z0 + l21 * z1 + l22 * z2;\n samples[o] = Math.round(encodeSrgbComponentPortable(n0 < 0 ? 0 : n0 > 1 ? 1 : n0) * maximum);\n samples[o + 1] = Math.round(encodeSrgbComponentPortable(n1 < 0 ? 0 : n1 > 1 ? 1 : n1) * maximum);\n samples[o + 2] = Math.round(encodeSrgbComponentPortable(n2 < 0 ? 0 : n2 > 1 ? 1 : n2) * maximum);\n expected[o] = mean0; expected[o + 1] = mean1; expected[o + 2] = mean2;\n noiseStd[o] = Math.sqrt(Math.max(0, v00)); noiseStd[o + 1] = Math.sqrt(Math.max(0, v11)); noiseStd[o + 2] = Math.sqrt(Math.max(0, v22));\n if (Date.now() - lastYield >= 8) { await setup.yieldControl(); setup.checkAbort(); lastYield = Date.now(); }\n }\n }\n return { samples, expected, noiseStd, sampleCount, siteCount, detailPixelCount: detail, uniformPixelCount: uniform, ahdCorrectedPixelCount: correctedPixels };\n}\n\n/**\n * The centre c of a normal of variance v whose clip to [0, 1] has mean `target` (bisection; c = target when the noise does\n * not reach a bound, or when the target lies outside (0, 1)).\n */\nfunction clipCentre(target: number, v: number): number {\n if (!(v > 0) || !(target > 0 && target < 1)) return target;\n const s = Math.sqrt(v);\n if (target > 4 * s && 1 - target > 4 * s) return target;\n const moments = new Float64Array(3);\n let lo = target - 10 * s, hi = target + 10 * s;\n for (let i = 0; i < 60; i++) { const mid = (lo + hi) / 2; unitClip(mid, v, moments); if (moments[0]! < target) lo = mid; else hi = mid; }\n return (lo + hi) / 2;\n}\n/** Variance in linear light of rounding an sRGB-encoded value to steps of `step`: (dEOTF/de)²·step²/12 at the encoded mean. */\nfunction quantizationVariance(linear: number, step: number): number {\n const e = encodeSrgbComponentPortable(linear < 0 ? 0 : linear > 1 ? 1 : linear), slope = e <= 0.04045 ? 1 / 12.92 : 2.4 / 1.055 * portablePow((e + 0.055) / 1.055, 1.4);\n return slope * slope * step * step / 12;\n}\n"]}
@@ -39,6 +39,13 @@ export interface ResolvedCaptureIlluminant {
39
39
  spectrum: ColorimetricSpectrum;
40
40
  }
41
41
  export declare function resolveCaptureIlluminant(value: CaptureIlluminant): ResolvedCaptureIlluminant;
42
+ /**
43
+ * Internal (not exported from the package): {@link resolveCaptureIlluminant} with the engine's own formulas (Planckian,
44
+ * CIE A, daylight locus) evaluated with the portable power and e^x − 1 (`portablePow`, `portableExpm1`), so the spectrum
45
+ * has the same bits in every JavaScript engine. The display view uses it; captures keep {@link resolveCaptureIlluminant}.
46
+ * A caller spectrum is the caller's own.
47
+ */
48
+ export declare function resolvePortableCaptureIlluminant(value: CaptureIlluminant): ResolvedCaptureIlluminant;
42
49
  /**
43
50
  * Factor k such that k·S(λ) (W·m⁻²·nm⁻¹) gives `illuminanceLux` on the plane: E_v = 683 ∫ k S ȳ dλ,
44
51
  * integrated with the 1 nm trapezoid rule over 380-780 nm (ȳ outside this range is below 4e-5 of its peak).
@@ -20,15 +20,28 @@
20
20
  import { InvalidConfigurationError } from "../core/configuration-error.js";
21
21
  import { requireInputObject } from "../core/record-validation.js";
22
22
  import { estimateCie1931ColorMatchingFunctions, prepareColorimetricSpectrum } from "../color/color-matching-functions.js";
23
- import { createCieIlluminantASpectrum, createCieDaylightSpectrum, createPlanckianSpectrum } from "../color/illuminants.js";
23
+ import { createCieIlluminantASpectrum, createCieDaylightSpectrum, createPlanckianSpectrum, createPortableCieDaylightSpectrum, createPortableCieIlluminantASpectrum, createPortablePlanckianSpectrum } from "../color/illuminants.js";
24
24
  import { resolveChartScene } from "./chart-scenes.js";
25
25
  /** CIE maximum luminous efficacy for photopic vision, lm/W. */
26
26
  export const PHOTOPIC_MAXIMUM_LUMINOUS_EFFICACY_LM_PER_W = 683;
27
27
  /** Wavelength range of every facade spectrum and of the facade sensor quadrature, nm. */
28
28
  export const FACADE_SPECTRAL_RANGE_NANOMETERS = Object.freeze({ minimum: 380, maximum: 780 });
29
29
  export function resolveCaptureIlluminant(value) {
30
+ return resolveIlluminant(value, CAPTURE_SPECTRA);
31
+ }
32
+ const CAPTURE_SPECTRA = { planckian: createPlanckianSpectrum, cieA: createCieIlluminantASpectrum, daylight: createCieDaylightSpectrum };
33
+ /**
34
+ * Internal (not exported from the package): {@link resolveCaptureIlluminant} with the engine's own formulas (Planckian,
35
+ * CIE A, daylight locus) evaluated with the portable power and e^x − 1 (`portablePow`, `portableExpm1`), so the spectrum
36
+ * has the same bits in every JavaScript engine. The display view uses it; captures keep {@link resolveCaptureIlluminant}.
37
+ * A caller spectrum is the caller's own.
38
+ */
39
+ export function resolvePortableCaptureIlluminant(value) {
40
+ return resolveIlluminant(value, { planckian: createPortablePlanckianSpectrum, cieA: createPortableCieIlluminantASpectrum, daylight: createPortableCieDaylightSpectrum });
41
+ }
42
+ function resolveIlluminant(value, spectra) {
30
43
  if (value === "cie-a")
31
- return resolveCaptureIlluminant({ kind: "cie-a" });
44
+ return resolveIlluminant({ kind: "cie-a" }, spectra);
32
45
  requireInputObject(value, "illuminant");
33
46
  const record = value;
34
47
  const allowed = { planckian: ["kind", "temperatureKelvin"], "cie-a": ["kind"],
@@ -46,18 +59,18 @@ export function resolveCaptureIlluminant(value) {
46
59
  const t = value.temperatureKelvin;
47
60
  if (typeof t !== "number" || !Number.isFinite(t) || t < 1000 || t > 25000)
48
61
  throw new InvalidConfigurationError("Planckian temperature must be 1000-25000 K.");
49
- spectrum = createPlanckianSpectrum({ temperatureKelvin: t, wavelengthRangeNanometers: { ...FACADE_SPECTRAL_RANGE_NANOMETERS } });
62
+ spectrum = spectra.planckian({ temperatureKelvin: t, wavelengthRangeNanometers: { ...FACADE_SPECTRAL_RANGE_NANOMETERS } });
50
63
  id = "planckian-" + t + "K";
51
64
  description = "Planck blackbody spectrum at " + t + " K (Planck's law).";
52
65
  break;
53
66
  }
54
67
  case "cie-a":
55
- spectrum = createCieIlluminantASpectrum();
68
+ spectrum = spectra.cieA();
56
69
  id = "cie-a";
57
70
  description = "CIE standard illuminant A from its defining formula: Planck's law with c2 = 1.435e-2 m·K and T = 2848 K, 100 at 560 nm.";
58
71
  break;
59
72
  case "daylight":
60
- spectrum = createCieDaylightSpectrum({ correlatedColorTemperatureKelvin: value.correlatedColorTemperatureKelvin, coefficientRounding: "cie-three-decimals", basis: value.basis });
73
+ spectrum = spectra.daylight({ correlatedColorTemperatureKelvin: value.correlatedColorTemperatureKelvin, coefficientRounding: "cie-three-decimals", basis: value.basis });
61
74
  id = "cie-daylight-" + value.correlatedColorTemperatureKelvin + "K";
62
75
  description = "CIE daylight from the caller's S0/S1/S2 basis (" + value.basis.datasetId + ").";
63
76
  break;