a2acalling 0.6.74 → 0.6.75

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 (118) hide show
  1. package/.a2a-manifest.json +2 -2
  2. package/.c8rc.json +16 -0
  3. package/.node-version +1 -0
  4. package/.serena/project.yml +126 -0
  5. package/ARCHITECTURE.md +11 -0
  6. package/CONVENTIONS.md +9 -0
  7. package/coverage/base.css +224 -0
  8. package/coverage/block-navigation.js +87 -0
  9. package/coverage/favicon.png +0 -0
  10. package/coverage/index.html +146 -0
  11. package/coverage/prettify.css +1 -0
  12. package/coverage/prettify.js +2 -0
  13. package/coverage/sort-arrow-sprite.png +0 -0
  14. package/coverage/sorter.js +210 -0
  15. package/coverage/src/index.html +131 -0
  16. package/coverage/src/index.js.html +313 -0
  17. package/coverage/src/lib/agent-card.js.html +418 -0
  18. package/coverage/src/lib/call-monitor.js.html +700 -0
  19. package/coverage/src/lib/callbook.js.html +1183 -0
  20. package/coverage/src/lib/claude-subagent.js.html +2173 -0
  21. package/coverage/src/lib/client.js.html +2134 -0
  22. package/coverage/src/lib/config.js.html +1525 -0
  23. package/coverage/src/lib/conversation-driver.js.html +1909 -0
  24. package/coverage/src/lib/conversations.js.html +2575 -0
  25. package/coverage/src/lib/crypto.js.html +424 -0
  26. package/coverage/src/lib/dashboard-events.js.html +724 -0
  27. package/coverage/src/lib/disclosure.js.html +2461 -0
  28. package/coverage/src/lib/external-ip.js.html +718 -0
  29. package/coverage/src/lib/index.html +506 -0
  30. package/coverage/src/lib/invite-host.js.html +754 -0
  31. package/coverage/src/lib/local-request.js.html +292 -0
  32. package/coverage/src/lib/logger.js.html +2116 -0
  33. package/coverage/src/lib/openclaw-integration.js.html +1102 -0
  34. package/coverage/src/lib/pid-file.js.html +394 -0
  35. package/coverage/src/lib/port-scanner.js.html +334 -0
  36. package/coverage/src/lib/prompt-template.js.html +1150 -0
  37. package/coverage/src/lib/runtime-adapter.js.html +2188 -0
  38. package/coverage/src/lib/summarizer.js.html +553 -0
  39. package/coverage/src/lib/summary-formatter.js.html +589 -0
  40. package/coverage/src/lib/summary-prompt.js.html +694 -0
  41. package/coverage/src/lib/tokens.js.html +2689 -0
  42. package/coverage/src/lib/turn-timeout.js.html +241 -0
  43. package/coverage/src/lib/update-checker.js.html +364 -0
  44. package/coverage/src/lib/update-manager.js.html +1024 -0
  45. package/coverage/src/routes/a2a.js.html +3724 -0
  46. package/coverage/src/routes/callbook.js.html +511 -0
  47. package/coverage/src/routes/dashboard.js.html +4819 -0
  48. package/coverage/src/routes/index.html +146 -0
  49. package/coverage/src/server.js.html +3622 -0
  50. package/coverage/tmp/coverage-1605378-1772576706365-0.json +1 -0
  51. package/coverage/tmp/coverage-1605384-1772576607459-0.json +1 -0
  52. package/coverage/tmp/coverage-1605410-1772576631155-0.json +1 -0
  53. package/coverage/tmp/coverage-1606942-1772576636869-0.json +1 -0
  54. package/coverage/tmp/coverage-1607004-1772576637454-0.json +1 -0
  55. package/coverage/tmp/coverage-1607044-1772576637876-0.json +1 -0
  56. package/coverage/tmp/coverage-1607096-1772576638356-0.json +1 -0
  57. package/coverage/tmp/coverage-1607145-1772576638777-0.json +1 -0
  58. package/coverage/tmp/coverage-1607201-1772576639277-0.json +1 -0
  59. package/coverage/tmp/coverage-1607247-1772576639755-0.json +1 -0
  60. package/coverage/tmp/coverage-1607317-1772576640083-0.json +1 -0
  61. package/coverage/tmp/coverage-1607381-1772576640465-0.json +1 -0
  62. package/coverage/tmp/coverage-1607446-1772576640868-0.json +1 -0
  63. package/coverage/tmp/coverage-1607501-1772576641662-0.json +1 -0
  64. package/coverage/tmp/coverage-1607534-1772576641565-0.json +1 -0
  65. package/coverage/tmp/coverage-1607627-1772576641871-0.json +1 -0
  66. package/coverage/tmp/coverage-1607665-1772576642172-0.json +1 -0
  67. package/coverage/tmp/coverage-1607714-1772576642577-0.json +1 -0
  68. package/coverage/tmp/coverage-1607788-1772576643466-0.json +1 -0
  69. package/coverage/tmp/coverage-1607924-1772576644678-0.json +1 -0
  70. package/coverage/tmp/coverage-1607978-1772576645154-0.json +1 -0
  71. package/coverage/tmp/coverage-1608035-1772576645564-0.json +1 -0
  72. package/coverage/tmp/coverage-1608106-1772576645967-0.json +1 -0
  73. package/coverage/tmp/coverage-1608179-1772576648656-0.json +1 -0
  74. package/coverage/tmp/coverage-1608196-1772576647367-0.json +1 -0
  75. package/coverage/tmp/coverage-1608217-1772576648557-0.json +1 -0
  76. package/coverage/tmp/coverage-1608256-1772576651378-0.json +1 -0
  77. package/coverage/tmp/coverage-1608265-1772576650058-0.json +1 -0
  78. package/coverage/tmp/coverage-1608289-1772576651358-0.json +1 -0
  79. package/coverage/tmp/coverage-1608591-1772576660465-0.json +1 -0
  80. package/coverage/tmp/coverage-1608648-1772576659272-0.json +1 -0
  81. package/coverage/tmp/coverage-1608665-1772576660374-0.json +1 -0
  82. package/coverage/tmp/coverage-1608677-1772576661268-0.json +1 -0
  83. package/coverage/tmp/coverage-1608684-1772576663968-0.json +1 -0
  84. package/coverage/tmp/coverage-1608692-1772576662575-0.json +1 -0
  85. package/coverage/tmp/coverage-1608701-1772576663873-0.json +1 -0
  86. package/coverage/tmp/coverage-1608718-1772576666674-0.json +1 -0
  87. package/coverage/tmp/coverage-1608725-1772576665463-0.json +1 -0
  88. package/coverage/tmp/coverage-1608738-1772576666577-0.json +1 -0
  89. package/coverage/tmp/coverage-1608753-1772576669664-0.json +1 -0
  90. package/coverage/tmp/coverage-1608763-1772576668275-0.json +1 -0
  91. package/coverage/tmp/coverage-1608771-1772576669563-0.json +1 -0
  92. package/coverage/tmp/coverage-1608828-1772576676574-0.json +1 -0
  93. package/coverage/tmp/coverage-1609244-1772576675272-0.json +1 -0
  94. package/coverage/tmp/coverage-1609342-1772576676478-0.json +1 -0
  95. package/coverage/tmp/coverage-1609450-1772576686954-0.json +1 -0
  96. package/coverage/tmp/coverage-1609841-1772576685466-0.json +1 -0
  97. package/coverage/tmp/coverage-1609925-1772576686855-0.json +1 -0
  98. package/coverage/tmp/coverage-1610399-1772576692469-0.json +1 -0
  99. package/coverage/tmp/coverage-1611283-1772576703062-0.json +1 -0
  100. package/coverage/tmp/coverage-1611294-1772576703755-0.json +1 -0
  101. package/docs/plans/2026-03-03-a2a-91-macos-packaging-plan.md +144 -0
  102. package/docs/signing-setup.md +49 -0
  103. package/native/macos/certs/appldevcert.cer +0 -0
  104. package/native/macos/src-tauri/binaries/.gitkeep +0 -0
  105. package/native/macos/src-tauri/capabilities/default.json +11 -1
  106. package/native/macos/src-tauri/entitlements.plist +14 -0
  107. package/native/macos/src-tauri/src/discovery.rs +14 -3
  108. package/native/macos/src-tauri/src/health.rs +4 -0
  109. package/native/macos/src-tauri/src/lib.rs +52 -11
  110. package/native/macos/src-tauri/src/server.rs +262 -26
  111. package/native/macos/src-tauri/tauri.conf.json +13 -4
  112. package/package.json +7 -2
  113. package/pkg.config.json +14 -0
  114. package/scripts/build-standalone.sh +106 -0
  115. package/scripts/smoke-test-standalone.sh +101 -0
  116. package/scripts/sync-version.sh +28 -0
  117. package/scripts/verify-app-bundle.sh +34 -0
  118. package/.maestro/inbox/release-workflow-spam.md +0 -25
