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,2173 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/lib/claude-subagent.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/lib</a> claude-subagent.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">87.21% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>607/696</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">67.28% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>72/107</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">94.44% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>17/18</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">87.21% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>607/696</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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">4x</span>
763
+ <span class="cline-any cline-yes">4x</span>
764
+ <span class="cline-any cline-yes">4x</span>
765
+ <span class="cline-any cline-yes">4x</span>
766
+ <span class="cline-any cline-yes">4x</span>
767
+ <span class="cline-any cline-yes">4x</span>
768
+ <span class="cline-any cline-yes">4x</span>
769
+ <span class="cline-any cline-yes">4x</span>
770
+ <span class="cline-any cline-yes">4x</span>
771
+ <span class="cline-any cline-yes">4x</span>
772
+ <span class="cline-any cline-yes">4x</span>
773
+ <span class="cline-any cline-yes">4x</span>
774
+ <span class="cline-any cline-yes">4x</span>
775
+ <span class="cline-any cline-yes">4x</span>
776
+ <span class="cline-any cline-yes">4x</span>
777
+ <span class="cline-any cline-yes">4x</span>
778
+ <span class="cline-any cline-yes">4x</span>
779
+ <span class="cline-any cline-yes">4x</span>
780
+ <span class="cline-any cline-yes">4x</span>
781
+ <span class="cline-any cline-yes">4x</span>
782
+ <span class="cline-any cline-yes">4x</span>
783
+ <span class="cline-any cline-yes">4x</span>
784
+ <span class="cline-any cline-yes">4x</span>
785
+ <span class="cline-any cline-yes">4x</span>
786
+ <span class="cline-any cline-yes">4x</span>
787
+ <span class="cline-any cline-yes">4x</span>
788
+ <span class="cline-any cline-yes">4x</span>
789
+ <span class="cline-any cline-yes">4x</span>
790
+ <span class="cline-any cline-yes">4x</span>
791
+ <span class="cline-any cline-yes">4x</span>
792
+ <span class="cline-any cline-yes">4x</span>
793
+ <span class="cline-any cline-yes">4x</span>
794
+ <span class="cline-any cline-yes">4x</span>
795
+ <span class="cline-any cline-yes">4x</span>
796
+ <span class="cline-any cline-yes">4x</span>
797
+ <span class="cline-any cline-yes">4x</span>
798
+ <span class="cline-any cline-yes">4x</span>
799
+ <span class="cline-any cline-yes">4x</span>
800
+ <span class="cline-any cline-yes">6x</span>
801
+ <span class="cline-any cline-yes">6x</span>
802
+ <span class="cline-any cline-yes">6x</span>
803
+ <span class="cline-any cline-yes">6x</span>
804
+ <span class="cline-any cline-yes">4x</span>
805
+ <span class="cline-any cline-yes">17x</span>
806
+ <span class="cline-any cline-yes">17x</span>
807
+ <span class="cline-any cline-yes">17x</span>
808
+ <span class="cline-any cline-yes">17x</span>
809
+ <span class="cline-any cline-yes">17x</span>
810
+ <span class="cline-any cline-yes">6x</span>
811
+ <span class="cline-any cline-yes">6x</span>
812
+ <span class="cline-any cline-yes">6x</span>
813
+ <span class="cline-any cline-yes">6x</span>
814
+ <span class="cline-any cline-yes">6x</span>
815
+ <span class="cline-any cline-yes">17x</span>
816
+ <span class="cline-any cline-yes">17x</span>
817
+ <span class="cline-any cline-yes">4x</span>
818
+ <span class="cline-any cline-yes">18x</span>
819
+ <span class="cline-any cline-yes">18x</span>
820
+ <span class="cline-any cline-yes">18x</span>
821
+ <span class="cline-any cline-yes">18x</span>
822
+ <span class="cline-any cline-yes">4x</span>
823
+ <span class="cline-any cline-yes">4x</span>
824
+ <span class="cline-any cline-yes">4x</span>
825
+ <span class="cline-any cline-yes">4x</span>
826
+ <span class="cline-any cline-yes">1x</span>
827
+ <span class="cline-any cline-yes">1x</span>
828
+ <span class="cline-any cline-yes">1x</span>
829
+ <span class="cline-any cline-yes">1x</span>
830
+ <span class="cline-any cline-yes">1x</span>
831
+ <span class="cline-any cline-yes">1x</span>
832
+ <span class="cline-any cline-yes">1x</span>
833
+ <span class="cline-any cline-yes">1x</span>
834
+ <span class="cline-any cline-yes">4x</span>
835
+ <span class="cline-any cline-yes">4x</span>
836
+ <span class="cline-any cline-yes">4x</span>
837
+ <span class="cline-any cline-yes">4x</span>
838
+ <span class="cline-any cline-yes">4x</span>
839
+ <span class="cline-any cline-yes">4x</span>
840
+ <span class="cline-any cline-yes">4x</span>
841
+ <span class="cline-any cline-yes">4x</span>
842
+ <span class="cline-any cline-yes">4x</span>
843
+ <span class="cline-any cline-yes">4x</span>
844
+ <span class="cline-any cline-yes">4x</span>
845
+ <span class="cline-any cline-yes">4x</span>
846
+ <span class="cline-any cline-yes">4x</span>
847
+ <span class="cline-any cline-yes">4x</span>
848
+ <span class="cline-any cline-yes">4x</span>
849
+ <span class="cline-any cline-yes">4x</span>
850
+ <span class="cline-any cline-yes">4x</span>
851
+ <span class="cline-any cline-yes">4x</span>
852
+ <span class="cline-any cline-yes">4x</span>
853
+ <span class="cline-any cline-yes">9x</span>
854
+ <span class="cline-any cline-yes">9x</span>
855
+ <span class="cline-any cline-yes">9x</span>
856
+ <span class="cline-any cline-yes">9x</span>
857
+ <span class="cline-any cline-yes">9x</span>
858
+ <span class="cline-any cline-yes">9x</span>
859
+ <span class="cline-any cline-yes">9x</span>
860
+ <span class="cline-any cline-yes">9x</span>
861
+ <span class="cline-any cline-yes">9x</span>
862
+ <span class="cline-any cline-yes">9x</span>
863
+ <span class="cline-any cline-yes">9x</span>
864
+ <span class="cline-any cline-yes">9x</span>
865
+ <span class="cline-any cline-yes">9x</span>
866
+ <span class="cline-any cline-yes">9x</span>
867
+ <span class="cline-any cline-yes">9x</span>
868
+ <span class="cline-any cline-yes">9x</span>
869
+ <span class="cline-any cline-yes">9x</span>
870
+ <span class="cline-any cline-yes">9x</span>
871
+ <span class="cline-any cline-yes">9x</span>
872
+ <span class="cline-any cline-yes">9x</span>
873
+ <span class="cline-any cline-yes">9x</span>
874
+ <span class="cline-any cline-yes">9x</span>
875
+ <span class="cline-any cline-yes">9x</span>
876
+ <span class="cline-any cline-yes">9x</span>
877
+ <span class="cline-any cline-yes">9x</span>
878
+ <span class="cline-any cline-yes">9x</span>
879
+ <span class="cline-any cline-yes">9x</span>
880
+ <span class="cline-any cline-yes">9x</span>
881
+ <span class="cline-any cline-yes">9x</span>
882
+ <span class="cline-any cline-yes">9x</span>
883
+ <span class="cline-any cline-yes">9x</span>
884
+ <span class="cline-any cline-yes">9x</span>
885
+ <span class="cline-any cline-yes">9x</span>
886
+ <span class="cline-any cline-yes">9x</span>
887
+ <span class="cline-any cline-yes">9x</span>
888
+ <span class="cline-any cline-yes">9x</span>
889
+ <span class="cline-any cline-yes">9x</span>
890
+ <span class="cline-any cline-yes">9x</span>
891
+ <span class="cline-any cline-yes">9x</span>
892
+ <span class="cline-any cline-yes">9x</span>
893
+ <span class="cline-any cline-yes">9x</span>
894
+ <span class="cline-any cline-yes">9x</span>
895
+ <span class="cline-any cline-yes">9x</span>
896
+ <span class="cline-any cline-yes">9x</span>
897
+ <span class="cline-any cline-yes">9x</span>
898
+ <span class="cline-any cline-yes">9x</span>
899
+ <span class="cline-any cline-yes">9x</span>
900
+ <span class="cline-any cline-yes">9x</span>
901
+ <span class="cline-any cline-yes">9x</span>
902
+ <span class="cline-any cline-yes">9x</span>
903
+ <span class="cline-any cline-yes">9x</span>
904
+ <span class="cline-any cline-yes">9x</span>
905
+ <span class="cline-any cline-yes">9x</span>
906
+ <span class="cline-any cline-yes">9x</span>
907
+ <span class="cline-any cline-yes">9x</span>
908
+ <span class="cline-any cline-yes">9x</span>
909
+ <span class="cline-any cline-yes">9x</span>
910
+ <span class="cline-any cline-yes">9x</span>
911
+ <span class="cline-any cline-yes">9x</span>
912
+ <span class="cline-any cline-yes">9x</span>
913
+ <span class="cline-any cline-yes">9x</span>
914
+ <span class="cline-any cline-yes">9x</span>
915
+ <span class="cline-any cline-yes">9x</span>
916
+ <span class="cline-any cline-yes">9x</span>
917
+ <span class="cline-any cline-yes">9x</span>
918
+ <span class="cline-any cline-yes">9x</span>
919
+ <span class="cline-any cline-yes">9x</span>
920
+ <span class="cline-any cline-yes">9x</span>
921
+ <span class="cline-any cline-yes">9x</span>
922
+ <span class="cline-any cline-yes">9x</span>
923
+ <span class="cline-any cline-yes">9x</span>
924
+ <span class="cline-any cline-yes">9x</span>
925
+ <span class="cline-any cline-yes">9x</span>
926
+ <span class="cline-any cline-yes">9x</span>
927
+ <span class="cline-any cline-yes">9x</span>
928
+ <span class="cline-any cline-yes">9x</span>
929
+ <span class="cline-any cline-yes">9x</span>
930
+ <span class="cline-any cline-yes">9x</span>
931
+ <span class="cline-any cline-yes">9x</span>
932
+ <span class="cline-any cline-yes">9x</span>
933
+ <span class="cline-any cline-yes">9x</span>
934
+ <span class="cline-any cline-yes">9x</span>
935
+ <span class="cline-any cline-yes">9x</span>
936
+ <span class="cline-any cline-yes">9x</span>
937
+ <span class="cline-any cline-yes">9x</span>
938
+ <span class="cline-any cline-yes">9x</span>
939
+ <span class="cline-any cline-yes">9x</span>
940
+ <span class="cline-any cline-yes">9x</span>
941
+ <span class="cline-any cline-yes">9x</span>
942
+ <span class="cline-any cline-yes">9x</span>
943
+ <span class="cline-any cline-yes">9x</span>
944
+ <span class="cline-any cline-yes">9x</span>
945
+ <span class="cline-any cline-yes">9x</span>
946
+ <span class="cline-any cline-yes">9x</span>
947
+ <span class="cline-any cline-yes">9x</span>
948
+ <span class="cline-any cline-yes">9x</span>
949
+ <span class="cline-any cline-yes">9x</span>
950
+ <span class="cline-any cline-yes">9x</span>
951
+ <span class="cline-any cline-yes">9x</span>
952
+ <span class="cline-any cline-yes">9x</span>
953
+ <span class="cline-any cline-yes">9x</span>
954
+ <span class="cline-any cline-yes">9x</span>
955
+ <span class="cline-any cline-yes">9x</span>
956
+ <span class="cline-any cline-yes">9x</span>
957
+ <span class="cline-any cline-yes">9x</span>
958
+ <span class="cline-any cline-yes">9x</span>
959
+ <span class="cline-any cline-yes">9x</span>
960
+ <span class="cline-any cline-yes">9x</span>
961
+ <span class="cline-any cline-yes">9x</span>
962
+ <span class="cline-any cline-yes">4x</span>
963
+ <span class="cline-any cline-yes">4x</span>
964
+ <span class="cline-any cline-yes">4x</span>
965
+ <span class="cline-any cline-yes">4x</span>
966
+ <span class="cline-any cline-yes">2x</span>
967
+ <span class="cline-any cline-yes">2x</span>
968
+ <span class="cline-any cline-yes">2x</span>
969
+ <span class="cline-any cline-yes">2x</span>
970
+ <span class="cline-any cline-yes">2x</span>
971
+ <span class="cline-any cline-yes">2x</span>
972
+ <span class="cline-any cline-yes">2x</span>
973
+ <span class="cline-any cline-yes">2x</span>
974
+ <span class="cline-any cline-yes">2x</span>
975
+ <span class="cline-any cline-yes">2x</span>
976
+ <span class="cline-any cline-yes">2x</span>
977
+ <span class="cline-any cline-yes">2x</span>
978
+ <span class="cline-any cline-yes">2x</span>
979
+ <span class="cline-any cline-yes">2x</span>
980
+ <span class="cline-any cline-yes">2x</span>
981
+ <span class="cline-any cline-yes">2x</span>
982
+ <span class="cline-any cline-yes">2x</span>
983
+ <span class="cline-any cline-yes">2x</span>
984
+ <span class="cline-any cline-yes">2x</span>
985
+ <span class="cline-any cline-yes">2x</span>
986
+ <span class="cline-any cline-yes">2x</span>
987
+ <span class="cline-any cline-yes">2x</span>
988
+ <span class="cline-any cline-yes">2x</span>
989
+ <span class="cline-any cline-yes">2x</span>
990
+ <span class="cline-any cline-yes">2x</span>
991
+ <span class="cline-any cline-yes">2x</span>
992
+ <span class="cline-any cline-yes">4x</span>
993
+ <span class="cline-any cline-yes">4x</span>
994
+ <span class="cline-any cline-yes">4x</span>
995
+ <span class="cline-any cline-yes">4x</span>
996
+ <span class="cline-any cline-yes">4x</span>
997
+ <span class="cline-any cline-yes">4x</span>
998
+ <span class="cline-any cline-yes">4x</span>
999
+ <span class="cline-any cline-yes">10x</span>
1000
+ <span class="cline-any cline-yes">10x</span>
1001
+ <span class="cline-any cline-yes">3x</span>
1002
+ <span class="cline-any cline-yes">3x</span>
1003
+ <span class="cline-any cline-yes">7x</span>
1004
+ <span class="cline-any cline-yes">7x</span>
1005
+ <span class="cline-any cline-yes">10x</span>
1006
+ <span class="cline-any cline-yes">1x</span>
1007
+ <span class="cline-any cline-yes">1x</span>
1008
+ <span class="cline-any cline-yes">1x</span>
1009
+ <span class="cline-any cline-yes">6x</span>
1010
+ <span class="cline-any cline-yes">10x</span>
1011
+ <span class="cline-any cline-yes">10x</span>
1012
+ <span class="cline-any cline-yes">1x</span>
1013
+ <span class="cline-any cline-yes">1x</span>
1014
+ <span class="cline-any cline-yes">1x</span>
1015
+ <span class="cline-any cline-yes">5x</span>
1016
+ <span class="cline-any cline-yes">5x</span>
1017
+ <span class="cline-any cline-yes">5x</span>
1018
+ <span class="cline-any cline-yes">10x</span>
1019
+ <span class="cline-any cline-no">&nbsp;</span>
1020
+ <span class="cline-any cline-no">&nbsp;</span>
1021
+ <span class="cline-any cline-yes">4x</span>
1022
+ <span class="cline-any cline-yes">4x</span>
1023
+ <span class="cline-any cline-yes">10x</span>
1024
+ <span class="cline-any cline-yes">10x</span>
1025
+ <span class="cline-any cline-yes">10x</span>
1026
+ <span class="cline-any cline-yes">10x</span>
1027
+ <span class="cline-any cline-yes">10x</span>
1028
+ <span class="cline-any cline-yes">1x</span>
1029
+ <span class="cline-any cline-yes">1x</span>
1030
+ <span class="cline-any cline-yes">1x</span>
1031
+ <span class="cline-any cline-yes">1x</span>
1032
+ <span class="cline-any cline-yes">1x</span>
1033
+ <span class="cline-any cline-yes">1x</span>
1034
+ <span class="cline-any cline-yes">1x</span>
1035
+ <span class="cline-any cline-yes">1x</span>
1036
+ <span class="cline-any cline-yes">1x</span>
1037
+ <span class="cline-any cline-yes">10x</span>
1038
+ <span class="cline-any cline-yes">4x</span>
1039
+ <span class="cline-any cline-yes">4x</span>
1040
+ <span class="cline-any cline-yes">4x</span>
1041
+ <span class="cline-any cline-yes">4x</span>
1042
+ <span class="cline-any cline-yes">4x</span>
1043
+ <span class="cline-any cline-yes">4x</span>
1044
+ <span class="cline-any cline-yes">4x</span>
1045
+ <span class="cline-any cline-yes">4x</span>
1046
+ <span class="cline-any cline-no">&nbsp;</span>
1047
+ <span class="cline-any cline-no">&nbsp;</span>
1048
+ <span class="cline-any cline-no">&nbsp;</span>
1049
+ <span class="cline-any cline-no">&nbsp;</span>
1050
+ <span class="cline-any cline-no">&nbsp;</span>
1051
+ <span class="cline-any cline-no">&nbsp;</span>
1052
+ <span class="cline-any cline-no">&nbsp;</span>
1053
+ <span class="cline-any cline-no">&nbsp;</span>
1054
+ <span class="cline-any cline-no">&nbsp;</span>
1055
+ <span class="cline-any cline-no">&nbsp;</span>
1056
+ <span class="cline-any cline-no">&nbsp;</span>
1057
+ <span class="cline-any cline-no">&nbsp;</span>
1058
+ <span class="cline-any cline-no">&nbsp;</span>
1059
+ <span class="cline-any cline-no">&nbsp;</span>
1060
+ <span class="cline-any cline-no">&nbsp;</span>
1061
+ <span class="cline-any cline-no">&nbsp;</span>
1062
+ <span class="cline-any cline-no">&nbsp;</span>
1063
+ <span class="cline-any cline-no">&nbsp;</span>
1064
+ <span class="cline-any cline-no">&nbsp;</span>
1065
+ <span class="cline-any cline-no">&nbsp;</span>
1066
+ <span class="cline-any cline-no">&nbsp;</span>
1067
+ <span class="cline-any cline-no">&nbsp;</span>
1068
+ <span class="cline-any cline-no">&nbsp;</span>
1069
+ <span class="cline-any cline-no">&nbsp;</span>
1070
+ <span class="cline-any cline-no">&nbsp;</span>
1071
+ <span class="cline-any cline-no">&nbsp;</span>
1072
+ <span class="cline-any cline-no">&nbsp;</span>
1073
+ <span class="cline-any cline-no">&nbsp;</span>
1074
+ <span class="cline-any cline-no">&nbsp;</span>
1075
+ <span class="cline-any cline-no">&nbsp;</span>
1076
+ <span class="cline-any cline-no">&nbsp;</span>
1077
+ <span class="cline-any cline-no">&nbsp;</span>
1078
+ <span class="cline-any cline-no">&nbsp;</span>
1079
+ <span class="cline-any cline-no">&nbsp;</span>
1080
+ <span class="cline-any cline-no">&nbsp;</span>
1081
+ <span class="cline-any cline-no">&nbsp;</span>
1082
+ <span class="cline-any cline-no">&nbsp;</span>
1083
+ <span class="cline-any cline-no">&nbsp;</span>
1084
+ <span class="cline-any cline-no">&nbsp;</span>
1085
+ <span class="cline-any cline-no">&nbsp;</span>
1086
+ <span class="cline-any cline-no">&nbsp;</span>
1087
+ <span class="cline-any cline-no">&nbsp;</span>
1088
+ <span class="cline-any cline-no">&nbsp;</span>
1089
+ <span class="cline-any cline-no">&nbsp;</span>
1090
+ <span class="cline-any cline-yes">4x</span>
1091
+ <span class="cline-any cline-yes">4x</span>
1092
+ <span class="cline-any cline-yes">4x</span>
1093
+ <span class="cline-any cline-yes">4x</span>
1094
+ <span class="cline-any cline-yes">4x</span>
1095
+ <span class="cline-any cline-yes">4x</span>
1096
+ <span class="cline-any cline-yes">2x</span>
1097
+ <span class="cline-any cline-yes">2x</span>
1098
+ <span class="cline-any cline-yes">2x</span>
1099
+ <span class="cline-any cline-yes">2x</span>
1100
+ <span class="cline-any cline-yes">2x</span>
1101
+ <span class="cline-any cline-yes">2x</span>
1102
+ <span class="cline-any cline-yes">2x</span>
1103
+ <span class="cline-any cline-yes">2x</span>
1104
+ <span class="cline-any cline-yes">2x</span>
1105
+ <span class="cline-any cline-yes">2x</span>
1106
+ <span class="cline-any cline-yes">2x</span>
1107
+ <span class="cline-any cline-no">&nbsp;</span>
1108
+ <span class="cline-any cline-no">&nbsp;</span>
1109
+ <span class="cline-any cline-no">&nbsp;</span>
1110
+ <span class="cline-any cline-no">&nbsp;</span>
1111
+ <span class="cline-any cline-no">&nbsp;</span>
1112
+ <span class="cline-any cline-no">&nbsp;</span>
1113
+ <span class="cline-any cline-no">&nbsp;</span>
1114
+ <span class="cline-any cline-yes">2x</span>
1115
+ <span class="cline-any cline-yes">4x</span>
1116
+ <span class="cline-any cline-yes">17x</span>
1117
+ <span class="cline-any cline-yes">17x</span>
1118
+ <span class="cline-any cline-yes">17x</span>
1119
+ <span class="cline-any cline-yes">17x</span>
1120
+ <span class="cline-any cline-yes">17x</span>
1121
+ <span class="cline-any cline-yes">17x</span>
1122
+ <span class="cline-any cline-yes">4x</span>
1123
+ <span class="cline-any cline-yes">39x</span>
1124
+ <span class="cline-any cline-yes">39x</span>
1125
+ <span class="cline-any cline-yes">39x</span>
1126
+ <span class="cline-any cline-yes">39x</span>
1127
+ <span class="cline-any cline-yes">4x</span>
1128
+ <span class="cline-any cline-yes">8x</span>
1129
+ <span class="cline-any cline-yes">8x</span>
1130
+ <span class="cline-any cline-yes">8x</span>
1131
+ <span class="cline-any cline-yes">8x</span>
1132
+ <span class="cline-any cline-yes">8x</span>
1133
+ <span class="cline-any cline-yes">8x</span>
1134
+ <span class="cline-any cline-yes">1x</span>
1135
+ <span class="cline-any cline-yes">1x</span>
1136
+ <span class="cline-any cline-yes">7x</span>
1137
+ <span class="cline-any cline-yes">7x</span>
1138
+ <span class="cline-any cline-yes">8x</span>
1139
+ <span class="cline-any cline-yes">8x</span>
1140
+ <span class="cline-any cline-yes">8x</span>
1141
+ <span class="cline-any cline-yes">8x</span>
1142
+ <span class="cline-any cline-yes">8x</span>
1143
+ <span class="cline-any cline-yes">8x</span>
1144
+ <span class="cline-any cline-yes">8x</span>
1145
+ <span class="cline-any cline-yes">8x</span>
1146
+ <span class="cline-any cline-yes">8x</span>
1147
+ <span class="cline-any cline-yes">8x</span>
1148
+ <span class="cline-any cline-yes">8x</span>
1149
+ <span class="cline-any cline-yes">8x</span>
1150
+ <span class="cline-any cline-yes">8x</span>
1151
+ <span class="cline-any cline-yes">8x</span>
1152
+ <span class="cline-any cline-yes">8x</span>
1153
+ <span class="cline-any cline-yes">7x</span>
1154
+ <span class="cline-any cline-yes">7x</span>
1155
+ <span class="cline-any cline-yes">7x</span>
1156
+ <span class="cline-any cline-yes">7x</span>
1157
+ <span class="cline-any cline-yes">8x</span>
1158
+ <span class="cline-any cline-yes">3x</span>
1159
+ <span class="cline-any cline-yes">3x</span>
1160
+ <span class="cline-any cline-yes">7x</span>
1161
+ <span class="cline-any cline-yes">7x</span>
1162
+ <span class="cline-any cline-yes">8x</span>
1163
+ <span class="cline-any cline-yes">2x</span>
1164
+ <span class="cline-any cline-yes">8x</span>
1165
+ <span class="cline-any cline-yes">1x</span>
1166
+ <span class="cline-any cline-yes">1x</span>
1167
+ <span class="cline-any cline-yes">7x</span>
1168
+ <span class="cline-any cline-yes">7x</span>
1169
+ <span class="cline-any cline-yes">8x</span>
1170
+ <span class="cline-any cline-no">&nbsp;</span>
1171
+ <span class="cline-any cline-no">&nbsp;</span>
1172
+ <span class="cline-any cline-yes">7x</span>
1173
+ <span class="cline-any cline-yes">7x</span>
1174
+ <span class="cline-any cline-yes">8x</span>
1175
+ <span class="cline-any cline-yes">4x</span>
1176
+ <span class="cline-any cline-yes">4x</span>
1177
+ <span class="cline-any cline-yes">4x</span>
1178
+ <span class="cline-any cline-yes">4x</span>
1179
+ <span class="cline-any cline-yes">8x</span>
1180
+ <span class="cline-any cline-yes">8x</span>
1181
+ <span class="cline-any cline-yes">8x</span>
1182
+ <span class="cline-any cline-yes">8x</span>
1183
+ <span class="cline-any cline-yes">8x</span>
1184
+ <span class="cline-any cline-yes">1x</span>
1185
+ <span class="cline-any cline-yes">1x</span>
1186
+ <span class="cline-any cline-yes">1x</span>
1187
+ <span class="cline-any cline-yes">1x</span>
1188
+ <span class="cline-any cline-yes">1x</span>
1189
+ <span class="cline-any cline-yes">1x</span>
1190
+ <span class="cline-any cline-yes">1x</span>
1191
+ <span class="cline-any cline-yes">1x</span>
1192
+ <span class="cline-any cline-no">&nbsp;</span>
1193
+ <span class="cline-any cline-no">&nbsp;</span>
1194
+ <span class="cline-any cline-no">&nbsp;</span>
1195
+ <span class="cline-any cline-yes">7x</span>
1196
+ <span class="cline-any cline-yes">7x</span>
1197
+ <span class="cline-any cline-yes">8x</span>
1198
+ <span class="cline-any cline-yes">4x</span>
1199
+ <span class="cline-any cline-yes">2x</span>
1200
+ <span class="cline-any cline-yes">2x</span>
1201
+ <span class="cline-any cline-yes">2x</span>
1202
+ <span class="cline-any cline-yes">4x</span>
1203
+ <span class="cline-any cline-yes">1x</span>
1204
+ <span class="cline-any cline-yes">1x</span>
1205
+ <span class="cline-any cline-yes">1x</span>
1206
+ <span class="cline-any cline-yes">1x</span>
1207
+ <span class="cline-any cline-yes">1x</span>
1208
+ <span class="cline-any cline-yes">1x</span>
1209
+ <span class="cline-any cline-yes">1x</span>
1210
+ <span class="cline-any cline-no">&nbsp;</span>
1211
+ <span class="cline-any cline-no">&nbsp;</span>
1212
+ <span class="cline-any cline-no">&nbsp;</span>
1213
+ <span class="cline-any cline-no">&nbsp;</span>
1214
+ <span class="cline-any cline-no">&nbsp;</span>
1215
+ <span class="cline-any cline-no">&nbsp;</span>
1216
+ <span class="cline-any cline-no">&nbsp;</span>
1217
+ <span class="cline-any cline-no">&nbsp;</span>
1218
+ <span class="cline-any cline-no">&nbsp;</span>
1219
+ <span class="cline-any cline-yes">1x</span>
1220
+ <span class="cline-any cline-yes">1x</span>
1221
+ <span class="cline-any cline-yes">1x</span>
1222
+ <span class="cline-any cline-yes">1x</span>
1223
+ <span class="cline-any cline-yes">1x</span>
1224
+ <span class="cline-any cline-yes">1x</span>
1225
+ <span class="cline-any cline-yes">1x</span>
1226
+ <span class="cline-any cline-yes">1x</span>
1227
+ <span class="cline-any cline-no">&nbsp;</span>
1228
+ <span class="cline-any cline-no">&nbsp;</span>
1229
+ <span class="cline-any cline-no">&nbsp;</span>
1230
+ <span class="cline-any cline-no">&nbsp;</span>
1231
+ <span class="cline-any cline-no">&nbsp;</span>
1232
+ <span class="cline-any cline-no">&nbsp;</span>
1233
+ <span class="cline-any cline-no">&nbsp;</span>
1234
+ <span class="cline-any cline-yes">1x</span>
1235
+ <span class="cline-any cline-yes">4x</span>
1236
+ <span class="cline-any cline-yes">1x</span>
1237
+ <span class="cline-any cline-yes">1x</span>
1238
+ <span class="cline-any cline-no">&nbsp;</span>
1239
+ <span class="cline-any cline-no">&nbsp;</span>
1240
+ <span class="cline-any cline-yes">1x</span>
1241
+ <span class="cline-any cline-yes">1x</span>
1242
+ <span class="cline-any cline-yes">1x</span>
1243
+ <span class="cline-any cline-no">&nbsp;</span>
1244
+ <span class="cline-any cline-no">&nbsp;</span>
1245
+ <span class="cline-any cline-no">&nbsp;</span>
1246
+ <span class="cline-any cline-no">&nbsp;</span>
1247
+ <span class="cline-any cline-no">&nbsp;</span>
1248
+ <span class="cline-any cline-no">&nbsp;</span>
1249
+ <span class="cline-any cline-no">&nbsp;</span>
1250
+ <span class="cline-any cline-yes">1x</span>
1251
+ <span class="cline-any cline-yes">1x</span>
1252
+ <span class="cline-any cline-yes">1x</span>
1253
+ <span class="cline-any cline-yes">1x</span>
1254
+ <span class="cline-any cline-yes">1x</span>
1255
+ <span class="cline-any cline-yes">1x</span>
1256
+ <span class="cline-any cline-yes">1x</span>
1257
+ <span class="cline-any cline-yes">1x</span>
1258
+ <span class="cline-any cline-yes">1x</span>
1259
+ <span class="cline-any cline-yes">1x</span>
1260
+ <span class="cline-any cline-no">&nbsp;</span>
1261
+ <span class="cline-any cline-no">&nbsp;</span>
1262
+ <span class="cline-any cline-yes">1x</span>
1263
+ <span class="cline-any cline-yes">4x</span>
1264
+ <span class="cline-any cline-yes">4x</span>
1265
+ <span class="cline-any cline-yes">4x</span>
1266
+ <span class="cline-any cline-yes">4x</span>
1267
+ <span class="cline-any cline-yes">4x</span>
1268
+ <span class="cline-any cline-yes">4x</span>
1269
+ <span class="cline-any cline-yes">4x</span>
1270
+ <span class="cline-any cline-yes">4x</span>
1271
+ <span class="cline-any cline-yes">4x</span>
1272
+ <span class="cline-any cline-yes">4x</span>
1273
+ <span class="cline-any cline-yes">4x</span>
1274
+ <span class="cline-any cline-yes">4x</span>
1275
+ <span class="cline-any cline-yes">4x</span>
1276
+ <span class="cline-any cline-yes">4x</span>
1277
+ <span class="cline-any cline-yes">4x</span>
1278
+ <span class="cline-any cline-yes">4x</span>
1279
+ <span class="cline-any cline-yes">4x</span>
1280
+ <span class="cline-any cline-yes">4x</span>
1281
+ <span class="cline-any cline-yes">4x</span>
1282
+ <span class="cline-any cline-yes">4x</span>
1283
+ <span class="cline-any cline-yes">4x</span>
1284
+ <span class="cline-any cline-yes">1x</span>
1285
+ <span class="cline-any cline-yes">1x</span>
1286
+ <span class="cline-any cline-yes">1x</span>
1287
+ <span class="cline-any cline-yes">1x</span>
1288
+ <span class="cline-any cline-yes">1x</span>
1289
+ <span class="cline-any cline-yes">1x</span>
1290
+ <span class="cline-any cline-yes">1x</span>
1291
+ <span class="cline-any cline-yes">1x</span>
1292
+ <span class="cline-any cline-yes">1x</span>
1293
+ <span class="cline-any cline-yes">1x</span>
1294
+ <span class="cline-any cline-yes">1x</span>
1295
+ <span class="cline-any cline-yes">1x</span>
1296
+ <span class="cline-any cline-yes">1x</span>
1297
+ <span class="cline-any cline-yes">1x</span>
1298
+ <span class="cline-any cline-yes">1x</span>
1299
+ <span class="cline-any cline-yes">1x</span>
1300
+ <span class="cline-any cline-yes">1x</span>
1301
+ <span class="cline-any cline-yes">1x</span>
1302
+ <span class="cline-any cline-yes">1x</span>
1303
+ <span class="cline-any cline-yes">1x</span>
1304
+ <span class="cline-any cline-yes">1x</span>
1305
+ <span class="cline-any cline-yes">1x</span>
1306
+ <span class="cline-any cline-yes">1x</span>
1307
+ <span class="cline-any cline-yes">1x</span>
1308
+ <span class="cline-any cline-yes">1x</span>
1309
+ <span class="cline-any cline-yes">1x</span>
1310
+ <span class="cline-any cline-yes">1x</span>
1311
+ <span class="cline-any cline-yes">1x</span>
1312
+ <span class="cline-any cline-yes">1x</span>
1313
+ <span class="cline-any cline-yes">1x</span>
1314
+ <span class="cline-any cline-yes">1x</span>
1315
+ <span class="cline-any cline-yes">1x</span>
1316
+ <span class="cline-any cline-yes">1x</span>
1317
+ <span class="cline-any cline-yes">1x</span>
1318
+ <span class="cline-any cline-yes">1x</span>
1319
+ <span class="cline-any cline-yes">1x</span>
1320
+ <span class="cline-any cline-yes">1x</span>
1321
+ <span class="cline-any cline-yes">1x</span>
1322
+ <span class="cline-any cline-yes">1x</span>
1323
+ <span class="cline-any cline-yes">1x</span>
1324
+ <span class="cline-any cline-yes">1x</span>
1325
+ <span class="cline-any cline-yes">1x</span>
1326
+ <span class="cline-any cline-yes">1x</span>
1327
+ <span class="cline-any cline-yes">1x</span>
1328
+ <span class="cline-any cline-yes">1x</span>
1329
+ <span class="cline-any cline-yes">1x</span>
1330
+ <span class="cline-any cline-yes">1x</span>
1331
+ <span class="cline-any cline-yes">1x</span>
1332
+ <span class="cline-any cline-yes">1x</span>
1333
+ <span class="cline-any cline-yes">1x</span>
1334
+ <span class="cline-any cline-yes">1x</span>
1335
+ <span class="cline-any cline-yes">1x</span>
1336
+ <span class="cline-any cline-yes">1x</span>
1337
+ <span class="cline-any cline-yes">1x</span>
1338
+ <span class="cline-any cline-yes">1x</span>
1339
+ <span class="cline-any cline-yes">1x</span>
1340
+ <span class="cline-any cline-yes">1x</span>
1341
+ <span class="cline-any cline-yes">1x</span>
1342
+ <span class="cline-any cline-yes">1x</span>
1343
+ <span class="cline-any cline-yes">1x</span>
1344
+ <span class="cline-any cline-yes">1x</span>
1345
+ <span class="cline-any cline-yes">1x</span>
1346
+ <span class="cline-any cline-yes">1x</span>
1347
+ <span class="cline-any cline-yes">1x</span>
1348
+ <span class="cline-any cline-yes">1x</span>
1349
+ <span class="cline-any cline-yes">1x</span>
1350
+ <span class="cline-any cline-yes">1x</span>
1351
+ <span class="cline-any cline-yes">1x</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">1x</span>
1355
+ <span class="cline-any cline-yes">1x</span>
1356
+ <span class="cline-any cline-yes">1x</span>
1357
+ <span class="cline-any cline-yes">1x</span>
1358
+ <span class="cline-any cline-yes">1x</span>
1359
+ <span class="cline-any cline-yes">1x</span>
1360
+ <span class="cline-any cline-yes">1x</span>
1361
+ <span class="cline-any cline-yes">1x</span>
1362
+ <span class="cline-any cline-yes">1x</span>
1363
+ <span class="cline-any cline-yes">4x</span>
1364
+ <span class="cline-any cline-yes">4x</span>
1365
+ <span class="cline-any cline-yes">4x</span>
1366
+ <span class="cline-any cline-yes">4x</span>
1367
+ <span class="cline-any cline-yes">4x</span>
1368
+ <span class="cline-any cline-yes">4x</span>
1369
+ <span class="cline-any cline-yes">4x</span>
1370
+ <span class="cline-any cline-yes">4x</span>
1371
+ <span class="cline-any cline-yes">4x</span>
1372
+ <span class="cline-any cline-yes">4x</span>
1373
+ <span class="cline-any cline-yes">4x</span>
1374
+ <span class="cline-any cline-yes">4x</span>
1375
+ <span class="cline-any cline-yes">4x</span>
1376
+ <span class="cline-any cline-yes">4x</span>
1377
+ <span class="cline-any cline-yes">1x</span>
1378
+ <span class="cline-any cline-yes">1x</span>
1379
+ <span class="cline-any cline-yes">1x</span>
1380
+ <span class="cline-any cline-yes">1x</span>
1381
+ <span class="cline-any cline-yes">1x</span>
1382
+ <span class="cline-any cline-yes">1x</span>
1383
+ <span class="cline-any cline-yes">1x</span>
1384
+ <span class="cline-any cline-yes">1x</span>
1385
+ <span class="cline-any cline-yes">1x</span>
1386
+ <span class="cline-any cline-yes">1x</span>
1387
+ <span class="cline-any cline-yes">1x</span>
1388
+ <span class="cline-any cline-yes">1x</span>
1389
+ <span class="cline-any cline-yes">1x</span>
1390
+ <span class="cline-any cline-no">&nbsp;</span>
1391
+ <span class="cline-any cline-no">&nbsp;</span>
1392
+ <span class="cline-any cline-yes">1x</span>
1393
+ <span class="cline-any cline-yes">1x</span>
1394
+ <span class="cline-any cline-yes">1x</span>
1395
+ <span class="cline-any cline-yes">1x</span>
1396
+ <span class="cline-any cline-yes">1x</span>
1397
+ <span class="cline-any cline-yes">1x</span>
1398
+ <span class="cline-any cline-yes">1x</span>
1399
+ <span class="cline-any cline-yes">1x</span>
1400
+ <span class="cline-any cline-yes">1x</span>
1401
+ <span class="cline-any cline-yes">1x</span>
1402
+ <span class="cline-any cline-yes">1x</span>
1403
+ <span class="cline-any cline-yes">1x</span>
1404
+ <span class="cline-any cline-yes">1x</span>
1405
+ <span class="cline-any cline-yes">1x</span>
1406
+ <span class="cline-any cline-yes">1x</span>
1407
+ <span class="cline-any cline-yes">1x</span>
1408
+ <span class="cline-any cline-yes">1x</span>
1409
+ <span class="cline-any cline-yes">1x</span>
1410
+ <span class="cline-any cline-yes">1x</span>
1411
+ <span class="cline-any cline-yes">1x</span>
1412
+ <span class="cline-any cline-yes">1x</span>
1413
+ <span class="cline-any cline-yes">1x</span>
1414
+ <span class="cline-any cline-yes">1x</span>
1415
+ <span class="cline-any cline-yes">1x</span>
1416
+ <span class="cline-any cline-yes">1x</span>
1417
+ <span class="cline-any cline-yes">1x</span>
1418
+ <span class="cline-any cline-yes">1x</span>
1419
+ <span class="cline-any cline-yes">1x</span>
1420
+ <span class="cline-any cline-yes">1x</span>
1421
+ <span class="cline-any cline-yes">1x</span>
1422
+ <span class="cline-any cline-yes">1x</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">1x</span>
1426
+ <span class="cline-any cline-yes">1x</span>
1427
+ <span class="cline-any cline-yes">1x</span>
1428
+ <span class="cline-any cline-yes">1x</span>
1429
+ <span class="cline-any cline-yes">1x</span>
1430
+ <span class="cline-any cline-yes">1x</span>
1431
+ <span class="cline-any cline-yes">1x</span>
1432
+ <span class="cline-any cline-yes">1x</span>
1433
+ <span class="cline-any cline-yes">1x</span>
1434
+ <span class="cline-any cline-yes">1x</span>
1435
+ <span class="cline-any cline-yes">1x</span>
1436
+ <span class="cline-any cline-yes">1x</span>
1437
+ <span class="cline-any cline-yes">1x</span>
1438
+ <span class="cline-any cline-no">&nbsp;</span>
1439
+ <span class="cline-any cline-no">&nbsp;</span>
1440
+ <span class="cline-any cline-yes">1x</span>
1441
+ <span class="cline-any cline-yes">1x</span>
1442
+ <span class="cline-any cline-yes">1x</span>
1443
+ <span class="cline-any cline-yes">1x</span>
1444
+ <span class="cline-any cline-yes">1x</span>
1445
+ <span class="cline-any cline-yes">1x</span>
1446
+ <span class="cline-any cline-yes">1x</span>
1447
+ <span class="cline-any cline-yes">1x</span>
1448
+ <span class="cline-any cline-yes">4x</span>
1449
+ <span class="cline-any cline-yes">4x</span>
1450
+ <span class="cline-any cline-yes">4x</span>
1451
+ <span class="cline-any cline-yes">4x</span>
1452
+ <span class="cline-any cline-yes">4x</span>
1453
+ <span class="cline-any cline-yes">4x</span>
1454
+ <span class="cline-any cline-yes">4x</span>
1455
+ <span class="cline-any cline-yes">4x</span>
1456
+ <span class="cline-any cline-yes">4x</span>
1457
+ <span class="cline-any cline-yes">4x</span>
1458
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
1459
+ * Claude Subagent — Lifecycle management for Claude CLI subagent sessions.
1460
+ *
1461
+ * Spawns `claude` CLI processes for real LLM-powered A2A conversations
1462
+ * as an alternative to OpenClaw for A2A conversations.
1463
+ *
1464
+ * Design decision (A2A-29):
1465
+ * We intentionally run Claude turns in stateless one-shot mode instead of `--resume`.
1466
+ * In production we observed intermittent hangs during nested Claude startup/restore.
1467
+ * Stateless calls cost more tokens but are operationally safer under load.
1468
+ *
1469
+ * Permissioning is still enforced:
1470
+ * `--allowedTools` is derived per request from token capabilities + allowed topics
1471
+ * and can be further constrained by per-tier `allowed_tools` policy from onboarding.
1472
+ */
1473
+ &nbsp;
1474
+ const { execSync, spawn } = require('child_process');
1475
+ const { createLogger } = require('./logger');
1476
+ const { HARD_FALLBACK_TURN_TIMEOUT_MS } = require('./turn-timeout');
1477
+ &nbsp;
1478
+ const logger = createLogger({ component: 'a2a.claude-subagent' });
1479
+ &nbsp;
1480
+ const A2A_RESPONSE_REGEX = /&lt;a2a_response&gt;\s*([\s\S]*?)\s*&lt;\/a2a_response&gt;/i;
1481
+ const DEFAULT_CLAUDE_MODEL = 'claude-sonnet-4-5-20250929';
1482
+ const CLAUDE_TOOL_UNIVERSE = ['Bash', 'Bash(readonly)', 'Read', 'Grep', 'Glob', 'WebSearch', 'WebFetch'];
1483
+ const LEGACY_DEFAULT_TOOLS = ['Bash(readonly)', 'Read', 'Grep', 'Glob', 'WebSearch', 'WebFetch'];
1484
+ &nbsp;
1485
+ const TOOL_NAME_MAP = {
1486
+ bash: 'Bash',
1487
+ 'bash(readonly)': 'Bash(readonly)',
1488
+ 'bash-readonly': 'Bash(readonly)',
1489
+ read: 'Read',
1490
+ grep: 'Grep',
1491
+ glob: 'Glob',
1492
+ websearch: 'WebSearch',
1493
+ webfetch: 'WebFetch'
1494
+ };
1495
+ &nbsp;
1496
+ function normalizeToolName(value) {
1497
+ const key = String(value <span class="branch-0 cbranch-no" title="branch not covered" >|| '')</span>.trim().toLowerCase();
1498
+ return TOOL_NAME_MAP[key] <span class="branch-0 cbranch-no" title="branch not covered" >|| null;</span>
1499
+ }
1500
+ &nbsp;
1501
+ function sanitizeAllowedToolList(values) {
1502
+ if (!Array.isArray(values)) <span class="branch-0 cbranch-no" title="branch not covered" >return [];</span>
1503
+ const out = [];
1504
+ const seen = new Set();
1505
+ for (const value of values) {
1506
+ const canonical = normalizeToolName(value);
1507
+ if (!canonical || seen.has(canonical)) <span class="branch-0 cbranch-no" title="branch not covered" >continue;</span>
1508
+ seen.add(canonical);
1509
+ out.push(canonical);
1510
+ }
1511
+ return out;
1512
+ }
1513
+ &nbsp;
1514
+ function formatToolListForPrompt(tools) {
1515
+ if (!Array.isArray(tools) || tools.length === 0) <span class="branch-0 cbranch-no" title="branch not covered" >return ' (none)';</span>
1516
+ return tools.map(tool =&gt; ` - ${tool}`).join('\n');
1517
+ }
1518
+ &nbsp;
1519
+ /**
1520
+ * Check if `claude` CLI is available in PATH.
1521
+ */
1522
+ function isClaudeAvailable() {
1523
+ try {
1524
+ execSync('command -v claude', { stdio: 'ignore' });
1525
+ return true;
1526
+ } catch {
1527
+ return false;
1528
+ }
1529
+ }
1530
+ &nbsp;
1531
+ /**
1532
+ * Build the system prompt for the Claude subagent.
1533
+ *
1534
+ * @param {Object} config
1535
+ * @param {string} config.agentName
1536
+ * @param {string} config.ownerName
1537
+ * @param {string} config.otherAgentName
1538
+ * @param {string} config.otherOwnerName
1539
+ * @param {string} config.accessTier
1540
+ * @param {string} config.tierTopics - formatted topics string
1541
+ * @param {string} config.tierObjectives - formatted objectives string
1542
+ * @param {string} config.doNotDiscuss - formatted do_not_discuss string
1543
+ * @param {string} config.neverDisclose - formatted never_disclose string
1544
+ * @param {string[]} [config.allowedTools] - Effective tool allowlist for this call
1545
+ * @param {string} config.personalityNotes
1546
+ * @param {string} config.roleContext
1547
+ * @returns {string}
1548
+ */
1549
+ function buildSubagentSystemPrompt(config) {
1550
+ const {
1551
+ agentName = 'Agent',
1552
+ ownerName = 'the owner',
1553
+ otherAgentName = 'Remote Agent',
1554
+ otherOwnerName = 'their owner',
1555
+ accessTier = 'public',
1556
+ tierTopics = ' (none specified)',
1557
+ tierObjectives = ' (none specified)',
1558
+ doNotDiscuss = ' (none specified)',
1559
+ neverDisclose = ' (none specified)',
1560
+ allowedTools = [],
1561
+ personalityNotes = '',
1562
+ roleContext = ''
1563
+ } = config;
1564
+ &nbsp;
1565
+ const effectiveAllowedTools = sanitizeAllowedToolList(allowedTools);
1566
+ const allowedForPrompt = effectiveAllowedTools.length &gt; 0
1567
+ ? effectiveAllowedTools
1568
+ : [...LEGACY_DEFAULT_TOOLS];
1569
+ const blockedTools = CLAUDE_TOOL_UNIVERSE.filter(tool =&gt; !allowedForPrompt.includes(tool));
1570
+ &nbsp;
1571
+ return `You are ${agentName}, the personal AI agent for ${ownerName}.
1572
+ You are on a live A2A (agent-to-agent) call with ${otherAgentName}, who represents ${otherOwnerName}. ${roleContext}
1573
+ &nbsp;
1574
+ == OUTPUT FORMAT ==
1575
+ &nbsp;
1576
+ After your conversational reply, you MUST append exactly one structured response block:
1577
+ &nbsp;
1578
+ &lt;a2a_response&gt;
1579
+ {"message":"Your conversational reply here","statePatch":{"phase":"explore","overlapScore":0.3,"activeThreads":["thread1"],"candidateCollaborations":["idea1"],"closeSignal":false,"confidence":0.4},"flags":[]}
1580
+ &lt;/a2a_response&gt;
1581
+ &nbsp;
1582
+ Rules for the response block:
1583
+ - "message" (required): Your full conversational reply text. This is what the other agent sees.
1584
+ - "statePatch" (optional): Collaboration state update with any of: phase, overlapScore (0-1), activeThreads (max 4), candidateCollaborations (max 4), closeSignal (boolean), confidence (0-1).
1585
+ - "flags" (optional): Array of flag objects like {"type":"question_for_owner","content":"..."} or {"type":"opportunity_flagged","content":"..."}.
1586
+ - Must be valid JSON (double quotes only).
1587
+ - The message in the JSON block should match your visible conversational text.
1588
+ &nbsp;
1589
+ Flag types:
1590
+ - "question_for_owner": Something you want to ask ${ownerName} about before committing
1591
+ - "opportunity_flagged": A concrete collaboration opportunity worth the owner's attention
1592
+ - "boundary_touched": The other agent probed near a do_not_discuss or never_disclose topic
1593
+ - "unverifiable_claim": The other agent made a claim you cannot verify
1594
+ &nbsp;
1595
+ == DISCLOSURE CONTEXT ==
1596
+ &nbsp;
1597
+ Access level: ${accessTier}
1598
+ &nbsp;
1599
+ ${ownerName}'s topics of interest:
1600
+ ${tierTopics}
1601
+ &nbsp;
1602
+ Objectives:
1603
+ ${tierObjectives}
1604
+ &nbsp;
1605
+ DO NOT DISCUSS (redirect naturally):
1606
+ ${doNotDiscuss}
1607
+ &nbsp;
1608
+ NEVER disclose:
1609
+ ${neverDisclose}
1610
+ &nbsp;
1611
+ == TOOL PERMISSIONS ==
1612
+ &nbsp;
1613
+ Allowed tools this call:
1614
+ ${formatToolListForPrompt(allowedForPrompt)}
1615
+ &nbsp;
1616
+ Blocked tools this call:
1617
+ ${formatToolListForPrompt(blockedTools)}
1618
+ &nbsp;
1619
+ Tool policy:
1620
+ - Never invoke blocked tools.
1621
+ - If you need a blocked tool, continue the conversation without it and add a "question_for_owner" flag requesting permission.
1622
+ - Include exact tool name and reason in the flag content.
1623
+ &nbsp;
1624
+ == BEHAVIORAL MANDATE ==
1625
+ &nbsp;
1626
+ You operate in three concurrent modes:
1627
+ &nbsp;
1628
+ 1. EXPLORING: Map the other agent's owner — capabilities, resources, blind spots, ambitions.
1629
+ Ask probing questions. Don't accept surface-level answers. Dig into specifics.
1630
+ &nbsp;
1631
+ 2. ADVERSARIALLY QUALIFYING: Pressure-test claims. Push back respectfully.
1632
+ "You say X, but that sounds like Y. What's actually different?"
1633
+ "That's a crowded space. What makes their angle defensible?"
1634
+ The best collaborations come from people who can handle scrutiny.
1635
+ &nbsp;
1636
+ 3. COLLABORATING: Look for concrete overlap and actionable next steps.
1637
+ Complementary capabilities, shared challenges, non-obvious intersections.
1638
+ Propose specific ideas, not vague "let's stay in touch."
1639
+ &nbsp;
1640
+ == PHASE AWARENESS ==
1641
+ &nbsp;
1642
+ Each turn you receive state including turn number, maxTurns, and current phase.
1643
+ Adapt your behavior to the phase:
1644
+ &nbsp;
1645
+ - handshake (turns 1-2): Establish context, introduce key topics, set one meaningful direction.
1646
+ - exploring (turns 2-6): Map goals, capabilities, constraints. Stay here while new info surfaces.
1647
+ - deepening (turns 5-10): Work through specific collaboration threads in detail.
1648
+ - converging (turns 8+): Convert insights into concrete next steps. Set closeSignal when done.
1649
+ &nbsp;
1650
+ These are guidelines, not hard locks. Stay in any phase as long as it's productive.
1651
+ &nbsp;
1652
+ == PERSONALITY ==
1653
+ &nbsp;
1654
+ ${personalityNotes || "Direct, curious, slightly irreverent. You have opinions and share them. You're not a concierge — you're a sparring partner who represents someone."}
1655
+ &nbsp;
1656
+ When unsure about your owner's position, say so: "I don't have ${ownerName}'s take on that — but here's what I think based on their work..."`;
1657
+ }
1658
+ &nbsp;
1659
+ /**
1660
+ * Build the turn prompt containing state and the inbound message.
1661
+ */
1662
+ function buildTurnPrompt(options) {
1663
+ const {
1664
+ turnMessage,
1665
+ turn,
1666
+ maxTurns,
1667
+ phase = 'handshake',
1668
+ overlapScore = 0.15,
1669
+ activeThreads = [],
1670
+ candidateCollaborations = [],
1671
+ closeSignal = false
1672
+ } = options;
1673
+ &nbsp;
1674
+ return `== TURN STATE ==
1675
+ Turn: ${turn}/${maxTurns}
1676
+ Phase: ${phase}
1677
+ Overlap score: ${overlapScore}
1678
+ Active threads: ${activeThreads.length &gt; 0 ? activeThreads.join(', ') : '(none)'}
1679
+ Candidate collaborations: ${candidateCollaborations.length &gt; 0 ? candidateCollaborations.join(', ') : '(none)'}
1680
+ Close signal: ${closeSignal}
1681
+ &nbsp;
1682
+ == INBOUND MESSAGE ==
1683
+ &nbsp;
1684
+ ${turnMessage}
1685
+ &nbsp;
1686
+ Respond naturally, then append your &lt;a2a_response&gt; block.`;
1687
+ }
1688
+ &nbsp;
1689
+ /**
1690
+ * Parse the structured response from Claude's output.
1691
+ *
1692
+ * @param {string} resultText - Raw text output from claude CLI
1693
+ * @returns {{ message: string, statePatch: object|null, flags: array }}
1694
+ */
1695
+ function parseSubagentResponse(resultText) {
1696
+ if (!resultText || typeof resultText !== 'string') {
1697
+ return { message: '', statePatch: null, flags: [] };
1698
+ }
1699
+ &nbsp;
1700
+ const match = resultText.match(A2A_RESPONSE_REGEX);
1701
+ if (!match) {
1702
+ // Graceful degradation: treat entire result as the message
1703
+ return { message: resultText.trim(), statePatch: null, flags: [] };
1704
+ }
1705
+ &nbsp;
1706
+ const jsonStr = (match[1] || '').trim();
1707
+ if (!jsonStr) {
1708
+ const cleanText = resultText.replace(A2A_RESPONSE_REGEX, '').trim();
1709
+ return { message: cleanText <span class="branch-0 cbranch-no" title="branch not covered" >|| '',</span> statePatch: null, flags: [] };
1710
+ }
1711
+ &nbsp;
1712
+ try {
1713
+ const parsed = JSON.parse(jsonStr);
1714
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1715
+ <span class="cstat-no" title="statement not covered" > throw new Error('a2a_response must be a JSON object');</span>
1716
+ <span class="cstat-no" title="statement not covered" > }</span>
1717
+ &nbsp;
1718
+ return {
1719
+ message: typeof parsed.message === 'string' ? parsed.message <span class="branch-0 cbranch-no" title="branch not covered" >: resultText.replace(A2A_RESPONSE_REGEX, '').trim(),</span>
1720
+ statePatch: parsed.statePatch &amp;&amp; typeof parsed.statePatch === 'object' ? parsed.statePatch : null,
1721
+ flags: Array.isArray(parsed.flags) ? parsed.flags : []
1722
+ };
1723
+ } catch (err) {
1724
+ logger.warn('Failed to parse &lt;a2a_response&gt; JSON', {
1725
+ event: 'subagent_response_parse_failed',
1726
+ error: err,
1727
+ data: { json_length: jsonStr.length }
1728
+ });
1729
+ // Fall back to using text outside the tags
1730
+ const cleanText = resultText.replace(A2A_RESPONSE_REGEX, '').trim();
1731
+ return { message: cleanText <span class="branch-0 cbranch-no" title="branch not covered" >|| resultText.trim(),</span> statePatch: null, flags: [] };
1732
+ }
1733
+ }
1734
+ &nbsp;
1735
+ /**
1736
+ * Spawn `claude` CLI and collect output as a promise.
1737
+ *
1738
+ * @param {string[]} args - CLI arguments
1739
+ * @param {number} timeoutMs - Timeout in milliseconds
1740
+ * @returns {Promise&lt;{ stdout: string, stderr: string }&gt;}
1741
+ */
1742
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function spawnClaude(args, timeoutMs = HARD_FALLBACK_TURN_TIMEOUT_MS) {</span></span>
1743
+ <span class="cstat-no" title="statement not covered" > return new Promise((resolve, reject) =&gt; {</span>
1744
+ <span class="cstat-no" title="statement not covered" > const spawnEnv = { ...process.env, FORCE_COLOR: '0' };</span>
1745
+ <span class="cstat-no" title="statement not covered" > delete spawnEnv.CLAUDECODE;</span>
1746
+ <span class="cstat-no" title="statement not covered" > const proc = spawn('claude', args, {</span>
1747
+ <span class="cstat-no" title="statement not covered" > stdio: ['ignore', 'pipe', 'pipe'],</span>
1748
+ <span class="cstat-no" title="statement not covered" > env: spawnEnv</span>
1749
+ <span class="cstat-no" title="statement not covered" > });</span>
1750
+ <span class="cstat-no" title="statement not covered" ></span>
1751
+ <span class="cstat-no" title="statement not covered" > let stdout = '';</span>
1752
+ <span class="cstat-no" title="statement not covered" > let stderr = '';</span>
1753
+ <span class="cstat-no" title="statement not covered" > let killed = false;</span>
1754
+ <span class="cstat-no" title="statement not covered" ></span>
1755
+ <span class="cstat-no" title="statement not covered" > const timer = setTimeout(() =&gt; {</span>
1756
+ <span class="cstat-no" title="statement not covered" > killed = true;</span>
1757
+ <span class="cstat-no" title="statement not covered" > proc.kill('SIGTERM');</span>
1758
+ <span class="cstat-no" title="statement not covered" > // Give it 5s to clean up, then force kill</span>
1759
+ <span class="cstat-no" title="statement not covered" > setTimeout(() =&gt; {</span>
1760
+ <span class="cstat-no" title="statement not covered" > try { proc.kill('SIGKILL'); } catch (e) { /* already dead */ }</span>
1761
+ <span class="cstat-no" title="statement not covered" > }, 5000);</span>
1762
+ <span class="cstat-no" title="statement not covered" > }, timeoutMs);</span>
1763
+ <span class="cstat-no" title="statement not covered" ></span>
1764
+ <span class="cstat-no" title="statement not covered" > proc.stdout.on('data', (data) =&gt; { stdout += data.toString(); });</span>
1765
+ <span class="cstat-no" title="statement not covered" > proc.stderr.on('data', (data) =&gt; { stderr += data.toString(); });</span>
1766
+ <span class="cstat-no" title="statement not covered" ></span>
1767
+ <span class="cstat-no" title="statement not covered" > proc.on('close', (code) =&gt; {</span>
1768
+ <span class="cstat-no" title="statement not covered" > clearTimeout(timer);</span>
1769
+ <span class="cstat-no" title="statement not covered" > if (killed) {</span>
1770
+ <span class="cstat-no" title="statement not covered" > reject(new Error(`Claude CLI timed out after ${timeoutMs}ms`));</span>
1771
+ <span class="cstat-no" title="statement not covered" > return;</span>
1772
+ <span class="cstat-no" title="statement not covered" > }</span>
1773
+ <span class="cstat-no" title="statement not covered" > if (code !== 0 &amp;&amp; !stdout.trim()) {</span>
1774
+ <span class="cstat-no" title="statement not covered" > reject(new Error(`Claude CLI exited with code ${code}: ${stderr.slice(0, 500)}`));</span>
1775
+ <span class="cstat-no" title="statement not covered" > return;</span>
1776
+ <span class="cstat-no" title="statement not covered" > }</span>
1777
+ <span class="cstat-no" title="statement not covered" > resolve({ stdout, stderr });</span>
1778
+ <span class="cstat-no" title="statement not covered" > });</span>
1779
+ <span class="cstat-no" title="statement not covered" ></span>
1780
+ <span class="cstat-no" title="statement not covered" > proc.on('error', (err) =&gt; {</span>
1781
+ <span class="cstat-no" title="statement not covered" > clearTimeout(timer);</span>
1782
+ <span class="cstat-no" title="statement not covered" > reject(err);</span>
1783
+ <span class="cstat-no" title="statement not covered" > });</span>
1784
+ <span class="cstat-no" title="statement not covered" > });</span>
1785
+ <span class="cstat-no" title="statement not covered" >}</span>
1786
+ &nbsp;
1787
+ /**
1788
+ * Extract the result text from Claude's JSON output.
1789
+ * Claude with --output-format json returns { type, subtype, cost_usd, duration_ms, duration_api_ms,
1790
+ * is_error, num_turns, result, session_id, ... }
1791
+ */
1792
+ function extractResultFromJson(stdout) {
1793
+ const trimmed = stdout.trim();
1794
+ if (!trimmed) <span class="branch-0 cbranch-no" title="branch not covered" >return { result: '', sessionId: null };</span>
1795
+ &nbsp;
1796
+ try {
1797
+ const parsed = JSON.parse(trimmed);
1798
+ return {
1799
+ result: typeof parsed.result === 'string' ? parsed.result <span class="branch-0 cbranch-no" title="branch not covered" >: '',</span>
1800
+ sessionId: parsed.session_id || null
1801
+ };
1802
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
1803
+ <span class="cstat-no" title="statement not covered" > // If JSON parsing fails, treat entire output as result text</span>
1804
+ <span class="cstat-no" title="statement not covered" > logger.debug('Claude output not valid JSON, using raw text', {</span>
1805
+ <span class="cstat-no" title="statement not covered" > event: 'subagent_json_parse_fallback',</span>
1806
+ <span class="cstat-no" title="statement not covered" > data: { output_length: trimmed.length }</span>
1807
+ <span class="cstat-no" title="statement not covered" > });</span>
1808
+ <span class="cstat-no" title="statement not covered" > return { result: trimmed, sessionId: null };</span>
1809
+ <span class="cstat-no" title="statement not covered" > }</span>
1810
+ }
1811
+ &nbsp;
1812
+ function normalizePermissionList(values) {
1813
+ if (!Array.isArray(values)) <span class="branch-0 cbranch-no" title="branch not covered" >return [];</span>
1814
+ return values
1815
+ .map(v =&gt; String(v <span class="branch-0 cbranch-no" title="branch not covered" >|| '')</span>.trim().toLowerCase())
1816
+ .filter(Boolean);
1817
+ }
1818
+ &nbsp;
1819
+ function hasPermissionMatch(values, key) {
1820
+ if (!key) <span class="branch-0 cbranch-no" title="branch not covered" >return false;</span>
1821
+ return values.some(value =&gt; value === key || value.startsWith(`${key}.`));
1822
+ }
1823
+ &nbsp;
1824
+ function deriveClaudeToolsFromPermissionSignals({ capabilities = [], allowedTopics = [] } = {}) {
1825
+ const normalizedCaps = normalizePermissionList(capabilities);
1826
+ const normalizedTopics = normalizePermissionList(allowedTopics);
1827
+ const hasPermissionContext = normalizedCaps.length &gt; 0 || normalizedTopics.length &gt; 0;
1828
+ &nbsp;
1829
+ if (!hasPermissionContext) {
1830
+ return [...LEGACY_DEFAULT_TOOLS];
1831
+ }
1832
+ &nbsp;
1833
+ const hasContextRead = hasPermissionMatch(normalizedCaps, 'context-read')
1834
+ || normalizedTopics.includes('chat');
1835
+ const hasSearch = hasPermissionMatch(normalizedCaps, 'search')
1836
+ || normalizedTopics.includes('search');
1837
+ const hasToolsRead = hasPermissionMatch(normalizedCaps, 'tools')
1838
+ || hasPermissionMatch(normalizedCaps, 'tools-read')
1839
+ || normalizedTopics.includes('tools');
1840
+ const hasToolsWrite = hasPermissionMatch(normalizedCaps, 'tools-write')
1841
+ || hasPermissionMatch(normalizedCaps, 'tools.write')
1842
+ || normalizedTopics.includes('tools-write')
1843
+ || normalizedTopics.includes('tools.write');
1844
+ &nbsp;
1845
+ const tools = [];
1846
+ &nbsp;
1847
+ // Keep read-only introspection available for context-aware tiers.
1848
+ if (hasContextRead || hasSearch || hasToolsRead || hasToolsWrite) {
1849
+ tools.push('Read', 'Grep', 'Glob');
1850
+ }
1851
+ &nbsp;
1852
+ // Web tools are explicitly tied to search-style permissions.
1853
+ if (hasSearch) {
1854
+ tools.push('WebSearch', 'WebFetch');
1855
+ }
1856
+ &nbsp;
1857
+ // Shell access is gated behind tool permissions, with explicit writable opt-in.
1858
+ if (hasToolsWrite) {
1859
+ tools.unshift('Bash');
1860
+ } else if (hasToolsRead) {
1861
+ tools.unshift('Bash(readonly)');
1862
+ }
1863
+ &nbsp;
1864
+ // Fail closed to read-only file inspection if metadata is custom/unknown.
1865
+ if (tools.length === 0) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1866
+ <span class="cstat-no" title="statement not covered" > return ['Read', 'Grep', 'Glob'];</span>
1867
+ <span class="cstat-no" title="statement not covered" > }</span>
1868
+ &nbsp;
1869
+ return tools;
1870
+ }
1871
+ &nbsp;
1872
+ /**
1873
+ * Resolve Claude tool allowlist from token-derived permissions and explicit per-tier tool policy.
1874
+ */
1875
+ function resolveClaudeAllowedTools({ capabilities = [], allowedTopics = [], allowedTools = [] } = {}) {
1876
+ const derivedTools = deriveClaudeToolsFromPermissionSignals({ capabilities, allowedTopics });
1877
+ const explicitTools = sanitizeAllowedToolList(allowedTools);
1878
+ &nbsp;
1879
+ if (explicitTools.length &gt; 0) {
1880
+ const hasPermissionSignals = normalizePermissionList(capabilities).length &gt; 0
1881
+ <span class="branch-0 cbranch-no" title="branch not covered" > || normalizePermissionList(allowedTopics).length &gt; 0;</span>
1882
+ &nbsp;
1883
+ if (hasPermissionSignals) {
1884
+ // Permission signals define the ceiling; explicit tier tools can narrow it.
1885
+ const narrowed = explicitTools.filter(tool =&gt; derivedTools.includes(tool));
1886
+ return narrowed.length &gt; 0 ? narrowed <span class="branch-0 cbranch-no" title="branch not covered" >: derivedTools;</span>
1887
+ }
1888
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
1889
+ <span class="cstat-no" title="statement not covered" > return explicitTools;</span>
1890
+ <span class="cstat-no" title="statement not covered" > }</span>
1891
+ &nbsp;
1892
+ return derivedTools;
1893
+ }
1894
+ &nbsp;
1895
+ function buildClaudeToolArg(allowedTools) {
1896
+ return Array.isArray(allowedTools) ? allowedTools.join(' ').trim() <span class="branch-0 cbranch-no" title="branch not covered" >: '';</span>
1897
+ }
1898
+ &nbsp;
1899
+ function parseSummaryPayload(resultText) {
1900
+ const text = String(resultText <span class="branch-0 cbranch-no" title="branch not covered" >|| '')</span>.trim();
1901
+ if (!text) <span class="branch-0 cbranch-no" title="branch not covered" >return null;</span>
1902
+ &nbsp;
1903
+ // Backwards-compatible: older prompts wrapped JSON in &lt;a2a_response&gt;.
1904
+ const tagged = text.match(A2A_RESPONSE_REGEX);
1905
+ if (tagged <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp; tagged[1])</span> <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1906
+ <span class="cstat-no" title="statement not covered" > try {</span>
1907
+ <span class="cstat-no" title="statement not covered" > return JSON.parse(tagged[1].trim());</span>
1908
+ <span class="cstat-no" title="statement not covered" > } catch (err) {</span>
1909
+ <span class="cstat-no" title="statement not covered" > logger.warn('Failed to parse tagged summary JSON', {</span>
1910
+ <span class="cstat-no" title="statement not covered" > event: 'subagent_summary_tag_parse_failed',</span>
1911
+ <span class="cstat-no" title="statement not covered" > error: err</span>
1912
+ <span class="cstat-no" title="statement not covered" > });</span>
1913
+ <span class="cstat-no" title="statement not covered" > }</span>
1914
+ <span class="cstat-no" title="statement not covered" > }</span>
1915
+ &nbsp;
1916
+ // Preferred path for unified summary prompt: direct JSON object.
1917
+ try {
1918
+ const parsed = JSON.parse(text);
1919
+ if (parsed &amp;&amp; typeof parsed === 'object' &amp;&amp; !Array.isArray(parsed)) {
1920
+ return parsed;
1921
+ }
1922
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
1923
+ <span class="cstat-no" title="statement not covered" > logger.debug('Summary result is not direct JSON; falling back to plain text summary', {</span>
1924
+ <span class="cstat-no" title="statement not covered" > event: 'subagent_summary_raw_fallback',</span>
1925
+ <span class="cstat-no" title="statement not covered" > data: { output_length: text.length }</span>
1926
+ <span class="cstat-no" title="statement not covered" > });</span>
1927
+ <span class="cstat-no" title="statement not covered" > }</span>
1928
+ <span class="cstat-no" title="statement not covered" ></span>
1929
+ <span class="cstat-no" title="statement not covered" > return null;</span>
1930
+ }
1931
+ &nbsp;
1932
+ function summarizeFromPayload(payload, fallbackText) {
1933
+ if (!payload || typeof payload !== 'object' || Array.isArray(payload)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1934
+ <span class="cstat-no" title="statement not covered" > return null;</span>
1935
+ <span class="cstat-no" title="statement not covered" > }</span>
1936
+ &nbsp;
1937
+ // Native A2A summary payload shape.
1938
+ if (typeof payload.summary === 'string' || typeof payload.ownerSummary === 'string') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1939
+ <span class="cstat-no" title="statement not covered" > return {</span>
1940
+ <span class="cstat-no" title="statement not covered" > summary: payload.summary || payload.message || fallbackText || '',</span>
1941
+ <span class="cstat-no" title="statement not covered" > ownerSummary: payload.ownerSummary || payload.summary || payload.message || fallbackText || '',</span>
1942
+ <span class="cstat-no" title="statement not covered" > actionItems: Array.isArray(payload.actionItems) ? payload.actionItems : [],</span>
1943
+ <span class="cstat-no" title="statement not covered" > flags: Array.isArray(payload.flags) ? payload.flags : []</span>
1944
+ <span class="cstat-no" title="statement not covered" > };</span>
1945
+ <span class="cstat-no" title="statement not covered" > }</span>
1946
+ &nbsp;
1947
+ // Unified summary schema shape (headline/assessment/nextSteps).
1948
+ if (typeof payload.headline === 'string') {
1949
+ return {
1950
+ summary: payload.headline,
1951
+ ownerSummary: typeof payload.assessment === 'string' ? payload.assessment <span class="branch-0 cbranch-no" title="branch not covered" >: payload.headline,</span>
1952
+ actionItems: Array.isArray(payload.nextSteps) ? payload.nextSteps <span class="branch-0 cbranch-no" title="branch not covered" >: [],</span>
1953
+ flags: []
1954
+ };
1955
+ }
1956
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
1957
+ <span class="cstat-no" title="statement not covered" > return null;</span>
1958
+ }
1959
+ &nbsp;
1960
+ /**
1961
+ * Run a single turn of the Claude subagent.
1962
+ *
1963
+ * @param {Object} options
1964
+ * @param {string} options.systemPrompt - System prompt (used on turn 1 only)
1965
+ * @param {string} options.turnMessage - The inbound message from the remote agent
1966
+ * @param {number} options.turn - Current turn number (1-based)
1967
+ * @param {number} options.maxTurns - Maximum turns allowed
1968
+ * @param {string} options.phase - Current conversation phase
1969
+ * @param {number} options.overlapScore - Current overlap score
1970
+ * @param {Array} options.activeThreads - Active conversation threads
1971
+ * @param {Array} options.candidateCollaborations - Candidate collaboration ideas
1972
+ * @param {boolean} options.closeSignal - Whether close has been signaled
1973
+ * @param {Array&lt;string&gt;} [options.capabilities] - Token capabilities (permission source of truth)
1974
+ * @param {Array&lt;string&gt;} [options.allowedTopics] - Token allowed topics (permission source of truth)
1975
+ * @param {Array&lt;string&gt;} [options.allowedTools] - Token allowed tools (onboarding tier policy)
1976
+ * @param {function} [options.spawnFn] - Injectable process runner for tests
1977
+ * @param {number} [options.timeoutMs=300000] - Timeout in milliseconds
1978
+ * @returns {Promise&lt;{ message: string, statePatch: object|null, flags: array }&gt;}
1979
+ */
1980
+ async function runClaudeTurn(options) {
1981
+ const {
1982
+ systemPrompt,
1983
+ turnMessage,
1984
+ turn = 1,
1985
+ maxTurns = 30,
1986
+ phase = 'handshake',
1987
+ overlapScore = 0.15,
1988
+ activeThreads = [],
1989
+ candidateCollaborations = [],
1990
+ closeSignal = false,
1991
+ capabilities = [],
1992
+ allowedTopics = [],
1993
+ allowedTools = [],
1994
+ spawnFn = spawnClaude,
1995
+ timeoutMs = HARD_FALLBACK_TURN_TIMEOUT_MS
1996
+ } = options;
1997
+ &nbsp;
1998
+ const turnPrompt = buildTurnPrompt({
1999
+ turnMessage,
2000
+ turn,
2001
+ maxTurns,
2002
+ phase,
2003
+ overlapScore,
2004
+ activeThreads,
2005
+ candidateCollaborations,
2006
+ closeSignal
2007
+ });
2008
+ &nbsp;
2009
+ const startAt = Date.now();
2010
+ const effectiveAllowedTools = resolveClaudeAllowedTools({ capabilities, allowedTopics, allowedTools });
2011
+ const allowedToolsArg = buildClaudeToolArg(effectiveAllowedTools);
2012
+ const args = [
2013
+ '-p',
2014
+ '--output-format', 'json',
2015
+ '--system-prompt', systemPrompt,
2016
+ '--model', DEFAULT_CLAUDE_MODEL
2017
+ ];
2018
+ &nbsp;
2019
+ // We always provide --allowedTools explicitly so token permissioning stays
2020
+ // enforced in Claude mode even after moving to stateless turns.
2021
+ if (allowedToolsArg) {
2022
+ args.push('--allowedTools', allowedToolsArg);
2023
+ }
2024
+ args.push('--', turnPrompt);
2025
+ &nbsp;
2026
+ logger.debug('Spawning Claude subagent turn', {
2027
+ event: 'subagent_turn_start',
2028
+ data: {
2029
+ turn,
2030
+ max_turns: maxTurns,
2031
+ phase,
2032
+ is_stateless: true,
2033
+ allowed_tools: effectiveAllowedTools,
2034
+ timeout_ms: timeoutMs
2035
+ }
2036
+ });
2037
+ &nbsp;
2038
+ const { stdout } = await spawnFn(args, timeoutMs);
2039
+ const { result } = extractResultFromJson(stdout);
2040
+ const parsed = parseSubagentResponse(result);
2041
+ &nbsp;
2042
+ logger.debug('Claude subagent turn completed', {
2043
+ event: 'subagent_turn_complete',
2044
+ data: {
2045
+ turn,
2046
+ duration_ms: Date.now() - startAt,
2047
+ message_length: parsed.message.length,
2048
+ has_state_patch: Boolean(parsed.statePatch),
2049
+ flag_count: parsed.flags.length
2050
+ }
2051
+ });
2052
+ &nbsp;
2053
+ return {
2054
+ message: parsed.message,
2055
+ statePatch: parsed.statePatch,
2056
+ flags: parsed.flags
2057
+ };
2058
+ }
2059
+ &nbsp;
2060
+ /**
2061
+ * Run a summary turn in stateless Claude mode.
2062
+ *
2063
+ * @param {Object} options
2064
+ * @param {string} options.prompt - Unified summary prompt
2065
+ * @param {string} [options.reason] - Why the conversation is ending
2066
+ * @param {Array&lt;string&gt;} [options.capabilities] - Token capabilities for summary turn tooling
2067
+ * @param {Array&lt;string&gt;} [options.allowedTopics] - Token allowed topics for summary turn tooling
2068
+ * @param {Array&lt;string&gt;} [options.allowedTools] - Token allowed tools for summary turn tooling
2069
+ * @param {function} [options.spawnFn] - Injectable process runner for tests
2070
+ * @param {number} [options.timeoutMs=300000] - Timeout in milliseconds
2071
+ * @returns {Promise&lt;{ summary: string, ownerSummary: string, actionItems: array, flags: array }&gt;}
2072
+ */
2073
+ async function runClaudeSummary(options = {}) {
2074
+ const {
2075
+ prompt,
2076
+ reason,
2077
+ capabilities = [],
2078
+ allowedTopics = [],
2079
+ allowedTools = [],
2080
+ spawnFn = spawnClaude,
2081
+ timeoutMs = HARD_FALLBACK_TURN_TIMEOUT_MS
2082
+ } = options;
2083
+ &nbsp;
2084
+ const summaryPrompt = String(prompt <span class="branch-0 cbranch-no" title="branch not covered" >|| '')</span>.trim();
2085
+ if (!summaryPrompt) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2086
+ <span class="cstat-no" title="statement not covered" > throw new Error('Cannot summarize without a prompt');</span>
2087
+ <span class="cstat-no" title="statement not covered" > }</span>
2088
+ &nbsp;
2089
+ const effectiveAllowedTools = resolveClaudeAllowedTools({ capabilities, allowedTopics, allowedTools });
2090
+ const allowedToolsArg = buildClaudeToolArg(effectiveAllowedTools);
2091
+ &nbsp;
2092
+ const args = [
2093
+ '-p',
2094
+ '--output-format', 'json',
2095
+ '--model', DEFAULT_CLAUDE_MODEL
2096
+ ];
2097
+ &nbsp;
2098
+ if (allowedToolsArg) {
2099
+ args.push('--allowedTools', allowedToolsArg);
2100
+ }
2101
+ args.push(
2102
+ '--append-system-prompt',
2103
+ `Conversation summary mode. Reason: ${reason <span class="branch-0 cbranch-no" title="branch not covered" >|| 'conversation ended'}</span>. Return only structured summary JSON.`,
2104
+ '--',
2105
+ summaryPrompt
2106
+ );
2107
+ &nbsp;
2108
+ const startAt = Date.now();
2109
+ &nbsp;
2110
+ logger.debug('Spawning Claude summary', {
2111
+ event: 'subagent_summary_start',
2112
+ data: {
2113
+ reason: reason <span class="branch-0 cbranch-no" title="branch not covered" >|| 'conversation ended',</span>
2114
+ allowed_tools: effectiveAllowedTools
2115
+ }
2116
+ });
2117
+ &nbsp;
2118
+ const { stdout } = await spawnFn(args, timeoutMs);
2119
+ const { result } = extractResultFromJson(stdout);
2120
+ const summaryPayload = parseSummaryPayload(result);
2121
+ const parsedSummary = summarizeFromPayload(summaryPayload, result.trim());
2122
+ &nbsp;
2123
+ if (parsedSummary) {
2124
+ logger.debug('Claude summary completed', {
2125
+ event: 'subagent_summary_complete',
2126
+ data: {
2127
+ duration_ms: Date.now() - startAt,
2128
+ has_summary: Boolean(parsedSummary.summary),
2129
+ action_item_count: parsedSummary.actionItems.length
2130
+ }
2131
+ });
2132
+ return parsedSummary;
2133
+ }
2134
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
2135
+ <span class="cstat-no" title="statement not covered" > // Fallback: use raw text as summary</span>
2136
+ const summaryText = result.replace(A2A_RESPONSE_REGEX, '').trim() || result.trim();
2137
+ return {
2138
+ summary: summaryText,
2139
+ ownerSummary: summaryText,
2140
+ actionItems: [],
2141
+ flags: []
2142
+ };
2143
+ }
2144
+ &nbsp;
2145
+ module.exports = {
2146
+ isClaudeAvailable,
2147
+ buildSubagentSystemPrompt,
2148
+ buildTurnPrompt,
2149
+ resolveClaudeAllowedTools,
2150
+ runClaudeTurn,
2151
+ runClaudeSummary,
2152
+ parseSubagentResponse
2153
+ };
2154
+ &nbsp;</pre></td></tr></table></pre>
2155
+
2156
+ <div class='push'></div><!-- for sticky footer -->
2157
+ </div><!-- /wrapper -->
2158
+ <div class='footer quiet pad2 space-top1 center small'>
2159
+ Code coverage generated by
2160
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2161
+ at 2026-03-03T22:25:10.857Z
2162
+ </div>
2163
+ <script src="../../prettify.js"></script>
2164
+ <script>
2165
+ window.onload = function () {
2166
+ prettyPrint();
2167
+ };
2168
+ </script>
2169
+ <script src="../../sorter.js"></script>
2170
+ <script src="../../block-navigation.js"></script>
2171
+ </body>
2172
+ </html>
2173
+