pure-orm 4.0.3 → 4.1.5

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 (204) hide show
  1. package/.benchmarks/bench-core-baseline.json +303 -0
  2. package/README.md +0 -7
  3. package/babel.config.js +4 -1
  4. package/coverage/clover.xml +1549 -1284
  5. package/coverage/coverage-final.json +103 -103
  6. package/coverage/lcov-report/dist/src/core.js.html +610 -379
  7. package/coverage/lcov-report/dist/src/driver-integrations/index.html +20 -20
  8. package/coverage/lcov-report/dist/src/driver-integrations/pgp.js.html +52 -52
  9. package/coverage/lcov-report/dist/src/index.html +28 -28
  10. package/coverage/lcov-report/dist/src/index.js.html +2 -2
  11. package/coverage/lcov-report/dist/src/orm.js.html +392 -209
  12. package/coverage/lcov-report/dist/test-utils/blog/entities.js.html +1 -1
  13. package/coverage/lcov-report/dist/test-utils/blog/index.html +1 -1
  14. package/coverage/lcov-report/dist/test-utils/blog/models/article.js.html +15 -15
  15. package/coverage/lcov-report/dist/test-utils/blog/models/article_tag.js.html +2 -2
  16. package/coverage/lcov-report/dist/test-utils/blog/models/index.html +1 -1
  17. package/coverage/lcov-report/dist/test-utils/blog/models/person.js.html +13 -13
  18. package/coverage/lcov-report/dist/test-utils/blog/models/tag.js.html +1 -1
  19. package/coverage/lcov-report/dist/test-utils/five/entities.js.html +1 -1
  20. package/coverage/lcov-report/dist/test-utils/five/index.html +1 -1
  21. package/coverage/lcov-report/dist/test-utils/five/models/index.html +1 -1
  22. package/coverage/lcov-report/dist/test-utils/five/models/line-item.js.html +4 -4
  23. package/coverage/lcov-report/dist/test-utils/five/models/order.js.html +3 -3
  24. package/coverage/lcov-report/dist/test-utils/five/models/parcel-event.js.html +6 -6
  25. package/coverage/lcov-report/dist/test-utils/five/models/parcel-line-item.js.html +7 -7
  26. package/coverage/lcov-report/dist/test-utils/five/models/parcel.js.html +2 -2
  27. package/coverage/lcov-report/dist/test-utils/fourteen/entities.js.html +1 -1
  28. package/coverage/lcov-report/dist/test-utils/fourteen/index.html +1 -1
  29. package/coverage/lcov-report/dist/test-utils/fourteen/models/customer.js.html +1 -1
  30. package/coverage/lcov-report/dist/test-utils/fourteen/models/index.html +1 -1
  31. package/coverage/lcov-report/dist/test-utils/fourteen/models/person.js.html +1 -1
  32. package/coverage/lcov-report/dist/test-utils/nine/entities.js.html +1 -1
  33. package/coverage/lcov-report/dist/test-utils/nine/index.html +1 -1
  34. package/coverage/lcov-report/dist/test-utils/nine/models/feature-switch.js.html +6 -6
  35. package/coverage/lcov-report/dist/test-utils/nine/models/index.html +1 -1
  36. package/coverage/lcov-report/dist/test-utils/order/entities.js.html +9 -9
  37. package/coverage/lcov-report/dist/test-utils/order/index.html +1 -1
  38. package/coverage/lcov-report/dist/test-utils/order/models/index.html +14 -14
  39. package/coverage/lcov-report/dist/test-utils/order/models/line-item.js.html +24 -24
  40. package/coverage/lcov-report/dist/test-utils/order/models/order.js.html +41 -41
  41. package/coverage/lcov-report/dist/test-utils/order/models/product-variant.js.html +32 -32
  42. package/coverage/lcov-report/dist/test-utils/order/models/product.js.html +17 -17
  43. package/coverage/lcov-report/dist/test-utils/order/models/utm-source.js.html +12 -12
  44. package/coverage/lcov-report/dist/test-utils/order-more/entities.js.html +1 -1
  45. package/coverage/lcov-report/dist/test-utils/order-more/index.html +1 -1
  46. package/coverage/lcov-report/dist/test-utils/order-more/models/actual-product-variant.js.html +3 -3
  47. package/coverage/lcov-report/dist/test-utils/order-more/models/color.js.html +6 -6
  48. package/coverage/lcov-report/dist/test-utils/order-more/models/customer.js.html +3 -3
  49. package/coverage/lcov-report/dist/test-utils/order-more/models/gender.js.html +4 -4
  50. package/coverage/lcov-report/dist/test-utils/order-more/models/index.html +23 -23
  51. package/coverage/lcov-report/dist/test-utils/order-more/models/inventory-level.js.html +11 -11
  52. package/coverage/lcov-report/dist/test-utils/order-more/models/line-item.js.html +15 -15
  53. package/coverage/lcov-report/dist/test-utils/order-more/models/order.js.html +39 -39
  54. package/coverage/lcov-report/dist/test-utils/order-more/models/parcel-event.js.html +6 -6
  55. package/coverage/lcov-report/dist/test-utils/order-more/models/parcel-line-item.js.html +7 -7
  56. package/coverage/lcov-report/dist/test-utils/order-more/models/parcel.js.html +2 -2
  57. package/coverage/lcov-report/dist/test-utils/order-more/models/physical-address.js.html +12 -12
  58. package/coverage/lcov-report/dist/test-utils/order-more/models/product-variant-image.js.html +7 -7
  59. package/coverage/lcov-report/dist/test-utils/order-more/models/product-variant.js.html +22 -22
  60. package/coverage/lcov-report/dist/test-utils/order-more/models/product.js.html +11 -11
  61. package/coverage/lcov-report/dist/test-utils/order-more/models/refund.js.html +11 -11
  62. package/coverage/lcov-report/dist/test-utils/order-more/models/shipment-actual-product-variant.js.html +9 -9
  63. package/coverage/lcov-report/dist/test-utils/order-more/models/shipment.js.html +4 -4
  64. package/coverage/lcov-report/dist/test-utils/order-more/models/size.js.html +4 -4
  65. package/coverage/lcov-report/dist/test-utils/order-more/models/utm-medium.js.html +15 -15
  66. package/coverage/lcov-report/dist/test-utils/order-more/models/utm-source.js.html +17 -17
  67. package/coverage/lcov-report/dist/test-utils/six/entities.js.html +1 -1
  68. package/coverage/lcov-report/dist/test-utils/six/index.html +1 -1
  69. package/coverage/lcov-report/dist/test-utils/six/models/customer.js.html +3 -3
  70. package/coverage/lcov-report/dist/test-utils/six/models/index.html +21 -21
  71. package/coverage/lcov-report/dist/test-utils/six/models/line-item.js.html +10 -10
  72. package/coverage/lcov-report/dist/test-utils/six/models/order.js.html +13 -13
  73. package/coverage/lcov-report/dist/test-utils/six/models/parcel-line-item.js.html +2 -2
  74. package/coverage/lcov-report/dist/test-utils/six/models/parcel.js.html +2 -2
  75. package/coverage/lcov-report/dist/test-utils/thirteen/entities.js.html +1 -1
  76. package/coverage/lcov-report/dist/test-utils/thirteen/index.html +1 -1
  77. package/coverage/lcov-report/dist/test-utils/thirteen/models/audience.js.html +2 -2
  78. package/coverage/lcov-report/dist/test-utils/thirteen/models/brand.js.html +2 -2
  79. package/coverage/lcov-report/dist/test-utils/thirteen/models/category.js.html +1 -1
  80. package/coverage/lcov-report/dist/test-utils/thirteen/models/index.html +14 -14
  81. package/coverage/lcov-report/dist/test-utils/thirteen/models/member.js.html +2 -2
  82. package/coverage/lcov-report/dist/test-utils/thirteen/models/passion.js.html +2 -2
  83. package/coverage/lcov-report/dist/test-utils/thirteen/models/product.js.html +10 -10
  84. package/coverage/lcov-report/dist/test-utils/thirteen/models/recommendation-audience.js.html +2 -2
  85. package/coverage/lcov-report/dist/test-utils/thirteen/models/recommendation.js.html +2 -2
  86. package/coverage/lcov-report/dist/test-utils/three/index.html +1 -1
  87. package/coverage/lcov-report/dist/test-utils/three/results.js.html +1 -1
  88. package/coverage/lcov-report/dist/test-utils/twelve/entities.js.html +1 -1
  89. package/coverage/lcov-report/dist/test-utils/twelve/index.html +1 -1
  90. package/coverage/lcov-report/dist/test-utils/twelve/models/index.html +1 -1
  91. package/coverage/lcov-report/dist/test-utils/twelve/models/member.js.html +1 -1
  92. package/coverage/lcov-report/dist/test-utils/twelve/models/prompt.js.html +2 -2
  93. package/coverage/lcov-report/dist/test-utils/two/index.html +1 -1
  94. package/coverage/lcov-report/dist/test-utils/two/results.js.html +1 -1
  95. package/coverage/lcov-report/index.html +103 -103
  96. package/coverage/lcov-report/src/core.ts.html +853 -415
  97. package/coverage/lcov-report/src/driver-integrations/index.html +20 -20
  98. package/coverage/lcov-report/src/driver-integrations/pgp.ts.html +58 -58
  99. package/coverage/lcov-report/src/index.html +28 -28
  100. package/coverage/lcov-report/src/index.ts.html +1 -1
  101. package/coverage/lcov-report/src/orm.ts.html +361 -298
  102. package/coverage/lcov-report/test-utils/blog/entities.ts.html +1 -1
  103. package/coverage/lcov-report/test-utils/blog/index.html +1 -1
  104. package/coverage/lcov-report/test-utils/blog/models/article.ts.html +15 -15
  105. package/coverage/lcov-report/test-utils/blog/models/article_tag.ts.html +2 -2
  106. package/coverage/lcov-report/test-utils/blog/models/index.html +1 -1
  107. package/coverage/lcov-report/test-utils/blog/models/person.ts.html +13 -13
  108. package/coverage/lcov-report/test-utils/blog/models/tag.ts.html +1 -1
  109. package/coverage/lcov-report/test-utils/five/entities.ts.html +1 -1
  110. package/coverage/lcov-report/test-utils/five/index.html +1 -1
  111. package/coverage/lcov-report/test-utils/five/models/index.html +1 -1
  112. package/coverage/lcov-report/test-utils/five/models/line-item.ts.html +4 -4
  113. package/coverage/lcov-report/test-utils/five/models/order.ts.html +3 -3
  114. package/coverage/lcov-report/test-utils/five/models/parcel-event.ts.html +6 -6
  115. package/coverage/lcov-report/test-utils/five/models/parcel-line-item.ts.html +7 -7
  116. package/coverage/lcov-report/test-utils/five/models/parcel.ts.html +2 -2
  117. package/coverage/lcov-report/test-utils/fourteen/entities.ts.html +1 -1
  118. package/coverage/lcov-report/test-utils/fourteen/index.html +1 -1
  119. package/coverage/lcov-report/test-utils/fourteen/models/customer.ts.html +1 -1
  120. package/coverage/lcov-report/test-utils/fourteen/models/index.html +1 -1
  121. package/coverage/lcov-report/test-utils/fourteen/models/person.ts.html +1 -1
  122. package/coverage/lcov-report/test-utils/nine/entities.ts.html +1 -1
  123. package/coverage/lcov-report/test-utils/nine/index.html +1 -1
  124. package/coverage/lcov-report/test-utils/nine/models/feature-switch.ts.html +8 -8
  125. package/coverage/lcov-report/test-utils/nine/models/index.html +1 -1
  126. package/coverage/lcov-report/test-utils/order/entities.ts.html +2 -2
  127. package/coverage/lcov-report/test-utils/order/index.html +1 -1
  128. package/coverage/lcov-report/test-utils/order/models/index.html +14 -14
  129. package/coverage/lcov-report/test-utils/order/models/line-item.ts.html +18 -18
  130. package/coverage/lcov-report/test-utils/order/models/order.ts.html +36 -36
  131. package/coverage/lcov-report/test-utils/order/models/product-variant.ts.html +27 -27
  132. package/coverage/lcov-report/test-utils/order/models/product.ts.html +13 -13
  133. package/coverage/lcov-report/test-utils/order/models/utm-source.ts.html +8 -8
  134. package/coverage/lcov-report/test-utils/order-more/entities.ts.html +1 -1
  135. package/coverage/lcov-report/test-utils/order-more/index.html +1 -1
  136. package/coverage/lcov-report/test-utils/order-more/models/actual-product-variant.ts.html +3 -3
  137. package/coverage/lcov-report/test-utils/order-more/models/color.ts.html +6 -6
  138. package/coverage/lcov-report/test-utils/order-more/models/customer.ts.html +3 -3
  139. package/coverage/lcov-report/test-utils/order-more/models/gender.ts.html +4 -4
  140. package/coverage/lcov-report/test-utils/order-more/models/index.html +23 -23
  141. package/coverage/lcov-report/test-utils/order-more/models/inventory-level.ts.html +11 -11
  142. package/coverage/lcov-report/test-utils/order-more/models/line-item.ts.html +15 -15
  143. package/coverage/lcov-report/test-utils/order-more/models/order.ts.html +45 -45
  144. package/coverage/lcov-report/test-utils/order-more/models/parcel-event.ts.html +6 -6
  145. package/coverage/lcov-report/test-utils/order-more/models/parcel-line-item.ts.html +7 -7
  146. package/coverage/lcov-report/test-utils/order-more/models/parcel.ts.html +2 -2
  147. package/coverage/lcov-report/test-utils/order-more/models/physical-address.ts.html +12 -12
  148. package/coverage/lcov-report/test-utils/order-more/models/product-variant-image.ts.html +7 -7
  149. package/coverage/lcov-report/test-utils/order-more/models/product-variant.ts.html +22 -22
  150. package/coverage/lcov-report/test-utils/order-more/models/product.ts.html +11 -11
  151. package/coverage/lcov-report/test-utils/order-more/models/refund.ts.html +11 -11
  152. package/coverage/lcov-report/test-utils/order-more/models/shipment-actual-product-variant.ts.html +9 -9
  153. package/coverage/lcov-report/test-utils/order-more/models/shipment.ts.html +4 -4
  154. package/coverage/lcov-report/test-utils/order-more/models/size.ts.html +4 -4
  155. package/coverage/lcov-report/test-utils/order-more/models/utm-medium.ts.html +15 -15
  156. package/coverage/lcov-report/test-utils/order-more/models/utm-source.ts.html +17 -17
  157. package/coverage/lcov-report/test-utils/six/entities.ts.html +1 -1
  158. package/coverage/lcov-report/test-utils/six/index.html +1 -1
  159. package/coverage/lcov-report/test-utils/six/models/customer.ts.html +3 -3
  160. package/coverage/lcov-report/test-utils/six/models/index.html +21 -21
  161. package/coverage/lcov-report/test-utils/six/models/line-item.ts.html +10 -10
  162. package/coverage/lcov-report/test-utils/six/models/order.ts.html +13 -13
  163. package/coverage/lcov-report/test-utils/six/models/parcel-line-item.ts.html +2 -2
  164. package/coverage/lcov-report/test-utils/six/models/parcel.ts.html +2 -2
  165. package/coverage/lcov-report/test-utils/thirteen/entities.ts.html +1 -1
  166. package/coverage/lcov-report/test-utils/thirteen/index.html +1 -1
  167. package/coverage/lcov-report/test-utils/thirteen/models/audience.ts.html +2 -2
  168. package/coverage/lcov-report/test-utils/thirteen/models/brand.ts.html +2 -2
  169. package/coverage/lcov-report/test-utils/thirteen/models/category.ts.html +1 -1
  170. package/coverage/lcov-report/test-utils/thirteen/models/index.html +14 -14
  171. package/coverage/lcov-report/test-utils/thirteen/models/member.ts.html +2 -2
  172. package/coverage/lcov-report/test-utils/thirteen/models/passion.ts.html +2 -2
  173. package/coverage/lcov-report/test-utils/thirteen/models/product.ts.html +10 -10
  174. package/coverage/lcov-report/test-utils/thirteen/models/recommendation-audience.ts.html +2 -2
  175. package/coverage/lcov-report/test-utils/thirteen/models/recommendation.ts.html +2 -2
  176. package/coverage/lcov-report/test-utils/three/index.html +1 -1
  177. package/coverage/lcov-report/test-utils/three/results.js.html +1 -1
  178. package/coverage/lcov-report/test-utils/twelve/entities.ts.html +1 -1
  179. package/coverage/lcov-report/test-utils/twelve/index.html +1 -1
  180. package/coverage/lcov-report/test-utils/twelve/models/index.html +1 -1
  181. package/coverage/lcov-report/test-utils/twelve/models/member.ts.html +1 -1
  182. package/coverage/lcov-report/test-utils/twelve/models/prompt.ts.html +2 -2
  183. package/coverage/lcov-report/test-utils/two/index.html +1 -1
  184. package/coverage/lcov-report/test-utils/two/results.js.html +1 -1
  185. package/coverage/lcov.info +2196 -2047
  186. package/dist/src/core.d.ts +6 -0
  187. package/dist/src/core.js +265 -188
  188. package/dist/src/core.spec.js +424 -0
  189. package/dist/src/driver-integrations/pgp.spec.d.ts +1 -0
  190. package/dist/src/driver-integrations/pgp.spec.js +376 -0
  191. package/dist/src/orm.d.ts +1 -1
  192. package/dist/src/orm.js +137 -76
  193. package/dist/src/orm.spec.js +535 -85
  194. package/dist/test-utils/nine/models/feature-switch.d.ts +2 -2
  195. package/dist/test-utils/nine/models/feature-switch.ts +2 -2
  196. package/package.json +5 -3
  197. package/scripts/bench-core.js +636 -0
  198. package/scripts/check-bench-scenarios.js +47 -0
  199. package/src/core.spec.ts +498 -2
  200. package/src/core.ts +373 -227
  201. package/src/driver-integrations/pgp.spec.ts +444 -0
  202. package/src/orm.spec.ts +592 -88
  203. package/src/orm.ts +149 -128
  204. package/test-utils/nine/models/feature-switch.ts +2 -2
