@openreplay/tracker 10.0.2 → 10.0.4

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 (75) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/cjs/app/index.js +1 -1
  3. package/cjs/index.js +1 -1
  4. package/cjs/modules/Network/fetchProxy.js +4 -2
  5. package/cjs/utils.js +16 -2
  6. package/coverage/clover.xml +1575 -733
  7. package/coverage/coverage-final.json +22 -14
  8. package/coverage/lcov-report/index.html +60 -45
  9. package/coverage/lcov-report/main/app/canvas.ts.html +475 -0
  10. package/coverage/lcov-report/main/app/guards.ts.html +5 -2
  11. package/coverage/lcov-report/main/app/index.html +34 -19
  12. package/coverage/lcov-report/main/app/index.ts.html +1086 -45
  13. package/coverage/lcov-report/main/app/logger.ts.html +1 -1
  14. package/coverage/lcov-report/main/app/messages.gen.ts.html +179 -146
  15. package/coverage/lcov-report/main/app/nodes.ts.html +1 -1
  16. package/coverage/lcov-report/main/app/observer/iframe_observer.ts.html +1 -1
  17. package/coverage/lcov-report/main/app/observer/iframe_offsets.ts.html +1 -1
  18. package/coverage/lcov-report/main/app/observer/index.html +1 -1
  19. package/coverage/lcov-report/main/app/observer/shadow_root_observer.ts.html +1 -1
  20. package/coverage/lcov-report/main/app/observer/top_observer.ts.html +1 -1
  21. package/coverage/lcov-report/main/app/sanitizer.ts.html +1 -1
  22. package/coverage/lcov-report/main/app/session.ts.html +1 -1
  23. package/coverage/lcov-report/main/app/ticker.ts.html +1 -1
  24. package/coverage/lcov-report/main/index.html +20 -20
  25. package/coverage/lcov-report/main/index.ts.html +274 -100
  26. package/coverage/lcov-report/main/modules/Network/beaconProxy.ts.html +19 -19
  27. package/coverage/lcov-report/main/modules/Network/fetchProxy.ts.html +97 -97
  28. package/coverage/lcov-report/main/modules/Network/index.html +65 -65
  29. package/coverage/lcov-report/main/modules/Network/index.ts.html +33 -33
  30. package/coverage/lcov-report/main/modules/Network/networkMessage.ts.html +82 -73
  31. package/coverage/lcov-report/main/modules/Network/utils.ts.html +34 -34
  32. package/coverage/lcov-report/main/modules/Network/xhrProxy.ts.html +13 -13
  33. package/coverage/lcov-report/main/modules/attributeSender.ts.html +1 -1
  34. package/coverage/lcov-report/main/modules/axiosSpy.ts.html +1 -1
  35. package/coverage/lcov-report/main/modules/conditionsManager.ts.html +799 -0
  36. package/coverage/lcov-report/main/modules/connection.ts.html +1 -1
  37. package/coverage/lcov-report/main/modules/console.ts.html +1 -1
  38. package/coverage/lcov-report/main/modules/constructedStyleSheets.ts.html +1 -1
  39. package/coverage/lcov-report/main/modules/cssrules.ts.html +1 -1
  40. package/coverage/lcov-report/main/modules/exception.ts.html +1 -1
  41. package/coverage/lcov-report/main/modules/featureFlags.ts.html +10 -7
  42. package/coverage/lcov-report/main/modules/focus.ts.html +1 -1
  43. package/coverage/lcov-report/main/modules/fonts.ts.html +1 -1
  44. package/coverage/lcov-report/main/modules/img.ts.html +1 -1
  45. package/coverage/lcov-report/main/modules/index.html +27 -12
  46. package/coverage/lcov-report/main/modules/input.ts.html +1 -1
  47. package/coverage/lcov-report/main/modules/mouse.ts.html +1 -1
  48. package/coverage/lcov-report/main/modules/network.ts.html +2 -2
  49. package/coverage/lcov-report/main/modules/performance.ts.html +1 -1
  50. package/coverage/lcov-report/main/modules/scroll.ts.html +1 -1
  51. package/coverage/lcov-report/main/modules/selection.ts.html +1 -1
  52. package/coverage/lcov-report/main/modules/tabs.ts.html +1 -1
  53. package/coverage/lcov-report/main/modules/timing.ts.html +1 -1
  54. package/coverage/lcov-report/main/modules/userTesting/SignalManager.ts.html +370 -0
  55. package/coverage/lcov-report/main/modules/userTesting/dnd.ts.html +10 -22
  56. package/coverage/lcov-report/main/modules/userTesting/index.html +57 -27
  57. package/coverage/lcov-report/main/modules/userTesting/index.ts.html +814 -115
  58. package/coverage/lcov-report/main/modules/userTesting/recorder.ts.html +136 -67
  59. package/coverage/lcov-report/main/modules/userTesting/styles.ts.html +111 -39
  60. package/coverage/lcov-report/main/modules/userTesting/utils.ts.html +364 -0
  61. package/coverage/lcov-report/main/modules/viewport.ts.html +1 -1
  62. package/coverage/lcov-report/main/utils.ts.html +101 -59
  63. package/coverage/lcov-report/webworker/BatchWriter.ts.html +1 -1
  64. package/coverage/lcov-report/webworker/MessageEncoder.gen.ts.html +17 -5
  65. package/coverage/lcov-report/webworker/PrimitiveEncoder.ts.html +1 -1
  66. package/coverage/lcov-report/webworker/QueueSender.ts.html +1 -1
  67. package/coverage/lcov-report/webworker/index.html +9 -9
  68. package/coverage/lcov-report/webworker/index.ts.html +15 -9
  69. package/coverage/lcov.info +2699 -1150
  70. package/lib/app/index.js +1 -1
  71. package/lib/common/tsconfig.tsbuildinfo +1 -1
  72. package/lib/index.js +1 -1
  73. package/lib/modules/Network/fetchProxy.js +4 -2
  74. package/lib/utils.js +16 -2
  75. package/package.json +1 -1
@@ -25,28 +25,28 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/290</span>
28
+ <span class='fraction'>0/452</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
33
  <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/158</span>
35
+ <span class='fraction'>0/240</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">0% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/57</span>
42
+ <span class='fraction'>0/75</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/282</span>
49
+ <span class='fraction'>0/441</span>
50
50
  </div>
51
51
 
52
52
 
@@ -823,7 +823,356 @@
823
823
  <a name='L758'></a><a href='#L758'>758</a>
824
824
  <a name='L759'></a><a href='#L759'>759</a>
825
825
  <a name='L760'></a><a href='#L760'>760</a>