@@ -0,0 +1,3724 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/routes/a2a.js</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/routes</a> a2a.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">80.62% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>978/1213</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">78.35% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>152/194</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">90% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>18/20</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">80.62% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>978/1213</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>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a>
640
+ <a name='L575'></a><a href='#L575'>575</a>
641
+ <a name='L576'></a><a href='#L576'>576</a>
642
+ <a name='L577'></a><a href='#L577'>577</a>
643
+ <a name='L578'></a><a href='#L578'>578</a>
644
+ <a name='L579'></a><a href='#L579'>579</a>
645
+ <a name='L580'></a><a href='#L580'>580</a>
646
+ <a name='L581'></a><a href='#L581'>581</a>
647
+ <a name='L582'></a><a href='#L582'>582</a>
648
+ <a name='L583'></a><a href='#L583'>583</a>
649
+ <a name='L584'></a><a href='#L584'>584</a>
650
+ <a name='L585'></a><a href='#L585'>585</a>
651
+ <a name='L586'></a><a href='#L586'>586</a>
652
+ <a name='L587'></a><a href='#L587'>587</a>
653
+ <a name='L588'></a><a href='#L588'>588</a>
654
+ <a name='L589'></a><a href='#L589'>589</a>
655
+ <a name='L590'></a><a href='#L590'>590</a>
656
+ <a name='L591'></a><a href='#L591'>591</a>
657
+ <a name='L592'></a><a href='#L592'>592</a>
658
+ <a name='L593'></a><a href='#L593'>593</a>
659
+ <a name='L594'></a><a href='#L594'>594</a>
660
+ <a name='L595'></a><a href='#L595'>595</a>
661
+ <a name='L596'></a><a href='#L596'>596</a>
662
+ <a name='L597'></a><a href='#L597'>597</a>
663
+ <a name='L598'></a><a href='#L598'>598</a>
664
+ <a name='L599'></a><a href='#L599'>599</a>
665
+ <a name='L600'></a><a href='#L600'>600</a>
666
+ <a name='L601'></a><a href='#L601'>601</a>
667
+ <a name='L602'></a><a href='#L602'>602</a>
668
+ <a name='L603'></a><a href='#L603'>603</a>
669
+ <a name='L604'></a><a href='#L604'>604</a>
670
+ <a name='L605'></a><a href='#L605'>605</a>
671
+ <a name='L606'></a><a href='#L606'>606</a>
672
+ <a name='L607'></a><a href='#L607'>607</a>
673
+ <a name='L608'></a><a href='#L608'>608</a>
674
+ <a name='L609'></a><a href='#L609'>609</a>
675
+ <a name='L610'></a><a href='#L610'>610</a>
676
+ <a name='L611'></a><a href='#L611'>611</a>
677
+ <a name='L612'></a><a href='#L612'>612</a>
678
+ <a name='L613'></a><a href='#L613'>613</a>
679
+ <a name='L614'></a><a href='#L614'>614</a>
680
+ <a name='L615'></a><a href='#L615'>615</a>
681
+ <a name='L616'></a><a href='#L616'>616</a>
682
+ <a name='L617'></a><a href='#L617'>617</a>
683
+ <a name='L618'></a><a href='#L618'>618</a>
684
+ <a name='L619'></a><a href='#L619'>619</a>
685
+ <a name='L620'></a><a href='#L620'>620</a>
686
+ <a name='L621'></a><a href='#L621'>621</a>
687
+ <a name='L622'></a><a href='#L622'>622</a>
688
+ <a name='L623'></a><a href='#L623'>623</a>
689
+ <a name='L624'></a><a href='#L624'>624</a>
690
+ <a name='L625'></a><a href='#L625'>625</a>
691
+ <a name='L626'></a><a href='#L626'>626</a>
692
+ <a name='L627'></a><a href='#L627'>627</a>
693
+ <a name='L628'></a><a href='#L628'>628</a>
694
+ <a name='L629'></a><a href='#L629'>629</a>
695
+ <a name='L630'></a><a href='#L630'>630</a>
696
+ <a name='L631'></a><a href='#L631'>631</a>
697
+ <a name='L632'></a><a href='#L632'>632</a>
698
+ <a name='L633'></a><a href='#L633'>633</a>
699
+ <a name='L634'></a><a href='#L634'>634</a>
700
+ <a name='L635'></a><a href='#L635'>635</a>
701
+ <a name='L636'></a><a href='#L636'>636</a>
702
+ <a name='L637'></a><a href='#L637'>637</a>
703
+ <a name='L638'></a><a href='#L638'>638</a>
704
+ <a name='L639'></a><a href='#L639'>639</a>
705
+ <a name='L640'></a><a href='#L640'>640</a>
706
+ <a name='L641'></a><a href='#L641'>641</a>
707
+ <a name='L642'></a><a href='#L642'>642</a>
708
+ <a name='L643'></a><a href='#L643'>643</a>
709
+ <a name='L644'></a><a href='#L644'>644</a>
710
+ <a name='L645'></a><a href='#L645'>645</a>
711
+ <a name='L646'></a><a href='#L646'>646</a>
712
+ <a name='L647'></a><a href='#L647'>647</a>
713
+ <a name='L648'></a><a href='#L648'>648</a>
714
+ <a name='L649'></a><a href='#L649'>649</a>
715
+ <a name='L650'></a><a href='#L650'>650</a>
716
+ <a name='L651'></a><a href='#L651'>651</a>
717
+ <a name='L652'></a><a href='#L652'>652</a>
718
+ <a name='L653'></a><a href='#L653'>653</a>
719
+ <a name='L654'></a><a href='#L654'>654</a>
720
+ <a name='L655'></a><a href='#L655'>655</a>
721
+ <a name='L656'></a><a href='#L656'>656</a>
722
+ <a name='L657'></a><a href='#L657'>657</a>
723
+ <a name='L658'></a><a href='#L658'>658</a>
724
+ <a name='L659'></a><a href='#L659'>659</a>
725
+ <a name='L660'></a><a href='#L660'>660</a>
726
+ <a name='L661'></a><a href='#L661'>661</a>
727
+ <a name='L662'></a><a href='#L662'>662</a>
728
+ <a name='L663'></a><a href='#L663'>663</a>
729
+ <a name='L664'></a><a href='#L664'>664</a>
730
+ <a name='L665'></a><a href='#L665'>665</a>
731
+ <a name='L666'></a><a href='#L666'>666</a>
732
+ <a name='L667'></a><a href='#L667'>667</a>
733
+ <a name='L668'></a><a href='#L668'>668</a>
734
+ <a name='L669'></a><a href='#L669'>669</a>
735
+ <a name='L670'></a><a href='#L670'>670</a>
736
+ <a name='L671'></a><a href='#L671'>671</a>
737
+ <a name='L672'></a><a href='#L672'>672</a>
738
+ <a name='L673'></a><a href='#L673'>673</a>
739
+ <a name='L674'></a><a href='#L674'>674</a>
740
+ <a name='L675'></a><a href='#L675'>675</a>
741
+ <a name='L676'></a><a href='#L676'>676</a>
742
+ <a name='L677'></a><a href='#L677'>677</a>
743
+ <a name='L678'></a><a href='#L678'>678</a>
744
+ <a name='L679'></a><a href='#L679'>679</a>
745
+ <a name='L680'></a><a href='#L680'>680</a>
746
+ <a name='L681'></a><a href='#L681'>681</a>
747
+ <a name='L682'></a><a href='#L682'>682</a>
748
+ <a name='L683'></a><a href='#L683'>683</a>
749
+ <a name='L684'></a><a href='#L684'>684</a>
750
+ <a name='L685'></a><a href='#L685'>685</a>
751
+ <a name='L686'></a><a href='#L686'>686</a>
752
+ <a name='L687'></a><a href='#L687'>687</a>
753
+ <a name='L688'></a><a href='#L688'>688</a>
754
+ <a name='L689'></a><a href='#L689'>689</a>
755
+ <a name='L690'></a><a href='#L690'>690</a>
756
+ <a name='L691'></a><a href='#L691'>691</a>
757
+ <a name='L692'></a><a href='#L692'>692</a>
758
+ <a name='L693'></a><a href='#L693'>693</a>
759
+ <a name='L694'></a><a href='#L694'>694</a>
760
+ <a name='L695'></a><a href='#L695'>695</a>
761
+ <a name='L696'></a><a href='#L696'>696</a>
762
+ <a name='L697'></a><a href='#L697'>697</a>
763
+ <a name='L698'></a><a href='#L698'>698</a>
764
+ <a name='L699'></a><a href='#L699'>699</a>
765
+ <a name='L700'></a><a href='#L700'>700</a>
766
+ <a name='L701'></a><a href='#L701'>701</a>
767
+ <a name='L702'></a><a href='#L702'>702</a>
768
+ <a name='L703'></a><a href='#L703'>703</a>
769
+ <a name='L704'></a><a href='#L704'>704</a>
770
+ <a name='L705'></a><a href='#L705'>705</a>
771
+ <a name='L706'></a><a href='#L706'>706</a>
772
+ <a name='L707'></a><a href='#L707'>707</a>
773
+ <a name='L708'></a><a href='#L708'>708</a>
774
+ <a name='L709'></a><a href='#L709'>709</a>
775
+ <a name='L710'></a><a href='#L710'>710</a>
776
+ <a name='L711'></a><a href='#L711'>711</a>
777
+ <a name='L712'></a><a href='#L712'>712</a>
778
+ <a name='L713'></a><a href='#L713'>713</a>
779
+ <a name='L714'></a><a href='#L714'>714</a>
780
+ <a name='L715'></a><a href='#L715'>715</a>
781
+ <a name='L716'></a><a href='#L716'>716</a>
782
+ <a name='L717'></a><a href='#L717'>717</a>
783
+ <a name='L718'></a><a href='#L718'>718</a>
784
+ <a name='L719'></a><a href='#L719'>719</a>
785
+ <a name='L720'></a><a href='#L720'>720</a>
786
+ <a name='L721'></a><a href='#L721'>721</a>
787
+ <a name='L722'></a><a href='#L722'>722</a>
788
+ <a name='L723'></a><a href='#L723'>723</a>
789
+ <a name='L724'></a><a href='#L724'>724</a>
790
+ <a name='L725'></a><a href='#L725'>725</a>
791
+ <a name='L726'></a><a href='#L726'>726</a>
792
+ <a name='L727'></a><a href='#L727'>727</a>
793
+ <a name='L728'></a><a href='#L728'>728</a>
794
+ <a name='L729'></a><a href='#L729'>729</a>
795
+ <a name='L730'></a><a href='#L730'>730</a>
796
+ <a name='L731'></a><a href='#L731'>731</a>
797
+ <a name='L732'></a><a href='#L732'>732</a>
798
+ <a name='L733'></a><a href='#L733'>733</a>
799
+ <a name='L734'></a><a href='#L734'>734</a>
800
+ <a name='L735'></a><a href='#L735'>735</a>
801
+ <a name='L736'></a><a href='#L736'>736</a>
802
+ <a name='L737'></a><a href='#L737'>737</a>
803
+ <a name='L738'></a><a href='#L738'>738</a>
804
+ <a name='L739'></a><a href='#L739'>739</a>
805
+ <a name='L740'></a><a href='#L740'>740</a>
806
+ <a name='L741'></a><a href='#L741'>741</a>
807
+ <a name='L742'></a><a href='#L742'>742</a>
808
+ <a name='L743'></a><a href='#L743'>743</a>
809
+ <a name='L744'></a><a href='#L744'>744</a>
810
+ <a name='L745'></a><a href='#L745'>745</a>
811
+ <a name='L746'></a><a href='#L746'>746</a>
812
+ <a name='L747'></a><a href='#L747'>747</a>
813
+ <a name='L748'></a><a href='#L748'>748</a>
814
+ <a name='L749'></a><a href='#L749'>749</a>
815
+ <a name='L750'></a><a href='#L750'>750</a>
816
+ <a name='L751'></a><a href='#L751'>751</a>
817
+ <a name='L752'></a><a href='#L752'>752</a>
818
+ <a name='L753'></a><a href='#L753'>753</a>
819
+ <a name='L754'></a><a href='#L754'>754</a>
820
+ <a name='L755'></a><a href='#L755'>755</a>
821
+ <a name='L756'></a><a href='#L756'>756</a>
822
+ <a name='L757'></a><a href='#L757'>757</a>
823
+ <a name='L758'></a><a href='#L758'>758</a>
824
+ <a name='L759'></a><a href='#L759'>759</a>
825
+ <a name='L760'></a><a href='#L760'>760</a>
826
+ <a name='L761'></a><a href='#L761'>761</a>
827
+ <a name='L762'></a><a href='#L762'>762</a>
828
+ <a name='L763'></a><a href='#L763'>763</a>
829
+ <a name='L764'></a><a href='#L764'>764</a>
830
+ <a name='L765'></a><a href='#L765'>765</a>
831
+ <a name='L766'></a><a href='#L766'>766</a>
832
+ <a name='L767'></a><a href='#L767'>767</a>
833
+ <a name='L768'></a><a href='#L768'>768</a>
834
+ <a name='L769'></a><a href='#L769'>769</a>
835
+ <a name='L770'></a><a href='#L770'>770</a>
836
+ <a name='L771'></a><a href='#L771'>771</a>
837
+ <a name='L772'></a><a href='#L772'>772</a>
838
+ <a name='L773'></a><a href='#L773'>773</a>
839
+ <a name='L774'></a><a href='#L774'>774</a>
840
+ <a name='L775'></a><a href='#L775'>775</a>
841
+ <a name='L776'></a><a href='#L776'>776</a>
842
+ <a name='L777'></a><a href='#L777'>777</a>
843
+ <a name='L778'></a><a href='#L778'>778</a>
844
+ <a name='L779'></a><a href='#L779'>779</a>
845
+ <a name='L780'></a><a href='#L780'>780</a>
846
+ <a name='L781'></a><a href='#L781'>781</a>
847
+ <a name='L782'></a><a href='#L782'>782</a>
848
+ <a name='L783'></a><a href='#L783'>783</a>
849
+ <a name='L784'></a><a href='#L784'>784</a>
850
+ <a name='L785'></a><a href='#L785'>785</a>
851
+ <a name='L786'></a><a href='#L786'>786</a>
852
+ <a name='L787'></a><a href='#L787'>787</a>
853
+ <a name='L788'></a><a href='#L788'>788</a>
854
+ <a name='L789'></a><a href='#L789'>789</a>
855
+ <a name='L790'></a><a href='#L790'>790</a>
856
+ <a name='L791'></a><a href='#L791'>791</a>
857
+ <a name='L792'></a><a href='#L792'>792</a>
858
+ <a name='L793'></a><a href='#L793'>793</a>
859
+ <a name='L794'></a><a href='#L794'>794</a>
860
+ <a name='L795'></a><a href='#L795'>795</a>
861
+ <a name='L796'></a><a href='#L796'>796</a>
862
+ <a name='L797'></a><a href='#L797'>797</a>
863
+ <a name='L798'></a><a href='#L798'>798</a>
864
+ <a name='L799'></a><a href='#L799'>799</a>
865
+ <a name='L800'></a><a href='#L800'>800</a>
866
+ <a name='L801'></a><a href='#L801'>801</a>
867
+ <a name='L802'></a><a href='#L802'>802</a>
868
+ <a name='L803'></a><a href='#L803'>803</a>
869
+ <a name='L804'></a><a href='#L804'>804</a>
870
+ <a name='L805'></a><a href='#L805'>805</a>
871
+ <a name='L806'></a><a href='#L806'>806</a>
872
+ <a name='L807'></a><a href='#L807'>807</a>
873
+ <a name='L808'></a><a href='#L808'>808</a>
874
+ <a name='L809'></a><a href='#L809'>809</a>
875
+ <a name='L810'></a><a href='#L810'>810</a>
876
+ <a name='L811'></a><a href='#L811'>811</a>
877
+ <a name='L812'></a><a href='#L812'>812</a>
878
+ <a name='L813'></a><a href='#L813'>813</a>
879
+ <a name='L814'></a><a href='#L814'>814</a>
880
+ <a name='L815'></a><a href='#L815'>815</a>
881
+ <a name='L816'></a><a href='#L816'>816</a>
882
+ <a name='L817'></a><a href='#L817'>817</a>
883
+ <a name='L818'></a><a href='#L818'>818</a>
884
+ <a name='L819'></a><a href='#L819'>819</a>
885
+ <a name='L820'></a><a href='#L820'>820</a>
886
+ <a name='L821'></a><a href='#L821'>821</a>
887
+ <a name='L822'></a><a href='#L822'>822</a>
888
+ <a name='L823'></a><a href='#L823'>823</a>
889
+ <a name='L824'></a><a href='#L824'>824</a>
890
+ <a name='L825'></a><a href='#L825'>825</a>
891
+ <a name='L826'></a><a href='#L826'>826</a>
892
+ <a name='L827'></a><a href='#L827'>827</a>
893
+ <a name='L828'></a><a href='#L828'>828</a>
894
+ <a name='L829'></a><a href='#L829'>829</a>
895
+ <a name='L830'></a><a href='#L830'>830</a>
896
+ <a name='L831'></a><a href='#L831'>831</a>
897
+ <a name='L832'></a><a href='#L832'>832</a>
898
+ <a name='L833'></a><a href='#L833'>833</a>
899
+ <a name='L834'></a><a href='#L834'>834</a>
900
+ <a name='L835'></a><a href='#L835'>835</a>
901
+ <a name='L836'></a><a href='#L836'>836</a>
902
+ <a name='L837'></a><a href='#L837'>837</a>
903
+ <a name='L838'></a><a href='#L838'>838</a>
904
+ <a name='L839'></a><a href='#L839'>839</a>
905
+ <a name='L840'></a><a href='#L840'>840</a>
906
+ <a name='L841'></a><a href='#L841'>841</a>
907
+ <a name='L842'></a><a href='#L842'>842</a>
908
+ <a name='L843'></a><a href='#L843'>843</a>
909
+ <a name='L844'></a><a href='#L844'>844</a>
910
+ <a name='L845'></a><a href='#L845'>845</a>
911
+ <a name='L846'></a><a href='#L846'>846</a>
912
+ <a name='L847'></a><a href='#L847'>847</a>
913
+ <a name='L848'></a><a href='#L848'>848</a>
914
+ <a name='L849'></a><a href='#L849'>849</a>
915
+ <a name='L850'></a><a href='#L850'>850</a>
916
+ <a name='L851'></a><a href='#L851'>851</a>
917
+ <a name='L852'></a><a href='#L852'>852</a>
918
+ <a name='L853'></a><a href='#L853'>853</a>
919
+ <a name='L854'></a><a href='#L854'>854</a>
920
+ <a name='L855'></a><a href='#L855'>855</a>
921
+ <a name='L856'></a><a href='#L856'>856</a>
922
+ <a name='L857'></a><a href='#L857'>857</a>
923
+ <a name='L858'></a><a href='#L858'>858</a>
924
+ <a name='L859'></a><a href='#L859'>859</a>
925
+ <a name='L860'></a><a href='#L860'>860</a>
926
+ <a name='L861'></a><a href='#L861'>861</a>
927
+ <a name='L862'></a><a href='#L862'>862</a>
928
+ <a name='L863'></a><a href='#L863'>863</a>
929
+ <a name='L864'></a><a href='#L864'>864</a>
930
+ <a name='L865'></a><a href='#L865'>865</a>
931
+ <a name='L866'></a><a href='#L866'>866</a>
932
+ <a name='L867'></a><a href='#L867'>867</a>
933
+ <a name='L868'></a><a href='#L868'>868</a>
934
+ <a name='L869'></a><a href='#L869'>869</a>
935
+ <a name='L870'></a><a href='#L870'>870</a>
936
+ <a name='L871'></a><a href='#L871'>871</a>
937
+ <a name='L872'></a><a href='#L872'>872</a>
938
+ <a name='L873'></a><a href='#L873'>873</a>
939
+ <a name='L874'></a><a href='#L874'>874</a>
940
+ <a name='L875'></a><a href='#L875'>875</a>
941
+ <a name='L876'></a><a href='#L876'>876</a>
942
+ <a name='L877'></a><a href='#L877'>877</a>
943
+ <a name='L878'></a><a href='#L878'>878</a>
944
+ <a name='L879'></a><a href='#L879'>879</a>
945
+ <a name='L880'></a><a href='#L880'>880</a>
946
+ <a name='L881'></a><a href='#L881'>881</a>
947
+ <a name='L882'></a><a href='#L882'>882</a>
948
+ <a name='L883'></a><a href='#L883'>883</a>
949
+ <a name='L884'></a><a href='#L884'>884</a>
950
+ <a name='L885'></a><a href='#L885'>885</a>
951
+ <a name='L886'></a><a href='#L886'>886</a>
952
+ <a name='L887'></a><a href='#L887'>887</a>
953
+ <a name='L888'></a><a href='#L888'>888</a>
954
+ <a name='L889'></a><a href='#L889'>889</a>
955
+ <a name='L890'></a><a href='#L890'>890</a>
956
+ <a name='L891'></a><a href='#L891'>891</a>
957
+ <a name='L892'></a><a href='#L892'>892</a>
958
+ <a name='L893'></a><a href='#L893'>893</a>
959
+ <a name='L894'></a><a href='#L894'>894</a>
960
+ <a name='L895'></a><a href='#L895'>895</a>
961
+ <a name='L896'></a><a href='#L896'>896</a>
962
+ <a name='L897'></a><a href='#L897'>897</a>
963
+ <a name='L898'></a><a href='#L898'>898</a>
964
+ <a name='L899'></a><a href='#L899'>899</a>
965
+ <a name='L900'></a><a href='#L900'>900</a>
966
+ <a name='L901'></a><a href='#L901'>901</a>
967
+ <a name='L902'></a><a href='#L902'>902</a>
968
+ <a name='L903'></a><a href='#L903'>903</a>
969
+ <a name='L904'></a><a href='#L904'>904</a>
970
+ <a name='L905'></a><a href='#L905'>905</a>
971
+ <a name='L906'></a><a href='#L906'>906</a>
972
+ <a name='L907'></a><a href='#L907'>907</a>
973
+ <a name='L908'></a><a href='#L908'>908</a>
974
+ <a name='L909'></a><a href='#L909'>909</a>
975
+ <a name='L910'></a><a href='#L910'>910</a>
976
+ <a name='L911'></a><a href='#L911'>911</a>
977
+ <a name='L912'></a><a href='#L912'>912</a>
978
+ <a name='L913'></a><a href='#L913'>913</a>
979
+ <a name='L914'></a><a href='#L914'>914</a>
980
+ <a name='L915'></a><a href='#L915'>915</a>
981
+ <a name='L916'></a><a href='#L916'>916</a>
982
+ <a name='L917'></a><a href='#L917'>917</a>
983
+ <a name='L918'></a><a href='#L918'>918</a>
984
+ <a name='L919'></a><a href='#L919'>919</a>
985
+ <a name='L920'></a><a href='#L920'>920</a>
986
+ <a name='L921'></a><a href='#L921'>921</a>
987
+ <a name='L922'></a><a href='#L922'>922</a>
988
+ <a name='L923'></a><a href='#L923'>923</a>
989
+ <a name='L924'></a><a href='#L924'>924</a>
990
+ <a name='L925'></a><a href='#L925'>925</a>
991
+ <a name='L926'></a><a href='#L926'>926</a>
992
+ <a name='L927'></a><a href='#L927'>927</a>
993
+ <a name='L928'></a><a href='#L928'>928</a>
994
+ <a name='L929'></a><a href='#L929'>929</a>
995
+ <a name='L930'></a><a href='#L930'>930</a>
996
+ <a name='L931'></a><a href='#L931'>931</a>
997
+ <a name='L932'></a><a href='#L932'>932</a>
998
+ <a name='L933'></a><a href='#L933'>933</a>
999
+ <a name='L934'></a><a href='#L934'>934</a>
1000
+ <a name='L935'></a><a href='#L935'>935</a>
1001
+ <a name='L936'></a><a href='#L936'>936</a>
1002
+ <a name='L937'></a><a href='#L937'>937</a>
1003
+ <a name='L938'></a><a href='#L938'>938</a>
1004
+ <a name='L939'></a><a href='#L939'>939</a>
1005
+ <a name='L940'></a><a href='#L940'>940</a>
1006
+ <a name='L941'></a><a href='#L941'>941</a>
1007
+ <a name='L942'></a><a href='#L942'>942</a>
1008
+ <a name='L943'></a><a href='#L943'>943</a>
1009
+ <a name='L944'></a><a href='#L944'>944</a>
1010
+ <a name='L945'></a><a href='#L945'>945</a>
1011
+ <a name='L946'></a><a href='#L946'>946</a>
1012
+ <a name='L947'></a><a href='#L947'>947</a>
1013
+ <a name='L948'></a><a href='#L948'>948</a>
1014
+ <a name='L949'></a><a href='#L949'>949</a>
1015
+ <a name='L950'></a><a href='#L950'>950</a>
1016
+ <a name='L951'></a><a href='#L951'>951</a>
1017
+ <a name='L952'></a><a href='#L952'>952</a>
1018
+ <a name='L953'></a><a href='#L953'>953</a>
1019
+ <a name='L954'></a><a href='#L954'>954</a>
1020
+ <a name='L955'></a><a href='#L955'>955</a>
1021
+ <a name='L956'></a><a href='#L956'>956</a>
1022
+ <a name='L957'></a><a href='#L957'>957</a>
1023
+ <a name='L958'></a><a href='#L958'>958</a>
1024
+ <a name='L959'></a><a href='#L959'>959</a>
1025
+ <a name='L960'></a><a href='#L960'>960</a>
1026
+ <a name='L961'></a><a href='#L961'>961</a>
1027
+ <a name='L962'></a><a href='#L962'>962</a>
1028
+ <a name='L963'></a><a href='#L963'>963</a>
1029
+ <a name='L964'></a><a href='#L964'>964</a>
1030
+ <a name='L965'></a><a href='#L965'>965</a>
1031
+ <a name='L966'></a><a href='#L966'>966</a>
1032
+ <a name='L967'></a><a href='#L967'>967</a>
1033
+ <a name='L968'></a><a href='#L968'>968</a>
1034
+ <a name='L969'></a><a href='#L969'>969</a>
1035
+ <a name='L970'></a><a href='#L970'>970</a>
1036
+ <a name='L971'></a><a href='#L971'>971</a>
1037
+ <a name='L972'></a><a href='#L972'>972</a>
1038
+ <a name='L973'></a><a href='#L973'>973</a>
1039
+ <a name='L974'></a><a href='#L974'>974</a>
1040
+ <a name='L975'></a><a href='#L975'>975</a>
1041
+ <a name='L976'></a><a href='#L976'>976</a>
1042
+ <a name='L977'></a><a href='#L977'>977</a>
1043
+ <a name='L978'></a><a href='#L978'>978</a>
1044
+ <a name='L979'></a><a href='#L979'>979</a>
1045
+ <a name='L980'></a><a href='#L980'>980</a>
1046
+ <a name='L981'></a><a href='#L981'>981</a>
1047
+ <a name='L982'></a><a href='#L982'>982</a>
1048
+ <a name='L983'></a><a href='#L983'>983</a>
1049
+ <a name='L984'></a><a href='#L984'>984</a>
1050
+ <a name='L985'></a><a href='#L985'>985</a>
1051
+ <a name='L986'></a><a href='#L986'>986</a>
1052
+ <a name='L987'></a><a href='#L987'>987</a>
1053
+ <a name='L988'></a><a href='#L988'>988</a>
1054
+ <a name='L989'></a><a href='#L989'>989</a>
1055
+ <a name='L990'></a><a href='#L990'>990</a>
1056
+ <a name='L991'></a><a href='#L991'>991</a>
1057
+ <a name='L992'></a><a href='#L992'>992</a>
1058
+ <a name='L993'></a><a href='#L993'>993</a>
1059
+ <a name='L994'></a><a href='#L994'>994</a>
1060
+ <a name='L995'></a><a href='#L995'>995</a>
1061
+ <a name='L996'></a><a href='#L996'>996</a>
1062
+ <a name='L997'></a><a href='#L997'>997</a>
1063
+ <a name='L998'></a><a href='#L998'>998</a>
1064
+ <a name='L999'></a><a href='#L999'>999</a>
1065
+ <a name='L1000'></a><a href='#L1000'>1000</a>
1066
+ <a name='L1001'></a><a href='#L1001'>1001</a>
1067
+ <a name='L1002'></a><a href='#L1002'>1002</a>
1068
+ <a name='L1003'></a><a href='#L1003'>1003</a>
1069
+ <a name='L1004'></a><a href='#L1004'>1004</a>
1070
+ <a name='L1005'></a><a href='#L1005'>1005</a>
1071
+ <a name='L1006'></a><a href='#L1006'>1006</a>
1072
+ <a name='L1007'></a><a href='#L1007'>1007</a>
1073
+ <a name='L1008'></a><a href='#L1008'>1008</a>
1074
+ <a name='L1009'></a><a href='#L1009'>1009</a>
1075
+ <a name='L1010'></a><a href='#L1010'>1010</a>
1076
+ <a name='L1011'></a><a href='#L1011'>1011</a>
1077
+ <a name='L1012'></a><a href='#L1012'>1012</a>
1078
+ <a name='L1013'></a><a href='#L1013'>1013</a>
1079
+ <a name='L1014'></a><a href='#L1014'>1014</a>
1080
+ <a name='L1015'></a><a href='#L1015'>1015</a>
1081
+ <a name='L1016'></a><a href='#L1016'>1016</a>
1082
+ <a name='L1017'></a><a href='#L1017'>1017</a>
1083
+ <a name='L1018'></a><a href='#L1018'>1018</a>
1084
+ <a name='L1019'></a><a href='#L1019'>1019</a>
1085
+ <a name='L1020'></a><a href='#L1020'>1020</a>
1086
+ <a name='L1021'></a><a href='#L1021'>1021</a>
1087
+ <a name='L1022'></a><a href='#L1022'>1022</a>
1088
+ <a name='L1023'></a><a href='#L1023'>1023</a>
1089
+ <a name='L1024'></a><a href='#L1024'>1024</a>
1090
+ <a name='L1025'></a><a href='#L1025'>1025</a>
1091
+ <a name='L1026'></a><a href='#L1026'>1026</a>
1092
+ <a name='L1027'></a><a href='#L1027'>1027</a>
1093
+ <a name='L1028'></a><a href='#L1028'>1028</a>
1094
+ <a name='L1029'></a><a href='#L1029'>1029</a>
1095
+ <a name='L1030'></a><a href='#L1030'>1030</a>
1096
+ <a name='L1031'></a><a href='#L1031'>1031</a>
1097
+ <a name='L1032'></a><a href='#L1032'>1032</a>
1098
+ <a name='L1033'></a><a href='#L1033'>1033</a>
1099
+ <a name='L1034'></a><a href='#L1034'>1034</a>
1100
+ <a name='L1035'></a><a href='#L1035'>1035</a>
1101
+ <a name='L1036'></a><a href='#L1036'>1036</a>
1102
+ <a name='L1037'></a><a href='#L1037'>1037</a>
1103
+ <a name='L1038'></a><a href='#L1038'>1038</a>
1104
+ <a name='L1039'></a><a href='#L1039'>1039</a>
1105
+ <a name='L1040'></a><a href='#L1040'>1040</a>
1106
+ <a name='L1041'></a><a href='#L1041'>1041</a>
1107
+ <a name='L1042'></a><a href='#L1042'>1042</a>
1108
+ <a name='L1043'></a><a href='#L1043'>1043</a>
1109
+ <a name='L1044'></a><a href='#L1044'>1044</a>
1110
+ <a name='L1045'></a><a href='#L1045'>1045</a>
1111
+ <a name='L1046'></a><a href='#L1046'>1046</a>
1112
+ <a name='L1047'></a><a href='#L1047'>1047</a>
1113
+ <a name='L1048'></a><a href='#L1048'>1048</a>
1114
+ <a name='L1049'></a><a href='#L1049'>1049</a>
1115
+ <a name='L1050'></a><a href='#L1050'>1050</a>
1116
+ <a name='L1051'></a><a href='#L1051'>1051</a>
1117
+ <a name='L1052'></a><a href='#L1052'>1052</a>
1118
+ <a name='L1053'></a><a href='#L1053'>1053</a>
1119
+ <a name='L1054'></a><a href='#L1054'>1054</a>
1120
+ <a name='L1055'></a><a href='#L1055'>1055</a>
1121
+ <a name='L1056'></a><a href='#L1056'>1056</a>
1122
+ <a name='L1057'></a><a href='#L1057'>1057</a>
1123
+ <a name='L1058'></a><a href='#L1058'>1058</a>
1124
+ <a name='L1059'></a><a href='#L1059'>1059</a>
1125
+ <a name='L1060'></a><a href='#L1060'>1060</a>
1126
+ <a name='L1061'></a><a href='#L1061'>1061</a>
1127
+ <a name='L1062'></a><a href='#L1062'>1062</a>
1128
+ <a name='L1063'></a><a href='#L1063'>1063</a>
1129
+ <a name='L1064'></a><a href='#L1064'>1064</a>
1130
+ <a name='L1065'></a><a href='#L1065'>1065</a>
1131
+ <a name='L1066'></a><a href='#L1066'>1066</a>
1132
+ <a name='L1067'></a><a href='#L1067'>1067</a>
1133
+ <a name='L1068'></a><a href='#L1068'>1068</a>
1134
+ <a name='L1069'></a><a href='#L1069'>1069</a>
1135
+ <a name='L1070'></a><a href='#L1070'>1070</a>
1136
+ <a name='L1071'></a><a href='#L1071'>1071</a>
1137
+ <a name='L1072'></a><a href='#L1072'>1072</a>
1138
+ <a name='L1073'></a><a href='#L1073'>1073</a>
1139
+ <a name='L1074'></a><a href='#L1074'>1074</a>
1140
+ <a name='L1075'></a><a href='#L1075'>1075</a>
1141
+ <a name='L1076'></a><a href='#L1076'>1076</a>
1142
+ <a name='L1077'></a><a href='#L1077'>1077</a>
1143
+ <a name='L1078'></a><a href='#L1078'>1078</a>
1144
+ <a name='L1079'></a><a href='#L1079'>1079</a>
1145
+ <a name='L1080'></a><a href='#L1080'>1080</a>
1146
+ <a name='L1081'></a><a href='#L1081'>1081</a>
1147
+ <a name='L1082'></a><a href='#L1082'>1082</a>
1148
+ <a name='L1083'></a><a href='#L1083'>1083</a>
1149
+ <a name='L1084'></a><a href='#L1084'>1084</a>
1150
+ <a name='L1085'></a><a href='#L1085'>1085</a>
1151
+ <a name='L1086'></a><a href='#L1086'>1086</a>
1152
+ <a name='L1087'></a><a href='#L1087'>1087</a>
1153
+ <a name='L1088'></a><a href='#L1088'>1088</a>
1154
+ <a name='L1089'></a><a href='#L1089'>1089</a>
1155
+ <a name='L1090'></a><a href='#L1090'>1090</a>
1156
+ <a name='L1091'></a><a href='#L1091'>1091</a>
1157
+ <a name='L1092'></a><a href='#L1092'>1092</a>
1158
+ <a name='L1093'></a><a href='#L1093'>1093</a>
1159
+ <a name='L1094'></a><a href='#L1094'>1094</a>
1160
+ <a name='L1095'></a><a href='#L1095'>1095</a>
1161
+ <a name='L1096'></a><a href='#L1096'>1096</a>
1162
+ <a name='L1097'></a><a href='#L1097'>1097</a>
1163
+ <a name='L1098'></a><a href='#L1098'>1098</a>
1164
+ <a name='L1099'></a><a href='#L1099'>1099</a>
1165
+ <a name='L1100'></a><a href='#L1100'>1100</a>
1166
+ <a name='L1101'></a><a href='#L1101'>1101</a>
1167
+ <a name='L1102'></a><a href='#L1102'>1102</a>
1168
+ <a name='L1103'></a><a href='#L1103'>1103</a>
1169
+ <a name='L1104'></a><a href='#L1104'>1104</a>
1170
+ <a name='L1105'></a><a href='#L1105'>1105</a>
1171
+ <a name='L1106'></a><a href='#L1106'>1106</a>
1172
+ <a name='L1107'></a><a href='#L1107'>1107</a>
1173
+ <a name='L1108'></a><a href='#L1108'>1108</a>
1174
+ <a name='L1109'></a><a href='#L1109'>1109</a>
1175
+ <a name='L1110'></a><a href='#L1110'>1110</a>
1176
+ <a name='L1111'></a><a href='#L1111'>1111</a>
1177
+ <a name='L1112'></a><a href='#L1112'>1112</a>
1178
+ <a name='L1113'></a><a href='#L1113'>1113</a>
1179
+ <a name='L1114'></a><a href='#L1114'>1114</a>
1180
+ <a name='L1115'></a><a href='#L1115'>1115</a>
1181
+ <a name='L1116'></a><a href='#L1116'>1116</a>
1182
+ <a name='L1117'></a><a href='#L1117'>1117</a>
1183
+ <a name='L1118'></a><a href='#L1118'>1118</a>
1184
+ <a name='L1119'></a><a href='#L1119'>1119</a>
1185
+ <a name='L1120'></a><a href='#L1120'>1120</a>
1186
+ <a name='L1121'></a><a href='#L1121'>1121</a>
1187
+ <a name='L1122'></a><a href='#L1122'>1122</a>
1188
+ <a name='L1123'></a><a href='#L1123'>1123</a>
1189
+ <a name='L1124'></a><a href='#L1124'>1124</a>
1190
+ <a name='L1125'></a><a href='#L1125'>1125</a>
1191
+ <a name='L1126'></a><a href='#L1126'>1126</a>
1192
+ <a name='L1127'></a><a href='#L1127'>1127</a>
1193
+ <a name='L1128'></a><a href='#L1128'>1128</a>
1194
+ <a name='L1129'></a><a href='#L1129'>1129</a>
1195
+ <a name='L1130'></a><a href='#L1130'>1130</a>
1196
+ <a name='L1131'></a><a href='#L1131'>1131</a>
1197
+ <a name='L1132'></a><a href='#L1132'>1132</a>
1198
+ <a name='L1133'></a><a href='#L1133'>1133</a>
1199
+ <a name='L1134'></a><a href='#L1134'>1134</a>
1200
+ <a name='L1135'></a><a href='#L1135'>1135</a>
1201
+ <a name='L1136'></a><a href='#L1136'>1136</a>
1202
+ <a name='L1137'></a><a href='#L1137'>1137</a>
1203
+ <a name='L1138'></a><a href='#L1138'>1138</a>
1204
+ <a name='L1139'></a><a href='#L1139'>1139</a>
1205
+ <a name='L1140'></a><a href='#L1140'>1140</a>
1206
+ <a name='L1141'></a><a href='#L1141'>1141</a>
1207
+ <a name='L1142'></a><a href='#L1142'>1142</a>
1208
+ <a name='L1143'></a><a href='#L1143'>1143</a>
1209
+ <a name='L1144'></a><a href='#L1144'>1144</a>
1210
+ <a name='L1145'></a><a href='#L1145'>1145</a>
1211
+ <a name='L1146'></a><a href='#L1146'>1146</a>
1212
+ <a name='L1147'></a><a href='#L1147'>1147</a>
1213
+ <a name='L1148'></a><a href='#L1148'>1148</a>
1214
+ <a name='L1149'></a><a href='#L1149'>1149</a>
1215
+ <a name='L1150'></a><a href='#L1150'>1150</a>
1216
+ <a name='L1151'></a><a href='#L1151'>1151</a>
1217
+ <a name='L1152'></a><a href='#L1152'>1152</a>
1218
+ <a name='L1153'></a><a href='#L1153'>1153</a>
1219
+ <a name='L1154'></a><a href='#L1154'>1154</a>
1220
+ <a name='L1155'></a><a href='#L1155'>1155</a>
1221
+ <a name='L1156'></a><a href='#L1156'>1156</a>
1222
+ <a name='L1157'></a><a href='#L1157'>1157</a>
1223
+ <a name='L1158'></a><a href='#L1158'>1158</a>
1224
+ <a name='L1159'></a><a href='#L1159'>1159</a>
1225
+ <a name='L1160'></a><a href='#L1160'>1160</a>
1226
+ <a name='L1161'></a><a href='#L1161'>1161</a>
1227
+ <a name='L1162'></a><a href='#L1162'>1162</a>
1228
+ <a name='L1163'></a><a href='#L1163'>1163</a>
1229
+ <a name='L1164'></a><a href='#L1164'>1164</a>
1230
+ <a name='L1165'></a><a href='#L1165'>1165</a>
1231
+ <a name='L1166'></a><a href='#L1166'>1166</a>
1232
+ <a name='L1167'></a><a href='#L1167'>1167</a>
1233
+ <a name='L1168'></a><a href='#L1168'>1168</a>
1234
+ <a name='L1169'></a><a href='#L1169'>1169</a>
1235
+ <a name='L1170'></a><a href='#L1170'>1170</a>
1236
+ <a name='L1171'></a><a href='#L1171'>1171</a>
1237
+ <a name='L1172'></a><a href='#L1172'>1172</a>
1238
+ <a name='L1173'></a><a href='#L1173'>1173</a>
1239
+ <a name='L1174'></a><a href='#L1174'>1174</a>
1240
+ <a name='L1175'></a><a href='#L1175'>1175</a>
1241
+ <a name='L1176'></a><a href='#L1176'>1176</a>
1242
+ <a name='L1177'></a><a href='#L1177'>1177</a>
1243
+ <a name='L1178'></a><a href='#L1178'>1178</a>
1244
+ <a name='L1179'></a><a href='#L1179'>1179</a>
1245
+ <a name='L1180'></a><a href='#L1180'>1180</a>
1246
+ <a name='L1181'></a><a href='#L1181'>1181</a>
1247
+ <a name='L1182'></a><a href='#L1182'>1182</a>
1248
+ <a name='L1183'></a><a href='#L1183'>1183</a>
1249
+ <a name='L1184'></a><a href='#L1184'>1184</a>
1250
+ <a name='L1185'></a><a href='#L1185'>1185</a>
1251
+ <a name='L1186'></a><a href='#L1186'>1186</a>
1252
+ <a name='L1187'></a><a href='#L1187'>1187</a>
1253
+ <a name='L1188'></a><a href='#L1188'>1188</a>
1254
+ <a name='L1189'></a><a href='#L1189'>1189</a>
1255
+ <a name='L1190'></a><a href='#L1190'>1190</a>
1256
+ <a name='L1191'></a><a href='#L1191'>1191</a>
1257
+ <a name='L1192'></a><a href='#L1192'>1192</a>
1258
+ <a name='L1193'></a><a href='#L1193'>1193</a>
1259
+ <a name='L1194'></a><a href='#L1194'>1194</a>
1260
+ <a name='L1195'></a><a href='#L1195'>1195</a>
1261
+ <a name='L1196'></a><a href='#L1196'>1196</a>
1262
+ <a name='L1197'></a><a href='#L1197'>1197</a>
1263
+ <a name='L1198'></a><a href='#L1198'>1198</a>
1264
+ <a name='L1199'></a><a href='#L1199'>1199</a>
1265
+ <a name='L1200'></a><a href='#L1200'>1200</a>
1266
+ <a name='L1201'></a><a href='#L1201'>1201</a>
1267
+ <a name='L1202'></a><a href='#L1202'>1202</a>
1268
+ <a name='L1203'></a><a href='#L1203'>1203</a>
1269
+ <a name='L1204'></a><a href='#L1204'>1204</a>
1270
+ <a name='L1205'></a><a href='#L1205'>1205</a>
1271
+ <a name='L1206'></a><a href='#L1206'>1206</a>
1272
+ <a name='L1207'></a><a href='#L1207'>1207</a>
1273
+ <a name='L1208'></a><a href='#L1208'>1208</a>
1274
+ <a name='L1209'></a><a href='#L1209'>1209</a>
1275
+ <a name='L1210'></a><a href='#L1210'>1210</a>
1276
+ <a name='L1211'></a><a href='#L1211'>1211</a>
1277
+ <a name='L1212'></a><a href='#L1212'>1212</a>
1278
+ <a name='L1213'></a><a href='#L1213'>1213</a>
1279
+ <a name='L1214'></a><a href='#L1214'>1214</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">86x</span>
1280
+ <span class="cline-any cline-yes">86x</span>
1281
+ <span class="cline-any cline-yes">86x</span>
1282
+ <span class="cline-any cline-yes">86x</span>
1283
+ <span class="cline-any cline-yes">86x</span>
1284
+ <span class="cline-any cline-yes">86x</span>
1285
+ <span class="cline-any cline-yes">86x</span>
1286
+ <span class="cline-any cline-yes">86x</span>
1287
+ <span class="cline-any cline-yes">86x</span>
1288
+ <span class="cline-any cline-yes">86x</span>
1289
+ <span class="cline-any cline-yes">86x</span>
1290
+ <span class="cline-any cline-yes">86x</span>
1291
+ <span class="cline-any cline-yes">86x</span>
1292
+ <span class="cline-any cline-yes">86x</span>
1293
+ <span class="cline-any cline-yes">86x</span>
1294
+ <span class="cline-any cline-yes">86x</span>
1295
+ <span class="cline-any cline-yes">86x</span>
1296
+ <span class="cline-any cline-yes">86x</span>
1297
+ <span class="cline-any cline-yes">86x</span>
1298
+ <span class="cline-any cline-yes">86x</span>
1299
+ <span class="cline-any cline-yes">78x</span>
1300
+ <span class="cline-any cline-yes">78x</span>
1301
+ <span class="cline-any cline-yes">75x</span>
1302
+ <span class="cline-any cline-yes">75x</span>
1303
+ <span class="cline-any cline-yes">75x</span>
1304
+ <span class="cline-any cline-yes">75x</span>
1305
+ <span class="cline-any cline-yes">75x</span>
1306
+ <span class="cline-any cline-yes">75x</span>
1307
+ <span class="cline-any cline-yes">75x</span>
1308
+ <span class="cline-any cline-no">&nbsp;</span>
1309
+ <span class="cline-any cline-no">&nbsp;</span>
1310
+ <span class="cline-any cline-yes">75x</span>
1311
+ <span class="cline-any cline-no">&nbsp;</span>
1312
+ <span class="cline-any cline-no">&nbsp;</span>
1313
+ <span class="cline-any cline-no">&nbsp;</span>
1314
+ <span class="cline-any cline-yes">75x</span>
1315
+ <span class="cline-any cline-yes">78x</span>
1316
+ <span class="cline-any cline-yes">78x</span>
1317
+ <span class="cline-any cline-yes">86x</span>
1318
+ <span class="cline-any cline-yes">86x</span>
1319
+ <span class="cline-any cline-yes">86x</span>
1320
+ <span class="cline-any cline-yes">86x</span>
1321
+ <span class="cline-any cline-yes">75x</span>
1322
+ <span class="cline-any cline-yes">75x</span>
1323
+ <span class="cline-any cline-yes">75x</span>
1324
+ <span class="cline-any cline-yes">75x</span>
1325
+ <span class="cline-any cline-yes">75x</span>
1326
+ <span class="cline-any cline-no">&nbsp;</span>
1327
+ <span class="cline-any cline-no">&nbsp;</span>
1328
+ <span class="cline-any cline-yes">75x</span>
1329
+ <span class="cline-any cline-yes">75x</span>
1330
+ <span class="cline-any cline-yes">75x</span>
1331
+ <span class="cline-any cline-yes">75x</span>
1332
+ <span class="cline-any cline-yes">75x</span>
1333
+ <span class="cline-any cline-yes">75x</span>
1334
+ <span class="cline-any cline-yes">75x</span>
1335
+ <span class="cline-any cline-yes">86x</span>
1336
+ <span class="cline-any cline-yes">86x</span>
1337
+ <span class="cline-any cline-yes">86x</span>
1338
+ <span class="cline-any cline-yes">86x</span>
1339
+ <span class="cline-any cline-yes">86x</span>
1340
+ <span class="cline-any cline-yes">86x</span>
1341
+ <span class="cline-any cline-yes">86x</span>
1342
+ <span class="cline-any cline-yes">86x</span>
1343
+ <span class="cline-any cline-yes">86x</span>
1344
+ <span class="cline-any cline-yes">86x</span>
1345
+ <span class="cline-any cline-yes">86x</span>
1346
+ <span class="cline-any cline-yes">86x</span>
1347
+ <span class="cline-any cline-yes">86x</span>
1348
+ <span class="cline-any cline-yes">86x</span>
1349
+ <span class="cline-any cline-yes">115x</span>
1350
+ <span class="cline-any cline-yes">115x</span>
1351
+ <span class="cline-any cline-yes">115x</span>
1352
+ <span class="cline-any cline-yes">1x</span>
1353
+ <span class="cline-any cline-yes">1x</span>
1354
+ <span class="cline-any cline-yes">114x</span>
1355
+ <span class="cline-any cline-yes">115x</span>
1356
+ <span class="cline-any cline-yes">86x</span>
1357
+ <span class="cline-any cline-yes">115x</span>
1358
+ <span class="cline-any cline-yes">115x</span>
1359
+ <span class="cline-any cline-yes">115x</span>
1360
+ <span class="cline-any cline-no">&nbsp;</span>
1361
+ <span class="cline-any cline-no">&nbsp;</span>
1362
+ <span class="cline-any cline-yes">115x</span>
1363
+ <span class="cline-any cline-yes">115x</span>
1364
+ <span class="cline-any cline-yes">86x</span>
1365
+ <span class="cline-any cline-yes">115x</span>
1366
+ <span class="cline-any cline-yes">115x</span>
1367
+ <span class="cline-any cline-yes">115x</span>
1368
+ <span class="cline-any cline-no">&nbsp;</span>
1369
+ <span class="cline-any cline-no">&nbsp;</span>
1370
+ <span class="cline-any cline-yes">115x</span>
1371
+ <span class="cline-any cline-yes">115x</span>
1372
+ <span class="cline-any cline-yes">86x</span>
1373
+ <span class="cline-any cline-yes">93x</span>
1374
+ <span class="cline-any cline-yes">93x</span>
1375
+ <span class="cline-any cline-yes">93x</span>
1376
+ <span class="cline-any cline-yes">93x</span>
1377
+ <span class="cline-any cline-yes">93x</span>
1378
+ <span class="cline-any cline-yes">93x</span>
1379
+ <span class="cline-any cline-yes">93x</span>
1380
+ <span class="cline-any cline-yes">93x</span>
1381
+ <span class="cline-any cline-yes">93x</span>
1382
+ <span class="cline-any cline-yes">86x</span>
1383
+ <span class="cline-any cline-yes">86x</span>
1384
+ <span class="cline-any cline-yes">86x</span>
1385
+ <span class="cline-any cline-yes">86x</span>
1386
+ <span class="cline-any cline-yes">86x</span>
1387
+ <span class="cline-any cline-yes">86x</span>
1388
+ <span class="cline-any cline-yes">86x</span>
1389
+ <span class="cline-any cline-yes">12x</span>
1390
+ <span class="cline-any cline-yes">12x</span>
1391
+ <span class="cline-any cline-yes">6x</span>
1392
+ <span class="cline-any cline-yes">6x</span>
1393
+ <span class="cline-any cline-yes">12x</span>
1394
+ <span class="cline-any cline-yes">4x</span>
1395
+ <span class="cline-any cline-yes">12x</span>
1396
+ <span class="cline-any cline-yes">86x</span>
1397
+ <span class="cline-any cline-yes">2175x</span>
1398
+ <span class="cline-any cline-yes">2175x</span>
1399
+ <span class="cline-any cline-yes">2175x</span>
1400
+ <span class="cline-any cline-yes">2175x</span>
1401
+ <span class="cline-any cline-yes">2175x</span>
1402
+ <span class="cline-any cline-yes">2175x</span>
1403
+ <span class="cline-any cline-yes">2175x</span>
1404
+ <span class="cline-any cline-yes">2175x</span>
1405
+ <span class="cline-any cline-yes">2120x</span>
1406
+ <span class="cline-any cline-yes">2120x</span>
1407
+ <span class="cline-any cline-yes">2120x</span>
1408
+ <span class="cline-any cline-yes">2120x</span>
1409
+ <span class="cline-any cline-yes">2120x</span>
1410
+ <span class="cline-any cline-yes">2120x</span>
1411
+ <span class="cline-any cline-yes">2120x</span>
1412
+ <span class="cline-any cline-yes">2175x</span>
1413
+ <span class="cline-any cline-yes">2175x</span>
1414
+ <span class="cline-any cline-yes">2175x</span>
1415
+ <span class="cline-any cline-yes">2175x</span>
1416
+ <span class="cline-any cline-yes">2175x</span>
1417
+ <span class="cline-any cline-yes">2175x</span>
1418
+ <span class="cline-any cline-yes">2175x</span>
1419
+ <span class="cline-any cline-yes">2175x</span>
1420
+ <span class="cline-any cline-yes">4x</span>
1421
+ <span class="cline-any cline-yes">4x</span>
1422
+ <span class="cline-any cline-yes">2175x</span>
1423
+ <span class="cline-any cline-yes">1x</span>
1424
+ <span class="cline-any cline-yes">1x</span>
1425
+ <span class="cline-any cline-yes">2175x</span>
1426
+ <span class="cline-any cline-no">&nbsp;</span>
1427
+ <span class="cline-any cline-no">&nbsp;</span>
1428
+ <span class="cline-any cline-yes">2170x</span>
1429
+ <span class="cline-any cline-yes">2170x</span>
1430
+ <span class="cline-any cline-yes">2170x</span>
1431
+ <span class="cline-any cline-yes">2170x</span>
1432
+ <span class="cline-any cline-yes">2170x</span>
1433
+ <span class="cline-any cline-yes">2170x</span>
1434
+ <span class="cline-any cline-yes">2170x</span>
1435
+ <span class="cline-any cline-yes">2175x</span>
1436
+ <span class="cline-any cline-yes">52x</span>
1437
+ <span class="cline-any cline-yes">52x</span>
1438
+ <span class="cline-any cline-yes">52x</span>
1439
+ <span class="cline-any cline-yes">52052x</span>
1440
+ <span class="cline-any cline-yes">52052x</span>
1441
+ <span class="cline-any cline-yes">52052x</span>
1442
+ <span class="cline-any cline-yes">52052x</span>
1443
+ <span class="cline-any cline-yes">52052x</span>
1444
+ <span class="cline-any cline-yes">52052x</span>
1445
+ <span class="cline-any cline-yes">52052x</span>
1446
+ <span class="cline-any cline-yes">1000x</span>
1447
+ <span class="cline-any cline-yes">1000x</span>
1448
+ <span class="cline-any cline-yes">1000x</span>
1449
+ <span class="cline-any cline-yes">52052x</span>
1450
+ <span class="cline-any cline-yes">52x</span>
1451
+ <span class="cline-any cline-yes">52x</span>
1452
+ <span class="cline-any cline-yes">51x</span>
1453
+ <span class="cline-any cline-yes">51x</span>
1454
+ <span class="cline-any cline-yes">51x</span>
1455
+ <span class="cline-any cline-yes">102x</span>
1456
+ <span class="cline-any cline-yes">51x</span>
1457
+ <span class="cline-any cline-yes">51x</span>
1458
+ <span class="cline-any cline-yes">51x</span>
1459
+ <span class="cline-any cline-yes">51x</span>
1460
+ <span class="cline-any cline-yes">52x</span>
1461
+ <span class="cline-any cline-yes">2170x</span>
1462
+ <span class="cline-any cline-yes">2170x</span>
1463
+ <span class="cline-any cline-yes">2175x</span>
1464
+ <span class="cline-any cline-yes">86x</span>
1465
+ <span class="cline-any cline-yes">86x</span>
1466
+ <span class="cline-any cline-yes">86x</span>
1467
+ <span class="cline-any cline-yes">86x</span>
1468
+ <span class="cline-any cline-yes">86x</span>
1469
+ <span class="cline-any cline-yes">86x</span>
1470
+ <span class="cline-any cline-yes">86x</span>
1471
+ <span class="cline-any cline-yes">86x</span>
1472
+ <span class="cline-any cline-yes">86x</span>
1473
+ <span class="cline-any cline-yes">86x</span>
1474
+ <span class="cline-any cline-yes">86x</span>
1475
+ <span class="cline-any cline-yes">86x</span>
1476
+ <span class="cline-any cline-yes">86x</span>
1477
+ <span class="cline-any cline-yes">86x</span>
1478
+ <span class="cline-any cline-yes">75x</span>
1479
+ <span class="cline-any cline-yes">75x</span>
1480
+ <span class="cline-any cline-yes">75x</span>
1481
+ <span class="cline-any cline-yes">75x</span>
1482
+ <span class="cline-any cline-yes">75x</span>
1483
+ <span class="cline-any cline-yes">75x</span>
1484
+ <span class="cline-any cline-yes">75x</span>
1485
+ <span class="cline-any cline-yes">75x</span>
1486
+ <span class="cline-any cline-yes">75x</span>
1487
+ <span class="cline-any cline-yes">75x</span>
1488
+ <span class="cline-any cline-yes">75x</span>
1489
+ <span class="cline-any cline-yes">75x</span>
1490
+ <span class="cline-any cline-yes">75x</span>
1491
+ <span class="cline-any cline-yes">75x</span>
1492
+ <span class="cline-any cline-yes">75x</span>
1493
+ <span class="cline-any cline-yes">75x</span>
1494
+ <span class="cline-any cline-yes">75x</span>
1495
+ <span class="cline-any cline-yes">75x</span>
1496
+ <span class="cline-any cline-yes">75x</span>
1497
+ <span class="cline-any cline-yes">75x</span>
1498
+ <span class="cline-any cline-yes">75x</span>
1499
+ <span class="cline-any cline-yes">75x</span>
1500
+ <span class="cline-any cline-yes">75x</span>
1501
+ <span class="cline-any cline-yes">75x</span>
1502
+ <span class="cline-any cline-yes">75x</span>
1503
+ <span class="cline-any cline-yes">75x</span>
1504
+ <span class="cline-any cline-yes">1x</span>
1505
+ <span class="cline-any cline-yes">1x</span>
1506
+ <span class="cline-any cline-yes">1x</span>
1507
+ <span class="cline-any cline-yes">1x</span>
1508
+ <span class="cline-any cline-yes">75x</span>
1509
+ <span class="cline-any cline-yes">75x</span>
1510
+ <span class="cline-any cline-yes">75x</span>
1511
+ <span class="cline-any cline-yes">75x</span>
1512
+ <span class="cline-any cline-yes">109x</span>
1513
+ <span class="cline-any cline-yes">109x</span>
1514
+ <span class="cline-any cline-yes">109x</span>
1515
+ <span class="cline-any cline-yes">109x</span>
1516
+ <span class="cline-any cline-yes">2x</span>
1517
+ <span class="cline-any cline-yes">2x</span>
1518
+ <span class="cline-any cline-yes">2x</span>
1519
+ <span class="cline-any cline-yes">2x</span>
1520
+ <span class="cline-any cline-yes">2x</span>
1521
+ <span class="cline-any cline-yes">2x</span>
1522
+ <span class="cline-any cline-yes">2x</span>
1523
+ <span class="cline-any cline-yes">2x</span>
1524
+ <span class="cline-any cline-yes">2x</span>
1525
+ <span class="cline-any cline-yes">2x</span>
1526
+ <span class="cline-any cline-yes">2x</span>
1527
+ <span class="cline-any cline-yes">2x</span>
1528
+ <span class="cline-any cline-yes">107x</span>
1529
+ <span class="cline-any cline-yes">107x</span>
1530
+ <span class="cline-any cline-yes">107x</span>
1531
+ <span class="cline-any cline-yes">109x</span>
1532
+ <span class="cline-any cline-yes">6x</span>
1533
+ <span class="cline-any cline-yes">6x</span>
1534
+ <span class="cline-any cline-yes">6x</span>
1535
+ <span class="cline-any cline-yes">6x</span>
1536
+ <span class="cline-any cline-yes">6x</span>
1537
+ <span class="cline-any cline-yes">6x</span>
1538
+ <span class="cline-any cline-yes">6x</span>
1539
+ <span class="cline-any cline-yes">6x</span>
1540
+ <span class="cline-any cline-yes">6x</span>
1541
+ <span class="cline-any cline-yes">6x</span>
1542
+ <span class="cline-any cline-yes">6x</span>
1543
+ <span class="cline-any cline-yes">6x</span>
1544
+ <span class="cline-any cline-yes">101x</span>
1545
+ <span class="cline-any cline-yes">101x</span>
1546
+ <span class="cline-any cline-yes">109x</span>
1547
+ <span class="cline-any cline-yes">2x</span>
1548
+ <span class="cline-any cline-yes">2x</span>
1549
+ <span class="cline-any cline-yes">2x</span>
1550
+ <span class="cline-any cline-yes">2x</span>
1551
+ <span class="cline-any cline-yes">2x</span>
1552
+ <span class="cline-any cline-yes">2x</span>
1553
+ <span class="cline-any cline-yes">2x</span>
1554
+ <span class="cline-any cline-yes">2x</span>
1555
+ <span class="cline-any cline-yes">2x</span>
1556
+ <span class="cline-any cline-yes">2x</span>
1557
+ <span class="cline-any cline-yes">2x</span>
1558
+ <span class="cline-any cline-yes">2x</span>
1559
+ <span class="cline-any cline-yes">2x</span>
1560
+ <span class="cline-any cline-yes">2x</span>
1561
+ <span class="cline-any cline-yes">2x</span>
1562
+ <span class="cline-any cline-yes">99x</span>
1563
+ <span class="cline-any cline-yes">99x</span>
1564
+ <span class="cline-any cline-yes">109x</span>
1565
+ <span class="cline-any cline-yes">5x</span>
1566
+ <span class="cline-any cline-yes">5x</span>
1567
+ <span class="cline-any cline-yes">5x</span>
1568
+ <span class="cline-any cline-yes">94x</span>
1569
+ <span class="cline-any cline-yes">94x</span>
1570
+ <span class="cline-any cline-yes">94x</span>
1571
+ <span class="cline-any cline-yes">94x</span>
1572
+ <span class="cline-any cline-yes">94x</span>
1573
+ <span class="cline-any cline-yes">94x</span>
1574
+ <span class="cline-any cline-yes">109x</span>
1575
+ <span class="cline-any cline-yes">75x</span>
1576
+ <span class="cline-any cline-yes">75x</span>
1577
+ <span class="cline-any cline-yes">75x</span>
1578
+ <span class="cline-any cline-yes">104x</span>
1579
+ <span class="cline-any cline-yes">104x</span>
1580
+ <span class="cline-any cline-yes">104x</span>
1581
+ <span class="cline-any cline-yes">104x</span>
1582
+ <span class="cline-any cline-yes">104x</span>
1583
+ <span class="cline-any cline-yes">104x</span>
1584
+ <span class="cline-any cline-yes">10x</span>
1585
+ <span class="cline-any cline-yes">104x</span>
1586
+ <span class="cline-any cline-yes">2x</span>
1587
+ <span class="cline-any cline-yes">2x</span>
1588
+ <span class="cline-any cline-yes">2x</span>
1589
+ <span class="cline-any cline-yes">2x</span>
1590
+ <span class="cline-any cline-yes">8x</span>
1591
+ <span class="cline-any cline-yes">8x</span>
1592
+ <span class="cline-any cline-yes">8x</span>
1593
+ <span class="cline-any cline-yes">104x</span>
1594
+ <span class="cline-any cline-yes">1x</span>
1595
+ <span class="cline-any cline-yes">1x</span>
1596
+ <span class="cline-any cline-yes">1x</span>
1597
+ <span class="cline-any cline-yes">1x</span>
1598
+ <span class="cline-any cline-yes">7x</span>
1599
+ <span class="cline-any cline-yes">7x</span>
1600
+ <span class="cline-any cline-yes">104x</span>
1601
+ <span class="cline-any cline-yes">104x</span>
1602
+ <span class="cline-any cline-yes">1x</span>
1603
+ <span class="cline-any cline-yes">1x</span>
1604
+ <span class="cline-any cline-yes">1x</span>
1605
+ <span class="cline-any cline-yes">1x</span>
1606
+ <span class="cline-any cline-yes">6x</span>
1607
+ <span class="cline-any cline-yes">6x</span>
1608
+ <span class="cline-any cline-yes">6x</span>
1609
+ <span class="cline-any cline-yes">6x</span>
1610
+ <span class="cline-any cline-yes">104x</span>
1611
+ <span class="cline-any cline-yes">4x</span>
1612
+ <span class="cline-any cline-yes">4x</span>
1613
+ <span class="cline-any cline-yes">4x</span>
1614
+ <span class="cline-any cline-yes">1x</span>
1615
+ <span class="cline-any cline-yes">1x</span>
1616
+ <span class="cline-any cline-yes">104x</span>
1617
+ <span class="cline-any cline-yes">2x</span>
1618
+ <span class="cline-any cline-yes">2x</span>
1619
+ <span class="cline-any cline-yes">2x</span>
1620
+ <span class="cline-any cline-yes">104x</span>
1621
+ <span class="cline-any cline-no">&nbsp;</span>
1622
+ <span class="cline-any cline-no">&nbsp;</span>
1623
+ <span class="cline-any cline-no">&nbsp;</span>
1624
+ <span class="cline-any cline-yes">6x</span>
1625
+ <span class="cline-any cline-yes">104x</span>
1626
+ <span class="cline-any cline-yes">75x</span>
1627
+ <span class="cline-any cline-yes">75x</span>
1628
+ <span class="cline-any cline-yes">75x</span>
1629
+ <span class="cline-any cline-yes">13x</span>
1630
+ <span class="cline-any cline-yes">13x</span>
1631
+ <span class="cline-any cline-yes">2x</span>
1632
+ <span class="cline-any cline-yes">2x</span>
1633
+ <span class="cline-any cline-yes">11x</span>
1634
+ <span class="cline-any cline-yes">11x</span>
1635
+ <span class="cline-any cline-yes">11x</span>
1636
+ <span class="cline-any cline-yes">13x</span>
1637
+ <span class="cline-any cline-yes">16x</span>
1638
+ <span class="cline-any cline-yes">12x</span>
1639
+ <span class="cline-any cline-yes">16x</span>
1640
+ <span class="cline-any cline-yes">4x</span>
1641
+ <span class="cline-any cline-yes">4x</span>
1642
+ <span class="cline-any cline-yes">16x</span>
1643
+ <span class="cline-any cline-yes">11x</span>
1644
+ <span class="cline-any cline-yes">11x</span>
1645
+ <span class="cline-any cline-yes">13x</span>
1646
+ <span class="cline-any cline-yes">1x</span>
1647
+ <span class="cline-any cline-yes">1x</span>
1648
+ <span class="cline-any cline-yes">10x</span>
1649
+ <span class="cline-any cline-yes">13x</span>
1650
+ <span class="cline-any cline-yes">13x</span>
1651
+ <span class="cline-any cline-yes">13x</span>
1652
+ <span class="cline-any cline-yes">13x</span>
1653
+ <span class="cline-any cline-yes">13x</span>
1654
+ <span class="cline-any cline-yes">13x</span>
1655
+ <span class="cline-any cline-yes">13x</span>
1656
+ <span class="cline-any cline-yes">13x</span>
1657
+ <span class="cline-any cline-yes">13x</span>
1658
+ <span class="cline-any cline-yes">13x</span>
1659
+ <span class="cline-any cline-yes">13x</span>
1660
+ <span class="cline-any cline-yes">13x</span>
1661
+ <span class="cline-any cline-yes">13x</span>
1662
+ <span class="cline-any cline-yes">13x</span>
1663
+ <span class="cline-any cline-yes">13x</span>
1664
+ <span class="cline-any cline-yes">13x</span>
1665
+ <span class="cline-any cline-yes">13x</span>
1666
+ <span class="cline-any cline-yes">75x</span>
1667
+ <span class="cline-any cline-yes">75x</span>
1668
+ <span class="cline-any cline-yes">10x</span>
1669
+ <span class="cline-any cline-yes">10x</span>
1670
+ <span class="cline-any cline-yes">10x</span>
1671
+ <span class="cline-any cline-yes">10x</span>
1672
+ <span class="cline-any cline-yes">10x</span>
1673
+ <span class="cline-any cline-yes">10x</span>
1674
+ <span class="cline-any cline-yes">10x</span>
1675
+ <span class="cline-any cline-yes">10x</span>
1676
+ <span class="cline-any cline-yes">10x</span>
1677
+ <span class="cline-any cline-yes">10x</span>
1678
+ <span class="cline-any cline-yes">10x</span>
1679
+ <span class="cline-any cline-yes">10x</span>
1680
+ <span class="cline-any cline-yes">10x</span>
1681
+ <span class="cline-any cline-yes">10x</span>
1682
+ <span class="cline-any cline-yes">10x</span>
1683
+ <span class="cline-any cline-yes">10x</span>
1684
+ <span class="cline-any cline-yes">10x</span>
1685
+ <span class="cline-any cline-yes">10x</span>
1686
+ <span class="cline-any cline-yes">10x</span>
1687
+ <span class="cline-any cline-yes">10x</span>
1688
+ <span class="cline-any cline-yes">10x</span>
1689
+ <span class="cline-any cline-yes">10x</span>
1690
+ <span class="cline-any cline-yes">10x</span>
1691
+ <span class="cline-any cline-yes">10x</span>
1692
+ <span class="cline-any cline-yes">10x</span>
1693
+ <span class="cline-any cline-yes">75x</span>
1694
+ <span class="cline-any cline-yes">75x</span>
1695
+ <span class="cline-any cline-yes">75x</span>
1696
+ <span class="cline-any cline-yes">75x</span>
1697
+ <span class="cline-any cline-yes">75x</span>
1698
+ <span class="cline-any cline-yes">75x</span>
1699
+ <span class="cline-any cline-yes">3x</span>
1700
+ <span class="cline-any cline-yes">3x</span>
1701
+ <span class="cline-any cline-yes">3x</span>
1702
+ <span class="cline-any cline-yes">3x</span>
1703
+ <span class="cline-any cline-yes">3x</span>
1704
+ <span class="cline-any cline-yes">3x</span>
1705
+ <span class="cline-any cline-yes">3x</span>
1706
+ <span class="cline-any cline-yes">3x</span>
1707
+ <span class="cline-any cline-yes">3x</span>
1708
+ <span class="cline-any cline-yes">3x</span>
1709
+ <span class="cline-any cline-yes">1x</span>
1710
+ <span class="cline-any cline-yes">1x</span>
1711
+ <span class="cline-any cline-yes">3x</span>
1712
+ <span class="cline-any cline-yes">75x</span>
1713
+ <span class="cline-any cline-yes">75x</span>
1714
+ <span class="cline-any cline-yes">75x</span>
1715
+ <span class="cline-any cline-yes">75x</span>
1716
+ <span class="cline-any cline-yes">75x</span>
1717
+ <span class="cline-any cline-yes">75x</span>
1718
+ <span class="cline-any cline-yes">75x</span>
1719
+ <span class="cline-any cline-no">&nbsp;</span>
1720
+ <span class="cline-any cline-no">&nbsp;</span>
1721
+ <span class="cline-any cline-no">&nbsp;</span>
1722
+ <span class="cline-any cline-no">&nbsp;</span>
1723
+ <span class="cline-any cline-no">&nbsp;</span>
1724
+ <span class="cline-any cline-no">&nbsp;</span>
1725
+ <span class="cline-any cline-no">&nbsp;</span>
1726
+ <span class="cline-any cline-no">&nbsp;</span>
1727
+ <span class="cline-any cline-no">&nbsp;</span>
1728
+ <span class="cline-any cline-no">&nbsp;</span>
1729
+ <span class="cline-any cline-no">&nbsp;</span>
1730
+ <span class="cline-any cline-no">&nbsp;</span>
1731
+ <span class="cline-any cline-no">&nbsp;</span>
1732
+ <span class="cline-any cline-no">&nbsp;</span>
1733
+ <span class="cline-any cline-no">&nbsp;</span>
1734
+ <span class="cline-any cline-no">&nbsp;</span>
1735
+ <span class="cline-any cline-no">&nbsp;</span>
1736
+ <span class="cline-any cline-yes">75x</span>
1737
+ <span class="cline-any cline-yes">75x</span>
1738
+ <span class="cline-any cline-yes">75x</span>
1739
+ <span class="cline-any cline-yes">75x</span>
1740
+ <span class="cline-any cline-yes">75x</span>
1741
+ <span class="cline-any cline-yes">75x</span>
1742
+ <span class="cline-any cline-yes">75x</span>
1743
+ <span class="cline-any cline-yes">1x</span>
1744
+ <span class="cline-any cline-yes">75x</span>
1745
+ <span class="cline-any cline-yes">75x</span>
1746
+ <span class="cline-any cline-yes">75x</span>
1747
+ <span class="cline-any cline-yes">75x</span>
1748
+ <span class="cline-any cline-yes">75x</span>
1749
+ <span class="cline-any cline-yes">75x</span>
1750
+ <span class="cline-any cline-yes">75x</span>
1751
+ <span class="cline-any cline-yes">75x</span>
1752
+ <span class="cline-any cline-yes">75x</span>
1753
+ <span class="cline-any cline-yes">16x</span>
1754
+ <span class="cline-any cline-yes">16x</span>
1755
+ <span class="cline-any cline-yes">16x</span>
1756
+ <span class="cline-any cline-yes">16x</span>
1757
+ <span class="cline-any cline-yes">16x</span>
1758
+ <span class="cline-any cline-yes">16x</span>
1759
+ <span class="cline-any cline-yes">16x</span>
1760
+ <span class="cline-any cline-yes">16x</span>
1761
+ <span class="cline-any cline-yes">16x</span>
1762
+ <span class="cline-any cline-yes">16x</span>
1763
+ <span class="cline-any cline-yes">16x</span>
1764
+ <span class="cline-any cline-yes">16x</span>
1765
+ <span class="cline-any cline-yes">16x</span>
1766
+ <span class="cline-any cline-yes">16x</span>
1767
+ <span class="cline-any cline-yes">16x</span>
1768
+ <span class="cline-any cline-yes">16x</span>
1769
+ <span class="cline-any cline-yes">16x</span>
1770
+ <span class="cline-any cline-yes">16x</span>
1771
+ <span class="cline-any cline-yes">16x</span>
1772
+ <span class="cline-any cline-no">&nbsp;</span>
1773
+ <span class="cline-any cline-no">&nbsp;</span>
1774
+ <span class="cline-any cline-no">&nbsp;</span>
1775
+ <span class="cline-any cline-no">&nbsp;</span>
1776
+ <span class="cline-any cline-yes">16x</span>
1777
+ <span class="cline-any cline-yes">16x</span>
1778
+ <span class="cline-any cline-yes">16x</span>
1779
+ <span class="cline-any cline-yes">16x</span>
1780
+ <span class="cline-any cline-yes">13x</span>
1781
+ <span class="cline-any cline-yes">13x</span>
1782
+ <span class="cline-any cline-yes">13x</span>
1783
+ <span class="cline-any cline-yes">13x</span>
1784
+ <span class="cline-any cline-yes">16x</span>
1785
+ <span class="cline-any cline-yes">3x</span>
1786
+ <span class="cline-any cline-yes">3x</span>
1787
+ <span class="cline-any cline-yes">3x</span>
1788
+ <span class="cline-any cline-yes">3x</span>
1789
+ <span class="cline-any cline-yes">3x</span>
1790
+ <span class="cline-any cline-yes">3x</span>
1791
+ <span class="cline-any cline-yes">3x</span>
1792
+ <span class="cline-any cline-yes">3x</span>
1793
+ <span class="cline-any cline-yes">3x</span>
1794
+ <span class="cline-any cline-yes">3x</span>
1795
+ <span class="cline-any cline-yes">3x</span>
1796
+ <span class="cline-any cline-yes">10x</span>
1797
+ <span class="cline-any cline-yes">16x</span>
1798
+ <span class="cline-any cline-yes">1x</span>
1799
+ <span class="cline-any cline-yes">1x</span>
1800
+ <span class="cline-any cline-yes">1x</span>
1801
+ <span class="cline-any cline-yes">1x</span>
1802
+ <span class="cline-any cline-yes">1x</span>
1803
+ <span class="cline-any cline-yes">10x</span>
1804
+ <span class="cline-any cline-yes">10x</span>
1805
+ <span class="cline-any cline-yes">16x</span>
1806
+ <span class="cline-any cline-no">&nbsp;</span>
1807
+ <span class="cline-any cline-no">&nbsp;</span>
1808
+ <span class="cline-any cline-no">&nbsp;</span>
1809
+ <span class="cline-any cline-no">&nbsp;</span>
1810
+ <span class="cline-any cline-no">&nbsp;</span>
1811
+ <span class="cline-any cline-no">&nbsp;</span>
1812
+ <span class="cline-any cline-no">&nbsp;</span>
1813
+ <span class="cline-any cline-no">&nbsp;</span>
1814
+ <span class="cline-any cline-no">&nbsp;</span>
1815
+ <span class="cline-any cline-no">&nbsp;</span>
1816
+ <span class="cline-any cline-no">&nbsp;</span>
1817
+ <span class="cline-any cline-no">&nbsp;</span>
1818
+ <span class="cline-any cline-yes">10x</span>
1819
+ <span class="cline-any cline-yes">10x</span>
1820
+ <span class="cline-any cline-yes">10x</span>
1821
+ <span class="cline-any cline-yes">10x</span>
1822
+ <span class="cline-any cline-yes">10x</span>
1823
+ <span class="cline-any cline-yes">16x</span>
1824
+ <span class="cline-any cline-yes">16x</span>
1825
+ <span class="cline-any cline-yes">16x</span>
1826
+ <span class="cline-any cline-yes">16x</span>
1827
+ <span class="cline-any cline-yes">16x</span>
1828
+ <span class="cline-any cline-yes">16x</span>
1829
+ <span class="cline-any cline-yes">16x</span>
1830
+ <span class="cline-any cline-yes">16x</span>
1831
+ <span class="cline-any cline-yes">16x</span>
1832
+ <span class="cline-any cline-yes">16x</span>
1833
+ <span class="cline-any cline-yes">16x</span>
1834
+ <span class="cline-any cline-yes">16x</span>
1835
+ <span class="cline-any cline-yes">16x</span>
1836
+ <span class="cline-any cline-yes">16x</span>
1837
+ <span class="cline-any cline-yes">16x</span>
1838
+ <span class="cline-any cline-yes">16x</span>
1839
+ <span class="cline-any cline-yes">16x</span>
1840
+ <span class="cline-any cline-yes">16x</span>
1841
+ <span class="cline-any cline-yes">16x</span>
1842
+ <span class="cline-any cline-yes">16x</span>
1843
+ <span class="cline-any cline-yes">16x</span>
1844
+ <span class="cline-any cline-yes">16x</span>
1845
+ <span class="cline-any cline-yes">16x</span>
1846
+ <span class="cline-any cline-yes">16x</span>
1847
+ <span class="cline-any cline-yes">16x</span>
1848
+ <span class="cline-any cline-yes">16x</span>
1849
+ <span class="cline-any cline-no">&nbsp;</span>
1850
+ <span class="cline-any cline-no">&nbsp;</span>
1851
+ <span class="cline-any cline-yes">10x</span>
1852
+ <span class="cline-any cline-yes">10x</span>
1853
+ <span class="cline-any cline-yes">10x</span>
1854
+ <span class="cline-any cline-yes">10x</span>
1855
+ <span class="cline-any cline-yes">10x</span>
1856
+ <span class="cline-any cline-yes">10x</span>
1857
+ <span class="cline-any cline-yes">10x</span>
1858
+ <span class="cline-any cline-yes">10x</span>
1859
+ <span class="cline-any cline-yes">10x</span>
1860
+ <span class="cline-any cline-yes">10x</span>
1861
+ <span class="cline-any cline-yes">10x</span>
1862
+ <span class="cline-any cline-yes">10x</span>
1863
+ <span class="cline-any cline-no">&nbsp;</span>
1864
+ <span class="cline-any cline-no">&nbsp;</span>
1865
+ <span class="cline-any cline-no">&nbsp;</span>
1866
+ <span class="cline-any cline-no">&nbsp;</span>
1867
+ <span class="cline-any cline-no">&nbsp;</span>
1868
+ <span class="cline-any cline-no">&nbsp;</span>
1869
+ <span class="cline-any cline-no">&nbsp;</span>
1870
+ <span class="cline-any cline-no">&nbsp;</span>
1871
+ <span class="cline-any cline-no">&nbsp;</span>
1872
+ <span class="cline-any cline-no">&nbsp;</span>
1873
+ <span class="cline-any cline-yes">10x</span>
1874
+ <span class="cline-any cline-yes">10x</span>
1875
+ <span class="cline-any cline-yes">10x</span>
1876
+ <span class="cline-any cline-yes">10x</span>
1877
+ <span class="cline-any cline-yes">10x</span>
1878
+ <span class="cline-any cline-yes">10x</span>
1879
+ <span class="cline-any cline-yes">10x</span>
1880
+ <span class="cline-any cline-yes">10x</span>
1881
+ <span class="cline-any cline-yes">10x</span>
1882
+ <span class="cline-any cline-yes">10x</span>
1883
+ <span class="cline-any cline-yes">10x</span>
1884
+ <span class="cline-any cline-yes">10x</span>
1885
+ <span class="cline-any cline-yes">10x</span>
1886
+ <span class="cline-any cline-yes">10x</span>
1887
+ <span class="cline-any cline-yes">10x</span>
1888
+ <span class="cline-any cline-yes">10x</span>
1889
+ <span class="cline-any cline-yes">10x</span>
1890
+ <span class="cline-any cline-yes">10x</span>
1891
+ <span class="cline-any cline-no">&nbsp;</span>
1892
+ <span class="cline-any cline-no">&nbsp;</span>
1893
+ <span class="cline-any cline-no">&nbsp;</span>
1894
+ <span class="cline-any cline-no">&nbsp;</span>
1895
+ <span class="cline-any cline-no">&nbsp;</span>
1896
+ <span class="cline-any cline-no">&nbsp;</span>
1897
+ <span class="cline-any cline-no">&nbsp;</span>
1898
+ <span class="cline-any cline-yes">10x</span>
1899
+ <span class="cline-any cline-yes">10x</span>
1900
+ <span class="cline-any cline-yes">10x</span>
1901
+ <span class="cline-any cline-yes">10x</span>
1902
+ <span class="cline-any cline-yes">10x</span>
1903
+ <span class="cline-any cline-yes">10x</span>
1904
+ <span class="cline-any cline-yes">10x</span>
1905
+ <span class="cline-any cline-yes">10x</span>
1906
+ <span class="cline-any cline-yes">10x</span>
1907
+ <span class="cline-any cline-yes">10x</span>
1908
+ <span class="cline-any cline-yes">10x</span>
1909
+ <span class="cline-any cline-yes">10x</span>
1910
+ <span class="cline-any cline-yes">10x</span>
1911
+ <span class="cline-any cline-yes">10x</span>
1912
+ <span class="cline-any cline-no">&nbsp;</span>
1913
+ <span class="cline-any cline-no">&nbsp;</span>
1914
+ <span class="cline-any cline-no">&nbsp;</span>
1915
+ <span class="cline-any cline-no">&nbsp;</span>
1916
+ <span class="cline-any cline-no">&nbsp;</span>
1917
+ <span class="cline-any cline-no">&nbsp;</span>
1918
+ <span class="cline-any cline-no">&nbsp;</span>
1919
+ <span class="cline-any cline-yes">10x</span>
1920
+ <span class="cline-any cline-yes">10x</span>
1921
+ <span class="cline-any cline-yes">10x</span>
1922
+ <span class="cline-any cline-yes">10x</span>
1923
+ <span class="cline-any cline-yes">10x</span>
1924
+ <span class="cline-any cline-yes">10x</span>
1925
+ <span class="cline-any cline-yes">10x</span>
1926
+ <span class="cline-any cline-yes">10x</span>
1927
+ <span class="cline-any cline-yes">10x</span>
1928
+ <span class="cline-any cline-yes">10x</span>
1929
+ <span class="cline-any cline-yes">10x</span>
1930
+ <span class="cline-any cline-yes">10x</span>
1931
+ <span class="cline-any cline-yes">10x</span>
1932
+ <span class="cline-any cline-yes">10x</span>
1933
+ <span class="cline-any cline-no">&nbsp;</span>
1934
+ <span class="cline-any cline-no">&nbsp;</span>
1935
+ <span class="cline-any cline-no">&nbsp;</span>
1936
+ <span class="cline-any cline-no">&nbsp;</span>
1937
+ <span class="cline-any cline-no">&nbsp;</span>
1938
+ <span class="cline-any cline-no">&nbsp;</span>
1939
+ <span class="cline-any cline-yes">10x</span>
1940
+ <span class="cline-any cline-yes">10x</span>
1941
+ <span class="cline-any cline-yes">10x</span>
1942
+ <span class="cline-any cline-yes">10x</span>
1943
+ <span class="cline-any cline-yes">10x</span>
1944
+ <span class="cline-any cline-yes">10x</span>
1945
+ <span class="cline-any cline-yes">10x</span>
1946
+ <span class="cline-any cline-yes">10x</span>
1947
+ <span class="cline-any cline-yes">10x</span>
1948
+ <span class="cline-any cline-yes">10x</span>
1949
+ <span class="cline-any cline-yes">10x</span>
1950
+ <span class="cline-any cline-yes">10x</span>
1951
+ <span class="cline-any cline-yes">10x</span>
1952
+ <span class="cline-any cline-yes">10x</span>
1953
+ <span class="cline-any cline-yes">16x</span>
1954
+ <span class="cline-any cline-yes">16x</span>
1955
+ <span class="cline-any cline-yes">16x</span>
1956
+ <span class="cline-any cline-yes">16x</span>
1957
+ <span class="cline-any cline-yes">16x</span>
1958
+ <span class="cline-any cline-yes">16x</span>
1959
+ <span class="cline-any cline-yes">16x</span>
1960
+ <span class="cline-any cline-no">&nbsp;</span>
1961
+ <span class="cline-any cline-no">&nbsp;</span>
1962
+ <span class="cline-any cline-no">&nbsp;</span>
1963
+ <span class="cline-any cline-no">&nbsp;</span>
1964
+ <span class="cline-any cline-no">&nbsp;</span>
1965
+ <span class="cline-any cline-no">&nbsp;</span>
1966
+ <span class="cline-any cline-no">&nbsp;</span>
1967
+ <span class="cline-any cline-no">&nbsp;</span>
1968
+ <span class="cline-any cline-no">&nbsp;</span>
1969
+ <span class="cline-any cline-no">&nbsp;</span>
1970
+ <span class="cline-any cline-no">&nbsp;</span>
1971
+ <span class="cline-any cline-no">&nbsp;</span>
1972
+ <span class="cline-any cline-no">&nbsp;</span>
1973
+ <span class="cline-any cline-no">&nbsp;</span>
1974
+ <span class="cline-any cline-yes">16x</span>
1975
+ <span class="cline-any cline-yes">75x</span>
1976
+ <span class="cline-any cline-yes">75x</span>
1977
+ <span class="cline-any cline-yes">75x</span>
1978
+ <span class="cline-any cline-yes">75x</span>
1979
+ <span class="cline-any cline-yes">75x</span>
1980
+ <span class="cline-any cline-yes">75x</span>
1981
+ <span class="cline-any cline-yes">75x</span>
1982
+ <span class="cline-any cline-yes">75x</span>
1983
+ <span class="cline-any cline-yes">93x</span>
1984
+ <span class="cline-any cline-yes">93x</span>
1985
+ <span class="cline-any cline-yes">93x</span>
1986
+ <span class="cline-any cline-yes">93x</span>
1987
+ <span class="cline-any cline-yes">93x</span>
1988
+ <span class="cline-any cline-yes">93x</span>
1989
+ <span class="cline-any cline-yes">93x</span>
1990
+ <span class="cline-any cline-yes">93x</span>
1991
+ <span class="cline-any cline-yes">93x</span>
1992
+ <span class="cline-any cline-yes">93x</span>
1993
+ <span class="cline-any cline-yes">93x</span>
1994
+ <span class="cline-any cline-yes">93x</span>
1995
+ <span class="cline-any cline-yes">93x</span>
1996
+ <span class="cline-any cline-yes">93x</span>
1997
+ <span class="cline-any cline-yes">93x</span>
1998
+ <span class="cline-any cline-yes">93x</span>
1999
+ <span class="cline-any cline-yes">93x</span>
2000
+ <span class="cline-any cline-yes">93x</span>
2001
+ <span class="cline-any cline-yes">93x</span>
2002
+ <span class="cline-any cline-yes">93x</span>
2003
+ <span class="cline-any cline-yes">93x</span>
2004
+ <span class="cline-any cline-yes">93x</span>
2005
+ <span class="cline-any cline-yes">93x</span>
2006
+ <span class="cline-any cline-yes">93x</span>
2007
+ <span class="cline-any cline-yes">93x</span>
2008
+ <span class="cline-any cline-yes">81x</span>
2009
+ <span class="cline-any cline-yes">81x</span>
2010
+ <span class="cline-any cline-yes">81x</span>
2011
+ <span class="cline-any cline-yes">81x</span>
2012
+ <span class="cline-any cline-yes">81x</span>
2013
+ <span class="cline-any cline-yes">93x</span>
2014
+ <span class="cline-any cline-yes">2x</span>
2015
+ <span class="cline-any cline-yes">2x</span>
2016
+ <span class="cline-any cline-yes">2x</span>
2017
+ <span class="cline-any cline-yes">2x</span>
2018
+ <span class="cline-any cline-yes">2x</span>
2019
+ <span class="cline-any cline-yes">2x</span>
2020
+ <span class="cline-any cline-yes">2x</span>
2021
+ <span class="cline-any cline-yes">2x</span>
2022
+ <span class="cline-any cline-yes">2x</span>
2023
+ <span class="cline-any cline-yes">2x</span>
2024
+ <span class="cline-any cline-yes">2x</span>
2025
+ <span class="cline-any cline-yes">2x</span>
2026
+ <span class="cline-any cline-yes">79x</span>
2027
+ <span class="cline-any cline-yes">79x</span>
2028
+ <span class="cline-any cline-yes">93x</span>
2029
+ <span class="cline-any cline-yes">4x</span>
2030
+ <span class="cline-any cline-yes">4x</span>
2031
+ <span class="cline-any cline-yes">4x</span>
2032
+ <span class="cline-any cline-yes">4x</span>
2033
+ <span class="cline-any cline-yes">4x</span>
2034
+ <span class="cline-any cline-yes">4x</span>
2035
+ <span class="cline-any cline-yes">4x</span>
2036
+ <span class="cline-any cline-yes">4x</span>
2037
+ <span class="cline-any cline-yes">4x</span>
2038
+ <span class="cline-any cline-yes">4x</span>
2039
+ <span class="cline-any cline-yes">4x</span>
2040
+ <span class="cline-any cline-yes">4x</span>
2041
+ <span class="cline-any cline-yes">4x</span>
2042
+ <span class="cline-any cline-yes">4x</span>
2043
+ <span class="cline-any cline-yes">4x</span>
2044
+ <span class="cline-any cline-yes">4x</span>
2045
+ <span class="cline-any cline-yes">75x</span>
2046
+ <span class="cline-any cline-yes">75x</span>
2047
+ <span class="cline-any cline-yes">93x</span>
2048
+ <span class="cline-any cline-yes">93x</span>
2049
+ <span class="cline-any cline-yes">93x</span>
2050
+ <span class="cline-any cline-yes">93x</span>
2051
+ <span class="cline-any cline-yes">19x</span>
2052
+ <span class="cline-any cline-yes">19x</span>
2053
+ <span class="cline-any cline-yes">19x</span>
2054
+ <span class="cline-any cline-yes">19x</span>
2055
+ <span class="cline-any cline-yes">93x</span>
2056
+ <span class="cline-any cline-yes">93x</span>
2057
+ <span class="cline-any cline-yes">93x</span>
2058
+ <span class="cline-any cline-yes">93x</span>
2059
+ <span class="cline-any cline-yes">93x</span>
2060
+ <span class="cline-any cline-yes">93x</span>
2061
+ <span class="cline-any cline-yes">93x</span>
2062
+ <span class="cline-any cline-yes">93x</span>
2063
+ <span class="cline-any cline-yes">93x</span>
2064
+ <span class="cline-any cline-yes">93x</span>
2065
+ <span class="cline-any cline-yes">93x</span>
2066
+ <span class="cline-any cline-yes">93x</span>
2067
+ <span class="cline-any cline-yes">93x</span>
2068
+ <span class="cline-any cline-yes">93x</span>
2069
+ <span class="cline-any cline-yes">93x</span>
2070
+ <span class="cline-any cline-yes">93x</span>
2071
+ <span class="cline-any cline-yes">93x</span>
2072
+ <span class="cline-any cline-yes">93x</span>
2073
+ <span class="cline-any cline-yes">93x</span>
2074
+ <span class="cline-any cline-yes">93x</span>
2075
+ <span class="cline-any cline-yes">93x</span>
2076
+ <span class="cline-any cline-yes">93x</span>
2077
+ <span class="cline-any cline-yes">93x</span>
2078
+ <span class="cline-any cline-yes">93x</span>
2079
+ <span class="cline-any cline-yes">93x</span>
2080
+ <span class="cline-any cline-yes">93x</span>
2081
+ <span class="cline-any cline-yes">93x</span>
2082
+ <span class="cline-any cline-yes">93x</span>
2083
+ <span class="cline-any cline-no">&nbsp;</span>
2084
+ <span class="cline-any cline-no">&nbsp;</span>
2085
+ <span class="cline-any cline-yes">75x</span>
2086
+ <span class="cline-any cline-yes">75x</span>
2087
+ <span class="cline-any cline-yes">75x</span>
2088
+ <span class="cline-any cline-yes">75x</span>
2089
+ <span class="cline-any cline-yes">75x</span>
2090
+ <span class="cline-any cline-yes">75x</span>
2091
+ <span class="cline-any cline-yes">75x</span>
2092
+ <span class="cline-any cline-yes">75x</span>
2093
+ <span class="cline-any cline-yes">75x</span>
2094
+ <span class="cline-any cline-yes">75x</span>
2095
+ <span class="cline-any cline-yes">75x</span>
2096
+ <span class="cline-any cline-yes">75x</span>
2097
+ <span class="cline-any cline-yes">75x</span>
2098
+ <span class="cline-any cline-no">&nbsp;</span>
2099
+ <span class="cline-any cline-no">&nbsp;</span>
2100
+ <span class="cline-any cline-no">&nbsp;</span>
2101
+ <span class="cline-any cline-no">&nbsp;</span>
2102
+ <span class="cline-any cline-no">&nbsp;</span>
2103
+ <span class="cline-any cline-no">&nbsp;</span>
2104
+ <span class="cline-any cline-no">&nbsp;</span>
2105
+ <span class="cline-any cline-no">&nbsp;</span>
2106
+ <span class="cline-any cline-no">&nbsp;</span>
2107
+ <span class="cline-any cline-no">&nbsp;</span>
2108
+ <span class="cline-any cline-yes">75x</span>
2109
+ <span class="cline-any cline-yes">75x</span>
2110
+ <span class="cline-any cline-yes">75x</span>
2111
+ <span class="cline-any cline-yes">75x</span>
2112
+ <span class="cline-any cline-yes">75x</span>
2113
+ <span class="cline-any cline-yes">75x</span>
2114
+ <span class="cline-any cline-yes">75x</span>
2115
+ <span class="cline-any cline-yes">75x</span>
2116
+ <span class="cline-any cline-yes">75x</span>
2117
+ <span class="cline-any cline-yes">75x</span>
2118
+ <span class="cline-any cline-yes">75x</span>
2119
+ <span class="cline-any cline-yes">75x</span>
2120
+ <span class="cline-any cline-yes">75x</span>
2121
+ <span class="cline-any cline-yes">75x</span>
2122
+ <span class="cline-any cline-yes">75x</span>
2123
+ <span class="cline-any cline-yes">75x</span>
2124
+ <span class="cline-any cline-yes">75x</span>
2125
+ <span class="cline-any cline-yes">75x</span>
2126
+ <span class="cline-any cline-yes">75x</span>
2127
+ <span class="cline-any cline-yes">75x</span>
2128
+ <span class="cline-any cline-yes">75x</span>
2129
+ <span class="cline-any cline-yes">75x</span>
2130
+ <span class="cline-any cline-no">&nbsp;</span>
2131
+ <span class="cline-any cline-no">&nbsp;</span>
2132
+ <span class="cline-any cline-no">&nbsp;</span>
2133
+ <span class="cline-any cline-no">&nbsp;</span>
2134
+ <span class="cline-any cline-no">&nbsp;</span>
2135
+ <span class="cline-any cline-no">&nbsp;</span>
2136
+ <span class="cline-any cline-no">&nbsp;</span>
2137
+ <span class="cline-any cline-no">&nbsp;</span>
2138
+ <span class="cline-any cline-no">&nbsp;</span>
2139
+ <span class="cline-any cline-no">&nbsp;</span>
2140
+ <span class="cline-any cline-no">&nbsp;</span>
2141
+ <span class="cline-any cline-yes">75x</span>
2142
+ <span class="cline-any cline-yes">75x</span>
2143
+ <span class="cline-any cline-yes">75x</span>
2144
+ <span class="cline-any cline-yes">75x</span>
2145
+ <span class="cline-any cline-yes">75x</span>
2146
+ <span class="cline-any cline-yes">73x</span>
2147
+ <span class="cline-any cline-yes">73x</span>
2148
+ <span class="cline-any cline-yes">73x</span>
2149
+ <span class="cline-any cline-yes">73x</span>
2150
+ <span class="cline-any cline-yes">73x</span>
2151
+ <span class="cline-any cline-yes">73x</span>
2152
+ <span class="cline-any cline-yes">73x</span>
2153
+ <span class="cline-any cline-yes">73x</span>
2154
+ <span class="cline-any cline-yes">73x</span>
2155
+ <span class="cline-any cline-yes">73x</span>
2156
+ <span class="cline-any cline-yes">1x</span>
2157
+ <span class="cline-any cline-yes">1x</span>
2158
+ <span class="cline-any cline-yes">1x</span>
2159
+ <span class="cline-any cline-yes">1x</span>
2160
+ <span class="cline-any cline-yes">1x</span>
2161
+ <span class="cline-any cline-yes">1x</span>
2162
+ <span class="cline-any cline-yes">1x</span>
2163
+ <span class="cline-any cline-yes">1x</span>
2164
+ <span class="cline-any cline-yes">1x</span>
2165
+ <span class="cline-any cline-yes">1x</span>
2166
+ <span class="cline-any cline-yes">1x</span>
2167
+ <span class="cline-any cline-yes">73x</span>
2168
+ <span class="cline-any cline-yes">73x</span>
2169
+ <span class="cline-any cline-yes">73x</span>
2170
+ <span class="cline-any cline-yes">73x</span>
2171
+ <span class="cline-any cline-yes">73x</span>
2172
+ <span class="cline-any cline-yes">73x</span>
2173
+ <span class="cline-any cline-yes">73x</span>
2174
+ <span class="cline-any cline-yes">73x</span>
2175
+ <span class="cline-any cline-yes">73x</span>
2176
+ <span class="cline-any cline-yes">73x</span>
2177
+ <span class="cline-any cline-yes">73x</span>
2178
+ <span class="cline-any cline-yes">73x</span>
2179
+ <span class="cline-any cline-yes">73x</span>
2180
+ <span class="cline-any cline-yes">73x</span>
2181
+ <span class="cline-any cline-yes">73x</span>
2182
+ <span class="cline-any cline-no">&nbsp;</span>
2183
+ <span class="cline-any cline-no">&nbsp;</span>
2184
+ <span class="cline-any cline-no">&nbsp;</span>
2185
+ <span class="cline-any cline-no">&nbsp;</span>
2186
+ <span class="cline-any cline-no">&nbsp;</span>
2187
+ <span class="cline-any cline-no">&nbsp;</span>
2188
+ <span class="cline-any cline-no">&nbsp;</span>
2189
+ <span class="cline-any cline-no">&nbsp;</span>
2190
+ <span class="cline-any cline-no">&nbsp;</span>
2191
+ <span class="cline-any cline-no">&nbsp;</span>
2192
+ <span class="cline-any cline-yes">73x</span>
2193
+ <span class="cline-any cline-yes">73x</span>
2194
+ <span class="cline-any cline-yes">73x</span>
2195
+ <span class="cline-any cline-yes">73x</span>
2196
+ <span class="cline-any cline-yes">73x</span>
2197
+ <span class="cline-any cline-yes">73x</span>
2198
+ <span class="cline-any cline-yes">73x</span>
2199
+ <span class="cline-any cline-yes">73x</span>
2200
+ <span class="cline-any cline-yes">73x</span>
2201
+ <span class="cline-any cline-yes">73x</span>
2202
+ <span class="cline-any cline-yes">73x</span>
2203
+ <span class="cline-any cline-yes">73x</span>
2204
+ <span class="cline-any cline-yes">73x</span>
2205
+ <span class="cline-any cline-yes">73x</span>
2206
+ <span class="cline-any cline-yes">73x</span>
2207
+ <span class="cline-any cline-yes">73x</span>
2208
+ <span class="cline-any cline-yes">73x</span>
2209
+ <span class="cline-any cline-yes">73x</span>
2210
+ <span class="cline-any cline-yes">73x</span>
2211
+ <span class="cline-any cline-yes">73x</span>
2212
+ <span class="cline-any cline-yes">73x</span>
2213
+ <span class="cline-any cline-yes">73x</span>
2214
+ <span class="cline-any cline-yes">73x</span>
2215
+ <span class="cline-any cline-yes">73x</span>
2216
+ <span class="cline-any cline-yes">93x</span>
2217
+ <span class="cline-any cline-yes">2x</span>
2218
+ <span class="cline-any cline-yes">2x</span>
2219
+ <span class="cline-any cline-yes">73x</span>
2220
+ <span class="cline-any cline-yes">73x</span>
2221
+ <span class="cline-any cline-yes">73x</span>
2222
+ <span class="cline-any cline-yes">93x</span>
2223
+ <span class="cline-any cline-yes">2x</span>
2224
+ <span class="cline-any cline-yes">2x</span>
2225
+ <span class="cline-any cline-yes">2x</span>
2226
+ <span class="cline-any cline-yes">2x</span>
2227
+ <span class="cline-any cline-yes">2x</span>
2228
+ <span class="cline-any cline-yes">2x</span>
2229
+ <span class="cline-any cline-yes">2x</span>
2230
+ <span class="cline-any cline-yes">2x</span>
2231
+ <span class="cline-any cline-yes">2x</span>
2232
+ <span class="cline-any cline-yes">2x</span>
2233
+ <span class="cline-any cline-yes">2x</span>
2234
+ <span class="cline-any cline-yes">2x</span>
2235
+ <span class="cline-any cline-yes">2x</span>
2236
+ <span class="cline-any cline-yes">2x</span>
2237
+ <span class="cline-any cline-yes">2x</span>
2238
+ <span class="cline-any cline-yes">2x</span>
2239
+ <span class="cline-any cline-yes">2x</span>
2240
+ <span class="cline-any cline-yes">75x</span>
2241
+ <span class="cline-any cline-yes">75x</span>
2242
+ <span class="cline-any cline-yes">75x</span>
2243
+ <span class="cline-any cline-yes">75x</span>
2244
+ <span class="cline-any cline-yes">75x</span>
2245
+ <span class="cline-any cline-yes">75x</span>
2246
+ <span class="cline-any cline-yes">75x</span>
2247
+ <span class="cline-any cline-yes">6x</span>
2248
+ <span class="cline-any cline-yes">6x</span>
2249
+ <span class="cline-any cline-yes">6x</span>
2250
+ <span class="cline-any cline-yes">6x</span>
2251
+ <span class="cline-any cline-yes">6x</span>
2252
+ <span class="cline-any cline-yes">6x</span>
2253
+ <span class="cline-any cline-yes">6x</span>
2254
+ <span class="cline-any cline-yes">6x</span>
2255
+ <span class="cline-any cline-yes">6x</span>
2256
+ <span class="cline-any cline-yes">6x</span>
2257
+ <span class="cline-any cline-yes">6x</span>
2258
+ <span class="cline-any cline-yes">6x</span>
2259
+ <span class="cline-any cline-yes">6x</span>
2260
+ <span class="cline-any cline-yes">6x</span>
2261
+ <span class="cline-any cline-yes">6x</span>
2262
+ <span class="cline-any cline-yes">6x</span>
2263
+ <span class="cline-any cline-yes">6x</span>
2264
+ <span class="cline-any cline-yes">6x</span>
2265
+ <span class="cline-any cline-yes">6x</span>
2266
+ <span class="cline-any cline-yes">6x</span>
2267
+ <span class="cline-any cline-yes">1x</span>
2268
+ <span class="cline-any cline-yes">1x</span>
2269
+ <span class="cline-any cline-yes">1x</span>
2270
+ <span class="cline-any cline-yes">1x</span>
2271
+ <span class="cline-any cline-yes">1x</span>
2272
+ <span class="cline-any cline-yes">1x</span>
2273
+ <span class="cline-any cline-yes">1x</span>
2274
+ <span class="cline-any cline-yes">1x</span>
2275
+ <span class="cline-any cline-yes">1x</span>
2276
+ <span class="cline-any cline-yes">1x</span>
2277
+ <span class="cline-any cline-yes">1x</span>
2278
+ <span class="cline-any cline-yes">5x</span>
2279
+ <span class="cline-any cline-yes">5x</span>
2280
+ <span class="cline-any cline-yes">5x</span>
2281
+ <span class="cline-any cline-yes">6x</span>
2282
+ <span class="cline-any cline-no">&nbsp;</span>
2283
+ <span class="cline-any cline-no">&nbsp;</span>
2284
+ <span class="cline-any cline-no">&nbsp;</span>
2285
+ <span class="cline-any cline-no">&nbsp;</span>
2286
+ <span class="cline-any cline-no">&nbsp;</span>
2287
+ <span class="cline-any cline-no">&nbsp;</span>
2288
+ <span class="cline-any cline-no">&nbsp;</span>
2289
+ <span class="cline-any cline-no">&nbsp;</span>
2290
+ <span class="cline-any cline-no">&nbsp;</span>
2291
+ <span class="cline-any cline-no">&nbsp;</span>
2292
+ <span class="cline-any cline-no">&nbsp;</span>
2293
+ <span class="cline-any cline-yes">5x</span>
2294
+ <span class="cline-any cline-yes">5x</span>
2295
+ <span class="cline-any cline-yes">5x</span>
2296
+ <span class="cline-any cline-yes">6x</span>
2297
+ <span class="cline-any cline-yes">1x</span>
2298
+ <span class="cline-any cline-yes">1x</span>
2299
+ <span class="cline-any cline-yes">4x</span>
2300
+ <span class="cline-any cline-yes">4x</span>
2301
+ <span class="cline-any cline-yes">6x</span>
2302
+ <span class="cline-any cline-yes">1x</span>
2303
+ <span class="cline-any cline-yes">1x</span>
2304
+ <span class="cline-any cline-yes">1x</span>
2305
+ <span class="cline-any cline-yes">1x</span>
2306
+ <span class="cline-any cline-yes">1x</span>
2307
+ <span class="cline-any cline-yes">1x</span>
2308
+ <span class="cline-any cline-yes">1x</span>
2309
+ <span class="cline-any cline-yes">1x</span>
2310
+ <span class="cline-any cline-yes">1x</span>
2311
+ <span class="cline-any cline-yes">1x</span>
2312
+ <span class="cline-any cline-yes">1x</span>
2313
+ <span class="cline-any cline-yes">1x</span>
2314
+ <span class="cline-any cline-yes">3x</span>
2315
+ <span class="cline-any cline-yes">3x</span>
2316
+ <span class="cline-any cline-yes">3x</span>
2317
+ <span class="cline-any cline-yes">3x</span>
2318
+ <span class="cline-any cline-yes">3x</span>
2319
+ <span class="cline-any cline-yes">6x</span>
2320
+ <span class="cline-any cline-no">&nbsp;</span>
2321
+ <span class="cline-any cline-no">&nbsp;</span>
2322
+ <span class="cline-any cline-yes">3x</span>
2323
+ <span class="cline-any cline-yes">3x</span>
2324
+ <span class="cline-any cline-yes">3x</span>
2325
+ <span class="cline-any cline-yes">6x</span>
2326
+ <span class="cline-any cline-yes">6x</span>
2327
+ <span class="cline-any cline-yes">6x</span>
2328
+ <span class="cline-any cline-yes">6x</span>
2329
+ <span class="cline-any cline-yes">6x</span>
2330
+ <span class="cline-any cline-yes">6x</span>
2331
+ <span class="cline-any cline-yes">6x</span>
2332
+ <span class="cline-any cline-yes">3x</span>
2333
+ <span class="cline-any cline-yes">3x</span>
2334
+ <span class="cline-any cline-yes">6x</span>
2335
+ <span class="cline-any cline-yes">3x</span>
2336
+ <span class="cline-any cline-yes">3x</span>
2337
+ <span class="cline-any cline-yes">3x</span>
2338
+ <span class="cline-any cline-yes">3x</span>
2339
+ <span class="cline-any cline-yes">3x</span>
2340
+ <span class="cline-any cline-yes">3x</span>
2341
+ <span class="cline-any cline-yes">3x</span>
2342
+ <span class="cline-any cline-yes">3x</span>
2343
+ <span class="cline-any cline-yes">3x</span>
2344
+ <span class="cline-any cline-no">&nbsp;</span>
2345
+ <span class="cline-any cline-no">&nbsp;</span>
2346
+ <span class="cline-any cline-no">&nbsp;</span>
2347
+ <span class="cline-any cline-no">&nbsp;</span>
2348
+ <span class="cline-any cline-no">&nbsp;</span>
2349
+ <span class="cline-any cline-no">&nbsp;</span>
2350
+ <span class="cline-any cline-no">&nbsp;</span>
2351
+ <span class="cline-any cline-no">&nbsp;</span>
2352
+ <span class="cline-any cline-no">&nbsp;</span>
2353
+ <span class="cline-any cline-no">&nbsp;</span>
2354
+ <span class="cline-any cline-yes">3x</span>
2355
+ <span class="cline-any cline-yes">3x</span>
2356
+ <span class="cline-any cline-yes">3x</span>
2357
+ <span class="cline-any cline-yes">3x</span>
2358
+ <span class="cline-any cline-yes">3x</span>
2359
+ <span class="cline-any cline-yes">3x</span>
2360
+ <span class="cline-any cline-yes">3x</span>
2361
+ <span class="cline-any cline-yes">3x</span>
2362
+ <span class="cline-any cline-yes">3x</span>
2363
+ <span class="cline-any cline-yes">6x</span>
2364
+ <span class="cline-any cline-yes">6x</span>
2365
+ <span class="cline-any cline-yes">6x</span>
2366
+ <span class="cline-any cline-yes">6x</span>
2367
+ <span class="cline-any cline-yes">6x</span>
2368
+ <span class="cline-any cline-yes">6x</span>
2369
+ <span class="cline-any cline-yes">6x</span>
2370
+ <span class="cline-any cline-yes">6x</span>
2371
+ <span class="cline-any cline-yes">6x</span>
2372
+ <span class="cline-any cline-yes">6x</span>
2373
+ <span class="cline-any cline-yes">6x</span>
2374
+ <span class="cline-any cline-yes">6x</span>
2375
+ <span class="cline-any cline-yes">6x</span>
2376
+ <span class="cline-any cline-no">&nbsp;</span>
2377
+ <span class="cline-any cline-no">&nbsp;</span>
2378
+ <span class="cline-any cline-no">&nbsp;</span>
2379
+ <span class="cline-any cline-no">&nbsp;</span>
2380
+ <span class="cline-any cline-no">&nbsp;</span>
2381
+ <span class="cline-any cline-no">&nbsp;</span>
2382
+ <span class="cline-any cline-no">&nbsp;</span>
2383
+ <span class="cline-any cline-no">&nbsp;</span>
2384
+ <span class="cline-any cline-no">&nbsp;</span>
2385
+ <span class="cline-any cline-no">&nbsp;</span>
2386
+ <span class="cline-any cline-no">&nbsp;</span>
2387
+ <span class="cline-any cline-no">&nbsp;</span>
2388
+ <span class="cline-any cline-no">&nbsp;</span>
2389
+ <span class="cline-any cline-no">&nbsp;</span>
2390
+ <span class="cline-any cline-no">&nbsp;</span>
2391
+ <span class="cline-any cline-no">&nbsp;</span>
2392
+ <span class="cline-any cline-no">&nbsp;</span>
2393
+ <span class="cline-any cline-yes">75x</span>
2394
+ <span class="cline-any cline-yes">75x</span>
2395
+ <span class="cline-any cline-yes">75x</span>
2396
+ <span class="cline-any cline-yes">75x</span>
2397
+ <span class="cline-any cline-yes">75x</span>
2398
+ <span class="cline-any cline-yes">75x</span>
2399
+ <span class="cline-any cline-yes">75x</span>
2400
+ <span class="cline-any cline-yes">75x</span>
2401
+ <span class="cline-any cline-no">&nbsp;</span>
2402
+ <span class="cline-any cline-no">&nbsp;</span>
2403
+ <span class="cline-any cline-no">&nbsp;</span>
2404
+ <span class="cline-any cline-no">&nbsp;</span>
2405
+ <span class="cline-any cline-no">&nbsp;</span>
2406
+ <span class="cline-any cline-no">&nbsp;</span>
2407
+ <span class="cline-any cline-no">&nbsp;</span>
2408
+ <span class="cline-any cline-no">&nbsp;</span>
2409
+ <span class="cline-any cline-no">&nbsp;</span>
2410
+ <span class="cline-any cline-no">&nbsp;</span>
2411
+ <span class="cline-any cline-no">&nbsp;</span>
2412
+ <span class="cline-any cline-no">&nbsp;</span>
2413
+ <span class="cline-any cline-no">&nbsp;</span>
2414
+ <span class="cline-any cline-no">&nbsp;</span>
2415
+ <span class="cline-any cline-no">&nbsp;</span>
2416
+ <span class="cline-any cline-no">&nbsp;</span>
2417
+ <span class="cline-any cline-no">&nbsp;</span>
2418
+ <span class="cline-any cline-no">&nbsp;</span>
2419
+ <span class="cline-any cline-no">&nbsp;</span>
2420
+ <span class="cline-any cline-no">&nbsp;</span>
2421
+ <span class="cline-any cline-no">&nbsp;</span>
2422
+ <span class="cline-any cline-no">&nbsp;</span>
2423
+ <span class="cline-any cline-no">&nbsp;</span>
2424
+ <span class="cline-any cline-no">&nbsp;</span>
2425
+ <span class="cline-any cline-no">&nbsp;</span>
2426
+ <span class="cline-any cline-no">&nbsp;</span>
2427
+ <span class="cline-any cline-no">&nbsp;</span>
2428
+ <span class="cline-any cline-no">&nbsp;</span>
2429
+ <span class="cline-any cline-no">&nbsp;</span>
2430
+ <span class="cline-any cline-no">&nbsp;</span>
2431
+ <span class="cline-any cline-no">&nbsp;</span>
2432
+ <span class="cline-any cline-yes">75x</span>
2433
+ <span class="cline-any cline-yes">75x</span>
2434
+ <span class="cline-any cline-yes">75x</span>
2435
+ <span class="cline-any cline-yes">75x</span>
2436
+ <span class="cline-any cline-yes">75x</span>
2437
+ <span class="cline-any cline-yes">75x</span>
2438
+ <span class="cline-any cline-yes">75x</span>
2439
+ <span class="cline-any cline-no">&nbsp;</span>
2440
+ <span class="cline-any cline-no">&nbsp;</span>
2441
+ <span class="cline-any cline-no">&nbsp;</span>
2442
+ <span class="cline-any cline-no">&nbsp;</span>
2443
+ <span class="cline-any cline-no">&nbsp;</span>
2444
+ <span class="cline-any cline-no">&nbsp;</span>
2445
+ <span class="cline-any cline-no">&nbsp;</span>
2446
+ <span class="cline-any cline-no">&nbsp;</span>
2447
+ <span class="cline-any cline-no">&nbsp;</span>
2448
+ <span class="cline-any cline-no">&nbsp;</span>
2449
+ <span class="cline-any cline-no">&nbsp;</span>
2450
+ <span class="cline-any cline-no">&nbsp;</span>
2451
+ <span class="cline-any cline-no">&nbsp;</span>
2452
+ <span class="cline-any cline-no">&nbsp;</span>
2453
+ <span class="cline-any cline-no">&nbsp;</span>
2454
+ <span class="cline-any cline-no">&nbsp;</span>
2455
+ <span class="cline-any cline-no">&nbsp;</span>
2456
+ <span class="cline-any cline-no">&nbsp;</span>
2457
+ <span class="cline-any cline-no">&nbsp;</span>
2458
+ <span class="cline-any cline-no">&nbsp;</span>
2459
+ <span class="cline-any cline-no">&nbsp;</span>
2460
+ <span class="cline-any cline-no">&nbsp;</span>
2461
+ <span class="cline-any cline-no">&nbsp;</span>
2462
+ <span class="cline-any cline-no">&nbsp;</span>
2463
+ <span class="cline-any cline-no">&nbsp;</span>
2464
+ <span class="cline-any cline-no">&nbsp;</span>
2465
+ <span class="cline-any cline-no">&nbsp;</span>
2466
+ <span class="cline-any cline-no">&nbsp;</span>
2467
+ <span class="cline-any cline-no">&nbsp;</span>
2468
+ <span class="cline-any cline-no">&nbsp;</span>
2469
+ <span class="cline-any cline-yes">75x</span>
2470
+ <span class="cline-any cline-yes">75x</span>
2471
+ <span class="cline-any cline-yes">75x</span>
2472
+ <span class="cline-any cline-yes">75x</span>
2473
+ <span class="cline-any cline-yes">86x</span>
2474
+ <span class="cline-any cline-yes">86x</span>
2475
+ <span class="cline-any cline-yes">86x</span>
2476
+ <span class="cline-any cline-yes">86x</span>
2477
+ <span class="cline-any cline-no">&nbsp;</span>
2478
+ <span class="cline-any cline-no">&nbsp;</span>
2479
+ <span class="cline-any cline-no">&nbsp;</span>
2480
+ <span class="cline-any cline-no">&nbsp;</span>
2481
+ <span class="cline-any cline-no">&nbsp;</span>
2482
+ <span class="cline-any cline-no">&nbsp;</span>
2483
+ <span class="cline-any cline-yes">86x</span>
2484
+ <span class="cline-any cline-yes">86x</span>
2485
+ <span class="cline-any cline-yes">86x</span>
2486
+ <span class="cline-any cline-yes">86x</span>
2487
+ <span class="cline-any cline-yes">86x</span>
2488
+ <span class="cline-any cline-yes">86x</span>
2489
+ <span class="cline-any cline-yes">86x</span>
2490
+ <span class="cline-any cline-yes">86x</span>
2491
+ <span class="cline-any cline-yes">86x</span>
2492
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
2493
+ * A2A API Routes
2494
+ *
2495
+ * Mount at: /api/a2a
2496
+ *
2497
+ * Security notes:
2498
+ * - Rate limiting is in-memory (resets on restart) - for production, use Redis
2499
+ * - Body size should be limited by Express middleware (e.g., express.json({ limit: '100kb' }))
2500
+ */
2501
+ &nbsp;
2502
+ const { TokenStore } = require('../lib/tokens');
2503
+ const crypto = require('crypto');
2504
+ const { createLogger, createTraceId } = require('../lib/logger');
2505
+ const { verifySignature, isTimestampValid, fingerprint } = require('../lib/crypto');
2506
+ const { buildAgentCard } = require('../lib/agent-card');
2507
+ const { isDirectLocalRequest } = require('../lib/local-request');
2508
+ &nbsp;
2509
+ // Lazy-load conversation store (optional dependency)
2510
+ let ConversationStore = null;
2511
+ let conversationStore = null;
2512
+ function getConversationStore(options = {}) {
2513
+ if (!ConversationStore) {
2514
+ try {
2515
+ ConversationStore = require('../lib/conversations').ConversationStore;
2516
+ const configDir = options.configDir <span class="branch-0 cbranch-no" title="branch not covered" >|| undefined;</span>
2517
+ conversationStore = new ConversationStore(configDir, {
2518
+ eventStore: options.eventStore || null
2519
+ });
2520
+ if (!conversationStore.isAvailable()) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2521
+ <span class="cstat-no" title="statement not covered" > conversationStore = null;</span>
2522
+ <span class="cstat-no" title="statement not covered" > }</span>
2523
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
2524
+ <span class="cstat-no" title="statement not covered" > // Conversation storage not available</span>
2525
+ <span class="cstat-no" title="statement not covered" > return null;</span>
2526
+ <span class="cstat-no" title="statement not covered" > }</span>
2527
+ }
2528
+ return conversationStore;
2529
+ }
2530
+ &nbsp;
2531
+ // Lazy-load call monitor
2532
+ let CallMonitor = null;
2533
+ let callMonitor = null;
2534
+ function getCallMonitor(options = {}) {
2535
+ if (!CallMonitor) {
2536
+ try {
2537
+ CallMonitor = require('../lib/call-monitor').CallMonitor;
2538
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
2539
+ <span class="cstat-no" title="statement not covered" > return null;</span>
2540
+ <span class="cstat-no" title="statement not covered" > }</span>
2541
+ }
2542
+ if (!callMonitor &amp;&amp; options.convStore) {
2543
+ callMonitor = new CallMonitor(options);
2544
+ callMonitor.start();
2545
+ }
2546
+ return callMonitor;
2547
+ }
2548
+ &nbsp;
2549
+ // Rate limiting state (in-memory - resets on restart)
2550
+ // For production: use Redis or persistent store
2551
+ const rateLimits = new Map();
2552
+ &nbsp;
2553
+ // Rate limit eviction constants
2554
+ const RATE_LIMIT_MAX_ENTRIES = 1000;
2555
+ const RATE_LIMIT_STALE_MS = 24 * 60 * 60 * 1000; // 24 hours
2556
+ &nbsp;
2557
+ // Constants
2558
+ const MAX_MESSAGE_LENGTH = 10000; // 10KB max message
2559
+ const MAX_TIMEOUT_SECONDS = 300; // 5 min max timeout
2560
+ const MIN_TIMEOUT_SECONDS = 5; // 5 sec min timeout
2561
+ &nbsp;
2562
+ function resolveTraceId(req) {
2563
+ const headerTrace = req.headers['x-trace-id'];
2564
+ if (typeof headerTrace === 'string' &amp;&amp; headerTrace.trim()) {
2565
+ return headerTrace.trim().slice(0, 120);
2566
+ }
2567
+ return createTraceId('a2a');
2568
+ }
2569
+ &nbsp;
2570
+ function resolveRequestId(req) {
2571
+ const headerRequestId = req.headers['x-request-id'];
2572
+ if (typeof headerRequestId === 'string' <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp; headerRequestId.trim())</span> <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2573
+ <span class="cstat-no" title="statement not covered" > return headerRequestId.trim().slice(0, 120);</span>
2574
+ <span class="cstat-no" title="statement not covered" > }</span>
2575
+ return createTraceId('req');
2576
+ }
2577
+ &nbsp;
2578
+ function extractClientHost(req) {
2579
+ const forwarded = req.headers['x-forwarded-for'];
2580
+ if (typeof forwarded === 'string' <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp; forwarded.trim())</span> <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2581
+ <span class="cstat-no" title="statement not covered" > return forwarded.split(',')[0].trim();</span>
2582
+ <span class="cstat-no" title="statement not covered" > }</span>
2583
+ return req.ip <span class="branch-0 cbranch-no" title="branch not covered" >|| null;</span>
2584
+ }
2585
+ &nbsp;
2586
+ function normalizeRequestMetadata(req) {
2587
+ const body = req &amp;&amp; typeof req.body === 'object' &amp;&amp; req.body ? req.body <span class="branch-0 cbranch-no" title="branch not covered" >: {};</span>
2588
+ return {
2589
+ has_message: typeof body.message === 'string',
2590
+ has_caller: Boolean(body.caller &amp;&amp; typeof body.caller === 'object'),
2591
+ has_context: Boolean(body.context <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp; typeof body.context === 'object')</span>,
2592
+ timeout_seconds: body.timeout_seconds
2593
+ };
2594
+ }
2595
+ &nbsp;
2596
+ /**
2597
+ * Timing-safe comparison of two token strings.
2598
+ * Returns true if tokens match, false otherwise.
2599
+ * Short-circuits (non-timing-safe) only when a value is missing or empty,
2600
+ * which is acceptable since the absence of a token is not secret.
2601
+ */
2602
+ function timingSafeTokenEqual(a, b) {
2603
+ if (!a || !b) return false;
2604
+ const bufA = Buffer.from(String(a));
2605
+ const bufB = Buffer.from(String(b));
2606
+ if (bufA.length !== bufB.length) return false;
2607
+ return crypto.timingSafeEqual(bufA, bufB);
2608
+ }
2609
+ &nbsp;
2610
+ function checkRateLimit(tokenId, limits = { minute: 10, hour: 100, day: 1000 }) {
2611
+ const now = Date.now();
2612
+ const minute = Math.floor(now / 60000);
2613
+ const hour = Math.floor(now / 3600000);
2614
+ const day = Math.floor(now / 86400000);
2615
+ &nbsp;
2616
+ let state = rateLimits.get(tokenId);
2617
+ if (!state) {
2618
+ state = {
2619
+ minute: { count: 0, bucket: minute },
2620
+ hour: { count: 0, bucket: hour },
2621
+ day: { count: 0, bucket: day }
2622
+ };
2623
+ rateLimits.set(tokenId, state);
2624
+ }
2625
+ &nbsp;
2626
+ // Reset buckets if needed
2627
+ if (state.minute.bucket !== minute) <span class="branch-0 cbranch-no" title="branch not covered" >state.minute = { count: 0, bucket: minute };</span>
2628
+ if (state.hour.bucket !== hour) <span class="branch-0 cbranch-no" title="branch not covered" >state.hour = { count: 0, bucket: hour };</span>
2629
+ if (state.day.bucket !== day) <span class="branch-0 cbranch-no" title="branch not covered" >state.day = { count: 0, bucket: day };</span>
2630
+ &nbsp;
2631
+ // Check limits
2632
+ if (state.minute.count &gt;= limits.minute) {
2633
+ return { limited: true, error: 'rate_limited', message: 'Too many requests per minute', retryAfter: 60 };
2634
+ }
2635
+ if (state.hour.count &gt;= limits.hour) {
2636
+ return { limited: true, error: 'rate_limited', message: 'Too many requests per hour', retryAfter: 3600 };
2637
+ }
2638
+ if (state.day.count &gt;= limits.day) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2639
+ <span class="cstat-no" title="statement not covered" > return { limited: true, error: 'rate_limited', message: 'Too many requests per day', retryAfter: 86400 };</span>
2640
+ <span class="cstat-no" title="statement not covered" > }</span>
2641
+ &nbsp;
2642
+ // Increment
2643
+ state.minute.count++;
2644
+ state.hour.count++;
2645
+ state.day.count++;
2646
+ &nbsp;
2647
+ // Evict stale entries when the Map exceeds the size threshold
2648
+ if (rateLimits.size &gt; RATE_LIMIT_MAX_ENTRIES) {
2649
+ const staleThreshold = now - RATE_LIMIT_STALE_MS;
2650
+ let evicted = 0;
2651
+ for (const [key, entry] of rateLimits) {
2652
+ // An entry is stale if all three bucket timestamps are older than 24h
2653
+ const latestBucket = Math.max(
2654
+ entry.minute.bucket * 60000,
2655
+ entry.hour.bucket * 3600000,
2656
+ entry.day.bucket * 86400000
2657
+ );
2658
+ if (latestBucket &lt; staleThreshold) {
2659
+ rateLimits.delete(key);
2660
+ evicted++;
2661
+ }
2662
+ }
2663
+ // If no stale entries found, evict the oldest (first-inserted) entries
2664
+ if (evicted === 0) {
2665
+ const excess = rateLimits.size - RATE_LIMIT_MAX_ENTRIES;
2666
+ let removed = 0;
2667
+ for (const key of rateLimits.keys()) {
2668
+ if (removed &gt;= excess) break;
2669
+ rateLimits.delete(key);
2670
+ removed++;
2671
+ }
2672
+ }
2673
+ }
2674
+ &nbsp;
2675
+ return { limited: false };
2676
+ }
2677
+ &nbsp;
2678
+ /**
2679
+ * Create a2a routes
2680
+ *
2681
+ * @param {object} options
2682
+ * @param {TokenStore} options.tokenStore - Token store instance
2683
+ * @param {function} options.handleMessage - Async function to handle incoming messages
2684
+ * @param {function} options.notifyOwner - Async function to notify owner of calls
2685
+ * @param {object} options.rateLimits - Custom rate limits { minute, hour, day }
2686
+ * @param {function} options.summarizer - Async function to summarize conversations
2687
+ * @param {object} options.ownerContext - Owner context for summaries
2688
+ * @param {number} options.idleTimeoutMs - Idle timeout for auto-conclude (default: 60000)
2689
+ * @param {number} options.maxDurationMs - Max call duration (default: 300000)
2690
+ */
2691
+ function createRoutes(options = {}) {
2692
+ const express = require('express');
2693
+ const router = express.Router();
2694
+ &nbsp;
2695
+ const tokenStore = options.tokenStore <span class="branch-0 cbranch-no" title="branch not covered" >|| new TokenStore();</span>
2696
+ const handleMessage = options.handleMessage || defaultMessageHandler;
2697
+ const notifyOwner = options.notifyOwner || (<span class="fstat-no" title="function not covered" >() =&gt; Promise.resolve())</span>;
2698
+ const limits = options.rateLimits || { minute: 10, hour: 100, day: 1000 };
2699
+ const logger = options.logger || createLogger({ component: 'a2a.routes' });
2700
+ const eventStore = options.eventStore || null;
2701
+ &nbsp;
2702
+ // Initialize conversation store and call monitor
2703
+ const convStore = getConversationStore({
2704
+ eventStore,
2705
+ configDir: tokenStore.configDir
2706
+ });
2707
+ const monitor = getCallMonitor({
2708
+ convStore,
2709
+ summarizer: options.summarizer,
2710
+ notifyOwner,
2711
+ ownerContext: options.ownerContext || {},
2712
+ idleTimeoutMs: options.idleTimeoutMs || 60000,
2713
+ maxDurationMs: options.maxDurationMs || 300000,
2714
+ logger: logger.child({ component: 'a2a.call-monitor' })
2715
+ });
2716
+ if (typeof options.onCallMonitor === 'function') {
2717
+ try {
2718
+ options.onCallMonitor(monitor);
2719
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (_) {}</span>
2720
+ }
2721
+ &nbsp;
2722
+ // A2A-78: shared inbound auth pipeline for /invoke, /message:send, /end
2723
+ // Returns { validation, identityVerified, publicKeyFingerprint } or sends error response and returns null
2724
+ async function validateInboundAuth(req, res, reqLogger, endpoint) {
2725
+ const withTracePayload = (payload) =&gt; ({ ...payload, trace_id: res.getHeader('x-trace-id'), request_id: res.getHeader('x-request-id') });
2726
+ &nbsp;
2727
+ const authHeader = req.headers.authorization;
2728
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
2729
+ reqLogger.warn('Request missing bearer token', {
2730
+ error_code: 'AUTH_MISSING_BEARER',
2731
+ status_code: 401,
2732
+ hint: 'Send Authorization: Bearer &lt;a2a_token&gt;.'
2733
+ });
2734
+ res.status(401).json(withTracePayload({
2735
+ success: false,
2736
+ error: 'missing_token',
2737
+ message: 'Authorization header required'
2738
+ }));
2739
+ return null;
2740
+ }
2741
+ &nbsp;
2742
+ const token = authHeader.slice(7);
2743
+ const validation = tokenStore.validate(token);
2744
+ if (!validation.valid) {
2745
+ reqLogger.warn('Token validation failed', {
2746
+ error_code: 'TOKEN_INVALID_OR_EXPIRED',
2747
+ status_code: 401,
2748
+ hint: 'Create a fresh invite token and retry with the new bearer token.'
2749
+ });
2750
+ res.status(401).json(withTracePayload({
2751
+ success: false,
2752
+ error: 'unauthorized',
2753
+ message: 'Invalid or expired token'
2754
+ }));
2755
+ return null;
2756
+ }
2757
+ &nbsp;
2758
+ const rateCheck = checkRateLimit(validation.id, limits);
2759
+ if (rateCheck.limited) {
2760
+ reqLogger.warn('Request rate limited', {
2761
+ tokenId: validation.id,
2762
+ error_code: 'TOKEN_RATE_LIMITED',
2763
+ status_code: 429,
2764
+ hint: 'Respect Retry-After and reduce invoke frequency for this token.',
2765
+ data: { retry_after: rateCheck.retryAfter }
2766
+ });
2767
+ res.set('Retry-After', rateCheck.retryAfter);
2768
+ res.status(429).json(withTracePayload({
2769
+ success: false,
2770
+ error: rateCheck.error,
2771
+ message: rateCheck.message
2772
+ }));
2773
+ return null;
2774
+ }
2775
+ &nbsp;
2776
+ const sigCheck = verifySigHeaders(req, validation, endpoint, reqLogger);
2777
+ if (sigCheck.error) {
2778
+ res.status(sigCheck.error.status).json(withTracePayload(sigCheck.error.body));
2779
+ return null;
2780
+ }
2781
+ &nbsp;
2782
+ return {
2783
+ validation,
2784
+ identityVerified: sigCheck.identityVerified,
2785
+ publicKeyFingerprint: sigCheck.publicKeyFingerprint
2786
+ };
2787
+ }
2788
+ &nbsp;
2789
+ // A2A-52: shared signature verification helper for /invoke and /end
2790
+ function verifySigHeaders(req, validation, endpoint, reqLogger, withTracePayload) {
2791
+ const sigHeader = req.headers['x-a2a-signature'];
2792
+ const pubKeyHeader = req.headers['x-a2a-public-key'];
2793
+ const tsHeader = req.headers['x-a2a-timestamp'];
2794
+ const result = { identityVerified: false, publicKeyFingerprint: null, error: null };
2795
+ &nbsp;
2796
+ if (!sigHeader || !pubKeyHeader || !tsHeader) return result;
2797
+ &nbsp;
2798
+ if (!isTimestampValid(tsHeader)) {
2799
+ result.error = { status: 403, body: { success: false, error: 'timestamp_expired', message: 'Request timestamp outside allowed window' } };
2800
+ reqLogger.warn('Signature timestamp outside window', { tokenId: validation.id, error_code: 'SIGNATURE_TIMESTAMP_EXPIRED', status_code: 403 });
2801
+ return result;
2802
+ }
2803
+ &nbsp;
2804
+ try {
2805
+ crypto.createPublicKey({ key: Buffer.from(pubKeyHeader, 'base64'), format: 'der', type: 'spki' });
2806
+ } catch (_) {
2807
+ result.error = { status: 400, body: { success: false, error: 'malformed_public_key', message: 'X-A2A-Public-Key is not a valid Ed25519 public key' } };
2808
+ reqLogger.warn('Malformed public key', { tokenId: validation.id, error_code: 'MALFORMED_PUBLIC_KEY', status_code: 400 });
2809
+ return result;
2810
+ }
2811
+ &nbsp;
2812
+ const existingContact = tokenStore.getContact(validation.id) ||
2813
+ (tokenStore.listContacts().find(c =&gt; c.linked_token_id === validation.id));
2814
+ if (existingContact &amp;&amp; existingContact.public_key &amp;&amp; existingContact.public_key !== pubKeyHeader) {
2815
+ result.error = { status: 403, body: { success: false, error: 'public_key_mismatch', message: 'Public key does not match previously pinned key' } };
2816
+ reqLogger.warn('Public key mismatch (TOFU violation)', { tokenId: validation.id, error_code: 'PUBLIC_KEY_MISMATCH', status_code: 403 });
2817
+ return result;
2818
+ }
2819
+ &nbsp;
2820
+ const rawBody = JSON.stringify(req.body);
2821
+ try {
2822
+ const valid = verifySignature({ signature: sigHeader, publicKey: pubKeyHeader, timestamp: tsHeader, method: 'POST', endpoint, body: rawBody });
2823
+ if (valid) {
2824
+ result.identityVerified = true;
2825
+ result.publicKeyFingerprint = fingerprint(pubKeyHeader);
2826
+ if (existingContact &amp;&amp; !existingContact.public_key) {
2827
+ tokenStore.updateContact(existingContact.name <span class="branch-0 cbranch-no" title="branch not covered" >|| existingContact.id,</span> { public_key: pubKeyHeader });
2828
+ }
2829
+ } else {
2830
+ result.error = { status: 403, body: { success: false, error: 'invalid_signature', message: 'Ed25519 signature verification failed' } };
2831
+ reqLogger.warn('Signature verification failed', { tokenId: validation.id, error_code: 'SIGNATURE_INVALID', status_code: 403 });
2832
+ }
2833
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (sigErr) {</span>
2834
+ <span class="cstat-no" title="statement not covered" > result.error = { status: 403, body: { success: false, error: 'invalid_signature', message: 'Signature verification failed' } };</span>
2835
+ <span class="cstat-no" title="statement not covered" > reqLogger.warn('Signature verification error', { tokenId: validation.id, error_code: 'SIGNATURE_VERIFY_ERROR', status_code: 403, error: sigErr });</span>
2836
+ <span class="cstat-no" title="statement not covered" > }</span>
2837
+ return result;
2838
+ }
2839
+ &nbsp;
2840
+ // A2A-78: Google A2A ↔ internal format translation
2841
+ function translateGoogleToInternal(body) {
2842
+ const msg = body?.message;
2843
+ if (!msg || !Array.isArray(msg.parts) || msg.parts.length === 0) {
2844
+ return { error: { status: 400, code: 'invalid_message', message: 'message.parts array is required and must not be empty' } };
2845
+ }
2846
+ &nbsp;
2847
+ const textParts = [];
2848
+ let skippedNonText = 0;
2849
+ for (const part of msg.parts) {
2850
+ if (part?.content &amp;&amp; typeof part.content.text === 'string') {
2851
+ textParts.push(part.content.text);
2852
+ } else {
2853
+ skippedNonText++;
2854
+ }
2855
+ }
2856
+ &nbsp;
2857
+ const message = textParts.join('\n');
2858
+ if (!message) {
2859
+ return { error: { status: 400, code: 'no_text_content', message: 'No text content in message parts' } };
2860
+ }
2861
+ &nbsp;
2862
+ const config = body.configuration <span class="branch-0 cbranch-no" title="branch not covered" >|| {};</span>
2863
+ const metadata = body.metadata <span class="branch-0 cbranch-no" title="branch not covered" >|| {};</span>
2864
+ &nbsp;
2865
+ return {
2866
+ message,
2867
+ conversation_id: msg.context_id || null,
2868
+ caller: {
2869
+ name: String(metadata.caller_name || '').slice(0, 100),
2870
+ owner: String(metadata.caller_owner || '').slice(0, 100),
2871
+ instance: String(metadata.caller_instance || '').slice(0, 200),
2872
+ context: ''
2873
+ },
2874
+ timeout_seconds: Number(config.timeout_seconds) || 60,
2875
+ blocking: config.blocking !== false,
2876
+ skippedNonText
2877
+ };
2878
+ }
2879
+ &nbsp;
2880
+ function translateInternalToGoogle(response, conversationId, tier, disclosure, callsRemaining) {
2881
+ const canContinue = response.canContinue !== false;
2882
+ const taskId = `task_${Date.now()}_${crypto.randomBytes(6).toString('hex')}`;
2883
+ const messageId = `resp_${Date.now()}_${crypto.randomBytes(6).toString('hex')}`;
2884
+ &nbsp;
2885
+ return {
2886
+ task: {
2887
+ id: taskId,
2888
+ context_id: conversationId,
2889
+ status: {
2890
+ state: canContinue ? 'input-required' : 'completed',
2891
+ message: {
2892
+ message_id: messageId,
2893
+ role: 'agent',
2894
+ parts: [{ content: { text: response.text } }]
2895
+ },
2896
+ timestamp: new Date().toISOString()
2897
+ },
2898
+ metadata: {
2899
+ 'openclaw:tier': tier,
2900
+ 'openclaw:disclosure': disclosure,
2901
+ 'openclaw:calls_remaining': callsRemaining
2902
+ }
2903
+ }
2904
+ };
2905
+ }
2906
+ &nbsp;
2907
+ /**
2908
+ * GET /status
2909
+ * Check if A2A is enabled
2910
+ */
2911
+ router.get('/status', (req, res) =&gt; {
2912
+ const activeCalls = monitor ? monitor.getActiveCount() <span class="branch-0 cbranch-no" title="branch not covered" >: 0;</span>
2913
+ const response = {
2914
+ a2a: true,
2915
+ version: require('../../package.json').version,
2916
+ capabilities: ['invoke', 'multi-turn'],
2917
+ rate_limits: limits,
2918
+ active_calls: activeCalls
2919
+ };
2920
+ // A2A-52: include agent public key so contacts can fetch it
2921
+ if (options.publicKey) {
2922
+ response.public_key = options.publicKey;
2923
+ }
2924
+ res.json(response);
2925
+ });
2926
+ &nbsp;
2927
+ /**
2928
+ * GET /agent-card
2929
+ * Convenience mirror of /.well-known/a2a-agent-card (A2A-76)
2930
+ */
2931
+ router.get('/agent-card', (req, res) =&gt; {
2932
+ <span class="cstat-no" title="statement not covered" > const { A2AConfig } = require('../lib/config');</span>
2933
+ <span class="cstat-no" title="statement not covered" > const { getTopicsForTier } = require('../lib/disclosure');</span>
2934
+ <span class="cstat-no" title="statement not covered" > const cfg = new A2AConfig();</span>
2935
+ <span class="cstat-no" title="statement not covered" > const agent = cfg.getAgent();</span>
2936
+ <span class="cstat-no" title="statement not covered" > const manifest = getTopicsForTier('public');</span>
2937
+ <span class="cstat-no" title="statement not covered" > const keypair = cfg.getKeypair();</span>
2938
+ <span class="cstat-no" title="statement not covered" > const hostname = (agent &amp;&amp; agent.hostname) || process.env.A2A_HOSTNAME || req.headers.host || 'localhost';</span>
2939
+ <span class="cstat-no" title="statement not covered" > const protocol = req.protocol || 'https';</span>
2940
+ <span class="cstat-no" title="statement not covered" > const card = buildAgentCard({</span>
2941
+ <span class="cstat-no" title="statement not covered" > config: agent,</span>
2942
+ <span class="cstat-no" title="statement not covered" > manifest,</span>
2943
+ <span class="cstat-no" title="statement not covered" > publicKey: keypair ? keypair.publicKey : null,</span>
2944
+ <span class="cstat-no" title="statement not covered" > serverUrl: `${protocol}://${hostname}`,</span>
2945
+ <span class="cstat-no" title="statement not covered" > version: require('../../package.json').version</span>
2946
+ <span class="cstat-no" title="statement not covered" > });</span>
2947
+ <span class="cstat-no" title="statement not covered" > res.set('Cache-Control', 'public, max-age=3600');</span>
2948
+ <span class="cstat-no" title="statement not covered" > res.json(card);</span>
2949
+ });
2950
+ &nbsp;
2951
+ /**
2952
+ * GET /ping
2953
+ * Simple health check
2954
+ */
2955
+ router.get('/ping', (req, res) =&gt; {
2956
+ res.json({ pong: true, timestamp: new Date().toISOString() });
2957
+ });
2958
+ &nbsp;
2959
+ /**
2960
+ * POST /message:send
2961
+ * Google A2A protocol inbound endpoint (A2A-78)
2962
+ * Accepts standard A2A wire format and translates to internal invoke.
2963
+ * Registered on both escaped-colon and percent-encoded paths for compatibility.
2964
+ */
2965
+ async function handleMessageSend(req, res) {
2966
+ const startedAt = Date.now();
2967
+ const traceId = resolveTraceId(req);
2968
+ const requestId = resolveRequestId(req);
2969
+ const reqLogger = logger.child({ traceId, requestId, event: 'message_send' });
2970
+ const withTracePayload = (payload) =&gt; ({ ...payload, trace_id: traceId, request_id: requestId });
2971
+ res.set('x-trace-id', traceId);
2972
+ res.set('x-request-id', requestId);
2973
+ reqLogger.info('Received Google A2A message:send request', {
2974
+ data: {
2975
+ ip: req.ip,
2976
+ request_id: requestId,
2977
+ client_host: extractClientHost(req),
2978
+ has_auth_header: Boolean(req.headers.authorization)
2979
+ }
2980
+ });
2981
+ &nbsp;
2982
+ // Warn if non-blocking mode requested (not yet supported)
2983
+ const bodyConfig = req.body?.configuration;
2984
+ if (bodyConfig?.blocking === false) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2985
+ <span class="cstat-no" title="statement not covered" > reqLogger.warn('Non-blocking mode requested but not supported', {</span>
2986
+ <span class="cstat-no" title="statement not covered" > hint: 'Async task polling is not yet implemented. Request will be processed synchronously.'</span>
2987
+ <span class="cstat-no" title="statement not covered" > });</span>
2988
+ <span class="cstat-no" title="statement not covered" > }</span>
2989
+ &nbsp;
2990
+ // Auth pipeline (shared with /invoke)
2991
+ const auth = await validateInboundAuth(req, res, reqLogger, '/api/a2a/message:send');
2992
+ if (!auth) return;
2993
+ const { validation, identityVerified, publicKeyFingerprint } = auth;
2994
+ &nbsp;
2995
+ // Translate Google A2A format to internal
2996
+ const translated = translateGoogleToInternal(req.body);
2997
+ if (translated.error) {
2998
+ reqLogger.warn('Google A2A message validation failed', {
2999
+ tokenId: validation.id,
3000
+ error_code: translated.error.code,
3001
+ status_code: translated.error.status
3002
+ });
3003
+ return res.status(translated.error.status).json(withTracePayload({
3004
+ success: false,
3005
+ error: translated.error.code,
3006
+ message: translated.error.message
3007
+ }));
3008
+ }
3009
+ &nbsp;
3010
+ if (translated.skippedNonText &gt; 0) {
3011
+ reqLogger.debug('Skipped non-text parts in Google A2A message', {
3012
+ tokenId: validation.id,
3013
+ data: { skipped_count: translated.skippedNonText }
3014
+ });
3015
+ }
3016
+ &nbsp;
3017
+ // Validate message length
3018
+ if (translated.message.length &gt; MAX_MESSAGE_LENGTH) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
3019
+ <span class="cstat-no" title="statement not covered" > reqLogger.warn('Google A2A message too long', {</span>
3020
+ <span class="cstat-no" title="statement not covered" > tokenId: validation.id,</span>
3021
+ <span class="cstat-no" title="statement not covered" > error_code: 'REQUEST_INVALID_MESSAGE',</span>
3022
+ <span class="cstat-no" title="statement not covered" > status_code: 400,</span>
3023
+ <span class="cstat-no" title="statement not covered" > data: { message_length: translated.message.length }</span>
3024
+ <span class="cstat-no" title="statement not covered" > });</span>
3025
+ <span class="cstat-no" title="statement not covered" > return res.status(400).json(withTracePayload({</span>
3026
+ <span class="cstat-no" title="statement not covered" > success: false,</span>
3027
+ <span class="cstat-no" title="statement not covered" > error: 'invalid_message',</span>
3028
+ <span class="cstat-no" title="statement not covered" > message: `Message must be under ${MAX_MESSAGE_LENGTH} characters`</span>
3029
+ <span class="cstat-no" title="statement not covered" > }));</span>
3030
+ <span class="cstat-no" title="statement not covered" > }</span>
3031
+ &nbsp;
3032
+ const boundedTimeout = Math.max(MIN_TIMEOUT_SECONDS, Math.min(MAX_TIMEOUT_SECONDS, translated.timeout_seconds));
3033
+ &nbsp;
3034
+ // Build a2a context (same as /invoke)
3035
+ const isNewConversation = !translated.conversation_id;
3036
+ const conversationId = translated.conversation_id || `conv_${Date.now()}_${crypto.randomBytes(6).toString('hex')}`;
3037
+ const sanitizedCaller = translated.caller;
3038
+ &nbsp;
3039
+ const a2aContext = {
3040
+ mode: 'a2a',
3041
+ token_id: validation.id,
3042
+ token_name: validation.name,
3043
+ tier: validation.tier,
3044
+ capabilities: validation.capabilities,
3045
+ allowed_topics: validation.allowed_topics,
3046
+ allowed_goals: validation.allowed_goals,
3047
+ allowed_tools: validation.allowed_tools,
3048
+ timeout_ms: validation.timeout_ms,
3049
+ caller: sanitizedCaller,
3050
+ conversation_id: conversationId,
3051
+ trace_id: traceId,
3052
+ request_id: requestId,
3053
+ identity_verified: identityVerified,
3054
+ public_key_fingerprint: publicKeyFingerprint
3055
+ };
3056
+ &nbsp;
3057
+ // Ensure inbound caller exists as a contact
3058
+ let ensuredContact = null;
3059
+ try {
3060
+ ensuredContact = tokenStore.ensureInboundContact(sanitizedCaller, validation.id);
3061
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (_) {</span>
3062
+ <span class="cstat-no" title="statement not covered" > ensuredContact = null;</span>
3063
+ <span class="cstat-no" title="statement not covered" > }</span>
3064
+ &nbsp;
3065
+ // Track conversation if store available
3066
+ if (convStore) {
3067
+ try {
3068
+ convStore.startConversation({
3069
+ id: conversationId,
3070
+ contactId: ensuredContact?.id || validation.id,
3071
+ contactName: ensuredContact?.name || sanitizedCaller.name || validation.name,
3072
+ tokenId: validation.id,
3073
+ direction: 'inbound'
3074
+ });
3075
+ if (isNewConversation &amp;&amp; eventStore <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp; eventStore.isAvailable <span class="branch-0 cbranch-no" title="branch not covered" ></span>&amp;&amp; eventStore.isAvailable())</span> <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
3076
+ <span class="cstat-no" title="statement not covered" > eventStore.emitEvent('call.inbound', {</span>
3077
+ <span class="cstat-no" title="statement not covered" > conversation_id: conversationId,</span>
3078
+ <span class="cstat-no" title="statement not covered" > token_id: validation.id,</span>
3079
+ <span class="cstat-no" title="statement not covered" > caller_name: sanitizedCaller.name || validation.name || null,</span>
3080
+ <span class="cstat-no" title="statement not covered" > caller_owner: sanitizedCaller.owner || null</span>
3081
+ <span class="cstat-no" title="statement not covered" > }, {</span>
3082
+ <span class="cstat-no" title="statement not covered" > conversationId,</span>
3083
+ <span class="cstat-no" title="statement not covered" > contactId: ensuredContact?.id || validation.id</span>
3084
+ <span class="cstat-no" title="statement not covered" > });</span>
3085
+ <span class="cstat-no" title="statement not covered" > }</span>
3086
+ if (monitor) {
3087
+ monitor.trackActivity(conversationId, {
3088
+ ...sanitizedCaller,
3089
+ tier: validation.tier,
3090
+ capabilities: validation.capabilities,
3091
+ allowed_topics: validation.allowed_topics,
3092
+ allowed_goals: validation.allowed_goals,
3093
+ allowed_tools: validation.allowed_tools,
3094
+ trace_id: traceId,
3095
+ request_id: requestId
3096
+ });
3097
+ }
3098
+ convStore.addMessage(conversationId, {
3099
+ direction: 'inbound',
3100
+ role: 'user',
3101
+ content: translated.message
3102
+ });
3103
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
3104
+ <span class="cstat-no" title="statement not covered" > reqLogger.error('Conversation tracking error', {</span>
3105
+ <span class="cstat-no" title="statement not covered" > conversationId,</span>
3106
+ <span class="cstat-no" title="statement not covered" > tokenId: validation.id,</span>
3107
+ <span class="cstat-no" title="statement not covered" > error_code: 'CONVERSATION_TRACKING_FAILED',</span>
3108
+ <span class="cstat-no" title="statement not covered" > error: err</span>
3109
+ <span class="cstat-no" title="statement not covered" > });</span>
3110
+ <span class="cstat-no" title="statement not covered" > }</span>
3111
+ }
3112
+ &nbsp;
3113
+ try {
3114
+ const response = await handleMessage(translated.message, a2aContext, { timeout: boundedTimeout * 1000 });
3115
+ &nbsp;
3116
+ // Store outgoing response
3117
+ if (convStore) {
3118
+ try {
3119
+ convStore.addMessage(conversationId, {
3120
+ direction: 'outbound',
3121
+ role: 'assistant',
3122
+ content: response.text
3123
+ });
3124
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
3125
+ <span class="cstat-no" title="statement not covered" > reqLogger.error('Message storage error', {</span>
3126
+ <span class="cstat-no" title="statement not covered" > conversationId,</span>
3127
+ <span class="cstat-no" title="statement not covered" > tokenId: validation.id,</span>
3128
+ <span class="cstat-no" title="statement not covered" > error_code: 'CONVERSATION_MESSAGE_STORE_FAILED',</span>
3129
+ <span class="cstat-no" title="statement not covered" > error: err</span>
3130
+ <span class="cstat-no" title="statement not covered" > });</span>
3131
+ <span class="cstat-no" title="statement not covered" > }</span>
3132
+ }
3133
+ &nbsp;
3134
+ // Notify owner if configured
3135
+ if (validation.notify !== 'none') {
3136
+ notifyOwner({
3137
+ level: validation.notify,
3138
+ token: validation,
3139
+ caller: sanitizedCaller,
3140
+ message: translated.message,
3141
+ response: response.text,
3142
+ conversation_id: conversationId,
3143
+ trace_id: traceId,
3144
+ request_id: requestId
3145
+ }).catch(err =&gt; {
3146
+ <span class="cstat-no" title="statement not covered" > reqLogger.error('Failed to notify owner', {</span>
3147
+ <span class="cstat-no" title="statement not covered" > conversationId,</span>
3148
+ <span class="cstat-no" title="statement not covered" > tokenId: validation.id,</span>
3149
+ <span class="cstat-no" title="statement not covered" > error_code: 'OWNER_NOTIFY_FAILED',</span>
3150
+ <span class="cstat-no" title="statement not covered" > error: err</span>
3151
+ <span class="cstat-no" title="statement not covered" > });</span>
3152
+ });
3153
+ }
3154
+ &nbsp;
3155
+ reqLogger.info('Google A2A message:send completed', {
3156
+ conversationId,
3157
+ tokenId: validation.id,
3158
+ data: {
3159
+ duration_ms: Date.now() - startedAt,
3160
+ message_length: translated.message.length,
3161
+ is_new_conversation: isNewConversation
3162
+ }
3163
+ });
3164
+ &nbsp;
3165
+ // Translate response to Google A2A Task format
3166
+ const disclosure = validation.disclosure || 'minimal';
3167
+ const googleResponse = translateInternalToGoogle(
3168
+ response, conversationId, validation.tier, disclosure, validation.calls_remaining
3169
+ );
3170
+ res.json(googleResponse);
3171
+ &nbsp;
3172
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
3173
+ <span class="cstat-no" title="statement not covered" > reqLogger.error('Message handling error', {</span>
3174
+ <span class="cstat-no" title="statement not covered" > conversationId,</span>
3175
+ <span class="cstat-no" title="statement not covered" > tokenId: validation.id,</span>
3176
+ <span class="cstat-no" title="statement not covered" > error_code: 'MESSAGE_SEND_HANDLER_FAILED',</span>
3177
+ <span class="cstat-no" title="statement not covered" > status_code: 500,</span>
3178
+ <span class="cstat-no" title="statement not covered" > error: err,</span>
3179
+ <span class="cstat-no" title="statement not covered" > data: { duration_ms: Date.now() - startedAt }</span>
3180
+ <span class="cstat-no" title="statement not covered" > });</span>
3181
+ <span class="cstat-no" title="statement not covered" > res.status(500).json(withTracePayload({</span>
3182
+ <span class="cstat-no" title="statement not covered" > success: false,</span>
3183
+ <span class="cstat-no" title="statement not covered" > error: 'internal_error',</span>
3184
+ <span class="cstat-no" title="statement not covered" > message: 'Failed to process message'</span>
3185
+ <span class="cstat-no" title="statement not covered" > }));</span>
3186
+ <span class="cstat-no" title="statement not covered" > }</span>
3187
+ }
3188
+ router.post('/message\\:send', handleMessageSend);
3189
+ router.post('/message%3Asend', handleMessageSend);
3190
+ &nbsp;
3191
+ /**
3192
+ * POST /invoke
3193
+ * Call the agent
3194
+ */
3195
+ router.post('/invoke', async (req, res) =&gt; {
3196
+ const startedAt = Date.now();
3197
+ const traceId = resolveTraceId(req);
3198
+ const requestId = resolveRequestId(req);
3199
+ const reqLogger = logger.child({ traceId, requestId, event: 'invoke' });
3200
+ const withTracePayload = (payload) =&gt; ({ ...payload, trace_id: traceId, request_id: requestId });
3201
+ res.set('x-trace-id', traceId);
3202
+ res.set('x-request-id', requestId);
3203
+ reqLogger.info('Received invoke request', {
3204
+ data: {
3205
+ ip: req.ip,
3206
+ request_id: requestId,
3207
+ client_host: extractClientHost(req),
3208
+ forwarded_for: req.headers['x-forwarded-for'] || null,
3209
+ user_agent: req.headers['user-agent'] || null,
3210
+ has_auth_header: Boolean(req.headers.authorization)
3211
+ }
3212
+ });
3213
+ reqLogger.debug('Invoke request metadata', {
3214
+ event: 'invoke_request_metadata',
3215
+ data: normalizeRequestMetadata(req)
3216
+ });
3217
+ &nbsp;
3218
+ // Auth pipeline (shared with /message:send)
3219
+ const auth = await validateInboundAuth(req, res, reqLogger, '/api/a2a/invoke');
3220
+ if (!auth) return;
3221
+ const { validation, identityVerified, publicKeyFingerprint } = auth;
3222
+ &nbsp;
3223
+ // Extract and validate request
3224
+ const { message, conversation_id, caller, context, timeout_seconds = 60 } = req.body;
3225
+ &nbsp;
3226
+ if (!message) {
3227
+ reqLogger.warn('Invoke request missing message', {
3228
+ tokenId: validation.id,
3229
+ error_code: 'REQUEST_MISSING_MESSAGE',
3230
+ status_code: 400,
3231
+ hint: 'Include a non-empty string field `message` in the request body.'
3232
+ });
3233
+ return res.status(400).json(withTracePayload({
3234
+ success: false,
3235
+ error: 'missing_message',
3236
+ message: 'Message is required'
3237
+ }));
3238
+ }
3239
+ &nbsp;
3240
+ // Validate message length
3241
+ if (typeof message !== 'string' || message.length &gt; MAX_MESSAGE_LENGTH) {
3242
+ reqLogger.warn('Invoke request has invalid message payload', {
3243
+ tokenId: validation.id,
3244
+ error_code: 'REQUEST_INVALID_MESSAGE',
3245
+ status_code: 400,
3246
+ hint: `Ensure message is a string &lt;= ${MAX_MESSAGE_LENGTH} characters.`,
3247
+ data: {
3248
+ message_type: typeof message,
3249
+ message_length: typeof message === 'string' ? message.length : null
3250
+ }
3251
+ });
3252
+ return res.status(400).json(withTracePayload({
3253
+ success: false,
3254
+ error: 'invalid_message',
3255
+ message: `Message must be a string under ${MAX_MESSAGE_LENGTH} characters`
3256
+ }));
3257
+ }
3258
+ &nbsp;
3259
+ // Validate and bound timeout
3260
+ const boundedTimeout = Math.max(MIN_TIMEOUT_SECONDS, Math.min(MAX_TIMEOUT_SECONDS, Number(timeout_seconds) || 60));
3261
+ &nbsp;
3262
+ // Sanitize caller data (only allow expected fields)
3263
+ const sanitizedCaller = caller ? {
3264
+ name: String(caller.name <span class="branch-0 cbranch-no" title="branch not covered" >|| '')</span>.slice(0, 100),
3265
+ owner: String(caller.owner || '').slice(0, 100),
3266
+ instance: String(caller.instance || '').slice(0, 200),
3267
+ context: String(caller.context || '').slice(0, 500)
3268
+ } : {};
3269
+ &nbsp;
3270
+ // Build a2a context with secure conversation ID
3271
+ const isNewConversation = !conversation_id;
3272
+ const a2aContext = {
3273
+ mode: 'a2a',
3274
+ token_id: validation.id,
3275
+ token_name: validation.name,
3276
+ tier: validation.tier,
3277
+ capabilities: validation.capabilities,
3278
+ allowed_topics: validation.allowed_topics,
3279
+ allowed_goals: validation.allowed_goals,
3280
+ allowed_tools: validation.allowed_tools,
3281
+ timeout_ms: validation.timeout_ms,
3282
+ caller: sanitizedCaller,
3283
+ conversation_id: conversation_id || `conv_${Date.now()}_${crypto.randomBytes(6).toString('hex')}`,
3284
+ trace_id: traceId,
3285
+ request_id: requestId,
3286
+ // A2A-52: cryptographic identity verification status
3287
+ identity_verified: identityVerified,
3288
+ public_key_fingerprint: publicKeyFingerprint
3289
+ };
3290
+ &nbsp;
3291
+ // Ensure inbound caller exists as a contact (best-effort).
3292
+ let ensuredContact = null;
3293
+ try {
3294
+ ensuredContact = tokenStore.ensureInboundContact(sanitizedCaller, validation.id);
3295
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
3296
+ <span class="cstat-no" title="statement not covered" > ensuredContact = null;</span>
3297
+ <span class="cstat-no" title="statement not covered" > }</span>
3298
+ &nbsp;
3299
+ // Track conversation if store available
3300
+ if (convStore) {
3301
+ try {
3302
+ convStore.startConversation({
3303
+ id: a2aContext.conversation_id,
3304
+ // Standardize: store the local contact.id when available (fallback to token id otherwise).
3305
+ contactId: ensuredContact?.id || validation.id,
3306
+ contactName: ensuredContact?.name || sanitizedCaller.name || validation.name,
3307
+ tokenId: validation.id,
3308
+ direction: 'inbound'
3309
+ });
3310
+ if (isNewConversation &amp;&amp; eventStore <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp; eventStore.isAvailable <span class="branch-0 cbranch-no" title="branch not covered" ></span>&amp;&amp; eventStore.isAvailable())</span> <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
3311
+ <span class="cstat-no" title="statement not covered" > eventStore.emitEvent('call.inbound', {</span>
3312
+ <span class="cstat-no" title="statement not covered" > conversation_id: a2aContext.conversation_id,</span>
3313
+ <span class="cstat-no" title="statement not covered" > token_id: validation.id,</span>
3314
+ <span class="cstat-no" title="statement not covered" > caller_name: sanitizedCaller.name || validation.name || null,</span>
3315
+ <span class="cstat-no" title="statement not covered" > caller_owner: sanitizedCaller.owner || null</span>
3316
+ <span class="cstat-no" title="statement not covered" > }, {</span>
3317
+ <span class="cstat-no" title="statement not covered" > conversationId: a2aContext.conversation_id,</span>
3318
+ <span class="cstat-no" title="statement not covered" > contactId: ensuredContact?.id || validation.id</span>
3319
+ <span class="cstat-no" title="statement not covered" > });</span>
3320
+ <span class="cstat-no" title="statement not covered" > }</span>
3321
+
3322
+ // Track activity for auto-conclude
3323
+ if (monitor) {
3324
+ monitor.trackActivity(a2aContext.conversation_id, {
3325
+ ...sanitizedCaller,
3326
+ tier: validation.tier,
3327
+ capabilities: validation.capabilities,
3328
+ allowed_topics: validation.allowed_topics,
3329
+ allowed_goals: validation.allowed_goals,
3330
+ allowed_tools: validation.allowed_tools,
3331
+ trace_id: traceId,
3332
+ request_id: requestId
3333
+ });
3334
+ }
3335
+
3336
+ // Store incoming message
3337
+ convStore.addMessage(a2aContext.conversation_id, {
3338
+ direction: 'inbound',
3339
+ role: 'user',
3340
+ content: message
3341
+ });
3342
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
3343
+ <span class="cstat-no" title="statement not covered" > reqLogger.error('Conversation tracking error', {</span>
3344
+ <span class="cstat-no" title="statement not covered" > conversationId: a2aContext.conversation_id,</span>
3345
+ <span class="cstat-no" title="statement not covered" > tokenId: validation.id,</span>
3346
+ <span class="cstat-no" title="statement not covered" > error_code: 'CONVERSATION_TRACKING_FAILED',</span>
3347
+ <span class="cstat-no" title="statement not covered" > hint: 'Check SQLite conversation DB file permissions and schema availability.',</span>
3348
+ <span class="cstat-no" title="statement not covered" > error: err,</span>
3349
+ <span class="cstat-no" title="statement not covered" > data: {</span>
3350
+ <span class="cstat-no" title="statement not covered" > phase: 'conversation_tracking'</span>
3351
+ <span class="cstat-no" title="statement not covered" > }</span>
3352
+ <span class="cstat-no" title="statement not covered" > });</span>
3353
+ <span class="cstat-no" title="statement not covered" > }</span>
3354
+ }
3355
+ &nbsp;
3356
+ try {
3357
+ // Handle the message
3358
+ const response = await handleMessage(message, a2aContext, { timeout: boundedTimeout * 1000 });
3359
+
3360
+ // Store outgoing response
3361
+ if (convStore) {
3362
+ try {
3363
+ convStore.addMessage(a2aContext.conversation_id, {
3364
+ direction: 'outbound',
3365
+ role: 'assistant',
3366
+ content: response.text
3367
+ });
3368
+ } catch (err) {
3369
+ reqLogger.error('Message storage error', {
3370
+ conversationId: a2aContext.conversation_id,
3371
+ tokenId: validation.id,
3372
+ error_code: 'CONVERSATION_MESSAGE_STORE_FAILED',
3373
+ hint: 'Check SQLite conversation DB write access and disk availability.',
3374
+ error: err,
3375
+ data: {
3376
+ phase: 'message_store'
3377
+ }
3378
+ });
3379
+ }
3380
+ }
3381
+ &nbsp;
3382
+ // Notify owner if configured
3383
+ if (validation.notify !== 'none') {
3384
+ notifyOwner({
3385
+ level: validation.notify,
3386
+ token: validation,
3387
+ caller,
3388
+ context,
3389
+ message,
3390
+ response: response.text,
3391
+ conversation_id: a2aContext.conversation_id,
3392
+ trace_id: traceId,
3393
+ request_id: requestId
3394
+ }).catch(err =&gt; {
3395
+ <span class="cstat-no" title="statement not covered" > reqLogger.error('Failed to notify owner', {</span>
3396
+ <span class="cstat-no" title="statement not covered" > conversationId: a2aContext.conversation_id,</span>
3397
+ <span class="cstat-no" title="statement not covered" > tokenId: validation.id,</span>
3398
+ <span class="cstat-no" title="statement not covered" > error_code: 'OWNER_NOTIFY_FAILED',</span>
3399
+ <span class="cstat-no" title="statement not covered" > hint: 'Verify runtime notify channel settings and external notifier health.',</span>
3400
+ <span class="cstat-no" title="statement not covered" > error: err,</span>
3401
+ <span class="cstat-no" title="statement not covered" > data: {</span>
3402
+ <span class="cstat-no" title="statement not covered" > phase: 'owner_notify'</span>
3403
+ <span class="cstat-no" title="statement not covered" > }</span>
3404
+ <span class="cstat-no" title="statement not covered" > });</span>
3405
+ });
3406
+ }
3407
+ &nbsp;
3408
+ reqLogger.info('Invoke request completed', {
3409
+ conversationId: a2aContext.conversation_id,
3410
+ tokenId: validation.id,
3411
+ requestId,
3412
+ data: {
3413
+ duration_ms: Date.now() - startedAt,
3414
+ message_length: message.length,
3415
+ is_new_conversation: isNewConversation
3416
+ }
3417
+ });
3418
+ &nbsp;
3419
+ const responsePayload = {
3420
+ success: true,
3421
+ trace_id: traceId,
3422
+ request_id: requestId,
3423
+ conversation_id: a2aContext.conversation_id,
3424
+ response: response.text,
3425
+ can_continue: response.canContinue !== false,
3426
+ tokens_remaining: validation.calls_remaining
3427
+ };
3428
+ &nbsp;
3429
+ if (response.collaboration) {
3430
+ responsePayload.collaboration = response.collaboration;
3431
+ }
3432
+ &nbsp;
3433
+ res.json(responsePayload);
3434
+ &nbsp;
3435
+ } catch (err) {
3436
+ reqLogger.error('Message handling error', {
3437
+ conversationId: a2aContext.conversation_id,
3438
+ tokenId: validation.id,
3439
+ error_code: 'INVOKE_HANDLER_FAILED',
3440
+ status_code: 500,
3441
+ hint: 'Inspect handler/runtime logs in this trace and validate upstream dependencies.',
3442
+ error: err,
3443
+ data: {
3444
+ duration_ms: Date.now() - startedAt
3445
+ }
3446
+ });
3447
+ res.status(500).json(withTracePayload({
3448
+ success: false,
3449
+ error: 'internal_error',
3450
+ message: 'Failed to process message'
3451
+ }));
3452
+ }
3453
+ });
3454
+ &nbsp;
3455
+ /**
3456
+ * POST /end
3457
+ * End a conversation and trigger summary generation
3458
+ */
3459
+ router.post('/end', async (req, res) =&gt; {
3460
+ const startedAt = Date.now();
3461
+ const traceId = resolveTraceId(req);
3462
+ const requestId = resolveRequestId(req);
3463
+ const reqLogger = logger.child({ traceId, requestId, event: 'end' });
3464
+ const withTracePayload = (payload) =&gt; ({ ...payload, trace_id: traceId, request_id: requestId });
3465
+ res.set('x-trace-id', traceId);
3466
+ res.set('x-request-id', requestId);
3467
+ reqLogger.info('Received end request', {
3468
+ data: {
3469
+ request_id: requestId,
3470
+ ip: req.ip,
3471
+ client_host: extractClientHost(req),
3472
+ has_auth_header: Boolean(req.headers.authorization),
3473
+ has_conversation_id: Boolean(req.body &amp;&amp; req.body.conversation_id)
3474
+ }
3475
+ });
3476
+ &nbsp;
3477
+ // Extract token
3478
+ const authHeader = req.headers.authorization;
3479
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
3480
+ reqLogger.warn('End request missing bearer token', {
3481
+ error_code: 'AUTH_MISSING_BEARER',
3482
+ status_code: 401,
3483
+ hint: 'Send Authorization: Bearer &lt;a2a_token&gt;.'
3484
+ });
3485
+ return res.status(401).json(withTracePayload({
3486
+ success: false,
3487
+ error: 'unauthorized',
3488
+ message: 'Authorization header required'
3489
+ }));
3490
+ }
3491
+ &nbsp;
3492
+ const token = authHeader.slice(7);
3493
+ const validation = tokenStore.validate(token);
3494
+ if (!validation.valid) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
3495
+ <span class="cstat-no" title="statement not covered" > reqLogger.warn('End request token validation failed', {</span>
3496
+ <span class="cstat-no" title="statement not covered" > error_code: 'TOKEN_INVALID_OR_EXPIRED',</span>
3497
+ <span class="cstat-no" title="statement not covered" > status_code: 401,</span>
3498
+ <span class="cstat-no" title="statement not covered" > hint: 'Use a currently valid invite token for conversation end calls.'</span>
3499
+ <span class="cstat-no" title="statement not covered" > });</span>
3500
+ <span class="cstat-no" title="statement not covered" > return res.status(401).json(withTracePayload({ </span>
3501
+ <span class="cstat-no" title="statement not covered" > success: false, </span>
3502
+ <span class="cstat-no" title="statement not covered" > error: 'unauthorized', </span>
3503
+ <span class="cstat-no" title="statement not covered" > message: 'Invalid or expired token'</span>
3504
+ <span class="cstat-no" title="statement not covered" > }));</span>
3505
+ <span class="cstat-no" title="statement not covered" > }</span>
3506
+ &nbsp;
3507
+ // A2A-52: Ed25519 signature verification for /end (same as /invoke)
3508
+ const endSigCheck = verifySigHeaders(req, validation, '/api/a2a/end', reqLogger, withTracePayload);
3509
+ if (endSigCheck.error) {
3510
+ return res.status(endSigCheck.error.status).json(withTracePayload(endSigCheck.error.body));
3511
+ }
3512
+ &nbsp;
3513
+ const { conversation_id } = req.body;
3514
+ if (!conversation_id) {
3515
+ reqLogger.warn('End request missing conversation_id', {
3516
+ tokenId: validation.id,
3517
+ error_code: 'REQUEST_MISSING_CONVERSATION_ID',
3518
+ status_code: 400,
3519
+ hint: 'Provide `conversation_id` returned from /invoke.'
3520
+ });
3521
+ return res.status(400).json(withTracePayload({
3522
+ success: false,
3523
+ error: 'missing_conversation_id',
3524
+ message: 'conversation_id is required'
3525
+ }));
3526
+ }
3527
+ &nbsp;
3528
+ const convStore = getConversationStore({
3529
+ eventStore,
3530
+ configDir: tokenStore.configDir
3531
+ });
3532
+ if (!convStore) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
3533
+ <span class="cstat-no" title="statement not covered" > return res.json(withTracePayload({ success: true, message: 'Conversation storage not enabled' }));</span>
3534
+ <span class="cstat-no" title="statement not covered" > }</span>
3535
+ &nbsp;
3536
+ try {
3537
+ // Conclude with summarizer if available
3538
+ const summarizer = options.summarizer <span class="branch-0 cbranch-no" title="branch not covered" >|| null;</span>
3539
+ const ownerContext = options.ownerContext || {};
3540
+
3541
+ const result = await convStore.concludeConversation(conversation_id, {
3542
+ summarizer,
3543
+ ownerContext
3544
+ });
3545
+ &nbsp;
3546
+ // Notify owner of conversation conclusion
3547
+ if (validation.notify !== 'none' &amp;&amp; result.success) {
3548
+ const conv = convStore.getConversationContext(conversation_id);
3549
+ notifyOwner({
3550
+ level: validation.notify,
3551
+ type: 'conversation_concluded',
3552
+ token: validation,
3553
+ conversation: conv,
3554
+ trace_id: traceId,
3555
+ request_id: requestId
3556
+ }).catch(err =&gt; {
3557
+ <span class="cstat-no" title="statement not covered" > reqLogger.error('Failed to notify owner after conversation end', {</span>
3558
+ <span class="cstat-no" title="statement not covered" > conversationId: conversation_id,</span>
3559
+ <span class="cstat-no" title="statement not covered" > tokenId: validation.id,</span>
3560
+ <span class="cstat-no" title="statement not covered" > error_code: 'OWNER_NOTIFY_FAILED',</span>
3561
+ <span class="cstat-no" title="statement not covered" > hint: 'Verify notify runtime integration for post-conclusion notifications.',</span>
3562
+ <span class="cstat-no" title="statement not covered" > error: err,</span>
3563
+ <span class="cstat-no" title="statement not covered" > data: {</span>
3564
+ <span class="cstat-no" title="statement not covered" > phase: 'conversation_end_notify'</span>
3565
+ <span class="cstat-no" title="statement not covered" > }</span>
3566
+ <span class="cstat-no" title="statement not covered" > });</span>
3567
+ });
3568
+ }
3569
+ &nbsp;
3570
+ reqLogger.info('End request completed', {
3571
+ conversationId: conversation_id,
3572
+ tokenId: validation.id,
3573
+ requestId,
3574
+ data: {
3575
+ duration_ms: Date.now() - startedAt,
3576
+ status: result.success ? 'concluded' <span class="branch-0 cbranch-no" title="branch not covered" >: 'unchanged'</span>
3577
+ }
3578
+ });
3579
+ &nbsp;
3580
+ res.json({
3581
+ success: true,
3582
+ trace_id: traceId,
3583
+ request_id: requestId,
3584
+ conversation_id,
3585
+ status: 'concluded',
3586
+ summary: result.summary
3587
+ });
3588
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
3589
+ <span class="cstat-no" title="statement not covered" > reqLogger.error('End conversation error', {</span>
3590
+ <span class="cstat-no" title="statement not covered" > conversationId: conversation_id,</span>
3591
+ <span class="cstat-no" title="statement not covered" > tokenId: validation.id,</span>
3592
+ <span class="cstat-no" title="statement not covered" > error_code: 'END_CONVERSATION_FAILED',</span>
3593
+ <span class="cstat-no" title="statement not covered" > status_code: 500,</span>
3594
+ <span class="cstat-no" title="statement not covered" > hint: 'Check conversation existence and summarizer runtime status for this trace.',</span>
3595
+ <span class="cstat-no" title="statement not covered" > error: err,</span>
3596
+ <span class="cstat-no" title="statement not covered" > data: {</span>
3597
+ <span class="cstat-no" title="statement not covered" > duration_ms: Date.now() - startedAt</span>
3598
+ <span class="cstat-no" title="statement not covered" > }</span>
3599
+ <span class="cstat-no" title="statement not covered" > });</span>
3600
+ <span class="cstat-no" title="statement not covered" > res.status(500).json(withTracePayload({</span>
3601
+ <span class="cstat-no" title="statement not covered" > success: false,</span>
3602
+ <span class="cstat-no" title="statement not covered" > error: 'internal_error',</span>
3603
+ <span class="cstat-no" title="statement not covered" > message: 'Failed to end conversation'</span>
3604
+ <span class="cstat-no" title="statement not covered" > }));</span>
3605
+ <span class="cstat-no" title="statement not covered" > }</span>
3606
+ });
3607
+ &nbsp;
3608
+ /**
3609
+ * GET /conversations
3610
+ * List conversations (requires auth)
3611
+ * This is for the agent owner, not remote callers
3612
+ */
3613
+ router.get('/conversations', (req, res) =&gt; {
3614
+ <span class="cstat-no" title="statement not covered" > // This endpoint should be protected by local auth, not A2A tokens</span>
3615
+ <span class="cstat-no" title="statement not covered" > // For now, require an admin token or local access</span>
3616
+ <span class="cstat-no" title="statement not covered" > const expected = process.env.A2A_ADMIN_TOKEN;</span>
3617
+ <span class="cstat-no" title="statement not covered" > const adminToken = req.headers['x-admin-token'];</span>
3618
+ <span class="cstat-no" title="statement not covered" > if (!isDirectLocalRequest(req)) {</span>
3619
+ <span class="cstat-no" title="statement not covered" > if (!expected) {</span>
3620
+ <span class="cstat-no" title="statement not covered" > return res.status(401).json({</span>
3621
+ <span class="cstat-no" title="statement not covered" > error: 'admin_token_required',</span>
3622
+ <span class="cstat-no" title="statement not covered" > message: 'Set A2A_ADMIN_TOKEN to access conversation admin routes from non-local addresses'</span>
3623
+ <span class="cstat-no" title="statement not covered" > });</span>
3624
+ <span class="cstat-no" title="statement not covered" > }</span>
3625
+ <span class="cstat-no" title="statement not covered" > if (!timingSafeTokenEqual(adminToken, expected)) {</span>
3626
+ <span class="cstat-no" title="statement not covered" > return res.status(401).json({ error: 'unauthorized' });</span>
3627
+ <span class="cstat-no" title="statement not covered" > }</span>
3628
+ <span class="cstat-no" title="statement not covered" > }</span>
3629
+ <span class="cstat-no" title="statement not covered" ></span>
3630
+ <span class="cstat-no" title="statement not covered" > const convStore = getConversationStore();</span>
3631
+ <span class="cstat-no" title="statement not covered" > if (!convStore) {</span>
3632
+ <span class="cstat-no" title="statement not covered" > return res.json({ conversations: [], message: 'Conversation storage not enabled' });</span>
3633
+ <span class="cstat-no" title="statement not covered" > }</span>
3634
+ <span class="cstat-no" title="statement not covered" ></span>
3635
+ <span class="cstat-no" title="statement not covered" > const { contact_id, status, limit = 20 } = req.query;</span>
3636
+ <span class="cstat-no" title="statement not covered" > </span>
3637
+ <span class="cstat-no" title="statement not covered" > const conversations = convStore.listConversations({</span>
3638
+ <span class="cstat-no" title="statement not covered" > contactId: contact_id,</span>
3639
+ <span class="cstat-no" title="statement not covered" > status,</span>
3640
+ <span class="cstat-no" title="statement not covered" > limit: Math.min(100, Math.max(1, Number.parseInt(String(limit), 10) || 20)),</span>
3641
+ <span class="cstat-no" title="statement not covered" > includeMessages: false</span>
3642
+ <span class="cstat-no" title="statement not covered" > });</span>
3643
+ <span class="cstat-no" title="statement not covered" ></span>
3644
+ <span class="cstat-no" title="statement not covered" > res.json({ conversations });</span>
3645
+ });
3646
+ &nbsp;
3647
+ /**
3648
+ * GET /conversations/:id
3649
+ * Get conversation details with context
3650
+ */
3651
+ router.get('/conversations/:id', (req, res) =&gt; {
3652
+ <span class="cstat-no" title="statement not covered" > const expected = process.env.A2A_ADMIN_TOKEN;</span>
3653
+ <span class="cstat-no" title="statement not covered" > const adminToken = req.headers['x-admin-token'];</span>
3654
+ <span class="cstat-no" title="statement not covered" > if (!isDirectLocalRequest(req)) {</span>
3655
+ <span class="cstat-no" title="statement not covered" > if (!expected) {</span>
3656
+ <span class="cstat-no" title="statement not covered" > return res.status(401).json({</span>
3657
+ <span class="cstat-no" title="statement not covered" > error: 'admin_token_required',</span>
3658
+ <span class="cstat-no" title="statement not covered" > message: 'Set A2A_ADMIN_TOKEN to access conversation admin routes from non-local addresses'</span>
3659
+ <span class="cstat-no" title="statement not covered" > });</span>
3660
+ <span class="cstat-no" title="statement not covered" > }</span>
3661
+ <span class="cstat-no" title="statement not covered" > if (!timingSafeTokenEqual(adminToken, expected)) {</span>
3662
+ <span class="cstat-no" title="statement not covered" > return res.status(401).json({ error: 'unauthorized' });</span>
3663
+ <span class="cstat-no" title="statement not covered" > }</span>
3664
+ <span class="cstat-no" title="statement not covered" > }</span>
3665
+ <span class="cstat-no" title="statement not covered" ></span>
3666
+ <span class="cstat-no" title="statement not covered" > const convStore = getConversationStore();</span>
3667
+ <span class="cstat-no" title="statement not covered" > if (!convStore) {</span>
3668
+ <span class="cstat-no" title="statement not covered" > return res.status(404).json({ error: 'conversation_storage_disabled' });</span>
3669
+ <span class="cstat-no" title="statement not covered" > }</span>
3670
+ <span class="cstat-no" title="statement not covered" ></span>
3671
+ <span class="cstat-no" title="statement not covered" > const { recent_messages = 10 } = req.query;</span>
3672
+ <span class="cstat-no" title="statement not covered" > const context = convStore.getConversationContext(</span>
3673
+ <span class="cstat-no" title="statement not covered" > req.params.id,</span>
3674
+ <span class="cstat-no" title="statement not covered" > Math.min(50, Math.max(1, Number.parseInt(String(recent_messages), 10) || 10))</span>
3675
+ <span class="cstat-no" title="statement not covered" > );</span>
3676
+ <span class="cstat-no" title="statement not covered" ></span>
3677
+ <span class="cstat-no" title="statement not covered" > if (!context) {</span>
3678
+ <span class="cstat-no" title="statement not covered" > return res.status(404).json({ error: 'conversation_not_found' });</span>
3679
+ <span class="cstat-no" title="statement not covered" > }</span>
3680
+ <span class="cstat-no" title="statement not covered" ></span>
3681
+ <span class="cstat-no" title="statement not covered" > res.json(context);</span>
3682
+ });
3683
+ &nbsp;
3684
+ return router;
3685
+ }
3686
+ &nbsp;
3687
+ /**
3688
+ * Default message handler (placeholder)
3689
+ */
3690
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function defaultMessageHandler(message, context, options) {</span></span>
3691
+ <span class="cstat-no" title="statement not covered" > return {</span>
3692
+ <span class="cstat-no" title="statement not covered" > text: `[A2A Active] Received message from ${context.caller?.name || 'unknown'}. Agent integration pending.`,</span>
3693
+ <span class="cstat-no" title="statement not covered" > canContinue: true</span>
3694
+ <span class="cstat-no" title="statement not covered" > };</span>
3695
+ <span class="cstat-no" title="statement not covered" >}</span>
3696
+ &nbsp;
3697
+ module.exports = {
3698
+ createRoutes,
3699
+ checkRateLimit,
3700
+ timingSafeTokenEqual,
3701
+ // Exposed for testing only
3702
+ _rateLimits: rateLimits,
3703
+ _RATE_LIMIT_MAX_ENTRIES: RATE_LIMIT_MAX_ENTRIES
3704
+ };
3705
+ &nbsp;</pre></td></tr></table></pre>
3706
+
3707
+ <div class='push'></div><!-- for sticky footer -->
3708
+ </div><!-- /wrapper -->
3709
+ <div class='footer quiet pad2 space-top1 center small'>
3710
+ Code coverage generated by
3711
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
3712
+ at 2026-03-03T22:25:10.857Z
3713
+ </div>
3714
+ <script src="../../prettify.js"></script>
3715
+ <script>
3716
+ window.onload = function () {
3717
+ prettyPrint();
3718
+ };
3719
+ </script>
3720
+ <script src="../../sorter.js"></script>
3721
+ <script src="../../block-navigation.js"></script>
3722
+ </body>
3723
+ </html>
3724
+