@@ -20,24 +20,24 @@
20
20
  </h1>
21
21
  <div class='clearfix'>
22
22
  <div class='fl pad1y space-right2'>
23
- <span class="strong">95.16% </span>
23
+ <span class="strong">98.88% </span>
24
24
  <span class="quiet">Statements</span>
25
- <span class='fraction'>177/186</span>
25
+ <span class='fraction'>266/269</span>
26
26
  </div>
27
27
  <div class='fl pad1y space-right2'>
28
- <span class="strong">88.12% </span>
28
+ <span class="strong">91.89% </span>
29
29
  <span class="quiet">Branches</span>
30
- <span class='fraction'>89/101</span>
30
+ <span class='fraction'>102/111</span>
31
31
  </div>
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">98% </span>
33
+ <span class="strong">100% </span>
34
34
  <span class="quiet">Functions</span>
35
- <span class='fraction'>49/50</span>
35
+ <span class='fraction'>30/30</span>
36
36
  </div>
37
37
  <div class='fl pad1y space-right2'>
38
- <span class="strong">95.53% </span>
38
+ <span class="strong">98.81% </span>
39
39
  <span class="quiet">Lines</span>
40
- <span class='fraction'>171/179</span>
40
+ <span class='fraction'>249/252</span>
41
41
  </div>
42
42
  </div>
43
43
  <p class="quiet">
@@ -567,7 +567,153 @@
567
567
  <a name='L519'></a><a href='#L519'>519</a>
568
568
  <a name='L520'></a><a href='#L520'>520</a>
569
569
  <a name='L521'></a><a href='#L521'>521</a>
570
- <a name='L522'></a><a href='#L522'>522</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
570
+ <a name='L522'></a><a href='#L522'>522</a>
571
+ <a name='L523'></a><a href='#L523'>523</a>
572
+ <a name='L524'></a><a href='#L524'>524</a>
573
+ <a name='L525'></a><a href='#L525'>525</a>
574
+ <a name='L526'></a><a href='#L526'>526</a>
575
+ <a name='L527'></a><a href='#L527'>527</a>
576
+ <a name='L528'></a><a href='#L528'>528</a>
577
+ <a name='L529'></a><a href='#L529'>529</a>
578
+ <a name='L530'></a><a href='#L530'>530</a>
579
+ <a name='L531'></a><a href='#L531'>531</a>
580
+ <a name='L532'></a><a href='#L532'>532</a>
581
+ <a name='L533'></a><a href='#L533'>533</a>
582
+ <a name='L534'></a><a href='#L534'>534</a>
583
+ <a name='L535'></a><a href='#L535'>535</a>
584
+ <a name='L536'></a><a href='#L536'>536</a>
585
+ <a name='L537'></a><a href='#L537'>537</a>
586
+ <a name='L538'></a><a href='#L538'>538</a>
587
+ <a name='L539'></a><a href='#L539'>539</a>
588
+ <a name='L540'></a><a href='#L540'>540</a>
589
+ <a name='L541'></a><a href='#L541'>541</a>
590
+ <a name='L542'></a><a href='#L542'>542</a>
591
+ <a name='L543'></a><a href='#L543'>543</a>
592
+ <a name='L544'></a><a href='#L544'>544</a>
593
+ <a name='L545'></a><a href='#L545'>545</a>
594
+ <a name='L546'></a><a href='#L546'>546</a>
595
+ <a name='L547'></a><a href='#L547'>547</a>
596
+ <a name='L548'></a><a href='#L548'>548</a>
597
+ <a name='L549'></a><a href='#L549'>549</a>
598
+ <a name='L550'></a><a href='#L550'>550</a>
599
+ <a name='L551'></a><a href='#L551'>551</a>
600
+ <a name='L552'></a><a href='#L552'>552</a>
601
+ <a name='L553'></a><a href='#L553'>553</a>
602
+ <a name='L554'></a><a href='#L554'>554</a>
603
+ <a name='L555'></a><a href='#L555'>555</a>
604
+ <a name='L556'></a><a href='#L556'>556</a>
605
+ <a name='L557'></a><a href='#L557'>557</a>
606
+ <a name='L558'></a><a href='#L558'>558</a>
607
+ <a name='L559'></a><a href='#L559'>559</a>
608
+ <a name='L560'></a><a href='#L560'>560</a>
609
+ <a name='L561'></a><a href='#L561'>561</a>
610
+ <a name='L562'></a><a href='#L562'>562</a>
611
+ <a name='L563'></a><a href='#L563'>563</a>
612
+ <a name='L564'></a><a href='#L564'>564</a>
613
+ <a name='L565'></a><a href='#L565'>565</a>
614
+ <a name='L566'></a><a href='#L566'>566</a>
615
+ <a name='L567'></a><a href='#L567'>567</a>
616
+ <a name='L568'></a><a href='#L568'>568</a>
617
+ <a name='L569'></a><a href='#L569'>569</a>
618
+ <a name='L570'></a><a href='#L570'>570</a>
619
+ <a name='L571'></a><a href='#L571'>571</a>
620
+ <a name='L572'></a><a href='#L572'>572</a>
621
+ <a name='L573'></a><a href='#L573'>573</a>
622
+ <a name='L574'></a><a href='#L574'>574</a>
623
+ <a name='L575'></a><a href='#L575'>575</a>
624
+ <a name='L576'></a><a href='#L576'>576</a>
625
+ <a name='L577'></a><a href='#L577'>577</a>
626
+ <a name='L578'></a><a href='#L578'>578</a>
627
+ <a name='L579'></a><a href='#L579'>579</a>
628
+ <a name='L580'></a><a href='#L580'>580</a>
629
+ <a name='L581'></a><a href='#L581'>581</a>
630
+ <a name='L582'></a><a href='#L582'>582</a>
631
+ <a name='L583'></a><a href='#L583'>583</a>
632
+ <a name='L584'></a><a href='#L584'>584</a>
633
+ <a name='L585'></a><a href='#L585'>585</a>
634
+ <a name='L586'></a><a href='#L586'>586</a>
635
+ <a name='L587'></a><a href='#L587'>587</a>
636
+ <a name='L588'></a><a href='#L588'>588</a>
637
+ <a name='L589'></a><a href='#L589'>589</a>
638
+ <a name='L590'></a><a href='#L590'>590</a>
639
+ <a name='L591'></a><a href='#L591'>591</a>
640
+ <a name='L592'></a><a href='#L592'>592</a>
641
+ <a name='L593'></a><a href='#L593'>593</a>
642
+ <a name='L594'></a><a href='#L594'>594</a>
643
+ <a name='L595'></a><a href='#L595'>595</a>
644
+ <a name='L596'></a><a href='#L596'>596</a>
645
+ <a name='L597'></a><a href='#L597'>597</a>
646
+ <a name='L598'></a><a href='#L598'>598</a>
647
+ <a name='L599'></a><a href='#L599'>599</a>
648
+ <a name='L600'></a><a href='#L600'>600</a>
649
+ <a name='L601'></a><a href='#L601'>601</a>
650
+ <a name='L602'></a><a href='#L602'>602</a>
651
+ <a name='L603'></a><a href='#L603'>603</a>
652
+ <a name='L604'></a><a href='#L604'>604</a>
653
+ <a name='L605'></a><a href='#L605'>605</a>
654
+ <a name='L606'></a><a href='#L606'>606</a>
655
+ <a name='L607'></a><a href='#L607'>607</a>
656
+ <a name='L608'></a><a href='#L608'>608</a>
657
+ <a name='L609'></a><a href='#L609'>609</a>
658
+ <a name='L610'></a><a href='#L610'>610</a>
659
+ <a name='L611'></a><a href='#L611'>611</a>
660
+ <a name='L612'></a><a href='#L612'>612</a>
661
+ <a name='L613'></a><a href='#L613'>613</a>
662
+ <a name='L614'></a><a href='#L614'>614</a>
663
+ <a name='L615'></a><a href='#L615'>615</a>
664
+ <a name='L616'></a><a href='#L616'>616</a>
665
+ <a name='L617'></a><a href='#L617'>617</a>
666
+ <a name='L618'></a><a href='#L618'>618</a>
667
+ <a name='L619'></a><a href='#L619'>619</a>
668
+ <a name='L620'></a><a href='#L620'>620</a>
669
+ <a name='L621'></a><a href='#L621'>621</a>
670
+ <a name='L622'></a><a href='#L622'>622</a>
671
+ <a name='L623'></a><a href='#L623'>623</a>
672
+ <a name='L624'></a><a href='#L624'>624</a>
673
+ <a name='L625'></a><a href='#L625'>625</a>
674
+ <a name='L626'></a><a href='#L626'>626</a>
675
+ <a name='L627'></a><a href='#L627'>627</a>
676
+ <a name='L628'></a><a href='#L628'>628</a>
677
+ <a name='L629'></a><a href='#L629'>629</a>
678
+ <a name='L630'></a><a href='#L630'>630</a>
679
+ <a name='L631'></a><a href='#L631'>631</a>
680
+ <a name='L632'></a><a href='#L632'>632</a>
681
+ <a name='L633'></a><a href='#L633'>633</a>
682
+ <a name='L634'></a><a href='#L634'>634</a>
683
+ <a name='L635'></a><a href='#L635'>635</a>
684
+ <a name='L636'></a><a href='#L636'>636</a>
685
+ <a name='L637'></a><a href='#L637'>637</a>
686
+ <a name='L638'></a><a href='#L638'>638</a>
687
+ <a name='L639'></a><a href='#L639'>639</a>
688
+ <a name='L640'></a><a href='#L640'>640</a>
689
+ <a name='L641'></a><a href='#L641'>641</a>
690
+ <a name='L642'></a><a href='#L642'>642</a>
691
+ <a name='L643'></a><a href='#L643'>643</a>
692
+ <a name='L644'></a><a href='#L644'>644</a>
693
+ <a name='L645'></a><a href='#L645'>645</a>
694
+ <a name='L646'></a><a href='#L646'>646</a>
695
+ <a name='L647'></a><a href='#L647'>647</a>
696
+ <a name='L648'></a><a href='#L648'>648</a>
697
+ <a name='L649'></a><a href='#L649'>649</a>
698
+ <a name='L650'></a><a href='#L650'>650</a>
699
+ <a name='L651'></a><a href='#L651'>651</a>
700
+ <a name='L652'></a><a href='#L652'>652</a>
701
+ <a name='L653'></a><a href='#L653'>653</a>
702
+ <a name='L654'></a><a href='#L654'>654</a>
703
+ <a name='L655'></a><a href='#L655'>655</a>
704
+ <a name='L656'></a><a href='#L656'>656</a>
705
+ <a name='L657'></a><a href='#L657'>657</a>
706
+ <a name='L658'></a><a href='#L658'>658</a>
707
+ <a name='L659'></a><a href='#L659'>659</a>
708
+ <a name='L660'></a><a href='#L660'>660</a>
709
+ <a name='L661'></a><a href='#L661'>661</a>
710
+ <a name='L662'></a><a href='#L662'>662</a>
711
+ <a name='L663'></a><a href='#L663'>663</a>
712
+ <a name='L664'></a><a href='#L664'>664</a>
713
+ <a name='L665'></a><a href='#L665'>665</a>
714
+ <a name='L666'></a><a href='#L666'>666</a>
715
+ <a name='L667'></a><a href='#L667'>667</a>
716
+ <a name='L668'></a><a href='#L668'>668</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
571
717
  <span class="cline-any cline-neutral">&nbsp;</span>