826
- <a name='L761'></a><a href='#L761'>761</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
826
+ <a name='L761'></a><a href='#L761'>761</a>
827
+ <a name='L762'></a><a href='#L762'>762</a>
828
+ <a name='L763'></a><a href='#L763'>763</a>
829
+ <a name='L764'></a><a href='#L764'>764</a>
830
+ <a name='L765'></a><a href='#L765'>765</a>
831
+ <a name='L766'></a><a href='#L766'>766</a>
832
+ <a name='L767'></a><a href='#L767'>767</a>
833
+ <a name='L768'></a><a href='#L768'>768</a>
834
+ <a name='L769'></a><a href='#L769'>769</a>
835
+ <a name='L770'></a><a href='#L770'>770</a>
836
+ <a name='L771'></a><a href='#L771'>771</a>
837
+ <a name='L772'></a><a href='#L772'>772</a>
838
+ <a name='L773'></a><a href='#L773'>773</a>
839
+ <a name='L774'></a><a href='#L774'>774</a>
840
+ <a name='L775'></a><a href='#L775'>775</a>
841
+ <a name='L776'></a><a href='#L776'>776</a>
842
+ <a name='L777'></a><a href='#L777'>777</a>
843
+ <a name='L778'></a><a href='#L778'>778</a>
844
+ <a name='L779'></a><a href='#L779'>779</a>
845
+ <a name='L780'></a><a href='#L780'>780</a>
846
+ <a name='L781'></a><a href='#L781'>781</a>
847
+ <a name='L782'></a><a href='#L782'>782</a>
848
+ <a name='L783'></a><a href='#L783'>783</a>
849
+ <a name='L784'></a><a href='#L784'>784</a>
850
+ <a name='L785'></a><a href='#L785'>785</a>
851
+ <a name='L786'></a><a href='#L786'>786</a>
852
+ <a name='L787'></a><a href='#L787'>787</a>
853
+ <a name='L788'></a><a href='#L788'>788</a>
854
+ <a name='L789'></a><a href='#L789'>789</a>
855
+ <a name='L790'></a><a href='#L790'>790</a>
856
+ <a name='L791'></a><a href='#L791'>791</a>
857
+ <a name='L792'></a><a href='#L792'>792</a>
858
+ <a name='L793'></a><a href='#L793'>793</a>
859
+ <a name='L794'></a><a href='#L794'>794</a>
860
+ <a name='L795'></a><a href='#L795'>795</a>
861
+ <a name='L796'></a><a href='#L796'>796</a>
862
+ <a name='L797'></a><a href='#L797'>797</a>
863
+ <a name='L798'></a><a href='#L798'>798</a>
864
+ <a name='L799'></a><a href='#L799'>799</a>
865
+ <a name='L800'></a><a href='#L800'>800</a>
866
+ <a name='L801'></a><a href='#L801'>801</a>
867
+ <a name='L802'></a><a href='#L802'>802</a>
868
+ <a name='L803'></a><a href='#L803'>803</a>
869
+ <a name='L804'></a><a href='#L804'>804</a>
870
+ <a name='L805'></a><a href='#L805'>805</a>
871
+ <a name='L806'></a><a href='#L806'>806</a>
872
+ <a name='L807'></a><a href='#L807'>807</a>
873
+ <a name='L808'></a><a href='#L808'>808</a>
874
+ <a name='L809'></a><a href='#L809'>809</a>
875
+ <a name='L810'></a><a href='#L810'>810</a>
876
+ <a name='L811'></a><a href='#L811'>811</a>
877
+ <a name='L812'></a><a href='#L812'>812</a>
878
+ <a name='L813'></a><a href='#L813'>813</a>
879
+ <a name='L814'></a><a href='#L814'>814</a>
880
+ <a name='L815'></a><a href='#L815'>815</a>
881
+ <a name='L816'></a><a href='#L816'>816</a>
882
+ <a name='L817'></a><a href='#L817'>817</a>
883
+ <a name='L818'></a><a href='#L818'>818</a>
884
+ <a name='L819'></a><a href='#L819'>819</a>
885
+ <a name='L820'></a><a href='#L820'>820</a>
886
+ <a name='L821'></a><a href='#L821'>821</a>
887
+ <a name='L822'></a><a href='#L822'>822</a>
888
+ <a name='L823'></a><a href='#L823'>823</a>
889
+ <a name='L824'></a><a href='#L824'>824</a>
890
+ <a name='L825'></a><a href='#L825'>825</a>
891
+ <a name='L826'></a><a href='#L826'>826</a>
892
+ <a name='L827'></a><a href='#L827'>827</a>
893
+ <a name='L828'></a><a href='#L828'>828</a>
894
+ <a name='L829'></a><a href='#L829'>829</a>
895
+ <a name='L830'></a><a href='#L830'>830</a>
896
+ <a name='L831'></a><a href='#L831'>831</a>
897
+ <a name='L832'></a><a href='#L832'>832</a>
898
+ <a name='L833'></a><a href='#L833'>833</a>
899
+ <a name='L834'></a><a href='#L834'>834</a>
900
+ <a name='L835'></a><a href='#L835'>835</a>
901
+ <a name='L836'></a><a href='#L836'>836</a>
902
+ <a name='L837'></a><a href='#L837'>837</a>
903
+ <a name='L838'></a><a href='#L838'>838</a>
904
+ <a name='L839'></a><a href='#L839'>839</a>
905
+ <a name='L840'></a><a href='#L840'>840</a>
906
+ <a name='L841'></a><a href='#L841'>841</a>
907
+ <a name='L842'></a><a href='#L842'>842</a>
908
+ <a name='L843'></a><a href='#L843'>843</a>
909
+ <a name='L844'></a><a href='#L844'>844</a>
910
+ <a name='L845'></a><a href='#L845'>845</a>
911
+ <a name='L846'></a><a href='#L846'>846</a>
912
+ <a name='L847'></a><a href='#L847'>847</a>
913
+ <a name='L848'></a><a href='#L848'>848</a>
914
+ <a name='L849'></a><a href='#L849'>849</a>
915
+ <a name='L850'></a><a href='#L850'>850</a>
916
+ <a name='L851'></a><a href='#L851'>851</a>
917
+ <a name='L852'></a><a href='#L852'>852</a>
918
+ <a name='L853'></a><a href='#L853'>853</a>
919
+ <a name='L854'></a><a href='#L854'>854</a>
920
+ <a name='L855'></a><a href='#L855'>855</a>
921
+ <a name='L856'></a><a href='#L856'>856</a>
922
+ <a name='L857'></a><a href='#L857'>857</a>
923
+ <a name='L858'></a><a href='#L858'>858</a>
924
+ <a name='L859'></a><a href='#L859'>859</a>
925
+ <a name='L860'></a><a href='#L860'>860</a>
926
+ <a name='L861'></a><a href='#L861'>861</a>
927
+ <a name='L862'></a><a href='#L862'>862</a>
928
+ <a name='L863'></a><a href='#L863'>863</a>
929
+ <a name='L864'></a><a href='#L864'>864</a>
930
+ <a name='L865'></a><a href='#L865'>865</a>
931
+ <a name='L866'></a><a href='#L866'>866</a>
932
+ <a name='L867'></a><a href='#L867'>867</a>
933
+ <a name='L868'></a><a href='#L868'>868</a>
934
+ <a name='L869'></a><a href='#L869'>869</a>
935
+ <a name='L870'></a><a href='#L870'>870</a>
936
+ <a name='L871'></a><a href='#L871'>871</a>
937
+ <a name='L872'></a><a href='#L872'>872</a>
938
+ <a name='L873'></a><a href='#L873'>873</a>
939
+ <a name='L874'></a><a href='#L874'>874</a>
940
+ <a name='L875'></a><a href='#L875'>875</a>
941
+ <a name='L876'></a><a href='#L876'>876</a>
942
+ <a name='L877'></a><a href='#L877'>877</a>
943
+ <a name='L878'></a><a href='#L878'>878</a>
944
+ <a name='L879'></a><a href='#L879'>879</a>
945
+ <a name='L880'></a><a href='#L880'>880</a>
946
+ <a name='L881'></a><a href='#L881'>881</a>
947
+ <a name='L882'></a><a href='#L882'>882</a>
948
+ <a name='L883'></a><a href='#L883'>883</a>
949
+ <a name='L884'></a><a href='#L884'>884</a>
950
+ <a name='L885'></a><a href='#L885'>885</a>
951
+ <a name='L886'></a><a href='#L886'>886</a>
952
+ <a name='L887'></a><a href='#L887'>887</a>
953
+ <a name='L888'></a><a href='#L888'>888</a>
954
+ <a name='L889'></a><a href='#L889'>889</a>
955
+ <a name='L890'></a><a href='#L890'>890</a>
956
+ <a name='L891'></a><a href='#L891'>891</a>
957
+ <a name='L892'></a><a href='#L892'>892</a>
958
+ <a name='L893'></a><a href='#L893'>893</a>
959
+ <a name='L894'></a><a href='#L894'>894</a>
960
+ <a name='L895'></a><a href='#L895'>895</a>
961
+ <a name='L896'></a><a href='#L896'>896</a>
962
+ <a name='L897'></a><a href='#L897'>897</a>
963
+ <a name='L898'></a><a href='#L898'>898</a>
964
+ <a name='L899'></a><a href='#L899'>899</a>
965
+ <a name='L900'></a><a href='#L900'>900</a>
966
+ <a name='L901'></a><a href='#L901'>901</a>
967
+ <a name='L902'></a><a href='#L902'>902</a>
968
+ <a name='L903'></a><a href='#L903'>903</a>
969
+ <a name='L904'></a><a href='#L904'>904</a>
970
+ <a name='L905'></a><a href='#L905'>905</a>
971
+ <a name='L906'></a><a href='#L906'>906</a>
972
+ <a name='L907'></a><a href='#L907'>907</a>
973
+ <a name='L908'></a><a href='#L908'>908</a>
974
+ <a name='L909'></a><a href='#L909'>909</a>
975
+ <a name='L910'></a><a href='#L910'>910</a>
976
+ <a name='L911'></a><a href='#L911'>911</a>
977
+ <a name='L912'></a><a href='#L912'>912</a>
978
+ <a name='L913'></a><a href='#L913'>913</a>
979
+ <a name='L914'></a><a href='#L914'>914</a>
980
+ <a name='L915'></a><a href='#L915'>915</a>
981
+ <a name='L916'></a><a href='#L916'>916</a>
982
+ <a name='L917'></a><a href='#L917'>917</a>
983
+ <a name='L918'></a><a href='#L918'>918</a>
984
+ <a name='L919'></a><a href='#L919'>919</a>
985
+ <a name='L920'></a><a href='#L920'>920</a>
986
+ <a name='L921'></a><a href='#L921'>921</a>
987
+ <a name='L922'></a><a href='#L922'>922</a>
988
+ <a name='L923'></a><a href='#L923'>923</a>
989
+ <a name='L924'></a><a href='#L924'>924</a>
990
+ <a name='L925'></a><a href='#L925'>925</a>
991
+ <a name='L926'></a><a href='#L926'>926</a>
992
+ <a name='L927'></a><a href='#L927'>927</a>
993
+ <a name='L928'></a><a href='#L928'>928</a>
994
+ <a name='L929'></a><a href='#L929'>929</a>
995
+ <a name='L930'></a><a href='#L930'>930</a>
996
+ <a name='L931'></a><a href='#L931'>931</a>
997
+ <a name='L932'></a><a href='#L932'>932</a>
998
+ <a name='L933'></a><a href='#L933'>933</a>
999
+ <a name='L934'></a><a href='#L934'>934</a>
1000
+ <a name='L935'></a><a href='#L935'>935</a>
1001
+ <a name='L936'></a><a href='#L936'>936</a>
1002
+ <a name='L937'></a><a href='#L937'>937</a>
1003
+ <a name='L938'></a><a href='#L938'>938</a>
1004
+ <a name='L939'></a><a href='#L939'>939</a>
1005
+ <a name='L940'></a><a href='#L940'>940</a>
1006
+ <a name='L941'></a><a href='#L941'>941</a>
1007
+ <a name='L942'></a><a href='#L942'>942</a>
1008
+ <a name='L943'></a><a href='#L943'>943</a>
1009
+ <a name='L944'></a><a href='#L944'>944</a>
1010
+ <a name='L945'></a><a href='#L945'>945</a>
1011
+ <a name='L946'></a><a href='#L946'>946</a>
1012
+ <a name='L947'></a><a href='#L947'>947</a>
1013
+ <a name='L948'></a><a href='#L948'>948</a>
1014
+ <a name='L949'></a><a href='#L949'>949</a>
1015
+ <a name='L950'></a><a href='#L950'>950</a>
1016
+ <a name='L951'></a><a href='#L951'>951</a>
1017
+ <a name='L952'></a><a href='#L952'>952</a>
1018
+ <a name='L953'></a><a href='#L953'>953</a>
1019
+ <a name='L954'></a><a href='#L954'>954</a>
1020
+ <a name='L955'></a><a href='#L955'>955</a>
1021
+ <a name='L956'></a><a href='#L956'>956</a>
1022
+ <a name='L957'></a><a href='#L957'>957</a>
1023
+ <a name='L958'></a><a href='#L958'>958</a>
1024
+ <a name='L959'></a><a href='#L959'>959</a>
1025
+ <a name='L960'></a><a href='#L960'>960</a>
1026
+ <a name='L961'></a><a href='#L961'>961</a>
1027
+ <a name='L962'></a><a href='#L962'>962</a>
1028
+ <a name='L963'></a><a href='#L963'>963</a>
1029
+ <a name='L964'></a><a href='#L964'>964</a>
1030
+ <a name='L965'></a><a href='#L965'>965</a>
1031
+ <a name='L966'></a><a href='#L966'>966</a>
1032
+ <a name='L967'></a><a href='#L967'>967</a>
1033
+ <a name='L968'></a><a href='#L968'>968</a>
1034
+ <a name='L969'></a><a href='#L969'>969</a>
1035
+ <a name='L970'></a><a href='#L970'>970</a>
1036
+ <a name='L971'></a><a href='#L971'>971</a>
1037
+ <a name='L972'></a><a href='#L972'>972</a>
1038
+ <a name='L973'></a><a href='#L973'>973</a>
1039
+ <a name='L974'></a><a href='#L974'>974</a>
1040
+ <a name='L975'></a><a href='#L975'>975</a>
1041
+ <a name='L976'></a><a href='#L976'>976</a>
1042
+ <a name='L977'></a><a href='#L977'>977</a>
1043
+ <a name='L978'></a><a href='#L978'>978</a>
1044
+ <a name='L979'></a><a href='#L979'>979</a>
1045
+ <a name='L980'></a><a href='#L980'>980</a>
1046
+ <a name='L981'></a><a href='#L981'>981</a>
1047
+ <a name='L982'></a><a href='#L982'>982</a>
1048
+ <a name='L983'></a><a href='#L983'>983</a>
1049
+ <a name='L984'></a><a href='#L984'>984</a>
1050
+ <a name='L985'></a><a href='#L985'>985</a>
1051
+ <a name='L986'></a><a href='#L986'>986</a>
1052
+ <a name='L987'></a><a href='#L987'>987</a>
1053
+ <a name='L988'></a><a href='#L988'>988</a>
1054
+ <a name='L989'></a><a href='#L989'>989</a>
1055
+ <a name='L990'></a><a href='#L990'>990</a>
1056
+ <a name='L991'></a><a href='#L991'>991</a>
1057
+ <a name='L992'></a><a href='#L992'>992</a>
1058
+ <a name='L993'></a><a href='#L993'>993</a>
1059
+ <a name='L994'></a><a href='#L994'>994</a>
1060
+ <a name='L995'></a><a href='#L995'>995</a>
1061
+ <a name='L996'></a><a href='#L996'>996</a>
1062
+ <a name='L997'></a><a href='#L997'>997</a>
1063
+ <a name='L998'></a><a href='#L998'>998</a>
1064
+ <a name='L999'></a><a href='#L999'>999</a>
1065
+ <a name='L1000'></a><a href='#L1000'>1000</a>
1066
+ <a name='L1001'></a><a href='#L1001'>1001</a>
1067
+ <a name='L1002'></a><a href='#L1002'>1002</a>
1068
+ <a name='L1003'></a><a href='#L1003'>1003</a>
1069
+ <a name='L1004'></a><a href='#L1004'>1004</a>
1070
+ <a name='L1005'></a><a href='#L1005'>1005</a>
1071
+ <a name='L1006'></a><a href='#L1006'>1006</a>
1072
+ <a name='L1007'></a><a href='#L1007'>1007</a>
1073
+ <a name='L1008'></a><a href='#L1008'>1008</a>
1074
+ <a name='L1009'></a><a href='#L1009'>1009</a>
1075
+ <a name='L1010'></a><a href='#L1010'>1010</a>
1076
+ <a name='L1011'></a><a href='#L1011'>1011</a>
1077
+ <a name='L1012'></a><a href='#L1012'>1012</a>
1078
+ <a name='L1013'></a><a href='#L1013'>1013</a>
1079
+ <a name='L1014'></a><a href='#L1014'>1014</a>
1080
+ <a name='L1015'></a><a href='#L1015'>1015</a>
1081
+ <a name='L1016'></a><a href='#L1016'>1016</a>
1082
+ <a name='L1017'></a><a href='#L1017'>1017</a>
1083
+ <a name='L1018'></a><a href='#L1018'>1018</a>
1084
+ <a name='L1019'></a><a href='#L1019'>1019</a>
1085
+ <a name='L1020'></a><a href='#L1020'>1020</a>
1086
+ <a name='L1021'></a><a href='#L1021'>1021</a>
1087
+ <a name='L1022'></a><a href='#L1022'>1022</a>
1088
+ <a name='L1023'></a><a href='#L1023'>1023</a>
1089
+ <a name='L1024'></a><a href='#L1024'>1024</a>
1090
+ <a name='L1025'></a><a href='#L1025'>1025</a>
1091
+ <a name='L1026'></a><a href='#L1026'>1026</a>
1092
+ <a name='L1027'></a><a href='#L1027'>1027</a>
1093
+ <a name='L1028'></a><a href='#L1028'>1028</a>
1094
+ <a name='L1029'></a><a href='#L1029'>1029</a>
1095
+ <a name='L1030'></a><a href='#L1030'>1030</a>
1096
+ <a name='L1031'></a><a href='#L1031'>1031</a>
1097
+ <a name='L1032'></a><a href='#L1032'>1032</a>
1098
+ <a name='L1033'></a><a href='#L1033'>1033</a>
1099
+ <a name='L1034'></a><a href='#L1034'>1034</a>
1100
+ <a name='L1035'></a><a href='#L1035'>1035</a>
1101
+ <a name='L1036'></a><a href='#L1036'>1036</a>
1102
+ <a name='L1037'></a><a href='#L1037'>1037</a>
1103
+ <a name='L1038'></a><a href='#L1038'>1038</a>
1104
+ <a name='L1039'></a><a href='#L1039'>1039</a>
1105
+ <a name='L1040'></a><a href='#L1040'>1040</a>
1106
+ <a name='L1041'></a><a href='#L1041'>1041</a>
1107
+ <a name='L1042'></a><a href='#L1042'>1042</a>
1108
+ <a name='L1043'></a><a href='#L1043'>1043</a>
1109
+ <a name='L1044'></a><a href='#L1044'>1044</a>
1110
+ <a name='L1045'></a><a href='#L1045'>1045</a>
1111
+ <a name='L1046'></a><a href='#L1046'>1046</a>
1112
+ <a name='L1047'></a><a href='#L1047'>1047</a>
1113
+ <a name='L1048'></a><a href='#L1048'>1048</a>
1114
+ <a name='L1049'></a><a href='#L1049'>1049</a>
1115
+ <a name='L1050'></a><a href='#L1050'>1050</a>
1116
+ <a name='L1051'></a><a href='#L1051'>1051</a>
1117
+ <a name='L1052'></a><a href='#L1052'>1052</a>
1118
+ <a name='L1053'></a><a href='#L1053'>1053</a>
1119
+ <a name='L1054'></a><a href='#L1054'>1054</a>
1120
+ <a name='L1055'></a><a href='#L1055'>1055</a>
1121
+ <a name='L1056'></a><a href='#L1056'>1056</a>
1122
+ <a name='L1057'></a><a href='#L1057'>1057</a>
1123
+ <a name='L1058'></a><a href='#L1058'>1058</a>
1124
+ <a name='L1059'></a><a href='#L1059'>1059</a>
1125
+ <a name='L1060'></a><a href='#L1060'>1060</a>
1126
+ <a name='L1061'></a><a href='#L1061'>1061</a>
1127
+ <a name='L1062'></a><a href='#L1062'>1062</a>
1128
+ <a name='L1063'></a><a href='#L1063'>1063</a>
1129
+ <a name='L1064'></a><a href='#L1064'>1064</a>
1130
+ <a name='L1065'></a><a href='#L1065'>1065</a>
1131
+ <a name='L1066'></a><a href='#L1066'>1066</a>
1132
+ <a name='L1067'></a><a href='#L1067'>1067</a>
1133
+ <a name='L1068'></a><a href='#L1068'>1068</a>
1134
+ <a name='L1069'></a><a href='#L1069'>1069</a>
1135
+ <a name='L1070'></a><a href='#L1070'>1070</a>
1136
+ <a name='L1071'></a><a href='#L1071'>1071</a>
1137
+ <a name='L1072'></a><a href='#L1072'>1072</a>
1138
+ <a name='L1073'></a><a href='#L1073'>1073</a>
1139
+ <a name='L1074'></a><a href='#L1074'>1074</a>
1140
+ <a name='L1075'></a><a href='#L1075'>1075</a>
1141
+ <a name='L1076'></a><a href='#L1076'>1076</a>
1142
+ <a name='L1077'></a><a href='#L1077'>1077</a>
1143
+ <a name='L1078'></a><a href='#L1078'>1078</a>
1144
+ <a name='L1079'></a><a href='#L1079'>1079</a>
1145
+ <a name='L1080'></a><a href='#L1080'>1080</a>
1146
+ <a name='L1081'></a><a href='#L1081'>1081</a>
1147
+ <a name='L1082'></a><a href='#L1082'>1082</a>
1148
+ <a name='L1083'></a><a href='#L1083'>1083</a>
1149
+ <a name='L1084'></a><a href='#L1084'>1084</a>
1150
+ <a name='L1085'></a><a href='#L1085'>1085</a>
1151
+ <a name='L1086'></a><a href='#L1086'>1086</a>
1152
+ <a name='L1087'></a><a href='#L1087'>1087</a>
1153
+ <a name='L1088'></a><a href='#L1088'>1088</a>
1154
+ <a name='L1089'></a><a href='#L1089'>1089</a>
1155
+ <a name='L1090'></a><a href='#L1090'>1090</a>
1156
+ <a name='L1091'></a><a href='#L1091'>1091</a>
1157
+ <a name='L1092'></a><a href='#L1092'>1092</a>
1158
+ <a name='L1093'></a><a href='#L1093'>1093</a>
1159
+ <a name='L1094'></a><a href='#L1094'>1094</a>
1160
+ <a name='L1095'></a><a href='#L1095'>1095</a>
1161
+ <a name='L1096'></a><a href='#L1096'>1096</a>
1162
+ <a name='L1097'></a><a href='#L1097'>1097</a>
1163
+ <a name='L1098'></a><a href='#L1098'>1098</a>
1164
+ <a name='L1099'></a><a href='#L1099'>1099</a>
1165
+ <a name='L1100'></a><a href='#L1100'>1100</a>
1166
+ <a name='L1101'></a><a href='#L1101'>1101</a>
1167
+ <a name='L1102'></a><a href='#L1102'>1102</a>
1168
+ <a name='L1103'></a><a href='#L1103'>1103</a>
1169
+ <a name='L1104'></a><a href='#L1104'>1104</a>
1170
+ <a name='L1105'></a><a href='#L1105'>1105</a>
1171
+ <a name='L1106'></a><a href='#L1106'>1106</a>
1172
+ <a name='L1107'></a><a href='#L1107'>1107</a>
1173
+ <a name='L1108'></a><a href='#L1108'>1108</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
1174
+ <span class="cline-any cline-no">&nbsp;</span>
1175
+ <span class="cline-any cline-neutral">&nbsp;</span>
827
1176
  <span class="cline-any cline-no">&nbsp;</span>
