expo-iap 3.1.1 → 3.1.3

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 (42) hide show
  1. package/android/src/main/java/expo/modules/iap/ExpoIapHelper.kt +171 -0
  2. package/android/src/main/java/expo/modules/iap/ExpoIapLog.kt +4 -0
  3. package/android/src/main/java/expo/modules/iap/ExpoIapModule.kt +50 -114
  4. package/build/types.d.ts +34 -34
  5. package/build/types.js +34 -34
  6. package/build/types.js.map +1 -1
  7. package/build/utils/errorMapping.d.ts +7 -8
  8. package/build/utils/errorMapping.d.ts.map +1 -1
  9. package/build/utils/errorMapping.js +83 -53
  10. package/build/utils/errorMapping.js.map +1 -1
  11. package/coverage/clover.xml +506 -0
  12. package/coverage/coverage-final.json +6 -0
  13. package/coverage/lcov-report/base.css +224 -0
  14. package/coverage/lcov-report/block-navigation.js +87 -0
  15. package/coverage/lcov-report/favicon.png +0 -0
  16. package/coverage/lcov-report/index.html +161 -0
  17. package/coverage/lcov-report/prettify.css +1 -0
  18. package/coverage/lcov-report/prettify.js +2 -0
  19. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  20. package/coverage/lcov-report/sorter.js +196 -0
  21. package/coverage/lcov-report/src/helpers/index.html +116 -0
  22. package/coverage/lcov-report/src/helpers/subscription.ts.html +496 -0
  23. package/coverage/lcov-report/src/index.html +116 -0
  24. package/coverage/lcov-report/src/index.ts.html +1993 -0
  25. package/coverage/lcov-report/src/modules/android.ts.html +550 -0
  26. package/coverage/lcov-report/src/modules/index.html +131 -0
  27. package/coverage/lcov-report/src/modules/ios.ts.html +1222 -0
  28. package/coverage/lcov-report/src/utils/errorMapping.ts.html +1126 -0
  29. package/coverage/lcov-report/src/utils/index.html +116 -0
  30. package/coverage/lcov.info +959 -0
  31. package/ios/ExpoIapHelper.swift +101 -6
  32. package/ios/ExpoIapModule.swift +29 -97
  33. package/jest.config.js +0 -1
  34. package/openiap-versions.json +2 -2
  35. package/package.json +1 -1
  36. package/src/types.ts +34 -34
  37. package/src/utils/errorMapping.ts +101 -82
  38. package/build/utils/constants.d.ts +0 -6
  39. package/build/utils/constants.d.ts.map +0 -1
  40. package/build/utils/constants.js +0 -19
  41. package/build/utils/constants.js.map +0 -1
  42. package/src/utils/constants.ts +0 -23