572
718
  <span class="cline-any cline-neutral">&nbsp;</span>
573
719
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -664,132 +810,179 @@
664
810
  <span class="cline-any cline-neutral">&nbsp;</span>
665
811
  <span class="cline-any cline-neutral">&nbsp;</span>
666
812
  <span class="cline-any cline-neutral">&nbsp;</span>
813
+ <span class="cline-any cline-neutral">&nbsp;</span>
814
+ <span class="cline-any cline-neutral">&nbsp;</span>
815
+ <span class="cline-any cline-neutral">&nbsp;</span>
816
+ <span class="cline-any cline-yes">3x</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-yes">126x</span>
820
+ <span class="cline-any cline-neutral">&nbsp;</span>
821
+ <span class="cline-any cline-yes">514x</span>
822
+ <span class="cline-any cline-yes">514x</span>
823
+ <span class="cline-any cline-neutral">&nbsp;</span>
824
+ <span class="cline-any cline-yes">514x</span>
825
+ <span class="cline-any cline-yes">514x</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">4858x</span>
829
+ <span class="cline-any cline-yes">4396x</span>
830
+ <span class="cline-any cline-neutral">&nbsp;</span>
831
+ <span class="cline-any cline-neutral">&nbsp;</span>
832
+ <span class="cline-any cline-neutral">&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">462x</span>
836
+ <span class="cline-any cline-neutral">&nbsp;</span>
837
+ <span class="cline-any cline-neutral">&nbsp;</span>
838
+ <span class="cline-any cline-neutral">&nbsp;</span>
839
+ <span class="cline-any cline-neutral">&nbsp;</span>
840
+ <span class="cline-any cline-neutral">&nbsp;</span>
841
+ <span class="cline-any cline-neutral">&nbsp;</span>
842
+ <span class="cline-any cline-yes">514x</span>
843
+ <span class="cline-any cline-yes">4858x</span>
844
+ <span class="cline-any cline-neutral">&nbsp;</span>
845
+ <span class="cline-any cline-yes">4858x</span>
846
+ <span class="cline-any cline-yes">514x</span>
847
+ <span class="cline-any cline-yes">4858x</span>
848
+ <span class="cline-any cline-neutral">&nbsp;</span>
849
+ <span class="cline-any cline-yes">514x</span>
850
+ <span class="cline-any cline-yes">514x</span>
851
+ <span class="cline-any cline-neutral">&nbsp;</span>
852
+ <span class="cline-any cline-yes">514x</span>
853
+ <span class="cline-any cline-yes">4858x</span>
854
+ <span class="cline-any cline-neutral">&nbsp;</span>
855
+ <span class="cline-any cline-yes">514x</span>
856
+ <span class="cline-any cline-yes">514x</span>
857
+ <span class="cline-any cline-neutral">&nbsp;</span>
858
+ <span class="cline-any cline-yes">514x</span>
859
+ <span class="cline-any cline-yes">1x</span>
860
+ <span class="cline-any cline-yes">1x</span>
667
861
  <span class="cline-any cline-yes">2x</span>
862
+ <span class="cline-any cline-yes">2x</span>
863
+ <span class="cline-any cline-yes">2x</span>
864
+ <span class="cline-any cline-neutral">&nbsp;</span>
865
+ <span class="cline-any cline-neutral">&nbsp;</span>
866
+ <span class="cline-any cline-yes">1x</span>
668
867
  <span class="cline-any cline-neutral">&nbsp;</span>
669
868
  <span class="cline-any cline-neutral">&nbsp;</span>
670
- <span class="cline-any cline-yes">34x</span>
869
+ <span class="cline-any cline-yes">514x</span>
671
870
  <span class="cline-any cline-neutral">&nbsp;</span>
672
- <span class="cline-any cline-yes">227x</span>
673
- <span class="cline-any cline-yes">227x</span>
674
871
  <span class="cline-any cline-neutral">&nbsp;</span>
675
- <span class="cline-any cline-yes">227x</span>
676
- <span class="cline-any cline-yes">227x</span>
677
872
  <span class="cline-any cline-neutral">&nbsp;</span>
873
+ <span class="cline-any cline-yes">514x</span>
874
+ <span class="cline-any cline-yes">514x</span>
875
+ <span class="cline-any cline-yes">4858x</span>
876
+ <span class="cline-any cline-yes">396x</span>
877
+ <span class="cline-any cline-yes">396x</span>
678
878
  <span class="cline-any cline-neutral">&nbsp;</span>
679
- <span class="cline-any cline-yes">1793x</span>
680
- <span class="cline-any cline-yes">1580x</span>
681
879
  <span class="cline-any cline-neutral">&nbsp;</span>
682
880
  <span class="cline-any cline-neutral">&nbsp;</span>
683
881
  <span class="cline-any cline-neutral">&nbsp;</span>
684
882
  <span class="cline-any cline-neutral">&nbsp;</span>
685
883
  <span class="cline-any cline-neutral">&nbsp;</span>
686
- <span class="cline-any cline-yes">213x</span>
884
+ <span class="cline-any cline-yes">514x</span>
885
+ <span class="cline-any cline-yes">514x</span>
886
+ <span class="cline-any cline-yes">514x</span>
887
+ <span class="cline-any cline-yes">4858x</span>
888
+ <span class="cline-any cline-yes">4858x</span>
687
889
  <span class="cline-any cline-neutral">&nbsp;</span>
688
890
  <span class="cline-any cline-neutral">&nbsp;</span>
891
+ <span class="cline-any cline-yes">514x</span>
689
892
  <span class="cline-any cline-neutral">&nbsp;</span>
690
893
  <span class="cline-any cline-neutral">&nbsp;</span>
894
+ <span class="cline-any cline-yes">4858x</span>
691
895
  <span class="cline-any cline-neutral">&nbsp;</span>
692
896
  <span class="cline-any cline-neutral">&nbsp;</span>
693
- <span class="cline-any cline-yes">227x</span>
694
- <span class="cline-any cline-yes">1793x</span>
695
897
  <span class="cline-any cline-neutral">&nbsp;</span>
696
- <span class="cline-any cline-yes">1793x</span>
697
- <span class="cline-any cline-yes">227x</span>
698
- <span class="cline-any cline-yes">1793x</span>
898
+ <span class="cline-any cline-yes">514x</span>
699
899
  <span class="cline-any cline-neutral">&nbsp;</span>
700
- <span class="cline-any cline-yes">227x</span>
701
- <span class="cline-any cline-yes">227x</span>
702
900
  <span class="cline-any cline-neutral">&nbsp;</span>
703
- <span class="cline-any cline-yes">227x</span>
704
- <span class="cline-any cline-yes">1793x</span>
705
901
  <span class="cline-any cline-neutral">&nbsp;</span>
706
- <span class="cline-any cline-yes">227x</span>
707
- <span class="cline-any cline-yes">227x</span>
708
902
  <span class="cline-any cline-neutral">&nbsp;</span>
709
903
  <span class="cline-any cline-neutral">&nbsp;</span>
710
- <span class="cline-any cline-yes">227x</span>
711
- <span class="cline-any cline-yes">3611x</span>
712
- <span class="cline-any cline-yes">3611x</span>
713
904
  <span class="cline-any cline-neutral">&nbsp;</span>
714
905
  <span class="cline-any cline-neutral">&nbsp;</span>
715
906
  <span class="cline-any cline-neutral">&nbsp;</span>
716
- <span class="cline-any cline-yes">227x</span>
717
- <span class="cline-any cline-yes">1793x</span>
718
907
  <span class="cline-any cline-neutral">&nbsp;</span>
719
908
  <span class="cline-any cline-neutral">&nbsp;</span>
720
- <span class="cline-any cline-yes">201x</span>
721
909
  <span class="cline-any cline-neutral">&nbsp;</span>
722
910
  <span class="cline-any cline-neutral">&nbsp;</span>
723
911
  <span class="cline-any cline-neutral">&nbsp;</span>
724
912
  <span class="cline-any cline-neutral">&nbsp;</span>
725
913
  <span class="cline-any cline-neutral">&nbsp;</span>
726
- <span class="cline-any cline-yes">227x</span>
727
914
  <span class="cline-any cline-neutral">&nbsp;</span>
728
915
  <span class="cline-any cline-neutral">&nbsp;</span>
729
- <span class="cline-any cline-yes">1793x</span>
730
916
  <span class="cline-any cline-neutral">&nbsp;</span>
731
917
  <span class="cline-any cline-neutral">&nbsp;</span>
732
918
  <span class="cline-any cline-neutral">&nbsp;</span>
733
- <span class="cline-any cline-yes">227x</span>
919
+ <span class="cline-any cline-yes">126x</span>
734
920
  <span class="cline-any cline-neutral">&nbsp;</span>
735
921
  <span class="cline-any cline-neutral">&nbsp;</span>
736
922
  <span class="cline-any cline-neutral">&nbsp;</span>
737
923
  <span class="cline-any cline-neutral">&nbsp;</span>
924
+ <span class="cline-any cline-yes">514x</span>
925
+ <span class="cline-any cline-yes">514x</span>
738
926
  <span class="cline-any cline-neutral">&nbsp;</span>
739
927
  <span class="cline-any cline-neutral">&nbsp;</span>
740
928
  <span class="cline-any cline-neutral">&nbsp;</span>
741
929
  <span class="cline-any cline-neutral">&nbsp;</span>
930
+ <span class="cline-any cline-yes">126x</span>
931
+ <span class="cline-any cline-yes">169x</span>
932
+ <span class="cline-any cline-yes">169x</span>
933
+ <span class="cline-any cline-yes">1x</span>
742
934
  <span class="cline-any cline-neutral">&nbsp;</span>
935
+ <span class="cline-any cline-yes">168x</span>
743
936
  <span class="cline-any cline-neutral">&nbsp;</span>
744
937
  <span class="cline-any cline-neutral">&nbsp;</span>
938
+ <span class="cline-any cline-yes">126x</span>
745
939
  <span class="cline-any cline-neutral">&nbsp;</span>
746
940
  <span class="cline-any cline-neutral">&nbsp;</span>
747
941
  <span class="cline-any cline-neutral">&nbsp;</span>
748
942
  <span class="cline-any cline-neutral">&nbsp;</span>
943
+ <span class="cline-any cline-yes">514x</span>
944
+ <span class="cline-any cline-yes">514x</span>
749
945
  <span class="cline-any cline-neutral">&nbsp;</span>
750
946
  <span class="cline-any cline-neutral">&nbsp;</span>
751
- <span class="cline-any cline-yes">34x</span>
752
947
  <span class="cline-any cline-neutral">&nbsp;</span>
753
948
  <span class="cline-any cline-neutral">&nbsp;</span>
949
+ <span class="cline-any cline-yes">126x</span>
754
950
  <span class="cline-any cline-neutral">&nbsp;</span>
755
951
  <span class="cline-any cline-neutral">&nbsp;</span>
756
- <span class="cline-any cline-yes">227x</span>
757
- <span class="cline-any cline-yes">227x</span>
952
+ <span class="cline-any cline-yes">500x</span>
953
+ <span class="cline-any cline-yes">500x</span>
954
+ <span class="cline-any cline-yes">1x</span>
758
955
  <span class="cline-any cline-neutral">&nbsp;</span>
956
+ <span class="cline-any cline-yes">499x</span>
759
957
  <span class="cline-any cline-neutral">&nbsp;</span>
760
958
  <span class="cline-any cline-neutral">&nbsp;</span>
959
+ <span class="cline-any cline-yes">126x</span>
960
+ <span class="cline-any cline-yes">103x</span>
761
961
  <span class="cline-any cline-neutral">&nbsp;</span>
762
- <span class="cline-any cline-yes">34x</span>
763
- <span class="cline-any cline-yes">1435x</span>
764
- <span class="cline-any cline-yes">1435x</span>
765
- <span class="cline-any cline-no">&nbsp;</span>
766
962
  <span class="cline-any cline-neutral">&nbsp;</span>
