@synnaxlabs/client 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/.DS_Store +0 -0
  2. package/.editorconfig +15 -0
  3. package/.eslintrc.json +33 -0
  4. package/.gitignore +9 -0
  5. package/.nyc_output/20720f2d-6abe-420f-a3c5-304d52d60827.json +1 -0
  6. package/.nyc_output/4725921c-6f1b-4ae9-9819-e455f702d31c.json +1 -0
  7. package/.nyc_output/47478588-5ffd-4332-873c-facaa4a2fc38.json +1 -0
  8. package/.nyc_output/48180641-e0b2-49ab-a6eb-e7910e9eac2f.json +1 -0
  9. package/.nyc_output/cb0abf31-740f-47db-b94a-8e3f8f117cb8.json +1 -0
  10. package/.nyc_output/fc77fce2-dad0-49a8-8d4b-0a9014ecf8c5.json +1 -0
  11. package/.nyc_output/processinfo/20720f2d-6abe-420f-a3c5-304d52d60827.json +1 -0
  12. package/.nyc_output/processinfo/4725921c-6f1b-4ae9-9819-e455f702d31c.json +1 -0
  13. package/.nyc_output/processinfo/47478588-5ffd-4332-873c-facaa4a2fc38.json +1 -0
  14. package/.nyc_output/processinfo/48180641-e0b2-49ab-a6eb-e7910e9eac2f.json +1 -0
  15. package/.nyc_output/processinfo/cb0abf31-740f-47db-b94a-8e3f8f117cb8.json +1 -0
  16. package/.nyc_output/processinfo/fc77fce2-dad0-49a8-8d4b-0a9014ecf8c5.json +1 -0
  17. package/.nyc_output/processinfo/index.json +1 -0
  18. package/.prettierignore +2 -0
  19. package/CHANGELOG.md +5 -0
  20. package/build/main/index.d.ts +1 -1
  21. package/build/main/index.js +2 -3
  22. package/build/main/lib/auth.d.ts +54 -0
  23. package/build/main/lib/auth.js +62 -0
  24. package/build/main/lib/auth.spec.d.ts +1 -0
  25. package/build/main/lib/auth.spec.js +39 -0
  26. package/build/main/lib/channel/channel.spec.js +17 -3
  27. package/build/main/lib/channel/client.d.ts +2 -2
  28. package/build/main/lib/channel/client.js +6 -3
  29. package/build/main/lib/channel/payload.d.ts +2 -2
  30. package/build/main/lib/client.d.ts +13 -6
  31. package/build/main/lib/client.js +16 -4
  32. package/build/main/lib/segment/iterator.spec.js +14 -3
  33. package/build/main/lib/segment/typed.js +4 -4
  34. package/build/main/lib/segment/writer.spec.js +17 -3
  35. package/build/main/lib/telem.d.ts +2 -2
  36. package/build/main/lib/telem.js +4 -4
  37. package/build/main/lib/telem.spec.js +4 -2
  38. package/build/main/lib/transport.d.ts +2 -1
  39. package/build/main/lib/transport.js +5 -1
  40. package/build/main/lib/user/payload.d.ts +12 -0
  41. package/build/main/lib/user/payload.js +9 -0
  42. package/build/main/setupspecs.d.ts +4 -0
  43. package/build/main/setupspecs.js +17 -0
  44. package/build/module/index.d.ts +1 -1
  45. package/build/module/index.js +2 -2
  46. package/build/module/lib/auth.d.ts +54 -0
  47. package/build/module/lib/auth.js +63 -0
  48. package/build/module/lib/auth.spec.d.ts +1 -0
  49. package/build/module/lib/auth.spec.js +34 -0
  50. package/build/module/lib/channel/channel.spec.js +17 -3
  51. package/build/module/lib/channel/client.d.ts +2 -2
  52. package/build/module/lib/channel/client.js +6 -3
  53. package/build/module/lib/channel/payload.d.ts +2 -2
  54. package/build/module/lib/client.d.ts +13 -6
  55. package/build/module/lib/client.js +17 -4
  56. package/build/module/lib/segment/iterator.spec.js +14 -3
  57. package/build/module/lib/segment/typed.js +5 -5
  58. package/build/module/lib/segment/writer.spec.js +18 -4
  59. package/build/module/lib/telem.d.ts +2 -2
  60. package/build/module/lib/telem.js +4 -4
  61. package/build/module/lib/telem.spec.js +5 -3
  62. package/build/module/lib/transport.d.ts +2 -1
  63. package/build/module/lib/transport.js +5 -1
  64. package/build/module/lib/user/payload.d.ts +12 -0
  65. package/build/module/lib/user/payload.js +6 -0
  66. package/build/module/setupspecs.d.ts +4 -0
  67. package/build/module/setupspecs.js +16 -0
  68. package/build/tsconfig.module.tsbuildinfo +1 -0
  69. package/build/tsconfig.tsbuildinfo +1 -0
  70. package/coverage/base.css +224 -0
  71. package/coverage/block-navigation.js +87 -0
  72. package/coverage/favicon.png +0 -0
  73. package/coverage/index.html +191 -0
  74. package/coverage/lcov-report/base.css +224 -0
  75. package/coverage/lcov-report/block-navigation.js +87 -0
  76. package/coverage/lcov-report/favicon.png +0 -0
  77. package/coverage/lcov-report/index.html +191 -0
  78. package/coverage/lcov-report/prettify.css +1 -0
  79. package/coverage/lcov-report/prettify.js +2 -0
  80. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  81. package/coverage/lcov-report/sorter.js +196 -0
  82. package/coverage/lcov-report/src/index.html +116 -0
  83. package/coverage/lcov-report/src/lib/auth.ts.html +340 -0
  84. package/coverage/lcov-report/src/lib/channel/client.ts.html +604 -0
  85. package/coverage/lcov-report/src/lib/channel/creator.ts.html +304 -0
  86. package/coverage/lcov-report/src/lib/channel/index.html +176 -0
  87. package/coverage/lcov-report/src/lib/channel/payload.ts.html +139 -0
  88. package/coverage/lcov-report/src/lib/channel/registry.ts.html +202 -0
  89. package/coverage/lcov-report/src/lib/channel/retriever.ts.html +244 -0
  90. package/coverage/lcov-report/src/lib/client.ts.html +244 -0
  91. package/coverage/lcov-report/src/lib/errors.ts.html +484 -0
  92. package/coverage/lcov-report/src/lib/index.html +176 -0
  93. package/coverage/lcov-report/src/lib/segment/client.ts.html +463 -0
  94. package/coverage/lcov-report/src/lib/segment/index.html +206 -0
  95. package/coverage/lcov-report/src/lib/segment/iterator.ts.html +928 -0
  96. package/coverage/lcov-report/src/lib/segment/payload.ts.html +139 -0
  97. package/coverage/lcov-report/src/lib/segment/splitter.ts.html +181 -0
  98. package/coverage/lcov-report/src/lib/segment/typed.ts.html +307 -0
  99. package/coverage/lcov-report/src/lib/segment/validator.ts.html +331 -0
  100. package/coverage/lcov-report/src/lib/segment/writer.ts.html +727 -0
  101. package/coverage/lcov-report/src/lib/telem.ts.html +2056 -0
  102. package/coverage/lcov-report/src/lib/transport.ts.html +196 -0
  103. package/coverage/lcov-report/src/lib/user/index.html +116 -0
  104. package/coverage/lcov-report/src/lib/user/payload.ts.html +109 -0
  105. package/coverage/lcov-report/src/lib/util/index.html +116 -0
  106. package/coverage/lcov-report/src/lib/util/telem.ts.html +124 -0
  107. package/coverage/lcov-report/src/setupspecs.ts.html +133 -0
  108. package/coverage/lcov.info +1230 -0
  109. package/coverage/prettify.css +1 -0
  110. package/coverage/prettify.js +2 -0
  111. package/coverage/sort-arrow-sprite.png +0 -0
  112. package/coverage/sorter.js +196 -0
  113. package/coverage/src/index.html +116 -0
  114. package/coverage/src/lib/auth.ts.html +340 -0
  115. package/coverage/src/lib/channel/client.ts.html +604 -0
  116. package/coverage/src/lib/channel/creator.ts.html +304 -0
  117. package/coverage/src/lib/channel/index.html +176 -0
  118. package/coverage/src/lib/channel/payload.ts.html +139 -0
  119. package/coverage/src/lib/channel/registry.ts.html +202 -0
  120. package/coverage/src/lib/channel/retriever.ts.html +244 -0
  121. package/coverage/src/lib/client.ts.html +244 -0
  122. package/coverage/src/lib/errors.ts.html +484 -0
  123. package/coverage/src/lib/index.html +176 -0
  124. package/coverage/src/lib/segment/client.ts.html +463 -0
  125. package/coverage/src/lib/segment/index.html +206 -0
  126. package/coverage/src/lib/segment/iterator.ts.html +928 -0
  127. package/coverage/src/lib/segment/payload.ts.html +139 -0
  128. package/coverage/src/lib/segment/splitter.ts.html +181 -0
  129. package/coverage/src/lib/segment/typed.ts.html +307 -0
  130. package/coverage/src/lib/segment/validator.ts.html +331 -0
  131. package/coverage/src/lib/segment/writer.ts.html +727 -0
  132. package/coverage/src/lib/telem.ts.html +2056 -0
  133. package/coverage/src/lib/transport.ts.html +196 -0
  134. package/coverage/src/lib/user/index.html +116 -0
  135. package/coverage/src/lib/user/payload.ts.html +109 -0
  136. package/coverage/src/lib/util/index.html +116 -0
  137. package/coverage/src/lib/util/telem.ts.html +124 -0
  138. package/coverage/src/setupspecs.ts.html +133 -0
  139. package/package.json +2 -2
  140. package/src/index.ts +13 -0
  141. package/src/lib/.DS_Store +0 -0
  142. package/src/lib/auth.spec.ts +36 -0
  143. package/src/lib/auth.ts +85 -0
  144. package/src/lib/channel/channel.spec.ts +49 -0
  145. package/src/lib/channel/client.ts +173 -0
  146. package/src/lib/channel/creator.ts +73 -0
  147. package/src/lib/channel/payload.ts +18 -0
  148. package/src/lib/channel/registry.ts +39 -0
  149. package/src/lib/channel/retriever.ts +53 -0
  150. package/src/lib/client.ts +53 -0
  151. package/src/lib/errors.ts +133 -0
  152. package/src/lib/segment/client.ts +126 -0
  153. package/src/lib/segment/iterator.spec.ts +78 -0
  154. package/src/lib/segment/iterator.ts +281 -0
  155. package/src/lib/segment/payload.ts +18 -0
  156. package/src/lib/segment/splitter.ts +32 -0
  157. package/src/lib/segment/typed.ts +74 -0
  158. package/src/lib/segment/validator.ts +82 -0
  159. package/src/lib/segment/writer.spec.ts +85 -0
  160. package/src/lib/segment/writer.ts +214 -0
  161. package/src/lib/telem.spec.ts +200 -0
  162. package/src/lib/telem.ts +657 -0
  163. package/src/lib/transport.ts +37 -0
  164. package/src/lib/user/payload.ts +8 -0
  165. package/src/lib/util/telem.ts +13 -0
  166. package/src/setupspecs.ts +16 -0
  167. package/tsconfig.json +47 -0
  168. package/tsconfig.module.json +9 -0
  169. package/yarn-error.log +5756 -0
  170. package/yarn.lock +5936 -0
