etro 0.12.1 → 0.13.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 (235) hide show
  1. package/.github/dependabot.yml +6 -0
  2. package/.github/scripts/update-changelog.js +72 -0
  3. package/.github/workflows/dependabot-changelog.yml +57 -0
  4. package/.github/workflows/nodejs.yml +2 -2
  5. package/CHANGELOG.md +29 -0
  6. package/README.md +7 -1
  7. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/base.css +224 -0
  8. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/block-navigation.js +87 -0
  9. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/favicon.png +0 -0
  10. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/index.html +176 -0
  11. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/prettify.css +1 -0
  12. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/prettify.js +2 -0
  13. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/sort-arrow-sprite.png +0 -0
  14. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/sorter.js +196 -0
  15. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/custom-array.ts.html +214 -0
  16. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/base.ts.html +433 -0
  17. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/brightness.ts.html +214 -0
  18. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/channels.ts.html +235 -0
  19. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/chroma-key.ts.html +331 -0
  20. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/contrast.ts.html +211 -0
  21. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/elliptical-mask.ts.html +310 -0
  22. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/gaussian-blur.ts.html +796 -0
  23. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/grayscale.ts.html +187 -0
  24. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/index.html +311 -0
  25. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/index.ts.html +154 -0
  26. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/pixelate.ts.html +259 -0
  27. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/shader.ts.html +1774 -0
  28. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/stack.ts.html +358 -0
  29. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/transform.ts.html +685 -0
  30. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/visual.ts.html +148 -0
  31. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/etro.ts.html +163 -0
  32. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/event.ts.html +691 -0
  33. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/index.html +176 -0
  34. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/index.ts.html +109 -0
  35. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/audio-source.ts.html +835 -0
  36. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/audio.ts.html +241 -0
  37. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/base.ts.html +772 -0
  38. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/image.ts.html +181 -0
  39. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/index.html +236 -0
  40. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/index.ts.html +124 -0
  41. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/text.ts.html +658 -0
  42. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/video.ts.html +211 -0
  43. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/visual-source.ts.html +721 -0
  44. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/visual.ts.html +760 -0
  45. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/movie/effects.ts.html +163 -0
  46. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/movie/index.html +161 -0
  47. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/movie/index.ts.html +88 -0
  48. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/movie/layers.ts.html +163 -0
  49. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/movie/movie.ts.html +2692 -0
  50. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/util.ts.html +1426 -0
  51. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/base.css +224 -0
  52. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/block-navigation.js +87 -0
  53. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/favicon.png +0 -0
  54. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/index.html +176 -0
  55. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/prettify.css +1 -0
  56. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/prettify.js +2 -0
  57. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/sort-arrow-sprite.png +0 -0
  58. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/sorter.js +196 -0
  59. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/custom-array.ts.html +214 -0
  60. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/base.ts.html +433 -0
  61. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/brightness.ts.html +214 -0
  62. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/channels.ts.html +235 -0
  63. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/chroma-key.ts.html +331 -0
  64. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/contrast.ts.html +211 -0
  65. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/elliptical-mask.ts.html +310 -0
  66. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/gaussian-blur.ts.html +796 -0
  67. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/grayscale.ts.html +187 -0
  68. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/index.html +311 -0
  69. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/index.ts.html +154 -0
  70. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/pixelate.ts.html +259 -0
  71. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/shader.ts.html +1948 -0
  72. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/stack.ts.html +358 -0
  73. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/transform.ts.html +685 -0
  74. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/visual.ts.html +148 -0
  75. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/etro.ts.html +163 -0
  76. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/event.ts.html +691 -0
  77. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/index.html +176 -0
  78. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/index.ts.html +109 -0
  79. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/audio-source.ts.html +835 -0
  80. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/audio.ts.html +241 -0
  81. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/base.ts.html +772 -0
  82. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/image.ts.html +181 -0
  83. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/index.html +236 -0
  84. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/index.ts.html +124 -0
  85. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/text.ts.html +658 -0
  86. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/video.ts.html +211 -0
  87. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/visual-source.ts.html +721 -0
  88. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/visual.ts.html +760 -0
  89. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/movie/effects.ts.html +163 -0
  90. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/movie/index.html +161 -0
  91. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/movie/index.ts.html +88 -0
  92. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/movie/layers.ts.html +163 -0
  93. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/movie/movie.ts.html +2692 -0
  94. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/util.ts.html +1426 -0
  95. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/base.css +224 -0
  96. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/block-navigation.js +87 -0
  97. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/favicon.png +0 -0
  98. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/index.html +176 -0
  99. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/prettify.css +1 -0
  100. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/prettify.js +2 -0
  101. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/sort-arrow-sprite.png +0 -0
  102. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/sorter.js +196 -0
  103. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/custom-array.ts.html +214 -0
  104. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/base.ts.html +433 -0
  105. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/brightness.ts.html +214 -0
  106. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/channels.ts.html +235 -0
  107. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/chroma-key.ts.html +331 -0
  108. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/contrast.ts.html +211 -0
  109. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/elliptical-mask.ts.html +310 -0
  110. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/gaussian-blur.ts.html +790 -0
  111. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/grayscale.ts.html +187 -0
  112. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/index.html +311 -0
  113. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/index.ts.html +154 -0
  114. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/pixelate.ts.html +259 -0
  115. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/shader.ts.html +1948 -0
  116. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/stack.ts.html +358 -0
  117. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/transform.ts.html +685 -0
  118. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/visual.ts.html +148 -0
  119. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/etro.ts.html +163 -0
  120. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/event.ts.html +691 -0
  121. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/index.html +176 -0
  122. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/index.ts.html +109 -0
  123. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/audio-source.ts.html +835 -0
  124. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/audio.ts.html +241 -0
  125. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/base.ts.html +772 -0
  126. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/image.ts.html +181 -0
  127. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/index.html +236 -0
  128. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/index.ts.html +124 -0
  129. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/text.ts.html +658 -0
  130. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/video.ts.html +211 -0
  131. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/visual-source.ts.html +721 -0
  132. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/visual.ts.html +760 -0
  133. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/movie/effects.ts.html +163 -0
  134. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/movie/index.html +161 -0
  135. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/movie/index.ts.html +88 -0
  136. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/movie/layers.ts.html +163 -0
  137. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/movie/movie.ts.html +2692 -0
  138. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/util.ts.html +1426 -0
  139. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/base.css +224 -0
  140. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/block-navigation.js +87 -0
  141. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/favicon.png +0 -0
  142. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/index.html +176 -0
  143. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/prettify.css +1 -0
  144. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/prettify.js +2 -0
  145. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/sort-arrow-sprite.png +0 -0
  146. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/sorter.js +196 -0
  147. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/custom-array.ts.html +214 -0
  148. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/base.ts.html +433 -0
  149. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/brightness.ts.html +214 -0
  150. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/channels.ts.html +235 -0
  151. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/chroma-key.ts.html +331 -0
  152. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/contrast.ts.html +211 -0
  153. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/elliptical-mask.ts.html +310 -0
  154. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/gaussian-blur.ts.html +796 -0
  155. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/grayscale.ts.html +187 -0
  156. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/index.html +311 -0
  157. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/index.ts.html +154 -0
  158. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/pixelate.ts.html +259 -0
  159. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/shader.ts.html +1774 -0
  160. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/stack.ts.html +358 -0
  161. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/transform.ts.html +685 -0
  162. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/visual.ts.html +148 -0
  163. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/etro.ts.html +163 -0
  164. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/event.ts.html +691 -0
  165. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/index.html +176 -0
  166. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/index.ts.html +109 -0
  167. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/audio-source.ts.html +835 -0
  168. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/audio.ts.html +241 -0
  169. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/base.ts.html +772 -0
  170. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/image.ts.html +181 -0
  171. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/index.html +236 -0
  172. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/index.ts.html +124 -0
  173. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/text.ts.html +658 -0
  174. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/video.ts.html +211 -0
  175. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/visual-source.ts.html +721 -0
  176. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/visual.ts.html +760 -0
  177. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/movie/effects.ts.html +163 -0
  178. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/movie/index.html +161 -0
  179. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/movie/index.ts.html +88 -0
  180. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/movie/layers.ts.html +163 -0
  181. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/movie/movie.ts.html +2698 -0
  182. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/util.ts.html +1453 -0
  183. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/base.css +224 -0
  184. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/block-navigation.js +87 -0
  185. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/favicon.png +0 -0
  186. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/index.html +161 -0
  187. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/prettify.css +1 -0
  188. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/prettify.js +2 -0
  189. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/sort-arrow-sprite.png +0 -0
  190. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/sorter.js +196 -0
  191. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/custom-array.ts.html +214 -0
  192. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/base.ts.html +433 -0
  193. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/brightness.ts.html +214 -0
  194. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/channels.ts.html +235 -0
  195. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/chroma-key.ts.html +331 -0
  196. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/contrast.ts.html +211 -0
  197. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/elliptical-mask.ts.html +310 -0
  198. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/gaussian-blur.ts.html +796 -0
  199. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/grayscale.ts.html +187 -0
  200. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/index.html +311 -0
  201. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/index.ts.html +154 -0
  202. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/pixelate.ts.html +259 -0
  203. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/shader.ts.html +1774 -0
  204. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/stack.ts.html +358 -0
  205. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/transform.ts.html +685 -0
  206. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/visual.ts.html +148 -0
  207. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/etro.ts.html +163 -0
  208. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/event.ts.html +691 -0
  209. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/index.html +176 -0
  210. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/index.ts.html +109 -0
  211. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/audio-source.ts.html +835 -0
  212. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/audio.ts.html +241 -0
  213. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/base.ts.html +772 -0
  214. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/image.ts.html +181 -0
  215. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/index.html +236 -0
  216. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/index.ts.html +124 -0
  217. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/text.ts.html +658 -0
  218. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/video.ts.html +211 -0
  219. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/visual-source.ts.html +721 -0
  220. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/visual.ts.html +760 -0
  221. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/movie/effects.ts.html +163 -0
  222. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/movie/index.html +161 -0
  223. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/movie/index.ts.html +88 -0
  224. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/movie/layers.ts.html +163 -0
  225. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/movie/movie.ts.html +2698 -0
  226. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/util.ts.html +1453 -0
  227. package/dist/etro-cjs.js +78 -63
  228. package/dist/etro-iife.js +79 -64
  229. package/dist/movie/movie.d.ts +4 -3
  230. package/dist/util.d.ts +3 -1
  231. package/karma.conf.js +9 -0
  232. package/package.json +4 -5
  233. package/src/effect/shader.ts +1 -1
  234. package/src/movie/movie.ts +7 -5
  235. package/src/util.ts +12 -3