828
1177
  <span class="cline-any cline-no">&nbsp;</span>
829
1178
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -848,6 +1197,8 @@
848
1197
  <span class="cline-any cline-neutral">&nbsp;</span>
849
1198
  <span class="cline-any cline-neutral">&nbsp;</span>
850
1199
  <span class="cline-any cline-neutral">&nbsp;</span>
1200
+ <span class="cline-any cline-no">&nbsp;</span>
1201
+ <span class="cline-any cline-no">&nbsp;</span>
851
1202
  <span class="cline-any cline-neutral">&nbsp;</span>
852
1203
  <span class="cline-any cline-neutral">&nbsp;</span>
853
1204
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -875,6 +1226,21 @@
875
1226
  <span class="cline-any cline-neutral">&nbsp;</span>
876
1227
  <span class="cline-any cline-no">&nbsp;</span>
877
1228
  <span class="cline-any cline-no">&nbsp;</span>
1229
+ <span class="cline-any cline-no">&nbsp;</span>
1230
+ <span class="cline-any cline-no">&nbsp;</span>
1231
+ <span class="cline-any cline-neutral">&nbsp;</span>
1232
+ <span class="cline-any cline-neutral">&nbsp;</span>
1233
+ <span class="cline-any cline-neutral">&nbsp;</span>
1234
+ <span class="cline-any cline-neutral">&nbsp;</span>
1235
+ <span class="cline-any cline-neutral">&nbsp;</span>
1236
+ <span class="cline-any cline-neutral">&nbsp;</span>
1237
+ <span class="cline-any cline-neutral">&nbsp;</span>
1238
+ <span class="cline-any cline-neutral">&nbsp;</span>
1239
+ <span class="cline-any cline-neutral">&nbsp;</span>
1240
+ <span class="cline-any cline-neutral">&nbsp;</span>
1241
+ <span class="cline-any cline-neutral">&nbsp;</span>
1242
+ <span class="cline-any cline-neutral">&nbsp;</span>
1243
+ <span class="cline-any cline-neutral">&nbsp;</span>
878
1244
  <span class="cline-any cline-neutral">&nbsp;</span>
879
1245
  <span class="cline-any cline-neutral">&nbsp;</span>
880
1246
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -898,6 +1264,8 @@
898
1264
  <span class="cline-any cline-no">&nbsp;</span>
899
1265
  <span class="cline-any cline-no">&nbsp;</span>
900
1266
  <span class="cline-any cline-no">&nbsp;</span>
1267
+ <span class="cline-any cline-no">&nbsp;</span>
1268
+ <span class="cline-any cline-neutral">&nbsp;</span>
901
1269
  <span class="cline-any cline-neutral">&nbsp;</span>
902
1270
  <span class="cline-any cline-neutral">&nbsp;</span>
903
1271
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -952,6 +1320,12 @@
952
1320
  <span class="cline-any cline-no">&nbsp;</span>
953
1321
  <span class="cline-any cline-neutral">&nbsp;</span>
954
1322
  <span class="cline-any cline-neutral">&nbsp;</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-no">&nbsp;</span>
1326
+ <span class="cline-any cline-no">&nbsp;</span>
1327
+ <span class="cline-any cline-neutral">&nbsp;</span>
1328
+ <span class="cline-any cline-neutral">&nbsp;</span>
955
1329
  <span class="cline-any cline-no">&nbsp;</span>
956
1330
  <span class="cline-any cline-no">&nbsp;</span>
957
1331
  <span class="cline-any cline-no">&nbsp;</span>
@@ -967,11 +1341,17 @@
967
1341
  <span class="cline-any cline-no">&nbsp;</span>
968
1342
  <span class="cline-any cline-neutral">&nbsp;</span>
969
1343
  <span class="cline-any cline-neutral">&nbsp;</span>
1344
+ <span class="cline-any cline-no">&nbsp;</span>
1345
+ <span class="cline-any cline-neutral">&nbsp;</span>
1346
+ <span class="cline-any cline-no">&nbsp;</span>
970
1347
  <span class="cline-any cline-neutral">&nbsp;</span>
971
1348
  <span class="cline-any cline-neutral">&nbsp;</span>
972
1349
  <span class="cline-any cline-neutral">&nbsp;</span>
973
1350
  <span class="cline-any cline-neutral">&nbsp;</span>
974
1351
  <span class="cline-any cline-neutral">&nbsp;</span>
1352
+ <span class="cline-any cline-neutral">&nbsp;</span>
1353
+ <span class="cline-any cline-no">&nbsp;</span>
1354
+ <span class="cline-any cline-neutral">&nbsp;</span>
975
1355
  <span class="cline-any cline-no">&nbsp;</span>
976
1356
  <span class="cline-any cline-no">&nbsp;</span>
977
1357
  <span class="cline-any cline-no">&nbsp;</span>
@@ -997,6 +1377,8 @@
997
1377
  <span class="cline-any cline-neutral">&nbsp;</span>
998
1378
  <span class="cline-any cline-neutral">&nbsp;</span>
999
1379
  <span class="cline-any cline-neutral">&nbsp;</span>
1380
+ <span class="cline-any cline-neutral">&nbsp;</span>
1381
+ <span class="cline-any cline-no">&nbsp;</span>
1000
1382
  <span class="cline-any cline-no">&nbsp;</span>
1001
1383
  <span class="cline-any cline-no">&nbsp;</span>
1002
1384
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1015,6 +1397,7 @@
1015
1397
  <span class="cline-any cline-no">&nbsp;</span>
1016
1398
  <span class="cline-any cline-no">&nbsp;</span>
1017
1399
  <span class="cline-any cline-no">&nbsp;</span>
1400
+ <span class="cline-any cline-no">&nbsp;</span>
1018
1401
  <span class="cline-any cline-neutral">&nbsp;</span>
1019
1402
  <span class="cline-any cline-no">&nbsp;</span>
1020
1403
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1160,6 +1543,14 @@
1160
1543
  <span class="cline-any cline-neutral">&nbsp;</span>
1161
1544
  <span class="cline-any cline-neutral">&nbsp;</span>
1162
1545
  <span class="cline-any cline-no">&nbsp;</span>
1546
+ <span class="cline-any cline-no">&nbsp;</span>
1547
+ <span class="cline-any cline-no">&nbsp;</span>
1548
+ <span class="cline-any cline-no">&nbsp;</span>
1549
+ <span class="cline-any cline-neutral">&nbsp;</span>
1550
+ <span class="cline-any cline-no">&nbsp;</span>
1551
+ <span class="cline-any cline-neutral">&nbsp;</span>
1552
+ <span class="cline-any cline-no">&nbsp;</span>
1553
+ <span class="cline-any cline-neutral">&nbsp;</span>
1163
1554
  <span class="cline-any cline-neutral">&nbsp;</span>
1164
1555
  <span class="cline-any cline-neutral">&nbsp;</span>
1165
1556
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1171,6 +1562,10 @@
1171
1562
  <span class="cline-any cline-neutral">&nbsp;</span>
1172
1563
  <span class="cline-any cline-neutral">&nbsp;</span>
1173
1564
  <span class="cline-any cline-neutral">&nbsp;</span>
1565
+ <span class="cline-any cline-neutral">&nbsp;</span>
1566
+ <span class="cline-any cline-neutral">&nbsp;</span>
1567
+ <span class="cline-any cline-neutral">&nbsp;</span>
1568
+ <span class="cline-any cline-neutral">&nbsp;</span>
1174
1569
  <span class="cline-any cline-no">&nbsp;</span>
1175
1570
  <span class="cline-any cline-no">&nbsp;</span>
1176
1571
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1186,6 +1581,39 @@
1186
1581
  <span class="cline-any cline-no">&nbsp;</span>
1187
1582
  <span class="cline-any cline-neutral">&nbsp;</span>
1188
1583
  <span class="cline-any cline-neutral">&nbsp;</span>
1584
+ <span class="cline-any cline-neutral">&nbsp;</span>
1585
+ <span class="cline-any cline-neutral">&nbsp;</span>
1586
+ <span class="cline-any cline-neutral">&nbsp;</span>
1587
+ <span class="cline-any cline-neutral">&nbsp;</span>
1588
+ <span class="cline-any cline-neutral">&nbsp;</span>
1589
+ <span class="cline-any cline-neutral">&nbsp;</span>
1590
+ <span class="cline-any cline-no">&nbsp;</span>
1591
+ <span class="cline-any cline-no">&nbsp;</span>
1592
+ <span class="cline-any cline-no">&nbsp;</span>
1593
+ <span class="cline-any cline-no">&nbsp;</span>
1594
+ <span class="cline-any cline-no">&nbsp;</span>
1595
+ <span class="cline-any cline-no">&nbsp;</span>
1596
+ <span class="cline-any cline-no">&nbsp;</span>
1597
+ <span class="cline-any cline-neutral">&nbsp;</span>
1598
+ <span class="cline-any cline-neutral">&nbsp;</span>
1599
+ <span class="cline-any cline-neutral">&nbsp;</span>
1600
+ <span class="cline-any cline-neutral">&nbsp;</span>
1601
+ <span class="cline-any cline-no">&nbsp;</span>
1602
+ <span class="cline-any cline-no">&nbsp;</span>
1603
+ <span class="cline-any cline-neutral">&nbsp;</span>
1604
+ <span class="cline-any cline-no">&nbsp;</span>
1605
+ <span class="cline-any cline-neutral">&nbsp;</span>
1606
+ <span class="cline-any cline-neutral">&nbsp;</span>
1607
+ <span class="cline-any cline-neutral">&nbsp;</span>
1608
+ <span class="cline-any cline-neutral">&nbsp;</span>
1609
+ <span class="cline-any cline-no">&nbsp;</span>
1610
+ <span class="cline-any cline-no">&nbsp;</span>
1611
+ <span class="cline-any cline-no">&nbsp;</span>
1612
+ <span class="cline-any cline-neutral">&nbsp;</span>
1613
+ <span class="cline-any cline-neutral">&nbsp;</span>
1614
+ <span class="cline-any cline-no">&nbsp;</span>
1615
+ <span class="cline-any cline-neutral">&nbsp;</span>
1616
+ <span class="cline-any cline-neutral">&nbsp;</span>
1189
1617
  <span class="cline-any cline-no">&nbsp;</span>
1190
1618
  <span class="cline-any cline-neutral">&nbsp;</span>
1191
1619
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1354,22 +1782,130 @@
1354
1782
  <span class="cline-any cline-neutral">&nbsp;</span>
1355
1783
  <span class="cline-any cline-neutral">&nbsp;</span>
1356
1784
  <span class="cline-any cline-neutral">&nbsp;</span>
1785
+ <span class="cline-any cline-no">&nbsp;</span>
1786
+ <span class="cline-any cline-no">&nbsp;</span>
1787
+ <span class="cline-any cline-no">&nbsp;</span>
1788
+ <span class="cline-any cline-no">&nbsp;</span>
1789
+ <span class="cline-any cline-neutral">&nbsp;</span>
1790
+ <span class="cline-any cline-neutral">&nbsp;</span>
1791
+ <span class="cline-any cline-no">&nbsp;</span>
1792
+ <span class="cline-any cline-no">&nbsp;</span>
1793
+ <span class="cline-any cline-no">&nbsp;</span>
1794
+ <span class="cline-any cline-neutral">&nbsp;</span>
1795
+ <span class="cline-any cline-no">&nbsp;</span>
1796
+ <span class="cline-any cline-neutral">&nbsp;</span>
1797
+ <span class="cline-any cline-neutral">&nbsp;</span>
1798
+ <span class="cline-any cline-neutral">&nbsp;</span>
1799
+ <span class="cline-any cline-neutral">&nbsp;</span>
1357
1800
  <span class="cline-any cline-neutral">&nbsp;</span>
1801
+ <span class="cline-any cline-neutral">&nbsp;</span>
1802
+ <span class="cline-any cline-neutral">&nbsp;</span>
1803
+ <span class="cline-any cline-no">&nbsp;</span>
1804
+ <span class="cline-any cline-no">&nbsp;</span>
1358
1805
  <span class="cline-any cline-no">&nbsp;</span>