767
- <span class="cline-any cline-yes">1435x</span>
963
+ <span class="cline-any cline-yes">126x</span>
768
964
  <span class="cline-any cline-neutral">&nbsp;</span>
769
965
  <span class="cline-any cline-neutral">&nbsp;</span>
770
- <span class="cline-any cline-yes">34x</span>
771
966
  <span class="cline-any cline-neutral">&nbsp;</span>
967
+ <span class="cline-any cline-yes">126x</span>
968
+ <span class="cline-any cline-yes">514x</span>
969
+ <span class="cline-any cline-yes">514x</span>
772
970
  <span class="cline-any cline-neutral">&nbsp;</span>
773
971
  <span class="cline-any cline-neutral">&nbsp;</span>
774
972
  <span class="cline-any cline-neutral">&nbsp;</span>
775
- <span class="cline-any cline-yes">227x</span>
776
- <span class="cline-any cline-yes">227x</span>
973
+ <span class="cline-any cline-yes">514x</span>
974
+ <span class="cline-any cline-yes">396x</span>
975
+ <span class="cline-any cline-yes">396x</span>
777
976
  <span class="cline-any cline-neutral">&nbsp;</span>
778
977
  <span class="cline-any cline-neutral">&nbsp;</span>
779
978
  <span class="cline-any cline-neutral">&nbsp;</span>
780
979
  <span class="cline-any cline-neutral">&nbsp;</span>
781
- <span class="cline-any cline-yes">34x</span>
980
+ <span class="cline-any cline-yes">514x</span>
782
981
  <span class="cline-any cline-neutral">&nbsp;</span>
783
982
  <span class="cline-any cline-neutral">&nbsp;</span>
784
- <span class="cline-any cline-yes">42896x</span>
785
- <span class="cline-any cline-yes">42896x</span>
786
- <span class="cline-any cline-no">&nbsp;</span>
787
983
  <span class="cline-any cline-neutral">&nbsp;</span>
788
- <span class="cline-any cline-yes">42896x</span>
789
984
  <span class="cline-any cline-neutral">&nbsp;</span>
790
985
  <span class="cline-any cline-neutral">&nbsp;</span>
791
- <span class="cline-any cline-yes">34x</span>
792
- <span class="cline-any cline-yes">42895x</span>
793
986
  <span class="cline-any cline-neutral">&nbsp;</span>
794
987
  <span class="cline-any cline-neutral">&nbsp;</span>
795
988
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -797,152 +990,175 @@
797
990
  <span class="cline-any cline-neutral">&nbsp;</span>
798
991
  <span class="cline-any cline-neutral">&nbsp;</span>
799
992
  <span class="cline-any cline-neutral">&nbsp;</span>
993
+ <span class="cline-any cline-yes">126x</span>
800
994
  <span class="cline-any cline-neutral">&nbsp;</span>
801
995
  <span class="cline-any cline-neutral">&nbsp;</span>
802
996
  <span class="cline-any cline-neutral">&nbsp;</span>
997
+ <span class="cline-any cline-yes">1489x</span>
998
+ <span class="cline-any cline-yes">1489x</span>
999
+ <span class="cline-any cline-yes">1489x</span>
1000
+ <span class="cline-any cline-yes">1489x</span>
1001
+ <span class="cline-any cline-yes">1321x</span>
803
1002
  <span class="cline-any cline-neutral">&nbsp;</span>
804
- <span class="cline-any cline-yes">34x</span>
805
- <span class="cline-any cline-yes">188x</span>
806
- <span class="cline-any cline-yes">39x</span>
807
- <span class="cline-any cline-yes">39x</span>
808
- <span class="cline-any cline-yes">1434x</span>
809
1003
  <span class="cline-any cline-neutral">&nbsp;</span>
810
- <span class="cline-any cline-yes">39x</span>
1004
+ <span class="cline-any cline-yes">1489x</span>
811
1005
  <span class="cline-any cline-neutral">&nbsp;</span>
812
- <span class="cline-any cline-yes">39x</span>
813
1006
  <span class="cline-any cline-neutral">&nbsp;</span>
1007
+ <span class="cline-any cline-yes">126x</span>
1008
+ <span class="cline-any cline-yes">45x</span>
1009
+ <span class="cline-any cline-yes">45x</span>
1010
+ <span class="cline-any cline-yes">45x</span>
1011
+ <span class="cline-any cline-yes">988x</span>
1012
+ <span class="cline-any cline-no">&nbsp;</span>
1013
+ <span class="cline-any cline-neutral">&nbsp;</span>
1014
+ <span class="cline-any cline-yes">988x</span>
1015
+ <span class="cline-any cline-yes">988x</span>
1016
+ <span class="cline-any cline-yes">1x</span>
1017
+ <span class="cline-any cline-neutral">&nbsp;</span>
1018
+ <span class="cline-any cline-yes">987x</span>
1019
+ <span class="cline-any cline-yes">987x</span>
1020
+ <span class="cline-any cline-neutral">&nbsp;</span>
1021
+ <span class="cline-any cline-yes">987x</span>
1022
+ <span class="cline-any cline-yes">987x</span>
1023
+ <span class="cline-any cline-yes">153x</span>
1024
+ <span class="cline-any cline-yes">153x</span>
1025
+ <span class="cline-any cline-yes">153x</span>
1026
+ <span class="cline-any cline-neutral">&nbsp;</span>
1027
+ <span class="cline-any cline-yes">153x</span>
814
1028
  <span class="cline-any cline-neutral">&nbsp;</span>
815
- <span class="cline-any cline-yes">39x</span>
816
- <span class="cline-any cline-yes">188x</span>
817
- <span class="cline-any cline-yes">1246x</span>
818
1029
  <span class="cline-any cline-neutral">&nbsp;</span>
819
- <span class="cline-any cline-yes">21304x</span>
820
1030
  <span class="cline-any cline-neutral">&nbsp;</span>
821
1031
  <span class="cline-any cline-neutral">&nbsp;</span>
1032
+ <span class="cline-any cline-yes">153x</span>
1033
+ <span class="cline-any cline-yes">153x</span>
822
1034
  <span class="cline-any cline-neutral">&nbsp;</span>
823
- <span class="cline-any cline-yes">1246x</span>
824
- <span class="cline-any cline-yes">1246x</span>
825
- <span class="cline-any cline-yes">1246x</span>
826
- <span class="cline-any cline-yes">29445x</span>
827
1035
  <span class="cline-any cline-neutral">&nbsp;</span>
828
- <span class="cline-any cline-yes">28144x</span>
1036
+ <span class="cline-any cline-yes">987x</span>
1037
+ <span class="cline-any cline-yes">987x</span>
1038
+ <span class="cline-any cline-yes">2x</span>
1039
+ <span class="cline-any cline-yes">1x</span>
1040
+ <span class="cline-any cline-neutral">&nbsp;</span>
1041
+ <span class="cline-any cline-yes">1x</span>
1042
+ <span class="cline-any cline-neutral">&nbsp;</span>
829
1043
  <span class="cline-any cline-neutral">&nbsp;</span>
830
- <span class="cline-any cline-yes">28144x</span>
831
- <span class="cline-any cline-yes">29445x</span>
832
- <span class="cline-any cline-yes">28597x</span>
833
1044
  <span class="cline-any cline-neutral">&nbsp;</span>
834
- <span class="cline-any cline-yes">848x</span>
835
- <span class="cline-any cline-yes">849x</span>
836
1045
  <span class="cline-any cline-neutral">&nbsp;</span>
1046
+ <span class="cline-any cline-yes">986x</span>
837
1047
  <span class="cline-any cline-neutral">&nbsp;</span>
838
- <span class="cline-any cline-yes">849x</span>
839
- <span class="cline-any cline-yes">822x</span>
840
1048
  <span class="cline-any cline-neutral">&nbsp;</span>
841
1049
  <span class="cline-any cline-neutral">&nbsp;</span>
842
- <span class="cline-any cline-yes">26x</span>
843
1050
  <span class="cline-any cline-neutral">&nbsp;</span>
844
1051
  <span class="cline-any cline-neutral">&nbsp;</span>
1052
+ <span class="cline-any cline-yes">43x</span>
1053
+ <span class="cline-any cline-yes">43x</span>
1054
+ <span class="cline-any cline-yes">152x</span>
845
1055
  <span class="cline-any cline-neutral">&nbsp;</span>
1056
+ <span class="cline-any cline-yes">43x</span>
846
1057
  <span class="cline-any cline-neutral">&nbsp;</span>
847
- <span class="cline-any cline-yes">1246x</span>
848
- <span class="cline-any cline-yes">12590x</span>
849
- <span class="cline-any cline-yes">10448x</span>
850
1058
  <span class="cline-any cline-neutral">&nbsp;</span>
851
- <span class="cline-any cline-yes">2142x</span>
852
- <span class="cline-any cline-yes">49133x</span>
1059
+ <span class="cline-any cline-yes">126x</span>
853
1060
  <span class="cline-any cline-neutral">&nbsp;</span>
854
- <span class="cline-any cline-yes">2142x</span>
855
- <span class="cline-any cline-yes">1203x</span>
856
1061
  <span class="cline-any cline-neutral">&nbsp;</span>
857
- <span class="cline-any cline-yes">939x</span>
858
1062
  <span class="cline-any cline-neutral">&nbsp;</span>
859
- <span class="cline-any cline-yes">1246x</span>
860
1063
  <span class="cline-any cline-neutral">&nbsp;</span>
861
1064
  <span class="cline-any cline-neutral">&nbsp;</span>
862
1065
  <span class="cline-any cline-neutral">&nbsp;</span>
863
- <span class="cline-any cline-yes">1246x</span>
864
- <span class="cline-any cline-yes">6559x</span>
865
1066
  <span class="cline-any cline-neutral">&nbsp;</span>
866
- <span class="cline-any cline-yes">2788x</span>
1067
+ <span class="cline-any cline-yes">219x</span>
1068
+ <span class="cline-any cline-yes">219x</span>
1069
+ <span class="cline-any cline-yes">1489x</span>
1070
+ <span class="cline-any cline-yes">1489x</span>
1071
+ <span class="cline-any cline-yes">1489x</span>
1072
+ <span class="cline-any cline-yes">1489x</span>
1073
+ <span class="cline-any cline-yes">1321x</span>
1074
+ <span class="cline-any cline-yes">1321x</span>
1075
+ <span class="cline-any cline-yes">281x</span>
1076
+ <span class="cline-any cline-yes">281x</span>
867
1077
  <span class="cline-any cline-neutral">&nbsp;</span>
868
- <span class="cline-any cline-yes">2788x</span>
869
- <span class="cline-any cline-yes">6559x</span>
870
- <span class="cline-any cline-yes">6150x</span>
1078
+ <span class="cline-any cline-yes">1040x</span>
1079
+ <span class="cline-any cline-yes">1040x</span>
1080
+ <span class="cline-any cline-yes">739x</span>
1081
+ <span class="cline-any cline-yes">739x</span>
871
1082
  <span class="cline-any cline-neutral">&nbsp;</span>
872
- <span class="cline-any cline-yes">409x</span>
873
- <span class="cline-any cline-yes">410x</span>
874
1083
  <span class="cline-any cline-neutral">&nbsp;</span>
1084
+ <span class="cline-any cline-yes">168x</span>
875
1085
  <span class="cline-any cline-neutral">&nbsp;</span>
876
- <span class="cline-any cline-yes">410x</span>
877
- <span class="cline-any cline-yes">355x</span>
878
1086
  <span class="cline-any cline-neutral">&nbsp;</span>
1087
+ <span class="cline-any cline-yes">168x</span>
1088
+ <span class="cline-any cline-yes">168x</span>
879
1089
  <span class="cline-any cline-neutral">&nbsp;</span>
880
- <span class="cline-any cline-yes">54x</span>
1090
+ <span class="cline-any cline-yes">582x</span>
1091
+ <span class="cline-any cline-yes">582x</span>
1092
+ <span class="cline-any cline-yes">2973x</span>
1093
+ <span class="cline-any cline-yes">2973x</span>
881
1094
  <span class="cline-any cline-neutral">&nbsp;</span>
882
- <span class="cline-any cline-yes">1246x</span>
883
- <span class="cline-any cline-yes">614x</span>
884
- <span class="cline-any cline-yes">75x</span>
885
- <span class="cline-any cline-yes">75x</span>
1095
+ <span class="cline-any cline-yes">582x</span>
1096
+ <span class="cline-any cline-yes">582x</span>
886
1097
  <span class="cline-any cline-neutral">&nbsp;</span>
1098
+ <span class="cline-any cline-yes">582x</span>
887
1099
  <span class="cline-any cline-neutral">&nbsp;</span>
888
1100
  <span class="cline-any cline-neutral">&nbsp;</span>
889
1101
  <span class="cline-any cline-neutral">&nbsp;</span>
1102
+ <span class="cline-any cline-yes">582x</span>
890
1103
  <span class="cline-any cline-neutral">&nbsp;</span>
1104
+ <span class="cline-any cline-yes">582x</span>
891
1105
  <span class="cline-any cline-neutral">&nbsp;</span>
892
- <span class="cline-any cline-yes">539x</span>
1106
+ <span class="cline-any cline-yes">219x</span>
893
1107
  <span class="cline-any cline-neutral">&nbsp;</span>
894
- <span class="cline-any cline-yes">539x</span>
895
1108
  <span class="cline-any cline-neutral">&nbsp;</span>
896
1109
  <span class="cline-any cline-neutral">&nbsp;</span>
897
1110
  <span class="cline-any cline-neutral">&nbsp;</span>
898
- <span class="cline-any cline-yes">539x</span>
899
- <span class="cline-any cline-yes">61x</span>
900
- <span class="cline-any cline-yes">61x</span>
901
1111
  <span class="cline-any cline-neutral">&nbsp;</span>
902
1112
  <span class="cline-any cline-neutral">&nbsp;</span>