@@ -0,0 +1,928 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/lib/segment/iterator.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../../prettify.css" />
9
+ <link rel="stylesheet" href="../../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../../index.html">All files</a> / <a href="index.html">src/lib/segment</a> iterator.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">82.14% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>69/84</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">69.23% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>18/26</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">58.33% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>14/24</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">84.21% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>64/76</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input oninput="onInput()" type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">4x</span>
348
+ <span class="cline-any cline-neutral">&nbsp;</span>
349
+ <span class="cline-any cline-neutral">&nbsp;</span>
350
+ <span class="cline-any cline-neutral">&nbsp;</span>
351
+ <span class="cline-any cline-neutral">&nbsp;</span>
352
+ <span class="cline-any cline-neutral">&nbsp;</span>
353
+ <span class="cline-any cline-yes">4x</span>
354
+ <span class="cline-any cline-neutral">&nbsp;</span>
355
+ <span class="cline-any cline-neutral">&nbsp;</span>
356
+ <span class="cline-any cline-neutral">&nbsp;</span>
357
+ <span class="cline-any cline-yes">4x</span>
358
+ <span class="cline-any cline-neutral">&nbsp;</span>
359
+ <span class="cline-any cline-yes">4x</span>
360
+ <span class="cline-any cline-yes">4x</span>
361
+ <span class="cline-any cline-neutral">&nbsp;</span>
362
+ <span class="cline-any cline-yes">4x</span>
363
+ <span class="cline-any cline-yes">4x</span>
364
+ <span class="cline-any cline-yes">4x</span>
365
+ <span class="cline-any cline-yes">4x</span>
366
+ <span class="cline-any cline-yes">4x</span>
367
+ <span class="cline-any cline-yes">4x</span>
368
+ <span class="cline-any cline-yes">4x</span>
369
+ <span class="cline-any cline-yes">4x</span>
370
+ <span class="cline-any cline-yes">4x</span>
371
+ <span class="cline-any cline-yes">4x</span>
372
+ <span class="cline-any cline-yes">4x</span>
373
+ <span class="cline-any cline-yes">4x</span>
374
+ <span class="cline-any cline-yes">4x</span>
375
+ <span class="cline-any cline-yes">4x</span>
376
+ <span class="cline-any cline-yes">4x</span>
377
+ <span class="cline-any cline-neutral">&nbsp;</span>
378
+ <span class="cline-any cline-neutral">&nbsp;</span>
379
+ <span class="cline-any cline-yes">4x</span>
380
+ <span class="cline-any cline-yes">4x</span>
381
+ <span class="cline-any cline-yes">4x</span>
382
+ <span class="cline-any cline-yes">4x</span>
383
+ <span class="cline-any cline-neutral">&nbsp;</span>
384
+ <span class="cline-any cline-neutral">&nbsp;</span>
385
+ <span class="cline-any cline-yes">4x</span>
386
+ <span class="cline-any cline-neutral">&nbsp;</span>
387
+ <span class="cline-any cline-neutral">&nbsp;</span>
388
+ <span class="cline-any cline-neutral">&nbsp;</span>
389
+ <span class="cline-any cline-neutral">&nbsp;</span>
390
+ <span class="cline-any cline-neutral">&nbsp;</span>
391
+ <span class="cline-any cline-neutral">&nbsp;</span>
392
+ <span class="cline-any cline-neutral">&nbsp;</span>
393
+ <span class="cline-any cline-neutral">&nbsp;</span>
394
+ <span class="cline-any cline-neutral">&nbsp;</span>
395
+ <span class="cline-any cline-yes">4x</span>
396
+ <span class="cline-any cline-neutral">&nbsp;</span>
397
+ <span class="cline-any cline-neutral">&nbsp;</span>
398
+ <span class="cline-any cline-neutral">&nbsp;</span>
399
+ <span class="cline-any cline-neutral">&nbsp;</span>
400
+ <span class="cline-any cline-neutral">&nbsp;</span>
401
+ <span class="cline-any cline-neutral">&nbsp;</span>
402
+ <span class="cline-any cline-neutral">&nbsp;</span>
403
+ <span class="cline-any cline-neutral">&nbsp;</span>
404
+ <span class="cline-any cline-neutral">&nbsp;</span>
405
+ <span class="cline-any cline-neutral">&nbsp;</span>
406
+ <span class="cline-any cline-neutral">&nbsp;</span>
407
+ <span class="cline-any cline-neutral">&nbsp;</span>
408
+ <span class="cline-any cline-neutral">&nbsp;</span>
409
+ <span class="cline-any cline-neutral">&nbsp;</span>
410
+ <span class="cline-any cline-neutral">&nbsp;</span>
411
+ <span class="cline-any cline-neutral">&nbsp;</span>
412
+ <span class="cline-any cline-neutral">&nbsp;</span>
413
+ <span class="cline-any cline-yes">4x</span>
414
+ <span class="cline-any cline-yes">4x</span>
415
+ <span class="cline-any cline-neutral">&nbsp;</span>
416
+ <span class="cline-any cline-neutral">&nbsp;</span>
417
+ <span class="cline-any cline-yes">3x</span>
418
+ <span class="cline-any cline-yes">3x</span>
419
+ <span class="cline-any cline-neutral">&nbsp;</span>
420
+ <span class="cline-any cline-neutral">&nbsp;</span>
421
+ <span class="cline-any cline-yes">3x</span>
422
+ <span class="cline-any cline-yes">3x</span>
423
+ <span class="cline-any cline-neutral">&nbsp;</span>
424
+ <span class="cline-any cline-neutral">&nbsp;</span>
425
+ <span class="cline-any cline-neutral">&nbsp;</span>
426
+ <span class="cline-any cline-neutral">&nbsp;</span>
427
+ <span class="cline-any cline-neutral">&nbsp;</span>
428
+ <span class="cline-any cline-neutral">&nbsp;</span>
429
+ <span class="cline-any cline-neutral">&nbsp;</span>
430
+ <span class="cline-any cline-neutral">&nbsp;</span>
431
+ <span class="cline-any cline-neutral">&nbsp;</span>
432
+ <span class="cline-any cline-neutral">&nbsp;</span>
433
+ <span class="cline-any cline-yes">3x</span>
434
+ <span class="cline-any cline-neutral">&nbsp;</span>
435
+ <span class="cline-any cline-neutral">&nbsp;</span>
436
+ <span class="cline-any cline-neutral">&nbsp;</span>
437
+ <span class="cline-any cline-neutral">&nbsp;</span>
438
+ <span class="cline-any cline-neutral">&nbsp;</span>
439
+ <span class="cline-any cline-neutral">&nbsp;</span>
440
+ <span class="cline-any cline-yes">3x</span>
441
+ <span class="cline-any cline-yes">3x</span>
442
+ <span class="cline-any cline-neutral">&nbsp;</span>
443
+ <span class="cline-any cline-neutral">&nbsp;</span>
444
+ <span class="cline-any cline-neutral">&nbsp;</span>
445
+ <span class="cline-any cline-neutral">&nbsp;</span>
446
+ <span class="cline-any cline-neutral">&nbsp;</span>
447
+ <span class="cline-any cline-neutral">&nbsp;</span>
448
+ <span class="cline-any cline-neutral">&nbsp;</span>
449
+ <span class="cline-any cline-neutral">&nbsp;</span>
450
+ <span class="cline-any cline-neutral">&nbsp;</span>
451
+ <span class="cline-any cline-yes">8x</span>
452
+ <span class="cline-any cline-neutral">&nbsp;</span>
453
+ <span class="cline-any cline-neutral">&nbsp;</span>
454
+ <span class="cline-any cline-neutral">&nbsp;</span>
455
+ <span class="cline-any cline-neutral">&nbsp;</span>
456
+ <span class="cline-any cline-neutral">&nbsp;</span>
457
+ <span class="cline-any cline-neutral">&nbsp;</span>
458
+ <span class="cline-any cline-neutral">&nbsp;</span>
459
+ <span class="cline-any cline-neutral">&nbsp;</span>
460
+ <span class="cline-any cline-neutral">&nbsp;</span>
461
+ <span class="cline-any cline-no">&nbsp;</span>
462
+ <span class="cline-any cline-neutral">&nbsp;</span>
463
+ <span class="cline-any cline-neutral">&nbsp;</span>
464
+ <span class="cline-any cline-neutral">&nbsp;</span>
465
+ <span class="cline-any cline-neutral">&nbsp;</span>
466
+ <span class="cline-any cline-neutral">&nbsp;</span>
467
+ <span class="cline-any cline-neutral">&nbsp;</span>
468
+ <span class="cline-any cline-neutral">&nbsp;</span>
469
+ <span class="cline-any cline-neutral">&nbsp;</span>
470
+ <span class="cline-any cline-neutral">&nbsp;</span>
471
+ <span class="cline-any cline-neutral">&nbsp;</span>
472
+ <span class="cline-any cline-yes">3x</span>
473
+ <span class="cline-any cline-neutral">&nbsp;</span>
474
+ <span class="cline-any cline-neutral">&nbsp;</span>
475
+ <span class="cline-any cline-neutral">&nbsp;</span>
476
+ <span class="cline-any cline-neutral">&nbsp;</span>
477
+ <span class="cline-any cline-neutral">&nbsp;</span>
478
+ <span class="cline-any cline-neutral">&nbsp;</span>
479
+ <span class="cline-any cline-neutral">&nbsp;</span>
480
+ <span class="cline-any cline-neutral">&nbsp;</span>
481
+ <span class="cline-any cline-neutral">&nbsp;</span>
482
+ <span class="cline-any cline-neutral">&nbsp;</span>
483
+ <span class="cline-any cline-no">&nbsp;</span>
484
+ <span class="cline-any cline-neutral">&nbsp;</span>
485
+ <span class="cline-any cline-neutral">&nbsp;</span>
486
+ <span class="cline-any cline-neutral">&nbsp;</span>
487
+ <span class="cline-any cline-neutral">&nbsp;</span>
488
+ <span class="cline-any cline-neutral">&nbsp;</span>
489
+ <span class="cline-any cline-neutral">&nbsp;</span>
490
+ <span class="cline-any cline-neutral">&nbsp;</span>
491
+ <span class="cline-any cline-neutral">&nbsp;</span>
492
+ <span class="cline-any cline-neutral">&nbsp;</span>
493
+ <span class="cline-any cline-no">&nbsp;</span>
494
+ <span class="cline-any cline-neutral">&nbsp;</span>
495
+ <span class="cline-any cline-neutral">&nbsp;</span>
496
+ <span class="cline-any cline-neutral">&nbsp;</span>
497
+ <span class="cline-any cline-neutral">&nbsp;</span>
498
+ <span class="cline-any cline-neutral">&nbsp;</span>
499
+ <span class="cline-any cline-neutral">&nbsp;</span>
500
+ <span class="cline-any cline-neutral">&nbsp;</span>
501
+ <span class="cline-any cline-neutral">&nbsp;</span>
502
+ <span class="cline-any cline-neutral">&nbsp;</span>
503
+ <span class="cline-any cline-no">&nbsp;</span>
504
+ <span class="cline-any cline-neutral">&nbsp;</span>
505
+ <span class="cline-any cline-neutral">&nbsp;</span>
506
+ <span class="cline-any cline-neutral">&nbsp;</span>
507
+ <span class="cline-any cline-neutral">&nbsp;</span>
508
+ <span class="cline-any cline-neutral">&nbsp;</span>
509
+ <span class="cline-any cline-neutral">&nbsp;</span>
510
+ <span class="cline-any cline-neutral">&nbsp;</span>
511
+ <span class="cline-any cline-neutral">&nbsp;</span>
512
+ <span class="cline-any cline-neutral">&nbsp;</span>
513
+ <span class="cline-any cline-neutral">&nbsp;</span>
514
+ <span class="cline-any cline-no">&nbsp;</span>
515
+ <span class="cline-any cline-neutral">&nbsp;</span>
516
+ <span class="cline-any cline-neutral">&nbsp;</span>
517
+ <span class="cline-any cline-neutral">&nbsp;</span>
518
+ <span class="cline-any cline-neutral">&nbsp;</span>
519
+ <span class="cline-any cline-neutral">&nbsp;</span>
520
+ <span class="cline-any cline-neutral">&nbsp;</span>
521
+ <span class="cline-any cline-neutral">&nbsp;</span>
522
+ <span class="cline-any cline-neutral">&nbsp;</span>
523
+ <span class="cline-any cline-neutral">&nbsp;</span>
524
+ <span class="cline-any cline-neutral">&nbsp;</span>
525
+ <span class="cline-any cline-neutral">&nbsp;</span>
526
+ <span class="cline-any cline-no">&nbsp;</span>
527
+ <span class="cline-any cline-neutral">&nbsp;</span>
528
+ <span class="cline-any cline-neutral">&nbsp;</span>
529
+ <span class="cline-any cline-neutral">&nbsp;</span>
530
+ <span class="cline-any cline-neutral">&nbsp;</span>
531
+ <span class="cline-any cline-neutral">&nbsp;</span>
532
+ <span class="cline-any cline-neutral">&nbsp;</span>
533
+ <span class="cline-any cline-neutral">&nbsp;</span>
534
+ <span class="cline-any cline-neutral">&nbsp;</span>
535
+ <span class="cline-any cline-neutral">&nbsp;</span>
536
+ <span class="cline-any cline-neutral">&nbsp;</span>
537
+ <span class="cline-any cline-no">&nbsp;</span>
538
+ <span class="cline-any cline-neutral">&nbsp;</span>
539
+ <span class="cline-any cline-neutral">&nbsp;</span>
540
+ <span class="cline-any cline-neutral">&nbsp;</span>
541
+ <span class="cline-any cline-neutral">&nbsp;</span>
542
+ <span class="cline-any cline-neutral">&nbsp;</span>
543
+ <span class="cline-any cline-neutral">&nbsp;</span>
544
+ <span class="cline-any cline-neutral">&nbsp;</span>
545
+ <span class="cline-any cline-neutral">&nbsp;</span>
546
+ <span class="cline-any cline-neutral">&nbsp;</span>
547
+ <span class="cline-any cline-neutral">&nbsp;</span>
548
+ <span class="cline-any cline-neutral">&nbsp;</span>
549
+ <span class="cline-any cline-no">&nbsp;</span>
550
+ <span class="cline-any cline-neutral">&nbsp;</span>
551
+ <span class="cline-any cline-neutral">&nbsp;</span>
552
+ <span class="cline-any cline-neutral">&nbsp;</span>
553
+ <span class="cline-any cline-neutral">&nbsp;</span>
554
+ <span class="cline-any cline-neutral">&nbsp;</span>
555
+ <span class="cline-any cline-neutral">&nbsp;</span>
556
+ <span class="cline-any cline-neutral">&nbsp;</span>
557
+ <span class="cline-any cline-neutral">&nbsp;</span>
558
+ <span class="cline-any cline-neutral">&nbsp;</span>
559
+ <span class="cline-any cline-neutral">&nbsp;</span>
560
+ <span class="cline-any cline-neutral">&nbsp;</span>
561
+ <span class="cline-any cline-no">&nbsp;</span>
562
+ <span class="cline-any cline-neutral">&nbsp;</span>
563
+ <span class="cline-any cline-neutral">&nbsp;</span>
564
+ <span class="cline-any cline-neutral">&nbsp;</span>
565
+ <span class="cline-any cline-neutral">&nbsp;</span>
566
+ <span class="cline-any cline-neutral">&nbsp;</span>
567
+ <span class="cline-any cline-neutral">&nbsp;</span>
568
+ <span class="cline-any cline-neutral">&nbsp;</span>
569
+ <span class="cline-any cline-neutral">&nbsp;</span>
570
+ <span class="cline-any cline-no">&nbsp;</span>
571
+ <span class="cline-any cline-neutral">&nbsp;</span>
572
+ <span class="cline-any cline-neutral">&nbsp;</span>
573
+ <span class="cline-any cline-neutral">&nbsp;</span>
574
+ <span class="cline-any cline-neutral">&nbsp;</span>
575
+ <span class="cline-any cline-neutral">&nbsp;</span>
576
+ <span class="cline-any cline-neutral">&nbsp;</span>
577
+ <span class="cline-any cline-neutral">&nbsp;</span>
578
+ <span class="cline-any cline-neutral">&nbsp;</span>
579
+ <span class="cline-any cline-yes">3x</span>
580
+ <span class="cline-any cline-no">&nbsp;</span>
581
+ <span class="cline-any cline-yes">3x</span>
582
+ <span class="cline-any cline-yes">3x</span>
583
+ <span class="cline-any cline-yes">3x</span>
584
+ <span class="cline-any cline-neutral">&nbsp;</span>
585
+ <span class="cline-any cline-neutral">&nbsp;</span>
586
+ <span class="cline-any cline-neutral">&nbsp;</span>
587
+ <span class="cline-any cline-yes">14x</span>
588
+ <span class="cline-any cline-no">&nbsp;</span>
589
+ <span class="cline-any cline-yes">14x</span>
590
+ <span class="cline-any cline-yes">14x</span>
591
+ <span class="cline-any cline-yes">14x</span>
592
+ <span class="cline-any cline-yes">14x</span>
593
+ <span class="cline-any cline-yes">22x</span>
594
+ <span class="cline-any cline-yes">22x</span>
595
+ <span class="cline-any cline-yes">22x</span>
596
+ <span class="cline-any cline-yes">8x</span>
597
+ <span class="cline-any cline-neutral">&nbsp;</span>
598
+ <span class="cline-any cline-neutral">&nbsp;</span>
599
+ <span class="cline-any cline-neutral">&nbsp;</span>
600
+ <span class="cline-any cline-neutral">&nbsp;</span>
601
+ <span class="cline-any cline-yes">4x</span>
602
+ <span class="cline-any cline-neutral">&nbsp;</span>
603
+ <span class="cline-any cline-neutral">&nbsp;</span>
604
+ <span class="cline-any cline-neutral">&nbsp;</span>
605
+ <span class="cline-any cline-yes">3x</span>
606
+ <span class="cline-any cline-yes">3x</span>
607
+ <span class="cline-any cline-neutral">&nbsp;</span>
608
+ <span class="cline-any cline-neutral">&nbsp;</span>
609
+ <span class="cline-any cline-neutral">&nbsp;</span>
610
+ <span class="cline-any cline-yes">5x</span>
611
+ <span class="cline-any cline-yes">5x</span>
612
+ <span class="cline-any cline-yes">8x</span>
613
+ <span class="cline-any cline-yes">5x</span>
614
+ <span class="cline-any cline-yes">5x</span>
615
+ <span class="cline-any cline-yes">8x</span>
616
+ <span class="cline-any cline-yes">8x</span>
617
+ <span class="cline-any cline-neutral">&nbsp;</span>
618
+ <span class="cline-any cline-neutral">&nbsp;</span>
619
+ <span class="cline-any cline-yes">8x</span>
620
+ <span class="cline-any cline-yes">3x</span>
621
+ <span class="cline-any cline-neutral">&nbsp;</span>
622
+ <span class="cline-any cline-yes">5x</span>
623
+ <span class="cline-any cline-neutral">&nbsp;</span>
624
+ <span class="cline-any cline-neutral">&nbsp;</span>
625
+ <span class="cline-any cline-yes">4x</span>
626
+ <span class="cline-any cline-neutral">&nbsp;</span>
627
+ <span class="cline-any cline-neutral">&nbsp;</span>
628
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import {
629
+ EOF,
630
+ ErrorPayloadSchema,
631
+ Stream,
632
+ StreamClient,
633
+ } from '@synnaxlabs/freighter';
634
+ import { z } from 'zod';
635
+ &nbsp;
636
+ import { ChannelPayload } from '../channel/payload';
637
+ import Registry from '../channel/registry';
638
+ import { TimeRange } from '../telem';
639
+ &nbsp;
640
+ import { SegmentPayload, SegmentPayloadSchema } from './payload';
641
+ import TypedSegment from './typed';
642
+ &nbsp;
643
+ enum Command {
644
+ Open = 0,
645
+ Next = 1,
646
+ Prev = 2,
647
+ First = 3,
648
+ Last = 4,
649
+ NextSpan = 5,
650
+ PrevSpan = 6,
651
+ NextRange = 7,
652
+ Valid = 8,
653
+ Error = 9,
654
+ SeekFirst = 10,
655
+ SeekLast = 11,
656
+ SeekLT = 12,
657
+ SeekGE = 13,
658
+ }
659
+ &nbsp;
660
+ enum ResponseVariant {
661
+ None = 0,
662
+ Ack = 1,
663
+ Data = 2,
664
+ }
665
+ &nbsp;
666
+ const RequestSchema = z.object({
667
+ command: z.nativeEnum(Command),
668
+ span: z.number().optional(),
669
+ range: z.instanceof(TimeRange).optional(),
670
+ stamp: z.number().optional(),
671
+ keys: z.string().array().optional(),
672
+ });
673
+ &nbsp;
674
+ type Request = z.infer&lt;typeof RequestSchema&gt;;
675
+ &nbsp;
676
+ const ResponseSchema = z.object({
677
+ variant: z.nativeEnum(ResponseVariant),
678
+ ack: z.boolean(),
679
+ command: z.nativeEnum(Command),
680
+ error: ErrorPayloadSchema.optional(),
681
+ segments: SegmentPayloadSchema.array().nullable(),
682
+ });
683
+ &nbsp;
684
+ type Response = z.infer&lt;typeof ResponseSchema&gt;;
685
+ &nbsp;
686
+ /**
687
+ * Used to iterate over a clusters telemetry in time-order. It should not be
688
+ * instantiated directly, and should instead be instantiated via the SegmentClient.
689
+ *
690
+ * Using an iterator is ideal when querying/processing large ranges of data, but
691
+ * is relatively complex and difficult to use. If you're looking to retrieve
692
+ * telemetry between two timestamps, see the SegmentClient.read method.
693
+ */
694
+ export class CoreIterator {
695
+ private static ENDPOINT = '/segment/iterate';
696
+ private client: StreamClient;
697
+ private stream: Stream&lt;Request, Response&gt; | undefined;
698
+ private readonly aggregate: boolean = false;
699
+ values: SegmentPayload[] = [];
700
+ &nbsp;
701
+ constructor(client: StreamClient, aggregate = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span> {
702
+ this.client = client;
703
+ this.aggregate = aggregate;
704
+ }
705
+ &nbsp;
706
+ /**
707
+ * Opens the iterator, configuring it to iterate over the telemetry in the
708
+ * channels with the given keys within the provided time range.
709
+ *
710
+ * @param tr - The time range to iterate over.
711
+ * @param keys - The keys of the channels to iterate over.
712
+ */
713
+ async open(tr: TimeRange, keys: string[]) {
714
+ this.stream = await this.client.stream(
715
+ CoreIterator.ENDPOINT,
716
+ RequestSchema,
717
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
718
+ // @ts-ignore
719
+ ResponseSchema
720
+ );
721
+ await this.execute({ command: Command.Open, keys, range: tr });
722
+ this.values = [];
723
+ }
724
+ &nbsp;
725
+ /**
726
+ * Reads the next segment for each channel in the iterator.
727
+ *
728
+ * @returns false if the next segment can't be found for one or more channels or
729
+ * the iterator has accumulated an error.
730
+ */
731
+ async next(): Promise&lt;boolean&gt; {
732
+ return this.execute({ command: Command.Next });
733
+ }
734
+ &nbsp;
735
+ /**
736
+ * Reads the previous segment for each channel in the iterator.
737
+ *
738
+ * @returns false if the next segment can't be found for one or more channels or
739
+ * the iterator has accumulated an error.
740
+ */
741
+ <span class="fstat-no" title="function not covered" > async </span>prev(): Promise&lt;boolean&gt; {
742
+ <span class="cstat-no" title="statement not covered" > return this.execute({ command: Command.Prev });</span>
743
+ }
744
+ &nbsp;
745
+ /**
746
+ * Seeks to the beginning of the time range and reads the first segment of each
747
+ * channel in the iterator.
748
+ *
749
+ * @returns false if no segments exists in the time range for a particular channel
750
+ * or the iterator has accumulated an error.
751
+ */
752
+ async first(): Promise&lt;boolean&gt; {
753
+ return this.execute({ command: Command.First });
754
+ }
755
+ &nbsp;
756
+ /**
757
+ * Seeks to the end of the time range and reads the last segment of each channel
758
+ * in the iterator.
759
+ *
760
+ * @returns false if no segments exists in the time range for a particular channel,
761
+ * or the iterator has accumulated an error.
762
+ */
763
+ <span class="fstat-no" title="function not covered" > async </span>last(): Promise&lt;boolean&gt; {
764
+ <span class="cstat-no" title="statement not covered" > return this.execute({ command: Command.Last });</span>
765
+ }
766
+ &nbsp;
767
+ /**
768
+ * Reads the next time span of telemetry for each channel in the iterator.
769
+ *
770
+ * @returns false if a segment satisfying the request can't be found for a
771
+ * particular channel or the iterator has accumulated an error.
772
+ */
773
+ <span class="fstat-no" title="function not covered" > async </span>nextSpan(span: number): Promise&lt;boolean&gt; {
774
+ <span class="cstat-no" title="statement not covered" > return this.execute({ command: Command.NextSpan, span });</span>
775
+ }
776
+ &nbsp;
777
+ /**
778
+ * Reads the previous time span of telemetry for each channel in the iterator.
779
+ *
780
+ * @returns false if a segment satisfying the request can't be found for a particular
781
+ * channel or the iterator has accumulated an error.
782
+ */
783
+ <span class="fstat-no" title="function not covered" > async </span>prevSpan(span: number): Promise&lt;boolean&gt; {
784
+ <span class="cstat-no" title="statement not covered" > return this.execute({ command: Command.PrevSpan, span });</span>
785
+ }
786
+ &nbsp;
787
+ /**
788
+ * Seeks the iterator to the start of the time range and reads the telemetry within
789
+ * the range for each channel.
790
+ *
791
+ * @returns: False if a segment satisfying the request can't be found for a particular
792
+ * channel or the iterator has accumulated an error.
793
+ */
794
+ <span class="fstat-no" title="function not covered" > async </span>nextRange(range: TimeRange): Promise&lt;boolean&gt; {
795
+ <span class="cstat-no" title="statement not covered" > return this.execute({ command: Command.NextRange, range });</span>
796
+ }
797
+ &nbsp;
798
+ /**
799
+ * Seeks the iterator to the first segment in the time range, but does not read
800
+ * it. Also invalidates the iterator. The iterator will not be considered valid
801
+ * until a call to first, last, next, prev, prev_span, next_span, or next_range.
802
+ *
803
+ * @returns false if the iterator is not pointing to a valid segment for a particular
804
+ * channel or has accumulated an error.
805
+ */
806
+ <span class="fstat-no" title="function not covered" > async </span>seekFirst(): Promise&lt;boolean&gt; {
807
+ <span class="cstat-no" title="statement not covered" > return this.execute({ command: Command.SeekFirst });</span>
808
+ }
809
+ &nbsp;
810
+ /** Seeks the iterator to the last segment in the time range, but does not read it.
811
+ * Also invalidates the iterator. The iterator will not be considered valid
812
+ * until a call to first, last, next, prev, prev_span, next_span, or next_range.
813
+ *
814
+ * @returns false if the iterator is not pointing to a valid segment for a particular
815
+ * channel or has accumulated an error.
816
+ */
817
+ <span class="fstat-no" title="function not covered" > async </span>seekLast(): Promise&lt;boolean&gt; {
818
+ <span class="cstat-no" title="statement not covered" > return this.execute({ command: Command.SeekLast });</span>
819
+ }
820
+ &nbsp;
821
+ /**
822
+ * Seeks the iterator to the first segment whose start is less than or equal to
823
+ * the provided timestamp. Also invalidates the iterator. The iterator will not be
824
+ * considered valid until a call to first, last, next, prev, prev_span, next_span, or next_range.
825
+ *
826
+ * @returns false if the iterator is not pointing to a valid segment for a particular
827
+ * channel or has accumulated an error.
828
+ */
829
+ <span class="fstat-no" title="function not covered" > async </span>seekLT(stamp: number): Promise&lt;boolean&gt; {
830
+ <span class="cstat-no" title="statement not covered" > return this.execute({ command: Command.SeekLT, stamp });</span>
831
+ }
832
+ &nbsp;
833
+ /**
834
+ * Seeks the iterator to the first segment whose start is greater than or equal to
835
+ * the provided timestamp. Also invalidates the iterator. The iterator will not be
836
+ * considered valid until a call to first, last, next, prev, prev_span, next_span, or next_range.
837
+ *
838
+ * @returns false if the iterator is not pointing to a valid segment for a particular
839
+ * channel or has accumulated an error.
840
+ */
841
+ <span class="fstat-no" title="function not covered" > async </span>seekGE(stamp: number): Promise&lt;boolean&gt; {
842
+ <span class="cstat-no" title="statement not covered" > return this.execute({ command: Command.SeekGE, stamp });</span>
843
+ }
844
+ &nbsp;
845
+ /**
846
+ * @returns true if the iterator value contains a valid segment, and fale otherwise.
847
+ * valid most commonly returns false when the iterator is exhausted or has
848
+ * accumulated an error.
849
+ */
850
+ <span class="fstat-no" title="function not covered" > async </span>valid(): Promise&lt;boolean&gt; {
851
+ <span class="cstat-no" title="statement not covered" > return this.execute({ command: Command.Valid });</span>
852
+ }
853
+ &nbsp;
854
+ /**
855
+ * Closes the iterator. An iterator MUST be closed after use, and this method
856
+ * should probably be placed in a 'finally' block. If the iterator is not closed,
857
+ * it may leak resources.
858
+ */
859
+ async close() {
860
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.stream)
861
+ <span class="cstat-no" title="statement not covered" > throw new Error('iterator.open() must be called before any other method');</span>
862
+ this.stream.closeSend();
863
+ const [, exc] = await this.stream.receive();
864
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!(exc instanceof EOF)) <span class="cstat-no" title="statement not covered" >throw exc;</span>
865
+ }
866
+ &nbsp;
867
+ private async execute(request: Request): Promise&lt;boolean&gt; {
868
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.stream)
869
+ <span class="cstat-no" title="statement not covered" > throw new Error('iterator.open() must be called before any other method');</span>
870
+ const err = this.stream.send(request);
871
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (err) <span class="cstat-no" title="statement not covered" >throw err;</span>
872
+ if (!this.aggregate) this.values = [];
873
+ for (;;) {
874
+ const [res, err] = await this.stream.receive();
875
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (err || !res) <span class="cstat-no" title="statement not covered" >throw err;</span>
876
+ if (res.variant == ResponseVariant.Ack) return res.ack;
877
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (res.segments) this.values.push(...res.segments);
878
+ }
879
+ }
880
+ }
881
+ &nbsp;
882
+ export class TypedIterator extends CoreIterator {
883
+ channels: Registry;
884
+ &nbsp;
885
+ constructor(client: StreamClient, channels: Registry, aggregate = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span> {
886
+ super(client, aggregate);
887
+ this.channels = channels;
888
+ }
889
+ &nbsp;
890
+ async value(): Promise&lt;Record&lt;string, TypedSegment&gt;&gt; {
891
+ const result: Record&lt;string, TypedSegment&gt; = {};
892
+ this.values.sort((a, b) =&gt; a.start.valueOf() - b.start.valueOf());
893
+ const keys = this.values.map((v) =&gt; v.channelKey);
894
+ const channels = await this.channels.getN(...keys);
895
+ this.values.forEach((v) =&gt; {
896
+ const sugared = new TypedSegment(
897
+ channels.find((c) =&gt; c.key == v.channelKey) as ChannelPayload,
898
+ v
899
+ );
900
+ if (v.channelKey in result) {
901
+ result[v.channelKey].extend(sugared);
902
+ } else {
903
+ result[v.channelKey] = sugared;
904
+ }
905
+ });
906
+ return result;
907
+ }
908
+ }
909
+ &nbsp;</pre></td></tr></table></pre>
910
+
911
+ <div class='push'></div><!-- for sticky footer -->
912
+ </div><!-- /wrapper -->
913
+ <div class='footer quiet pad2 space-top1 center small'>
914
+ Code coverage generated by
915
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
916
+ at 2022-10-04T02:07:48.468Z
917
+ </div>
918
+ <script src="../../../prettify.js"></script>
919
+ <script>
920
+ window.onload = function () {
921
+ prettyPrint();
922
+ };
923
+ </script>
924
+ <script src="../../../sorter.js"></script>
925
+ <script src="../../../block-navigation.js"></script>
926
+ </body>
927
+ </html>
928
+