1359
1806
  <span class="cline-any cline-no">&nbsp;</span>
1360
1807
  <span class="cline-any cline-neutral">&nbsp;</span>
1361
1808
  <span class="cline-any cline-no">&nbsp;</span>
1362
1809
  <span class="cline-any cline-no">&nbsp;</span>
1810
+ <span class="cline-any cline-no">&nbsp;</span>
1811
+ <span class="cline-any cline-neutral">&nbsp;</span>
1812
+ <span class="cline-any cline-neutral">&nbsp;</span>
1813
+ <span class="cline-any cline-neutral">&nbsp;</span>
1814
+ <span class="cline-any cline-neutral">&nbsp;</span>
1815
+ <span class="cline-any cline-neutral">&nbsp;</span>
1816
+ <span class="cline-any cline-neutral">&nbsp;</span>
1817
+ <span class="cline-any cline-neutral">&nbsp;</span>
1818
+ <span class="cline-any cline-neutral">&nbsp;</span>
1819
+ <span class="cline-any cline-neutral">&nbsp;</span>
1820
+ <span class="cline-any cline-neutral">&nbsp;</span>
1821
+ <span class="cline-any cline-neutral">&nbsp;</span>
1822
+ <span class="cline-any cline-neutral">&nbsp;</span>
1823
+ <span class="cline-any cline-neutral">&nbsp;</span>
1824
+ <span class="cline-any cline-neutral">&nbsp;</span>
1825
+ <span class="cline-any cline-neutral">&nbsp;</span>
1826
+ <span class="cline-any cline-neutral">&nbsp;</span>
1363
1827
  <span class="cline-any cline-neutral">&nbsp;</span>
1364
1828
  <span class="cline-any cline-neutral">&nbsp;</span>
1365
1829
  <span class="cline-any cline-neutral">&nbsp;</span>
1366
1830
  <span class="cline-any cline-neutral">&nbsp;</span>
1367
1831
  <span class="cline-any cline-neutral">&nbsp;</span>
1832
+ <span class="cline-any cline-neutral">&nbsp;</span>
1833
+ <span class="cline-any cline-neutral">&nbsp;</span>
1834
+ <span class="cline-any cline-neutral">&nbsp;</span>
1835
+ <span class="cline-any cline-neutral">&nbsp;</span>
1836
+ <span class="cline-any cline-neutral">&nbsp;</span>
1837
+ <span class="cline-any cline-neutral">&nbsp;</span>
1838
+ <span class="cline-any cline-no">&nbsp;</span>
1839
+ <span class="cline-any cline-no">&nbsp;</span>
1840
+ <span class="cline-any cline-no">&nbsp;</span>
1841
+ <span class="cline-any cline-neutral">&nbsp;</span>
1842
+ <span class="cline-any cline-neutral">&nbsp;</span>
1843
+ <span class="cline-any cline-neutral">&nbsp;</span>
1844
+ <span class="cline-any cline-neutral">&nbsp;</span>
1845
+ <span class="cline-any cline-neutral">&nbsp;</span>
1846
+ <span class="cline-any cline-neutral">&nbsp;</span>
1847
+ <span class="cline-any cline-neutral">&nbsp;</span>
1848
+ <span class="cline-any cline-no">&nbsp;</span>
1849
+ <span class="cline-any cline-no">&nbsp;</span>
1850
+ <span class="cline-any cline-no">&nbsp;</span>
1851
+ <span class="cline-any cline-neutral">&nbsp;</span>
1852
+ <span class="cline-any cline-no">&nbsp;</span>
1853
+ <span class="cline-any cline-no">&nbsp;</span>
1854
+ <span class="cline-any cline-no">&nbsp;</span>
1855
+ <span class="cline-any cline-no">&nbsp;</span>
1856
+ <span class="cline-any cline-no">&nbsp;</span>
1857
+ <span class="cline-any cline-no">&nbsp;</span>
1858
+ <span class="cline-any cline-no">&nbsp;</span>
1859
+ <span class="cline-any cline-no">&nbsp;</span>
1860
+ <span class="cline-any cline-neutral">&nbsp;</span>
1861
+ <span class="cline-any cline-no">&nbsp;</span>
1862
+ <span class="cline-any cline-no">&nbsp;</span>
1863
+ <span class="cline-any cline-no">&nbsp;</span>
1864
+ <span class="cline-any cline-neutral">&nbsp;</span>
1865
+ <span class="cline-any cline-no">&nbsp;</span>
1866
+ <span class="cline-any cline-no">&nbsp;</span>
1867
+ <span class="cline-any cline-no">&nbsp;</span>
1868
+ <span class="cline-any cline-no">&nbsp;</span>
1869
+ <span class="cline-any cline-neutral">&nbsp;</span>
1870
+ <span class="cline-any cline-no">&nbsp;</span>
1871
+ <span class="cline-any cline-neutral">&nbsp;</span>
1872
+ <span class="cline-any cline-no">&nbsp;</span>
1873
+ <span class="cline-any cline-neutral">&nbsp;</span>
1874
+ <span class="cline-any cline-no">&nbsp;</span>
1875
+ <span class="cline-any cline-neutral">&nbsp;</span>
1876
+ <span class="cline-any cline-neutral">&nbsp;</span>
1877
+ <span class="cline-any cline-neutral">&nbsp;</span>
1878
+ <span class="cline-any cline-neutral">&nbsp;</span>
1879
+ <span class="cline-any cline-no">&nbsp;</span>
1880
+ <span class="cline-any cline-neutral">&nbsp;</span>
1881
+ <span class="cline-any cline-no">&nbsp;</span>
1882
+ <span class="cline-any cline-neutral">&nbsp;</span>
1883
+ <span class="cline-any cline-no">&nbsp;</span>
1884
+ <span class="cline-any cline-no">&nbsp;</span>
1885
+ <span class="cline-any cline-neutral">&nbsp;</span>
1886
+ <span class="cline-any cline-no">&nbsp;</span>
1887
+ <span class="cline-any cline-no">&nbsp;</span>
1888
+ <span class="cline-any cline-neutral">&nbsp;</span>
1889
+ <span class="cline-any cline-no">&nbsp;</span>
1890
+ <span class="cline-any cline-neutral">&nbsp;</span>
1891
+ <span class="cline-any cline-neutral">&nbsp;</span>
1892
+ <span class="cline-any cline-neutral">&nbsp;</span>
1893
+ <span class="cline-any cline-no">&nbsp;</span>
1894
+ <span class="cline-any cline-no">&nbsp;</span>
1895
+ <span class="cline-any cline-no">&nbsp;</span>
1896
+ <span class="cline-any cline-no">&nbsp;</span>
1897
+ <span class="cline-any cline-no">&nbsp;</span>
1898
+ <span class="cline-any cline-no">&nbsp;</span>
1899
+ <span class="cline-any cline-no">&nbsp;</span>
1900
+ <span class="cline-any cline-no">&nbsp;</span>
1368
1901
  <span class="cline-any cline-no">&nbsp;</span>
1369
1902
  <span class="cline-any cline-no">&nbsp;</span>
1370
1903
  <span class="cline-any cline-neutral">&nbsp;</span>
1371
1904
  <span class="cline-any cline-no">&nbsp;</span>
1372
1905
  <span class="cline-any cline-no">&nbsp;</span>
1906
+ <span class="cline-any cline-no">&nbsp;</span>
1907
+ <span class="cline-any cline-no">&nbsp;</span>
1908
+ <span class="cline-any cline-no">&nbsp;</span>
1373
1909
  <span class="cline-any cline-neutral">&nbsp;</span>
1374
1910
  <span class="cline-any cline-no">&nbsp;</span>
1375
1911
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1380,8 +1916,22 @@
1380
1916
  <span class="cline-any cline-neutral">&nbsp;</span>
1381
1917
  <span class="cline-any cline-neutral">&nbsp;</span>
1382
1918
  <span class="cline-any cline-neutral">&nbsp;</span>
1919
+ <span class="cline-any cline-no">&nbsp;</span>
1383
1920
  <span class="cline-any cline-neutral">&nbsp;</span>
1384
1921
  <span class="cline-any cline-no">&nbsp;</span>
1922
+ <span class="cline-any cline-neutral">&nbsp;</span>
1923
+ <span class="cline-any cline-no">&nbsp;</span>
1924
+ <span class="cline-any cline-no">&nbsp;</span>
1925
+ <span class="cline-any cline-neutral">&nbsp;</span>
1926
+ <span class="cline-any cline-neutral">&nbsp;</span>
1927
+ <span class="cline-any cline-neutral">&nbsp;</span>
1928
+ <span class="cline-any cline-neutral">&nbsp;</span>
1929
+ <span class="cline-any cline-neutral">&nbsp;</span>
1930
+ <span class="cline-any cline-neutral">&nbsp;</span>
1931
+ <span class="cline-any cline-neutral">&nbsp;</span>
1932
+ <span class="cline-any cline-neutral">&nbsp;</span>
1933
+ <span class="cline-any cline-neutral">&nbsp;</span>
1934
+ <span class="cline-any cline-neutral">&nbsp;</span>
1385
1935
  <span class="cline-any cline-no">&nbsp;</span>
1386
1936
  <span class="cline-any cline-neutral">&nbsp;</span>
1387
1937
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1389,29 +1939,51 @@
1389
1939
  <span class="cline-any cline-neutral">&nbsp;</span>
1390
1940
  <span class="cline-any cline-neutral">&nbsp;</span>
1391
1941
  <span class="cline-any cline-neutral">&nbsp;</span>
1942
+ <span class="cline-any cline-no">&nbsp;</span>
1943
+ <span class="cline-any cline-no">&nbsp;</span>
1944
+ <span class="cline-any cline-neutral">&nbsp;</span>
1945
+ <span class="cline-any cline-no">&nbsp;</span>
1392
1946
  <span class="cline-any cline-neutral">&nbsp;</span>
1393
1947
  <span class="cline-any cline-neutral">&nbsp;</span>
1394
1948
  <span class="cline-any cline-neutral">&nbsp;</span>
1949
+ <span class="cline-any cline-no">&nbsp;</span>
1950
+ <span class="cline-any cline-no">&nbsp;</span>
1951
+ <span class="cline-any cline-no">&nbsp;</span>
1395
1952
  <span class="cline-any cline-neutral">&nbsp;</span>
1396
1953
  <span class="cline-any cline-no">&nbsp;</span>
1397
1954
  <span class="cline-any cline-no">&nbsp;</span>
1398
1955
  <span class="cline-any cline-no">&nbsp;</span>
1399
1956
  <span class="cline-any cline-no">&nbsp;</span>
1957
+ <span class="cline-any cline-neutral">&nbsp;</span>
1400
1958
  <span class="cline-any cline-no">&nbsp;</span>
1401
1959
  <span class="cline-any cline-neutral">&nbsp;</span>
1960
+ <span class="cline-any cline-neutral">&nbsp;</span>
1961
+ <span class="cline-any cline-neutral">&nbsp;</span>
1962
+ <span class="cline-any cline-neutral">&nbsp;</span>
1963
+ <span class="cline-any cline-no">&nbsp;</span>
1964
+ <span class="cline-any cline-no">&nbsp;</span>
1402
1965
  <span class="cline-any cline-no">&nbsp;</span>
1403
1966
  <span class="cline-any cline-neutral">&nbsp;</span>
1967
+ <span class="cline-any cline-no">&nbsp;</span>
1968
+ <span class="cline-any cline-no">&nbsp;</span>
1969
+ <span class="cline-any cline-no">&nbsp;</span>
1404
1970
  <span class="cline-any cline-neutral">&nbsp;</span>
1405
1971
  <span class="cline-any cline-neutral">&nbsp;</span>
1972
+ <span class="cline-any cline-no">&nbsp;</span>
1973
+ <span class="cline-any cline-no">&nbsp;</span>
1406
1974
  <span class="cline-any cline-neutral">&nbsp;</span>
1975
+ <span class="cline-any cline-no">&nbsp;</span>
1407
1976
  <span class="cline-any cline-neutral">&nbsp;</span>
1408
1977
  <span class="cline-any cline-no">&nbsp;</span>
1409
1978
  <span class="cline-any cline-neutral">&nbsp;</span>
1979
+ <span class="cline-any cline-no">&nbsp;</span>
1410
1980
  <span class="cline-any cline-neutral">&nbsp;</span>
1411
1981
  <span class="cline-any cline-neutral">&nbsp;</span>
1412
1982
  <span class="cline-any cline-neutral">&nbsp;</span>
1413
1983
  <span class="cline-any cline-neutral">&nbsp;</span>
1414
1984
  <span class="cline-any cline-neutral">&nbsp;</span>
1985
+ <span class="cline-any cline-no">&nbsp;</span>
1986
+ <span class="cline-any cline-no">&nbsp;</span>
1415
1987
  <span class="cline-any cline-neutral">&nbsp;</span>
1416
1988
  <span class="cline-any cline-neutral">&nbsp;</span>
1417
1989
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1424,10 +1996,14 @@
1424
1996
  <span class="cline-any cline-neutral">&nbsp;</span>
1425
1997
  <span class="cline-any cline-no">&nbsp;</span>
1426
1998
  <span class="cline-any cline-no">&nbsp;</span>
1999
+ <span class="cline-any cline-no">&nbsp;</span>
1427
2000
  <span class="cline-any cline-neutral">&nbsp;</span>
1428
2001
  <span class="cline-any cline-no">&nbsp;</span>
1429
2002
  <span class="cline-any cline-neutral">&nbsp;</span>
1430
2003
  <span class="cline-any cline-neutral">&nbsp;</span>
2004
+ <span class="cline-any cline-neutral">&nbsp;</span>
2005
+ <span class="cline-any cline-neutral">&nbsp;</span>
2006
+ <span class="cline-any cline-neutral">&nbsp;</span>
1431
2007
  <span class="cline-any cline-no">&nbsp;</span>
1432
2008
  <span class="cline-any cline-neutral">&nbsp;</span>
1433
2009
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1435,10 +2011,24 @@
1435
2011
  <span class="cline-any cline-neutral">&nbsp;</span>
1436
2012
  <span class="cline-any cline-neutral">&nbsp;</span>
1437
2013
  <span class="cline-any cline-neutral">&nbsp;</span>