903
1113
  <span class="cline-any cline-neutral">&nbsp;</span>
904
- <span class="cline-any cline-yes">1110x</span>
905
- <span class="cline-any cline-yes">761x</span>
906
- <span class="cline-any cline-yes">349x</span>
907
1114
  <span class="cline-any cline-neutral">&nbsp;</span>
908
- <span class="cline-any cline-yes">228x</span>
909
- <span class="cline-any cline-yes">228x</span>
910
- <span class="cline-any cline-yes">149x</span>
911
1115
  <span class="cline-any cline-neutral">&nbsp;</span>
912
- <span class="cline-any cline-yes">79x</span>
913
- <span class="cline-any cline-yes">79x</span>
914
1116
  <span class="cline-any cline-neutral">&nbsp;</span>
915
1117
  <span class="cline-any cline-neutral">&nbsp;</span>
916
1118
  <span class="cline-any cline-neutral">&nbsp;</span>
1119
+ <span class="cline-any cline-yes">126x</span>
917
1120
  <span class="cline-any cline-neutral">&nbsp;</span>
918
1121
  <span class="cline-any cline-neutral">&nbsp;</span>
919
- <span class="cline-any cline-yes">121x</span>
920
1122
  <span class="cline-any cline-neutral">&nbsp;</span>
921
- <span class="cline-any cline-yes">121x</span>
922
1123
  <span class="cline-any cline-neutral">&nbsp;</span>
1124
+ <span class="cline-any cline-yes">219x</span>
1125
+ <span class="cline-any cline-yes">219x</span>
1126
+ <span class="cline-any cline-yes">219x</span>
923
1127
  <span class="cline-any cline-no">&nbsp;</span>
924
1128
  <span class="cline-any cline-neutral">&nbsp;</span>
1129
+ <span class="cline-any cline-yes">219x</span>
1130
+ <span class="cline-any cline-yes">219x</span>
925
1131
  <span class="cline-any cline-neutral">&nbsp;</span>
1132
+ <span class="cline-any cline-yes">219x</span>
926
1133
  <span class="cline-any cline-neutral">&nbsp;</span>
927
1134
  <span class="cline-any cline-neutral">&nbsp;</span>
1135
+ <span class="cline-any cline-yes">126x</span>
928
1136
  <span class="cline-any cline-neutral">&nbsp;</span>
929
- <span class="cline-any cline-yes">989x</span>
930
1137
  <span class="cline-any cline-neutral">&nbsp;</span>
931
1138
  <span class="cline-any cline-neutral">&nbsp;</span>
1139
+ <span class="cline-any cline-yes">65x</span>
1140
+ <span class="cline-any cline-yes">65x</span>
1141
+ <span class="cline-any cline-yes">65x</span>
932
1142
  <span class="cline-any cline-neutral">&nbsp;</span>
933
- <span class="cline-any cline-yes">39x</span>
934
1143
  <span class="cline-any cline-neutral">&nbsp;</span>
1144
+ <span class="cline-any cline-yes">65x</span>
935
1145
  <span class="cline-any cline-neutral">&nbsp;</span>
1146
+ <span class="cline-any cline-yes">65x</span>
936
1147
  <span class="cline-any cline-neutral">&nbsp;</span>
937
1148
  <span class="cline-any cline-neutral">&nbsp;</span>
1149
+ <span class="cline-any cline-yes">126x</span>
938
1150
  <span class="cline-any cline-neutral">&nbsp;</span>
939
1151
  <span class="cline-any cline-neutral">&nbsp;</span>
1152
+ <span class="cline-any cline-yes">559x</span>
1153
+ <span class="cline-any cline-yes">38x</span>
940
1154
  <span class="cline-any cline-neutral">&nbsp;</span>
941
1155
  <span class="cline-any cline-neutral">&nbsp;</span>
942
1156
  <span class="cline-any cline-neutral">&nbsp;</span>
943
1157
  <span class="cline-any cline-neutral">&nbsp;</span>
1158
+ <span class="cline-any cline-yes">559x</span>
944
1159
  <span class="cline-any cline-neutral">&nbsp;</span>
945
1160
  <span class="cline-any cline-neutral">&nbsp;</span>
1161
+ <span class="cline-any cline-yes">126x</span>
946
1162
  <span class="cline-any cline-neutral">&nbsp;</span>
947
1163
  <span class="cline-any cline-neutral">&nbsp;</span>
948
1164
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -952,50 +1168,46 @@
952
1168
  <span class="cline-any cline-neutral">&nbsp;</span>
953
1169
  <span class="cline-any cline-neutral">&nbsp;</span>
954
1170
  <span class="cline-any cline-neutral">&nbsp;</span>
955
- <span class="cline-any cline-yes">34x</span>
956
1171
  <span class="cline-any cline-neutral">&nbsp;</span>
957
1172
  <span class="cline-any cline-neutral">&nbsp;</span>
958
- <span class="cline-any cline-yes">22x</span>
959
- <span class="cline-any cline-yes">22x</span>
960
- <span class="cline-any cline-yes">22x</span>
961
- <span class="cline-any cline-yes">188x</span>
962
1173
  <span class="cline-any cline-neutral">&nbsp;</span>
963
1174
  <span class="cline-any cline-neutral">&nbsp;</span>
964
- <span class="cline-any cline-yes">188x</span>
965
1175
  <span class="cline-any cline-neutral">&nbsp;</span>
966
1176
  <span class="cline-any cline-neutral">&nbsp;</span>
967
- <span class="cline-any cline-yes">188x</span>
968
- <span class="cline-any cline-yes">149x</span>
969
1177
  <span class="cline-any cline-neutral">&nbsp;</span>
970
- <span class="cline-any cline-yes">39x</span>
971
1178
  <span class="cline-any cline-neutral">&nbsp;</span>
972
- <span class="cline-any cline-yes">188x</span>
1179
+ <span class="cline-any cline-yes">559x</span>
973
1180
  <span class="cline-any cline-neutral">&nbsp;</span>
974
- <span class="cline-any cline-yes">22x</span>
975
1181
  <span class="cline-any cline-neutral">&nbsp;</span>
976
1182
  <span class="cline-any cline-neutral">&nbsp;</span>
977
- <span class="cline-any cline-yes">34x</span>
978
- <span class="cline-any cline-yes">188x</span>
979
- <span class="cline-any cline-yes">1434x</span>
980
- <span class="cline-any cline-yes">1434x</span>
1183
+ <span class="cline-any cline-yes">559x</span>
1184
+ <span class="cline-any cline-yes">559x</span>
1185
+ <span class="cline-any cline-yes">559x</span>
1186
+ <span class="cline-any cline-yes">366x</span>
1187
+ <span class="cline-any cline-yes">366x</span>
981
1188
  <span class="cline-any cline-neutral">&nbsp;</span>
1189
+ <span class="cline-any cline-yes">366x</span>
982
1190
  <span class="cline-any cline-neutral">&nbsp;</span>
983
- <span class="cline-any cline-yes">6747x</span>
984
- <span class="cline-any cline-yes">6747x</span>
985
- <span class="cline-any cline-no">&nbsp;</span>
986
- <span class="cline-any cline-no">&nbsp;</span>
987
1191
  <span class="cline-any cline-neutral">&nbsp;</span>
988
- <span class="cline-any cline-no">&nbsp;</span>
989
1192
  <span class="cline-any cline-neutral">&nbsp;</span>
990
1193
  <span class="cline-any cline-neutral">&nbsp;</span>
991
1194
  <span class="cline-any cline-neutral">&nbsp;</span>
1195
+ <span class="cline-any cline-yes">366x</span>
992
1196
  <span class="cline-any cline-neutral">&nbsp;</span>
993
- <span class="cline-any cline-yes">6747x</span>
994
- <span class="cline-any cline-yes">6747x</span>
995
1197
  <span class="cline-any cline-neutral">&nbsp;</span>
1198
+ <span class="cline-any cline-yes">559x</span>
1199
+ <span class="cline-any cline-yes">559x</span>
1200
+ <span class="cline-any cline-yes">332x</span>
1201
+ <span class="cline-any cline-yes">332x</span>
996
1202
  <span class="cline-any cline-neutral">&nbsp;</span>
1203
+ <span class="cline-any cline-yes">559x</span>
1204
+ <span class="cline-any cline-yes">559x</span>
1205
+ <span class="cline-any cline-yes">366x</span>
1206
+ <span class="cline-any cline-yes">366x</span>
997
1207
  <span class="cline-any cline-neutral">&nbsp;</span>
998
- <span class="cline-any cline-yes">1434x</span>
1208
+ <span class="cline-any cline-yes">559x</span>
1209
+ <span class="cline-any cline-yes">557x</span>
1210
+ <span class="cline-any cline-yes">557x</span>
999
1211
  <span class="cline-any cline-neutral">&nbsp;</span>
1000
1212
  <span class="cline-any cline-neutral">&nbsp;</span>
1001
1213
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1003,76 +1215,156 @@
1003
1215
  <span class="cline-any cline-neutral">&nbsp;</span>
1004
1216
  <span class="cline-any cline-neutral">&nbsp;</span>
1005
1217
  <span class="cline-any cline-neutral">&nbsp;</span>
1006
- <span class="cline-any cline-yes">34x</span>
1007
- <span class="cline-any cline-yes">188x</span>
1008
- <span class="cline-any cline-yes">6747x</span>
1009
- <span class="cline-any cline-yes">6747x</span>
1010
- <span class="cline-any cline-yes">6747x</span>
1011
- <span class="cline-any cline-no">&nbsp;</span>
1012
1218
  <span class="cline-any cline-neutral">&nbsp;</span>
1013
- <span class="cline-any cline-yes">6747x</span>
1014
- <span class="cline-any cline-yes">6747x</span>
1015
- <span class="cline-any cline-yes">6747x</span>
1016
1219
  <span class="cline-any cline-neutral">&nbsp;</span>
1017
1220
  <span class="cline-any cline-neutral">&nbsp;</span>
1018
1221
  <span class="cline-any cline-neutral">&nbsp;</span>
1019
- <span class="cline-any cline-yes">34x</span>
1020
- <span class="cline-any cline-yes">22x</span>
1021
- <span class="cline-any cline-yes">22x</span>
1022
- <span class="cline-any cline-yes">22x</span>
1023
- <span class="cline-any cline-yes">22x</span>
1024
- <span class="cline-any cline-yes">22x</span>
1025
- <span class="cline-any cline-yes">39x</span>
1026
- <span class="cline-any cline-yes">22x</span>
1027
- <span class="cline-any cline-yes">22x</span>
1222
+ <span class="cline-any cline-yes">126x</span>
1223
+ <span class="cline-any cline-yes">45x</span>
1224
+ <span class="cline-any cline-yes">45x</span>
1225
+ <span class="cline-any cline-yes">45x</span>
1226
+ <span class="cline-any cline-yes">43x</span>
1227
+ <span class="cline-any cline-yes">43x</span>
1228
+ <span class="cline-any cline-yes">152x</span>
1028
1229
  <span class="cline-any cline-neutral">&nbsp;</span>
1230
+ <span class="cline-any cline-yes">43x</span>
1029
1231
  <span class="cline-any cline-neutral">&nbsp;</span>
1030
- <span class="cline-any cline-yes">34x</span>
1031
1232
  <span class="cline-any cline-neutral">&nbsp;</span>
1032
1233
  <span class="cline-any cline-neutral">&nbsp;</span>
1234
+ <span class="cline-any cline-yes">43x</span>
1235
+ <span class="cline-any cline-yes">152x</span>
1236
+ <span class="cline-any cline-yes">152x</span>
1237
+ <span class="cline-any cline-yes">152x</span>
1238
+ <span class="cline-any cline-yes">125x</span>
1033
1239
  <span class="cline-any cline-neutral">&nbsp;</span>
1034
- <span class="cline-any cline-yes">4x</span>
1240
+ <span class="cline-any cline-yes">152x</span>
1035
1241
  <span class="cline-any cline-neutral">&nbsp;</span>
1036
- <span class="cline-any cline-yes">2x</span>
1242
+ <span class="cline-any cline-yes">43x</span>
1243
+ <span class="cline-any cline-yes">43x</span>
1244
+ <span class="cline-any cline-yes">43x</span>
1245
+ <span class="cline-any cline-yes">43x</span>
1246
+ <span class="cline-any cline-yes">43x</span>
1247
+ <span class="cline-any cline-yes">43x</span>
1248
+ <span class="cline-any cline-yes">43x</span>
1249
+ <span class="cline-any cline-yes">43x</span>
1250
+ <span class="cline-any cline-yes">43x</span>
1251
+ <span class="cline-any cline-yes">43x</span>
1037
1252
  <span class="cline-any cline-neutral">&nbsp;</span>
1038
1253
  <span class="cline-any cline-neutral">&nbsp;</span>
1039
- <span class="cline-any cline-yes">2x</span>
1254
+ <span class="cline-any cline-yes">43x</span>
1255
+ <span class="cline-any cline-yes">219x</span>
1256
+ <span class="cline-any cline-yes">219x</span>
1257
+ <span class="cline-any cline-yes">219x</span>
1258
+ <span class="cline-any cline-yes">219x</span>
1259
+ <span class="cline-any cline-yes">65x</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-neutral">&nbsp;</span>
1263
+ <span class="cline-any cline-yes">65x</span>
1264
+ <span class="cline-any cline-yes">65x</span>
1265
+ <span class="cline-any cline-neutral">&nbsp;</span>
1266
+ <span class="cline-any cline-yes">219x</span>
1267
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1274
+ <span class="cline-any cline-yes">219x</span>
1275
+ <span class="cline-any cline-yes">65x</span>
1276
+ <span class="cline-any cline-yes">65x</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">219x</span>
1280
+ <span class="cline-any cline-yes">582x</span>
1281
+ <span class="cline-any cline-yes">582x</span>
1282
+ <span class="cline-any cline-yes">582x</span>
1283
+ <span class="cline-any cline-yes">582x</span>
1284
+ <span class="cline-any cline-neutral">&nbsp;</span>
1285
+ <span class="cline-any cline-yes">582x</span>
1286
+ <span class="cline-any cline-yes">582x</span>
1287
+ <span class="cline-any cline-yes">262x</span>
1288
+ <span class="cline-any cline-neutral">&nbsp;</span>
1289
+ <span class="cline-any cline-neutral">&nbsp;</span>
1290
+ <span class="cline-any cline-yes">320x</span>
1291
+ <span class="cline-any cline-yes">581x</span>
1292
+ <span class="cline-any cline-yes">581x</span>
1293
+ <span class="cline-any cline-yes">581x</span>
1294
+ <span class="cline-any cline-yes">11x</span>
1295
+ <span class="cline-any cline-neutral">&nbsp;</span>
1296
+ <span class="cline-any cline-yes">570x</span>
1297
+ <span class="cline-any cline-yes">570x</span>
1040
1298
  <span class="cline-any cline-neutral">&nbsp;</span>