@@ -0,0 +1,1126 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/utils/errorMapping.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/utils</a> errorMapping.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">94.59% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>105/111</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">79.54% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>70/88</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">88.23% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>15/17</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">94.49% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>103/109</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 type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
414
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
418
+ <span class="cline-any cline-neutral">&nbsp;</span>
419
+ <span class="cline-any cline-yes">3x</span>
420
+ <span class="cline-any cline-yes">3x</span>
421
+ <span class="cline-any cline-neutral">&nbsp;</span>
422
+ <span class="cline-any cline-yes">3x</span>
423
+ <span class="cline-any cline-yes">30x</span>
424
+ <span class="cline-any cline-yes">20x</span>
425
+ <span class="cline-any cline-neutral">&nbsp;</span>
426
+ <span class="cline-any cline-yes">45x</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-yes">10x</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-neutral">&nbsp;</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-neutral">&nbsp;</span>
441
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
452
+ <span class="cline-any cline-neutral">&nbsp;</span>
453
+ <span class="cline-any cline-yes">3x</span>
454
+ <span class="cline-any cline-yes">1x</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-yes">3x</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-neutral">&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-neutral">&nbsp;</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-neutral">&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-neutral">&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-yes">3x</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-yes">3x</span>
503
+ <span class="cline-any cline-neutral">&nbsp;</span>
504
+ <span class="cline-any cline-yes">3x</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-yes">4x</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-yes">4x</span>
514
+ <span class="cline-any cline-neutral">&nbsp;</span>
515
+ <span class="cline-any cline-neutral">&nbsp;</span>
516
+ <span class="cline-any cline-yes">4x</span>
517
+ <span class="cline-any cline-yes">4x</span>
518
+ <span class="cline-any cline-yes">4x</span>
519
+ <span class="cline-any cline-yes">4x</span>
520
+ <span class="cline-any cline-yes">4x</span>
521
+ <span class="cline-any cline-yes">4x</span>
522
+ <span class="cline-any cline-yes">4x</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-yes">3x</span>
526
+ <span class="cline-any cline-neutral">&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-yes">1x</span>
530
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
537
+ <span class="cline-any cline-neutral">&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-yes">3x</span>
547
+ <span class="cline-any cline-neutral">&nbsp;</span>
548
+ <span class="cline-any cline-no">&nbsp;</span>
549
+ <span class="cline-any cline-neutral">&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-yes">7x</span>
558
+ <span class="cline-any cline-yes">1x</span>
559
+ <span class="cline-any cline-yes">1x</span>
560
+ <span class="cline-any cline-yes">1x</span>
561
+ <span class="cline-any cline-yes">1x</span>
562
+ <span class="cline-any cline-no">&nbsp;</span>
563
+ <span class="cline-any cline-no">&nbsp;</span>
564
+ <span class="cline-any cline-neutral">&nbsp;</span>
565
+ <span class="cline-any cline-no">&nbsp;</span>
566
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
571
+ <span class="cline-any cline-neutral">&nbsp;</span>
572
+ <span class="cline-any cline-yes">7x</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-yes">7x</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-neutral">&nbsp;</span>
580
+ <span class="cline-any cline-yes">12x</span>
581
+ <span class="cline-any cline-yes">12x</span>
582
+ <span class="cline-any cline-neutral">&nbsp;</span>
583
+ <span class="cline-any cline-neutral">&nbsp;</span>
584
+ <span class="cline-any cline-neutral">&nbsp;</span>
585
+ <span class="cline-any cline-yes">3x</span>
586
+ <span class="cline-any cline-yes">58x</span>
587
+ <span class="cline-any cline-neutral">&nbsp;</span>
588
+ <span class="cline-any cline-yes">3x</span>
589
+ <span class="cline-any cline-yes">3x</span>
590
+ <span class="cline-any cline-neutral">&nbsp;</span>
591
+ <span class="cline-any cline-neutral">&nbsp;</span>
592
+ <span class="cline-any cline-neutral">&nbsp;</span>
593
+ <span class="cline-any cline-neutral">&nbsp;</span>
594
+ <span class="cline-any cline-yes">4x</span>
595
+ <span class="cline-any cline-neutral">&nbsp;</span>
596
+ <span class="cline-any cline-neutral">&nbsp;</span>
597
+ <span class="cline-any cline-yes">101x</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">3x</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">1x</span>
606
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
611
+ <span class="cline-any cline-yes">1x</span>
612
+ <span class="cline-any cline-neutral">&nbsp;</span>
613
+ <span class="cline-any cline-neutral">&nbsp;</span>
614
+ <span class="cline-any cline-yes">1x</span>
615
+ <span class="cline-any cline-neutral">&nbsp;</span>
616
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
620
+ <span class="cline-any cline-yes">2x</span>
621
+ <span class="cline-any cline-neutral">&nbsp;</span>
622
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</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>
629
+ <span class="cline-any cline-neutral">&nbsp;</span>
630
+ <span class="cline-any cline-neutral">&nbsp;</span>
631
+ <span class="cline-any cline-neutral">&nbsp;</span>
632
+ <span class="cline-any cline-yes">3x</span>
633
+ <span class="cline-any cline-neutral">&nbsp;</span>
634
+ <span class="cline-any cline-yes">3x</span>
635
+ <span class="cline-any cline-yes">37x</span>
636
+ <span class="cline-any cline-yes">1x</span>
637
+ <span class="cline-any cline-neutral">&nbsp;</span>
638
+ <span class="cline-any cline-neutral">&nbsp;</span>
639
+ <span class="cline-any cline-yes">36x</span>
640
+ <span class="cline-any cline-yes">26x</span>
641
+ <span class="cline-any cline-neutral">&nbsp;</span>
642
+ <span class="cline-any cline-neutral">&nbsp;</span>
643
+ <span class="cline-any cline-yes">10x</span>
644
+ <span class="cline-any cline-yes">10x</span>
645
+ <span class="cline-any cline-yes">2x</span>
646
+ <span class="cline-any cline-neutral">&nbsp;</span>
647
+ <span class="cline-any cline-neutral">&nbsp;</span>
648
+ <span class="cline-any cline-yes">8x</span>
649
+ <span class="cline-any cline-yes">4x</span>
650
+ <span class="cline-any cline-yes">4x</span>
651
+ <span class="cline-any cline-no">&nbsp;</span>
652
+ <span class="cline-any cline-neutral">&nbsp;</span>
653
+ <span class="cline-any cline-yes">4x</span>
654
+ <span class="cline-any cline-yes">4x</span>
655
+ <span class="cline-any cline-yes">2x</span>
656
+ <span class="cline-any cline-neutral">&nbsp;</span>
657
+ <span class="cline-any cline-neutral">&nbsp;</span>
658
+ <span class="cline-any cline-neutral">&nbsp;</span>
659
+ <span class="cline-any cline-yes">6x</span>
660
+ <span class="cline-any cline-neutral">&nbsp;</span>
661
+ <span class="cline-any cline-neutral">&nbsp;</span>
662
+ <span class="cline-any cline-neutral">&nbsp;</span>
663
+ <span class="cline-any cline-yes">38x</span>
664
+ <span class="cline-any cline-yes">28x</span>
665
+ <span class="cline-any cline-neutral">&nbsp;</span>
666
+ <span class="cline-any cline-neutral">&nbsp;</span>
667
+ <span class="cline-any cline-yes">10x</span>
668
+ <span class="cline-any cline-yes">9x</span>
669
+ <span class="cline-any cline-neutral">&nbsp;</span>
670
+ <span class="cline-any cline-neutral">&nbsp;</span>
671
+ <span class="cline-any cline-yes">1x</span>
672
+ <span class="cline-any cline-neutral">&nbsp;</span>
673
+ <span class="cline-any cline-neutral">&nbsp;</span>
674
+ <span class="cline-any cline-yes">3x</span>
675
+ <span class="cline-any cline-yes">5x</span>
676
+ <span class="cline-any cline-neutral">&nbsp;</span>
677
+ <span class="cline-any cline-neutral">&nbsp;</span>
678
+ <span class="cline-any cline-yes">3x</span>
679
+ <span class="cline-any cline-yes">5x</span>
680
+ <span class="cline-any cline-neutral">&nbsp;</span>
681
+ <span class="cline-any cline-neutral">&nbsp;</span>
682
+ <span class="cline-any cline-neutral">&nbsp;</span>
683
+ <span class="cline-any cline-neutral">&nbsp;</span>
684
+ <span class="cline-any cline-neutral">&nbsp;</span>
685
+ <span class="cline-any cline-neutral">&nbsp;</span>
686
+ <span class="cline-any cline-neutral">&nbsp;</span>
687
+ <span class="cline-any cline-yes">5x</span>
688
+ <span class="cline-any cline-yes">5x</span>
689
+ <span class="cline-any cline-neutral">&nbsp;</span>
690
+ <span class="cline-any cline-neutral">&nbsp;</span>
691
+ <span class="cline-any cline-yes">3x</span>
692
+ <span class="cline-any cline-yes">4x</span>
693
+ <span class="cline-any cline-neutral">&nbsp;</span>
694
+ <span class="cline-any cline-neutral">&nbsp;</span>
695
+ <span class="cline-any cline-neutral">&nbsp;</span>
696
+ <span class="cline-any cline-neutral">&nbsp;</span>
697
+ <span class="cline-any cline-neutral">&nbsp;</span>
698
+ <span class="cline-any cline-neutral">&nbsp;</span>
699
+ <span class="cline-any cline-neutral">&nbsp;</span>
700
+ <span class="cline-any cline-neutral">&nbsp;</span>
701
+ <span class="cline-any cline-neutral">&nbsp;</span>
702
+ <span class="cline-any cline-neutral">&nbsp;</span>
703
+ <span class="cline-any cline-yes">4x</span>
704
+ <span class="cline-any cline-yes">4x</span>
705
+ <span class="cline-any cline-neutral">&nbsp;</span>
706
+ <span class="cline-any cline-neutral">&nbsp;</span>
707
+ <span class="cline-any cline-yes">3x</span>
708
+ <span class="cline-any cline-yes">24x</span>
709
+ <span class="cline-any cline-neutral">&nbsp;</span>
710
+ <span class="cline-any cline-yes">24x</span>
711
+ <span class="cline-any cline-neutral">&nbsp;</span>
712
+ <span class="cline-any cline-yes">2x</span>
713
+ <span class="cline-any cline-neutral">&nbsp;</span>
714
+ <span class="cline-any cline-yes">1x</span>
715
+ <span class="cline-any cline-neutral">&nbsp;</span>
716
+ <span class="cline-any cline-yes">1x</span>
717
+ <span class="cline-any cline-neutral">&nbsp;</span>
718
+ <span class="cline-any cline-yes">1x</span>
719
+ <span class="cline-any cline-neutral">&nbsp;</span>
720
+ <span class="cline-any cline-yes">1x</span>
721
+ <span class="cline-any cline-neutral">&nbsp;</span>
722
+ <span class="cline-any cline-yes">1x</span>
723
+ <span class="cline-any cline-neutral">&nbsp;</span>
724
+ <span class="cline-any cline-yes">1x</span>
725
+ <span class="cline-any cline-neutral">&nbsp;</span>
726
+ <span class="cline-any cline-yes">1x</span>
727
+ <span class="cline-any cline-neutral">&nbsp;</span>
728
+ <span class="cline-any cline-yes">1x</span>
729
+ <span class="cline-any cline-neutral">&nbsp;</span>
730
+ <span class="cline-any cline-yes">1x</span>
731
+ <span class="cline-any cline-neutral">&nbsp;</span>
732
+ <span class="cline-any cline-yes">1x</span>
733
+ <span class="cline-any cline-neutral">&nbsp;</span>
734
+ <span class="cline-any cline-yes">1x</span>
735
+ <span class="cline-any cline-neutral">&nbsp;</span>
736
+ <span class="cline-any cline-yes">1x</span>
737
+ <span class="cline-any cline-neutral">&nbsp;</span>
738
+ <span class="cline-any cline-yes">1x</span>
739
+ <span class="cline-any cline-neutral">&nbsp;</span>
740
+ <span class="cline-any cline-yes">1x</span>
741
+ <span class="cline-any cline-neutral">&nbsp;</span>
742
+ <span class="cline-any cline-yes">1x</span>
743
+ <span class="cline-any cline-neutral">&nbsp;</span>
744
+ <span class="cline-any cline-yes">2x</span>
745
+ <span class="cline-any cline-neutral">&nbsp;</span>
746
+ <span class="cline-any cline-yes">1x</span>
747
+ <span class="cline-any cline-neutral">&nbsp;</span>
748
+ <span class="cline-any cline-yes">1x</span>
749
+ <span class="cline-any cline-neutral">&nbsp;</span>
750
+ <span class="cline-any cline-yes">3x</span>
751
+ <span class="cline-any cline-yes">1x</span>
752
+ <span class="cline-any cline-neutral">&nbsp;</span>
753
+ <span class="cline-any cline-neutral">&nbsp;</span>
754
+ <span class="cline-any cline-neutral">&nbsp;</span>
755
+ <span class="cline-any cline-neutral">&nbsp;</span>
756
+ <span class="cline-any cline-yes">2x</span>
757
+ <span class="cline-any cline-neutral">&nbsp;</span>
758
+ <span class="cline-any cline-neutral">&nbsp;</span>
759
+ <span class="cline-any cline-neutral">&nbsp;</span>
760
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
761
+ * Error mapping utilities for expo-iap.
762
+ * Provides helpers for working with platform-specific error codes
763
+ * and constructing structured purchase errors.
764
+ */
765
+ &nbsp;
766
+ import {NATIVE_ERROR_CODES} from '../ExpoIapModule';
767
+ import {ErrorCode, IapPlatform} from '../types';
768
+ &nbsp;
769
+ const toKebabCase = (str: string): string =&gt; {
770
+ if (str.includes('_')) {
771
+ return str
772
+ .split('_')
773
+ .map((word) =&gt; word.toLowerCase())
774
+ .join('-');
775
+ } else {
776
+ return str
777
+ .replace(/([A-Z])/g, '-$1')
778
+ .toLowerCase()
779
+ .replace(/^-/, '');
780
+ }
781
+ };
782
+ &nbsp;
783
+ export interface PurchaseErrorProps {
784
+ message?: string;
785
+ responseCode?: number;
786
+ debugMessage?: string;
787
+ code?: ErrorCode | string | number;
788
+ productId?: string;
789
+ platform?: IapPlatform;
790
+ }
791
+ &nbsp;
792
+ export interface PurchaseError extends Error {
793
+ responseCode?: number;
794
+ debugMessage?: string;
795
+ code?: ErrorCode;
796
+ productId?: string;
797
+ platform?: IapPlatform;
798
+ }
799
+ &nbsp;
800
+ const normalizePlatform = (platform: IapPlatform): 'ios' | 'android' =&gt;
801
+ typeof platform === 'string' &amp;&amp; platform.toLowerCase() === 'ios'
802
+ ? 'ios'
803
+ : <span class="branch-1 cbranch-no" title="branch not covered" >'android';</span>
804
+ &nbsp;
805
+ const COMMON_ERROR_CODE_MAP: Record&lt;ErrorCode, string&gt; = {
806
+ [ErrorCode.Unknown]: ErrorCode.Unknown,
807
+ [ErrorCode.UserCancelled]: ErrorCode.UserCancelled,
808
+ [ErrorCode.UserError]: ErrorCode.UserError,
809
+ [ErrorCode.ItemUnavailable]: ErrorCode.ItemUnavailable,
810
+ [ErrorCode.RemoteError]: ErrorCode.RemoteError,
811
+ [ErrorCode.NetworkError]: ErrorCode.NetworkError,
812
+ [ErrorCode.ServiceError]: ErrorCode.ServiceError,
813
+ [ErrorCode.ReceiptFailed]: ErrorCode.ReceiptFailed,
814
+ [ErrorCode.ReceiptFinished]: ErrorCode.ReceiptFinished,
815
+ [ErrorCode.ReceiptFinishedFailed]: ErrorCode.ReceiptFinishedFailed,
816
+ [ErrorCode.NotPrepared]: ErrorCode.NotPrepared,
817
+ [ErrorCode.NotEnded]: ErrorCode.NotEnded,
818
+ [ErrorCode.AlreadyOwned]: ErrorCode.AlreadyOwned,
819
+ [ErrorCode.DeveloperError]: ErrorCode.DeveloperError,
820
+ [ErrorCode.BillingResponseJsonParseError]:
821
+ ErrorCode.BillingResponseJsonParseError,
822
+ [ErrorCode.DeferredPayment]: ErrorCode.DeferredPayment,
823
+ [ErrorCode.Interrupted]: ErrorCode.Interrupted,
824
+ [ErrorCode.IapNotAvailable]: ErrorCode.IapNotAvailable,
825
+ [ErrorCode.PurchaseError]: ErrorCode.PurchaseError,
826
+ [ErrorCode.SyncError]: ErrorCode.SyncError,
827
+ [ErrorCode.TransactionValidationFailed]:
828
+ ErrorCode.TransactionValidationFailed,
829
+ [ErrorCode.ActivityUnavailable]: ErrorCode.ActivityUnavailable,
830
+ [ErrorCode.AlreadyPrepared]: ErrorCode.AlreadyPrepared,
831
+ [ErrorCode.Pending]: ErrorCode.Pending,
832
+ [ErrorCode.ConnectionClosed]: ErrorCode.ConnectionClosed,
833
+ [ErrorCode.InitConnection]: ErrorCode.InitConnection,
834
+ [ErrorCode.ServiceDisconnected]: ErrorCode.ServiceDisconnected,
835
+ [ErrorCode.QueryProduct]: ErrorCode.QueryProduct,
836
+ [ErrorCode.SkuNotFound]: ErrorCode.SkuNotFound,
837
+ [ErrorCode.SkuOfferMismatch]: ErrorCode.SkuOfferMismatch,
838
+ [ErrorCode.ItemNotOwned]: ErrorCode.ItemNotOwned,
839
+ [ErrorCode.BillingUnavailable]: ErrorCode.BillingUnavailable,
840
+ [ErrorCode.FeatureNotSupported]: ErrorCode.FeatureNotSupported,
841
+ [ErrorCode.EmptySkuList]: ErrorCode.EmptySkuList,
842
+ };
843
+ &nbsp;
844
+ export const ErrorCodeMapping = {
845
+ ios: COMMON_ERROR_CODE_MAP,
846
+ android: COMMON_ERROR_CODE_MAP,
847
+ } as const;
848
+ &nbsp;
849
+ const OPENIAP_ERROR_CODE_SET: Set&lt;string&gt; = new Set(Object.values(ErrorCode));
850
+ &nbsp;
851
+ export const createPurchaseError = (
852
+ props: PurchaseErrorProps,
853
+ ): PurchaseError =&gt; {
854
+ const errorCode = props.code
855
+ ? typeof props.code === 'string' || <span class="branch-1 cbranch-no" title="branch not covered" >typeof props.code === 'number'</span>
856
+ ? ErrorCodeUtils.fromPlatformCode(props.code, props.platform || 'ios')
857
+ : <span class="branch-1 cbranch-no" title="branch not covered" >props.code</span>
858
+ : <span class="branch-1 cbranch-no" title="branch not covered" >undefined;</span>
859
+ &nbsp;
860
+ const error = new Error(
861
+ props.message ?? <span class="branch-1 cbranch-no" title="branch not covered" >'Unknown error occurred',</span>
862
+ ) as PurchaseError;
863
+ error.name = '[expo-iap]: PurchaseError';
864
+ error.responseCode = props.responseCode;
865
+ error.debugMessage = props.debugMessage;
866
+ error.code = errorCode;
867
+ error.productId = props.productId;
868
+ error.platform = props.platform;
869
+ return error;
870
+ };
871
+ &nbsp;
872
+ export const createPurchaseErrorFromPlatform = (
873
+ errorData: PurchaseErrorProps,
874
+ platform: IapPlatform,
875
+ ): PurchaseError =&gt; {
876
+ const normalizedPlatform = normalizePlatform(platform);
877
+ const errorCode = errorData.code
878
+ ? typeof errorData.code === 'string' || <span class="branch-1 cbranch-no" title="branch not covered" >typeof errorData.code === 'number'</span>
879
+ ? ErrorCodeUtils.fromPlatformCode(errorData.code, normalizedPlatform)
880
+ : <span class="branch-1 cbranch-no" title="branch not covered" >errorData.code</span>
881
+ : <span class="branch-1 cbranch-no" title="branch not covered" >ErrorCode.Unknown;</span>
882
+ &nbsp;
883
+ return createPurchaseError({
884
+ message: errorData.message ?? <span class="branch-1 cbranch-no" title="branch not covered" >'Unknown error occurred',</span>
885
+ responseCode: errorData.responseCode,
886
+ debugMessage: errorData.debugMessage,
887
+ code: errorCode,
888
+ productId: errorData.productId,
889
+ platform,
890
+ });
891
+ };
892
+ &nbsp;
893
+ export const ErrorCodeUtils = {
894
+ getNativeErrorCode: <span class="fstat-no" title="function not covered" >(e</span>rrorCode: ErrorCode): string =&gt; {
895
+ <span class="cstat-no" title="statement not covered" > return (</span>
896
+ (NATIVE_ERROR_CODES as Record&lt;string, string | undefined&gt;)[errorCode] ??
897
+ errorCode
898
+ );
899
+ },
900
+ fromPlatformCode: (
901
+ platformCode: string | number,
902
+ _platform: IapPlatform,
903
+ ): ErrorCode =&gt; {
904
+ if (typeof platformCode === 'string' &amp;&amp; platformCode.startsWith('E_')) {
905
+ const withoutE = platformCode.substring(2);
906
+ const camelCased = toKebabCase(withoutE);
907
+ const withE = `E_${camelCased}`;
908
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (OPENIAP_ERROR_CODE_SET.has(withE)) {
909
+ const match = <span class="cstat-no" title="statement not covered" >Object.entries(COMMON_ERROR_CODE_MAP).find(</span>
910
+ <span class="fstat-no" title="function not covered" > ([</span>, value]) =&gt; <span class="cstat-no" title="statement not covered" >value === withE,</span>
911
+ );
912
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (match) {</span>
913
+ <span class="cstat-no" title="statement not covered" > return match[0] as ErrorCode;</span>
914
+ }
915
+ }
916
+ }
917
+ &nbsp;
918
+ const normalizedCode =
919
+ typeof platformCode === 'string'
920
+ ? toKebabCase(platformCode)
921
+ : platformCode;
922
+ &nbsp;
923
+ for (const [standardized, nativeCode] of Object.entries(
924
+ (NATIVE_ERROR_CODES || <span class="branch-1 cbranch-no" title="branch not covered" >{})</span> as Record&lt;string, string | number&gt;,
925
+ )) {
926
+ const normalizedNative =
927
+ typeof nativeCode === 'string' ? toKebabCase(nativeCode) : nativeCode;
928
+ if (
929
+ normalizedNative === normalizedCode &amp;&amp;
930
+ OPENIAP_ERROR_CODE_SET.has(standardized)
931
+ ) {
932
+ const match = Object.entries(COMMON_ERROR_CODE_MAP).find(
933
+ ([, mappedCode]) =&gt; mappedCode === standardized,
934
+ );
935
+ if (match) {
936
+ return match[0] as ErrorCode;
937
+ }
938
+ }
939
+ }
940
+ &nbsp;
941
+ for (const [errorCode, mappedCode] of Object.entries(
942
+ COMMON_ERROR_CODE_MAP,
943
+ )) {
944
+ if (
945
+ mappedCode === normalizedCode ||
946
+ mappedCode === `E_${normalizedCode}`
947
+ ) {
948
+ return errorCode as ErrorCode;
949
+ }
950
+ }
951
+ &nbsp;
952
+ return ErrorCode.Unknown;
953
+ },
954
+ toPlatformCode: (
955
+ errorCode: ErrorCode,
956
+ _platform: IapPlatform,
957
+ ): string | number =&gt; {
958
+ const native = (NATIVE_ERROR_CODES as Record&lt;string, string | number&gt;)[
959
+ errorCode
960
+ ];
961
+ return native ?? <span class="branch-1 cbranch-no" title="branch not covered" >COMMON_ERROR_CODE_MAP[errorCode] </span>?? <span class="branch-2 cbranch-no" title="branch not covered" >'E_UNKNOWN';</span>
962
+ },
963
+ isValidForPlatform: (
964
+ errorCode: ErrorCode,
965
+ platform: IapPlatform,
966
+ ): boolean =&gt; {
967
+ return (
968
+ (NATIVE_ERROR_CODES as Record&lt;string, unknown&gt;)[errorCode] !== undefined
969
+ );
970
+ },
971
+ };
972
+ &nbsp;
973
+ // ---------------------------------------------------------------------------
974
+ // Convenience helpers for interpreting error objects
975
+ // ---------------------------------------------------------------------------
976
+ &nbsp;
977
+ type ErrorLike = string | {code?: ErrorCode | string; message?: string};
978
+ &nbsp;
979
+ const ERROR_CODES = new Set&lt;string&gt;(Object.values(ErrorCode));
980
+ &nbsp;
981
+ const normalizeErrorCode = (code?: string | null): string | undefined =&gt; {
982
+ if (!code) {
983
+ return undefined;
984
+ }
985
+ &nbsp;
986
+ if (ERROR_CODES.has(code)) {
987
+ return code;
988
+ }
989
+ &nbsp;
990
+ const camelCased = toKebabCase(code);
991
+ if (ERROR_CODES.has(camelCased)) {
992
+ return camelCased;
993
+ }
994
+ &nbsp;
995
+ if (code.startsWith('E_')) {
996
+ const trimmed = code.substring(2);
997
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (ERROR_CODES.has(trimmed)) {
998
+ <span class="cstat-no" title="statement not covered" > return trimmed;</span>
999
+ }
1000
+ const camelTrimmed = toKebabCase(trimmed);
1001
+ if (ERROR_CODES.has(camelTrimmed)) {
1002
+ return camelTrimmed;
1003
+ }
1004
+ }
1005
+ &nbsp;
1006
+ return code;
1007
+ };
1008
+ &nbsp;
1009
+ function extractCode(error: unknown): string | undefined {
1010
+ if (typeof error === 'string') {
1011
+ return normalizeErrorCode(error);
1012
+ }
1013
+ &nbsp;
1014
+ if (error &amp;&amp; typeof error === 'object' &amp;&amp; 'code' in error) {
1015
+ return normalizeErrorCode((error as {code?: string}).code);
1016
+ }
1017
+ &nbsp;
1018
+ return undefined;
1019
+ }
1020
+ &nbsp;
1021
+ export function isUserCancelledError(error: unknown): boolean {
1022
+ return extractCode(error) === ErrorCode.UserCancelled;
1023
+ }
1024
+ &nbsp;
1025
+ export function isNetworkError(error: unknown): boolean {
1026
+ const networkErrors: ErrorCode[] = [
1027
+ ErrorCode.NetworkError,
1028
+ ErrorCode.RemoteError,
1029
+ ErrorCode.ServiceError,
1030
+ ErrorCode.ServiceDisconnected,
1031
+ ErrorCode.BillingUnavailable,
1032
+ ];
1033
+ &nbsp;
1034
+ const code = extractCode(error);
1035
+ return !!code &amp;&amp; (networkErrors as string[]).includes(code);
1036
+ }
1037
+ &nbsp;
1038
+ export function isRecoverableError(error: unknown): boolean {
1039
+ const recoverableErrors: ErrorCode[] = [
1040
+ ErrorCode.NetworkError,
1041
+ ErrorCode.RemoteError,
1042
+ ErrorCode.ServiceError,
1043
+ ErrorCode.Interrupted,
1044
+ ErrorCode.ServiceDisconnected,
1045
+ ErrorCode.BillingUnavailable,
1046
+ ErrorCode.QueryProduct,
1047
+ ErrorCode.InitConnection,
1048
+ ];
1049
+ &nbsp;
1050
+ const code = extractCode(error);
1051
+ return !!code &amp;&amp; (recoverableErrors as string[]).includes(code);
1052
+ }
1053
+ &nbsp;
1054
+ export function getUserFriendlyErrorMessage(error: ErrorLike): string {
1055
+ const errorCode = extractCode(error);
1056
+ &nbsp;
1057
+ switch (errorCode) {
1058
+ case ErrorCode.UserCancelled:
1059
+ return 'Purchase was cancelled by user';
1060
+ case ErrorCode.NetworkError:
1061
+ return 'Network connection error. Please check your internet connection and try again.';
1062
+ case ErrorCode.ReceiptFinished:
1063
+ return 'Receipt already finished';
1064
+ case ErrorCode.ServiceDisconnected:
1065
+ return 'Billing service disconnected. Please try again.';
1066
+ case ErrorCode.BillingUnavailable:
1067
+ return 'Billing is unavailable on this device or account.';
1068
+ case ErrorCode.ItemUnavailable:
1069
+ return 'This item is not available for purchase';
1070
+ case ErrorCode.ItemNotOwned:
1071
+ return "You don't own this item";
1072
+ case ErrorCode.AlreadyOwned:
1073
+ return 'You already own this item';
1074
+ case ErrorCode.SkuNotFound:
1075
+ return 'Requested product could not be found';
1076
+ case ErrorCode.SkuOfferMismatch:
1077
+ return 'Selected offer does not match the SKU';
1078
+ case ErrorCode.DeferredPayment:
1079
+ return 'Payment is pending approval';
1080
+ case ErrorCode.NotPrepared:
1081
+ return 'In-app purchase is not ready. Please try again later.';
1082
+ case ErrorCode.ServiceError:
1083
+ return 'Store service error. Please try again later.';
1084
+ case ErrorCode.FeatureNotSupported:
1085
+ return 'This feature is not supported on this device.';
1086
+ case ErrorCode.TransactionValidationFailed:
1087
+ return 'Transaction could not be verified';
1088
+ case ErrorCode.ReceiptFailed:
1089
+ return 'Receipt processing failed';
1090
+ case ErrorCode.EmptySkuList:
1091
+ return 'No product IDs provided';
1092
+ case ErrorCode.InitConnection:
1093
+ return 'Failed to initialize billing connection';
1094
+ case ErrorCode.QueryProduct:
1095
+ return 'Failed to query products. Please try again later.';
1096
+ default: {
1097
+ if (error &amp;&amp; typeof error === 'object' &amp;&amp; 'message' in error) {
1098
+ return (
1099
+ (error as {message?: string}).message ??
1100
+ <span class="branch-1 cbranch-no" title="branch not covered" > 'An unexpected error occurred'</span>
1101
+ );
1102
+ }
1103
+ return 'An unexpected error occurred';
1104
+ }
1105
+ }
1106
+ }
1107
+ &nbsp;</pre></td></tr></table></pre>
1108
+
1109
+ <div class='push'></div><!-- for sticky footer -->
1110
+ </div><!-- /wrapper -->
1111
+ <div class='footer quiet pad2 space-top1 center small'>
1112
+ Code coverage generated by
1113
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1114
+ at 2025-09-24T00:35:10.304Z
1115
+ </div>
1116
+ <script src="../../prettify.js"></script>
1117
+ <script>
1118
+ window.onload = function () {
1119
+ prettyPrint();
1120
+ };
1121
+ </script>
1122
+ <script src="../../sorter.js"></script>
1123
+ <script src="../../block-navigation.js"></script>
1124
+ </body>
1125
+ </html>
1126
+