2014
+ <span class="cline-any cline-neutral">&nbsp;</span>
2015
+ <span class="cline-any cline-neutral">&nbsp;</span>
2016
+ <span class="cline-any cline-neutral">&nbsp;</span>
2017
+ <span class="cline-any cline-neutral">&nbsp;</span>
2018
+ <span class="cline-any cline-neutral">&nbsp;</span>
2019
+ <span class="cline-any cline-neutral">&nbsp;</span>
2020
+ <span class="cline-any cline-neutral">&nbsp;</span>
2021
+ <span class="cline-any cline-neutral">&nbsp;</span>
2022
+ <span class="cline-any cline-neutral">&nbsp;</span>
2023
+ <span class="cline-any cline-neutral">&nbsp;</span>
2024
+ <span class="cline-any cline-neutral">&nbsp;</span>
2025
+ <span class="cline-any cline-neutral">&nbsp;</span>
1438
2026
  <span class="cline-any cline-no">&nbsp;</span>
1439
2027
  <span class="cline-any cline-no">&nbsp;</span>
1440
2028
  <span class="cline-any cline-neutral">&nbsp;</span>
1441
2029
  <span class="cline-any cline-no">&nbsp;</span>
2030
+ <span class="cline-any cline-neutral">&nbsp;</span>
2031
+ <span class="cline-any cline-neutral">&nbsp;</span>
1442
2032
  <span class="cline-any cline-no">&nbsp;</span>
1443
2033
  <span class="cline-any cline-neutral">&nbsp;</span>
1444
2034
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1446,6 +2036,25 @@
1446
2036
  <span class="cline-any cline-neutral">&nbsp;</span>
1447
2037
  <span class="cline-any cline-neutral">&nbsp;</span>
1448
2038
  <span class="cline-any cline-neutral">&nbsp;</span>
2039
+ <span class="cline-any cline-no">&nbsp;</span>
2040
+ <span class="cline-any cline-no">&nbsp;</span>
2041
+ <span class="cline-any cline-no">&nbsp;</span>
2042
+ <span class="cline-any cline-no">&nbsp;</span>
2043
+ <span class="cline-any cline-neutral">&nbsp;</span>
2044
+ <span class="cline-any cline-no">&nbsp;</span>
2045
+ <span class="cline-any cline-no">&nbsp;</span>
2046
+ <span class="cline-any cline-no">&nbsp;</span>
2047
+ <span class="cline-any cline-no">&nbsp;</span>
2048
+ <span class="cline-any cline-neutral">&nbsp;</span>
2049
+ <span class="cline-any cline-neutral">&nbsp;</span>
2050
+ <span class="cline-any cline-neutral">&nbsp;</span>
2051
+ <span class="cline-any cline-neutral">&nbsp;</span>
2052
+ <span class="cline-any cline-neutral">&nbsp;</span>
2053
+ <span class="cline-any cline-neutral">&nbsp;</span>
2054
+ <span class="cline-any cline-neutral">&nbsp;</span>
2055
+ <span class="cline-any cline-neutral">&nbsp;</span>
2056
+ <span class="cline-any cline-neutral">&nbsp;</span>
2057
+ <span class="cline-any cline-neutral">&nbsp;</span>
1449
2058
  <span class="cline-any cline-neutral">&nbsp;</span>
1450
2059
  <span class="cline-any cline-neutral">&nbsp;</span>
1451
2060
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1455,9 +2064,22 @@
1455
2064
  <span class="cline-any cline-neutral">&nbsp;</span>
1456
2065
  <span class="cline-any cline-neutral">&nbsp;</span>
1457
2066
  <span class="cline-any cline-neutral">&nbsp;</span>
2067
+ <span class="cline-any cline-no">&nbsp;</span>
2068
+ <span class="cline-any cline-no">&nbsp;</span>
2069
+ <span class="cline-any cline-neutral">&nbsp;</span>
2070
+ <span class="cline-any cline-neutral">&nbsp;</span>
2071
+ <span class="cline-any cline-neutral">&nbsp;</span>
2072
+ <span class="cline-any cline-neutral">&nbsp;</span>
2073
+ <span class="cline-any cline-neutral">&nbsp;</span>
2074
+ <span class="cline-any cline-neutral">&nbsp;</span>
1458
2075
  <span class="cline-any cline-neutral">&nbsp;</span>
1459
2076
  <span class="cline-any cline-no">&nbsp;</span>
1460
2077
  <span class="cline-any cline-no">&nbsp;</span>
2078
+ <span class="cline-any cline-no">&nbsp;</span>
2079
+ <span class="cline-any cline-neutral">&nbsp;</span>
2080
+ <span class="cline-any cline-no">&nbsp;</span>
2081
+ <span class="cline-any cline-no">&nbsp;</span>
2082
+ <span class="cline-any cline-no">&nbsp;</span>
1461
2083
  <span class="cline-any cline-neutral">&nbsp;</span>
1462
2084
  <span class="cline-any cline-neutral">&nbsp;</span>
1463
2085
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1467,54 +2089,107 @@
1467
2089
  <span class="cline-any cline-neutral">&nbsp;</span>
1468
2090
  <span class="cline-any cline-no">&nbsp;</span>
1469
2091
  <span class="cline-any cline-neutral">&nbsp;</span>
2092
+ <span class="cline-any cline-neutral">&nbsp;</span>
2093
+ <span class="cline-any cline-neutral">&nbsp;</span>
2094
+ <span class="cline-any cline-neutral">&nbsp;</span>
2095
+ <span class="cline-any cline-no">&nbsp;</span>
2096
+ <span class="cline-any cline-no">&nbsp;</span>
2097
+ <span class="cline-any cline-neutral">&nbsp;</span>
2098
+ <span class="cline-any cline-no">&nbsp;</span>
2099
+ <span class="cline-any cline-neutral">&nbsp;</span>
2100
+ <span class="cline-any cline-neutral">&nbsp;</span>
1470
2101
  <span class="cline-any cline-no">&nbsp;</span>
1471
2102
  <span class="cline-any cline-no">&nbsp;</span>
2103
+ <span class="cline-any cline-neutral">&nbsp;</span>
1472
2104
  <span class="cline-any cline-no">&nbsp;</span>
1473
2105
  <span class="cline-any cline-neutral">&nbsp;</span>
2106
+ <span class="cline-any cline-no">&nbsp;</span>
1474
2107
  <span class="cline-any cline-neutral">&nbsp;</span>
1475
2108
  <span class="cline-any cline-neutral">&nbsp;</span>
1476
2109
  <span class="cline-any cline-neutral">&nbsp;</span>
1477
2110
  <span class="cline-any cline-neutral">&nbsp;</span>
1478
2111
  <span class="cline-any cline-neutral">&nbsp;</span>
2112
+ <span class="cline-any cline-no">&nbsp;</span>
2113
+ <span class="cline-any cline-no">&nbsp;</span>
2114
+ <span class="cline-any cline-neutral">&nbsp;</span>
2115
+ <span class="cline-any cline-no">&nbsp;</span>
2116
+ <span class="cline-any cline-no">&nbsp;</span>
2117
+ <span class="cline-any cline-no">&nbsp;</span>
2118
+ <span class="cline-any cline-no">&nbsp;</span>
2119
+ <span class="cline-any cline-no">&nbsp;</span>
2120
+ <span class="cline-any cline-no">&nbsp;</span>
2121
+ <span class="cline-any cline-no">&nbsp;</span>
1479
2122
  <span class="cline-any cline-neutral">&nbsp;</span>
1480
2123
  <span class="cline-any cline-no">&nbsp;</span>
1481
2124
  <span class="cline-any cline-neutral">&nbsp;</span>
1482
2125
  <span class="cline-any cline-neutral">&nbsp;</span>
2126
+ <span class="cline-any cline-no">&nbsp;</span>
1483
2127
  <span class="cline-any cline-neutral">&nbsp;</span>
1484
2128
  <span class="cline-any cline-neutral">&nbsp;</span>
1485
2129
  <span class="cline-any cline-no">&nbsp;</span>
1486
2130
  <span class="cline-any cline-no">&nbsp;</span>
1487
2131
  <span class="cline-any cline-neutral">&nbsp;</span>
1488
2132
  <span class="cline-any cline-no">&nbsp;</span>
2133
+ <span class="cline-any cline-no">&nbsp;</span>
2134
+ <span class="cline-any cline-neutral">&nbsp;</span>
2135
+ <span class="cline-any cline-no">&nbsp;</span>
1489
2136
  <span class="cline-any cline-neutral">&nbsp;</span>
1490
2137
  <span class="cline-any cline-neutral">&nbsp;</span>
1491
2138
  <span class="cline-any cline-no">&nbsp;</span>
1492
2139
  <span class="cline-any cline-no">&nbsp;</span>
1493
2140
  <span class="cline-any cline-neutral">&nbsp;</span>
1494
2141
  <span class="cline-any cline-no">&nbsp;</span>
2142
+ <span class="cline-any cline-no">&nbsp;</span>
1495
2143
  <span class="cline-any cline-neutral">&nbsp;</span>
2144
+ <span class="cline-any cline-neutral">&nbsp;</span>
2145
+ <span class="cline-any cline-no">&nbsp;</span>
1496
2146
  <span class="cline-any cline-no">&nbsp;</span>
1497
2147
  <span class="cline-any cline-neutral">&nbsp;</span>
1498
2148
  <span class="cline-any cline-neutral">&nbsp;</span>
2149
+ <span class="cline-any cline-no">&nbsp;</span>
2150
+ <span class="cline-any cline-no">&nbsp;</span>
1499
2151
  <span class="cline-any cline-neutral">&nbsp;</span>
1500
2152
  <span class="cline-any cline-neutral">&nbsp;</span>
2153
+ <span class="cline-any cline-no">&nbsp;</span>
1501
2154
  <span class="cline-any cline-neutral">&nbsp;</span>
2155
+ <span class="cline-any cline-neutral">&nbsp;</span>
2156
+ <span class="cline-any cline-no">&nbsp;</span>
2157
+ <span class="cline-any cline-neutral">&nbsp;</span>
2158
+ <span class="cline-any cline-no">&nbsp;</span>
1502
2159
  <span class="cline-any cline-no">&nbsp;</span>
1503
2160
  <span class="cline-any cline-neutral">&nbsp;</span>
1504
2161
  <span class="cline-any cline-no">&nbsp;</span>
1505
2162
  <span class="cline-any cline-neutral">&nbsp;</span>
2163
+ <span class="cline-any cline-no">&nbsp;</span>
2164
+ <span class="cline-any cline-neutral">&nbsp;</span>
2165
+ <span class="cline-any cline-neutral">&nbsp;</span>
2166
+ <span class="cline-any cline-neutral">&nbsp;</span>
2167
+ <span class="cline-any cline-no">&nbsp;</span>
2168
+ <span class="cline-any cline-no">&nbsp;</span>
2169
+ <span class="cline-any cline-no">&nbsp;</span>
1506
2170
  <span class="cline-any cline-neutral">&nbsp;</span>
1507
2171
  <span class="cline-any cline-no">&nbsp;</span>
1508
2172
  <span class="cline-any cline-no">&nbsp;</span>
1509
2173
  <span class="cline-any cline-no">&nbsp;</span>
1510
2174
  <span class="cline-any cline-no">&nbsp;</span>
2175
+ <span class="cline-any cline-no">&nbsp;</span>
2176
+ <span class="cline-any cline-neutral">&nbsp;</span>
2177
+ <span class="cline-any cline-neutral">&nbsp;</span>
1511
2178
  <span class="cline-any cline-neutral">&nbsp;</span>
1512
2179
  <span class="cline-any cline-no">&nbsp;</span>
2180
+ <span class="cline-any cline-no">&nbsp;</span>
1513
2181
  <span class="cline-any cline-neutral">&nbsp;</span>
1514
2182
  <span class="cline-any cline-no">&nbsp;</span>
1515
2183
  <span class="cline-any cline-no">&nbsp;</span>
2184
+ <span class="cline-any cline-no">&nbsp;</span>
2185
+ <span class="cline-any cline-neutral">&nbsp;</span>
2186
+ <span class="cline-any cline-neutral">&nbsp;</span>
2187
+ <span class="cline-any cline-neutral">&nbsp;</span>
1516
2188
  <span class="cline-any cline-neutral">&nbsp;</span>
1517
2189
  <span class="cline-any cline-no">&nbsp;</span>
2190
+ <span class="cline-any cline-neutral">&nbsp;</span>
2191
+ <span class="cline-any cline-neutral">&nbsp;</span>
2192
+ <span class="cline-any cline-neutral">&nbsp;</span>
1518
2193
  <span class="cline-any cline-no">&nbsp;</span>
1519
2194
  <span class="cline-any cline-neutral">&nbsp;</span>
1520
2195
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1522,14 +2197,27 @@
1522
2197
  <span class="cline-any cline-no">&nbsp;</span>
1523
2198
  <span class="cline-any cline-no">&nbsp;</span>
1524
2199
  <span class="cline-any cline-no">&nbsp;</span>
2200
+ <span class="cline-any cline-no">&nbsp;</span>
1525
2201
  <span class="cline-any cline-neutral">&nbsp;</span>
1526
2202
  <span class="cline-any cline-neutral">&nbsp;</span>
1527
2203
  <span class="cline-any cline-no">&nbsp;</span>
1528
2204
  <span class="cline-any cline-no">&nbsp;</span>
1529
2205
  <span class="cline-any cline-no">&nbsp;</span>
2206
+ <span class="cline-any cline-no">&nbsp;</span>
1530
2207
  <span class="cline-any cline-neutral">&nbsp;</span>
1531
2208
  <span class="cline-any cline-neutral">&nbsp;</span>
1532
2209
  <span class="cline-any cline-neutral">&nbsp;</span>
2210
+ <span class="cline-any cline-no">&nbsp;</span>
2211
+ <span class="cline-any cline-neutral">&nbsp;</span>
2212
+ <span class="cline-any cline-neutral">&nbsp;</span>
2213
+ <span class="cline-any cline-neutral">&nbsp;</span>
2214
+ <span class="cline-any cline-no">&nbsp;</span>
2215
+ <span class="cline-any cline-neutral">&nbsp;</span>
2216
+ <span class="cline-any cline-neutral">&nbsp;</span>
2217
+ <span class="cline-any cline-neutral">&nbsp;</span>
2218
+ <span class="cline-any cline-no">&nbsp;</span>
2219
+ <span class="cline-any cline-neutral">&nbsp;</span>
2220
+ <span class="cline-any cline-neutral">&nbsp;</span>
1533
2221
  <span class="cline-any cline-neutral">&nbsp;</span>