1041
- <span class="cline-any cline-yes">2x</span>
1042
1299
  <span class="cline-any cline-neutral">&nbsp;</span>
1300
+ <span class="cline-any cline-yes">570x</span>
1301
+ <span class="cline-any cline-yes">559x</span>
1302
+ <span class="cline-any cline-neutral">&nbsp;</span>
1303
+ <span class="cline-any cline-neutral">&nbsp;</span>
1304
+ <span class="cline-any cline-neutral">&nbsp;</span>
1305
+ <span class="cline-any cline-neutral">&nbsp;</span>
1306
+ <span class="cline-any cline-neutral">&nbsp;</span>
1307
+ <span class="cline-any cline-neutral">&nbsp;</span>
1308
+ <span class="cline-any cline-neutral">&nbsp;</span>
1309
+ <span class="cline-any cline-neutral">&nbsp;</span>
1310
+ <span class="cline-any cline-neutral">&nbsp;</span>
1311
+ <span class="cline-any cline-neutral">&nbsp;</span>
1312
+ <span class="cline-any cline-neutral">&nbsp;</span>
1313
+ <span class="cline-any cline-neutral">&nbsp;</span>
1314
+ <span class="cline-any cline-yes">43x</span>
1315
+ <span class="cline-any cline-yes">43x</span>
1316
+ <span class="cline-any cline-yes">65x</span>
1317
+ <span class="cline-any cline-neutral">&nbsp;</span>
1318
+ <span class="cline-any cline-yes">43x</span>
1319
+ <span class="cline-any cline-yes">43x</span>
1320
+ <span class="cline-any cline-neutral">&nbsp;</span>
1321
+ <span class="cline-any cline-neutral">&nbsp;</span>
1322
+ <span class="cline-any cline-yes">126x</span>
1323
+ <span class="cline-any cline-neutral">&nbsp;</span>
1324
+ <span class="cline-any cline-neutral">&nbsp;</span>
1325
+ <span class="cline-any cline-neutral">&nbsp;</span>
1326
+ <span class="cline-any cline-yes">10x</span>
1043
1327
  <span class="cline-any cline-neutral">&nbsp;</span>
1044
- <span class="cline-any cline-yes">34x</span>
1045
1328
  <span class="cline-any cline-yes">5x</span>
1046
- <span class="cline-any cline-yes">1x</span>
1047
1329
  <span class="cline-any cline-neutral">&nbsp;</span>
1048
- <span class="cline-any cline-yes">4x</span>
1049
- <span class="cline-any cline-yes">4x</span>
1330
+ <span class="cline-any cline-neutral">&nbsp;</span>
1331
+ <span class="cline-any cline-yes">5x</span>
1332
+ <span class="cline-any cline-neutral">&nbsp;</span>
1333
+ <span class="cline-any cline-yes">5x</span>
1334
+ <span class="cline-any cline-neutral">&nbsp;</span>
1335
+ <span class="cline-any cline-neutral">&nbsp;</span>
1336
+ <span class="cline-any cline-yes">126x</span>
1337
+ <span class="cline-any cline-yes">17x</span>
1338
+ <span class="cline-any cline-yes">2x</span>
1339
+ <span class="cline-any cline-neutral">&nbsp;</span>
1340
+ <span class="cline-any cline-yes">15x</span>
1341
+ <span class="cline-any cline-yes">15x</span>
1050
1342
  <span class="cline-any cline-no">&nbsp;</span>
1343
+ <span class="cline-any cline-yes">15x</span>
1051
1344
  <span class="cline-any cline-yes">4x</span>
1052
- <span class="cline-any cline-yes">2x</span>
1053
1345
  <span class="cline-any cline-neutral">&nbsp;</span>
1054
- <span class="cline-any cline-yes">2x</span>
1346
+ <span class="cline-any cline-yes">11x</span>
1055
1347
  <span class="cline-any cline-neutral">&nbsp;</span>
1056
1348
  <span class="cline-any cline-neutral">&nbsp;</span>
1057
- <span class="cline-any cline-yes">34x</span>
1349
+ <span class="cline-any cline-yes">126x</span>
1058
1350
  <span class="cline-any cline-neutral">&nbsp;</span>
1059
1351
  <span class="cline-any cline-neutral">&nbsp;</span>
1352
+ <span class="cline-any cline-yes">8x</span>
1060
1353
  <span class="cline-any cline-yes">3x</span>
1061
- <span class="cline-any cline-yes">1x</span>
1062
1354
  <span class="cline-any cline-neutral">&nbsp;</span>
1063
- <span class="cline-any cline-yes">2x</span>
1355
+ <span class="cline-any cline-yes">5x</span>
1064
1356
  <span class="cline-any cline-neutral">&nbsp;</span>
1065
1357
  <span class="cline-any cline-neutral">&nbsp;</span>
1066
- <span class="cline-any cline-yes">34x</span>
1358
+ <span class="cline-any cline-yes">126x</span>
1067
1359
  <span class="cline-any cline-neutral">&nbsp;</span>
1068
1360
  <span class="cline-any cline-neutral">&nbsp;</span>
1361
+ <span class="cline-any cline-yes">9x</span>
1069
1362
  <span class="cline-any cline-yes">3x</span>
1070
- <span class="cline-any cline-yes">1x</span>
1071
1363
  <span class="cline-any cline-neutral">&nbsp;</span>
1072
- <span class="cline-any cline-yes">2x</span>
1364
+ <span class="cline-any cline-yes">6x</span>
1073
1365
  <span class="cline-any cline-neutral">&nbsp;</span>
1074
1366
  <span class="cline-any cline-neutral">&nbsp;</span>
1075
- <span class="cline-any cline-yes">34x</span>
1367
+ <span class="cline-any cline-yes">126x</span>
1076
1368
  <span class="cline-any cline-neutral">&nbsp;</span>
1077
1369
  <span class="cline-any cline-neutral">&nbsp;</span>
1078
1370
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1081,10 +1373,10 @@
1081
1373
  <span class="cline-any cline-neutral">&nbsp;</span>
1082
1374
  <span class="cline-any cline-neutral">&nbsp;</span>
1083
1375
  <span class="cline-any cline-neutral">&nbsp;</span>
1084
- <span class="cline-any cline-yes">227x</span>
1376
+ <span class="cline-any cline-yes">514x</span>
1085
1377
  <span class="cline-any cline-neutral">&nbsp;</span>
1086
1378
  <span class="cline-any cline-neutral">&nbsp;</span>
1087
- <span class="cline-any cline-yes">227x</span>
1379
+ <span class="cline-any cline-yes">514x</span>
1088
1380
  <span class="cline-any cline-neutral">&nbsp;</span>
1089
1381
  <span class="cline-any cline-neutral">&nbsp;</span>
1090
1382
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1141,6 +1433,9 @@ export interface IEntityInternal&lt;T extends IModel&gt; {
1141
1433
  references: object;
1142
1434
  selectColumnsClause: string;
1143
1435
  getPkId: (model: IModel) =&gt; string;
1436
+ columnToPropertyMap: Map&lt;string, string&gt;;
1437
+ propertyToColumnMap: Map&lt;string, string&gt;;
1438
+ referencesEntries: Array&lt;{ property: string; ModelClass: IModelClass }&gt;;
1144
1439
  }
1145
1440
  export type IEntitiesInternal&lt;T extends IModel&gt; = Array&lt;IEntityInternal&lt;T&gt;&gt;;
1146
1441
  &nbsp;