@@ -0,0 +1,1948 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/effect/shader.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">src/effect</a> shader.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">87.44% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>188/215</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">61.29% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>57/93</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">95.23% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>20/21</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">87.67% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>185/211</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input oninput="onInput()" type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a>
640
+ <a name='L575'></a><a href='#L575'>575</a>
641
+ <a name='L576'></a><a href='#L576'>576</a>
642
+ <a name='L577'></a><a href='#L577'>577</a>
643
+ <a name='L578'></a><a href='#L578'>578</a>
644
+ <a name='L579'></a><a href='#L579'>579</a>
645
+ <a name='L580'></a><a href='#L580'>580</a>
646
+ <a name='L581'></a><a href='#L581'>581</a>
647
+ <a name='L582'></a><a href='#L582'>582</a>
648
+ <a name='L583'></a><a href='#L583'>583</a>
649
+ <a name='L584'></a><a href='#L584'>584</a>
650
+ <a name='L585'></a><a href='#L585'>585</a>
651
+ <a name='L586'></a><a href='#L586'>586</a>
652
+ <a name='L587'></a><a href='#L587'>587</a>
653
+ <a name='L588'></a><a href='#L588'>588</a>
654
+ <a name='L589'></a><a href='#L589'>589</a>
655
+ <a name='L590'></a><a href='#L590'>590</a>
656
+ <a name='L591'></a><a href='#L591'>591</a>
657
+ <a name='L592'></a><a href='#L592'>592</a>
658
+ <a name='L593'></a><a href='#L593'>593</a>
659
+ <a name='L594'></a><a href='#L594'>594</a>
660
+ <a name='L595'></a><a href='#L595'>595</a>
661
+ <a name='L596'></a><a href='#L596'>596</a>
662
+ <a name='L597'></a><a href='#L597'>597</a>
663
+ <a name='L598'></a><a href='#L598'>598</a>
664
+ <a name='L599'></a><a href='#L599'>599</a>
665
+ <a name='L600'></a><a href='#L600'>600</a>
666
+ <a name='L601'></a><a href='#L601'>601</a>
667
+ <a name='L602'></a><a href='#L602'>602</a>
668
+ <a name='L603'></a><a href='#L603'>603</a>
669
+ <a name='L604'></a><a href='#L604'>604</a>
670
+ <a name='L605'></a><a href='#L605'>605</a>
671
+ <a name='L606'></a><a href='#L606'>606</a>
672
+ <a name='L607'></a><a href='#L607'>607</a>
673
+ <a name='L608'></a><a href='#L608'>608</a>
674
+ <a name='L609'></a><a href='#L609'>609</a>
675
+ <a name='L610'></a><a href='#L610'>610</a>
676
+ <a name='L611'></a><a href='#L611'>611</a>
677
+ <a name='L612'></a><a href='#L612'>612</a>
678
+ <a name='L613'></a><a href='#L613'>613</a>
679
+ <a name='L614'></a><a href='#L614'>614</a>
680
+ <a name='L615'></a><a href='#L615'>615</a>
681
+ <a name='L616'></a><a href='#L616'>616</a>
682
+ <a name='L617'></a><a href='#L617'>617</a>
683
+ <a name='L618'></a><a href='#L618'>618</a>
684
+ <a name='L619'></a><a href='#L619'>619</a>
685
+ <a name='L620'></a><a href='#L620'>620</a>
686
+ <a name='L621'></a><a href='#L621'>621</a>
687
+ <a name='L622'></a><a href='#L622'>622</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
688
+ <span class="cline-any cline-neutral">&nbsp;</span>
689
+ <span class="cline-any cline-yes">1x</span>
690
+ <span class="cline-any cline-yes">1x</span>
691
+ <span class="cline-any cline-neutral">&nbsp;</span>
692
+ <span class="cline-any cline-neutral">&nbsp;</span>
693
+ <span class="cline-any cline-neutral">&nbsp;</span>
694
+ <span class="cline-any cline-neutral">&nbsp;</span>
695
+ <span class="cline-any cline-neutral">&nbsp;</span>
696
+ <span class="cline-any cline-neutral">&nbsp;</span>
697
+ <span class="cline-any cline-neutral">&nbsp;</span>
698
+ <span class="cline-any cline-neutral">&nbsp;</span>
699
+ <span class="cline-any cline-neutral">&nbsp;</span>
700
+ <span class="cline-any cline-neutral">&nbsp;</span>
701
+ <span class="cline-any cline-neutral">&nbsp;</span>
702
+ <span class="cline-any cline-neutral">&nbsp;</span>
703
+ <span class="cline-any cline-neutral">&nbsp;</span>
704
+ <span class="cline-any cline-neutral">&nbsp;</span>
705
+ <span class="cline-any cline-neutral">&nbsp;</span>
706
+ <span class="cline-any cline-neutral">&nbsp;</span>
707
+ <span class="cline-any cline-neutral">&nbsp;</span>
708
+ <span class="cline-any cline-neutral">&nbsp;</span>
709
+ <span class="cline-any cline-neutral">&nbsp;</span>
710
+ <span class="cline-any cline-neutral">&nbsp;</span>
711
+ <span class="cline-any cline-neutral">&nbsp;</span>
712
+ <span class="cline-any cline-neutral">&nbsp;</span>
713
+ <span class="cline-any cline-neutral">&nbsp;</span>
714
+ <span class="cline-any cline-neutral">&nbsp;</span>
715
+ <span class="cline-any cline-neutral">&nbsp;</span>
716
+ <span class="cline-any cline-neutral">&nbsp;</span>
717
+ <span class="cline-any cline-neutral">&nbsp;</span>
718
+ <span class="cline-any cline-neutral">&nbsp;</span>
719
+ <span class="cline-any cline-neutral">&nbsp;</span>
720
+ <span class="cline-any cline-neutral">&nbsp;</span>
721
+ <span class="cline-any cline-neutral">&nbsp;</span>
722
+ <span class="cline-any cline-neutral">&nbsp;</span>
723
+ <span class="cline-any cline-neutral">&nbsp;</span>
724
+ <span class="cline-any cline-yes">1x</span>
725
+ <span class="cline-any cline-neutral">&nbsp;</span>
726
+ <span class="cline-any cline-neutral">&nbsp;</span>
727
+ <span class="cline-any cline-neutral">&nbsp;</span>
728
+ <span class="cline-any cline-yes">1x</span>
729
+ <span class="cline-any cline-yes">1x</span>
730
+ <span class="cline-any cline-neutral">&nbsp;</span>
731
+ <span class="cline-any cline-neutral">&nbsp;</span>
732
+ <span class="cline-any cline-neutral">&nbsp;</span>
733
+ <span class="cline-any cline-neutral">&nbsp;</span>
734
+ <span class="cline-any cline-neutral">&nbsp;</span>
735
+ <span class="cline-any cline-neutral">&nbsp;</span>
736
+ <span class="cline-any cline-neutral">&nbsp;</span>
737
+ <span class="cline-any cline-neutral">&nbsp;</span>
738
+ <span class="cline-any cline-neutral">&nbsp;</span>
739
+ <span class="cline-any cline-neutral">&nbsp;</span>
740
+ <span class="cline-any cline-neutral">&nbsp;</span>
741
+ <span class="cline-any cline-neutral">&nbsp;</span>
742
+ <span class="cline-any cline-yes">1x</span>
743
+ <span class="cline-any cline-neutral">&nbsp;</span>
744
+ <span class="cline-any cline-neutral">&nbsp;</span>
745
+ <span class="cline-any cline-neutral">&nbsp;</span>
746
+ <span class="cline-any cline-neutral">&nbsp;</span>
747
+ <span class="cline-any cline-neutral">&nbsp;</span>
748
+ <span class="cline-any cline-neutral">&nbsp;</span>
749
+ <span class="cline-any cline-neutral">&nbsp;</span>
750
+ <span class="cline-any cline-neutral">&nbsp;</span>
751
+ <span class="cline-any cline-neutral">&nbsp;</span>
752
+ <span class="cline-any cline-neutral">&nbsp;</span>
753
+ <span class="cline-any cline-neutral">&nbsp;</span>
754
+ <span class="cline-any cline-neutral">&nbsp;</span>
755
+ <span class="cline-any cline-yes">1x</span>
756
+ <span class="cline-any cline-neutral">&nbsp;</span>
757
+ <span class="cline-any cline-neutral">&nbsp;</span>
758
+ <span class="cline-any cline-neutral">&nbsp;</span>
759
+ <span class="cline-any cline-neutral">&nbsp;</span>
760
+ <span class="cline-any cline-neutral">&nbsp;</span>
761
+ <span class="cline-any cline-neutral">&nbsp;</span>
762
+ <span class="cline-any cline-neutral">&nbsp;</span>
763
+ <span class="cline-any cline-neutral">&nbsp;</span>
764
+ <span class="cline-any cline-neutral">&nbsp;</span>
765
+ <span class="cline-any cline-neutral">&nbsp;</span>
766
+ <span class="cline-any cline-neutral">&nbsp;</span>
767
+ <span class="cline-any cline-neutral">&nbsp;</span>
768
+ <span class="cline-any cline-neutral">&nbsp;</span>
769
+ <span class="cline-any cline-neutral">&nbsp;</span>
770
+ <span class="cline-any cline-neutral">&nbsp;</span>
771
+ <span class="cline-any cline-neutral">&nbsp;</span>
772
+ <span class="cline-any cline-neutral">&nbsp;</span>
773
+ <span class="cline-any cline-neutral">&nbsp;</span>
774
+ <span class="cline-any cline-neutral">&nbsp;</span>
775
+ <span class="cline-any cline-neutral">&nbsp;</span>
776
+ <span class="cline-any cline-neutral">&nbsp;</span>
777
+ <span class="cline-any cline-neutral">&nbsp;</span>
778
+ <span class="cline-any cline-neutral">&nbsp;</span>
779
+ <span class="cline-any cline-neutral">&nbsp;</span>
780
+ <span class="cline-any cline-neutral">&nbsp;</span>
781
+ <span class="cline-any cline-neutral">&nbsp;</span>
782
+ <span class="cline-any cline-neutral">&nbsp;</span>
783
+ <span class="cline-any cline-neutral">&nbsp;</span>
784
+ <span class="cline-any cline-neutral">&nbsp;</span>
785
+ <span class="cline-any cline-neutral">&nbsp;</span>
786
+ <span class="cline-any cline-neutral">&nbsp;</span>
787
+ <span class="cline-any cline-neutral">&nbsp;</span>
788
+ <span class="cline-any cline-neutral">&nbsp;</span>
789
+ <span class="cline-any cline-yes">12x</span>
790
+ <span class="cline-any cline-yes">11x</span>
791
+ <span class="cline-any cline-neutral">&nbsp;</span>
792
+ <span class="cline-any cline-neutral">&nbsp;</span>
793
+ <span class="cline-any cline-yes">11x</span>
794
+ <span class="cline-any cline-yes">11x</span>
795
+ <span class="cline-any cline-yes">11x</span>
796
+ <span class="cline-any cline-yes">11x</span>
797
+ <span class="cline-any cline-neutral">&nbsp;</span>
798
+ <span class="cline-any cline-yes">11x</span>
799
+ <span class="cline-any cline-yes">11x</span>
800
+ <span class="cline-any cline-neutral">&nbsp;</span>
801
+ <span class="cline-any cline-neutral">&nbsp;</span>
802
+ <span class="cline-any cline-neutral">&nbsp;</span>
803
+ <span class="cline-any cline-neutral">&nbsp;</span>
804
+ <span class="cline-any cline-yes">11x</span>
805
+ <span class="cline-any cline-neutral">&nbsp;</span>
806
+ <span class="cline-any cline-yes">11x</span>
807
+ <span class="cline-any cline-yes">11x</span>
808
+ <span class="cline-any cline-yes">11x</span>
809
+ <span class="cline-any cline-neutral">&nbsp;</span>
810
+ <span class="cline-any cline-neutral">&nbsp;</span>
811
+ <span class="cline-any cline-yes">1x</span>
812
+ <span class="cline-any cline-yes">11x</span>
813
+ <span class="cline-any cline-yes">11x</span>
814
+ <span class="cline-any cline-yes">11x</span>
815
+ <span class="cline-any cline-yes">11x</span>
816
+ <span class="cline-any cline-no">&nbsp;</span>
817
+ <span class="cline-any cline-neutral">&nbsp;</span>
818
+ <span class="cline-any cline-neutral">&nbsp;</span>
819
+ <span class="cline-any cline-no">&nbsp;</span>
820
+ <span class="cline-any cline-neutral">&nbsp;</span>
821
+ <span class="cline-any cline-neutral">&nbsp;</span>
822
+ <span class="cline-any cline-neutral">&nbsp;</span>
823
+ <span class="cline-any cline-neutral">&nbsp;</span>
824
+ <span class="cline-any cline-yes">11x</span>
825
+ <span class="cline-any cline-yes">11x</span>
826
+ <span class="cline-any cline-neutral">&nbsp;</span>
827
+ <span class="cline-any cline-neutral">&nbsp;</span>
828
+ <span class="cline-any cline-yes">1x</span>
829
+ <span class="cline-any cline-yes">11x</span>
830
+ <span class="cline-any cline-yes">11x</span>
831
+ <span class="cline-any cline-yes">11x</span>
832
+ <span class="cline-any cline-no">&nbsp;</span>
833
+ <span class="cline-any cline-neutral">&nbsp;</span>
834
+ <span class="cline-any cline-neutral">&nbsp;</span>
835
+ <span class="cline-any cline-yes">11x</span>
836
+ <span class="cline-any cline-yes">11x</span>
837
+ <span class="cline-any cline-yes">2x</span>
838
+ <span class="cline-any cline-neutral">&nbsp;</span>
839
+ <span class="cline-any cline-yes">2x</span>
840
+ <span class="cline-any cline-neutral">&nbsp;</span>
841
+ <span class="cline-any cline-yes">2x</span>
842
+ <span class="cline-any cline-neutral">&nbsp;</span>
843
+ <span class="cline-any cline-neutral">&nbsp;</span>
844
+ <span class="cline-any cline-neutral">&nbsp;</span>
845
+ <span class="cline-any cline-neutral">&nbsp;</span>
846
+ <span class="cline-any cline-neutral">&nbsp;</span>
847
+ <span class="cline-any cline-neutral">&nbsp;</span>
848
+ <span class="cline-any cline-yes">2x</span>
849
+ <span class="cline-any cline-no">&nbsp;</span>
850
+ <span class="cline-any cline-neutral">&nbsp;</span>
851
+ <span class="cline-any cline-neutral">&nbsp;</span>
852
+ <span class="cline-any cline-neutral">&nbsp;</span>
853
+ <span class="cline-any cline-yes">2x</span>
854
+ <span class="cline-any cline-neutral">&nbsp;</span>
855
+ <span class="cline-any cline-yes">2x</span>
856
+ <span class="cline-any cline-neutral">&nbsp;</span>
857
+ <span class="cline-any cline-yes">11x</span>
858
+ <span class="cline-any cline-neutral">&nbsp;</span>
859
+ <span class="cline-any cline-neutral">&nbsp;</span>
860
+ <span class="cline-any cline-neutral">&nbsp;</span>
861
+ <span class="cline-any cline-neutral">&nbsp;</span>
862
+ <span class="cline-any cline-neutral">&nbsp;</span>
863
+ <span class="cline-any cline-yes">1x</span>
864
+ <span class="cline-any cline-yes">11x</span>
865
+ <span class="cline-any cline-yes">11x</span>
866
+ <span class="cline-any cline-neutral">&nbsp;</span>
867
+ <span class="cline-any cline-neutral">&nbsp;</span>
868
+ <span class="cline-any cline-neutral">&nbsp;</span>
869
+ <span class="cline-any cline-neutral">&nbsp;</span>
870
+ <span class="cline-any cline-neutral">&nbsp;</span>
871
+ <span class="cline-any cline-yes">1x</span>
872
+ <span class="cline-any cline-yes">11x</span>
873
+ <span class="cline-any cline-yes">11x</span>
874
+ <span class="cline-any cline-neutral">&nbsp;</span>
875
+ <span class="cline-any cline-neutral">&nbsp;</span>
876
+ <span class="cline-any cline-neutral">&nbsp;</span>
877
+ <span class="cline-any cline-neutral">&nbsp;</span>
878
+ <span class="cline-any cline-neutral">&nbsp;</span>
879
+ <span class="cline-any cline-neutral">&nbsp;</span>
880
+ <span class="cline-any cline-yes">11x</span>
881
+ <span class="cline-any cline-yes">11x</span>
882
+ <span class="cline-any cline-yes">13x</span>
883
+ <span class="cline-any cline-yes">13x</span>
884
+ <span class="cline-any cline-neutral">&nbsp;</span>
885
+ <span class="cline-any cline-yes">11x</span>
886
+ <span class="cline-any cline-neutral">&nbsp;</span>
887
+ <span class="cline-any cline-neutral">&nbsp;</span>
888
+ <span class="cline-any cline-yes">13x</span>
889
+ <span class="cline-any cline-neutral">&nbsp;</span>
890
+ <span class="cline-any cline-neutral">&nbsp;</span>
891
+ <span class="cline-any cline-yes">13x</span>
892
+ <span class="cline-any cline-neutral">&nbsp;</span>
893
+ <span class="cline-any cline-neutral">&nbsp;</span>
894
+ <span class="cline-any cline-neutral">&nbsp;</span>
895
+ <span class="cline-any cline-neutral">&nbsp;</span>
896
+ <span class="cline-any cline-neutral">&nbsp;</span>
897
+ <span class="cline-any cline-neutral">&nbsp;</span>
898
+ <span class="cline-any cline-yes">1x</span>
899
+ <span class="cline-any cline-yes">11x</span>
900
+ <span class="cline-any cline-yes">11x</span>
901
+ <span class="cline-any cline-neutral">&nbsp;</span>
902
+ <span class="cline-any cline-yes">11x</span>
903
+ <span class="cline-any cline-yes">11x</span>
904
+ <span class="cline-any cline-yes">11x</span>
905
+ <span class="cline-any cline-neutral">&nbsp;</span>
906
+ <span class="cline-any cline-yes">11x</span>
907
+ <span class="cline-any cline-neutral">&nbsp;</span>
908
+ <span class="cline-any cline-yes">11x</span>
909
+ <span class="cline-any cline-neutral">&nbsp;</span>
910
+ <span class="cline-any cline-yes">11x</span>
911
+ <span class="cline-any cline-neutral">&nbsp;</span>
912
+ <span class="cline-any cline-neutral">&nbsp;</span>
913
+ <span class="cline-any cline-yes">1x</span>
914
+ <span class="cline-any cline-yes">11x</span>
915
+ <span class="cline-any cline-neutral">&nbsp;</span>
916
+ <span class="cline-any cline-neutral">&nbsp;</span>
917
+ <span class="cline-any cline-yes">11x</span>
918
+ <span class="cline-any cline-neutral">&nbsp;</span>
919
+ <span class="cline-any cline-neutral">&nbsp;</span>
920
+ <span class="cline-any cline-neutral">&nbsp;</span>
921
+ <span class="cline-any cline-neutral">&nbsp;</span>
922
+ <span class="cline-any cline-yes">9x</span>
923
+ <span class="cline-any cline-yes">9x</span>
924
+ <span class="cline-any cline-neutral">&nbsp;</span>
925
+ <span class="cline-any cline-yes">9x</span>
926
+ <span class="cline-any cline-neutral">&nbsp;</span>
927
+ <span class="cline-any cline-neutral">&nbsp;</span>
928
+ <span class="cline-any cline-neutral">&nbsp;</span>
929
+ <span class="cline-any cline-yes">1x</span>
930
+ <span class="cline-any cline-yes">11x</span>
931
+ <span class="cline-any cline-neutral">&nbsp;</span>
932
+ <span class="cline-any cline-neutral">&nbsp;</span>
933
+ <span class="cline-any cline-yes">11x</span>
934
+ <span class="cline-any cline-neutral">&nbsp;</span>
935
+ <span class="cline-any cline-neutral">&nbsp;</span>
936
+ <span class="cline-any cline-yes">11x</span>
937
+ <span class="cline-any cline-yes">11x</span>
938
+ <span class="cline-any cline-yes">11x</span>
939
+ <span class="cline-any cline-neutral">&nbsp;</span>
940
+ <span class="cline-any cline-neutral">&nbsp;</span>
941
+ <span class="cline-any cline-yes">11x</span>
942
+ <span class="cline-any cline-neutral">&nbsp;</span>
943
+ <span class="cline-any cline-neutral">&nbsp;</span>
944
+ <span class="cline-any cline-yes">1x</span>
945
+ <span class="cline-any cline-yes">11x</span>
946
+ <span class="cline-any cline-neutral">&nbsp;</span>
947
+ <span class="cline-any cline-yes">11x</span>
948
+ <span class="cline-any cline-neutral">&nbsp;</span>
949
+ <span class="cline-any cline-yes">11x</span>
950
+ <span class="cline-any cline-neutral">&nbsp;</span>
951
+ <span class="cline-any cline-yes">11x</span>
952
+ <span class="cline-any cline-neutral">&nbsp;</span>
953
+ <span class="cline-any cline-neutral">&nbsp;</span>
954
+ <span class="cline-any cline-yes">11x</span>
955
+ <span class="cline-any cline-neutral">&nbsp;</span>
956
+ <span class="cline-any cline-yes">11x</span>
957
+ <span class="cline-any cline-yes">11x</span>
958
+ <span class="cline-any cline-yes">11x</span>
959
+ <span class="cline-any cline-neutral">&nbsp;</span>
960
+ <span class="cline-any cline-neutral">&nbsp;</span>
961
+ <span class="cline-any cline-neutral">&nbsp;</span>
962
+ <span class="cline-any cline-neutral">&nbsp;</span>
963
+ <span class="cline-any cline-neutral">&nbsp;</span>
964
+ <span class="cline-any cline-neutral">&nbsp;</span>
965
+ <span class="cline-any cline-neutral">&nbsp;</span>
966
+ <span class="cline-any cline-yes">11x</span>
967
+ <span class="cline-any cline-neutral">&nbsp;</span>
968
+ <span class="cline-any cline-neutral">&nbsp;</span>
969
+ <span class="cline-any cline-yes">1x</span>
970
+ <span class="cline-any cline-yes">11x</span>
971
+ <span class="cline-any cline-neutral">&nbsp;</span>
972
+ <span class="cline-any cline-yes">11x</span>
973
+ <span class="cline-any cline-yes">11x</span>
974
+ <span class="cline-any cline-yes">11x</span>
975
+ <span class="cline-any cline-yes">11x</span>
976
+ <span class="cline-any cline-yes">11x</span>
977
+ <span class="cline-any cline-yes">11x</span>
978
+ <span class="cline-any cline-yes">11x</span>
979
+ <span class="cline-any cline-neutral">&nbsp;</span>
980
+ <span class="cline-any cline-neutral">&nbsp;</span>
981
+ <span class="cline-any cline-neutral">&nbsp;</span>
982
+ <span class="cline-any cline-neutral">&nbsp;</span>
983
+ <span class="cline-any cline-neutral">&nbsp;</span>
984
+ <span class="cline-any cline-neutral">&nbsp;</span>
985
+ <span class="cline-any cline-neutral">&nbsp;</span>
986
+ <span class="cline-any cline-yes">11x</span>
987
+ <span class="cline-any cline-neutral">&nbsp;</span>
988
+ <span class="cline-any cline-neutral">&nbsp;</span>
989
+ <span class="cline-any cline-yes">1x</span>
990
+ <span class="cline-any cline-yes">11x</span>
991
+ <span class="cline-any cline-neutral">&nbsp;</span>
992
+ <span class="cline-any cline-neutral">&nbsp;</span>
993
+ <span class="cline-any cline-neutral">&nbsp;</span>
994
+ <span class="cline-any cline-neutral">&nbsp;</span>
995
+ <span class="cline-any cline-neutral">&nbsp;</span>
996
+ <span class="cline-any cline-yes">11x</span>
997
+ <span class="cline-any cline-yes">11x</span>
998
+ <span class="cline-any cline-neutral">&nbsp;</span>
999
+ <span class="cline-any cline-neutral">&nbsp;</span>
1000
+ <span class="cline-any cline-neutral">&nbsp;</span>
1001
+ <span class="cline-any cline-neutral">&nbsp;</span>
1002
+ <span class="cline-any cline-neutral">&nbsp;</span>
1003
+ <span class="cline-any cline-yes">11x</span>
1004
+ <span class="cline-any cline-neutral">&nbsp;</span>
1005
+ <span class="cline-any cline-yes">11x</span>
1006
+ <span class="cline-any cline-yes">11x</span>
1007
+ <span class="cline-any cline-no">&nbsp;</span>
1008
+ <span class="cline-any cline-neutral">&nbsp;</span>
1009
+ <span class="cline-any cline-neutral">&nbsp;</span>
1010
+ <span class="cline-any cline-neutral">&nbsp;</span>
1011
+ <span class="cline-any cline-neutral">&nbsp;</span>
1012
+ <span class="cline-any cline-neutral">&nbsp;</span>
1013
+ <span class="cline-any cline-no">&nbsp;</span>
1014
+ <span class="cline-any cline-no">&nbsp;</span>
1015
+ <span class="cline-any cline-neutral">&nbsp;</span>
1016
+ <span class="cline-any cline-neutral">&nbsp;</span>
1017
+ <span class="cline-any cline-neutral">&nbsp;</span>
1018
+ <span class="cline-any cline-neutral">&nbsp;</span>
1019
+ <span class="cline-any cline-no">&nbsp;</span>
1020
+ <span class="cline-any cline-no">&nbsp;</span>
1021
+ <span class="cline-any cline-neutral">&nbsp;</span>
1022
+ <span class="cline-any cline-neutral">&nbsp;</span>
1023
+ <span class="cline-any cline-neutral">&nbsp;</span>
1024
+ <span class="cline-any cline-neutral">&nbsp;</span>
1025
+ <span class="cline-any cline-neutral">&nbsp;</span>
1026
+ <span class="cline-any cline-neutral">&nbsp;</span>
1027
+ <span class="cline-any cline-neutral">&nbsp;</span>
1028
+ <span class="cline-any cline-neutral">&nbsp;</span>
1029
+ <span class="cline-any cline-yes">1x</span>
1030
+ <span class="cline-any cline-yes">11x</span>
1031
+ <span class="cline-any cline-neutral">&nbsp;</span>
1032
+ <span class="cline-any cline-neutral">&nbsp;</span>
1033
+ <span class="cline-any cline-neutral">&nbsp;</span>
1034
+ <span class="cline-any cline-yes">11x</span>
1035
+ <span class="cline-any cline-yes">11x</span>
1036
+ <span class="cline-any cline-neutral">&nbsp;</span>
1037
+ <span class="cline-any cline-neutral">&nbsp;</span>
1038
+ <span class="cline-any cline-neutral">&nbsp;</span>
1039
+ <span class="cline-any cline-yes">11x</span>
1040
+ <span class="cline-any cline-yes">1x</span>
1041
+ <span class="cline-any cline-neutral">&nbsp;</span>
1042
+ <span class="cline-any cline-neutral">&nbsp;</span>
1043
+ <span class="cline-any cline-neutral">&nbsp;</span>
1044
+ <span class="cline-any cline-neutral">&nbsp;</span>
1045
+ <span class="cline-any cline-neutral">&nbsp;</span>
1046
+ <span class="cline-any cline-yes">11x</span>
1047
+ <span class="cline-any cline-yes">11x</span>
1048
+ <span class="cline-any cline-yes">11x</span>
1049
+ <span class="cline-any cline-yes">11x</span>
1050
+ <span class="cline-any cline-neutral">&nbsp;</span>
1051
+ <span class="cline-any cline-neutral">&nbsp;</span>
1052
+ <span class="cline-any cline-neutral">&nbsp;</span>
1053
+ <span class="cline-any cline-neutral">&nbsp;</span>
1054
+ <span class="cline-any cline-neutral">&nbsp;</span>
1055
+ <span class="cline-any cline-yes">11x</span>
1056
+ <span class="cline-any cline-neutral">&nbsp;</span>
1057
+ <span class="cline-any cline-yes">11x</span>
1058
+ <span class="cline-any cline-neutral">&nbsp;</span>
1059
+ <span class="cline-any cline-yes">11x</span>
1060
+ <span class="cline-any cline-neutral">&nbsp;</span>
1061
+ <span class="cline-any cline-neutral">&nbsp;</span>
1062
+ <span class="cline-any cline-yes">1x</span>
1063
+ <span class="cline-any cline-yes">11x</span>
1064
+ <span class="cline-any cline-neutral">&nbsp;</span>
1065
+ <span class="cline-any cline-yes">11x</span>
1066
+ <span class="cline-any cline-yes">11x</span>
1067
+ <span class="cline-any cline-yes">11x</span>
1068
+ <span class="cline-any cline-neutral">&nbsp;</span>
1069
+ <span class="cline-any cline-neutral">&nbsp;</span>
1070
+ <span class="cline-any cline-yes">11x</span>
1071
+ <span class="cline-any cline-neutral">&nbsp;</span>
1072
+ <span class="cline-any cline-yes">11x</span>
1073
+ <span class="cline-any cline-neutral">&nbsp;</span>
1074
+ <span class="cline-any cline-neutral">&nbsp;</span>
1075
+ <span class="cline-any cline-neutral">&nbsp;</span>
1076
+ <span class="cline-any cline-neutral">&nbsp;</span>
1077
+ <span class="cline-any cline-neutral">&nbsp;</span>
1078
+ <span class="cline-any cline-neutral">&nbsp;</span>
1079
+ <span class="cline-any cline-neutral">&nbsp;</span>
1080
+ <span class="cline-any cline-neutral">&nbsp;</span>
1081
+ <span class="cline-any cline-neutral">&nbsp;</span>
1082
+ <span class="cline-any cline-neutral">&nbsp;</span>
1083
+ <span class="cline-any cline-neutral">&nbsp;</span>
1084
+ <span class="cline-any cline-neutral">&nbsp;</span>
1085
+ <span class="cline-any cline-neutral">&nbsp;</span>
1086
+ <span class="cline-any cline-yes">1x</span>
1087
+ <span class="cline-any cline-neutral">&nbsp;</span>
1088
+ <span class="cline-any cline-neutral">&nbsp;</span>
1089
+ <span class="cline-any cline-neutral">&nbsp;</span>
1090
+ <span class="cline-any cline-yes">11x</span>
1091
+ <span class="cline-any cline-neutral">&nbsp;</span>
1092
+ <span class="cline-any cline-yes">11x</span>
1093
+ <span class="cline-any cline-yes">11x</span>
1094
+ <span class="cline-any cline-neutral">&nbsp;</span>
1095
+ <span class="cline-any cline-neutral">&nbsp;</span>
1096
+ <span class="cline-any cline-neutral">&nbsp;</span>
1097
+ <span class="cline-any cline-neutral">&nbsp;</span>
1098
+ <span class="cline-any cline-neutral">&nbsp;</span>
1099
+ <span class="cline-any cline-neutral">&nbsp;</span>
1100
+ <span class="cline-any cline-neutral">&nbsp;</span>
1101
+ <span class="cline-any cline-neutral">&nbsp;</span>
1102
+ <span class="cline-any cline-neutral">&nbsp;</span>
1103
+ <span class="cline-any cline-neutral">&nbsp;</span>
1104
+ <span class="cline-any cline-neutral">&nbsp;</span>
1105
+ <span class="cline-any cline-neutral">&nbsp;</span>
1106
+ <span class="cline-any cline-neutral">&nbsp;</span>
1107
+ <span class="cline-any cline-neutral">&nbsp;</span>
1108
+ <span class="cline-any cline-yes">2x</span>
1109
+ <span class="cline-any cline-yes">2x</span>
1110
+ <span class="cline-any cline-no">&nbsp;</span>
1111
+ <span class="cline-any cline-no">&nbsp;</span>
1112
+ <span class="cline-any cline-no">&nbsp;</span>
1113
+ <span class="cline-any cline-neutral">&nbsp;</span>
1114
+ <span class="cline-any cline-neutral">&nbsp;</span>
1115
+ <span class="cline-any cline-no">&nbsp;</span>
1116
+ <span class="cline-any cline-neutral">&nbsp;</span>
1117
+ <span class="cline-any cline-neutral">&nbsp;</span>
1118
+ <span class="cline-any cline-neutral">&nbsp;</span>
1119
+ <span class="cline-any cline-yes">11x</span>
1120
+ <span class="cline-any cline-neutral">&nbsp;</span>
1121
+ <span class="cline-any cline-yes">1x</span>
1122
+ <span class="cline-any cline-no">&nbsp;</span>
1123
+ <span class="cline-any cline-neutral">&nbsp;</span>
1124
+ <span class="cline-any cline-neutral">&nbsp;</span>
1125
+ <span class="cline-any cline-neutral">&nbsp;</span>
1126
+ <span class="cline-any cline-yes">1x</span>
1127
+ <span class="cline-any cline-yes">1x</span>
1128
+ <span class="cline-any cline-neutral">&nbsp;</span>
1129
+ <span class="cline-any cline-neutral">&nbsp;</span>
1130
+ <span class="cline-any cline-neutral">&nbsp;</span>
1131
+ <span class="cline-any cline-neutral">&nbsp;</span>
1132
+ <span class="cline-any cline-neutral">&nbsp;</span>
1133
+ <span class="cline-any cline-neutral">&nbsp;</span>
1134
+ <span class="cline-any cline-no">&nbsp;</span>
1135
+ <span class="cline-any cline-neutral">&nbsp;</span>
1136
+ <span class="cline-any cline-neutral">&nbsp;</span>
1137
+ <span class="cline-any cline-yes">10x</span>
1138
+ <span class="cline-any cline-yes">1x</span>
1139
+ <span class="cline-any cline-no">&nbsp;</span>
1140
+ <span class="cline-any cline-neutral">&nbsp;</span>
1141
+ <span class="cline-any cline-neutral">&nbsp;</span>
1142
+ <span class="cline-any cline-neutral">&nbsp;</span>
1143
+ <span class="cline-any cline-yes">1x</span>
1144
+ <span class="cline-any cline-yes">1x</span>
1145
+ <span class="cline-any cline-neutral">&nbsp;</span>
1146
+ <span class="cline-any cline-neutral">&nbsp;</span>
1147
+ <span class="cline-any cline-neutral">&nbsp;</span>
1148
+ <span class="cline-any cline-neutral">&nbsp;</span>
1149
+ <span class="cline-any cline-neutral">&nbsp;</span>
1150
+ <span class="cline-any cline-neutral">&nbsp;</span>
1151
+ <span class="cline-any cline-neutral">&nbsp;</span>
1152
+ <span class="cline-any cline-no">&nbsp;</span>
1153
+ <span class="cline-any cline-neutral">&nbsp;</span>
1154
+ <span class="cline-any cline-neutral">&nbsp;</span>
1155
+ <span class="cline-any cline-yes">9x</span>
1156
+ <span class="cline-any cline-neutral">&nbsp;</span>
1157
+ <span class="cline-any cline-neutral">&nbsp;</span>
1158
+ <span class="cline-any cline-yes">1x</span>
1159
+ <span class="cline-any cline-yes">11x</span>
1160
+ <span class="cline-any cline-neutral">&nbsp;</span>
1161
+ <span class="cline-any cline-neutral">&nbsp;</span>
1162
+ <span class="cline-any cline-neutral">&nbsp;</span>
1163
+ <span class="cline-any cline-yes">11x</span>
1164
+ <span class="cline-any cline-neutral">&nbsp;</span>
1165
+ <span class="cline-any cline-neutral">&nbsp;</span>
1166
+ <span class="cline-any cline-neutral">&nbsp;</span>
1167
+ <span class="cline-any cline-neutral">&nbsp;</span>
1168
+ <span class="cline-any cline-yes">11x</span>
1169
+ <span class="cline-any cline-neutral">&nbsp;</span>
1170
+ <span class="cline-any cline-neutral">&nbsp;</span>
1171
+ <span class="cline-any cline-neutral">&nbsp;</span>
1172
+ <span class="cline-any cline-neutral">&nbsp;</span>
1173
+ <span class="cline-any cline-neutral">&nbsp;</span>
1174
+ <span class="cline-any cline-neutral">&nbsp;</span>
1175
+ <span class="cline-any cline-neutral">&nbsp;</span>
1176
+ <span class="cline-any cline-neutral">&nbsp;</span>
1177
+ <span class="cline-any cline-yes">1x</span>
1178
+ <span class="cline-any cline-yes">22x</span>
1179
+ <span class="cline-any cline-neutral">&nbsp;</span>
1180
+ <span class="cline-any cline-neutral">&nbsp;</span>
1181
+ <span class="cline-any cline-yes">22x</span>
1182
+ <span class="cline-any cline-neutral">&nbsp;</span>
1183
+ <span class="cline-any cline-yes">22x</span>
1184
+ <span class="cline-any cline-neutral">&nbsp;</span>
1185
+ <span class="cline-any cline-yes">22x</span>
1186
+ <span class="cline-any cline-neutral">&nbsp;</span>
1187
+ <span class="cline-any cline-neutral">&nbsp;</span>
1188
+ <span class="cline-any cline-neutral">&nbsp;</span>
1189
+ <span class="cline-any cline-neutral">&nbsp;</span>
1190
+ <span class="cline-any cline-neutral">&nbsp;</span>
1191
+ <span class="cline-any cline-neutral">&nbsp;</span>
1192
+ <span class="cline-any cline-neutral">&nbsp;</span>
1193
+ <span class="cline-any cline-neutral">&nbsp;</span>
1194
+ <span class="cline-any cline-neutral">&nbsp;</span>
1195
+ <span class="cline-any cline-neutral">&nbsp;</span>
1196
+ <span class="cline-any cline-neutral">&nbsp;</span>
1197
+ <span class="cline-any cline-neutral">&nbsp;</span>
1198
+ <span class="cline-any cline-neutral">&nbsp;</span>
1199
+ <span class="cline-any cline-neutral">&nbsp;</span>
1200
+ <span class="cline-any cline-neutral">&nbsp;</span>
1201
+ <span class="cline-any cline-yes">11x</span>
1202
+ <span class="cline-any cline-neutral">&nbsp;</span>
1203
+ <span class="cline-any cline-yes">11x</span>
1204
+ <span class="cline-any cline-neutral">&nbsp;</span>
1205
+ <span class="cline-any cline-yes">11x</span>
1206
+ <span class="cline-any cline-yes">11x</span>
1207
+ <span class="cline-any cline-yes">11x</span>
1208
+ <span class="cline-any cline-yes">11x</span>
1209
+ <span class="cline-any cline-yes">11x</span>
1210
+ <span class="cline-any cline-yes">11x</span>
1211
+ <span class="cline-any cline-yes">11x</span>
1212
+ <span class="cline-any cline-yes">11x</span>
1213
+ <span class="cline-any cline-yes">11x</span>
1214
+ <span class="cline-any cline-neutral">&nbsp;</span>
1215
+ <span class="cline-any cline-neutral">&nbsp;</span>
1216
+ <span class="cline-any cline-neutral">&nbsp;</span>
1217
+ <span class="cline-any cline-neutral">&nbsp;</span>
1218
+ <span class="cline-any cline-neutral">&nbsp;</span>
1219
+ <span class="cline-any cline-yes">11x</span>
1220
+ <span class="cline-any cline-yes">11x</span>
1221
+ <span class="cline-any cline-neutral">&nbsp;</span>
1222
+ <span class="cline-any cline-neutral">&nbsp;</span>
1223
+ <span class="cline-any cline-neutral">&nbsp;</span>
1224
+ <span class="cline-any cline-neutral">&nbsp;</span>
1225
+ <span class="cline-any cline-neutral">&nbsp;</span>
1226
+ <span class="cline-any cline-neutral">&nbsp;</span>
1227
+ <span class="cline-any cline-neutral">&nbsp;</span>
1228
+ <span class="cline-any cline-yes">11x</span>
1229
+ <span class="cline-any cline-neutral">&nbsp;</span>
1230
+ <span class="cline-any cline-neutral">&nbsp;</span>
1231
+ <span class="cline-any cline-neutral">&nbsp;</span>
1232
+ <span class="cline-any cline-neutral">&nbsp;</span>
1233
+ <span class="cline-any cline-neutral">&nbsp;</span>
1234
+ <span class="cline-any cline-neutral">&nbsp;</span>
1235
+ <span class="cline-any cline-neutral">&nbsp;</span>
1236
+ <span class="cline-any cline-neutral">&nbsp;</span>
1237
+ <span class="cline-any cline-neutral">&nbsp;</span>
1238
+ <span class="cline-any cline-neutral">&nbsp;</span>
1239
+ <span class="cline-any cline-yes">11x</span>
1240
+ <span class="cline-any cline-neutral">&nbsp;</span>
1241
+ <span class="cline-any cline-yes">11x</span>
1242
+ <span class="cline-any cline-yes">11x</span>
1243
+ <span class="cline-any cline-yes">11x</span>
1244
+ <span class="cline-any cline-yes">11x</span>
1245
+ <span class="cline-any cline-neutral">&nbsp;</span>
1246
+ <span class="cline-any cline-no">&nbsp;</span>
1247
+ <span class="cline-any cline-no">&nbsp;</span>
1248
+ <span class="cline-any cline-no">&nbsp;</span>
1249
+ <span class="cline-any cline-neutral">&nbsp;</span>
1250
+ <span class="cline-any cline-neutral">&nbsp;</span>
1251
+ <span class="cline-any cline-neutral">&nbsp;</span>
1252
+ <span class="cline-any cline-yes">11x</span>
1253
+ <span class="cline-any cline-no">&nbsp;</span>
1254
+ <span class="cline-any cline-neutral">&nbsp;</span>
1255
+ <span class="cline-any cline-neutral">&nbsp;</span>
1256
+ <span class="cline-any cline-neutral">&nbsp;</span>
1257
+ <span class="cline-any cline-neutral">&nbsp;</span>
1258
+ <span class="cline-any cline-yes">11x</span>
1259
+ <span class="cline-any cline-yes">11x</span>
1260
+ <span class="cline-any cline-neutral">&nbsp;</span>
1261
+ <span class="cline-any cline-neutral">&nbsp;</span>
1262
+ <span class="cline-any cline-yes">11x</span>
1263
+ <span class="cline-any cline-neutral">&nbsp;</span>
1264
+ <span class="cline-any cline-neutral">&nbsp;</span>
1265
+ <span class="cline-any cline-yes">1x</span>
1266
+ <span class="cline-any cline-yes">11x</span>
1267
+ <span class="cline-any cline-yes">11x</span>
1268
+ <span class="cline-any cline-neutral">&nbsp;</span>
1269
+ <span class="cline-any cline-neutral">&nbsp;</span>
1270
+ <span class="cline-any cline-neutral">&nbsp;</span>
1271
+ <span class="cline-any cline-neutral">&nbsp;</span>
1272
+ <span class="cline-any cline-neutral">&nbsp;</span>
1273
+ <span class="cline-any cline-yes">11x</span>
1274
+ <span class="cline-any cline-yes">11x</span>
1275
+ <span class="cline-any cline-yes">11x</span>
1276
+ <span class="cline-any cline-yes">11x</span>
1277
+ <span class="cline-any cline-neutral">&nbsp;</span>
1278
+ <span class="cline-any cline-neutral">&nbsp;</span>
1279
+ <span class="cline-any cline-yes">11x</span>
1280
+ <span class="cline-any cline-no">&nbsp;</span>
1281
+ <span class="cline-any cline-neutral">&nbsp;</span>
1282
+ <span class="cline-any cline-neutral">&nbsp;</span>
1283
+ <span class="cline-any cline-no">&nbsp;</span>
1284
+ <span class="cline-any cline-neutral">&nbsp;</span>
1285
+ <span class="cline-any cline-neutral">&nbsp;</span>
1286
+ <span class="cline-any cline-yes">11x</span>
1287
+ <span class="cline-any cline-neutral">&nbsp;</span>
1288
+ <span class="cline-any cline-neutral">&nbsp;</span>
1289
+ <span class="cline-any cline-yes">1x</span>
1290
+ <span class="cline-any cline-yes">22x</span>
1291
+ <span class="cline-any cline-yes">22x</span>
1292
+ <span class="cline-any cline-yes">22x</span>
1293
+ <span class="cline-any cline-neutral">&nbsp;</span>
1294
+ <span class="cline-any cline-neutral">&nbsp;</span>
1295
+ <span class="cline-any cline-yes">22x</span>
1296
+ <span class="cline-any cline-no">&nbsp;</span>
1297
+ <span class="cline-any cline-neutral">&nbsp;</span>
1298
+ <span class="cline-any cline-neutral">&nbsp;</span>
1299
+ <span class="cline-any cline-no">&nbsp;</span>
1300
+ <span class="cline-any cline-no">&nbsp;</span>
1301
+ <span class="cline-any cline-neutral">&nbsp;</span>
1302
+ <span class="cline-any cline-neutral">&nbsp;</span>
1303
+ <span class="cline-any cline-yes">22x</span>
1304
+ <span class="cline-any cline-neutral">&nbsp;</span>
1305
+ <span class="cline-any cline-yes">1x</span>
1306
+ <span class="cline-any cline-neutral">&nbsp;</span>
1307
+ <span class="cline-any cline-yes">1x</span>
1308
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Visual as VisualLayer } from "../layer/index";
1309
+ import { Movie } from "../movie";
1310
+ import { val } from "../util";
1311
+ import { Visual } from "./visual";
1312
+ &nbsp;
1313
+ export interface UniformOptions {
1314
+ /**
1315
+ * The type of the uniform.
1316
+ */
1317
+ type?: string;
1318
+ defaultFloatComponent?: number;
1319
+ }
1320
+ &nbsp;
1321
+ export interface TextureOptions {
1322
+ createUniform?: boolean;
1323
+ target?;
1324
+ level?: number;
1325
+ internalFormat?;
1326
+ srcFormat?;
1327
+ srcType?;
1328
+ wrapS?;
1329
+ wrapT?;
1330
+ minFilter?;
1331
+ magFilter?;
1332
+ }
1333
+ &nbsp;
1334
+ export interface ShaderOptions {
1335
+ fragmentSource?: string;
1336
+ uniforms?: Record&lt;string, UniformOptions | string&gt;;
1337
+ textures?: Record&lt;string, TextureOptions&gt;;
1338
+ sourceTextureOptions?: TextureOptions;
1339
+ }
1340
+ &nbsp;
1341
+ /**
1342
+ * A hardware-accelerated pixel mapping using WebGL
1343
+ */
1344
+ // TODO: can `v_TextureCoord` be replaced by `gl_FragUV`?
1345
+ export class Shader extends Visual {
1346
+ /**
1347
+ * WebGL texture units consumed by {@link Shader}
1348
+ */
1349
+ static INTERNAL_TEXTURE_UNITS = 1;
1350
+ private static _DEFAULT_TEXTURE_OPTIONS = {
1351
+ createUniform: true,
1352
+ target: "TEXTURE_2D",
1353
+ level: 0,
1354
+ internalFormat: "RGBA",
1355
+ srcFormat: "RGBA",
1356
+ srcType: "UNSIGNED_BYTE",
1357
+ minFilter: "LINEAR",
1358
+ magFilter: "LINEAR",
1359
+ wrapS: "CLAMP_TO_EDGE",
1360
+ wrapT: "CLAMP_TO_EDGE",
1361
+ };
1362
+ &nbsp;
1363
+ private static _VERTEX_SOURCE = `
1364
+ attribute vec4 a_VertexPosition;
1365
+ attribute vec2 a_TextureCoord;
1366
+ &nbsp;
1367
+ varying highp vec2 v_TextureCoord;
1368
+ &nbsp;
1369
+ void main() {
1370
+ // no need for projection or model-view matrices, since we're just rendering a rectangle
1371
+ // that fills the screen (see position values)
1372
+ gl_Position = a_VertexPosition;
1373
+ v_TextureCoord = a_TextureCoord;
1374
+ }
1375
+ `;
1376
+ private static _IDENTITY_FRAGMENT_SOURCE = `
1377
+ precision mediump float;
1378
+ &nbsp;
1379
+ uniform sampler2D u_Source;
1380
+ &nbsp;
1381
+ varying highp vec2 v_TextureCoord;
1382
+ &nbsp;
1383
+ void main() {
1384
+ gl_FragColor = texture2D(u_Source, v_TextureCoord);
1385
+ }
1386
+ `;
1387
+ private _program: WebGLProgram;
1388
+ private _buffers: {
1389
+ position: WebGLBuffer;
1390
+ textureCoord: WebGLBuffer;
1391
+ };
1392
+ &nbsp;
1393
+ private _canvas: HTMLCanvasElement;
1394
+ private _gl: WebGLRenderingContext;
1395
+ private _uniformLocations: Record&lt;string, WebGLUniformLocation&gt;;
1396
+ private _attribLocations: Record&lt;string, GLint&gt;;
1397
+ private _userUniforms: Record&lt;string, UniformOptions | string&gt;;
1398
+ private _userTextures: Record&lt;string, TextureOptions&gt;;
1399
+ private _sourceTextureOptions: TextureOptions;
1400
+ private _inputTexture: WebGLTexture;
1401
+ &nbsp;
1402
+ /**
1403
+ * @param fragmentSrc
1404
+ * @param [userUniforms={}] - object mapping uniform id to an
1405
+ * options object or a string (if you only need to provide the uniforms'
1406
+ * type)
1407
+ * @param [userTextures=[]]
1408
+ * @param [sourceTextureOptions={}]
1409
+ */
1410
+ constructor(options: ShaderOptions = {}) {
1411
+ super()<span class="branch-1 cbranch-no" title="branch not covered" >;</span>
1412
+ // TODO: split up into multiple methods
1413
+ const fragmentSrc =
1414
+ options.fragmentSource || Shader._IDENTITY_FRAGMENT_SOURCE;
1415
+ const userUniforms = options.uniforms || {};
1416
+ const userTextures = options.textures || {};
1417
+ const sourceTextureOptions = options.sourceTextureOptions || {};
1418
+ &nbsp;
1419
+ const gl = this._initGl();
1420
+ this._program = Shader._initShaderProgram(
1421
+ gl,
1422
+ Shader._VERTEX_SOURCE,
1423
+ fragmentSrc
1424
+ );
1425
+ this._buffers = Shader._initRectBuffers(gl);
1426
+ &nbsp;
1427
+ this._initTextures(userUniforms, userTextures, sourceTextureOptions);
1428
+ this._initAttribs();
1429
+ this._initUniforms(userUniforms);
1430
+ }
1431
+ &nbsp;
1432
+ private _initGl() {
1433
+ console.log("init gl");
1434
+ this._canvas = document.createElement("canvas");
1435
+ const gl = this._canvas.getContext("webgl");
1436
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (gl === null) {
1437
+ <span class="cstat-no" title="statement not covered" > console.warn(</span>
1438
+ "Unable to initialize WebGL. Your browser may not support it."
1439
+ );
1440
+ <span class="cstat-no" title="statement not covered" > throw new Error(</span>
1441
+ "Unable to initialize WebGL. Your browser or machine may not support it."
1442
+ );
1443
+ }
1444
+ &nbsp;
1445
+ this._gl = gl;
1446
+ return gl;
1447
+ }
1448
+ &nbsp;
1449
+ private _initTextures(userUniforms, userTextures, sourceTextureOptions) {
1450
+ const gl = this._gl;
1451
+ const maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);
1452
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (userTextures.length &gt; maxTextures) {
1453
+ <span class="cstat-no" title="statement not covered" > console.warn("Too many textures!");</span>
1454
+ }
1455
+ &nbsp;
1456
+ this._userTextures = {};
1457
+ for (const name in userTextures) {
1458
+ const userOptions: TextureOptions = userTextures[name];
1459
+ // Apply default options.
1460
+ const options = { ...Shader._DEFAULT_TEXTURE_OPTIONS, ...userOptions };
1461
+ &nbsp;
1462
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (options.createUniform) {
1463
+ /*
1464
+ * Automatically, create a uniform with the same name as this texture,
1465
+ * that points to it. This is an easy way for the user to use custom
1466
+ * textures, without having to define multiple properties in the effect
1467
+ * object.
1468
+ */
1469
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (userUniforms[name]) {
1470
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Texture - uniform naming conflict: ${name}!`);</span>
1471
+ }
1472
+ &nbsp;
1473
+ // Add this as a "user uniform".
1474
+ userUniforms[name] = "1i"; // texture pointer
1475
+ }
1476
+ this._userTextures[name] = options;
1477
+ }
1478
+ this._sourceTextureOptions = {
1479
+ ...Shader._DEFAULT_TEXTURE_OPTIONS,
1480
+ ...sourceTextureOptions,
1481
+ };
1482
+ }
1483
+ &nbsp;
1484
+ private _initAttribs() {
1485
+ const gl = this._gl;
1486
+ this._attribLocations = {
1487
+ textureCoord: gl.getAttribLocation(this._program, "a_TextureCoord"),
1488
+ // a_VertexPosition ?? somehow it works without it though...
1489
+ };
1490
+ }
1491
+ &nbsp;
1492
+ private _initUniforms(userUniforms) {
1493
+ const gl = this._gl;
1494
+ this._uniformLocations = {
1495
+ source: gl.getUniformLocation(this._program, "u_Source"),
1496
+ size: gl.getUniformLocation(this._program, "u_Size"),
1497
+ };
1498
+ // The options value can just be a string equal to the type of the variable,
1499
+ // for syntactic sugar. If this is the case, convert it to a real options
1500
+ // object.
1501
+ this._userUniforms = {};
1502
+ for (const name in userUniforms) {
1503
+ const val = userUniforms[name];
1504
+ this._userUniforms[name] = typeof val === "string" ? { type: val } : val;
1505
+ }
1506
+ for (const unprefixed in userUniforms) {
1507
+ // property =&gt; u_Property
1508
+ const prefixed =
1509
+ "u_" +
1510
+ unprefixed.charAt(0).toUpperCase() +
1511
+ (unprefixed.length &gt; 1 ? unprefixed.slice(1) : <span class="branch-1 cbranch-no" title="branch not covered" >"")</span>;
1512
+ this._uniformLocations[unprefixed] = gl.getUniformLocation(
1513
+ this._program,
1514
+ prefixed
1515
+ );
1516
+ }
1517
+ }
1518
+ &nbsp;
1519
+ apply(target: Movie | VisualLayer, reltime: number): void {
1520
+ this._checkDimensions(target);
1521
+ this._refreshGl();
1522
+ &nbsp;
1523
+ this._enablePositionAttrib();
1524
+ this._enableTexCoordAttrib();
1525
+ this._prepareTextures(target, reltime);
1526
+ &nbsp;
1527
+ this._gl.useProgram(this._program);
1528
+ &nbsp;
1529
+ this._prepareUniforms(target, reltime);
1530
+ &nbsp;
1531
+ this._draw(target);
1532
+ }
1533
+ &nbsp;
1534
+ private _checkDimensions(target) {
1535
+ const gl = this._gl;
1536
+ // TODO: Change target.canvas.width =&gt; target.width and see if it breaks
1537
+ // anything.
1538
+ if (
1539
+ this._canvas.width !== target.canvas.width ||
1540
+ this._canvas.height !== target.canvas.height
1541
+ ) {
1542
+ // (optimization)
1543
+ this._canvas.width = target.canvas.width;
1544
+ this._canvas.height = target.canvas.height;
1545
+ &nbsp;
1546
+ gl.viewport(0, 0, target.canvas.width, target.canvas.height);
1547
+ }
1548
+ }
1549
+ &nbsp;
1550
+ private _refreshGl() {
1551
+ const gl = this._gl;
1552
+ // Clear to black; fragments can be made transparent with the blendfunc
1553
+ // below.
1554
+ gl.clearColor(0, 0, 0, 1);
1555
+ // gl.clearDepth(1.0); // clear everything
1556
+ // not sure why I can't multiply rgb by zero
1557
+ gl.blendFuncSeparate(gl.SRC_ALPHA, gl.SRC_ALPHA, gl.ONE, gl.ZERO);
1558
+ gl.enable(gl.BLEND);
1559
+ gl.disable(gl.DEPTH_TEST);
1560
+ // gl.depthFunc(gl.LEQUAL);
1561
+ &nbsp;
1562
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
1563
+ }
1564
+ &nbsp;
1565
+ private _enablePositionAttrib() {
1566
+ const gl = this._gl;
1567
+ // Tell WebGL how to pull out the positions from buffer
1568
+ const numComponents = 2;
1569
+ // The data in the buffer is 32bit floats
1570
+ const type = gl.FLOAT;
1571
+ // Don't normalize
1572
+ const normalize = false;
1573
+ // How many bytes to get from one set of values to the next
1574
+ // 0 = use type and numComponents above
1575
+ const stride = 0;
1576
+ // How many bytes inside the buffer to start from
1577
+ const offset = 0;
1578
+ gl.bindBuffer(gl.ARRAY_BUFFER, this._buffers.position);
1579
+ gl.vertexAttribPointer(
1580
+ this._attribLocations.vertexPosition,
1581
+ numComponents,
1582
+ type,
1583
+ normalize,
1584
+ stride,
1585
+ offset
1586
+ );
1587
+ gl.enableVertexAttribArray(this._attribLocations.vertexPosition);
1588
+ }
1589
+ &nbsp;
1590
+ private _enableTexCoordAttrib() {
1591
+ const gl = this._gl;
1592
+ // tell webgl how to pull out the texture coordinates from buffer
1593
+ const numComponents = 2; // every coordinate composed of 2 values (uv)
1594
+ const type = gl.FLOAT; // the data in the buffer is 32 bit float
1595
+ const normalize = false; // don't normalize
1596
+ const stride = 0; // how many bytes to get from one set to the next
1597
+ const offset = 0; // how many bytes inside the buffer to start from
1598
+ gl.bindBuffer(gl.ARRAY_BUFFER, this._buffers.textureCoord);
1599
+ gl.vertexAttribPointer(
1600
+ this._attribLocations.textureCoord,
1601
+ numComponents,
1602
+ type,
1603
+ normalize,
1604
+ stride,
1605
+ offset
1606
+ );
1607
+ gl.enableVertexAttribArray(this._attribLocations.textureCoord);
1608
+ }
1609
+ &nbsp;
1610
+ private _prepareTextures(target, reltime) {
1611
+ const gl = this._gl;
1612
+ // TODO: figure out which properties should be private / public
1613
+ &nbsp;
1614
+ // Tell WebGL we want to affect texture unit 0
1615
+ // Call `activeTexture` before `_loadTexture` so it won't be bound to the
1616
+ // last active texture.
1617
+ gl.activeTexture(gl.TEXTURE0);
1618
+ this._inputTexture = Shader._loadTexture(
1619
+ gl,
1620
+ target.canvas,
1621
+ this._sourceTextureOptions
1622
+ );
1623
+ // Bind the texture to texture unit 0
1624
+ gl.bindTexture(gl.TEXTURE_2D, this._inputTexture);
1625
+ &nbsp;
1626
+ let i = 0;
1627
+ for (const name in this._userTextures) {
1628
+ const options = <span class="cstat-no" title="statement not covered" >this._userTextures[name];</span>
1629
+ /*
1630
+ * Call `activeTexture` before `_loadTexture` so it won't be bound to the
1631
+ * last active texture.
1632
+ * TODO: investigate better implementation of `_loadTexture`
1633
+ */
1634
+ <span class="cstat-no" title="statement not covered" > gl.activeTexture(gl.TEXTURE0 + (Shader.INTERNAL_TEXTURE_UNITS + i)); </span>// use the fact that TEXTURE0, TEXTURE1, ... are continuous
1635
+ const preparedTex = <span class="cstat-no" title="statement not covered" >Shader._loadTexture(</span>
1636
+ gl,
1637
+ val(this, name, reltime),
1638
+ options
1639
+ ); // do it every frame to keep updated (I think you need to)
1640
+ <span class="cstat-no" title="statement not covered" > gl.bindTexture(gl[options.target], preparedTex);</span>
1641
+ <span class="cstat-no" title="statement not covered" > i++;</span>
1642
+ }
1643
+ }
1644
+ &nbsp;
1645
+ /**
1646
+ * Set the shader's uniforms.
1647
+ * @param target The movie or layer to apply the shader to.
1648
+ * @param reltime The relative time of the movie or layer.
1649
+ */
1650
+ private _prepareUniforms(target, reltime) {
1651
+ const gl = this._gl;
1652
+ &nbsp;
1653
+ // Tell the shader we bound the texture to texture unit 0.
1654
+ // All base (Shader class) uniforms are optional.
1655
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (this._uniformLocations.source) {
1656
+ gl.uniform1i(this._uniformLocations.source, 0);
1657
+ }
1658
+ &nbsp;
1659
+ // All base (Shader class) uniforms are optional.
1660
+ if (this._uniformLocations.size) {
1661
+ gl.uniform2iv(this._uniformLocations.size, [
1662
+ target.canvas.width,
1663
+ target.canvas.height,
1664
+ ]);
1665
+ }
1666
+ &nbsp;
1667
+ for (const unprefixed in this._userUniforms) {
1668
+ const options = this._userUniforms[unprefixed] as UniformOptions;
1669
+ const value = val(this, unprefixed, reltime);
1670
+ const preparedValue = this._prepareValue(
1671
+ value,
1672
+ options.type,
1673
+ reltime,
1674
+ options
1675
+ );
1676
+ const location = this._uniformLocations[unprefixed];
1677
+ // haHA JavaScript (`options.type` is "1f", for instance)
1678
+ gl["uniform" + options.type](location, preparedValue);
1679
+ }
1680
+ gl.uniform1i(this._uniformLocations.test, 0);
1681
+ }
1682
+ &nbsp;
1683
+ private _draw(target) {
1684
+ const gl = this._gl;
1685
+ &nbsp;
1686
+ const offset = 0;
1687
+ const vertexCount = 4;
1688
+ gl.drawArrays(gl.TRIANGLE_STRIP, offset, vertexCount);
1689
+ &nbsp;
1690
+ // clear the target, in case the effect outputs transparent pixels
1691
+ target.cctx.clearRect(0, 0, target.canvas.width, target.canvas.height);
1692
+ // copy internal image state onto target
1693
+ target.cctx.drawImage(this._canvas, 0, 0);
1694
+ }
1695
+ &nbsp;
1696
+ /**
1697
+ * Converts a value of a standard type for javascript to a standard type for
1698
+ * GLSL
1699
+ *
1700
+ * @param value - the raw value to prepare
1701
+ * @param outputType - the WebGL type of |value|; example:
1702
+ * &lt;code&gt;1f&lt;/code&gt; for a float
1703
+ * @param reltime - current time, relative to the target
1704
+ * @param [options]
1705
+ * @returns the prepared value
1706
+ */
1707
+ private _prepareValue(
1708
+ value,
1709
+ outputType,
1710
+ reltime,
1711
+ <span class="missing-if-branch" title="if path not taken" >I</span>options: UniformOptions = {}
1712
+ ) {
1713
+ const def = options.defaultFloatComponent || 0;
1714
+ if (outputType === "1i") {
1715
+ /*
1716
+ * Textures are passed to the shader by both providing the texture (with
1717
+ * texImage2D) and setting the |sampler| uniform equal to the index of
1718
+ * the texture. In etro shader effects, the subclass passes the names of
1719
+ * all the textures ot this base class, along with all the names of
1720
+ * uniforms. By default, corresponding uniforms (with the same name) are
1721
+ * created for each texture for ease of use. You can also define
1722
+ * different texture properties in the javascript effect by setting it
1723
+ * identical to the property with the passed texture name. In WebGL, it
1724
+ * will be set to the same integer texture unit.
1725
+ *
1726
+ * To do this, test if |value| is identical to a texture. If so, set it
1727
+ * to the texture's index, so the shader can use it.
1728
+ */
1729
+ let i = 0;
1730
+ for (const name in this._userTextures) {
1731
+ const testValue = <span class="cstat-no" title="statement not covered" >val(this, name, reltime);</span>
1732
+ <span class="cstat-no" title="statement not covered" > if (value === testValue) {</span>
1733
+ <span class="cstat-no" title="statement not covered" > value = Shader.INTERNAL_TEXTURE_UNITS + i; </span>// after the internal texture units
1734
+ }
1735
+ &nbsp;
1736
+ <span class="cstat-no" title="statement not covered" > i++;</span>
1737
+ }
1738
+ }
1739
+ &nbsp;
1740
+ if (outputType === "3fv") {
1741
+ // allow 4-component vectors; TODO: why?
1742
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (Array.isArray(value) &amp;&amp; (<span class="branch-1 cbranch-no" title="branch not covered" >value.length === 3 </span>|| <span class="branch-2 cbranch-no" title="branch not covered" >value.length === 4)</span>) {
1743
+ <span class="cstat-no" title="statement not covered" > return value;</span>
1744
+ }
1745
+ &nbsp;
1746
+ // kind of loose so this can be changed if needed
1747
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (typeof value === "object") {
1748
+ return [
1749
+ value.r !== undefined ? value.r : <span class="branch-1 cbranch-no" title="branch not covered" >def,</span>
1750
+ value.g !== undefined ? value.g : <span class="branch-1 cbranch-no" title="branch not covered" >def,</span>
1751
+ value.b !== undefined ? value.b : <span class="branch-1 cbranch-no" title="branch not covered" >def,</span>
1752
+ ];
1753
+ }
1754
+ &nbsp;
1755
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Invalid type: ${outputType} or value: ${value}`);</span>
1756
+ }
1757
+ &nbsp;
1758
+ if (outputType === "4fv") {
1759
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (Array.isArray(value) &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >value.length === 4)</span> {
1760
+ <span class="cstat-no" title="statement not covered" > return value;</span>
1761
+ }
1762
+ &nbsp;
1763
+ // kind of loose so this can be changed if needed
1764
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (typeof value === "object") {
1765
+ return [
1766
+ value.r !== undefined ? value.r : <span class="branch-1 cbranch-no" title="branch not covered" >def,</span>
1767
+ value.g !== undefined ? value.g : <span class="branch-1 cbranch-no" title="branch not covered" >def,</span>
1768
+ value.b !== undefined ? value.b : <span class="branch-1 cbranch-no" title="branch not covered" >def,</span>
1769
+ value.a !== undefined ? <span class="branch-0 cbranch-no" title="branch not covered" >value.a </span>: def,
1770
+ ];
1771
+ }
1772
+ &nbsp;
1773
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Invalid type: ${outputType} or value: ${value}`);</span>
1774
+ }
1775
+ &nbsp;
1776
+ return value;
1777
+ }
1778
+ &nbsp;
1779
+ private static _initRectBuffers(gl) {
1780
+ const position = [
1781
+ // the screen/canvas (output)
1782
+ -1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0,
1783
+ ];
1784
+ const textureCoord = [
1785
+ // the texture/canvas (input)
1786
+ 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0,
1787
+ ];
1788
+ &nbsp;
1789
+ return {
1790
+ position: Shader._initBuffer(gl, position),
1791
+ textureCoord: Shader._initBuffer(gl, textureCoord),
1792
+ };
1793
+ }
1794
+ &nbsp;
1795
+ /**
1796
+ * Creates the quad covering the screen
1797
+ */
1798
+ private static _initBuffer(gl, data) {
1799
+ const buffer = gl.createBuffer();
1800
+ &nbsp;
1801
+ // Select the buffer as the one to apply buffer operations to from here out.
1802
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
1803
+ &nbsp;
1804
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW);
1805
+ &nbsp;
1806
+ return buffer;
1807
+ }
1808
+ &nbsp;
1809
+ /**
1810
+ * Creates a webgl texture from the source.
1811
+ * @param [options] - optional WebGL config for texture
1812
+ * @param [options.target=gl.TEXTURE_2D]
1813
+ * @param [options.level=0]
1814
+ * @param [options.internalFormat=gl.RGBA]
1815
+ * @param [options.srcFormat=gl.RGBA]
1816
+ * @param [options.srcType=gl.UNSIGNED_BYTE]
1817
+ * @param [options.wrapS=gl.CLAMP_TO_EDGE]
1818
+ * @param [options.wrapT=gl.CLAMP_TO_EDGE]
1819
+ * @param [options.minFilter=gl.LINEAR]
1820
+ * @param [options.magFilter=gl.LINEAR]
1821
+ */
1822
+ private static _loadTexture(gl, source, <span class="missing-if-branch" title="if path not taken" >I</span>options: TextureOptions = {}) {
1823
+ // Apply default options, just in case.
1824
+ options = { ...Shader._DEFAULT_TEXTURE_OPTIONS, ...options };
1825
+ // When creating the option, the user can't access `gl` so access it here.
1826
+ const target = gl[options.target];
1827
+ const level = options.level;
1828
+ const internalFormat = gl[options.internalFormat];
1829
+ const srcFormat = gl[options.srcFormat];
1830
+ const srcType = gl[options.srcType];
1831
+ const wrapS = gl[options.wrapS];
1832
+ const wrapT = gl[options.wrapT];
1833
+ const minFilter = gl[options.minFilter];
1834
+ const magFilter = gl[options.magFilter];
1835
+ // TODO: figure out how wrap-s and wrap-t interact with mipmaps
1836
+ // (for legacy support)
1837
+ // let wrapS = options.wrapS ? options.wrapS : gl.CLAMP_TO_EDGE,
1838
+ // wrapT = options.wrapT ? options.wrapT : gl.CLAMP_TO_EDGE;
1839
+ &nbsp;
1840
+ const tex = gl.createTexture();
1841
+ gl.bindTexture(target, tex);
1842
+ &nbsp;
1843
+ // gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true) // premultiply alpha
1844
+ &nbsp;
1845
+ // TODO: figure out how this works with layer width/height
1846
+ &nbsp;
1847
+ // TODO: support 3d textures (change texImage2D)
1848
+ // set to `source`
1849
+ gl.texImage2D(target, level, internalFormat, srcFormat, srcType, source);
1850
+ &nbsp;
1851
+ /*
1852
+ * WebGL1 has different requirements for power of 2 images vs non power of 2
1853
+ * images so check if the image is a power of 2 in both dimensions. Get
1854
+ * dimensions by using the fact that all valid inputs for texImage2D must have
1855
+ * `width` and `height` properties except videos, which have `videoWidth` and
1856
+ * `videoHeight` instead and `ArrayBufferView`, which is one dimensional (so
1857
+ * don't worry about mipmaps)
1858
+ */
1859
+ const w =
1860
+ target instanceof HTMLVideoElement ? <span class="branch-0 cbranch-no" title="branch not covered" >target.videoWidth </span>: target.width;
1861
+ const h =
1862
+ target instanceof HTMLVideoElement ? <span class="branch-0 cbranch-no" title="branch not covered" >target.videoHeight </span>: target.height;
1863
+ gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, minFilter);
1864
+ gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, magFilter);
1865
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (w &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >isPowerOf2(w) </span>&amp;&amp; <span class="branch-2 cbranch-no" title="branch not covered" >h </span>&amp;&amp; <span class="branch-3 cbranch-no" title="branch not covered" >isPowerOf2(h))</span> {
1866
+ // Yes, it's a power of 2. All wrap modes are valid. Generate mips.
1867
+ <span class="cstat-no" title="statement not covered" > gl.texParameteri(target, gl.TEXTURE_WRAP_S, wrapS);</span>
1868
+ <span class="cstat-no" title="statement not covered" > gl.texParameteri(target, gl.TEXTURE_WRAP_T, wrapT);</span>
1869
+ <span class="cstat-no" title="statement not covered" > gl.generateMipmap(target);</span>
1870
+ } else {
1871
+ // No, it's not a power of 2. Turn off mips and set
1872
+ // wrapping to clamp to edge
1873
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (wrapS !== gl.CLAMP_TO_EDGE || wrapT !== gl.CLAMP_TO_EDGE) {
1874
+ <span class="cstat-no" title="statement not covered" > console.warn(</span>
1875
+ "Wrap mode is not CLAMP_TO_EDGE for a non-power-of-two texture. Defaulting to CLAMP_TO_EDGE"
1876
+ );
1877
+ }
1878
+ &nbsp;
1879
+ gl.texParameteri(target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
1880
+ gl.texParameteri(target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
1881
+ }
1882
+ &nbsp;
1883
+ return tex;
1884
+ }
1885
+ &nbsp;
1886
+ private static _initShaderProgram(gl, vertexSrc, fragmentSrc) {
1887
+ const vertexShader = Shader._loadShader(gl, gl.VERTEX_SHADER, vertexSrc);
1888
+ const fragmentShader = Shader._loadShader(
1889
+ gl,
1890
+ gl.FRAGMENT_SHADER,
1891
+ fragmentSrc
1892
+ );
1893
+ &nbsp;
1894
+ const shaderProgram = gl.createProgram();
1895
+ gl.attachShader(shaderProgram, vertexShader);
1896
+ gl.attachShader(shaderProgram, fragmentShader);
1897
+ gl.linkProgram(shaderProgram);
1898
+ &nbsp;
1899
+ // Check program creation status
1900
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
1901
+ <span class="cstat-no" title="statement not covered" > console.warn(</span>
1902
+ "Unable to link shader program: " + gl.getProgramInfoLog(shaderProgram)
1903
+ );
1904
+ <span class="cstat-no" title="statement not covered" > return null;</span>
1905
+ }
1906
+ &nbsp;
1907
+ return shaderProgram;
1908
+ }
1909
+ &nbsp;
1910
+ private static _loadShader(gl, type, source) {
1911
+ const shader = gl.createShader(type);
1912
+ gl.shaderSource(shader, source);
1913
+ gl.compileShader(shader);
1914
+ &nbsp;
1915
+ // Check compile status
1916
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
1917
+ <span class="cstat-no" title="statement not covered" > console.warn(</span>
1918
+ "An error occured compiling shader: " + gl.getShaderInfoLog(shader)
1919
+ );
1920
+ <span class="cstat-no" title="statement not covered" > gl.deleteShader(shader);</span>
1921
+ <span class="cstat-no" title="statement not covered" > return null;</span>
1922
+ }
1923
+ &nbsp;
1924
+ return shader;
1925
+ }
1926
+ }
1927
+ &nbsp;
1928
+ const isPowerOf2 = <span class="fstat-no" title="function not covered" >(v</span>alue) =&gt; <span class="cstat-no" title="statement not covered" >(value &amp;&amp; value - 1) === 0;</span>
1929
+ &nbsp;</pre></td></tr></table></pre>
1930
+
1931
+ <div class='push'></div><!-- for sticky footer -->
1932
+ </div><!-- /wrapper -->
1933
+ <div class='footer quiet pad2 space-top1 center small'>
1934
+ Code coverage generated by
1935
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1936
+ at 2024-01-14T22:33:16.208Z
1937
+ </div>
1938
+ <script src="../../prettify.js"></script>
1939
+ <script>
1940
+ window.onload = function () {
1941
+ prettyPrint();
1942
+ };
1943
+ </script>
1944
+ <script src="../../sorter.js"></script>
1945
+ <script src="../../block-navigation.js"></script>
1946
+ </body>
1947
+ </html>
1948
+