1534
2222
  <span class="cline-any cline-neutral">&nbsp;</span>
1535
2223
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1567,6 +2255,11 @@
1567
2255
  <span class="cline-any cline-neutral">&nbsp;</span>
1568
2256
  <span class="cline-any cline-no">&nbsp;</span>
1569
2257
  <span class="cline-any cline-no">&nbsp;</span>
2258
+ <span class="cline-any cline-neutral">&nbsp;</span>
2259
+ <span class="cline-any cline-neutral">&nbsp;</span>
2260
+ <span class="cline-any cline-neutral">&nbsp;</span>
2261
+ <span class="cline-any cline-no">&nbsp;</span>
2262
+ <span class="cline-any cline-no">&nbsp;</span>
1570
2263
  <span class="cline-any cline-no">&nbsp;</span>
1571
2264
  <span class="cline-any cline-no">&nbsp;</span>
1572
2265
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1577,13 +2270,16 @@
1577
2270
  <span class="cline-any cline-no">&nbsp;</span>
1578
2271
  <span class="cline-any cline-no">&nbsp;</span>
1579
2272
  <span class="cline-any cline-neutral">&nbsp;</span>
2273
+ <span class="cline-any cline-no">&nbsp;</span>
1580
2274
  <span class="cline-any cline-neutral">&nbsp;</span>
1581
2275
  <span class="cline-any cline-no">&nbsp;</span>
1582
2276
  <span class="cline-any cline-neutral">&nbsp;</span>
1583
2277
  <span class="cline-any cline-neutral">&nbsp;</span>
1584
2278
  <span class="cline-any cline-neutral">&nbsp;</span>
1585
2279
  <span class="cline-any cline-neutral">&nbsp;</span>
1586
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type Message from './messages.gen.js'
2280
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import ConditionsManager from '../modules/conditionsManager.js'</span>
2281
+ <span class="cstat-no" title="statement not covered" >import FeatureFlags from '../modules/featureFlags.js'</span>
2282
+ import type Message from './messages.gen.js'
1587
2283
  <span class="cstat-no" title="statement not covered" >import { Timestamp, Metadata, UserID, Type as MType, TabChange, TabData } from './messages.gen.js'</span>
1588
2284
  <span class="cstat-no" title="statement not covered" >import {</span>
1589
2285
  now,
@@ -1608,6 +2304,8 @@ import type { Options as SanitizerOptions } from './sanitizer.js'
1608
2304
  import type { Options as LoggerOptions } from './logger.js'
1609
2305
  import type { Options as SessOptions } from './session.js'
1610
2306
  import type { Options as NetworkOptions } from '../modules/network.js'
2307
+ <span class="cstat-no" title="statement not covered" >import CanvasRecorder from './canvas.js'</span>
2308
+ <span class="cstat-no" title="statement not covered" >import UserTestManager from '../modules/userTesting/index.js'</span>
1611
2309
  &nbsp;
1612
2310
  import type {
1613
2311
  Options as WebworkerOptions,
@@ -1634,17 +2332,32 @@ interface OnStartInfo {
1634
2332
  }
1635
2333
  &nbsp;
1636
2334
  const CANCELED = <span class="cstat-no" title="statement not covered" >'canceled' as const</span>
2335
+ const uxtStorageKey = <span class="cstat-no" title="statement not covered" >'or_uxt_active'</span>
2336
+ const bufferStorageKey = <span class="cstat-no" title="statement not covered" >'or_buffer_1'</span>
1637
2337
  const START_ERROR = <span class="cstat-no" title="statement not covered" >':(' as const</span>
1638
- type SuccessfulStart = OnStartInfo &amp; { success: true }
2338
+ type SuccessfulStart = OnStartInfo &amp; {
2339
+ success: true
2340
+ }
1639
2341
  type UnsuccessfulStart = {
1640
2342
  reason: typeof CANCELED | string
1641
2343
  success: false
1642
2344
  }
1643
2345
  &nbsp;
1644
- type RickRoll = { source: string; context: string } &amp; (
1645
- | { line: 'never-gonna-give-you-up' }
1646
- | { line: 'never-gonna-let-you-down'; token: string }
1647
- | { line: 'never-gonna-run-around-and-desert-you'; token: string }
2346
+ type RickRoll = {
2347
+ source: string
2348
+ context: string
2349
+ } &amp; (
2350
+ | {
2351
+ line: 'never-gonna-give-you-up'
2352
+ }
2353
+ | {
2354
+ line: 'never-gonna-let-you-down'
2355
+ token: string
2356
+ }
2357
+ | {
2358
+ line: 'never-gonna-run-around-and-desert-you'
2359
+ token: string
2360
+ }
1648
2361
  )
1649
2362
  &nbsp;
1650
2363
  const UnsuccessfulStart = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(r</span>eason: string): UnsuccessfulStart =&gt; (<span class="cstat-no" title="statement not covered" >{ reason, success: false })</span></span>
@@ -1658,6 +2371,7 @@ type CommitCallback = (messages: Array&lt;Message&gt;) =&gt; void
1658
2371
  <span class="cstat-no" title="statement not covered" > NotActive,</span>
1659
2372
  <span class="cstat-no" title="statement not covered" > Starting,</span>
1660
2373
  <span class="cstat-no" title="statement not covered" > Active,</span>
2374
+ <span class="cstat-no" title="statement not covered" > ColdStart,</span>
1661
2375
  }
1662
2376
  &nbsp;
1663
2377
  type AppOptions = {
@@ -1679,6 +2393,7 @@ type AppOptions = {
1679
2393
  sessionStorage: Storage | null
1680
2394
  forceSingleTab?: boolean
1681
2395
  disableStringDict?: boolean
2396
+ assistSocketHost?: string
1682
2397
  &nbsp;
1683
2398
  // @deprecated
1684
2399
  onStart?: StartCallback
@@ -1710,8 +2425,14 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1710
2425
  readonly localStorage: Storage
1711
2426
  readonly sessionStorage: Storage
1712
2427
  private readonly <span class="cstat-no" title="statement not covered" >messages: Array&lt;Message&gt; = []</span>
2428
+ /**
2429
+ * we need 2 buffers so we don't lose anything
2430
+ * @read coldStart implementation
2431
+ * */
2432
+ private <span class="cstat-no" title="statement not covered" >bufferedMessages1: Array&lt;Message&gt; = []</span>
2433
+ private <span class="cstat-no" title="statement not covered" >bufferedMessages2: Array&lt;Message&gt; = []</span>
1713
2434
  /* private */
1714
- readonly observer: Observer // non-privat for attachContextCallback
2435
+ readonly observer: Observer // non-private for attachContextCallback
1715
2436
  private readonly <span class="cstat-no" title="statement not covered" >startCallbacks: Array&lt;StartCallback&gt; = []</span>
1716
2437
  private readonly <span class="cstat-no" title="statement not covered" >stopCallbacks: Array&lt;() =&gt; any&gt; = []</span>
1717
2438
  private readonly <span class="cstat-no" title="statement not covered" >commitCallbacks: Array&lt;CommitCallback&gt; = []</span>
@@ -1727,11 +2448,17 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1727
2448
  private readonly <span class="cstat-no" title="statement not covered" >bc: BroadcastChannel | null = null</span>
1728
2449
  private readonly contextId
1729
2450
  public attributeSender: AttributeSender
1730
- &nbsp;
1731
- <span class="fstat-no" title="function not covered" > constructor(p</span>rojectKey: string, sessionToken: string | undefined, options: Partial&lt;Options&gt;) {
1732
- // if (options.onStart !== undefined) {
1733
- // deprecationWarn("'onStart' option", "tracker.start().then(/* handle session info */)")
1734
- // } ?? maybe onStart is good
2451
+ private <span class="cstat-no" title="statement not covered" >canvasRecorder: CanvasRecorder | null = null</span>
2452
+ private uxtManager: UserTestManager
2453
+ private <span class="cstat-no" title="statement not covered" >conditionsManager: ConditionsManager | null = null</span>
2454
+ public featureFlags: FeatureFlags
2455
+ &nbsp;
2456
+ <span class="fstat-no" title="function not covered" > constructor(</span>
2457
+ projectKey: string,
2458
+ sessionToken: string | undefined,
2459
+ options: Partial&lt;Options&gt;,
2460
+ private readonly <span class="cstat-no" title="statement not covered" >signalError: (error: string, apis: string[]) =&gt; void,</span>
2461
+ ) {
1735
2462
  <span class="cstat-no" title="statement not covered" > this.contextId = Math.random().toString(36).slice(2)</span>
1736
2463
  <span class="cstat-no" title="statement not covered" > this.projectKey = projectKey</span>
1737
2464
  <span class="cstat-no" title="statement not covered" > this.networkOptions = options.network</span>
@@ -1753,12 +2480,14 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1753
2480
  sessionStorage: null,
1754
2481
  disableStringDict: false,
1755
2482
  forceSingleTab: false,
2483
+ assistSocketHost: '',
1756
2484
  },
1757
2485
  options,
1758
2486
  )
1759
2487
  &nbsp;
1760
2488
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.options.forceSingleTab &amp;&amp; globalThis &amp;&amp; 'BroadcastChannel' in globalThis) {</span>
1761
- <span class="cstat-no" title="statement not covered" > this.bc = inIframe() ? null : new BroadcastChannel('rick')</span>
2489
+ const host = <span class="cstat-no" title="statement not covered" >location.hostname.split('.').slice(-2).join('_')</span>
2490
+ <span class="cstat-no" title="statement not covered" > this.bc = inIframe() ? null : new BroadcastChannel(`rick_${host}`)</span>
1762
2491
  }
1763
2492
  &nbsp;
1764
2493
  <span class="cstat-no" title="statement not covered" > this.revID = this.options.revID</span>
@@ -1773,6 +2502,7 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1773
2502
  <span class="cstat-no" title="statement not covered" > this.notify = new Logger(this.options.verbose ? LogLevel.Warnings : LogLevel.Silent)</span>
1774
2503
  <span class="cstat-no" title="statement not covered" > this.session = new Session(this, this.options)</span>
1775
2504
  <span class="cstat-no" title="statement not covered" > this.attributeSender = new AttributeSender(this, Boolean(this.options.disableStringDict))</span>
2505
+ <span class="cstat-no" title="statement not covered" > this.featureFlags = new FeatureFlags(this)</span>
1776
2506
  <span class="cstat-no" title="statement not covered" > this.session.attachUpdateCallback(<span class="fstat-no" title="function not covered" >({</span> userID, metadata }) =&gt; {</span>
1777
2507
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (userID != null) {</span>
1778
2508
  // TODO: nullable userID
@@ -1917,9 +2647,17 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1917
2647
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this._usingOldFetchPlugin &amp;&amp; message[0] === MType.NetworkRequest) {</span>
1918
2648
  <span class="cstat-no" title="statement not covered" > return</span>
1919
2649
  }
1920
- // ====================================================
1921
2650
  &nbsp;
1922
- <span class="cstat-no" title="statement not covered" > this.messages.push(message)</span>
2651
+ // ====================================================
2652
+ <span class="cstat-no" title="statement not covered" > if (this.activityState === ActivityState.ColdStart) {</span>
2653
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(message)</span>
2654
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.singleBuffer) {</span>
2655
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.push(message)</span>
2656
+ }
2657
+ <span class="cstat-no" title="statement not covered" > this.conditionsManager?.processMessage(message)</span>
2658
+ } else {
2659
+ <span class="cstat-no" title="statement not covered" > this.messages.push(message)</span>
2660
+ }
1923
2661
  // TODO: commit on start if there were `urgent` sends;
1924
2662
  // Clarify where urgent can be used for;
1925
2663
  // Clarify workflow for each type of message in case it was sent before start
@@ -1930,18 +2668,55 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
1930
2668
  }
1931
2669
  }
1932
2670
  &nbsp;
1933
- private <span class="fstat-no" title="function not covered" >commit(</span>): void {
2671
+ /**
2672
+ * Normal workflow: add timestamp and tab data to batch, then commit it
2673
+ * every ~30ms
2674
+ * */
2675
+ private <span class="fstat-no" title="function not covered" >_nCommit(</span>): void {
1934
2676
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.worker !== undefined &amp;&amp; this.messages.length) {</span>
1935
2677
  <span class="cstat-no" title="statement not covered" > requestIdleCb(<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
1936
2678
  <span class="cstat-no" title="statement not covered" > this.messages.unshift(TabData(this.session.getTabId()))</span>
1937
2679
  <span class="cstat-no" title="statement not covered" > this.messages.unshift(Timestamp(this.timestamp()))</span>
1938
- // ? why I need to do this?
1939
- <span class="cstat-no" title="statement not covered" > this.worker!.postMessage(this.messages)</span>
2680
+ // why I need to add opt chaining?
2681
+ <span class="cstat-no" title="statement not covered" > this.worker?.postMessage(this.messages)</span>
1940
2682
  <span class="cstat-no" title="statement not covered" > this.commitCallbacks.forEach(<span class="fstat-no" title="function not covered" >(c</span>b) =&gt; <span class="cstat-no" title="statement not covered" >cb(this.messages))</span></span>
1941
2683
  <span class="cstat-no" title="statement not covered" > this.messages.length = 0</span>
1942
2684
  })
1943
2685
  }
1944
2686
  }
2687
+ &nbsp;
2688
+ <span class="cstat-no" title="statement not covered" > coldStartCommitN = 0</span>
2689
+ &nbsp;
2690
+ /**
2691
+ * Cold start: add timestamp and tab data to both batches
2692
+ * every 2nd tick, ~60ms
2693
+ * this will make batches a bit larger and replay will work with bigger jumps every frame
2694
+ * but in turn we don't overload batch writer on session start with 1000 batches
2695
+ * */
2696
+ private <span class="fstat-no" title="function not covered" >_cStartCommit(</span>): void {
2697
+ <span class="cstat-no" title="statement not covered" > this.coldStartCommitN += 1</span>
2698
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.coldStartCommitN === 2) {</span>
2699
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(Timestamp(this.timestamp()))</span>
2700
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(TabData(this.session.getTabId()))</span>
2701
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.push(Timestamp(this.timestamp()))</span>
2702
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.push(TabData(this.session.getTabId()))</span>
2703
+ <span class="cstat-no" title="statement not covered" > this.coldStartCommitN = 0</span>
2704
+ }
2705
+ }
2706
+ &nbsp;
2707
+ private <span class="fstat-no" title="function not covered" >commit(</span>): void {
2708
+ <span class="cstat-no" title="statement not covered" > if (this.activityState === ActivityState.ColdStart) {</span>
2709
+ <span class="cstat-no" title="statement not covered" > this._cStartCommit()</span>
2710
+ } else {
2711
+ <span class="cstat-no" title="statement not covered" > this._nCommit()</span>
2712
+ }
2713
+ }
2714
+ &nbsp;
2715
+ private <span class="fstat-no" title="function not covered" >postToWorker(</span>messages: Array&lt;Message&gt;) {
2716
+ <span class="cstat-no" title="statement not covered" > this.worker?.postMessage(messages)</span>
2717
+ <span class="cstat-no" title="statement not covered" > this.commitCallbacks.forEach(<span class="fstat-no" title="function not covered" >(c</span>b) =&gt; <span class="cstat-no" title="statement not covered" >cb(messages))</span></span>
2718
+ <span class="cstat-no" title="statement not covered" > messages.length = 0</span>
2719
+ }
1945
2720
  &nbsp;