@@ -1195,7 +1490,7 @@ export const createCore = ({
1195
1490
  const collectionDisplayName =
1196
1491
  d.collectionDisplayName || `${displayName}s`;
1197
1492
  const columns = (
1198
- typeof d.columns === 'function' ? <span class="branch-0 cbranch-no" title="branch not covered" >d.columns() </span>: d.columns
1493
+ typeof d.columns === 'function' ? d.columns() : d.columns
1199
1494
  ).map((d: IColumn) =&gt; {
1200
1495
  if (typeof d === 'string') {
1201
1496
  return {
@@ -1224,25 +1519,41 @@ export const createCore = ({
1224
1519
  const pkColumnsData = columns.filter(
1225
1520
  (x: IColumnInternal) =&gt; x.primaryKey
1226
1521
  );
1227
- const _primaryKeys = pkColumnsData.map(<span class="fstat-no" title="function not covered" >(x</span>: IColumnInternal) =&gt; <span class="cstat-no" title="statement not covered" >x.column)</span>;
1228
- const primaryKeys = _primaryKeys.length &gt; 0 ? <span class="branch-0 cbranch-no" title="branch not covered" >_primaryKeys </span>: ['id'];
1522
+ const _primaryKeys = pkColumnsData.map((x: IColumnInternal) =&gt; x.column);
1523
+ const primaryKeys = _primaryKeys.length &gt; 0 ? _primaryKeys : ['id'];
1229
1524
  &nbsp;
1230
- // Returns unique identifier of model (the values of the primary keys)
1231
1525
  const getPkId = (model: IModel): string =&gt; {
1232
- return primaryKeys
1233
- .map((key: string) =&gt; model[key as keyof typeof model])
1234
- .join('');
1526
+ let id = '';
1527
+ for (let i = 0; i &lt; primaryKeys.length; i++) {
1528
+ const part = model[primaryKeys[i] as keyof typeof model];
1529
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (part !== void 0 &amp;&amp; part !== null) {
1530
+ id += String(part);
1531
+ }
1532
+ }
1533
+ return id;
1235
1534
  };
1236
1535
  &nbsp;
1237
- const references = columns
1238
- .filter((x: IColumnInternal) =&gt; x.references)
1239
- .reduce(
1240
- (accum: any, item: IColumnInternal) =&gt;
1241
- Object.assign({}, accum, {
1242
- [item.property]: item.references
1243
- }),
1244
- {}
1245
- );
1536
+ const references: any = {};
1537
+ const referencesEntries: Array&lt;{
1538
+ property: string;
1539
+ ModelClass: IModelClass;
1540
+ }&gt; = [];
1541
+ for (const col of columns) {
1542
+ if (col.references) {
1543
+ references[col.property] = col.references;
1544
+ referencesEntries.push({
1545
+ property: col.property,
1546
+ ModelClass: col.references
1547
+ });
1548
+ }
1549
+ }
1550
+ &nbsp;
1551
+ const columnToPropertyMap = new Map&lt;string, string&gt;();
1552
+ const propertyToColumnMap = new Map&lt;string, string&gt;();
1553
+ for (let i = 0; i &lt; columnNames.length; i++) {
1554
+ columnToPropertyMap.set(columnNames[i], propertyNames[i]);
1555
+ propertyToColumnMap.set(propertyNames[i], columnNames[i]);
1556
+ }
1246
1557
  &nbsp;
1247
1558
  const selectColumnsClause = prefixedColumnNames
1248
1559
  .map(
@@ -1264,7 +1575,10 @@ export const createCore = ({
1264
1575
  primaryKeys,
1265
1576
  references,
1266
1577
  selectColumnsClause,
1267
- getPkId
1578
+ getPkId,
1579
+ columnToPropertyMap,
1580
+ propertyToColumnMap,
1581
+ referencesEntries
1268
1582
  };
1269
1583
  }
1270
1584
  );
@@ -1282,8 +1596,8 @@ export const createCore = ({
1282
1596
  &nbsp;
1283
1597
  const getEntityByTableName = (tableName: string): IEntityInternal&lt;IModel&gt; =&gt; {
1284
1598
  const entity = tableNameToEntityMap.get(tableName);
1285
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!entity) {
1286
- <span class="cstat-no" title="statement not covered" > throw new Error(`Could not find entity for table ${tableName}`);</span>
1599
+ if (!entity) {
1600
+ throw new Error(`Could not find entity for table ${tableName}`);
1287
1601
  }
1288
1602
  return entity;
1289
1603
  };
@@ -1303,8 +1617,8 @@ export const createCore = ({
1303
1617
  Model: IModelClass
1304
1618
  ): IEntityInternal&lt;IModel&gt; =&gt; {
1305
1619
  const entity = modelToEntityMap.get(Model);
1306
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!entity) {
1307
- <span class="cstat-no" title="statement not covered" > throw new Error(`Could not find entity for class ${Model}`);</span>
1620
+ if (!entity) {
1621
+ throw new Error(`Could not find entity for class ${Model}`);
1308
1622
  }
1309
1623
  return entity;
1310
1624
  };
@@ -1313,237 +1627,361 @@ export const createCore = ({
1313
1627
  return getEntityByModelClass(model.constructor as IModelClass);
1314
1628
  };
1315
1629
  &nbsp;
1316
- /*
1317
- * In:
1318
- * [
1319
- * [Article {id: 32}, ArticleTag {id: 54}]
1320
- * [Article {id: 32}, ArticleTag {id: 55}]
1321
- * ]
1322
- * Out:
1323
- * Article {id: 32, ArticleTags articleTags: [ArticleTag {id: 54}, ArticleTag {id: 55}]
1324
- */
1325
- const nestClump = (clump: Array&lt;Array&lt;IModel&gt;&gt;): object =&gt; {
1326
- clump = clump.map((x: Array&lt;IModel&gt;) =&gt; Object.values(x));
1327
- const root = clump[0][0];
1328
- clump = clump.map((row: Array&lt;IModel&gt;) =&gt;
1329
- row.filter((item: IModel, index: number) =&gt; index !== 0)
1330
- );
1331
- const built = { [getEntityByModel(root).displayName]: root };
1630
+ const entityReferencePlans = new Map&lt;
1631
+ IEntityInternal&lt;IModel&gt;,
1632
+ Array&lt;{ property: string; targetEntity: IEntityInternal&lt;IModel&gt; }&gt;
1633
+ &gt;();
1634
+ for (let i = 0; i &lt; entities.length; i++) {
1635
+ const entity = entities[i];
1636
+ const plans = new Array&lt;{
1637
+ property: string;
1638
+ targetEntity: IEntityInternal&lt;IModel&gt;;
1639
+ }&gt;(entity.referencesEntries.length);
1640
+ for (let j = 0; j &lt; entity.referencesEntries.length; j++) {
1641
+ const ref = entity.referencesEntries[j];
1642
+ plans[j] = {
1643
+ property: ref.property,
1644
+ targetEntity: getEntityByModelClass(ref.ModelClass)
1645
+ };
1646
+ }
1647
+ entityReferencePlans.set(entity, plans);
1648
+ }
1332
1649
  &nbsp;
1333
- let nodes = [root];
1650
+ interface IRowColumnPlan {
1651
+ rowKey: string;
1652
+ propertyName: string;
1653
+ }
1654
+ interface IEntityRowPlan {
1655
+ entity: IEntityInternal&lt;IModel&gt;;
1656
+ columnPlans: Array&lt;IRowColumnPlan&gt;;
1657
+ primaryKeyRowKeys: Array&lt;string&gt;;
1658
+ }
1334
1659
  &nbsp;
1335
- // Wowzer is this both CPU and Memory inefficient
1336
- clump.forEach((array: Array&lt;IModel&gt;) =&gt; {
1337
- array.forEach((_model: IModel) =&gt; {
1338
- const nodeAlreadySeen = nodes.find(
1339
- (x: IModel) =&gt;
1340
- x.constructor.name === _model.constructor.name &amp;&amp;
1341
- getEntityByModel(x).getPkId(x) ===
1342
- getEntityByModel(_model).getPkId(_model)
1660
+ const getPkIdFromRow = (
1661
+ row: any,
1662
+ primaryKeyRowKeys: Array&lt;string&gt;
1663
+ ): string =&gt; {
1664
+ let id = '';
1665
+ for (let i = 0; i &lt; primaryKeyRowKeys.length; i++) {
1666
+ const part = row[primaryKeyRowKeys[i]];
1667
+ if (part !== void 0 &amp;&amp; part !== null) {
1668
+ id += String(part);
1669
+ }
1670
+ }
1671
+ return id;
1672
+ };
1673
+ &nbsp;
1674
+ const buildEntityRowPlans = (sampleRow: any): Array&lt;IEntityRowPlan&gt; =&gt; {
1675
+ const plansByTable = new Map&lt;string, IEntityRowPlan&gt;();
1676
+ const tableOrder: Array&lt;string&gt; = [];
1677
+ for (const text in sampleRow) {
1678
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!Object.prototype.hasOwnProperty.call(sampleRow, text)) {
1679
+ <span class="cstat-no" title="statement not covered" > continue;</span>
1680
+ }
1681
+ const hashIndex = text.indexOf('#');
1682
+ if (hashIndex === -1) {
1683
+ throw new Error('Column names must be namespaced to table');
1684
+ }
1685
+ const tableName = text.substring(0, hashIndex);
1686
+ const column = text.substring(hashIndex + 1);
1687
+ &nbsp;
1688
+ let plan = plansByTable.get(tableName);
1689
+ if (!plan) {
1690
+ const entity = getEntityByTableName(tableName);
1691
+ const primaryKeyRowKeys = entity.primaryKeys.map(
1692
+ (pk: string) =&gt; `${tableName}#${pk}`
1343
1693
  );
1344
- const model = nodeAlreadySeen || _model;
1345
- const isNodeAlreadySeen = !!nodeAlreadySeen;
1346
- const nodePointingToIt = nodes.find((node) =&gt; {
1347
- const indexes = Object.values(getEntityByModel(node).references)
1348
- .map((x: IModelClass, i: number) =&gt;
1349
- x === model.constructor ? i : null
1350
- )
1351
- .filter((x: number | null, i) =&gt; x != null) as Array&lt;number&gt;;
1352
- if (!indexes.length) {
1353
- return false;
1354
- }
1355
- for (const index of indexes) {
1356
- const property = Object.keys(getEntityByModel(node).references)[
1357
- index
1358
- ];
1359
- if (node[property] === model.id) {
1360
- return true;
1361
- }
1362
- }
1363
- return false;
1364
- });
1365
- // For first obj type which is has an instance in nodes array,
1366
- // get its index in nodes array
1367
- const indexOfOldestParent =
1368
- array.reduce((answer: number | null, obj: IModel) =&gt; {
1369
- if (answer != null) {
1370
- return answer;
1371
- }
1372
- const index = nodes.findIndex(
1373
- (n) =&gt; n.constructor === obj.constructor
1374
- );
1375
- if (index !== -1) {
1376
- return index;
1377
- }
1378
- return null;
1379
- }, null) || 0;
1380
- const parentHeirarchy = [
1381
- root,
1382
- ...nodes.slice(0, indexOfOldestParent + 1).reverse()
1383
- ];
1384
- const nodeItPointsTo = parentHeirarchy.find((parent) =&gt; {
1385
- const indexes = Object.values(getEntityByModel(model).references)
1386
- .map((x: IModelClass, i: number) =&gt;
1387
- x === parent.constructor ? i : null
1388
- )
1389
- .filter((x: number | null, i) =&gt; x != null) as Array&lt;number&gt;;
1390
- if (!indexes.length) {
1391
- return false;
1392
- }
1393
- for (const index of indexes) {
1394
- const property = Object.keys(getEntityByModel(model).references)[
1395
- index
1396
- ];
1397
- if (model[property] === parent.id) {
1398
- return true;
1399
- }
1400
- }
1401
- return false;
1402
- });
1403
- if (isNodeAlreadySeen) {
1404
- if (nodeItPointsTo &amp;&amp; !nodePointingToIt) {
1405
- nodes = [model, ...nodes];
1406
- return;
1407
- }
1408
- // If the nodePointingToIt (eg, parcel_event) is part of an
1409
- // existing collection on this node (eg, parcel) which is a
1410
- // nodeAlreadySeen, early return so we don't create it (parcel) on
1411
- // the nodePointingToIt (parcel_event), since it (parcel) has been
1412
- // shown to be the parent (of parcel_events).
1413
- <span class="missing-if-branch" title="else path not taken" >E</span>if (nodePointingToIt) {
1414
- const ec =
1415
- model[
1416
- getEntityByModel(nodePointingToIt)
1417
- .collectionDisplayName as keyof typeof model
1418
- ];
1419
- if (ec &amp;&amp; ec.models.find((m: IModel) =&gt; m === nodePointingToIt)) {
1420
- nodes = [model, ...nodes];
1421
- return;
1422
- }
1423
- }
1424
- }
1425
- if (nodePointingToIt) {
1426
- nodePointingToIt[getEntityByModel(model).displayName] = model;
1427
- } else if (nodeItPointsTo) {
1428
- let collection =
1429
- nodeItPointsTo[getEntityByModel(model).collectionDisplayName];
1430
- if (collection) {
1431
- collection.models.push(model);
1432
- } else {
1433
- const Collection = getEntityByModel(model).Collection;
1434
- nodeItPointsTo[getEntityByModel(model).collectionDisplayName] =
1435
- new Collection({
1436
- models: [model]
1437
- });
1438
- }
1694
+ plan = {
1695
+ entity,
1696
+ columnPlans: [],
1697
+ primaryKeyRowKeys
1698
+ };
1699
+ plansByTable.set(tableName, plan);
1700
+ tableOrder.push(tableName);
1701
+ }
1702
+ &nbsp;
1703
+ let propertyName = plan.entity.columnToPropertyMap.get(column);
1704
+ if (!propertyName) {
1705
+ if (column.startsWith('meta_')) {
1706
+ propertyName = camelCase(column);
1439
1707
  } else {
1440
- <span class="missing-if-branch" title="else path not taken" >E</span>if (!getEntityByModel(model).getPkId(model)) {
1441
- // If the join is fruitless; todo: add a test for this path
1442
- return;
1443
- }
1444
- <span class="cstat-no" title="statement not covered" > throw Error(</span>
1445
- `Could not find how this BO fits: ${JSON.stringify(model)} ${
1446
- getEntityByModel(model).tableName
1447
- }`
1708
+ throw Error(
1709
+ `No property name for "${column}" in business object "${plan.entity.displayName}". Non-spec'd columns must begin with "meta_".`
1448
1710
  );
1449
1711
  }
1450
- nodes = [model, ...nodes];
1712
+ }
1713
+ plan.columnPlans.push({
1714
+ rowKey: text,
1715
+ propertyName
1451
1716
  });
1452
- });
1717
+ }
1453
1718
  &nbsp;
1454
- return built;
1719
+ const orderedPlans = new Array&lt;IEntityRowPlan&gt;(tableOrder.length);
1720
+ for (let i = 0; i &lt; tableOrder.length; i++) {
1721
+ orderedPlans[i] = plansByTable.get(tableOrder[i]) as IEntityRowPlan;
1722
+ }
1723
+ return orderedPlans;
1455
1724
  };
1456
1725
  &nbsp;
1457
- /*
1458
- * Clump array of flat objects into groups based on id of root
1459
- * In:
1460
- * [
1461
- * [Article {id: 32}, ArticleTag {id: 54}]
1462
- * [Article {id: 32}, ArticleTag {id: 55}]
1463
- * [Article {id: 33}, ArticleTag {id: 56}]
1464
- * ]
1465
- * Out:
1466
- * [
1467
- * [
1468
- * [Article {id: 32}, ArticleTag {id: 54}]
1469
- * [Article {id: 32}, ArticleTag {id: 55}]
1470
- * ]
1471
- * [
1472
- * [Article {id: 33}, ArticleTag {id: 56}]
1473
- * ]
1474
- * ]
1475
- */
1476
- const clumpIntoGroups = (
1477
- processed: Array&lt;Array&lt;IModel&gt;&gt;
1478
- ): Array&lt;Array&lt;Array&lt;IModel&gt;&gt;&gt; =&gt; {
1479
- const root = processed[0][0];
1480
- const rootBo = root.constructor;
1481
- const clumps = processed.reduce((accum: any, item: Array&lt;IModel&gt;) =&gt; {
1482
- const id = getEntityByModel(root)
1483
- .primaryKeys.map(
1484
- (key: string) =&gt;
1485
- item.find((x: IModel) =&gt; x.constructor === rootBo)?.[key]
1486
- )
1487
- .join('@');
1488
- if (accum.has(id)) {
1489
- accum.set(id, [...accum.get(id), item]);
1490
- } else {
1491
- accum.set(id, [item]);
1726
+ const materializeModelsFromRow = (
1727
+ row: any,
1728
+ entityRowPlans: Array&lt;IEntityRowPlan&gt;,
1729
+ rootScopedModelsByEntity: IModelsByEntity,
1730
+ rowModels: Array&lt;IModel | void&gt;,
1731
+ rowModelPkIds: Array&lt;string&gt;,
1732
+ rowCreatedWithPkIndexes: Array&lt;number&gt;
1733
+ ): IModel =&gt; {
1734
+ rowCreatedWithPkIndexes.length = 0;
1735
+ for (let i = 0; i &lt; entityRowPlans.length; i++) {
1736
+ const plan = entityRowPlans[i];
1737
+ const pkId = getPkIdFromRow(row, plan.primaryKeyRowKeys);
1738
+ rowModelPkIds[i] = pkId;
1739
+ if (pkId) {
1740
+ let modelsForEntity = rootScopedModelsByEntity.get(plan.entity);
1741
+ if (!modelsForEntity) {
1742
+ modelsForEntity = new Map&lt;string, IModel&gt;();
1743
+ rootScopedModelsByEntity.set(plan.entity, modelsForEntity);
1744
+ } else {
1745
+ const existing = modelsForEntity.get(pkId);
1746
+ if (existing) {
1747
+ rowModels[i] = existing;
1748
+ continue;
1749
+ }
1750
+ }
1751
+ } else <span class="missing-if-branch" title="else path not taken" >E</span>if (i !== 0) {
1752
+ // No primary key means this is typically an outer-joined null row.
1753
+ // Skip model construction for non-root entities since it cannot link.
1754
+ rowModels[i] = void 0;
1755
+ continue;
1492
1756
  }
1493
- return accum;
1494
- }, new Map());
1495
- return [...clumps.values()];
1757
+ const props: any = {};
1758
+ for (let j = 0; j &lt; plan.columnPlans.length; j++) {
1759
+ const columnPlan = plan.columnPlans[j];
1760
+ props[columnPlan.propertyName] = row[columnPlan.rowKey];
1761
+ }
1762
+ const model = new plan.entity.Model(props);
1763
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (pkId) {
1764
+ // modelsForEntity is guaranteed to be initialized above for pk rows.
1765
+ (rootScopedModelsByEntity.get(plan.entity) as Map&lt;string, IModel&gt;).set(
1766
+ pkId,
1767
+ model
1768
+ );
1769
+ rowCreatedWithPkIndexes.push(i);
1770
+ }
1771
+ rowModels[i] = model;
1772
+ }
1773
+ return rowModels[0] as IModel;
1496
1774
  };
1497
1775
  &nbsp;
1498
- const mapToBos = (objectified: any) =&gt; {
1499
- return Object.keys(objectified).map((tableName) =&gt; {
1500
- const entity = getEntityByTableName(tableName);
1501
- const propified = Object.keys(objectified[tableName]).reduce(
1502
- (obj: any, column) =&gt; {
1503
- let propertyName =
1504
- entity.propertyNames[entity.columnNames.indexOf(column)];
1505
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!propertyName) {
1506
- <span class="cstat-no" title="statement not covered" > if (column.startsWith('meta_')) {</span>
1507
- <span class="cstat-no" title="statement not covered" > propertyName = camelCase(column);</span>
1508
- } else {
1509
- <span class="cstat-no" title="statement not covered" > throw Error(</span>
1510
- `No property name for "${column}" in business object "${entity.displayName}". Non-spec'd columns must begin with "meta_".`
1511
- );
1512
- }
1513
- }
1514
- obj[propertyName] = objectified[tableName][column];
1515
- return obj;
1516
- },
1517
- {}
1518
- );
1519
- return new entity.Model(propified);
1520
- });
1776
+ type IModelsByEntity = Map&lt;IEntityInternal&lt;IModel&gt;, Map&lt;string, IModel&gt;&gt;;
1777
+ interface IRootScopeState {
1778
+ modelsByEntity: IModelsByEntity;
1779
+ collectionMembership?: WeakMap&lt;
1780
+ IModel,
1781
+ Map&lt;IEntityInternal&lt;IModel&gt;, Set&lt;string&gt;&gt;
1782
+ &gt;;
1783
+ }
1784
+ type IRootScopeStateByKey = Map&lt;string, IRootScopeState&gt;;
1785
+ &nbsp;
1786
+ const getRootScopeKey = (
1787
+ row: any,
1788
+ rootEntity: IEntityInternal&lt;IModel&gt;,
1789
+ rootPrimaryKeys: Array&lt;string&gt;
1790
+ ): string =&gt; {
1791
+ let rootScopeKey = '';
1792
+ for (let i = 0; i &lt; rootPrimaryKeys.length; i++) {
1793
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (i &gt; 0) {
1794
+ <span class="cstat-no" title="statement not covered" > rootScopeKey += '@';</span>
1795
+ }
1796
+ const value = row[`${rootEntity.tableName}#${rootPrimaryKeys[i]}`];
1797
+ rootScopeKey += value === void 0 || value === null ? <span class="branch-0 cbranch-no" title="branch not covered" >'' </span>: String(value);
1798
+ }
1799
+ return rootScopeKey;
1800
+ };
1801
+ &nbsp;
1802
+ const ensureRootScopeState = (
1803
+ rootScopeKey: string,
1804
+ rootScopeStateByKey: IRootScopeStateByKey
1805
+ ): IRootScopeState =&gt; {
1806
+ let state = rootScopeStateByKey.get(rootScopeKey);
1807
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (!state) {
1808
+ state = {
1809
+ modelsByEntity: new Map&lt;IEntityInternal&lt;IModel&gt;, Map&lt;string, IModel&gt;&gt;()
1810
+ };
1811
+ rootScopeStateByKey.set(rootScopeKey, state);
1812
+ }
1813
+ return state;
1814
+ };
1815
+ &nbsp;
1816
+ const ensureCollectionMembership = (
1817
+ rootScopeState: IRootScopeState
1818
+ ): WeakMap&lt;IModel, Map&lt;IEntityInternal&lt;IModel&gt;, Set&lt;string&gt;&gt;&gt; =&gt; {
1819
+ if (!rootScopeState.collectionMembership) {
1820
+ rootScopeState.collectionMembership = new WeakMap&lt;
1821
+ IModel,
1822
+ Map&lt;IEntityInternal&lt;IModel&gt;, Set&lt;string&gt;&gt;
1823
+ &gt;();
1824
+ }
1825
+ return rootScopeState.collectionMembership;
1826
+ };
1827
+ &nbsp;
1828
+ const linkSourceToTarget = ({
1829
+ sourceEntity,
1830
+ sourceModel,
1831
+ sourceModelPkId,
1832
+ targetEntity,
1833
+ targetModel,
1834
+ collectionMembership
1835
+ }: {
1836
+ sourceEntity: IEntityInternal&lt;IModel&gt;;
1837
+ sourceModel: IModel;
1838
+ sourceModelPkId: string;
1839
+ targetEntity: IEntityInternal&lt;IModel&gt;;
1840
+ targetModel: IModel;
1841
+ collectionMembership: WeakMap&lt;
1842
+ IModel,
1843
+ Map&lt;IEntityInternal&lt;IModel&gt;, Set&lt;string&gt;&gt;
1844
+ &gt;;
1845
+ }) =&gt; {
1846
+ sourceModel[targetEntity.displayName as keyof typeof sourceModel] =
1847
+ targetModel;
1848
+ &nbsp;
1849
+ const collectionKey =
1850
+ sourceEntity.collectionDisplayName as keyof typeof targetModel;
1851
+ let collection = targetModel[collectionKey];
1852
+ if (!collection) {
1853
+ const Collection = sourceEntity.Collection;
1854
+ const createdCollection = new Collection({ models: [] });
1855
+ // Keep ORM back-reference collections out of default JSON serialization.
1856
+ Object.defineProperty(targetModel, collectionKey, {
1857
+ value: createdCollection,
1858
+ writable: true,
1859
+ configurable: true,
1860
+ enumerable: false
1861
+ });
1862
+ collection = createdCollection;
1863
+ }
1864
+ &nbsp;
1865
+ let byCollection = collectionMembership.get(targetModel);
1866
+ if (!byCollection) {
1867
+ byCollection = new Map&lt;IEntityInternal&lt;IModel&gt;, Set&lt;string&gt;&gt;();
1868
+ collectionMembership.set(targetModel, byCollection);
1869
+ }
1870
+ let memberIds = byCollection.get(sourceEntity);
1871
+ if (!memberIds) {
1872
+ memberIds = new Set&lt;string&gt;();
1873
+ byCollection.set(sourceEntity, memberIds);
1874
+ }
1875
+ if (!memberIds.has(sourceModelPkId)) {
1876
+ collection.models.push(sourceModel);
1877
+ memberIds.add(sourceModelPkId);
1878
+ }
1521
1879
  };
1522
1880
  &nbsp;
1523
1881
  /*
1524
- * Make objects (based on special table#column names) from flat database
1525
- * return value.
1882
+ * createFromDatabase architecture:
1883
+ * 1) Compile row plans once (column -&gt; property mapping per entity/table).
1884
+ * 2) Materialize models per row with scoped de-duplication by root scope key.
1885
+ * 3) Index models by root scope + entity + entity primary key.
1886
+ * 4) Link refs incrementally as new models appear.
1887
+ * 5) Return root models in first-seen root scope order.
1526
1888
  */
1527
- const objectifyDatabaseResult = (result: object) =&gt; {
1528
- return Object.keys(result).reduce((obj: any, text: string) =&gt; {
1529
- const tableName = text.split('#')[0];
1530
- const column = text.split('#')[1];
1531
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!tableName || !column) {
1532
- <span class="cstat-no" title="statement not covered" > throw new Error('Column names must be namespaced to table');</span>
1889
+ const createFromDatabase = &lt;T extends ICollection&lt;IModel&gt;&gt;(rows: any): T =&gt; {
1890
+ const result = Array.isArray(rows) ? rows : [rows];
1891
+ const len = result.length;
1892
+ const entityRowPlans = buildEntityRowPlans(result[0]);
1893
+ const selectedEntities = new Set&lt;IEntityInternal&lt;IModel&gt;&gt;();
1894
+ for (let i = 0; i &lt; entityRowPlans.length; i++) {
1895
+ selectedEntities.add(entityRowPlans[i].entity);
1896
+ }
1897
+ const applicableRefPlans = new Map&lt;
1898
+ IEntityInternal&lt;IModel&gt;,
1899
+ Array&lt;{ property: string; targetEntity: IEntityInternal&lt;IModel&gt; }&gt;
1900
+ &gt;();
1901
+ for (let i = 0; i &lt; entityRowPlans.length; i++) {
1902
+ const entity = entityRowPlans[i].entity;
1903
+ const refs = entityReferencePlans.get(entity) || <span class="branch-1 cbranch-no" title="branch not covered" >[];</span>
1904
+ const filteredRefs = refs.filter((ref) =&gt;
1905
+ selectedEntities.has(ref.targetEntity)
1906
+ );
1907
+ applicableRefPlans.set(entity, filteredRefs);
1908
+ }
1909
+ const rootEntity = entityRowPlans[0].entity;
1910
+ const rootPrimaryKeys = rootEntity.primaryKeys;
1911
+ const rootScopeOrder: Array&lt;string&gt; = [];
1912
+ const rootModelsByScopeKey = new Map&lt;string, IModel&gt;();
1913
+ const rootScopeStateByKey: IRootScopeStateByKey = new Map();
1914
+ let currentRootScopeKey: string | void = void 0;
1915
+ let currentRootScopeState: IRootScopeState | void = void 0;
1916
+ const rowModels = new Array&lt;IModel | void&gt;(entityRowPlans.length);
1917
+ const rowModelPkIds = new Array&lt;string&gt;(entityRowPlans.length);
1918
+ const rowCreatedWithPkIndexes: Array&lt;number&gt; = [];
1919
+ &nbsp;
1920
+ // Phase 1: materialize and index model instances by root scope + entity.
1921
+ for (let i = 0; i &lt; len; i++) {
1922
+ const row = result[i];
1923
+ const rootScopeKey = getRootScopeKey(row, rootEntity, rootPrimaryKeys);
1924
+ let rootScopeState: IRootScopeState | void = currentRootScopeState;
1925
+ if (!rootScopeState || rootScopeKey !== currentRootScopeKey) {
1926
+ rootScopeState = ensureRootScopeState(
1927
+ rootScopeKey,
1928
+ rootScopeStateByKey
1929
+ );
1930
+ currentRootScopeKey = rootScopeKey;
1931
+ currentRootScopeState = rootScopeState;
1932
+ }
1933
+ const rootModel = materializeModelsFromRow(
1934
+ row,
1935
+ entityRowPlans,
1936
+ rootScopeState.modelsByEntity,
1937
+ rowModels,
1938
+ rowModelPkIds,
1939
+ rowCreatedWithPkIndexes
1940
+ );
1941
+ if (!rootModelsByScopeKey.has(rootScopeKey)) {
1942
+ rootScopeOrder.push(rootScopeKey);
1943
+ rootModelsByScopeKey.set(rootScopeKey, rootModel);
1533
1944
  }
1534
- obj[tableName] = obj[tableName] || {};
1535
- obj[tableName][column] = result[text as keyof typeof result];
1536
- return obj;
1537
- }, {});
1538
- };
1539
1945
  &nbsp;
1540
- const createFromDatabase = &lt;T extends ICollection&lt;IModel&gt;&gt;(rows: any): T =&gt; {
1541
- const result = Array.isArray(rows) ? rows : <span class="branch-1 cbranch-no" title="branch not covered" >[rows];</span>
1542
- const objectified = result.map(objectifyDatabaseResult);
1543
- const boified = objectified.map(mapToBos);
1544
- const clumps = clumpIntoGroups(boified);
1545
- const nested = clumps.map(nestClump);
1546
- const models = nested.map((n) =&gt; Object.values(n)[0]);
1946
+ for (let c = 0; c &lt; rowCreatedWithPkIndexes.length; c++) {
1947
+ const j = rowCreatedWithPkIndexes[c];
1948
+ const sourceModel = rowModels[j] as IModel;
1949
+ const sourceModelPkId = rowModelPkIds[j];
1950
+ const sourceEntity = entityRowPlans[j].entity;
1951
+ &nbsp;
1952
+ const refs = applicableRefPlans.get(sourceEntity);
1953
+ if (!refs || refs.length === 0) {
1954
+ continue;
1955
+ }
1956
+ &nbsp;
1957
+ for (let r = 0; r &lt; refs.length; r++) {
1958
+ const ref = refs[r];
1959
+ const refId = sourceModel[ref.property as keyof typeof sourceModel];
1960
+ if (refId == null) {
1961
+ continue;
1962
+ }
1963
+ const targetPkId = String(refId);
1964
+ const target = rootScopeState.modelsByEntity
1965
+ .get(ref.targetEntity)
1966
+ ?.get(targetPkId);
1967
+ if (target) {
1968
+ linkSourceToTarget({
1969
+ sourceEntity,
1970
+ sourceModel,
1971
+ sourceModelPkId,
1972
+ targetEntity: ref.targetEntity,
1973
+ targetModel: target,
1974
+ collectionMembership: ensureCollectionMembership(rootScopeState)
1975
+ });
1976
+ }
1977
+ }
1978
+ }
1979
+ }
1980
+ &nbsp;
1981
+ const models = new Array&lt;IModel&gt;(rootScopeOrder.length);
1982
+ for (let i = 0; i &lt; rootScopeOrder.length; i++) {
1983
+ models[i] = rootModelsByScopeKey.get(rootScopeOrder[i]) as IModel;
1984
+ }
1547
1985
  const Collection = getEntityByModel(models[0]).Collection;
1548
1986
  return &lt;T&gt;new Collection({ models });
1549
1987
  };
@@ -1615,7 +2053,7 @@ export const createCore = ({
1615
2053
  </div><!-- /wrapper -->
1616
2054
  <div class='footer quiet pad2 space-top1 center small'>
1617
2055
  Code coverage
1618
- generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Sun Jun 01 2025 21:09:39 GMT-0400 (Eastern Daylight Time)
2056
+ generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Mon Mar 02 2026 20:05:31 GMT-0500 (Eastern Standard Time)
1619
2057
  </div>
1620
2058
  </div>
1621
2059
  <script src="../prettify.js"></script>