1946
2721
  private <span class="cstat-no" title="statement not covered" >delay = 0</span>
1947
2722
  &nbsp;
@@ -2113,20 +2888,193 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2113
2888
  <span class="cstat-no" title="statement not covered" > this.sessionStorage.removeItem(this.options.session_reset_key)</span>
2114
2889
  }
2115
2890
  }
2891
+ &nbsp;
2892
+ <span class="cstat-no" title="statement not covered" > coldInterval: ReturnType&lt;typeof setInterval&gt; | null = null</span>
2893
+ <span class="cstat-no" title="statement not covered" > orderNumber = 0</span>
2894
+ <span class="cstat-no" title="statement not covered" > coldStartTs = 0</span>
2895
+ <span class="cstat-no" title="statement not covered" > singleBuffer = false</span>
2896
+ &nbsp;
2897
+ private <span class="fstat-no" title="function not covered" >checkSessionToken(</span>forceNew?: boolean) {
2898
+ const lsReset = <span class="cstat-no" title="statement not covered" >this.sessionStorage.getItem(this.options.session_reset_key) !== null</span>
2899
+ const needNewSessionID = <span class="cstat-no" title="statement not covered" >forceNew || lsReset</span>
2900
+ const sessionToken = <span class="cstat-no" title="statement not covered" >this.session.getSessionToken()</span>
2901
+ &nbsp;
2902
+ <span class="cstat-no" title="statement not covered" > return needNewSessionID || !sessionToken</span>
2903
+ }
2904
+ /**
2905
+ * start buffering messages without starting the actual session, which gives
2906
+ * user 30 seconds to "activate" and record session by calling `start()` on conditional trigger
2907
+ * and we will then send buffered batch, so it won't get lost
2908
+ * */
2909
+ public async <span class="fstat-no" title="function not covered" >coldStart(</span>startOpts: StartOptions = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span> conditional?: boolean) {
2910
+ <span class="cstat-no" title="statement not covered" > this.singleBuffer = false</span>
2911
+ const second = <span class="cstat-no" title="statement not covered" >1000</span>
2912
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (conditional) {</span>
2913
+ <span class="cstat-no" title="statement not covered" > this.conditionsManager = new ConditionsManager(this, startOpts)</span>
2914
+ }
2915
+ const isNewSession = <span class="cstat-no" title="statement not covered" >this.checkSessionToken(startOpts.forceNew)</span>
2916
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (conditional) {</span>
2917
+ const r = <span class="cstat-no" title="statement not covered" >await fetch(this.options.ingestPoint + '/v1/web/start', {</span>
2918
+ method: 'POST',
2919
+ headers: {
2920
+ 'Content-Type': 'application/json',
2921
+ },
2922
+ body: JSON.stringify({
2923
+ ...this.getTrackerInfo(),
2924
+ timestamp: now(),
2925
+ doNotRecord: true,
2926
+ bufferDiff: 0,
2927
+ userID: this.session.getInfo().userID,
2928
+ token: undefined,
2929
+ deviceMemory,
2930
+ jsHeapSizeLimit,
2931
+ timezone: getTimezone(),
2932
+ }),
2933
+ })
2934
+ // this token is needed to fetch conditions and flags,
2935
+ // but it can't be used to record a session
2936
+ const {
2937
+ token,
2938
+ userBrowser,
2939
+ userCity,
2940
+ userCountry,
2941
+ userDevice,
2942
+ userOS,
2943
+ userState,
2944
+ projectID,
2945
+ } = <span class="cstat-no" title="statement not covered" >await r.json()</span>
2946
+ <span class="cstat-no" title="statement not covered" > this.session.assign({ projectID })</span>
2947
+ <span class="cstat-no" title="statement not covered" > this.session.setUserInfo({</span>
2948
+ userBrowser,
2949
+ userCity,
2950
+ userCountry,
2951
+ userDevice,
2952
+ userOS,
2953
+ userState,
2954
+ })
2955
+ <span class="cstat-no" title="statement not covered" > await this.conditionsManager?.fetchConditions(token as string)</span>
2956
+ <span class="cstat-no" title="statement not covered" > await this.featureFlags.reloadFlags(token as string)</span>
2957
+ <span class="cstat-no" title="statement not covered" > this.conditionsManager?.processFlags(this.featureFlags.flags)</span>
2958
+ }
2959
+ const cycle = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
2960
+ <span class="cstat-no" title="statement not covered" > this.orderNumber += 1</span>
2961
+ <span class="cstat-no" title="statement not covered" > adjustTimeOrigin()</span>
2962
+ <span class="cstat-no" title="statement not covered" > this.coldStartTs = now()</span>
2963
+ <span class="cstat-no" title="statement not covered" > if (this.orderNumber % 2 === 0) {</span>
2964
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.length = 0</span>
2965
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(Timestamp(this.timestamp()))</span>
2966
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(TabData(this.session.getTabId()))</span>
2967
+ } else {
2968
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.length = 0</span>
2969
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.push(Timestamp(this.timestamp()))</span>
2970
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.push(TabData(this.session.getTabId()))</span>
2971
+ }
2972
+ <span class="cstat-no" title="statement not covered" > this.stop(false)</span>
2973
+ <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.ColdStart</span>
2974
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (startOpts.sessionHash) {</span>
2975
+ <span class="cstat-no" title="statement not covered" > this.session.applySessionHash(startOpts.sessionHash)</span>
2976
+ }
2977
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (startOpts.forceNew) {</span>
2978
+ // Reset session metadata only if requested directly
2979
+ <span class="cstat-no" title="statement not covered" > this.session.reset()</span>
2980
+ }
2981
+ <span class="cstat-no" title="statement not covered" > this.session.assign({</span>
2982
+ // MBTODO: maybe it would make sense to `forceNew` if the `userID` was changed
2983
+ userID: startOpts.userID,
2984
+ metadata: startOpts.metadata,
2985
+ })
2986
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isNewSession) {</span>
2987
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
2988
+ <span class="cstat-no" title="statement not covered" > this.send(TabChange(this.session.getTabId()))</span>
2989
+ }
2990
+ <span class="cstat-no" title="statement not covered" > this.observer.observe()</span>
2991
+ <span class="cstat-no" title="statement not covered" > this.ticker.start()</span>
2992
+ }
2993
+ <span class="cstat-no" title="statement not covered" > this.coldInterval = setInterval(<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
2994
+ <span class="cstat-no" title="statement not covered" > cycle()</span>
2995
+ }, 30 * second)
2996
+ <span class="cstat-no" title="statement not covered" > cycle()</span>
2997
+ }
2998
+ &nbsp;
2999
+ public <span class="fstat-no" title="function not covered" >offlineRecording(</span>startOpts: StartOptions = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
3000
+ <span class="cstat-no" title="statement not covered" > this.singleBuffer = true</span>
3001
+ const isNewSession = <span class="cstat-no" title="statement not covered" >this.checkSessionToken(startOpts.forceNew)</span>
3002
+ <span class="cstat-no" title="statement not covered" > adjustTimeOrigin()</span>
3003
+ <span class="cstat-no" title="statement not covered" > this.coldStartTs = now()</span>
3004
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.length = 0</span>
3005
+ const saverBuffer = <span class="cstat-no" title="statement not covered" >this.localStorage.getItem(bufferStorageKey)</span>
3006
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (saverBuffer) {</span>
3007
+ const data = <span class="cstat-no" title="statement not covered" >JSON.parse(saverBuffer)</span>
3008
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1 = Array.isArray(data) ? data : []</span>
3009
+ <span class="cstat-no" title="statement not covered" > this.localStorage.removeItem(bufferStorageKey)</span>
3010
+ }
3011
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(Timestamp(this.timestamp()))</span>
3012
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.push(TabData(this.session.getTabId()))</span>
3013
+ <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.ColdStart</span>
3014
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (startOpts.sessionHash) {</span>
3015
+ <span class="cstat-no" title="statement not covered" > this.session.applySessionHash(startOpts.sessionHash)</span>
3016
+ }
3017
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (startOpts.forceNew) {</span>
3018
+ // Reset session metadata only if requested directly
3019
+ <span class="cstat-no" title="statement not covered" > this.session.reset()</span>
3020
+ }
3021
+ <span class="cstat-no" title="statement not covered" > this.session.assign({</span>
3022
+ // MBTODO: maybe it would make sense to `forceNew` if the `userID` was changed
3023
+ userID: startOpts.userID,
3024
+ metadata: startOpts.metadata,
3025
+ })
3026
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isNewSession) {</span>
3027
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
3028
+ <span class="cstat-no" title="statement not covered" > this.send(TabChange(this.session.getTabId()))</span>
3029
+ }
3030
+ <span class="cstat-no" title="statement not covered" > this.observer.observe()</span>
3031
+ <span class="cstat-no" title="statement not covered" > this.ticker.start()</span>
3032
+ }
3033
+ &nbsp;
3034
+ /**
3035
+ * Saves the captured messages in localStorage (or whatever is used in its place)
3036
+ *
3037
+ * Then when this.offlineRecording is called, it will preload this messages and clear the storage item
3038
+ *
3039
+ * Keeping the size of local storage reasonable is up to the end users of this library
3040
+ * */
3041
+ public <span class="fstat-no" title="function not covered" >saveBuffer(</span>) {
3042
+ <span class="cstat-no" title="statement not covered" > this.localStorage.setItem(bufferStorageKey, JSON.stringify(this.bufferedMessages1))</span>
3043
+ }
3044
+ &nbsp;
3045
+ /**
3046
+ * Uploads the stored buffer to create session
3047
+ * */
3048
+ public <span class="fstat-no" title="function not covered" >uploadOfflineRecording(</span>) {
3049
+ const buffer = <span class="cstat-no" title="statement not covered" >this.bufferedMessages1</span>
3050
+ <span class="cstat-no" title="statement not covered" > this.stop(false)</span>
3051
+ // then fetch it
3052
+ <span class="cstat-no" title="statement not covered" > this.clearBuffers()</span>
3053
+ }
2116
3054
  &nbsp;
2117
3055
  private <span class="fstat-no" title="function not covered" >_start(</span>startOpts: StartOptions = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span> resetByWorker = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: Promise&lt;StartPromiseReturn&gt; {
3056
+ const isColdStart = <span class="cstat-no" title="statement not covered" >this.activityState === ActivityState.ColdStart</span>
3057
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (isColdStart &amp;&amp; this.coldInterval) {</span>
3058
+ <span class="cstat-no" title="statement not covered" > clearInterval(this.coldInterval)</span>
3059
+ }
2118
3060
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.worker) {</span>
2119
- <span class="cstat-no" title="statement not covered" > return Promise.resolve(UnsuccessfulStart('No worker found: perhaps, CSP is not set.'))</span>
3061
+ const reason = <span class="cstat-no" title="statement not covered" >'No worker found: perhaps, CSP is not set.'</span>
3062
+ <span class="cstat-no" title="statement not covered" > this.signalError(reason, [])</span>
3063
+ <span class="cstat-no" title="statement not covered" > return Promise.resolve(UnsuccessfulStart(reason))</span>
2120
3064
  }
2121
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.activityState !== ActivityState.NotActive) {</span>
2122
- <span class="cstat-no" title="statement not covered" > return Promise.resolve(</span>
2123
- UnsuccessfulStart(
2124
- 'OpenReplay: trying to call `start()` on the instance that has been started already.',
2125
- ),
2126
- )
3065
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
3066
+ this.activityState === ActivityState.Active ||
3067
+ this.activityState === ActivityState.Starting
3068
+ ) {
3069
+ const reason =
3070
+ <span class="cstat-no" title="statement not covered" > 'OpenReplay: trying to call `start()` on the instance that has been started already.'</span>
3071
+ <span class="cstat-no" title="statement not covered" > this.signalError(reason, [])</span>
3072
+ <span class="cstat-no" title="statement not covered" > return Promise.resolve(UnsuccessfulStart(reason))</span>
2127
3073
  }
2128
3074
  <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.Starting</span>
2129
- <span class="cstat-no" title="statement not covered" > adjustTimeOrigin()</span>
3075
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isColdStart) {</span>
3076
+ <span class="cstat-no" title="statement not covered" > adjustTimeOrigin()</span>
3077
+ }
2130
3078
  &nbsp;
2131
3079
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (startOpts.sessionHash) {</span>
2132
3080
  <span class="cstat-no" title="statement not covered" > this.session.applySessionHash(startOpts.sessionHash)</span>
@@ -2153,15 +3101,13 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2153
3101
  tabId: this.session.getTabId(),
2154
3102
  })
2155
3103
  &nbsp;
2156
- const lsReset = <span class="cstat-no" title="statement not covered" >this.sessionStorage.getItem(this.options.session_reset_key) !== null</span>
2157
- <span class="cstat-no" title="statement not covered" > this.sessionStorage.removeItem(this.options.session_reset_key)</span>
2158
- const needNewSessionID = <span class="cstat-no" title="statement not covered" >startOpts.forceNew || lsReset || resetByWorker</span>
2159
3104
  const sessionToken = <span class="cstat-no" title="statement not covered" >this.session.getSessionToken()</span>
2160
- const isNewSession = <span class="cstat-no" title="statement not covered" >needNewSessionID || !sessionToken</span>
3105
+ const isNewSession = <span class="cstat-no" title="statement not covered" >this.checkSessionToken(startOpts.forceNew)</span>
3106
+ <span class="cstat-no" title="statement not covered" > this.sessionStorage.removeItem(this.options.session_reset_key)</span>
2161
3107
  &nbsp;
2162
- <span class="cstat-no" title="statement not covered" > console.log(</span>
3108
+ <span class="cstat-no" title="statement not covered" > this.debug.log(</span>
2163
3109
  'OpenReplay: starting session; need new session id?',
2164
- needNewSessionID,
3110
+ isNewSession,
2165
3111
  'session token: ',
2166
3112
  sessionToken,
2167
3113
  )
@@ -2174,6 +3120,8 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2174
3120
  body: JSON.stringify({
2175
3121
  ...this.getTrackerInfo(),
2176
3122
  timestamp,
3123
+ doNotRecord: false,
3124
+ bufferDiff: timestamp - this.coldStartTs,
2177
3125
  userID: this.session.getInfo().userID,
2178
3126
  token: isNewSession ? undefined : sessionToken,
2179
3127
  deviceMemory,
@@ -2196,10 +3144,14 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2196
3144
  })
2197
3145
  .then(<span class="fstat-no" title="function not covered" >(r</span>) =&gt; {
2198
3146
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.worker) {</span>
2199
- <span class="cstat-no" title="statement not covered" > return Promise.reject('no worker found after start request (this might not happen)')</span>
3147
+ const reason = <span class="cstat-no" title="statement not covered" >'no worker found after start request (this might not happen)'</span>
3148
+ <span class="cstat-no" title="statement not covered" > this.signalError(reason, [])</span>
3149
+ <span class="cstat-no" title="statement not covered" > return Promise.reject(reason)</span>
2200
3150
  }
2201
3151
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.activityState === ActivityState.NotActive) {</span>
2202
- <span class="cstat-no" title="statement not covered" > return Promise.reject('Tracker stopped during authorization')</span>
3152
+ const reason = <span class="cstat-no" title="statement not covered" >'Tracker stopped during authorization'</span>
3153
+ <span class="cstat-no" title="statement not covered" > this.signalError(reason, [])</span>
3154
+ <span class="cstat-no" title="statement not covered" > return Promise.reject(reason)</span>
2203
3155
  }
2204
3156
  const {
2205
3157
  token,
@@ -2216,6 +3168,9 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2216
3168
  userDevice,
2217
3169
  userOS,
2218
3170
  userState,
3171
+ canvasEnabled,
3172
+ canvasQuality,
3173
+ canvasFPS,
2219
3174
  } = <span class="cstat-no" title="statement not covered" >r</span>
2220
3175
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
2221
3176
  typeof token !== 'string' ||
@@ -2225,7 +3180,9 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2225
3180
  typeof delay !== 'number' ||
2226
3181
  (typeof beaconSizeLimit !== 'number' &amp;&amp; typeof beaconSizeLimit !== 'undefined')
2227
3182
  ) {
2228
- <span class="cstat-no" title="statement not covered" > return Promise.reject(`Incorrect server response: ${JSON.stringify(r)}`)</span>
3183
+ const reason = <span class="cstat-no" title="statement not covered" >`Incorrect server response: ${JSON.stringify(r)}`</span>
3184
+ <span class="cstat-no" title="statement not covered" > this.signalError(reason, [])</span>
3185
+ <span class="cstat-no" title="statement not covered" > return Promise.reject(reason)</span>
2229
3186
  }
2230
3187
  <span class="cstat-no" title="statement not covered" > this.delay = delay</span>
2231
3188
  <span class="cstat-no" title="statement not covered" > this.session.setSessionToken(token)</span>
@@ -2243,7 +3200,7 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2243
3200
  projectID,
2244
3201
  })
2245
3202
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isNewSession &amp;&amp; token === sessionToken) {</span>
2246
- <span class="cstat-no" title="statement not covered" > console.log('continuing session on new tab', this.session.getTabId())</span>
3203
+ <span class="cstat-no" title="statement not covered" > this.debug.log('continuing session on new tab', this.session.getTabId())</span>
2247
3204
  // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
2248
3205
  <span class="cstat-no" title="statement not covered" > this.send(TabChange(this.session.getTabId()))</span>
2249
3206
  }
@@ -2260,14 +3217,48 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2260
3217
  })
2261
3218
  &nbsp;
2262
3219
  <span class="cstat-no" title="statement not covered" > this.compressionThreshold = compressionThreshold</span>
2263
- &nbsp;
2264
3220
  const onStartInfo = <span class="cstat-no" title="statement not covered" >{ sessionToken: token, userUUID, sessionID }</span>
2265
3221
  &nbsp;
3222
+ const flushBuffer = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(b</span>uffer: Message[]) =&gt; {</span>
3223
+ let ended = <span class="cstat-no" title="statement not covered" >false</span>
3224
+ const messagesBatch: Message[] = <span class="cstat-no" title="statement not covered" >[buffer.shift() as unknown as Message]</span>
3225
+ <span class="cstat-no" title="statement not covered" > while (!ended) {</span>
3226
+ const nextMsg = <span class="cstat-no" title="statement not covered" >buffer[0]</span>
3227
+ <span class="cstat-no" title="statement not covered" > if (!nextMsg || nextMsg[0] === MType.Timestamp) {</span>
3228
+ <span class="cstat-no" title="statement not covered" > ended = true</span>
3229
+ } else {
3230
+ <span class="cstat-no" title="statement not covered" > messagesBatch.push(buffer.shift() as unknown as Message)</span>
3231
+ }
3232
+ }
3233
+ <span class="cstat-no" title="statement not covered" > this.postToWorker(messagesBatch)</span>
3234
+ }
2266
3235
  // TODO: start as early as possible (before receiving the token)
2267
3236
  <span class="cstat-no" title="statement not covered" > this.startCallbacks.forEach(<span class="fstat-no" title="function not covered" >(c</span>b) =&gt; <span class="cstat-no" title="statement not covered" >cb(onStartInfo))</span> /</span>/ MBTODO: callbacks after DOM "mounted" (observed)
2268
- <span class="cstat-no" title="statement not covered" > this.observer.observe()</span>
2269
- <span class="cstat-no" title="statement not covered" > this.ticker.start()</span>
3237
+ <span class="cstat-no" title="statement not covered" > void this.featureFlags.reloadFlags()</span>
3238
+ /** --------------- COLD START BUFFER ------------------*/
2270
3239
  <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.Active</span>
3240
+ <span class="cstat-no" title="statement not covered" > if (isColdStart) {</span>
3241
+ const biggestBurger =
3242
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.length &gt; this.bufferedMessages2.length</span>
3243
+ ? this.bufferedMessages1
3244
+ : this.bufferedMessages2
3245
+ <span class="cstat-no" title="statement not covered" > while (biggestBurger.length &gt; 0) {</span>
3246
+ <span class="cstat-no" title="statement not covered" > flushBuffer(biggestBurger)</span>
3247
+ }
3248
+ <span class="cstat-no" title="statement not covered" > this.clearBuffers()</span>
3249
+ <span class="cstat-no" title="statement not covered" > this.commit()</span>
3250
+ /** --------------- COLD START BUFFER ------------------*/
3251
+ } else {
3252
+ <span class="cstat-no" title="statement not covered" > this.observer.observe()</span>
3253
+ <span class="cstat-no" title="statement not covered" > this.ticker.start()</span>
3254
+ }
3255
+ &nbsp;
3256
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (canvasEnabled) {</span>
3257
+ <span class="cstat-no" title="statement not covered" > this.canvasRecorder =</span>
3258
+ this.canvasRecorder ??
3259
+ new CanvasRecorder(this, { fps: canvasFPS, quality: canvasQuality })
3260
+ <span class="cstat-no" title="statement not covered" > this.canvasRecorder.startTracking()</span>
3261
+ }
2271
3262
  &nbsp;
2272
3263
  <span class="cstat-no" title="statement not covered" > this.notify.log('OpenReplay tracking started.')</span>
2273
3264
  // get rid of onStart ?
@@ -2275,20 +3266,64 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2275
3266
  <span class="cstat-no" title="statement not covered" > this.options.onStart(onStartInfo)</span>
2276
3267
  }
2277
3268
  <span class="cstat-no" title="statement not covered" > this.restartAttempts = 0</span>
3269
+ &nbsp;
3270
+ <span class="cstat-no" title="statement not covered" > this.uxtManager = this.uxtManager</span>
3271
+ ? this.uxtManager
3272
+ : new UserTestManager(this, uxtStorageKey)
3273
+ let uxtId: number | undefined
3274
+ const savedUxtTag = <span class="cstat-no" title="statement not covered" >this.localStorage.getItem(uxtStorageKey)</span>
3275
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (savedUxtTag) {</span>
3276
+ <span class="cstat-no" title="statement not covered" > uxtId = parseInt(savedUxtTag, 10)</span>
3277
+ }
3278
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (location?.search) {</span>
3279
+ const query = <span class="cstat-no" title="statement not covered" >new URLSearchParams(location.search)</span>
3280
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (query.has('oruxt')) {</span>
3281
+ const qId = <span class="cstat-no" title="statement not covered" >query.get('oruxt')</span>
3282
+ <span class="cstat-no" title="statement not covered" > uxtId = qId ? parseInt(qId, 10) : undefined</span>
3283
+ }
3284
+ }
3285
+ &nbsp;
3286
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (uxtId) {</span>
3287
+ <span class="cstat-no" title="statement not covered" > if (!this.uxtManager.isActive) {</span>
3288
+ // eslint-disable-next-line
3289
+ <span class="cstat-no" title="statement not covered" > this.uxtManager.getTest(uxtId, token, Boolean(savedUxtTag)).then(<span class="fstat-no" title="function not covered" >(i</span>d) =&gt; {</span>
3290
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (id) {</span>
3291
+ <span class="cstat-no" title="statement not covered" > this.onUxtCb.forEach(<span class="fstat-no" title="function not covered" >(c</span>b: (id: number) =&gt; void) =&gt; <span class="cstat-no" title="statement not covered" >cb(id))</span></span>
3292
+ }
3293
+ })
3294
+ } else {
3295
+ // @ts-ignore
3296
+ <span class="cstat-no" title="statement not covered" > this.onUxtCb.forEach(<span class="fstat-no" title="function not covered" >(c</span>b: (id: number) =&gt; void) =&gt; <span class="cstat-no" title="statement not covered" >cb(uxtId))</span></span>
3297
+ }
3298
+ }
3299
+ &nbsp;
2278
3300
  <span class="cstat-no" title="statement not covered" > return SuccessfulStart(onStartInfo)</span>
2279
3301
  })
2280
3302
  .catch(<span class="fstat-no" title="function not covered" >(r</span>eason) =&gt; {
2281
3303
  <span class="cstat-no" title="statement not covered" > this.stop()</span>
2282
3304
  <span class="cstat-no" title="statement not covered" > this.session.reset()</span>
2283
3305
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (reason === CANCELED) {</span>
3306
+ <span class="cstat-no" title="statement not covered" > this.signalError(CANCELED, [])</span>
2284
3307
  <span class="cstat-no" title="statement not covered" > return UnsuccessfulStart(CANCELED)</span>
2285
3308
  }
2286
3309
  &nbsp;
2287
3310
  <span class="cstat-no" title="statement not covered" > this.notify.log('OpenReplay was unable to start. ', reason)</span>
2288
3311
  <span class="cstat-no" title="statement not covered" > this._debug('session_start', reason)</span>
3312
+ <span class="cstat-no" title="statement not covered" > this.signalError(START_ERROR, [])</span>
2289
3313
  <span class="cstat-no" title="statement not covered" > return UnsuccessfulStart(START_ERROR)</span>
2290
3314
  })
2291
3315
  }
3316
+ &nbsp;
3317
+ <span class="cstat-no" title="statement not covered" > onUxtCb = []</span>
3318
+ &nbsp;
3319
+ <span class="fstat-no" title="function not covered" > addOnUxtCb(</span>cb: (id: number) =&gt; void) {
3320
+ // @ts-ignore
3321
+ <span class="cstat-no" title="statement not covered" > this.onUxtCb.push(cb)</span>
3322
+ }
3323
+ &nbsp;
3324
+ <span class="fstat-no" title="function not covered" > getUxtId(</span>): number | null {
3325
+ <span class="cstat-no" title="statement not covered" > return this.uxtManager?.getTestId()</span>
3326
+ }
2292
3327
  &nbsp;
2293
3328
  /**
2294
3329
  * basically we ask other tabs during constructor
@@ -2324,6 +3359,11 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2324
3359
  <span class="cstat-no" title="statement not covered" > return this.session.getTabId()</span>
2325
3360
  }
2326
3361
  &nbsp;
3362
+ <span class="fstat-no" title="function not covered" > clearBuffers(</span>) {
3363
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages1.length = 0</span>
3364
+ <span class="cstat-no" title="statement not covered" > this.bufferedMessages2.length = 0</span>
3365
+ }
3366
+ &nbsp;
2327
3367
  <span class="fstat-no" title="function not covered" > stop(</span>stopWorker = <span class="branch-0 cbranch-no" title="branch not covered" >true)</span>: void {
2328
3368
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.activityState !== ActivityState.NotActive) {</span>
2329
3369
  <span class="cstat-no" title="statement not covered" > try {</span>
@@ -2337,6 +3377,7 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2337
3377
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.worker &amp;&amp; stopWorker) {</span>
2338
3378
  <span class="cstat-no" title="statement not covered" > this.worker.postMessage('stop')</span>
2339
3379
  }
3380
+ <span class="cstat-no" title="statement not covered" > this.canvasRecorder?.clear()</span>
2340
3381
  } finally {
2341
3382
  <span class="cstat-no" title="statement not covered" > this.activityState = ActivityState.NotActive</span>
2342
3383
  }
@@ -2350,7 +3391,7 @@ function <span class="fstat-no" title="function not covered" >getTimezone(</span
2350
3391
  <div class='footer quiet pad2 space-top1 center small'>
2351
3392
  Code coverage generated by
2352
3393
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2353
- at 2023-11-03T09:39:08.430Z
3394
+ at 2023-12-15T15:55:44.965Z
2354
3395
  </div>
2355
3396
  <script src="../../prettify.js"></script>
2356
3397
  <script>