@rebasepro/server-core 0.0.1-canary.4d4fb3e
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.
- package/LICENSE +6 -0
- package/README.md +40 -0
- package/build-errors.txt +52 -0
- package/coverage/clover.xml +3739 -0
- package/coverage/coverage-final.json +31 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +266 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov-report/src/api/ast-schema-editor.ts.html +952 -0
- package/coverage/lcov-report/src/api/errors.ts.html +472 -0
- package/coverage/lcov-report/src/api/graphql/graphql-schema-generator.ts.html +1069 -0
- package/coverage/lcov-report/src/api/graphql/index.html +116 -0
- package/coverage/lcov-report/src/api/index.html +176 -0
- package/coverage/lcov-report/src/api/openapi-generator.ts.html +565 -0
- package/coverage/lcov-report/src/api/rest/api-generator.ts.html +994 -0
- package/coverage/lcov-report/src/api/rest/index.html +131 -0
- package/coverage/lcov-report/src/api/rest/query-parser.ts.html +550 -0
- package/coverage/lcov-report/src/api/schema-editor-routes.ts.html +202 -0
- package/coverage/lcov-report/src/api/server.ts.html +823 -0
- package/coverage/lcov-report/src/auth/admin-routes.ts.html +973 -0
- package/coverage/lcov-report/src/auth/index.html +176 -0
- package/coverage/lcov-report/src/auth/jwt.ts.html +574 -0
- package/coverage/lcov-report/src/auth/middleware.ts.html +745 -0
- package/coverage/lcov-report/src/auth/password.ts.html +310 -0
- package/coverage/lcov-report/src/auth/services.ts.html +2074 -0
- package/coverage/lcov-report/src/collections/index.html +116 -0
- package/coverage/lcov-report/src/collections/loader.ts.html +232 -0
- package/coverage/lcov-report/src/db/auth-schema.ts.html +523 -0
- package/coverage/lcov-report/src/db/data-transformer.ts.html +1753 -0
- package/coverage/lcov-report/src/db/entityService.ts.html +700 -0
- package/coverage/lcov-report/src/db/index.html +146 -0
- package/coverage/lcov-report/src/db/services/EntityFetchService.ts.html +4048 -0
- package/coverage/lcov-report/src/db/services/EntityPersistService.ts.html +883 -0
- package/coverage/lcov-report/src/db/services/RelationService.ts.html +3121 -0
- package/coverage/lcov-report/src/db/services/entity-helpers.ts.html +442 -0
- package/coverage/lcov-report/src/db/services/index.html +176 -0
- package/coverage/lcov-report/src/db/services/index.ts.html +124 -0
- package/coverage/lcov-report/src/generate-drizzle-schema-logic.ts.html +1960 -0
- package/coverage/lcov-report/src/index.html +116 -0
- package/coverage/lcov-report/src/services/driver-registry.ts.html +631 -0
- package/coverage/lcov-report/src/services/index.html +131 -0
- package/coverage/lcov-report/src/services/postgresDataDriver.ts.html +3025 -0
- package/coverage/lcov-report/src/storage/LocalStorageController.ts.html +1189 -0
- package/coverage/lcov-report/src/storage/S3StorageController.ts.html +970 -0
- package/coverage/lcov-report/src/storage/index.html +161 -0
- package/coverage/lcov-report/src/storage/storage-registry.ts.html +646 -0
- package/coverage/lcov-report/src/storage/types.ts.html +451 -0
- package/coverage/lcov-report/src/utils/drizzle-conditions.ts.html +3082 -0
- package/coverage/lcov-report/src/utils/index.html +116 -0
- package/coverage/lcov.info +7179 -0
- package/dist/common/src/collections/CollectionRegistry.d.ts +48 -0
- package/dist/common/src/collections/index.d.ts +1 -0
- package/dist/common/src/data/buildRebaseData.d.ts +14 -0
- package/dist/common/src/index.d.ts +3 -0
- package/dist/common/src/util/builders.d.ts +57 -0
- package/dist/common/src/util/callbacks.d.ts +6 -0
- package/dist/common/src/util/collections.d.ts +11 -0
- package/dist/common/src/util/common.d.ts +2 -0
- package/dist/common/src/util/conditions.d.ts +26 -0
- package/dist/common/src/util/entities.d.ts +36 -0
- package/dist/common/src/util/enums.d.ts +3 -0
- package/dist/common/src/util/index.d.ts +16 -0
- package/dist/common/src/util/navigation_from_path.d.ts +34 -0
- package/dist/common/src/util/navigation_utils.d.ts +20 -0
- package/dist/common/src/util/parent_references_from_path.d.ts +6 -0
- package/dist/common/src/util/paths.d.ts +14 -0
- package/dist/common/src/util/permissions.d.ts +5 -0
- package/dist/common/src/util/references.d.ts +2 -0
- package/dist/common/src/util/relations.d.ts +12 -0
- package/dist/common/src/util/resolutions.d.ts +72 -0
- package/dist/common/src/util/storage.d.ts +24 -0
- package/dist/index-BeMqpmfQ.js +239 -0
- package/dist/index-BeMqpmfQ.js.map +1 -0
- package/dist/index-bl4J3lNb.js +55823 -0
- package/dist/index-bl4J3lNb.js.map +1 -0
- package/dist/index.es.js +58 -0
- package/dist/index.es.js.map +1 -0
- package/dist/index.umd.js +56062 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/server-core/src/api/ast-schema-editor.d.ts +21 -0
- package/dist/server-core/src/api/collections_for_test/callbacks_test_collection.d.ts +2 -0
- package/dist/server-core/src/api/errors.d.ts +35 -0
- package/dist/server-core/src/api/graphql/graphql-schema-generator.d.ts +35 -0
- package/dist/server-core/src/api/graphql/index.d.ts +1 -0
- package/dist/server-core/src/api/index.d.ts +9 -0
- package/dist/server-core/src/api/openapi-generator.d.ts +2 -0
- package/dist/server-core/src/api/rest/api-generator.d.ts +64 -0
- package/dist/server-core/src/api/rest/index.d.ts +1 -0
- package/dist/server-core/src/api/rest/query-parser.d.ts +9 -0
- package/dist/server-core/src/api/schema-editor-routes.d.ts +3 -0
- package/dist/server-core/src/api/server.d.ts +40 -0
- package/dist/server-core/src/api/types.d.ts +90 -0
- package/dist/server-core/src/auth/admin-routes.d.ts +7 -0
- package/dist/server-core/src/auth/google-oauth.d.ts +20 -0
- package/dist/server-core/src/auth/index.d.ts +12 -0
- package/dist/server-core/src/auth/interfaces.d.ts +270 -0
- package/dist/server-core/src/auth/jwt.d.ts +42 -0
- package/dist/server-core/src/auth/middleware.d.ts +56 -0
- package/dist/server-core/src/auth/password.d.ts +22 -0
- package/dist/server-core/src/auth/rate-limiter.d.ts +31 -0
- package/dist/server-core/src/auth/routes.d.ts +17 -0
- package/dist/server-core/src/bootstrappers/index.d.ts +0 -0
- package/dist/server-core/src/collections/BackendCollectionRegistry.d.ts +13 -0
- package/dist/server-core/src/collections/loader.d.ts +5 -0
- package/dist/server-core/src/db/interfaces.d.ts +18 -0
- package/dist/server-core/src/email/index.d.ts +6 -0
- package/dist/server-core/src/email/smtp-email-service.d.ts +25 -0
- package/dist/server-core/src/email/templates.d.ts +33 -0
- package/dist/server-core/src/email/types.d.ts +110 -0
- package/dist/server-core/src/functions/function-loader.d.ts +17 -0
- package/dist/server-core/src/functions/function-routes.d.ts +10 -0
- package/dist/server-core/src/functions/index.d.ts +3 -0
- package/dist/server-core/src/history/history-routes.d.ts +23 -0
- package/dist/server-core/src/history/index.d.ts +1 -0
- package/dist/server-core/src/index.d.ts +24 -0
- package/dist/server-core/src/init.d.ts +49 -0
- package/dist/server-core/src/serve-spa.d.ts +30 -0
- package/dist/server-core/src/services/driver-registry.d.ts +78 -0
- package/dist/server-core/src/storage/LocalStorageController.d.ts +46 -0
- package/dist/server-core/src/storage/S3StorageController.d.ts +36 -0
- package/dist/server-core/src/storage/index.d.ts +18 -0
- package/dist/server-core/src/storage/routes.d.ts +38 -0
- package/dist/server-core/src/storage/storage-registry.d.ts +78 -0
- package/dist/server-core/src/storage/types.d.ts +91 -0
- package/dist/server-core/src/types/index.d.ts +11 -0
- package/dist/server-core/src/utils/logging.d.ts +9 -0
- package/dist/server-core/src/utils/sql.d.ts +27 -0
- package/dist/types/src/controllers/analytics_controller.d.ts +7 -0
- package/dist/types/src/controllers/auth.d.ts +117 -0
- package/dist/types/src/controllers/client.d.ts +58 -0
- package/dist/types/src/controllers/collection_registry.d.ts +44 -0
- package/dist/types/src/controllers/customization_controller.d.ts +54 -0
- package/dist/types/src/controllers/data.d.ts +141 -0
- package/dist/types/src/controllers/data_driver.d.ts +168 -0
- package/dist/types/src/controllers/database_admin.d.ts +11 -0
- package/dist/types/src/controllers/dialogs_controller.d.ts +36 -0
- package/dist/types/src/controllers/effective_role.d.ts +4 -0
- package/dist/types/src/controllers/index.d.ts +17 -0
- package/dist/types/src/controllers/local_config_persistence.d.ts +20 -0
- package/dist/types/src/controllers/navigation.d.ts +213 -0
- package/dist/types/src/controllers/registry.d.ts +51 -0
- package/dist/types/src/controllers/side_dialogs_controller.d.ts +67 -0
- package/dist/types/src/controllers/side_entity_controller.d.ts +89 -0
- package/dist/types/src/controllers/snackbar.d.ts +24 -0
- package/dist/types/src/controllers/storage.d.ts +173 -0
- package/dist/types/src/index.d.ts +4 -0
- package/dist/types/src/rebase_context.d.ts +101 -0
- package/dist/types/src/types/backend.d.ts +533 -0
- package/dist/types/src/types/builders.d.ts +14 -0
- package/dist/types/src/types/chips.d.ts +5 -0
- package/dist/types/src/types/collections.d.ts +812 -0
- package/dist/types/src/types/data_source.d.ts +64 -0
- package/dist/types/src/types/entities.d.ts +145 -0
- package/dist/types/src/types/entity_actions.d.ts +98 -0
- package/dist/types/src/types/entity_callbacks.d.ts +173 -0
- package/dist/types/src/types/entity_link_builder.d.ts +7 -0
- package/dist/types/src/types/entity_overrides.d.ts +9 -0
- package/dist/types/src/types/entity_views.d.ts +61 -0
- package/dist/types/src/types/export_import.d.ts +21 -0
- package/dist/types/src/types/index.d.ts +22 -0
- package/dist/types/src/types/locales.d.ts +4 -0
- package/dist/types/src/types/modify_collections.d.ts +5 -0
- package/dist/types/src/types/plugins.d.ts +225 -0
- package/dist/types/src/types/properties.d.ts +1091 -0
- package/dist/types/src/types/property_config.d.ts +70 -0
- package/dist/types/src/types/relations.d.ts +336 -0
- package/dist/types/src/types/slots.d.ts +228 -0
- package/dist/types/src/types/translations.d.ts +826 -0
- package/dist/types/src/types/user_management_delegate.d.ts +120 -0
- package/dist/types/src/types/websockets.d.ts +78 -0
- package/dist/types/src/users/index.d.ts +2 -0
- package/dist/types/src/users/roles.d.ts +22 -0
- package/dist/types/src/users/user.d.ts +46 -0
- package/history_diff.log +385 -0
- package/jest.config.cjs +16 -0
- package/package.json +86 -0
- package/scratch.ts +8 -0
- package/src/api/ast-schema-editor.ts +289 -0
- package/src/api/collections_for_test/callbacks_test_collection.ts +57 -0
- package/src/api/errors.ts +155 -0
- package/src/api/graphql/graphql-schema-generator.ts +334 -0
- package/src/api/graphql/index.ts +2 -0
- package/src/api/index.ts +11 -0
- package/src/api/openapi-generator.ts +160 -0
- package/src/api/rest/api-generator.ts +466 -0
- package/src/api/rest/index.ts +2 -0
- package/src/api/rest/query-parser.ts +155 -0
- package/src/api/schema-editor-routes.ts +39 -0
- package/src/api/server.ts +245 -0
- package/src/api/types.ts +90 -0
- package/src/auth/admin-routes.ts +488 -0
- package/src/auth/google-oauth.ts +60 -0
- package/src/auth/index.ts +21 -0
- package/src/auth/interfaces.ts +316 -0
- package/src/auth/jwt.ts +164 -0
- package/src/auth/middleware.ts +235 -0
- package/src/auth/password.ts +75 -0
- package/src/auth/rate-limiter.ts +129 -0
- package/src/auth/routes.ts +730 -0
- package/src/bootstrappers/index.ts +1 -0
- package/src/collections/BackendCollectionRegistry.ts +20 -0
- package/src/collections/loader.ts +49 -0
- package/src/db/interfaces.ts +60 -0
- package/src/email/index.ts +17 -0
- package/src/email/smtp-email-service.ts +88 -0
- package/src/email/templates.ts +301 -0
- package/src/email/types.ts +112 -0
- package/src/functions/function-loader.ts +91 -0
- package/src/functions/function-routes.ts +31 -0
- package/src/functions/index.ts +3 -0
- package/src/history/history-routes.ts +128 -0
- package/src/history/index.ts +2 -0
- package/src/index.ts +56 -0
- package/src/init.ts +309 -0
- package/src/serve-spa.ts +81 -0
- package/src/services/driver-registry.ts +182 -0
- package/src/storage/LocalStorageController.ts +368 -0
- package/src/storage/S3StorageController.ts +295 -0
- package/src/storage/index.ts +32 -0
- package/src/storage/routes.ts +247 -0
- package/src/storage/storage-registry.ts +187 -0
- package/src/storage/types.ts +122 -0
- package/src/types/index.ts +27 -0
- package/src/utils/logging.ts +35 -0
- package/src/utils/sql.ts +38 -0
- package/test/admin-routes.test.ts +591 -0
- package/test/api-generator.test.ts +458 -0
- package/test/ast-schema-editor.test.ts +61 -0
- package/test/auth-middleware-hono.test.ts +321 -0
- package/test/auth-routes.test.ts +868 -0
- package/test/driver-registry.test.ts +280 -0
- package/test/errors-hono.test.ts +133 -0
- package/test/errors.test.ts +150 -0
- package/test/jwt-security.test.ts +173 -0
- package/test/jwt.test.ts +311 -0
- package/test/middleware.test.ts +295 -0
- package/test/password.test.ts +165 -0
- package/test/query-parser.test.ts +258 -0
- package/test/rate-limiter.test.ts +102 -0
- package/test/storage-local.test.ts +278 -0
- package/test/storage-registry.test.ts +280 -0
- package/test/storage-routes.test.ts +218 -0
- package/test/storage-s3.test.ts +301 -0
- package/test-ast.ts +28 -0
- package/test_output.txt +1133 -0
- package/tsconfig.json +49 -0
- package/tsconfig.prod.json +20 -0
- package/vite.config.ts +78 -0
- package/vite.config.ts.timestamp-1775065397568-8a853255edf6e.mjs +46 -0
|
@@ -0,0 +1,4048 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/db/services/EntityFetchService.ts</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../../../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../../../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../../../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../../../index.html">All files</a> / <a href="index.html">src/db/services</a> EntityFetchService.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">2.45% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>13/530</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">0% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>0/286</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">5.17% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>3/58</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">2.51% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>12/477</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 low'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
+
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
+
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
+
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
+
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
+
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
+
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
+
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
+
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
+
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
+
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
+
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
+
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
+
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
+
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
+
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
+
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
+
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
+
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
+
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
+
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
+
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
+
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
+
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
+
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
+
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
+
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
+
<a name='L409'></a><a href='#L409'>409</a>
|
|
475
|
+
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
+
<a name='L411'></a><a href='#L411'>411</a>
|
|
477
|
+
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
+
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
+
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
+
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
+
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
+
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
+
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
+
<a name='L419'></a><a href='#L419'>419</a>
|
|
485
|
+
<a name='L420'></a><a href='#L420'>420</a>
|
|
486
|
+
<a name='L421'></a><a href='#L421'>421</a>
|
|
487
|
+
<a name='L422'></a><a href='#L422'>422</a>
|
|
488
|
+
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
|
+
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
|
+
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
+
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
+
<a name='L427'></a><a href='#L427'>427</a>
|
|
493
|
+
<a name='L428'></a><a href='#L428'>428</a>
|
|
494
|
+
<a name='L429'></a><a href='#L429'>429</a>
|
|
495
|
+
<a name='L430'></a><a href='#L430'>430</a>
|
|
496
|
+
<a name='L431'></a><a href='#L431'>431</a>
|
|
497
|
+
<a name='L432'></a><a href='#L432'>432</a>
|
|
498
|
+
<a name='L433'></a><a href='#L433'>433</a>
|
|
499
|
+
<a name='L434'></a><a href='#L434'>434</a>
|
|
500
|
+
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
|
+
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
|
+
<a name='L437'></a><a href='#L437'>437</a>
|
|
503
|
+
<a name='L438'></a><a href='#L438'>438</a>
|
|
504
|
+
<a name='L439'></a><a href='#L439'>439</a>
|
|
505
|
+
<a name='L440'></a><a href='#L440'>440</a>
|
|
506
|
+
<a name='L441'></a><a href='#L441'>441</a>
|
|
507
|
+
<a name='L442'></a><a href='#L442'>442</a>
|
|
508
|
+
<a name='L443'></a><a href='#L443'>443</a>
|
|
509
|
+
<a name='L444'></a><a href='#L444'>444</a>
|
|
510
|
+
<a name='L445'></a><a href='#L445'>445</a>
|
|
511
|
+
<a name='L446'></a><a href='#L446'>446</a>
|
|
512
|
+
<a name='L447'></a><a href='#L447'>447</a>
|
|
513
|
+
<a name='L448'></a><a href='#L448'>448</a>
|
|
514
|
+
<a name='L449'></a><a href='#L449'>449</a>
|
|
515
|
+
<a name='L450'></a><a href='#L450'>450</a>
|
|
516
|
+
<a name='L451'></a><a href='#L451'>451</a>
|
|
517
|
+
<a name='L452'></a><a href='#L452'>452</a>
|
|
518
|
+
<a name='L453'></a><a href='#L453'>453</a>
|
|
519
|
+
<a name='L454'></a><a href='#L454'>454</a>
|
|
520
|
+
<a name='L455'></a><a href='#L455'>455</a>
|
|
521
|
+
<a name='L456'></a><a href='#L456'>456</a>
|
|
522
|
+
<a name='L457'></a><a href='#L457'>457</a>
|
|
523
|
+
<a name='L458'></a><a href='#L458'>458</a>
|
|
524
|
+
<a name='L459'></a><a href='#L459'>459</a>
|
|
525
|
+
<a name='L460'></a><a href='#L460'>460</a>
|
|
526
|
+
<a name='L461'></a><a href='#L461'>461</a>
|
|
527
|
+
<a name='L462'></a><a href='#L462'>462</a>
|
|
528
|
+
<a name='L463'></a><a href='#L463'>463</a>
|
|
529
|
+
<a name='L464'></a><a href='#L464'>464</a>
|
|
530
|
+
<a name='L465'></a><a href='#L465'>465</a>
|
|
531
|
+
<a name='L466'></a><a href='#L466'>466</a>
|
|
532
|
+
<a name='L467'></a><a href='#L467'>467</a>
|
|
533
|
+
<a name='L468'></a><a href='#L468'>468</a>
|
|
534
|
+
<a name='L469'></a><a href='#L469'>469</a>
|
|
535
|
+
<a name='L470'></a><a href='#L470'>470</a>
|
|
536
|
+
<a name='L471'></a><a href='#L471'>471</a>
|
|
537
|
+
<a name='L472'></a><a href='#L472'>472</a>
|
|
538
|
+
<a name='L473'></a><a href='#L473'>473</a>
|
|
539
|
+
<a name='L474'></a><a href='#L474'>474</a>
|
|
540
|
+
<a name='L475'></a><a href='#L475'>475</a>
|
|
541
|
+
<a name='L476'></a><a href='#L476'>476</a>
|
|
542
|
+
<a name='L477'></a><a href='#L477'>477</a>
|
|
543
|
+
<a name='L478'></a><a href='#L478'>478</a>
|
|
544
|
+
<a name='L479'></a><a href='#L479'>479</a>
|
|
545
|
+
<a name='L480'></a><a href='#L480'>480</a>
|
|
546
|
+
<a name='L481'></a><a href='#L481'>481</a>
|
|
547
|
+
<a name='L482'></a><a href='#L482'>482</a>
|
|
548
|
+
<a name='L483'></a><a href='#L483'>483</a>
|
|
549
|
+
<a name='L484'></a><a href='#L484'>484</a>
|
|
550
|
+
<a name='L485'></a><a href='#L485'>485</a>
|
|
551
|
+
<a name='L486'></a><a href='#L486'>486</a>
|
|
552
|
+
<a name='L487'></a><a href='#L487'>487</a>
|
|
553
|
+
<a name='L488'></a><a href='#L488'>488</a>
|
|
554
|
+
<a name='L489'></a><a href='#L489'>489</a>
|
|
555
|
+
<a name='L490'></a><a href='#L490'>490</a>
|
|
556
|
+
<a name='L491'></a><a href='#L491'>491</a>
|
|
557
|
+
<a name='L492'></a><a href='#L492'>492</a>
|
|
558
|
+
<a name='L493'></a><a href='#L493'>493</a>
|
|
559
|
+
<a name='L494'></a><a href='#L494'>494</a>
|
|
560
|
+
<a name='L495'></a><a href='#L495'>495</a>
|
|
561
|
+
<a name='L496'></a><a href='#L496'>496</a>
|
|
562
|
+
<a name='L497'></a><a href='#L497'>497</a>
|
|
563
|
+
<a name='L498'></a><a href='#L498'>498</a>
|
|
564
|
+
<a name='L499'></a><a href='#L499'>499</a>
|
|
565
|
+
<a name='L500'></a><a href='#L500'>500</a>
|
|
566
|
+
<a name='L501'></a><a href='#L501'>501</a>
|
|
567
|
+
<a name='L502'></a><a href='#L502'>502</a>
|
|
568
|
+
<a name='L503'></a><a href='#L503'>503</a>
|
|
569
|
+
<a name='L504'></a><a href='#L504'>504</a>
|
|
570
|
+
<a name='L505'></a><a href='#L505'>505</a>
|
|
571
|
+
<a name='L506'></a><a href='#L506'>506</a>
|
|
572
|
+
<a name='L507'></a><a href='#L507'>507</a>
|
|
573
|
+
<a name='L508'></a><a href='#L508'>508</a>
|
|
574
|
+
<a name='L509'></a><a href='#L509'>509</a>
|
|
575
|
+
<a name='L510'></a><a href='#L510'>510</a>
|
|
576
|
+
<a name='L511'></a><a href='#L511'>511</a>
|
|
577
|
+
<a name='L512'></a><a href='#L512'>512</a>
|
|
578
|
+
<a name='L513'></a><a href='#L513'>513</a>
|
|
579
|
+
<a name='L514'></a><a href='#L514'>514</a>
|
|
580
|
+
<a name='L515'></a><a href='#L515'>515</a>
|
|
581
|
+
<a name='L516'></a><a href='#L516'>516</a>
|
|
582
|
+
<a name='L517'></a><a href='#L517'>517</a>
|
|
583
|
+
<a name='L518'></a><a href='#L518'>518</a>
|
|
584
|
+
<a name='L519'></a><a href='#L519'>519</a>
|
|
585
|
+
<a name='L520'></a><a href='#L520'>520</a>
|
|
586
|
+
<a name='L521'></a><a href='#L521'>521</a>
|
|
587
|
+
<a name='L522'></a><a href='#L522'>522</a>
|
|
588
|
+
<a name='L523'></a><a href='#L523'>523</a>
|
|
589
|
+
<a name='L524'></a><a href='#L524'>524</a>
|
|
590
|
+
<a name='L525'></a><a href='#L525'>525</a>
|
|
591
|
+
<a name='L526'></a><a href='#L526'>526</a>
|
|
592
|
+
<a name='L527'></a><a href='#L527'>527</a>
|
|
593
|
+
<a name='L528'></a><a href='#L528'>528</a>
|
|
594
|
+
<a name='L529'></a><a href='#L529'>529</a>
|
|
595
|
+
<a name='L530'></a><a href='#L530'>530</a>
|
|
596
|
+
<a name='L531'></a><a href='#L531'>531</a>
|
|
597
|
+
<a name='L532'></a><a href='#L532'>532</a>
|
|
598
|
+
<a name='L533'></a><a href='#L533'>533</a>
|
|
599
|
+
<a name='L534'></a><a href='#L534'>534</a>
|
|
600
|
+
<a name='L535'></a><a href='#L535'>535</a>
|
|
601
|
+
<a name='L536'></a><a href='#L536'>536</a>
|
|
602
|
+
<a name='L537'></a><a href='#L537'>537</a>
|
|
603
|
+
<a name='L538'></a><a href='#L538'>538</a>
|
|
604
|
+
<a name='L539'></a><a href='#L539'>539</a>
|
|
605
|
+
<a name='L540'></a><a href='#L540'>540</a>
|
|
606
|
+
<a name='L541'></a><a href='#L541'>541</a>
|
|
607
|
+
<a name='L542'></a><a href='#L542'>542</a>
|
|
608
|
+
<a name='L543'></a><a href='#L543'>543</a>
|
|
609
|
+
<a name='L544'></a><a href='#L544'>544</a>
|
|
610
|
+
<a name='L545'></a><a href='#L545'>545</a>
|
|
611
|
+
<a name='L546'></a><a href='#L546'>546</a>
|
|
612
|
+
<a name='L547'></a><a href='#L547'>547</a>
|
|
613
|
+
<a name='L548'></a><a href='#L548'>548</a>
|
|
614
|
+
<a name='L549'></a><a href='#L549'>549</a>
|
|
615
|
+
<a name='L550'></a><a href='#L550'>550</a>
|
|
616
|
+
<a name='L551'></a><a href='#L551'>551</a>
|
|
617
|
+
<a name='L552'></a><a href='#L552'>552</a>
|
|
618
|
+
<a name='L553'></a><a href='#L553'>553</a>
|
|
619
|
+
<a name='L554'></a><a href='#L554'>554</a>
|
|
620
|
+
<a name='L555'></a><a href='#L555'>555</a>
|
|
621
|
+
<a name='L556'></a><a href='#L556'>556</a>
|
|
622
|
+
<a name='L557'></a><a href='#L557'>557</a>
|
|
623
|
+
<a name='L558'></a><a href='#L558'>558</a>
|
|
624
|
+
<a name='L559'></a><a href='#L559'>559</a>
|
|
625
|
+
<a name='L560'></a><a href='#L560'>560</a>
|
|
626
|
+
<a name='L561'></a><a href='#L561'>561</a>
|
|
627
|
+
<a name='L562'></a><a href='#L562'>562</a>
|
|
628
|
+
<a name='L563'></a><a href='#L563'>563</a>
|
|
629
|
+
<a name='L564'></a><a href='#L564'>564</a>
|
|
630
|
+
<a name='L565'></a><a href='#L565'>565</a>
|
|
631
|
+
<a name='L566'></a><a href='#L566'>566</a>
|
|
632
|
+
<a name='L567'></a><a href='#L567'>567</a>
|
|
633
|
+
<a name='L568'></a><a href='#L568'>568</a>
|
|
634
|
+
<a name='L569'></a><a href='#L569'>569</a>
|
|
635
|
+
<a name='L570'></a><a href='#L570'>570</a>
|
|
636
|
+
<a name='L571'></a><a href='#L571'>571</a>
|
|
637
|
+
<a name='L572'></a><a href='#L572'>572</a>
|
|
638
|
+
<a name='L573'></a><a href='#L573'>573</a>
|
|
639
|
+
<a name='L574'></a><a href='#L574'>574</a>
|
|
640
|
+
<a name='L575'></a><a href='#L575'>575</a>
|
|
641
|
+
<a name='L576'></a><a href='#L576'>576</a>
|
|
642
|
+
<a name='L577'></a><a href='#L577'>577</a>
|
|
643
|
+
<a name='L578'></a><a href='#L578'>578</a>
|
|
644
|
+
<a name='L579'></a><a href='#L579'>579</a>
|
|
645
|
+
<a name='L580'></a><a href='#L580'>580</a>
|
|
646
|
+
<a name='L581'></a><a href='#L581'>581</a>
|
|
647
|
+
<a name='L582'></a><a href='#L582'>582</a>
|
|
648
|
+
<a name='L583'></a><a href='#L583'>583</a>
|
|
649
|
+
<a name='L584'></a><a href='#L584'>584</a>
|
|
650
|
+
<a name='L585'></a><a href='#L585'>585</a>
|
|
651
|
+
<a name='L586'></a><a href='#L586'>586</a>
|
|
652
|
+
<a name='L587'></a><a href='#L587'>587</a>
|
|
653
|
+
<a name='L588'></a><a href='#L588'>588</a>
|
|
654
|
+
<a name='L589'></a><a href='#L589'>589</a>
|
|
655
|
+
<a name='L590'></a><a href='#L590'>590</a>
|
|
656
|
+
<a name='L591'></a><a href='#L591'>591</a>
|
|
657
|
+
<a name='L592'></a><a href='#L592'>592</a>
|
|
658
|
+
<a name='L593'></a><a href='#L593'>593</a>
|
|
659
|
+
<a name='L594'></a><a href='#L594'>594</a>
|
|
660
|
+
<a name='L595'></a><a href='#L595'>595</a>
|
|
661
|
+
<a name='L596'></a><a href='#L596'>596</a>
|
|
662
|
+
<a name='L597'></a><a href='#L597'>597</a>
|
|
663
|
+
<a name='L598'></a><a href='#L598'>598</a>
|
|
664
|
+
<a name='L599'></a><a href='#L599'>599</a>
|
|
665
|
+
<a name='L600'></a><a href='#L600'>600</a>
|
|
666
|
+
<a name='L601'></a><a href='#L601'>601</a>
|
|
667
|
+
<a name='L602'></a><a href='#L602'>602</a>
|
|
668
|
+
<a name='L603'></a><a href='#L603'>603</a>
|
|
669
|
+
<a name='L604'></a><a href='#L604'>604</a>
|
|
670
|
+
<a name='L605'></a><a href='#L605'>605</a>
|
|
671
|
+
<a name='L606'></a><a href='#L606'>606</a>
|
|
672
|
+
<a name='L607'></a><a href='#L607'>607</a>
|
|
673
|
+
<a name='L608'></a><a href='#L608'>608</a>
|
|
674
|
+
<a name='L609'></a><a href='#L609'>609</a>
|
|
675
|
+
<a name='L610'></a><a href='#L610'>610</a>
|
|
676
|
+
<a name='L611'></a><a href='#L611'>611</a>
|
|
677
|
+
<a name='L612'></a><a href='#L612'>612</a>
|
|
678
|
+
<a name='L613'></a><a href='#L613'>613</a>
|
|
679
|
+
<a name='L614'></a><a href='#L614'>614</a>
|
|
680
|
+
<a name='L615'></a><a href='#L615'>615</a>
|
|
681
|
+
<a name='L616'></a><a href='#L616'>616</a>
|
|
682
|
+
<a name='L617'></a><a href='#L617'>617</a>
|
|
683
|
+
<a name='L618'></a><a href='#L618'>618</a>
|
|
684
|
+
<a name='L619'></a><a href='#L619'>619</a>
|
|
685
|
+
<a name='L620'></a><a href='#L620'>620</a>
|
|
686
|
+
<a name='L621'></a><a href='#L621'>621</a>
|
|
687
|
+
<a name='L622'></a><a href='#L622'>622</a>
|
|
688
|
+
<a name='L623'></a><a href='#L623'>623</a>
|
|
689
|
+
<a name='L624'></a><a href='#L624'>624</a>
|
|
690
|
+
<a name='L625'></a><a href='#L625'>625</a>
|
|
691
|
+
<a name='L626'></a><a href='#L626'>626</a>
|
|
692
|
+
<a name='L627'></a><a href='#L627'>627</a>
|
|
693
|
+
<a name='L628'></a><a href='#L628'>628</a>
|
|
694
|
+
<a name='L629'></a><a href='#L629'>629</a>
|
|
695
|
+
<a name='L630'></a><a href='#L630'>630</a>
|
|
696
|
+
<a name='L631'></a><a href='#L631'>631</a>
|
|
697
|
+
<a name='L632'></a><a href='#L632'>632</a>
|
|
698
|
+
<a name='L633'></a><a href='#L633'>633</a>
|
|
699
|
+
<a name='L634'></a><a href='#L634'>634</a>
|
|
700
|
+
<a name='L635'></a><a href='#L635'>635</a>
|
|
701
|
+
<a name='L636'></a><a href='#L636'>636</a>
|
|
702
|
+
<a name='L637'></a><a href='#L637'>637</a>
|
|
703
|
+
<a name='L638'></a><a href='#L638'>638</a>
|
|
704
|
+
<a name='L639'></a><a href='#L639'>639</a>
|
|
705
|
+
<a name='L640'></a><a href='#L640'>640</a>
|
|
706
|
+
<a name='L641'></a><a href='#L641'>641</a>
|
|
707
|
+
<a name='L642'></a><a href='#L642'>642</a>
|
|
708
|
+
<a name='L643'></a><a href='#L643'>643</a>
|
|
709
|
+
<a name='L644'></a><a href='#L644'>644</a>
|
|
710
|
+
<a name='L645'></a><a href='#L645'>645</a>
|
|
711
|
+
<a name='L646'></a><a href='#L646'>646</a>
|
|
712
|
+
<a name='L647'></a><a href='#L647'>647</a>
|
|
713
|
+
<a name='L648'></a><a href='#L648'>648</a>
|
|
714
|
+
<a name='L649'></a><a href='#L649'>649</a>
|
|
715
|
+
<a name='L650'></a><a href='#L650'>650</a>
|
|
716
|
+
<a name='L651'></a><a href='#L651'>651</a>
|
|
717
|
+
<a name='L652'></a><a href='#L652'>652</a>
|
|
718
|
+
<a name='L653'></a><a href='#L653'>653</a>
|
|
719
|
+
<a name='L654'></a><a href='#L654'>654</a>
|
|
720
|
+
<a name='L655'></a><a href='#L655'>655</a>
|
|
721
|
+
<a name='L656'></a><a href='#L656'>656</a>
|
|
722
|
+
<a name='L657'></a><a href='#L657'>657</a>
|
|
723
|
+
<a name='L658'></a><a href='#L658'>658</a>
|
|
724
|
+
<a name='L659'></a><a href='#L659'>659</a>
|
|
725
|
+
<a name='L660'></a><a href='#L660'>660</a>
|
|
726
|
+
<a name='L661'></a><a href='#L661'>661</a>
|
|
727
|
+
<a name='L662'></a><a href='#L662'>662</a>
|
|
728
|
+
<a name='L663'></a><a href='#L663'>663</a>
|
|
729
|
+
<a name='L664'></a><a href='#L664'>664</a>
|
|
730
|
+
<a name='L665'></a><a href='#L665'>665</a>
|
|
731
|
+
<a name='L666'></a><a href='#L666'>666</a>
|
|
732
|
+
<a name='L667'></a><a href='#L667'>667</a>
|
|
733
|
+
<a name='L668'></a><a href='#L668'>668</a>
|
|
734
|
+
<a name='L669'></a><a href='#L669'>669</a>
|
|
735
|
+
<a name='L670'></a><a href='#L670'>670</a>
|
|
736
|
+
<a name='L671'></a><a href='#L671'>671</a>
|
|
737
|
+
<a name='L672'></a><a href='#L672'>672</a>
|
|
738
|
+
<a name='L673'></a><a href='#L673'>673</a>
|
|
739
|
+
<a name='L674'></a><a href='#L674'>674</a>
|
|
740
|
+
<a name='L675'></a><a href='#L675'>675</a>
|
|
741
|
+
<a name='L676'></a><a href='#L676'>676</a>
|
|
742
|
+
<a name='L677'></a><a href='#L677'>677</a>
|
|
743
|
+
<a name='L678'></a><a href='#L678'>678</a>
|
|
744
|
+
<a name='L679'></a><a href='#L679'>679</a>
|
|
745
|
+
<a name='L680'></a><a href='#L680'>680</a>
|
|
746
|
+
<a name='L681'></a><a href='#L681'>681</a>
|
|
747
|
+
<a name='L682'></a><a href='#L682'>682</a>
|
|
748
|
+
<a name='L683'></a><a href='#L683'>683</a>
|
|
749
|
+
<a name='L684'></a><a href='#L684'>684</a>
|
|
750
|
+
<a name='L685'></a><a href='#L685'>685</a>
|
|
751
|
+
<a name='L686'></a><a href='#L686'>686</a>
|
|
752
|
+
<a name='L687'></a><a href='#L687'>687</a>
|
|
753
|
+
<a name='L688'></a><a href='#L688'>688</a>
|
|
754
|
+
<a name='L689'></a><a href='#L689'>689</a>
|
|
755
|
+
<a name='L690'></a><a href='#L690'>690</a>
|
|
756
|
+
<a name='L691'></a><a href='#L691'>691</a>
|
|
757
|
+
<a name='L692'></a><a href='#L692'>692</a>
|
|
758
|
+
<a name='L693'></a><a href='#L693'>693</a>
|
|
759
|
+
<a name='L694'></a><a href='#L694'>694</a>
|
|
760
|
+
<a name='L695'></a><a href='#L695'>695</a>
|
|
761
|
+
<a name='L696'></a><a href='#L696'>696</a>
|
|
762
|
+
<a name='L697'></a><a href='#L697'>697</a>
|
|
763
|
+
<a name='L698'></a><a href='#L698'>698</a>
|
|
764
|
+
<a name='L699'></a><a href='#L699'>699</a>
|
|
765
|
+
<a name='L700'></a><a href='#L700'>700</a>
|
|
766
|
+
<a name='L701'></a><a href='#L701'>701</a>
|
|
767
|
+
<a name='L702'></a><a href='#L702'>702</a>
|
|
768
|
+
<a name='L703'></a><a href='#L703'>703</a>
|
|
769
|
+
<a name='L704'></a><a href='#L704'>704</a>
|
|
770
|
+
<a name='L705'></a><a href='#L705'>705</a>
|
|
771
|
+
<a name='L706'></a><a href='#L706'>706</a>
|
|
772
|
+
<a name='L707'></a><a href='#L707'>707</a>
|
|
773
|
+
<a name='L708'></a><a href='#L708'>708</a>
|
|
774
|
+
<a name='L709'></a><a href='#L709'>709</a>
|
|
775
|
+
<a name='L710'></a><a href='#L710'>710</a>
|
|
776
|
+
<a name='L711'></a><a href='#L711'>711</a>
|
|
777
|
+
<a name='L712'></a><a href='#L712'>712</a>
|
|
778
|
+
<a name='L713'></a><a href='#L713'>713</a>
|
|
779
|
+
<a name='L714'></a><a href='#L714'>714</a>
|
|
780
|
+
<a name='L715'></a><a href='#L715'>715</a>
|
|
781
|
+
<a name='L716'></a><a href='#L716'>716</a>
|
|
782
|
+
<a name='L717'></a><a href='#L717'>717</a>
|
|
783
|
+
<a name='L718'></a><a href='#L718'>718</a>
|
|
784
|
+
<a name='L719'></a><a href='#L719'>719</a>
|
|
785
|
+
<a name='L720'></a><a href='#L720'>720</a>
|
|
786
|
+
<a name='L721'></a><a href='#L721'>721</a>
|
|
787
|
+
<a name='L722'></a><a href='#L722'>722</a>
|
|
788
|
+
<a name='L723'></a><a href='#L723'>723</a>
|
|
789
|
+
<a name='L724'></a><a href='#L724'>724</a>
|
|
790
|
+
<a name='L725'></a><a href='#L725'>725</a>
|
|
791
|
+
<a name='L726'></a><a href='#L726'>726</a>
|
|
792
|
+
<a name='L727'></a><a href='#L727'>727</a>
|
|
793
|
+
<a name='L728'></a><a href='#L728'>728</a>
|
|
794
|
+
<a name='L729'></a><a href='#L729'>729</a>
|
|
795
|
+
<a name='L730'></a><a href='#L730'>730</a>
|
|
796
|
+
<a name='L731'></a><a href='#L731'>731</a>
|
|
797
|
+
<a name='L732'></a><a href='#L732'>732</a>
|
|
798
|
+
<a name='L733'></a><a href='#L733'>733</a>
|
|
799
|
+
<a name='L734'></a><a href='#L734'>734</a>
|
|
800
|
+
<a name='L735'></a><a href='#L735'>735</a>
|
|
801
|
+
<a name='L736'></a><a href='#L736'>736</a>
|
|
802
|
+
<a name='L737'></a><a href='#L737'>737</a>
|
|
803
|
+
<a name='L738'></a><a href='#L738'>738</a>
|
|
804
|
+
<a name='L739'></a><a href='#L739'>739</a>
|
|
805
|
+
<a name='L740'></a><a href='#L740'>740</a>
|
|
806
|
+
<a name='L741'></a><a href='#L741'>741</a>
|
|
807
|
+
<a name='L742'></a><a href='#L742'>742</a>
|
|
808
|
+
<a name='L743'></a><a href='#L743'>743</a>
|
|
809
|
+
<a name='L744'></a><a href='#L744'>744</a>
|
|
810
|
+
<a name='L745'></a><a href='#L745'>745</a>
|
|
811
|
+
<a name='L746'></a><a href='#L746'>746</a>
|
|
812
|
+
<a name='L747'></a><a href='#L747'>747</a>
|
|
813
|
+
<a name='L748'></a><a href='#L748'>748</a>
|
|
814
|
+
<a name='L749'></a><a href='#L749'>749</a>
|
|
815
|
+
<a name='L750'></a><a href='#L750'>750</a>
|
|
816
|
+
<a name='L751'></a><a href='#L751'>751</a>
|
|
817
|
+
<a name='L752'></a><a href='#L752'>752</a>
|
|
818
|
+
<a name='L753'></a><a href='#L753'>753</a>
|
|
819
|
+
<a name='L754'></a><a href='#L754'>754</a>
|
|
820
|
+
<a name='L755'></a><a href='#L755'>755</a>
|
|
821
|
+
<a name='L756'></a><a href='#L756'>756</a>
|
|
822
|
+
<a name='L757'></a><a href='#L757'>757</a>
|
|
823
|
+
<a name='L758'></a><a href='#L758'>758</a>
|
|
824
|
+
<a name='L759'></a><a href='#L759'>759</a>
|
|
825
|
+
<a name='L760'></a><a href='#L760'>760</a>
|
|
826
|
+
<a name='L761'></a><a href='#L761'>761</a>
|
|
827
|
+
<a name='L762'></a><a href='#L762'>762</a>
|
|
828
|
+
<a name='L763'></a><a href='#L763'>763</a>
|
|
829
|
+
<a name='L764'></a><a href='#L764'>764</a>
|
|
830
|
+
<a name='L765'></a><a href='#L765'>765</a>
|
|
831
|
+
<a name='L766'></a><a href='#L766'>766</a>
|
|
832
|
+
<a name='L767'></a><a href='#L767'>767</a>
|
|
833
|
+
<a name='L768'></a><a href='#L768'>768</a>
|
|
834
|
+
<a name='L769'></a><a href='#L769'>769</a>
|
|
835
|
+
<a name='L770'></a><a href='#L770'>770</a>
|
|
836
|
+
<a name='L771'></a><a href='#L771'>771</a>
|
|
837
|
+
<a name='L772'></a><a href='#L772'>772</a>
|
|
838
|
+
<a name='L773'></a><a href='#L773'>773</a>
|
|
839
|
+
<a name='L774'></a><a href='#L774'>774</a>
|
|
840
|
+
<a name='L775'></a><a href='#L775'>775</a>
|
|
841
|
+
<a name='L776'></a><a href='#L776'>776</a>
|
|
842
|
+
<a name='L777'></a><a href='#L777'>777</a>
|
|
843
|
+
<a name='L778'></a><a href='#L778'>778</a>
|
|
844
|
+
<a name='L779'></a><a href='#L779'>779</a>
|
|
845
|
+
<a name='L780'></a><a href='#L780'>780</a>
|
|
846
|
+
<a name='L781'></a><a href='#L781'>781</a>
|
|
847
|
+
<a name='L782'></a><a href='#L782'>782</a>
|
|
848
|
+
<a name='L783'></a><a href='#L783'>783</a>
|
|
849
|
+
<a name='L784'></a><a href='#L784'>784</a>
|
|
850
|
+
<a name='L785'></a><a href='#L785'>785</a>
|
|
851
|
+
<a name='L786'></a><a href='#L786'>786</a>
|
|
852
|
+
<a name='L787'></a><a href='#L787'>787</a>
|
|
853
|
+
<a name='L788'></a><a href='#L788'>788</a>
|
|
854
|
+
<a name='L789'></a><a href='#L789'>789</a>
|
|
855
|
+
<a name='L790'></a><a href='#L790'>790</a>
|
|
856
|
+
<a name='L791'></a><a href='#L791'>791</a>
|
|
857
|
+
<a name='L792'></a><a href='#L792'>792</a>
|
|
858
|
+
<a name='L793'></a><a href='#L793'>793</a>
|
|
859
|
+
<a name='L794'></a><a href='#L794'>794</a>
|
|
860
|
+
<a name='L795'></a><a href='#L795'>795</a>
|
|
861
|
+
<a name='L796'></a><a href='#L796'>796</a>
|
|
862
|
+
<a name='L797'></a><a href='#L797'>797</a>
|
|
863
|
+
<a name='L798'></a><a href='#L798'>798</a>
|
|
864
|
+
<a name='L799'></a><a href='#L799'>799</a>
|
|
865
|
+
<a name='L800'></a><a href='#L800'>800</a>
|
|
866
|
+
<a name='L801'></a><a href='#L801'>801</a>
|
|
867
|
+
<a name='L802'></a><a href='#L802'>802</a>
|
|
868
|
+
<a name='L803'></a><a href='#L803'>803</a>
|
|
869
|
+
<a name='L804'></a><a href='#L804'>804</a>
|
|
870
|
+
<a name='L805'></a><a href='#L805'>805</a>
|
|
871
|
+
<a name='L806'></a><a href='#L806'>806</a>
|
|
872
|
+
<a name='L807'></a><a href='#L807'>807</a>
|
|
873
|
+
<a name='L808'></a><a href='#L808'>808</a>
|
|
874
|
+
<a name='L809'></a><a href='#L809'>809</a>
|
|
875
|
+
<a name='L810'></a><a href='#L810'>810</a>
|
|
876
|
+
<a name='L811'></a><a href='#L811'>811</a>
|
|
877
|
+
<a name='L812'></a><a href='#L812'>812</a>
|
|
878
|
+
<a name='L813'></a><a href='#L813'>813</a>
|
|
879
|
+
<a name='L814'></a><a href='#L814'>814</a>
|
|
880
|
+
<a name='L815'></a><a href='#L815'>815</a>
|
|
881
|
+
<a name='L816'></a><a href='#L816'>816</a>
|
|
882
|
+
<a name='L817'></a><a href='#L817'>817</a>
|
|
883
|
+
<a name='L818'></a><a href='#L818'>818</a>
|
|
884
|
+
<a name='L819'></a><a href='#L819'>819</a>
|
|
885
|
+
<a name='L820'></a><a href='#L820'>820</a>
|
|
886
|
+
<a name='L821'></a><a href='#L821'>821</a>
|
|
887
|
+
<a name='L822'></a><a href='#L822'>822</a>
|
|
888
|
+
<a name='L823'></a><a href='#L823'>823</a>
|
|
889
|
+
<a name='L824'></a><a href='#L824'>824</a>
|
|
890
|
+
<a name='L825'></a><a href='#L825'>825</a>
|
|
891
|
+
<a name='L826'></a><a href='#L826'>826</a>
|
|
892
|
+
<a name='L827'></a><a href='#L827'>827</a>
|
|
893
|
+
<a name='L828'></a><a href='#L828'>828</a>
|
|
894
|
+
<a name='L829'></a><a href='#L829'>829</a>
|
|
895
|
+
<a name='L830'></a><a href='#L830'>830</a>
|
|
896
|
+
<a name='L831'></a><a href='#L831'>831</a>
|
|
897
|
+
<a name='L832'></a><a href='#L832'>832</a>
|
|
898
|
+
<a name='L833'></a><a href='#L833'>833</a>
|
|
899
|
+
<a name='L834'></a><a href='#L834'>834</a>
|
|
900
|
+
<a name='L835'></a><a href='#L835'>835</a>
|
|
901
|
+
<a name='L836'></a><a href='#L836'>836</a>
|
|
902
|
+
<a name='L837'></a><a href='#L837'>837</a>
|
|
903
|
+
<a name='L838'></a><a href='#L838'>838</a>
|
|
904
|
+
<a name='L839'></a><a href='#L839'>839</a>
|
|
905
|
+
<a name='L840'></a><a href='#L840'>840</a>
|
|
906
|
+
<a name='L841'></a><a href='#L841'>841</a>
|
|
907
|
+
<a name='L842'></a><a href='#L842'>842</a>
|
|
908
|
+
<a name='L843'></a><a href='#L843'>843</a>
|
|
909
|
+
<a name='L844'></a><a href='#L844'>844</a>
|
|
910
|
+
<a name='L845'></a><a href='#L845'>845</a>
|
|
911
|
+
<a name='L846'></a><a href='#L846'>846</a>
|
|
912
|
+
<a name='L847'></a><a href='#L847'>847</a>
|
|
913
|
+
<a name='L848'></a><a href='#L848'>848</a>
|
|
914
|
+
<a name='L849'></a><a href='#L849'>849</a>
|
|
915
|
+
<a name='L850'></a><a href='#L850'>850</a>
|
|
916
|
+
<a name='L851'></a><a href='#L851'>851</a>
|
|
917
|
+
<a name='L852'></a><a href='#L852'>852</a>
|
|
918
|
+
<a name='L853'></a><a href='#L853'>853</a>
|
|
919
|
+
<a name='L854'></a><a href='#L854'>854</a>
|
|
920
|
+
<a name='L855'></a><a href='#L855'>855</a>
|
|
921
|
+
<a name='L856'></a><a href='#L856'>856</a>
|
|
922
|
+
<a name='L857'></a><a href='#L857'>857</a>
|
|
923
|
+
<a name='L858'></a><a href='#L858'>858</a>
|
|
924
|
+
<a name='L859'></a><a href='#L859'>859</a>
|
|
925
|
+
<a name='L860'></a><a href='#L860'>860</a>
|
|
926
|
+
<a name='L861'></a><a href='#L861'>861</a>
|
|
927
|
+
<a name='L862'></a><a href='#L862'>862</a>
|
|
928
|
+
<a name='L863'></a><a href='#L863'>863</a>
|
|
929
|
+
<a name='L864'></a><a href='#L864'>864</a>
|
|
930
|
+
<a name='L865'></a><a href='#L865'>865</a>
|
|
931
|
+
<a name='L866'></a><a href='#L866'>866</a>
|
|
932
|
+
<a name='L867'></a><a href='#L867'>867</a>
|
|
933
|
+
<a name='L868'></a><a href='#L868'>868</a>
|
|
934
|
+
<a name='L869'></a><a href='#L869'>869</a>
|
|
935
|
+
<a name='L870'></a><a href='#L870'>870</a>
|
|
936
|
+
<a name='L871'></a><a href='#L871'>871</a>
|
|
937
|
+
<a name='L872'></a><a href='#L872'>872</a>
|
|
938
|
+
<a name='L873'></a><a href='#L873'>873</a>
|
|
939
|
+
<a name='L874'></a><a href='#L874'>874</a>
|
|
940
|
+
<a name='L875'></a><a href='#L875'>875</a>
|
|
941
|
+
<a name='L876'></a><a href='#L876'>876</a>
|
|
942
|
+
<a name='L877'></a><a href='#L877'>877</a>
|
|
943
|
+
<a name='L878'></a><a href='#L878'>878</a>
|
|
944
|
+
<a name='L879'></a><a href='#L879'>879</a>
|
|
945
|
+
<a name='L880'></a><a href='#L880'>880</a>
|
|
946
|
+
<a name='L881'></a><a href='#L881'>881</a>
|
|
947
|
+
<a name='L882'></a><a href='#L882'>882</a>
|
|
948
|
+
<a name='L883'></a><a href='#L883'>883</a>
|
|
949
|
+
<a name='L884'></a><a href='#L884'>884</a>
|
|
950
|
+
<a name='L885'></a><a href='#L885'>885</a>
|
|
951
|
+
<a name='L886'></a><a href='#L886'>886</a>
|
|
952
|
+
<a name='L887'></a><a href='#L887'>887</a>
|
|
953
|
+
<a name='L888'></a><a href='#L888'>888</a>
|
|
954
|
+
<a name='L889'></a><a href='#L889'>889</a>
|
|
955
|
+
<a name='L890'></a><a href='#L890'>890</a>
|
|
956
|
+
<a name='L891'></a><a href='#L891'>891</a>
|
|
957
|
+
<a name='L892'></a><a href='#L892'>892</a>
|
|
958
|
+
<a name='L893'></a><a href='#L893'>893</a>
|
|
959
|
+
<a name='L894'></a><a href='#L894'>894</a>
|
|
960
|
+
<a name='L895'></a><a href='#L895'>895</a>
|
|
961
|
+
<a name='L896'></a><a href='#L896'>896</a>
|
|
962
|
+
<a name='L897'></a><a href='#L897'>897</a>
|
|
963
|
+
<a name='L898'></a><a href='#L898'>898</a>
|
|
964
|
+
<a name='L899'></a><a href='#L899'>899</a>
|
|
965
|
+
<a name='L900'></a><a href='#L900'>900</a>
|
|
966
|
+
<a name='L901'></a><a href='#L901'>901</a>
|
|
967
|
+
<a name='L902'></a><a href='#L902'>902</a>
|
|
968
|
+
<a name='L903'></a><a href='#L903'>903</a>
|
|
969
|
+
<a name='L904'></a><a href='#L904'>904</a>
|
|
970
|
+
<a name='L905'></a><a href='#L905'>905</a>
|
|
971
|
+
<a name='L906'></a><a href='#L906'>906</a>
|
|
972
|
+
<a name='L907'></a><a href='#L907'>907</a>
|
|
973
|
+
<a name='L908'></a><a href='#L908'>908</a>
|
|
974
|
+
<a name='L909'></a><a href='#L909'>909</a>
|
|
975
|
+
<a name='L910'></a><a href='#L910'>910</a>
|
|
976
|
+
<a name='L911'></a><a href='#L911'>911</a>
|
|
977
|
+
<a name='L912'></a><a href='#L912'>912</a>
|
|
978
|
+
<a name='L913'></a><a href='#L913'>913</a>
|
|
979
|
+
<a name='L914'></a><a href='#L914'>914</a>
|
|
980
|
+
<a name='L915'></a><a href='#L915'>915</a>
|
|
981
|
+
<a name='L916'></a><a href='#L916'>916</a>
|
|
982
|
+
<a name='L917'></a><a href='#L917'>917</a>
|
|
983
|
+
<a name='L918'></a><a href='#L918'>918</a>
|
|
984
|
+
<a name='L919'></a><a href='#L919'>919</a>
|
|
985
|
+
<a name='L920'></a><a href='#L920'>920</a>
|
|
986
|
+
<a name='L921'></a><a href='#L921'>921</a>
|
|
987
|
+
<a name='L922'></a><a href='#L922'>922</a>
|
|
988
|
+
<a name='L923'></a><a href='#L923'>923</a>
|
|
989
|
+
<a name='L924'></a><a href='#L924'>924</a>
|
|
990
|
+
<a name='L925'></a><a href='#L925'>925</a>
|
|
991
|
+
<a name='L926'></a><a href='#L926'>926</a>
|
|
992
|
+
<a name='L927'></a><a href='#L927'>927</a>
|
|
993
|
+
<a name='L928'></a><a href='#L928'>928</a>
|
|
994
|
+
<a name='L929'></a><a href='#L929'>929</a>
|
|
995
|
+
<a name='L930'></a><a href='#L930'>930</a>
|
|
996
|
+
<a name='L931'></a><a href='#L931'>931</a>
|
|
997
|
+
<a name='L932'></a><a href='#L932'>932</a>
|
|
998
|
+
<a name='L933'></a><a href='#L933'>933</a>
|
|
999
|
+
<a name='L934'></a><a href='#L934'>934</a>
|
|
1000
|
+
<a name='L935'></a><a href='#L935'>935</a>
|
|
1001
|
+
<a name='L936'></a><a href='#L936'>936</a>
|
|
1002
|
+
<a name='L937'></a><a href='#L937'>937</a>
|
|
1003
|
+
<a name='L938'></a><a href='#L938'>938</a>
|
|
1004
|
+
<a name='L939'></a><a href='#L939'>939</a>
|
|
1005
|
+
<a name='L940'></a><a href='#L940'>940</a>
|
|
1006
|
+
<a name='L941'></a><a href='#L941'>941</a>
|
|
1007
|
+
<a name='L942'></a><a href='#L942'>942</a>
|
|
1008
|
+
<a name='L943'></a><a href='#L943'>943</a>
|
|
1009
|
+
<a name='L944'></a><a href='#L944'>944</a>
|
|
1010
|
+
<a name='L945'></a><a href='#L945'>945</a>
|
|
1011
|
+
<a name='L946'></a><a href='#L946'>946</a>
|
|
1012
|
+
<a name='L947'></a><a href='#L947'>947</a>
|
|
1013
|
+
<a name='L948'></a><a href='#L948'>948</a>
|
|
1014
|
+
<a name='L949'></a><a href='#L949'>949</a>
|
|
1015
|
+
<a name='L950'></a><a href='#L950'>950</a>
|
|
1016
|
+
<a name='L951'></a><a href='#L951'>951</a>
|
|
1017
|
+
<a name='L952'></a><a href='#L952'>952</a>
|
|
1018
|
+
<a name='L953'></a><a href='#L953'>953</a>
|
|
1019
|
+
<a name='L954'></a><a href='#L954'>954</a>
|
|
1020
|
+
<a name='L955'></a><a href='#L955'>955</a>
|
|
1021
|
+
<a name='L956'></a><a href='#L956'>956</a>
|
|
1022
|
+
<a name='L957'></a><a href='#L957'>957</a>
|
|
1023
|
+
<a name='L958'></a><a href='#L958'>958</a>
|
|
1024
|
+
<a name='L959'></a><a href='#L959'>959</a>
|
|
1025
|
+
<a name='L960'></a><a href='#L960'>960</a>
|
|
1026
|
+
<a name='L961'></a><a href='#L961'>961</a>
|
|
1027
|
+
<a name='L962'></a><a href='#L962'>962</a>
|
|
1028
|
+
<a name='L963'></a><a href='#L963'>963</a>
|
|
1029
|
+
<a name='L964'></a><a href='#L964'>964</a>
|
|
1030
|
+
<a name='L965'></a><a href='#L965'>965</a>
|
|
1031
|
+
<a name='L966'></a><a href='#L966'>966</a>
|
|
1032
|
+
<a name='L967'></a><a href='#L967'>967</a>
|
|
1033
|
+
<a name='L968'></a><a href='#L968'>968</a>
|
|
1034
|
+
<a name='L969'></a><a href='#L969'>969</a>
|
|
1035
|
+
<a name='L970'></a><a href='#L970'>970</a>
|
|
1036
|
+
<a name='L971'></a><a href='#L971'>971</a>
|
|
1037
|
+
<a name='L972'></a><a href='#L972'>972</a>
|
|
1038
|
+
<a name='L973'></a><a href='#L973'>973</a>
|
|
1039
|
+
<a name='L974'></a><a href='#L974'>974</a>
|
|
1040
|
+
<a name='L975'></a><a href='#L975'>975</a>
|
|
1041
|
+
<a name='L976'></a><a href='#L976'>976</a>
|
|
1042
|
+
<a name='L977'></a><a href='#L977'>977</a>
|
|
1043
|
+
<a name='L978'></a><a href='#L978'>978</a>
|
|
1044
|
+
<a name='L979'></a><a href='#L979'>979</a>
|
|
1045
|
+
<a name='L980'></a><a href='#L980'>980</a>
|
|
1046
|
+
<a name='L981'></a><a href='#L981'>981</a>
|
|
1047
|
+
<a name='L982'></a><a href='#L982'>982</a>
|
|
1048
|
+
<a name='L983'></a><a href='#L983'>983</a>
|
|
1049
|
+
<a name='L984'></a><a href='#L984'>984</a>
|
|
1050
|
+
<a name='L985'></a><a href='#L985'>985</a>
|
|
1051
|
+
<a name='L986'></a><a href='#L986'>986</a>
|
|
1052
|
+
<a name='L987'></a><a href='#L987'>987</a>
|
|
1053
|
+
<a name='L988'></a><a href='#L988'>988</a>
|
|
1054
|
+
<a name='L989'></a><a href='#L989'>989</a>
|
|
1055
|
+
<a name='L990'></a><a href='#L990'>990</a>
|
|
1056
|
+
<a name='L991'></a><a href='#L991'>991</a>
|
|
1057
|
+
<a name='L992'></a><a href='#L992'>992</a>
|
|
1058
|
+
<a name='L993'></a><a href='#L993'>993</a>
|
|
1059
|
+
<a name='L994'></a><a href='#L994'>994</a>
|
|
1060
|
+
<a name='L995'></a><a href='#L995'>995</a>
|
|
1061
|
+
<a name='L996'></a><a href='#L996'>996</a>
|
|
1062
|
+
<a name='L997'></a><a href='#L997'>997</a>
|
|
1063
|
+
<a name='L998'></a><a href='#L998'>998</a>
|
|
1064
|
+
<a name='L999'></a><a href='#L999'>999</a>
|
|
1065
|
+
<a name='L1000'></a><a href='#L1000'>1000</a>
|
|
1066
|
+
<a name='L1001'></a><a href='#L1001'>1001</a>
|
|
1067
|
+
<a name='L1002'></a><a href='#L1002'>1002</a>
|
|
1068
|
+
<a name='L1003'></a><a href='#L1003'>1003</a>
|
|
1069
|
+
<a name='L1004'></a><a href='#L1004'>1004</a>
|
|
1070
|
+
<a name='L1005'></a><a href='#L1005'>1005</a>
|
|
1071
|
+
<a name='L1006'></a><a href='#L1006'>1006</a>
|
|
1072
|
+
<a name='L1007'></a><a href='#L1007'>1007</a>
|
|
1073
|
+
<a name='L1008'></a><a href='#L1008'>1008</a>
|
|
1074
|
+
<a name='L1009'></a><a href='#L1009'>1009</a>
|
|
1075
|
+
<a name='L1010'></a><a href='#L1010'>1010</a>
|
|
1076
|
+
<a name='L1011'></a><a href='#L1011'>1011</a>
|
|
1077
|
+
<a name='L1012'></a><a href='#L1012'>1012</a>
|
|
1078
|
+
<a name='L1013'></a><a href='#L1013'>1013</a>
|
|
1079
|
+
<a name='L1014'></a><a href='#L1014'>1014</a>
|
|
1080
|
+
<a name='L1015'></a><a href='#L1015'>1015</a>
|
|
1081
|
+
<a name='L1016'></a><a href='#L1016'>1016</a>
|
|
1082
|
+
<a name='L1017'></a><a href='#L1017'>1017</a>
|
|
1083
|
+
<a name='L1018'></a><a href='#L1018'>1018</a>
|
|
1084
|
+
<a name='L1019'></a><a href='#L1019'>1019</a>
|
|
1085
|
+
<a name='L1020'></a><a href='#L1020'>1020</a>
|
|
1086
|
+
<a name='L1021'></a><a href='#L1021'>1021</a>
|
|
1087
|
+
<a name='L1022'></a><a href='#L1022'>1022</a>
|
|
1088
|
+
<a name='L1023'></a><a href='#L1023'>1023</a>
|
|
1089
|
+
<a name='L1024'></a><a href='#L1024'>1024</a>
|
|
1090
|
+
<a name='L1025'></a><a href='#L1025'>1025</a>
|
|
1091
|
+
<a name='L1026'></a><a href='#L1026'>1026</a>
|
|
1092
|
+
<a name='L1027'></a><a href='#L1027'>1027</a>
|
|
1093
|
+
<a name='L1028'></a><a href='#L1028'>1028</a>
|
|
1094
|
+
<a name='L1029'></a><a href='#L1029'>1029</a>
|
|
1095
|
+
<a name='L1030'></a><a href='#L1030'>1030</a>
|
|
1096
|
+
<a name='L1031'></a><a href='#L1031'>1031</a>
|
|
1097
|
+
<a name='L1032'></a><a href='#L1032'>1032</a>
|
|
1098
|
+
<a name='L1033'></a><a href='#L1033'>1033</a>
|
|
1099
|
+
<a name='L1034'></a><a href='#L1034'>1034</a>
|
|
1100
|
+
<a name='L1035'></a><a href='#L1035'>1035</a>
|
|
1101
|
+
<a name='L1036'></a><a href='#L1036'>1036</a>
|
|
1102
|
+
<a name='L1037'></a><a href='#L1037'>1037</a>
|
|
1103
|
+
<a name='L1038'></a><a href='#L1038'>1038</a>
|
|
1104
|
+
<a name='L1039'></a><a href='#L1039'>1039</a>
|
|
1105
|
+
<a name='L1040'></a><a href='#L1040'>1040</a>
|
|
1106
|
+
<a name='L1041'></a><a href='#L1041'>1041</a>
|
|
1107
|
+
<a name='L1042'></a><a href='#L1042'>1042</a>
|
|
1108
|
+
<a name='L1043'></a><a href='#L1043'>1043</a>
|
|
1109
|
+
<a name='L1044'></a><a href='#L1044'>1044</a>
|
|
1110
|
+
<a name='L1045'></a><a href='#L1045'>1045</a>
|
|
1111
|
+
<a name='L1046'></a><a href='#L1046'>1046</a>
|
|
1112
|
+
<a name='L1047'></a><a href='#L1047'>1047</a>
|
|
1113
|
+
<a name='L1048'></a><a href='#L1048'>1048</a>
|
|
1114
|
+
<a name='L1049'></a><a href='#L1049'>1049</a>
|
|
1115
|
+
<a name='L1050'></a><a href='#L1050'>1050</a>
|
|
1116
|
+
<a name='L1051'></a><a href='#L1051'>1051</a>
|
|
1117
|
+
<a name='L1052'></a><a href='#L1052'>1052</a>
|
|
1118
|
+
<a name='L1053'></a><a href='#L1053'>1053</a>
|
|
1119
|
+
<a name='L1054'></a><a href='#L1054'>1054</a>
|
|
1120
|
+
<a name='L1055'></a><a href='#L1055'>1055</a>
|
|
1121
|
+
<a name='L1056'></a><a href='#L1056'>1056</a>
|
|
1122
|
+
<a name='L1057'></a><a href='#L1057'>1057</a>
|
|
1123
|
+
<a name='L1058'></a><a href='#L1058'>1058</a>
|
|
1124
|
+
<a name='L1059'></a><a href='#L1059'>1059</a>
|
|
1125
|
+
<a name='L1060'></a><a href='#L1060'>1060</a>
|
|
1126
|
+
<a name='L1061'></a><a href='#L1061'>1061</a>
|
|
1127
|
+
<a name='L1062'></a><a href='#L1062'>1062</a>
|
|
1128
|
+
<a name='L1063'></a><a href='#L1063'>1063</a>
|
|
1129
|
+
<a name='L1064'></a><a href='#L1064'>1064</a>
|
|
1130
|
+
<a name='L1065'></a><a href='#L1065'>1065</a>
|
|
1131
|
+
<a name='L1066'></a><a href='#L1066'>1066</a>
|
|
1132
|
+
<a name='L1067'></a><a href='#L1067'>1067</a>
|
|
1133
|
+
<a name='L1068'></a><a href='#L1068'>1068</a>
|
|
1134
|
+
<a name='L1069'></a><a href='#L1069'>1069</a>
|
|
1135
|
+
<a name='L1070'></a><a href='#L1070'>1070</a>
|
|
1136
|
+
<a name='L1071'></a><a href='#L1071'>1071</a>
|
|
1137
|
+
<a name='L1072'></a><a href='#L1072'>1072</a>
|
|
1138
|
+
<a name='L1073'></a><a href='#L1073'>1073</a>
|
|
1139
|
+
<a name='L1074'></a><a href='#L1074'>1074</a>
|
|
1140
|
+
<a name='L1075'></a><a href='#L1075'>1075</a>
|
|
1141
|
+
<a name='L1076'></a><a href='#L1076'>1076</a>
|
|
1142
|
+
<a name='L1077'></a><a href='#L1077'>1077</a>
|
|
1143
|
+
<a name='L1078'></a><a href='#L1078'>1078</a>
|
|
1144
|
+
<a name='L1079'></a><a href='#L1079'>1079</a>
|
|
1145
|
+
<a name='L1080'></a><a href='#L1080'>1080</a>
|
|
1146
|
+
<a name='L1081'></a><a href='#L1081'>1081</a>
|
|
1147
|
+
<a name='L1082'></a><a href='#L1082'>1082</a>
|
|
1148
|
+
<a name='L1083'></a><a href='#L1083'>1083</a>
|
|
1149
|
+
<a name='L1084'></a><a href='#L1084'>1084</a>
|
|
1150
|
+
<a name='L1085'></a><a href='#L1085'>1085</a>
|
|
1151
|
+
<a name='L1086'></a><a href='#L1086'>1086</a>
|
|
1152
|
+
<a name='L1087'></a><a href='#L1087'>1087</a>
|
|
1153
|
+
<a name='L1088'></a><a href='#L1088'>1088</a>
|
|
1154
|
+
<a name='L1089'></a><a href='#L1089'>1089</a>
|
|
1155
|
+
<a name='L1090'></a><a href='#L1090'>1090</a>
|
|
1156
|
+
<a name='L1091'></a><a href='#L1091'>1091</a>
|
|
1157
|
+
<a name='L1092'></a><a href='#L1092'>1092</a>
|
|
1158
|
+
<a name='L1093'></a><a href='#L1093'>1093</a>
|
|
1159
|
+
<a name='L1094'></a><a href='#L1094'>1094</a>
|
|
1160
|
+
<a name='L1095'></a><a href='#L1095'>1095</a>
|
|
1161
|
+
<a name='L1096'></a><a href='#L1096'>1096</a>
|
|
1162
|
+
<a name='L1097'></a><a href='#L1097'>1097</a>
|
|
1163
|
+
<a name='L1098'></a><a href='#L1098'>1098</a>
|
|
1164
|
+
<a name='L1099'></a><a href='#L1099'>1099</a>
|
|
1165
|
+
<a name='L1100'></a><a href='#L1100'>1100</a>
|
|
1166
|
+
<a name='L1101'></a><a href='#L1101'>1101</a>
|
|
1167
|
+
<a name='L1102'></a><a href='#L1102'>1102</a>
|
|
1168
|
+
<a name='L1103'></a><a href='#L1103'>1103</a>
|
|
1169
|
+
<a name='L1104'></a><a href='#L1104'>1104</a>
|
|
1170
|
+
<a name='L1105'></a><a href='#L1105'>1105</a>
|
|
1171
|
+
<a name='L1106'></a><a href='#L1106'>1106</a>
|
|
1172
|
+
<a name='L1107'></a><a href='#L1107'>1107</a>
|
|
1173
|
+
<a name='L1108'></a><a href='#L1108'>1108</a>
|
|
1174
|
+
<a name='L1109'></a><a href='#L1109'>1109</a>
|
|
1175
|
+
<a name='L1110'></a><a href='#L1110'>1110</a>
|
|
1176
|
+
<a name='L1111'></a><a href='#L1111'>1111</a>
|
|
1177
|
+
<a name='L1112'></a><a href='#L1112'>1112</a>
|
|
1178
|
+
<a name='L1113'></a><a href='#L1113'>1113</a>
|
|
1179
|
+
<a name='L1114'></a><a href='#L1114'>1114</a>
|
|
1180
|
+
<a name='L1115'></a><a href='#L1115'>1115</a>
|
|
1181
|
+
<a name='L1116'></a><a href='#L1116'>1116</a>
|
|
1182
|
+
<a name='L1117'></a><a href='#L1117'>1117</a>
|
|
1183
|
+
<a name='L1118'></a><a href='#L1118'>1118</a>
|
|
1184
|
+
<a name='L1119'></a><a href='#L1119'>1119</a>
|
|
1185
|
+
<a name='L1120'></a><a href='#L1120'>1120</a>
|
|
1186
|
+
<a name='L1121'></a><a href='#L1121'>1121</a>
|
|
1187
|
+
<a name='L1122'></a><a href='#L1122'>1122</a>
|
|
1188
|
+
<a name='L1123'></a><a href='#L1123'>1123</a>
|
|
1189
|
+
<a name='L1124'></a><a href='#L1124'>1124</a>
|
|
1190
|
+
<a name='L1125'></a><a href='#L1125'>1125</a>
|
|
1191
|
+
<a name='L1126'></a><a href='#L1126'>1126</a>
|
|
1192
|
+
<a name='L1127'></a><a href='#L1127'>1127</a>
|
|
1193
|
+
<a name='L1128'></a><a href='#L1128'>1128</a>
|
|
1194
|
+
<a name='L1129'></a><a href='#L1129'>1129</a>
|
|
1195
|
+
<a name='L1130'></a><a href='#L1130'>1130</a>
|
|
1196
|
+
<a name='L1131'></a><a href='#L1131'>1131</a>
|
|
1197
|
+
<a name='L1132'></a><a href='#L1132'>1132</a>
|
|
1198
|
+
<a name='L1133'></a><a href='#L1133'>1133</a>
|
|
1199
|
+
<a name='L1134'></a><a href='#L1134'>1134</a>
|
|
1200
|
+
<a name='L1135'></a><a href='#L1135'>1135</a>
|
|
1201
|
+
<a name='L1136'></a><a href='#L1136'>1136</a>
|
|
1202
|
+
<a name='L1137'></a><a href='#L1137'>1137</a>
|
|
1203
|
+
<a name='L1138'></a><a href='#L1138'>1138</a>
|
|
1204
|
+
<a name='L1139'></a><a href='#L1139'>1139</a>
|
|
1205
|
+
<a name='L1140'></a><a href='#L1140'>1140</a>
|
|
1206
|
+
<a name='L1141'></a><a href='#L1141'>1141</a>
|
|
1207
|
+
<a name='L1142'></a><a href='#L1142'>1142</a>
|
|
1208
|
+
<a name='L1143'></a><a href='#L1143'>1143</a>
|
|
1209
|
+
<a name='L1144'></a><a href='#L1144'>1144</a>
|
|
1210
|
+
<a name='L1145'></a><a href='#L1145'>1145</a>
|
|
1211
|
+
<a name='L1146'></a><a href='#L1146'>1146</a>
|
|
1212
|
+
<a name='L1147'></a><a href='#L1147'>1147</a>
|
|
1213
|
+
<a name='L1148'></a><a href='#L1148'>1148</a>
|
|
1214
|
+
<a name='L1149'></a><a href='#L1149'>1149</a>
|
|
1215
|
+
<a name='L1150'></a><a href='#L1150'>1150</a>
|
|
1216
|
+
<a name='L1151'></a><a href='#L1151'>1151</a>
|
|
1217
|
+
<a name='L1152'></a><a href='#L1152'>1152</a>
|
|
1218
|
+
<a name='L1153'></a><a href='#L1153'>1153</a>
|
|
1219
|
+
<a name='L1154'></a><a href='#L1154'>1154</a>
|
|
1220
|
+
<a name='L1155'></a><a href='#L1155'>1155</a>
|
|
1221
|
+
<a name='L1156'></a><a href='#L1156'>1156</a>
|
|
1222
|
+
<a name='L1157'></a><a href='#L1157'>1157</a>
|
|
1223
|
+
<a name='L1158'></a><a href='#L1158'>1158</a>
|
|
1224
|
+
<a name='L1159'></a><a href='#L1159'>1159</a>
|
|
1225
|
+
<a name='L1160'></a><a href='#L1160'>1160</a>
|
|
1226
|
+
<a name='L1161'></a><a href='#L1161'>1161</a>
|
|
1227
|
+
<a name='L1162'></a><a href='#L1162'>1162</a>
|
|
1228
|
+
<a name='L1163'></a><a href='#L1163'>1163</a>
|
|
1229
|
+
<a name='L1164'></a><a href='#L1164'>1164</a>
|
|
1230
|
+
<a name='L1165'></a><a href='#L1165'>1165</a>
|
|
1231
|
+
<a name='L1166'></a><a href='#L1166'>1166</a>
|
|
1232
|
+
<a name='L1167'></a><a href='#L1167'>1167</a>
|
|
1233
|
+
<a name='L1168'></a><a href='#L1168'>1168</a>
|
|
1234
|
+
<a name='L1169'></a><a href='#L1169'>1169</a>
|
|
1235
|
+
<a name='L1170'></a><a href='#L1170'>1170</a>
|
|
1236
|
+
<a name='L1171'></a><a href='#L1171'>1171</a>
|
|
1237
|
+
<a name='L1172'></a><a href='#L1172'>1172</a>
|
|
1238
|
+
<a name='L1173'></a><a href='#L1173'>1173</a>
|
|
1239
|
+
<a name='L1174'></a><a href='#L1174'>1174</a>
|
|
1240
|
+
<a name='L1175'></a><a href='#L1175'>1175</a>
|
|
1241
|
+
<a name='L1176'></a><a href='#L1176'>1176</a>
|
|
1242
|
+
<a name='L1177'></a><a href='#L1177'>1177</a>
|
|
1243
|
+
<a name='L1178'></a><a href='#L1178'>1178</a>
|
|
1244
|
+
<a name='L1179'></a><a href='#L1179'>1179</a>
|
|
1245
|
+
<a name='L1180'></a><a href='#L1180'>1180</a>
|
|
1246
|
+
<a name='L1181'></a><a href='#L1181'>1181</a>
|
|
1247
|
+
<a name='L1182'></a><a href='#L1182'>1182</a>
|
|
1248
|
+
<a name='L1183'></a><a href='#L1183'>1183</a>
|
|
1249
|
+
<a name='L1184'></a><a href='#L1184'>1184</a>
|
|
1250
|
+
<a name='L1185'></a><a href='#L1185'>1185</a>
|
|
1251
|
+
<a name='L1186'></a><a href='#L1186'>1186</a>
|
|
1252
|
+
<a name='L1187'></a><a href='#L1187'>1187</a>
|
|
1253
|
+
<a name='L1188'></a><a href='#L1188'>1188</a>
|
|
1254
|
+
<a name='L1189'></a><a href='#L1189'>1189</a>
|
|
1255
|
+
<a name='L1190'></a><a href='#L1190'>1190</a>
|
|
1256
|
+
<a name='L1191'></a><a href='#L1191'>1191</a>
|
|
1257
|
+
<a name='L1192'></a><a href='#L1192'>1192</a>
|
|
1258
|
+
<a name='L1193'></a><a href='#L1193'>1193</a>
|
|
1259
|
+
<a name='L1194'></a><a href='#L1194'>1194</a>
|
|
1260
|
+
<a name='L1195'></a><a href='#L1195'>1195</a>
|
|
1261
|
+
<a name='L1196'></a><a href='#L1196'>1196</a>
|
|
1262
|
+
<a name='L1197'></a><a href='#L1197'>1197</a>
|
|
1263
|
+
<a name='L1198'></a><a href='#L1198'>1198</a>
|
|
1264
|
+
<a name='L1199'></a><a href='#L1199'>1199</a>
|
|
1265
|
+
<a name='L1200'></a><a href='#L1200'>1200</a>
|
|
1266
|
+
<a name='L1201'></a><a href='#L1201'>1201</a>
|
|
1267
|
+
<a name='L1202'></a><a href='#L1202'>1202</a>
|
|
1268
|
+
<a name='L1203'></a><a href='#L1203'>1203</a>
|
|
1269
|
+
<a name='L1204'></a><a href='#L1204'>1204</a>
|
|
1270
|
+
<a name='L1205'></a><a href='#L1205'>1205</a>
|
|
1271
|
+
<a name='L1206'></a><a href='#L1206'>1206</a>
|
|
1272
|
+
<a name='L1207'></a><a href='#L1207'>1207</a>
|
|
1273
|
+
<a name='L1208'></a><a href='#L1208'>1208</a>
|
|
1274
|
+
<a name='L1209'></a><a href='#L1209'>1209</a>
|
|
1275
|
+
<a name='L1210'></a><a href='#L1210'>1210</a>
|
|
1276
|
+
<a name='L1211'></a><a href='#L1211'>1211</a>
|
|
1277
|
+
<a name='L1212'></a><a href='#L1212'>1212</a>
|
|
1278
|
+
<a name='L1213'></a><a href='#L1213'>1213</a>
|
|
1279
|
+
<a name='L1214'></a><a href='#L1214'>1214</a>
|
|
1280
|
+
<a name='L1215'></a><a href='#L1215'>1215</a>
|
|
1281
|
+
<a name='L1216'></a><a href='#L1216'>1216</a>
|
|
1282
|
+
<a name='L1217'></a><a href='#L1217'>1217</a>
|
|
1283
|
+
<a name='L1218'></a><a href='#L1218'>1218</a>
|
|
1284
|
+
<a name='L1219'></a><a href='#L1219'>1219</a>
|
|
1285
|
+
<a name='L1220'></a><a href='#L1220'>1220</a>
|
|
1286
|
+
<a name='L1221'></a><a href='#L1221'>1221</a>
|
|
1287
|
+
<a name='L1222'></a><a href='#L1222'>1222</a>
|
|
1288
|
+
<a name='L1223'></a><a href='#L1223'>1223</a>
|
|
1289
|
+
<a name='L1224'></a><a href='#L1224'>1224</a>
|
|
1290
|
+
<a name='L1225'></a><a href='#L1225'>1225</a>
|
|
1291
|
+
<a name='L1226'></a><a href='#L1226'>1226</a>
|
|
1292
|
+
<a name='L1227'></a><a href='#L1227'>1227</a>
|
|
1293
|
+
<a name='L1228'></a><a href='#L1228'>1228</a>
|
|
1294
|
+
<a name='L1229'></a><a href='#L1229'>1229</a>
|
|
1295
|
+
<a name='L1230'></a><a href='#L1230'>1230</a>
|
|
1296
|
+
<a name='L1231'></a><a href='#L1231'>1231</a>
|
|
1297
|
+
<a name='L1232'></a><a href='#L1232'>1232</a>
|
|
1298
|
+
<a name='L1233'></a><a href='#L1233'>1233</a>
|
|
1299
|
+
<a name='L1234'></a><a href='#L1234'>1234</a>
|
|
1300
|
+
<a name='L1235'></a><a href='#L1235'>1235</a>
|
|
1301
|
+
<a name='L1236'></a><a href='#L1236'>1236</a>
|
|
1302
|
+
<a name='L1237'></a><a href='#L1237'>1237</a>
|
|
1303
|
+
<a name='L1238'></a><a href='#L1238'>1238</a>
|
|
1304
|
+
<a name='L1239'></a><a href='#L1239'>1239</a>
|
|
1305
|
+
<a name='L1240'></a><a href='#L1240'>1240</a>
|
|
1306
|
+
<a name='L1241'></a><a href='#L1241'>1241</a>
|
|
1307
|
+
<a name='L1242'></a><a href='#L1242'>1242</a>
|
|
1308
|
+
<a name='L1243'></a><a href='#L1243'>1243</a>
|
|
1309
|
+
<a name='L1244'></a><a href='#L1244'>1244</a>
|
|
1310
|
+
<a name='L1245'></a><a href='#L1245'>1245</a>
|
|
1311
|
+
<a name='L1246'></a><a href='#L1246'>1246</a>
|
|
1312
|
+
<a name='L1247'></a><a href='#L1247'>1247</a>
|
|
1313
|
+
<a name='L1248'></a><a href='#L1248'>1248</a>
|
|
1314
|
+
<a name='L1249'></a><a href='#L1249'>1249</a>
|
|
1315
|
+
<a name='L1250'></a><a href='#L1250'>1250</a>
|
|
1316
|
+
<a name='L1251'></a><a href='#L1251'>1251</a>
|
|
1317
|
+
<a name='L1252'></a><a href='#L1252'>1252</a>
|
|
1318
|
+
<a name='L1253'></a><a href='#L1253'>1253</a>
|
|
1319
|
+
<a name='L1254'></a><a href='#L1254'>1254</a>
|
|
1320
|
+
<a name='L1255'></a><a href='#L1255'>1255</a>
|
|
1321
|
+
<a name='L1256'></a><a href='#L1256'>1256</a>
|
|
1322
|
+
<a name='L1257'></a><a href='#L1257'>1257</a>
|
|
1323
|
+
<a name='L1258'></a><a href='#L1258'>1258</a>
|
|
1324
|
+
<a name='L1259'></a><a href='#L1259'>1259</a>
|
|
1325
|
+
<a name='L1260'></a><a href='#L1260'>1260</a>
|
|
1326
|
+
<a name='L1261'></a><a href='#L1261'>1261</a>
|
|
1327
|
+
<a name='L1262'></a><a href='#L1262'>1262</a>
|
|
1328
|
+
<a name='L1263'></a><a href='#L1263'>1263</a>
|
|
1329
|
+
<a name='L1264'></a><a href='#L1264'>1264</a>
|
|
1330
|
+
<a name='L1265'></a><a href='#L1265'>1265</a>
|
|
1331
|
+
<a name='L1266'></a><a href='#L1266'>1266</a>
|
|
1332
|
+
<a name='L1267'></a><a href='#L1267'>1267</a>
|
|
1333
|
+
<a name='L1268'></a><a href='#L1268'>1268</a>
|
|
1334
|
+
<a name='L1269'></a><a href='#L1269'>1269</a>
|
|
1335
|
+
<a name='L1270'></a><a href='#L1270'>1270</a>
|
|
1336
|
+
<a name='L1271'></a><a href='#L1271'>1271</a>
|
|
1337
|
+
<a name='L1272'></a><a href='#L1272'>1272</a>
|
|
1338
|
+
<a name='L1273'></a><a href='#L1273'>1273</a>
|
|
1339
|
+
<a name='L1274'></a><a href='#L1274'>1274</a>
|
|
1340
|
+
<a name='L1275'></a><a href='#L1275'>1275</a>
|
|
1341
|
+
<a name='L1276'></a><a href='#L1276'>1276</a>
|
|
1342
|
+
<a name='L1277'></a><a href='#L1277'>1277</a>
|
|
1343
|
+
<a name='L1278'></a><a href='#L1278'>1278</a>
|
|
1344
|
+
<a name='L1279'></a><a href='#L1279'>1279</a>
|
|
1345
|
+
<a name='L1280'></a><a href='#L1280'>1280</a>
|
|
1346
|
+
<a name='L1281'></a><a href='#L1281'>1281</a>
|
|
1347
|
+
<a name='L1282'></a><a href='#L1282'>1282</a>
|
|
1348
|
+
<a name='L1283'></a><a href='#L1283'>1283</a>
|
|
1349
|
+
<a name='L1284'></a><a href='#L1284'>1284</a>
|
|
1350
|
+
<a name='L1285'></a><a href='#L1285'>1285</a>
|
|
1351
|
+
<a name='L1286'></a><a href='#L1286'>1286</a>
|
|
1352
|
+
<a name='L1287'></a><a href='#L1287'>1287</a>
|
|
1353
|
+
<a name='L1288'></a><a href='#L1288'>1288</a>
|
|
1354
|
+
<a name='L1289'></a><a href='#L1289'>1289</a>
|
|
1355
|
+
<a name='L1290'></a><a href='#L1290'>1290</a>
|
|
1356
|
+
<a name='L1291'></a><a href='#L1291'>1291</a>
|
|
1357
|
+
<a name='L1292'></a><a href='#L1292'>1292</a>
|
|
1358
|
+
<a name='L1293'></a><a href='#L1293'>1293</a>
|
|
1359
|
+
<a name='L1294'></a><a href='#L1294'>1294</a>
|
|
1360
|
+
<a name='L1295'></a><a href='#L1295'>1295</a>
|
|
1361
|
+
<a name='L1296'></a><a href='#L1296'>1296</a>
|
|
1362
|
+
<a name='L1297'></a><a href='#L1297'>1297</a>
|
|
1363
|
+
<a name='L1298'></a><a href='#L1298'>1298</a>
|
|
1364
|
+
<a name='L1299'></a><a href='#L1299'>1299</a>
|
|
1365
|
+
<a name='L1300'></a><a href='#L1300'>1300</a>
|
|
1366
|
+
<a name='L1301'></a><a href='#L1301'>1301</a>
|
|
1367
|
+
<a name='L1302'></a><a href='#L1302'>1302</a>
|
|
1368
|
+
<a name='L1303'></a><a href='#L1303'>1303</a>
|
|
1369
|
+
<a name='L1304'></a><a href='#L1304'>1304</a>
|
|
1370
|
+
<a name='L1305'></a><a href='#L1305'>1305</a>
|
|
1371
|
+
<a name='L1306'></a><a href='#L1306'>1306</a>
|
|
1372
|
+
<a name='L1307'></a><a href='#L1307'>1307</a>
|
|
1373
|
+
<a name='L1308'></a><a href='#L1308'>1308</a>
|
|
1374
|
+
<a name='L1309'></a><a href='#L1309'>1309</a>
|
|
1375
|
+
<a name='L1310'></a><a href='#L1310'>1310</a>
|
|
1376
|
+
<a name='L1311'></a><a href='#L1311'>1311</a>
|
|
1377
|
+
<a name='L1312'></a><a href='#L1312'>1312</a>
|
|
1378
|
+
<a name='L1313'></a><a href='#L1313'>1313</a>
|
|
1379
|
+
<a name='L1314'></a><a href='#L1314'>1314</a>
|
|
1380
|
+
<a name='L1315'></a><a href='#L1315'>1315</a>
|
|
1381
|
+
<a name='L1316'></a><a href='#L1316'>1316</a>
|
|
1382
|
+
<a name='L1317'></a><a href='#L1317'>1317</a>
|
|
1383
|
+
<a name='L1318'></a><a href='#L1318'>1318</a>
|
|
1384
|
+
<a name='L1319'></a><a href='#L1319'>1319</a>
|
|
1385
|
+
<a name='L1320'></a><a href='#L1320'>1320</a>
|
|
1386
|
+
<a name='L1321'></a><a href='#L1321'>1321</a>
|
|
1387
|
+
<a name='L1322'></a><a href='#L1322'>1322</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">3x</span>
|
|
1388
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1389
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1390
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1391
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1392
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1393
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1394
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1395
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1396
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1397
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1398
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1399
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1400
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1401
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1402
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1403
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1404
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1405
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1406
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1407
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1408
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1409
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1410
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1411
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1412
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1413
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1414
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1415
|
+
<span class="cline-any cline-yes">146x</span>
|
|
1416
|
+
<span class="cline-any cline-yes">146x</span>
|
|
1417
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1418
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1419
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1420
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1421
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1422
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1423
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1424
|
+
<span class="cline-any cline-no"> </span>
|
|
1425
|
+
<span class="cline-any cline-no"> </span>
|
|
1426
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1427
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1428
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1429
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1430
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1431
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1432
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1433
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1434
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1435
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1436
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1437
|
+
<span class="cline-any cline-no"> </span>
|
|
1438
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1439
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1440
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1441
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1442
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1443
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1444
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1445
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1446
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1447
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1448
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1449
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1450
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1451
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1452
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1453
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1454
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1455
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1456
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1457
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1458
|
+
<span class="cline-any cline-no"> </span>
|
|
1459
|
+
<span class="cline-any cline-no"> </span>
|
|
1460
|
+
<span class="cline-any cline-no"> </span>
|
|
1461
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1462
|
+
<span class="cline-any cline-no"> </span>
|
|
1463
|
+
<span class="cline-any cline-no"> </span>
|
|
1464
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1465
|
+
<span class="cline-any cline-no"> </span>
|
|
1466
|
+
<span class="cline-any cline-no"> </span>
|
|
1467
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1468
|
+
<span class="cline-any cline-no"> </span>
|
|
1469
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1470
|
+
<span class="cline-any cline-no"> </span>
|
|
1471
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1472
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1473
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1474
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1475
|
+
<span class="cline-any cline-no"> </span>
|
|
1476
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1477
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1478
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1479
|
+
<span class="cline-any cline-no"> </span>
|
|
1480
|
+
<span class="cline-any cline-no"> </span>
|
|
1481
|
+
<span class="cline-any cline-no"> </span>
|
|
1482
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1483
|
+
<span class="cline-any cline-no"> </span>
|
|
1484
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1485
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1486
|
+
<span class="cline-any cline-no"> </span>
|
|
1487
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1488
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1489
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1490
|
+
<span class="cline-any cline-no"> </span>
|
|
1491
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1492
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1493
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1494
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1495
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1496
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1497
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1498
|
+
<span class="cline-any cline-no"> </span>
|
|
1499
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1500
|
+
<span class="cline-any cline-no"> </span>
|
|
1501
|
+
<span class="cline-any cline-no"> </span>
|
|
1502
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1503
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1504
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1505
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1506
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1507
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1508
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1509
|
+
<span class="cline-any cline-no"> </span>
|
|
1510
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1511
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1512
|
+
<span class="cline-any cline-no"> </span>
|
|
1513
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1514
|
+
<span class="cline-any cline-no"> </span>
|
|
1515
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1516
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1517
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1518
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1519
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1520
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1521
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1522
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1523
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1524
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1525
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1526
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1527
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1528
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1529
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1530
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1531
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1532
|
+
<span class="cline-any cline-no"> </span>
|
|
1533
|
+
<span class="cline-any cline-no"> </span>
|
|
1534
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1535
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1536
|
+
<span class="cline-any cline-no"> </span>
|
|
1537
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1538
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1539
|
+
<span class="cline-any cline-no"> </span>
|
|
1540
|
+
<span class="cline-any cline-no"> </span>
|
|
1541
|
+
<span class="cline-any cline-no"> </span>
|
|
1542
|
+
<span class="cline-any cline-no"> </span>
|
|
1543
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1544
|
+
<span class="cline-any cline-no"> </span>
|
|
1545
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1546
|
+
<span class="cline-any cline-no"> </span>
|
|
1547
|
+
<span class="cline-any cline-no"> </span>
|
|
1548
|
+
<span class="cline-any cline-no"> </span>
|
|
1549
|
+
<span class="cline-any cline-no"> </span>
|
|
1550
|
+
<span class="cline-any cline-no"> </span>
|
|
1551
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1552
|
+
<span class="cline-any cline-no"> </span>
|
|
1553
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1554
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1555
|
+
<span class="cline-any cline-no"> </span>
|
|
1556
|
+
<span class="cline-any cline-no"> </span>
|
|
1557
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1558
|
+
<span class="cline-any cline-no"> </span>
|
|
1559
|
+
<span class="cline-any cline-no"> </span>
|
|
1560
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1561
|
+
<span class="cline-any cline-no"> </span>
|
|
1562
|
+
<span class="cline-any cline-no"> </span>
|
|
1563
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1564
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1565
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1566
|
+
<span class="cline-any cline-no"> </span>
|
|
1567
|
+
<span class="cline-any cline-no"> </span>
|
|
1568
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1569
|
+
<span class="cline-any cline-no"> </span>
|
|
1570
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1571
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1572
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1573
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1574
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1575
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1576
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1577
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1578
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1579
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1580
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1581
|
+
<span class="cline-any cline-no"> </span>
|
|
1582
|
+
<span class="cline-any cline-no"> </span>
|
|
1583
|
+
<span class="cline-any cline-no"> </span>
|
|
1584
|
+
<span class="cline-any cline-no"> </span>
|
|
1585
|
+
<span class="cline-any cline-no"> </span>
|
|
1586
|
+
<span class="cline-any cline-no"> </span>
|
|
1587
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1588
|
+
<span class="cline-any cline-no"> </span>
|
|
1589
|
+
<span class="cline-any cline-no"> </span>
|
|
1590
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1591
|
+
<span class="cline-any cline-no"> </span>
|
|
1592
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1593
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1594
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1595
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1596
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1597
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1598
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1599
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1600
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1601
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1602
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1603
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1604
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1605
|
+
<span class="cline-any cline-no"> </span>
|
|
1606
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1607
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1608
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1609
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1610
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1611
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1612
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1613
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1614
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1615
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1616
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1617
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1618
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1619
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1620
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1621
|
+
<span class="cline-any cline-no"> </span>
|
|
1622
|
+
<span class="cline-any cline-no"> </span>
|
|
1623
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1624
|
+
<span class="cline-any cline-no"> </span>
|
|
1625
|
+
<span class="cline-any cline-no"> </span>
|
|
1626
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1627
|
+
<span class="cline-any cline-no"> </span>
|
|
1628
|
+
<span class="cline-any cline-no"> </span>
|
|
1629
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1630
|
+
<span class="cline-any cline-no"> </span>
|
|
1631
|
+
<span class="cline-any cline-no"> </span>
|
|
1632
|
+
<span class="cline-any cline-no"> </span>
|
|
1633
|
+
<span class="cline-any cline-no"> </span>
|
|
1634
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1635
|
+
<span class="cline-any cline-no"> </span>
|
|
1636
|
+
<span class="cline-any cline-no"> </span>
|
|
1637
|
+
<span class="cline-any cline-no"> </span>
|
|
1638
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1639
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1640
|
+
<span class="cline-any cline-no"> </span>
|
|
1641
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1642
|
+
<span class="cline-any cline-no"> </span>
|
|
1643
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1644
|
+
<span class="cline-any cline-no"> </span>
|
|
1645
|
+
<span class="cline-any cline-no"> </span>
|
|
1646
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1647
|
+
<span class="cline-any cline-no"> </span>
|
|
1648
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1649
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1650
|
+
<span class="cline-any cline-no"> </span>
|
|
1651
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1652
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1653
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1654
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1655
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1656
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1657
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1658
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1659
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1660
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1661
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1662
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1663
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1664
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1665
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1666
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1667
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1668
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1669
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1670
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1671
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1672
|
+
<span class="cline-any cline-no"> </span>
|
|
1673
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1674
|
+
<span class="cline-any cline-no"> </span>
|
|
1675
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1677
|
+
<span class="cline-any cline-no"> </span>
|
|
1678
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1679
|
+
<span class="cline-any cline-no"> </span>
|
|
1680
|
+
<span class="cline-any cline-no"> </span>
|
|
1681
|
+
<span class="cline-any cline-no"> </span>
|
|
1682
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1683
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1684
|
+
<span class="cline-any cline-no"> </span>
|
|
1685
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1686
|
+
<span class="cline-any cline-no"> </span>
|
|
1687
|
+
<span class="cline-any cline-no"> </span>
|
|
1688
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1689
|
+
<span class="cline-any cline-no"> </span>
|
|
1690
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1691
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1692
|
+
<span class="cline-any cline-no"> </span>
|
|
1693
|
+
<span class="cline-any cline-no"> </span>
|
|
1694
|
+
<span class="cline-any cline-no"> </span>
|
|
1695
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1696
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1697
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1698
|
+
<span class="cline-any cline-no"> </span>
|
|
1699
|
+
<span class="cline-any cline-no"> </span>
|
|
1700
|
+
<span class="cline-any cline-no"> </span>
|
|
1701
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1702
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1703
|
+
<span class="cline-any cline-no"> </span>
|
|
1704
|
+
<span class="cline-any cline-no"> </span>
|
|
1705
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1706
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1708
|
+
<span class="cline-any cline-no"> </span>
|
|
1709
|
+
<span class="cline-any cline-no"> </span>
|
|
1710
|
+
<span class="cline-any cline-no"> </span>
|
|
1711
|
+
<span class="cline-any cline-no"> </span>
|
|
1712
|
+
<span class="cline-any cline-no"> </span>
|
|
1713
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1714
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1715
|
+
<span class="cline-any cline-no"> </span>
|
|
1716
|
+
<span class="cline-any cline-no"> </span>
|
|
1717
|
+
<span class="cline-any cline-no"> </span>
|
|
1718
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1719
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1720
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1721
|
+
<span class="cline-any cline-no"> </span>
|
|
1722
|
+
<span class="cline-any cline-no"> </span>
|
|
1723
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1724
|
+
<span class="cline-any cline-no"> </span>
|
|
1725
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1726
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1727
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1728
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1729
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1730
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1731
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1732
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1733
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1734
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1735
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1736
|
+
<span class="cline-any cline-no"> </span>
|
|
1737
|
+
<span class="cline-any cline-no"> </span>
|
|
1738
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1739
|
+
<span class="cline-any cline-no"> </span>
|
|
1740
|
+
<span class="cline-any cline-no"> </span>
|
|
1741
|
+
<span class="cline-any cline-no"> </span>
|
|
1742
|
+
<span class="cline-any cline-no"> </span>
|
|
1743
|
+
<span class="cline-any cline-no"> </span>
|
|
1744
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1745
|
+
<span class="cline-any cline-no"> </span>
|
|
1746
|
+
<span class="cline-any cline-no"> </span>
|
|
1747
|
+
<span class="cline-any cline-no"> </span>
|
|
1748
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1749
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1750
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1751
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1752
|
+
<span class="cline-any cline-no"> </span>
|
|
1753
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1754
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1755
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1756
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1757
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1758
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1759
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1760
|
+
<span class="cline-any cline-no"> </span>
|
|
1761
|
+
<span class="cline-any cline-no"> </span>
|
|
1762
|
+
<span class="cline-any cline-no"> </span>
|
|
1763
|
+
<span class="cline-any cline-no"> </span>
|
|
1764
|
+
<span class="cline-any cline-no"> </span>
|
|
1765
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1766
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1767
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1768
|
+
<span class="cline-any cline-no"> </span>
|
|
1769
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1770
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1771
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1772
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1773
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1774
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1775
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1776
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1777
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1778
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1779
|
+
<span class="cline-any cline-no"> </span>
|
|
1780
|
+
<span class="cline-any cline-no"> </span>
|
|
1781
|
+
<span class="cline-any cline-no"> </span>
|
|
1782
|
+
<span class="cline-any cline-no"> </span>
|
|
1783
|
+
<span class="cline-any cline-no"> </span>
|
|
1784
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1785
|
+
<span class="cline-any cline-no"> </span>
|
|
1786
|
+
<span class="cline-any cline-no"> </span>
|
|
1787
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1788
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1789
|
+
<span class="cline-any cline-no"> </span>
|
|
1790
|
+
<span class="cline-any cline-no"> </span>
|
|
1791
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1792
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1793
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1794
|
+
<span class="cline-any cline-no"> </span>
|
|
1795
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1796
|
+
<span class="cline-any cline-no"> </span>
|
|
1797
|
+
<span class="cline-any cline-no"> </span>
|
|
1798
|
+
<span class="cline-any cline-no"> </span>
|
|
1799
|
+
<span class="cline-any cline-no"> </span>
|
|
1800
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1801
|
+
<span class="cline-any cline-no"> </span>
|
|
1802
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1803
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1804
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1805
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1806
|
+
<span class="cline-any cline-no"> </span>
|
|
1807
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1808
|
+
<span class="cline-any cline-no"> </span>
|
|
1809
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1810
|
+
<span class="cline-any cline-no"> </span>
|
|
1811
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1812
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1813
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1814
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1815
|
+
<span class="cline-any cline-no"> </span>
|
|
1816
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1817
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1818
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1819
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1820
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1821
|
+
<span class="cline-any cline-no"> </span>
|
|
1822
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1823
|
+
<span class="cline-any cline-no"> </span>
|
|
1824
|
+
<span class="cline-any cline-no"> </span>
|
|
1825
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1826
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1827
|
+
<span class="cline-any cline-no"> </span>
|
|
1828
|
+
<span class="cline-any cline-no"> </span>
|
|
1829
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1830
|
+
<span class="cline-any cline-no"> </span>
|
|
1831
|
+
<span class="cline-any cline-no"> </span>
|
|
1832
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1833
|
+
<span class="cline-any cline-no"> </span>
|
|
1834
|
+
<span class="cline-any cline-no"> </span>
|
|
1835
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1836
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1837
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1838
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1839
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1840
|
+
<span class="cline-any cline-no"> </span>
|
|
1841
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1842
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1843
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1844
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1845
|
+
<span class="cline-any cline-no"> </span>
|
|
1846
|
+
<span class="cline-any cline-no"> </span>
|
|
1847
|
+
<span class="cline-any cline-no"> </span>
|
|
1848
|
+
<span class="cline-any cline-no"> </span>
|
|
1849
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1850
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1851
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1852
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1853
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1854
|
+
<span class="cline-any cline-no"> </span>
|
|
1855
|
+
<span class="cline-any cline-no"> </span>
|
|
1856
|
+
<span class="cline-any cline-no"> </span>
|
|
1857
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1858
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1859
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1860
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1861
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1862
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1863
|
+
<span class="cline-any cline-no"> </span>
|
|
1864
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1865
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1866
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1867
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1868
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1869
|
+
<span class="cline-any cline-no"> </span>
|
|
1870
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1871
|
+
<span class="cline-any cline-no"> </span>
|
|
1872
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1873
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1874
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1875
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1876
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1877
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1878
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1879
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1880
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1881
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1882
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1883
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1884
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1885
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1886
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1887
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1888
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1889
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1890
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1891
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1892
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1893
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1894
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1895
|
+
<span class="cline-any cline-no"> </span>
|
|
1896
|
+
<span class="cline-any cline-no"> </span>
|
|
1897
|
+
<span class="cline-any cline-no"> </span>
|
|
1898
|
+
<span class="cline-any cline-no"> </span>
|
|
1899
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1900
|
+
<span class="cline-any cline-no"> </span>
|
|
1901
|
+
<span class="cline-any cline-no"> </span>
|
|
1902
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1903
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1904
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1905
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1906
|
+
<span class="cline-any cline-no"> </span>
|
|
1907
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1908
|
+
<span class="cline-any cline-no"> </span>
|
|
1909
|
+
<span class="cline-any cline-no"> </span>
|
|
1910
|
+
<span class="cline-any cline-no"> </span>
|
|
1911
|
+
<span class="cline-any cline-no"> </span>
|
|
1912
|
+
<span class="cline-any cline-no"> </span>
|
|
1913
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1914
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1915
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1916
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1917
|
+
<span class="cline-any cline-no"> </span>
|
|
1918
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1919
|
+
<span class="cline-any cline-no"> </span>
|
|
1920
|
+
<span class="cline-any cline-no"> </span>
|
|
1921
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1922
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1923
|
+
<span class="cline-any cline-no"> </span>
|
|
1924
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1925
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1926
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1927
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1928
|
+
<span class="cline-any cline-no"> </span>
|
|
1929
|
+
<span class="cline-any cline-no"> </span>
|
|
1930
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1931
|
+
<span class="cline-any cline-no"> </span>
|
|
1932
|
+
<span class="cline-any cline-no"> </span>
|
|
1933
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1934
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1935
|
+
<span class="cline-any cline-no"> </span>
|
|
1936
|
+
<span class="cline-any cline-no"> </span>
|
|
1937
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1938
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1939
|
+
<span class="cline-any cline-no"> </span>
|
|
1940
|
+
<span class="cline-any cline-no"> </span>
|
|
1941
|
+
<span class="cline-any cline-no"> </span>
|
|
1942
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1943
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1944
|
+
<span class="cline-any cline-no"> </span>
|
|
1945
|
+
<span class="cline-any cline-no"> </span>
|
|
1946
|
+
<span class="cline-any cline-no"> </span>
|
|
1947
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1948
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1949
|
+
<span class="cline-any cline-no"> </span>
|
|
1950
|
+
<span class="cline-any cline-no"> </span>
|
|
1951
|
+
<span class="cline-any cline-no"> </span>
|
|
1952
|
+
<span class="cline-any cline-no"> </span>
|
|
1953
|
+
<span class="cline-any cline-no"> </span>
|
|
1954
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1955
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1956
|
+
<span class="cline-any cline-no"> </span>
|
|
1957
|
+
<span class="cline-any cline-no"> </span>
|
|
1958
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1959
|
+
<span class="cline-any cline-no"> </span>
|
|
1960
|
+
<span class="cline-any cline-no"> </span>
|
|
1961
|
+
<span class="cline-any cline-no"> </span>
|
|
1962
|
+
<span class="cline-any cline-no"> </span>
|
|
1963
|
+
<span class="cline-any cline-no"> </span>
|
|
1964
|
+
<span class="cline-any cline-no"> </span>
|
|
1965
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1966
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1967
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1968
|
+
<span class="cline-any cline-no"> </span>
|
|
1969
|
+
<span class="cline-any cline-no"> </span>
|
|
1970
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1971
|
+
<span class="cline-any cline-no"> </span>
|
|
1972
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1973
|
+
<span class="cline-any cline-no"> </span>
|
|
1974
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1975
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1976
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1977
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1978
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1979
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1980
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1981
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1982
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1983
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1984
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1985
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1986
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1987
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1988
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1989
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1990
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1991
|
+
<span class="cline-any cline-no"> </span>
|
|
1992
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1993
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1994
|
+
<span class="cline-any cline-no"> </span>
|
|
1995
|
+
<span class="cline-any cline-no"> </span>
|
|
1996
|
+
<span class="cline-any cline-no"> </span>
|
|
1997
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1998
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1999
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2000
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2001
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2002
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2003
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2004
|
+
<span class="cline-any cline-no"> </span>
|
|
2005
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2006
|
+
<span class="cline-any cline-no"> </span>
|
|
2007
|
+
<span class="cline-any cline-no"> </span>
|
|
2008
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2009
|
+
<span class="cline-any cline-no"> </span>
|
|
2010
|
+
<span class="cline-any cline-no"> </span>
|
|
2011
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2012
|
+
<span class="cline-any cline-no"> </span>
|
|
2013
|
+
<span class="cline-any cline-no"> </span>
|
|
2014
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2015
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2016
|
+
<span class="cline-any cline-no"> </span>
|
|
2017
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2018
|
+
<span class="cline-any cline-no"> </span>
|
|
2019
|
+
<span class="cline-any cline-no"> </span>
|
|
2020
|
+
<span class="cline-any cline-no"> </span>
|
|
2021
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2022
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2023
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2024
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2025
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2026
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2027
|
+
<span class="cline-any cline-no"> </span>
|
|
2028
|
+
<span class="cline-any cline-no"> </span>
|
|
2029
|
+
<span class="cline-any cline-no"> </span>
|
|
2030
|
+
<span class="cline-any cline-no"> </span>
|
|
2031
|
+
<span class="cline-any cline-no"> </span>
|
|
2032
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2033
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2034
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2035
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2036
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2037
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2038
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2039
|
+
<span class="cline-any cline-no"> </span>
|
|
2040
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2041
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2042
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2043
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2044
|
+
<span class="cline-any cline-no"> </span>
|
|
2045
|
+
<span class="cline-any cline-no"> </span>
|
|
2046
|
+
<span class="cline-any cline-no"> </span>
|
|
2047
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2048
|
+
<span class="cline-any cline-no"> </span>
|
|
2049
|
+
<span class="cline-any cline-no"> </span>
|
|
2050
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2051
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2052
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2053
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2054
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2055
|
+
<span class="cline-any cline-no"> </span>
|
|
2056
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2057
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2058
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2059
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2060
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2061
|
+
<span class="cline-any cline-no"> </span>
|
|
2062
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2063
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2064
|
+
<span class="cline-any cline-no"> </span>
|
|
2065
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2066
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2067
|
+
<span class="cline-any cline-no"> </span>
|
|
2068
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2069
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2070
|
+
<span class="cline-any cline-no"> </span>
|
|
2071
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2072
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2073
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2074
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2075
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2076
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2077
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2078
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2079
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2080
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2081
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2082
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2083
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2084
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2085
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2086
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2087
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2088
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2089
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2090
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2091
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2092
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2093
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2094
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2095
|
+
<span class="cline-any cline-no"> </span>
|
|
2096
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2097
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2098
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2099
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2100
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2101
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2102
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2103
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2104
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2105
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2106
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2107
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2108
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2109
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2110
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2111
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2112
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2113
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2114
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2115
|
+
<span class="cline-any cline-no"> </span>
|
|
2116
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2117
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2118
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2119
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2120
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2121
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2122
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2123
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2124
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2125
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2126
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2127
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2128
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2129
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2130
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2131
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2132
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2133
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2134
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2135
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2136
|
+
<span class="cline-any cline-no"> </span>
|
|
2137
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2138
|
+
<span class="cline-any cline-no"> </span>
|
|
2139
|
+
<span class="cline-any cline-no"> </span>
|
|
2140
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2141
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2142
|
+
<span class="cline-any cline-no"> </span>
|
|
2143
|
+
<span class="cline-any cline-no"> </span>
|
|
2144
|
+
<span class="cline-any cline-no"> </span>
|
|
2145
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2146
|
+
<span class="cline-any cline-no"> </span>
|
|
2147
|
+
<span class="cline-any cline-no"> </span>
|
|
2148
|
+
<span class="cline-any cline-no"> </span>
|
|
2149
|
+
<span class="cline-any cline-no"> </span>
|
|
2150
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2151
|
+
<span class="cline-any cline-no"> </span>
|
|
2152
|
+
<span class="cline-any cline-no"> </span>
|
|
2153
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2154
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2155
|
+
<span class="cline-any cline-no"> </span>
|
|
2156
|
+
<span class="cline-any cline-no"> </span>
|
|
2157
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2158
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2159
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2160
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2161
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2162
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2163
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2164
|
+
<span class="cline-any cline-no"> </span>
|
|
2165
|
+
<span class="cline-any cline-no"> </span>
|
|
2166
|
+
<span class="cline-any cline-no"> </span>
|
|
2167
|
+
<span class="cline-any cline-no"> </span>
|
|
2168
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2169
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2170
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2171
|
+
<span class="cline-any cline-no"> </span>
|
|
2172
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2173
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2174
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2175
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2176
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2177
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2178
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2179
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2180
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2181
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2182
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2183
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2184
|
+
<span class="cline-any cline-no"> </span>
|
|
2185
|
+
<span class="cline-any cline-no"> </span>
|
|
2186
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2187
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2188
|
+
<span class="cline-any cline-no"> </span>
|
|
2189
|
+
<span class="cline-any cline-no"> </span>
|
|
2190
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2191
|
+
<span class="cline-any cline-no"> </span>
|
|
2192
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2193
|
+
<span class="cline-any cline-no"> </span>
|
|
2194
|
+
<span class="cline-any cline-no"> </span>
|
|
2195
|
+
<span class="cline-any cline-no"> </span>
|
|
2196
|
+
<span class="cline-any cline-no"> </span>
|
|
2197
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2198
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2199
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2200
|
+
<span class="cline-any cline-no"> </span>
|
|
2201
|
+
<span class="cline-any cline-no"> </span>
|
|
2202
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2203
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2204
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2205
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2206
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2207
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2208
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2209
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2210
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2211
|
+
<span class="cline-any cline-no"> </span>
|
|
2212
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2213
|
+
<span class="cline-any cline-no"> </span>
|
|
2214
|
+
<span class="cline-any cline-no"> </span>
|
|
2215
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2216
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2217
|
+
<span class="cline-any cline-no"> </span>
|
|
2218
|
+
<span class="cline-any cline-no"> </span>
|
|
2219
|
+
<span class="cline-any cline-no"> </span>
|
|
2220
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2221
|
+
<span class="cline-any cline-no"> </span>
|
|
2222
|
+
<span class="cline-any cline-no"> </span>
|
|
2223
|
+
<span class="cline-any cline-no"> </span>
|
|
2224
|
+
<span class="cline-any cline-no"> </span>
|
|
2225
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2226
|
+
<span class="cline-any cline-no"> </span>
|
|
2227
|
+
<span class="cline-any cline-no"> </span>
|
|
2228
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2229
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2230
|
+
<span class="cline-any cline-no"> </span>
|
|
2231
|
+
<span class="cline-any cline-no"> </span>
|
|
2232
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2233
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2234
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2235
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2236
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2237
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2238
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2239
|
+
<span class="cline-any cline-no"> </span>
|
|
2240
|
+
<span class="cline-any cline-no"> </span>
|
|
2241
|
+
<span class="cline-any cline-no"> </span>
|
|
2242
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2243
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2244
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2245
|
+
<span class="cline-any cline-no"> </span>
|
|
2246
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2247
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2248
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2249
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2250
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2251
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2252
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2253
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2254
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2255
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2256
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2257
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2258
|
+
<span class="cline-any cline-no"> </span>
|
|
2259
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2260
|
+
<span class="cline-any cline-no"> </span>
|
|
2261
|
+
<span class="cline-any cline-no"> </span>
|
|
2262
|
+
<span class="cline-any cline-no"> </span>
|
|
2263
|
+
<span class="cline-any cline-no"> </span>
|
|
2264
|
+
<span class="cline-any cline-no"> </span>
|
|
2265
|
+
<span class="cline-any cline-no"> </span>
|
|
2266
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2267
|
+
<span class="cline-any cline-no"> </span>
|
|
2268
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2269
|
+
<span class="cline-any cline-no"> </span>
|
|
2270
|
+
<span class="cline-any cline-no"> </span>
|
|
2271
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2272
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2273
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2274
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2275
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2276
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2277
|
+
<span class="cline-any cline-no"> </span>
|
|
2278
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2279
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2280
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2281
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2282
|
+
<span class="cline-any cline-no"> </span>
|
|
2283
|
+
<span class="cline-any cline-no"> </span>
|
|
2284
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2285
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2286
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2287
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2288
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2289
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2290
|
+
<span class="cline-any cline-no"> </span>
|
|
2291
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2292
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2293
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2294
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2295
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2296
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2297
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2298
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2299
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2300
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2301
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2302
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2303
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2304
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2305
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2306
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2307
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2308
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2309
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2310
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2311
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2312
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2313
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2314
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2315
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2316
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2317
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2318
|
+
<span class="cline-any cline-no"> </span>
|
|
2319
|
+
<span class="cline-any cline-no"> </span>
|
|
2320
|
+
<span class="cline-any cline-no"> </span>
|
|
2321
|
+
<span class="cline-any cline-no"> </span>
|
|
2322
|
+
<span class="cline-any cline-no"> </span>
|
|
2323
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2324
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2325
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2326
|
+
<span class="cline-any cline-no"> </span>
|
|
2327
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2328
|
+
<span class="cline-any cline-no"> </span>
|
|
2329
|
+
<span class="cline-any cline-no"> </span>
|
|
2330
|
+
<span class="cline-any cline-no"> </span>
|
|
2331
|
+
<span class="cline-any cline-no"> </span>
|
|
2332
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2333
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2334
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2335
|
+
<span class="cline-any cline-no"> </span>
|
|
2336
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2337
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2338
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2339
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2340
|
+
<span class="cline-any cline-no"> </span>
|
|
2341
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2342
|
+
<span class="cline-any cline-no"> </span>
|
|
2343
|
+
<span class="cline-any cline-no"> </span>
|
|
2344
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2345
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2346
|
+
<span class="cline-any cline-no"> </span>
|
|
2347
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2348
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2349
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2350
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2351
|
+
<span class="cline-any cline-no"> </span>
|
|
2352
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2353
|
+
<span class="cline-any cline-no"> </span>
|
|
2354
|
+
<span class="cline-any cline-no"> </span>
|
|
2355
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2356
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2357
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2358
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2359
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2360
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2361
|
+
<span class="cline-any cline-no"> </span>
|
|
2362
|
+
<span class="cline-any cline-no"> </span>
|
|
2363
|
+
<span class="cline-any cline-no"> </span>
|
|
2364
|
+
<span class="cline-any cline-no"> </span>
|
|
2365
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2366
|
+
<span class="cline-any cline-no"> </span>
|
|
2367
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2368
|
+
<span class="cline-any cline-no"> </span>
|
|
2369
|
+
<span class="cline-any cline-no"> </span>
|
|
2370
|
+
<span class="cline-any cline-no"> </span>
|
|
2371
|
+
<span class="cline-any cline-no"> </span>
|
|
2372
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2373
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2374
|
+
<span class="cline-any cline-no"> </span>
|
|
2375
|
+
<span class="cline-any cline-no"> </span>
|
|
2376
|
+
<span class="cline-any cline-no"> </span>
|
|
2377
|
+
<span class="cline-any cline-no"> </span>
|
|
2378
|
+
<span class="cline-any cline-no"> </span>
|
|
2379
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2380
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2381
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2382
|
+
<span class="cline-any cline-no"> </span>
|
|
2383
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2384
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2385
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2386
|
+
<span class="cline-any cline-no"> </span>
|
|
2387
|
+
<span class="cline-any cline-no"> </span>
|
|
2388
|
+
<span class="cline-any cline-no"> </span>
|
|
2389
|
+
<span class="cline-any cline-no"> </span>
|
|
2390
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2391
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2392
|
+
<span class="cline-any cline-no"> </span>
|
|
2393
|
+
<span class="cline-any cline-no"> </span>
|
|
2394
|
+
<span class="cline-any cline-no"> </span>
|
|
2395
|
+
<span class="cline-any cline-no"> </span>
|
|
2396
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2397
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2398
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2399
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2400
|
+
<span class="cline-any cline-no"> </span>
|
|
2401
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2402
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2403
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2404
|
+
<span class="cline-any cline-no"> </span>
|
|
2405
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2406
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2407
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2408
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2409
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2410
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2411
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2412
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2413
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2414
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2415
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2416
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2417
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2418
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2419
|
+
<span class="cline-any cline-no"> </span>
|
|
2420
|
+
<span class="cline-any cline-no"> </span>
|
|
2421
|
+
<span class="cline-any cline-no"> </span>
|
|
2422
|
+
<span class="cline-any cline-no"> </span>
|
|
2423
|
+
<span class="cline-any cline-no"> </span>
|
|
2424
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2425
|
+
<span class="cline-any cline-no"> </span>
|
|
2426
|
+
<span class="cline-any cline-no"> </span>
|
|
2427
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2428
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2429
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2430
|
+
<span class="cline-any cline-no"> </span>
|
|
2431
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2432
|
+
<span class="cline-any cline-no"> </span>
|
|
2433
|
+
<span class="cline-any cline-no"> </span>
|
|
2434
|
+
<span class="cline-any cline-no"> </span>
|
|
2435
|
+
<span class="cline-any cline-no"> </span>
|
|
2436
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2437
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2438
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2439
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2440
|
+
<span class="cline-any cline-no"> </span>
|
|
2441
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2442
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2443
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2444
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2445
|
+
<span class="cline-any cline-no"> </span>
|
|
2446
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2447
|
+
<span class="cline-any cline-no"> </span>
|
|
2448
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2449
|
+
<span class="cline-any cline-no"> </span>
|
|
2450
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2451
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2452
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2453
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2454
|
+
<span class="cline-any cline-no"> </span>
|
|
2455
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2456
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2457
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2458
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2459
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2460
|
+
<span class="cline-any cline-no"> </span>
|
|
2461
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2462
|
+
<span class="cline-any cline-no"> </span>
|
|
2463
|
+
<span class="cline-any cline-no"> </span>
|
|
2464
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2465
|
+
<span class="cline-any cline-no"> </span>
|
|
2466
|
+
<span class="cline-any cline-no"> </span>
|
|
2467
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2468
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2469
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2470
|
+
<span class="cline-any cline-no"> </span>
|
|
2471
|
+
<span class="cline-any cline-no"> </span>
|
|
2472
|
+
<span class="cline-any cline-no"> </span>
|
|
2473
|
+
<span class="cline-any cline-no"> </span>
|
|
2474
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2475
|
+
<span class="cline-any cline-no"> </span>
|
|
2476
|
+
<span class="cline-any cline-no"> </span>
|
|
2477
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2478
|
+
<span class="cline-any cline-no"> </span>
|
|
2479
|
+
<span class="cline-any cline-no"> </span>
|
|
2480
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2481
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2482
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2483
|
+
<span class="cline-any cline-no"> </span>
|
|
2484
|
+
<span class="cline-any cline-no"> </span>
|
|
2485
|
+
<span class="cline-any cline-no"> </span>
|
|
2486
|
+
<span class="cline-any cline-no"> </span>
|
|
2487
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2488
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2489
|
+
<span class="cline-any cline-no"> </span>
|
|
2490
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2491
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2492
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2493
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2494
|
+
<span class="cline-any cline-no"> </span>
|
|
2495
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2496
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2497
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2498
|
+
<span class="cline-any cline-no"> </span>
|
|
2499
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2500
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2501
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2502
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2503
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2504
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2505
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2506
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2507
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2508
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2509
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2510
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2511
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2512
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2513
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2514
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2515
|
+
<span class="cline-any cline-no"> </span>
|
|
2516
|
+
<span class="cline-any cline-no"> </span>
|
|
2517
|
+
<span class="cline-any cline-no"> </span>
|
|
2518
|
+
<span class="cline-any cline-no"> </span>
|
|
2519
|
+
<span class="cline-any cline-no"> </span>
|
|
2520
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2521
|
+
<span class="cline-any cline-no"> </span>
|
|
2522
|
+
<span class="cline-any cline-no"> </span>
|
|
2523
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2524
|
+
<span class="cline-any cline-no"> </span>
|
|
2525
|
+
<span class="cline-any cline-no"> </span>
|
|
2526
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2527
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2528
|
+
<span class="cline-any cline-no"> </span>
|
|
2529
|
+
<span class="cline-any cline-no"> </span>
|
|
2530
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2531
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2532
|
+
<span class="cline-any cline-no"> </span>
|
|
2533
|
+
<span class="cline-any cline-no"> </span>
|
|
2534
|
+
<span class="cline-any cline-no"> </span>
|
|
2535
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2536
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2537
|
+
<span class="cline-any cline-no"> </span>
|
|
2538
|
+
<span class="cline-any cline-no"> </span>
|
|
2539
|
+
<span class="cline-any cline-no"> </span>
|
|
2540
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2541
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2542
|
+
<span class="cline-any cline-no"> </span>
|
|
2543
|
+
<span class="cline-any cline-no"> </span>
|
|
2544
|
+
<span class="cline-any cline-no"> </span>
|
|
2545
|
+
<span class="cline-any cline-no"> </span>
|
|
2546
|
+
<span class="cline-any cline-no"> </span>
|
|
2547
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2548
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2549
|
+
<span class="cline-any cline-no"> </span>
|
|
2550
|
+
<span class="cline-any cline-no"> </span>
|
|
2551
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2552
|
+
<span class="cline-any cline-no"> </span>
|
|
2553
|
+
<span class="cline-any cline-no"> </span>
|
|
2554
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2555
|
+
<span class="cline-any cline-no"> </span>
|
|
2556
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2557
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2558
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2559
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2560
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2561
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2562
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2563
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2564
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2565
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2566
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2567
|
+
<span class="cline-any cline-no"> </span>
|
|
2568
|
+
<span class="cline-any cline-no"> </span>
|
|
2569
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2570
|
+
<span class="cline-any cline-no"> </span>
|
|
2571
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2572
|
+
<span class="cline-any cline-no"> </span>
|
|
2573
|
+
<span class="cline-any cline-no"> </span>
|
|
2574
|
+
<span class="cline-any cline-no"> </span>
|
|
2575
|
+
<span class="cline-any cline-no"> </span>
|
|
2576
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2577
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2578
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2579
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2580
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2581
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2582
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2583
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2584
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2585
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2586
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2587
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2588
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2589
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2590
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2591
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2592
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2593
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2594
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2595
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2596
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2597
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2598
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2599
|
+
<span class="cline-any cline-no"> </span>
|
|
2600
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2601
|
+
<span class="cline-any cline-no"> </span>
|
|
2602
|
+
<span class="cline-any cline-no"> </span>
|
|
2603
|
+
<span class="cline-any cline-no"> </span>
|
|
2604
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2605
|
+
<span class="cline-any cline-no"> </span>
|
|
2606
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2607
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2608
|
+
<span class="cline-any cline-no"> </span>
|
|
2609
|
+
<span class="cline-any cline-no"> </span>
|
|
2610
|
+
<span class="cline-any cline-no"> </span>
|
|
2611
|
+
<span class="cline-any cline-no"> </span>
|
|
2612
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2613
|
+
<span class="cline-any cline-no"> </span>
|
|
2614
|
+
<span class="cline-any cline-no"> </span>
|
|
2615
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2616
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2617
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2618
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2619
|
+
<span class="cline-any cline-no"> </span>
|
|
2620
|
+
<span class="cline-any cline-no"> </span>
|
|
2621
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2622
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2623
|
+
<span class="cline-any cline-no"> </span>
|
|
2624
|
+
<span class="cline-any cline-no"> </span>
|
|
2625
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2626
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2627
|
+
<span class="cline-any cline-no"> </span>
|
|
2628
|
+
<span class="cline-any cline-no"> </span>
|
|
2629
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2630
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2631
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2632
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2633
|
+
<span class="cline-any cline-no"> </span>
|
|
2634
|
+
<span class="cline-any cline-no"> </span>
|
|
2635
|
+
<span class="cline-any cline-no"> </span>
|
|
2636
|
+
<span class="cline-any cline-no"> </span>
|
|
2637
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2638
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2639
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2640
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2641
|
+
<span class="cline-any cline-no"> </span>
|
|
2642
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2643
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2644
|
+
<span class="cline-any cline-no"> </span>
|
|
2645
|
+
<span class="cline-any cline-no"> </span>
|
|
2646
|
+
<span class="cline-any cline-no"> </span>
|
|
2647
|
+
<span class="cline-any cline-no"> </span>
|
|
2648
|
+
<span class="cline-any cline-no"> </span>
|
|
2649
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2650
|
+
<span class="cline-any cline-no"> </span>
|
|
2651
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2652
|
+
<span class="cline-any cline-no"> </span>
|
|
2653
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2654
|
+
<span class="cline-any cline-no"> </span>
|
|
2655
|
+
<span class="cline-any cline-no"> </span>
|
|
2656
|
+
<span class="cline-any cline-no"> </span>
|
|
2657
|
+
<span class="cline-any cline-no"> </span>
|
|
2658
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2659
|
+
<span class="cline-any cline-no"> </span>
|
|
2660
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2661
|
+
<span class="cline-any cline-no"> </span>
|
|
2662
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2663
|
+
<span class="cline-any cline-no"> </span>
|
|
2664
|
+
<span class="cline-any cline-no"> </span>
|
|
2665
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2666
|
+
<span class="cline-any cline-no"> </span>
|
|
2667
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2668
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2669
|
+
<span class="cline-any cline-no"> </span>
|
|
2670
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2671
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2672
|
+
<span class="cline-any cline-no"> </span>
|
|
2673
|
+
<span class="cline-any cline-no"> </span>
|
|
2674
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2675
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2677
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2678
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2679
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2680
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2681
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2682
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2683
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2684
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2685
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2686
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2687
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2688
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2689
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2690
|
+
<span class="cline-any cline-no"> </span>
|
|
2691
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2692
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2693
|
+
<span class="cline-any cline-no"> </span>
|
|
2694
|
+
<span class="cline-any cline-no"> </span>
|
|
2695
|
+
<span class="cline-any cline-no"> </span>
|
|
2696
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2697
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2698
|
+
<span class="cline-any cline-no"> </span>
|
|
2699
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2700
|
+
<span class="cline-any cline-no"> </span>
|
|
2701
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2702
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2703
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2704
|
+
<span class="cline-any cline-no"> </span>
|
|
2705
|
+
<span class="cline-any cline-no"> </span>
|
|
2706
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2708
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { and, asc, count, desc, eq, getTableName, gt, lt, or, SQL } from "drizzle-orm";
|
|
2709
|
+
import { AnyPgColumn, PgTable } from "drizzle-orm/pg-core";
|
|
2710
|
+
import { Entity, EntityCollection, FilterValues, Relation } from "@rebasepro/types";
|
|
2711
|
+
import { resolveCollectionRelations } from "@rebasepro/common";
|
|
2712
|
+
import { DrizzleConditionBuilder } from "../../utils/drizzle-conditions";
|
|
2713
|
+
import {
|
|
2714
|
+
getCollectionByPath,
|
|
2715
|
+
getTableForCollection,
|
|
2716
|
+
getPrimaryKeys,
|
|
2717
|
+
parseIdValues,
|
|
2718
|
+
buildCompositeId
|
|
2719
|
+
} from "./entity-helpers";
|
|
2720
|
+
import { parseDataFromServer, normalizeDbValues } from "../data-transformer";
|
|
2721
|
+
import { RelationService } from "./RelationService";
|
|
2722
|
+
import { RelationalQueryBuilder } from "drizzle-orm/pg-core/query-builders/query";
|
|
2723
|
+
import { DrizzleClient } from "../interfaces";
|
|
2724
|
+
import { BackendCollectionRegistry } from "../../collections/BackendCollectionRegistry";
|
|
2725
|
+
|
|
2726
|
+
/** Type-safe accessor for Drizzle's relational query API via dynamic table name */
|
|
2727
|
+
type DbQueryAccessor = Record<string, RelationalQueryBuilder<any, any>> | undefined;
|
|
2728
|
+
|
|
2729
|
+
/**
|
|
2730
|
+
* Service for handling all entity read operations.
|
|
2731
|
+
* Handles fetching, searching, counting, and filtering entities.
|
|
2732
|
+
*/
|
|
2733
|
+
export class EntityFetchService {
|
|
2734
|
+
private relationService: RelationService;
|
|
2735
|
+
|
|
2736
|
+
constructor(private db: DrizzleClient, private registry: BackendCollectionRegistry) {
|
|
2737
|
+
this.relationService = new RelationService(db, registry);
|
|
2738
|
+
}
|
|
2739
|
+
|
|
2740
|
+
/**
|
|
2741
|
+
* Get the relational query builder for a given table name.
|
|
2742
|
+
* Safely narrows the DrizzleClient union type to access db.query[tableName].
|
|
2743
|
+
*/
|
|
2744
|
+
private <span class="fstat-no" title="function not covered" >getQueryBuilder(</span>tableName: string): RelationalQueryBuilder<any, any> | undefined {
|
|
2745
|
+
const query = (<span class="cstat-no" title="statement not covered" >this.db as { query?: DbQueryAccessor }).query;</span>
|
|
2746
|
+
<span class="cstat-no" title="statement not covered" > return query?.[tableName];</span>
|
|
2747
|
+
}
|
|
2748
|
+
|
|
2749
|
+
/**
|
|
2750
|
+
* Build filter conditions from FilterValues
|
|
2751
|
+
* Delegates to DrizzleConditionBuilder.buildFilterConditions
|
|
2752
|
+
*/
|
|
2753
|
+
<span class="fstat-no" title="function not covered" > buildFilterConditions<</span>M extends Record<string, any>>(
|
|
2754
|
+
filter: FilterValues<Extract<keyof M, string>>,
|
|
2755
|
+
table: PgTable<any>,
|
|
2756
|
+
collectionPath: string
|
|
2757
|
+
): SQL[] {
|
|
2758
|
+
<span class="cstat-no" title="statement not covered" > return DrizzleConditionBuilder.buildFilterConditions(filter, table, collectionPath);</span>
|
|
2759
|
+
}
|
|
2760
|
+
|
|
2761
|
+
// =============================================================
|
|
2762
|
+
// DRIZZLE QUERY HELPERS
|
|
2763
|
+
// =============================================================
|
|
2764
|
+
|
|
2765
|
+
/**
|
|
2766
|
+
* Build the `with` config for Drizzle's relational query API.
|
|
2767
|
+
* Converts collection relations to a Drizzle-compatible `with` object.
|
|
2768
|
+
*
|
|
2769
|
+
* When `include` is provided, only those relations are loaded.
|
|
2770
|
+
* When `include` is absent, ALL relations are loaded (CMS path).
|
|
2771
|
+
*
|
|
2772
|
+
* Automatically detects many-to-many junction tables and nests
|
|
2773
|
+
* the target relation so actual entity data is returned.
|
|
2774
|
+
*/
|
|
2775
|
+
private <span class="fstat-no" title="function not covered" >buildWithConfig(</span>
|
|
2776
|
+
collection: EntityCollection,
|
|
2777
|
+
include?: string[]
|
|
2778
|
+
): Record<string, boolean | { with: Record<string, boolean> }> {
|
|
2779
|
+
const resolvedRelations = <span class="cstat-no" title="statement not covered" >resolveCollectionRelations(collection);</span>
|
|
2780
|
+
const propertyKeys = <span class="cstat-no" title="statement not covered" >new Set(Object.keys(collection.properties || {}));</span>
|
|
2781
|
+
const withConfig: Record<string, boolean | { with: Record<string, boolean> }> = <span class="cstat-no" title="statement not covered" >{};</span>
|
|
2782
|
+
|
|
2783
|
+
const shouldInclude = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(k</span>ey: string) =></span>
|
|
2784
|
+
<span class="cstat-no" title="statement not covered" > !include || include.length === 0 || include[0] === "*" || include.includes(key);</span>
|
|
2785
|
+
|
|
2786
|
+
<span class="cstat-no" title="statement not covered" > for (const [key, relation] of Object.entries(resolvedRelations)) {</span>
|
|
2787
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!shouldInclude(key)) <span class="cstat-no" title="statement not covered" >continue;</span></span>
|
|
2788
|
+
// Only include relations that map to actual properties (or include all for REST)
|
|
2789
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!include && !propertyKeys.has(key)) <span class="cstat-no" title="statement not covered" >continue;</span></span>
|
|
2790
|
+
|
|
2791
|
+
const drizzleRelName = <span class="cstat-no" title="statement not covered" >relation.relationName || key;</span>
|
|
2792
|
+
|
|
2793
|
+
// Detect many-to-many junction tables:
|
|
2794
|
+
// If the relation goes through a junction table (relation.through exists or
|
|
2795
|
+
// the Drizzle schema maps to a junction table), we need two-level with.
|
|
2796
|
+
<span class="cstat-no" title="statement not covered" > if (relation.cardinality === "many" && this.isJunctionRelation(relation, collection)) {</span>
|
|
2797
|
+
// The Drizzle relation points to the junction table.
|
|
2798
|
+
// We need: { [junctionRelName]: { with: { [targetFkName]: true } } }
|
|
2799
|
+
// The target FK name is the relation on the junction table that points to the actual target.
|
|
2800
|
+
const targetFkName = <span class="cstat-no" title="statement not covered" >this.getJunctionTargetRelationName(relation, collection);</span>
|
|
2801
|
+
<span class="cstat-no" title="statement not covered" > if (targetFkName) {</span>
|
|
2802
|
+
<span class="cstat-no" title="statement not covered" > withConfig[drizzleRelName] = { with: { [targetFkName]: true } };</span>
|
|
2803
|
+
} else {
|
|
2804
|
+
<span class="cstat-no" title="statement not covered" > withConfig[drizzleRelName] = true;</span>
|
|
2805
|
+
}
|
|
2806
|
+
} else {
|
|
2807
|
+
<span class="cstat-no" title="statement not covered" > withConfig[drizzleRelName] = true;</span>
|
|
2808
|
+
}
|
|
2809
|
+
}
|
|
2810
|
+
|
|
2811
|
+
<span class="cstat-no" title="statement not covered" > return withConfig;</span>
|
|
2812
|
+
}
|
|
2813
|
+
|
|
2814
|
+
/**
|
|
2815
|
+
* Detect if a many-to-many relation uses a junction table in the Drizzle schema.
|
|
2816
|
+
*/
|
|
2817
|
+
private <span class="fstat-no" title="function not covered" >isJunctionRelation(</span>relation: Relation, _collection: EntityCollection): boolean {
|
|
2818
|
+
// If `through` is defined, it's explicitly a junction relation
|
|
2819
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (relation.through) <span class="cstat-no" title="statement not covered" >return true;</span></span>
|
|
2820
|
+
// If joinPath has an intermediate table, it's likely junction-based
|
|
2821
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (relation.joinPath && relation.joinPath.length > 1) <span class="cstat-no" title="statement not covered" >return true;</span></span>
|
|
2822
|
+
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
2823
|
+
}
|
|
2824
|
+
|
|
2825
|
+
/**
|
|
2826
|
+
* Get the Drizzle relation name on the junction table that points to the actual target entity.
|
|
2827
|
+
* For example, for posts_tags junction, this returns "tag_id" (the relation pointing to tags).
|
|
2828
|
+
*/
|
|
2829
|
+
private <span class="fstat-no" title="function not covered" >getJunctionTargetRelationName(</span>relation: Relation, _collection: EntityCollection): string | null {
|
|
2830
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (relation.through) {</span>
|
|
2831
|
+
// The junction relation on the junction table pointing to the target
|
|
2832
|
+
// uses the targetColumn name as the Drizzle relation name
|
|
2833
|
+
<span class="cstat-no" title="statement not covered" > return relation.through.targetColumn.replace(/_id$/, "_id");</span>
|
|
2834
|
+
}
|
|
2835
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
2836
|
+
}
|
|
2837
|
+
|
|
2838
|
+
/**
|
|
2839
|
+
* Convert a db.query result row (with nested relation objects) to an Entity<M>.
|
|
2840
|
+
* Handles:
|
|
2841
|
+
* - The { id, path, values } wrapping
|
|
2842
|
+
* - Type normalization (dates, numbers, NaN) via normalizeDbValues
|
|
2843
|
+
* - Converting nested relation objects to { id, path, __type: "relation" } for CMS
|
|
2844
|
+
* - Flattening junction-table many-to-many results
|
|
2845
|
+
*/
|
|
2846
|
+
private <span class="fstat-no" title="function not covered" >drizzleResultToEntity<</span>M extends Record<string, any>>(
|
|
2847
|
+
row: Record<string, unknown>,
|
|
2848
|
+
collection: EntityCollection,
|
|
2849
|
+
collectionPath: string,
|
|
2850
|
+
idInfo: { fieldName: string; type: "string" | "number" },
|
|
2851
|
+
databaseId?: string
|
|
2852
|
+
): Entity<M> {
|
|
2853
|
+
const resolvedRelations = <span class="cstat-no" title="statement not covered" >resolveCollectionRelations(collection);</span>
|
|
2854
|
+
const propertyKeys = <span class="cstat-no" title="statement not covered" >new Set(Object.keys(collection.properties || {}));</span>
|
|
2855
|
+
|
|
2856
|
+
// Normalize non-relation values (dates, numbers, etc.)
|
|
2857
|
+
const normalizedValues = <span class="cstat-no" title="statement not covered" >normalizeDbValues(row as M, collection);</span>
|
|
2858
|
+
|
|
2859
|
+
// Convert nested relation objects to CMS-style { id, path, __type: "relation" }
|
|
2860
|
+
<span class="cstat-no" title="statement not covered" > for (const [key, relation] of Object.entries(resolvedRelations)) {</span>
|
|
2861
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!propertyKeys.has(key)) <span class="cstat-no" title="statement not covered" >continue;</span></span>
|
|
2862
|
+
const drizzleRelName = <span class="cstat-no" title="statement not covered" >relation.relationName || key;</span>
|
|
2863
|
+
const relData = <span class="cstat-no" title="statement not covered" >row[drizzleRelName];</span>
|
|
2864
|
+
|
|
2865
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (relData === undefined || relData === null) <span class="cstat-no" title="statement not covered" >continue;</span></span>
|
|
2866
|
+
|
|
2867
|
+
<span class="cstat-no" title="statement not covered" > if (relation.cardinality === "many" && Array.isArray(relData)) {</span>
|
|
2868
|
+
const targetCollection = <span class="cstat-no" title="statement not covered" >relation.target();</span>
|
|
2869
|
+
const targetPath = <span class="cstat-no" title="statement not covered" >targetCollection.slug || targetCollection.dbPath;</span>
|
|
2870
|
+
const targetPks = <span class="cstat-no" title="statement not covered" >getPrimaryKeys(targetCollection, this.registry);</span>
|
|
2871
|
+
const targetIdField = <span class="cstat-no" title="statement not covered" >targetPks[0].fieldName;</span>
|
|
2872
|
+
|
|
2873
|
+
(<span class="cstat-no" title="statement not covered" >normalizedValues as Record<string, unknown>)[key] = relData.map(<span class="fstat-no" title="function not covered" >(i</span>tem: Record<string, unknown>) => {</span>
|
|
2874
|
+
// Handle junction table flattening:
|
|
2875
|
+
// Junction rows look like { post_id: 1, tag_id: { id: 5, name: "ts" } }
|
|
2876
|
+
let targetEntity = <span class="cstat-no" title="statement not covered" >item;</span>
|
|
2877
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.isJunctionRelation(relation, collection)) {</span>
|
|
2878
|
+
// Find the nested target object in the junction row
|
|
2879
|
+
const nestedKey = <span class="cstat-no" title="statement not covered" >Object.keys(item).find(</span>
|
|
2880
|
+
<span class="fstat-no" title="function not covered" > nk </span>=> <span class="cstat-no" title="statement not covered" >typeof item[nk] === "object" && item[nk] !== null && !Array.isArray(item[nk])</span>
|
|
2881
|
+
);
|
|
2882
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (nestedKey) {</span>
|
|
2883
|
+
<span class="cstat-no" title="statement not covered" > targetEntity = item[nestedKey] as Record<string, unknown>;</span>
|
|
2884
|
+
}
|
|
2885
|
+
}
|
|
2886
|
+
|
|
2887
|
+
const relId = <span class="cstat-no" title="statement not covered" >String(targetEntity[targetIdField] ?? targetEntity.id ?? targetEntity[Object.keys(targetEntity)[0]]);</span>
|
|
2888
|
+
const targetValues = <span class="cstat-no" title="statement not covered" >normalizeDbValues(targetEntity, targetCollection);</span>
|
|
2889
|
+
|
|
2890
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
2891
|
+
id: relId,
|
|
2892
|
+
path: targetPath,
|
|
2893
|
+
__type: "relation" as const,
|
|
2894
|
+
data: {
|
|
2895
|
+
id: relId,
|
|
2896
|
+
path: targetPath,
|
|
2897
|
+
values: targetValues,
|
|
2898
|
+
databaseId
|
|
2899
|
+
}
|
|
2900
|
+
};
|
|
2901
|
+
});
|
|
2902
|
+
} else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if (relation.cardinality === "one" && typeof relData === "object" && !Array.isArray(relData)) {</span>
|
|
2903
|
+
const targetCollection = <span class="cstat-no" title="statement not covered" >relation.target();</span>
|
|
2904
|
+
const targetPath = <span class="cstat-no" title="statement not covered" >targetCollection.slug || targetCollection.dbPath;</span>
|
|
2905
|
+
const targetPks = <span class="cstat-no" title="statement not covered" >getPrimaryKeys(targetCollection, this.registry);</span>
|
|
2906
|
+
const targetIdField = <span class="cstat-no" title="statement not covered" >targetPks[0].fieldName;</span>
|
|
2907
|
+
const relObj = <span class="cstat-no" title="statement not covered" >relData as Record<string, unknown>;</span>
|
|
2908
|
+
|
|
2909
|
+
const relId = <span class="cstat-no" title="statement not covered" >String(relObj[targetIdField] ?? relObj.id ?? relObj[Object.keys(relObj)[0]]);</span>
|
|
2910
|
+
const targetValues = <span class="cstat-no" title="statement not covered" >normalizeDbValues(relObj, targetCollection);</span>
|
|
2911
|
+
|
|
2912
|
+
(<span class="cstat-no" title="statement not covered" >normalizedValues as Record<string, unknown>)[key] = {</span>
|
|
2913
|
+
id: relId,
|
|
2914
|
+
path: targetPath,
|
|
2915
|
+
__type: "relation" as const,
|
|
2916
|
+
data: {
|
|
2917
|
+
id: relId,
|
|
2918
|
+
path: targetPath,
|
|
2919
|
+
values: targetValues,
|
|
2920
|
+
databaseId
|
|
2921
|
+
}
|
|
2922
|
+
};
|
|
2923
|
+
}
|
|
2924
|
+
}
|
|
2925
|
+
|
|
2926
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
2927
|
+
id: String(row[idInfo.fieldName]),
|
|
2928
|
+
path: collectionPath,
|
|
2929
|
+
values: normalizedValues as M,
|
|
2930
|
+
databaseId
|
|
2931
|
+
};
|
|
2932
|
+
}
|
|
2933
|
+
|
|
2934
|
+
/**
|
|
2935
|
+
* Convert a db.query result row to a flat REST-style object with populated relations.
|
|
2936
|
+
*/
|
|
2937
|
+
private <span class="fstat-no" title="function not covered" >drizzleResultToRestRow(</span>
|
|
2938
|
+
row: Record<string, unknown>,
|
|
2939
|
+
collection: EntityCollection,
|
|
2940
|
+
idInfo: { fieldName: string; type: "string" | "number" }
|
|
2941
|
+
): Record<string, unknown> {
|
|
2942
|
+
const flat: Record<string, unknown> = <span class="cstat-no" title="statement not covered" >{ id: String(row[idInfo.fieldName]) };</span>
|
|
2943
|
+
const resolvedRelations = <span class="cstat-no" title="statement not covered" >resolveCollectionRelations(collection);</span>
|
|
2944
|
+
|
|
2945
|
+
<span class="cstat-no" title="statement not covered" > for (const [k, v] of Object.entries(row)) {</span>
|
|
2946
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (k === idInfo.fieldName) <span class="cstat-no" title="statement not covered" >continue;</span></span>
|
|
2947
|
+
|
|
2948
|
+
const relation = <span class="cstat-no" title="statement not covered" >resolvedRelations[k];</span>
|
|
2949
|
+
<span class="cstat-no" title="statement not covered" > if (Array.isArray(v) && relation) {</span>
|
|
2950
|
+
// Many relation — flatten each nested entity, handling junction tables
|
|
2951
|
+
<span class="cstat-no" title="statement not covered" > flat[k] = v.map(<span class="fstat-no" title="function not covered" >(i</span>tem: Record<string, unknown>) => {</span>
|
|
2952
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.isJunctionRelation(relation, collection)) {</span>
|
|
2953
|
+
const nestedKey = <span class="cstat-no" title="statement not covered" >Object.keys(item).find(</span>
|
|
2954
|
+
<span class="fstat-no" title="function not covered" > nk </span>=> <span class="cstat-no" title="statement not covered" >typeof item[nk] === "object" && item[nk] !== null && !Array.isArray(item[nk])</span>
|
|
2955
|
+
);
|
|
2956
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (nestedKey) {</span>
|
|
2957
|
+
const nested = <span class="cstat-no" title="statement not covered" >item[nestedKey] as Record<string, unknown>;</span>
|
|
2958
|
+
<span class="cstat-no" title="statement not covered" > return { id: String(nested.id ?? nested[Object.keys(nested)[0]]), ...nested };</span>
|
|
2959
|
+
}
|
|
2960
|
+
}
|
|
2961
|
+
<span class="cstat-no" title="statement not covered" > return { id: String(item.id ?? item[Object.keys(item)[0]]), ...item };</span>
|
|
2962
|
+
});
|
|
2963
|
+
} else <span class="cstat-no" title="statement not covered" >if (typeof v === "object" && v !== null && !Array.isArray(v) && relation) {</span>
|
|
2964
|
+
// One-to-one relation — inline the object
|
|
2965
|
+
const relObj = <span class="cstat-no" title="statement not covered" >v as Record<string, unknown>;</span>
|
|
2966
|
+
<span class="cstat-no" title="statement not covered" > flat[k] = { id: String(relObj.id ?? relObj[Object.keys(relObj)[0]]), ...relObj };</span>
|
|
2967
|
+
} else {
|
|
2968
|
+
<span class="cstat-no" title="statement not covered" > flat[k] = v;</span>
|
|
2969
|
+
}
|
|
2970
|
+
}
|
|
2971
|
+
<span class="cstat-no" title="statement not covered" > return flat;</span>
|
|
2972
|
+
}
|
|
2973
|
+
|
|
2974
|
+
/**
|
|
2975
|
+
* Build db.query-compatible options from standard fetch options.
|
|
2976
|
+
* Handles filter, search, orderBy, limit, and cursor-based pagination.
|
|
2977
|
+
*/
|
|
2978
|
+
private <span class="fstat-no" title="function not covered" >buildDrizzleQueryOptions<</span>M extends Record<string, any>>(
|
|
2979
|
+
table: PgTable<any>,
|
|
2980
|
+
idField: AnyPgColumn,
|
|
2981
|
+
idInfo: { fieldName: string; type: "string" | "number" },
|
|
2982
|
+
options: {
|
|
2983
|
+
filter?: FilterValues<Extract<keyof M, string>>;
|
|
2984
|
+
orderBy?: string;
|
|
2985
|
+
order?: "desc" | "asc";
|
|
2986
|
+
limit?: number;
|
|
2987
|
+
startAfter?: Record<string, unknown>;
|
|
2988
|
+
searchString?: string;
|
|
2989
|
+
},
|
|
2990
|
+
collectionPath: string,
|
|
2991
|
+
withConfig?: Record<string, any>
|
|
2992
|
+
): Record<string, unknown> {
|
|
2993
|
+
const queryOpts: Record<string, unknown> = <span class="cstat-no" title="statement not covered" >{};</span>
|
|
2994
|
+
|
|
2995
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (withConfig) <span class="cstat-no" title="statement not covered" >queryOpts.with = withConfig;</span></span>
|
|
2996
|
+
|
|
2997
|
+
// Build where conditions
|
|
2998
|
+
const allConditions: SQL[] = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
2999
|
+
|
|
3000
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (options.searchString) {</span>
|
|
3001
|
+
const collection = <span class="cstat-no" title="statement not covered" >getCollectionByPath(collectionPath, this.registry);</span>
|
|
3002
|
+
const searchConditions = <span class="cstat-no" title="statement not covered" >DrizzleConditionBuilder.buildSearchConditions(</span>
|
|
3003
|
+
options.searchString, collection.properties, table
|
|
3004
|
+
);
|
|
3005
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (searchConditions.length === 0) {</span>
|
|
3006
|
+
// Return options that will produce empty results
|
|
3007
|
+
<span class="cstat-no" title="statement not covered" > queryOpts.where = and(eq(idField, -99999999)); </span>// impossible condition
|
|
3008
|
+
<span class="cstat-no" title="statement not covered" > return queryOpts;</span>
|
|
3009
|
+
}
|
|
3010
|
+
<span class="cstat-no" title="statement not covered" > allConditions.push(DrizzleConditionBuilder.combineConditionsWithOr(searchConditions)!);</span>
|
|
3011
|
+
}
|
|
3012
|
+
|
|
3013
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (options.filter) {</span>
|
|
3014
|
+
const filterConditions = <span class="cstat-no" title="statement not covered" >this.buildFilterConditions(options.filter, table, collectionPath);</span>
|
|
3015
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (filterConditions.length > 0) <span class="cstat-no" title="statement not covered" >allConditions.push(...filterConditions);</span></span>
|
|
3016
|
+
}
|
|
3017
|
+
|
|
3018
|
+
// Cursor-based pagination (startAfter)
|
|
3019
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (options.startAfter) {</span>
|
|
3020
|
+
const cursorConditions = <span class="cstat-no" title="statement not covered" >this.buildCursorConditions(table, idField, idInfo, options);</span>
|
|
3021
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (cursorConditions.length > 0) <span class="cstat-no" title="statement not covered" >allConditions.push(...cursorConditions);</span></span>
|
|
3022
|
+
}
|
|
3023
|
+
|
|
3024
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (allConditions.length > 0) {</span>
|
|
3025
|
+
<span class="cstat-no" title="statement not covered" > queryOpts.where = and(...allConditions);</span>
|
|
3026
|
+
}
|
|
3027
|
+
|
|
3028
|
+
// OrderBy
|
|
3029
|
+
const orderExpressions: any[] = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
3030
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (options.orderBy) {</span>
|
|
3031
|
+
const orderByField = <span class="cstat-no" title="statement not covered" >table[options.orderBy as keyof typeof table] as AnyPgColumn;</span>
|
|
3032
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (orderByField) {</span>
|
|
3033
|
+
<span class="cstat-no" title="statement not covered" > orderExpressions.push(options.order === "asc" ? asc(orderByField) : desc(orderByField));</span>
|
|
3034
|
+
}
|
|
3035
|
+
}
|
|
3036
|
+
<span class="cstat-no" title="statement not covered" > orderExpressions.push(desc(idField));</span>
|
|
3037
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (orderExpressions.length > 0) {</span>
|
|
3038
|
+
<span class="cstat-no" title="statement not covered" > queryOpts.orderBy = orderExpressions;</span>
|
|
3039
|
+
}
|
|
3040
|
+
|
|
3041
|
+
// Limit
|
|
3042
|
+
const limitValue = <span class="cstat-no" title="statement not covered" >options.searchString ? (options.limit || 50) : options.limit;</span>
|
|
3043
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (limitValue) <span class="cstat-no" title="statement not covered" >queryOpts.limit = limitValue;</span></span>
|
|
3044
|
+
|
|
3045
|
+
<span class="cstat-no" title="statement not covered" > return queryOpts;</span>
|
|
3046
|
+
}
|
|
3047
|
+
|
|
3048
|
+
/**
|
|
3049
|
+
* Extract cursor pagination conditions from startAfter options.
|
|
3050
|
+
*/
|
|
3051
|
+
private <span class="fstat-no" title="function not covered" >buildCursorConditions(</span>
|
|
3052
|
+
table: PgTable<any>,
|
|
3053
|
+
idField: AnyPgColumn,
|
|
3054
|
+
idInfo: { fieldName: string; type: "string" | "number" },
|
|
3055
|
+
options: { orderBy?: string; order?: "desc" | "asc"; startAfter?: Record<string, unknown> }
|
|
3056
|
+
): SQL[] {
|
|
3057
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!options.startAfter) <span class="cstat-no" title="statement not covered" >return [];</span></span>
|
|
3058
|
+
const cursor = <span class="cstat-no" title="statement not covered" >options.startAfter;</span>
|
|
3059
|
+
|
|
3060
|
+
<span class="cstat-no" title="statement not covered" > if (options.orderBy) {</span>
|
|
3061
|
+
const orderByField = <span class="cstat-no" title="statement not covered" >table[options.orderBy as keyof typeof table] as AnyPgColumn;</span>
|
|
3062
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (orderByField) {</span>
|
|
3063
|
+
const startAfterOrderValue = (<span class="cstat-no" title="statement not covered" >cursor.values as Record<string, unknown> | undefined)?.[options.orderBy] ?? cursor[options.orderBy];</span>
|
|
3064
|
+
const startAfterId = <span class="cstat-no" title="statement not covered" >cursor.id ?? cursor[idInfo.fieldName];</span>
|
|
3065
|
+
|
|
3066
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (startAfterOrderValue !== undefined && startAfterId !== undefined) {</span>
|
|
3067
|
+
<span class="cstat-no" title="statement not covered" > if (options.order === "asc") {</span>
|
|
3068
|
+
<span class="cstat-no" title="statement not covered" > return [or(</span>
|
|
3069
|
+
gt(orderByField, startAfterOrderValue),
|
|
3070
|
+
and(eq(orderByField, startAfterOrderValue), gt(idField, startAfterId))
|
|
3071
|
+
)!];
|
|
3072
|
+
} else {
|
|
3073
|
+
<span class="cstat-no" title="statement not covered" > return [or(</span>
|
|
3074
|
+
lt(orderByField, startAfterOrderValue),
|
|
3075
|
+
and(eq(orderByField, startAfterOrderValue), lt(idField, startAfterId))
|
|
3076
|
+
)!];
|
|
3077
|
+
}
|
|
3078
|
+
}
|
|
3079
|
+
}
|
|
3080
|
+
} else {
|
|
3081
|
+
const startAfterId = <span class="cstat-no" title="statement not covered" >cursor.id ?? cursor[idInfo.fieldName];</span>
|
|
3082
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (startAfterId !== undefined && startAfterId !== null) {</span>
|
|
3083
|
+
const idInfoArray = <span class="cstat-no" title="statement not covered" >[idInfo] as Array<{ fieldName: string; type: "string" | "number" }>;</span>
|
|
3084
|
+
const parsedStartAfterIdObj = <span class="cstat-no" title="statement not covered" >parseIdValues(startAfterId as string | number, idInfoArray);</span>
|
|
3085
|
+
<span class="cstat-no" title="statement not covered" > return [lt(idField, parsedStartAfterIdObj[idInfo.fieldName])];</span>
|
|
3086
|
+
}
|
|
3087
|
+
}
|
|
3088
|
+
|
|
3089
|
+
<span class="cstat-no" title="statement not covered" > return [];</span>
|
|
3090
|
+
}
|
|
3091
|
+
|
|
3092
|
+
/**
|
|
3093
|
+
* Fetch a single entity by ID
|
|
3094
|
+
*/
|
|
3095
|
+
<span class="fstat-no" title="function not covered" > async </span>fetchEntity<M extends Record<string, any>>(
|
|
3096
|
+
collectionPath: string,
|
|
3097
|
+
entityId: string | number,
|
|
3098
|
+
databaseId?: string
|
|
3099
|
+
): Promise<Entity<M> | undefined> {
|
|
3100
|
+
const collection = <span class="cstat-no" title="statement not covered" >getCollectionByPath(collectionPath, this.registry);</span>
|
|
3101
|
+
const table = <span class="cstat-no" title="statement not covered" >getTableForCollection(collection, this.registry);</span>
|
|
3102
|
+
const idInfoArray = <span class="cstat-no" title="statement not covered" >getPrimaryKeys(collection, this.registry);</span>
|
|
3103
|
+
const idInfo = <span class="cstat-no" title="statement not covered" >idInfoArray[0];</span>
|
|
3104
|
+
const idField = <span class="cstat-no" title="statement not covered" >table[idInfo.fieldName as keyof typeof table] as AnyPgColumn;</span>
|
|
3105
|
+
|
|
3106
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!idField) {</span>
|
|
3107
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`ID field '${idInfo.fieldName}' not found in table for collection '${collectionPath}'`);</span>
|
|
3108
|
+
}
|
|
3109
|
+
|
|
3110
|
+
const parsedIdObj = <span class="cstat-no" title="statement not covered" >parseIdValues(entityId, idInfoArray);</span>
|
|
3111
|
+
const parsedId = <span class="cstat-no" title="statement not covered" >parsedIdObj[idInfo.fieldName];</span>
|
|
3112
|
+
|
|
3113
|
+
// Primary path: use db.query.findFirst with relation loading
|
|
3114
|
+
|
|
3115
|
+
const tableName = <span class="cstat-no" title="statement not covered" >getTableName(table);</span>
|
|
3116
|
+
|
|
3117
|
+
const qb = <span class="cstat-no" title="statement not covered" >this.getQueryBuilder(tableName);</span>
|
|
3118
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (qb) {</span>
|
|
3119
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3120
|
+
const withConfig = <span class="cstat-no" title="statement not covered" >this.buildWithConfig(collection);</span>
|
|
3121
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic query config
|
|
3122
|
+
const row = <span class="cstat-no" title="statement not covered" >await qb.findFirst({</span>
|
|
3123
|
+
where: eq(idField, parsedId),
|
|
3124
|
+
with: withConfig
|
|
3125
|
+
} as any);
|
|
3126
|
+
|
|
3127
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!row) <span class="cstat-no" title="statement not covered" >return undefined;</span></span>
|
|
3128
|
+
|
|
3129
|
+
<span class="cstat-no" title="statement not covered" > return this.drizzleResultToEntity<M>(row, collection, collectionPath, idInfo, databaseId);</span>
|
|
3130
|
+
} catch (e) {
|
|
3131
|
+
<span class="cstat-no" title="statement not covered" > console.warn(`[EntityFetchService] db.query.findFirst failed for ${collectionPath}, falling back to db.select:`, e);</span>
|
|
3132
|
+
}
|
|
3133
|
+
}
|
|
3134
|
+
|
|
3135
|
+
// Fallback: db.select + N+1 relation loading
|
|
3136
|
+
const result = <span class="cstat-no" title="statement not covered" >await this.db</span>
|
|
3137
|
+
.select()
|
|
3138
|
+
.from(table)
|
|
3139
|
+
.where(eq(idField, parsedId))
|
|
3140
|
+
.limit(1);
|
|
3141
|
+
|
|
3142
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (result.length === 0) <span class="cstat-no" title="statement not covered" >return undefined;</span></span>
|
|
3143
|
+
|
|
3144
|
+
const raw = <span class="cstat-no" title="statement not covered" >result[0] as M;</span>
|
|
3145
|
+
const values = <span class="cstat-no" title="statement not covered" >await parseDataFromServer(raw, collection, this.db, this.registry);</span>
|
|
3146
|
+
|
|
3147
|
+
// Load relations based on cardinality (N+1 — only used in fallback)
|
|
3148
|
+
const resolvedRelations = <span class="cstat-no" title="statement not covered" >resolveCollectionRelations(collection);</span>
|
|
3149
|
+
const propertyKeys = <span class="cstat-no" title="statement not covered" >new Set(Object.keys(collection.properties));</span>
|
|
3150
|
+
|
|
3151
|
+
const relationPromises = <span class="cstat-no" title="statement not covered" >Object.entries(resolvedRelations)</span>
|
|
3152
|
+
.filter(<span class="fstat-no" title="function not covered" >([</span>key]) => <span class="cstat-no" title="statement not covered" >propertyKeys.has(key))</span>
|
|
3153
|
+
.map(<span class="fstat-no" title="function not covered" >async </span>([key, relation]) => {
|
|
3154
|
+
<span class="cstat-no" title="statement not covered" > if (relation.cardinality === "many") {</span>
|
|
3155
|
+
const relatedEntities = <span class="cstat-no" title="statement not covered" >await this.relationService.fetchRelatedEntities(</span>
|
|
3156
|
+
collectionPath,
|
|
3157
|
+
parsedId,
|
|
3158
|
+
key,
|
|
3159
|
+
{}
|
|
3160
|
+
);
|
|
3161
|
+
(<span class="cstat-no" title="statement not covered" >values as Record<string, unknown>)[key] = relatedEntities.map(<span class="fstat-no" title="function not covered" >e </span>=> (<span class="cstat-no" title="statement not covered" >{</span></span>
|
|
3162
|
+
id: e.id,
|
|
3163
|
+
path: e.path,
|
|
3164
|
+
__type: "relation"
|
|
3165
|
+
}));
|
|
3166
|
+
} else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if (relation.cardinality === "one") {</span>
|
|
3167
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if ((values as Record<string, unknown>)[key] == null) {</span>
|
|
3168
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3169
|
+
const relatedEntities = <span class="cstat-no" title="statement not covered" >await this.relationService.fetchRelatedEntities(</span>
|
|
3170
|
+
collectionPath,
|
|
3171
|
+
parsedId,
|
|
3172
|
+
key,
|
|
3173
|
+
{ limit: 1 }
|
|
3174
|
+
);
|
|
3175
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (relatedEntities.length > 0) {</span>
|
|
3176
|
+
const e = <span class="cstat-no" title="statement not covered" >relatedEntities[0];</span>
|
|
3177
|
+
(<span class="cstat-no" title="statement not covered" >values as Record<string, unknown>)[key] = {</span>
|
|
3178
|
+
id: e.id,
|
|
3179
|
+
path: e.path,
|
|
3180
|
+
__type: "relation"
|
|
3181
|
+
};
|
|
3182
|
+
}
|
|
3183
|
+
} catch (e) {
|
|
3184
|
+
<span class="cstat-no" title="statement not covered" > console.warn(`Could not resolve one-to-one relation property: ${key}`, e);</span>
|
|
3185
|
+
}
|
|
3186
|
+
}
|
|
3187
|
+
}
|
|
3188
|
+
});
|
|
3189
|
+
|
|
3190
|
+
<span class="cstat-no" title="statement not covered" > await Promise.all(relationPromises);</span>
|
|
3191
|
+
|
|
3192
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
3193
|
+
id: entityId.toString(),
|
|
3194
|
+
path: collectionPath,
|
|
3195
|
+
values: values as M,
|
|
3196
|
+
databaseId
|
|
3197
|
+
};
|
|
3198
|
+
}
|
|
3199
|
+
|
|
3200
|
+
/**
|
|
3201
|
+
* Unified method to fetch entities with optional search functionality
|
|
3202
|
+
*/
|
|
3203
|
+
async fetchEntitiesWithConditions<M extends Record<string, any>>(
|
|
3204
|
+
collectionPath: string,
|
|
3205
|
+
options: {
|
|
3206
|
+
filter?: FilterValues<Extract<keyof M, string>>;
|
|
3207
|
+
orderBy?: string;
|
|
3208
|
+
order?: "desc" | "asc";
|
|
3209
|
+
limit?: number;
|
|
3210
|
+
startAfter?: Record<string, unknown>;
|
|
3211
|
+
searchString?: string;
|
|
3212
|
+
databaseId?: string;
|
|
3213
|
+
} = <span class="branch-0 cbranch-no" title="branch not covered" >{}</span>
|
|
3214
|
+
): Promise<Entity<M>[]> {
|
|
3215
|
+
const collection = getCollectionByPath(collectionPath, this.registry);
|
|
3216
|
+
const table = <span class="cstat-no" title="statement not covered" >getTableForCollection(collection, this.registry);</span>
|
|
3217
|
+
const idInfoArray = <span class="cstat-no" title="statement not covered" >getPrimaryKeys(collection, this.registry);</span>
|
|
3218
|
+
const idInfo = <span class="cstat-no" title="statement not covered" >idInfoArray[0];</span>
|
|
3219
|
+
const idField = <span class="cstat-no" title="statement not covered" >table[idInfo.fieldName as keyof typeof table] as AnyPgColumn;</span>
|
|
3220
|
+
|
|
3221
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!idField) {</span>
|
|
3222
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`ID field '${idInfo.fieldName}' not found in table for collection '${collectionPath}'`);</span>
|
|
3223
|
+
}
|
|
3224
|
+
|
|
3225
|
+
// Primary path: use db.query.findMany with relation loading
|
|
3226
|
+
|
|
3227
|
+
const tableName = <span class="cstat-no" title="statement not covered" >getTableName(table);</span>
|
|
3228
|
+
|
|
3229
|
+
const qb = <span class="cstat-no" title="statement not covered" >this.getQueryBuilder(tableName);</span>
|
|
3230
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (qb) {</span>
|
|
3231
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3232
|
+
const withConfig = <span class="cstat-no" title="statement not covered" >this.buildWithConfig(collection);</span>
|
|
3233
|
+
const queryOpts = <span class="cstat-no" title="statement not covered" >this.buildDrizzleQueryOptions<M>(</span>
|
|
3234
|
+
table, idField, idInfo, options, collectionPath, withConfig
|
|
3235
|
+
);
|
|
3236
|
+
|
|
3237
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic query config
|
|
3238
|
+
const results = <span class="cstat-no" title="statement not covered" >await qb.findMany(queryOpts as any);</span>
|
|
3239
|
+
|
|
3240
|
+
<span class="cstat-no" title="statement not covered" > return (results as Record<string, unknown>[]).map(<span class="fstat-no" title="function not covered" >row </span>=></span>
|
|
3241
|
+
<span class="cstat-no" title="statement not covered" > this.drizzleResultToEntity<M>(row, collection, collectionPath, idInfo, options.databaseId)</span>
|
|
3242
|
+
);
|
|
3243
|
+
} catch (e) {
|
|
3244
|
+
<span class="cstat-no" title="statement not covered" > console.warn(`[EntityFetchService] db.query.findMany failed for ${collectionPath}, falling back to db.select:`, e);</span>
|
|
3245
|
+
}
|
|
3246
|
+
}
|
|
3247
|
+
|
|
3248
|
+
// Fallback: db.select + processEntityResults (N+1 for relations)
|
|
3249
|
+
let query = <span class="cstat-no" title="statement not covered" >this.db.select().from(table).$dynamic();</span>
|
|
3250
|
+
const allConditions: SQL[] = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
3251
|
+
|
|
3252
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (options.searchString) {</span>
|
|
3253
|
+
const searchConditions = <span class="cstat-no" title="statement not covered" >DrizzleConditionBuilder.buildSearchConditions(</span>
|
|
3254
|
+
options.searchString, collection.properties, table
|
|
3255
|
+
);
|
|
3256
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (searchConditions.length === 0) <span class="cstat-no" title="statement not covered" >return [];</span></span>
|
|
3257
|
+
<span class="cstat-no" title="statement not covered" > allConditions.push(DrizzleConditionBuilder.combineConditionsWithOr(searchConditions)!);</span>
|
|
3258
|
+
}
|
|
3259
|
+
|
|
3260
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (options.filter) {</span>
|
|
3261
|
+
const filterConditions = <span class="cstat-no" title="statement not covered" >this.buildFilterConditions(options.filter, table, collectionPath);</span>
|
|
3262
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (filterConditions.length > 0) <span class="cstat-no" title="statement not covered" >allConditions.push(...filterConditions);</span></span>
|
|
3263
|
+
}
|
|
3264
|
+
|
|
3265
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (allConditions.length > 0) {</span>
|
|
3266
|
+
const finalCondition = <span class="cstat-no" title="statement not covered" >DrizzleConditionBuilder.combineConditionsWithAnd(allConditions);</span>
|
|
3267
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (finalCondition) <span class="cstat-no" title="statement not covered" >query = query.where(finalCondition);</span></span>
|
|
3268
|
+
}
|
|
3269
|
+
|
|
3270
|
+
const orderExpressions = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
3271
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (options.orderBy) {</span>
|
|
3272
|
+
const orderByField = <span class="cstat-no" title="statement not covered" >table[options.orderBy as keyof typeof table] as AnyPgColumn;</span>
|
|
3273
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (orderByField) {</span>
|
|
3274
|
+
<span class="cstat-no" title="statement not covered" > orderExpressions.push(options.order === "asc" ? asc(orderByField) : desc(orderByField));</span>
|
|
3275
|
+
}
|
|
3276
|
+
}
|
|
3277
|
+
<span class="cstat-no" title="statement not covered" > orderExpressions.push(desc(idField));</span>
|
|
3278
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (orderExpressions.length > 0) <span class="cstat-no" title="statement not covered" >query = query.orderBy(...orderExpressions);</span></span>
|
|
3279
|
+
|
|
3280
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (options.startAfter) {</span>
|
|
3281
|
+
const cursorConditions = <span class="cstat-no" title="statement not covered" >this.buildCursorConditions(table, idField, idInfo, options);</span>
|
|
3282
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (cursorConditions.length > 0) {</span>
|
|
3283
|
+
<span class="cstat-no" title="statement not covered" > allConditions.push(...cursorConditions);</span>
|
|
3284
|
+
const finalCondition = <span class="cstat-no" title="statement not covered" >DrizzleConditionBuilder.combineConditionsWithAnd(allConditions);</span>
|
|
3285
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (finalCondition) <span class="cstat-no" title="statement not covered" >query = query.where(finalCondition);</span></span>
|
|
3286
|
+
}
|
|
3287
|
+
}
|
|
3288
|
+
|
|
3289
|
+
const limitValue = <span class="cstat-no" title="statement not covered" >options.searchString ? (options.limit || 50) : options.limit;</span>
|
|
3290
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (limitValue) <span class="cstat-no" title="statement not covered" >query = query.limit(limitValue);</span></span>
|
|
3291
|
+
|
|
3292
|
+
const results = <span class="cstat-no" title="statement not covered" >await query;</span>
|
|
3293
|
+
|
|
3294
|
+
<span class="cstat-no" title="statement not covered" > return this.processEntityResults<M>(results, collection, collectionPath, idInfo, options.databaseId, false);</span>
|
|
3295
|
+
}
|
|
3296
|
+
|
|
3297
|
+
/**
|
|
3298
|
+
* @deprecated Only used in the fallback path when db.query is unavailable.
|
|
3299
|
+
* The primary path uses drizzleResultToEntity which handles relation
|
|
3300
|
+
* mapping without N+1 queries.
|
|
3301
|
+
*
|
|
3302
|
+
* Process raw database results into Entity objects with relations.
|
|
3303
|
+
*/
|
|
3304
|
+
private <span class="fstat-no" title="function not covered" >async </span>processEntityResults<M extends Record<string, any>>(
|
|
3305
|
+
results: Record<string, unknown>[],
|
|
3306
|
+
collection: EntityCollection,
|
|
3307
|
+
collectionPath: string,
|
|
3308
|
+
idInfo: { fieldName: string; type: "string" | "number" },
|
|
3309
|
+
databaseId?: string,
|
|
3310
|
+
skipRelations: boolean = <span class="branch-0 cbranch-no" title="branch not covered" >false</span>
|
|
3311
|
+
): Promise<Entity<M>[]> {
|
|
3312
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (results.length === 0) <span class="cstat-no" title="statement not covered" >return [];</span></span>
|
|
3313
|
+
|
|
3314
|
+
// First pass: parse all entities
|
|
3315
|
+
const entitiesWithValues = <span class="cstat-no" title="statement not covered" >await Promise.all(results.map(<span class="fstat-no" title="function not covered" >async </span>(entity: Record<string, unknown>) => {</span>
|
|
3316
|
+
const values = <span class="cstat-no" title="statement not covered" >await parseDataFromServer(entity as M, collection, this.db, this.registry);</span>
|
|
3317
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
3318
|
+
entity,
|
|
3319
|
+
values,
|
|
3320
|
+
id: String(entity[idInfo.fieldName]),
|
|
3321
|
+
path: collectionPath
|
|
3322
|
+
};
|
|
3323
|
+
}));
|
|
3324
|
+
|
|
3325
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!skipRelations) {</span>
|
|
3326
|
+
// Second pass: batch load missing one-to-one relations
|
|
3327
|
+
const resolvedRelations = <span class="cstat-no" title="statement not covered" >resolveCollectionRelations(collection);</span>
|
|
3328
|
+
const propertyKeys = <span class="cstat-no" title="statement not covered" >new Set(Object.keys(collection.properties));</span>
|
|
3329
|
+
|
|
3330
|
+
<span class="cstat-no" title="statement not covered" > for (const [key, relation] of Object.entries(resolvedRelations)) {</span>
|
|
3331
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!propertyKeys.has(key) || relation.cardinality !== "one") <span class="cstat-no" title="statement not covered" >continue;</span></span>
|
|
3332
|
+
|
|
3333
|
+
const entitiesMissingRelation = <span class="cstat-no" title="statement not covered" >entitiesWithValues.filter(<span class="fstat-no" title="function not covered" >item </span>=></span>
|
|
3334
|
+
(<span class="cstat-no" title="statement not covered" >item.values as Record<string, unknown>)[key] == null</span>
|
|
3335
|
+
);
|
|
3336
|
+
|
|
3337
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (entitiesMissingRelation.length === 0) <span class="cstat-no" title="statement not covered" >continue;</span></span>
|
|
3338
|
+
|
|
3339
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3340
|
+
const entityIds = <span class="cstat-no" title="statement not covered" >entitiesMissingRelation.map(<span class="fstat-no" title="function not covered" >item </span>=> <span class="cstat-no" title="statement not covered" >item.entity[idInfo.fieldName] as string | number)</span>;</span>
|
|
3341
|
+
const relationResults = <span class="cstat-no" title="statement not covered" >await this.relationService.batchFetchRelatedEntities(</span>
|
|
3342
|
+
collectionPath,
|
|
3343
|
+
entityIds,
|
|
3344
|
+
key,
|
|
3345
|
+
relation
|
|
3346
|
+
);
|
|
3347
|
+
|
|
3348
|
+
<span class="cstat-no" title="statement not covered" > entitiesMissingRelation.forEach(<span class="fstat-no" title="function not covered" >item </span>=> {</span>
|
|
3349
|
+
const entityId = <span class="cstat-no" title="statement not covered" >item.entity[idInfo.fieldName] as string | number;</span>
|
|
3350
|
+
const relatedEntity = <span class="cstat-no" title="statement not covered" >relationResults.get(entityId);</span>
|
|
3351
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (relatedEntity) {</span>
|
|
3352
|
+
(<span class="cstat-no" title="statement not covered" >item.values as Record<string, unknown>)[key] = {</span>
|
|
3353
|
+
id: relatedEntity.id,
|
|
3354
|
+
path: relatedEntity.path,
|
|
3355
|
+
__type: "relation"
|
|
3356
|
+
};
|
|
3357
|
+
}
|
|
3358
|
+
});
|
|
3359
|
+
} catch (e) {
|
|
3360
|
+
<span class="cstat-no" title="statement not covered" > console.warn(`Could not batch load one-to-one relation property: ${key}`, e);</span>
|
|
3361
|
+
}
|
|
3362
|
+
}
|
|
3363
|
+
|
|
3364
|
+
// Handle many relations
|
|
3365
|
+
const manyRelationPromises = <span class="cstat-no" title="statement not covered" >entitiesWithValues.map(<span class="fstat-no" title="function not covered" >async </span>(item) => {</span>
|
|
3366
|
+
const manyRelationQueries = <span class="cstat-no" title="statement not covered" >Object.entries(resolvedRelations)</span>
|
|
3367
|
+
.filter(<span class="fstat-no" title="function not covered" >([</span>key, relation]) => <span class="cstat-no" title="statement not covered" >propertyKeys.has(key) && relation.cardinality === "many")</span>
|
|
3368
|
+
.map(<span class="fstat-no" title="function not covered" >async </span>([key]) => {
|
|
3369
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3370
|
+
const relatedEntities = <span class="cstat-no" title="statement not covered" >await this.relationService.fetchRelatedEntities(</span>
|
|
3371
|
+
collectionPath,
|
|
3372
|
+
item.entity[idInfo.fieldName] as string | number,
|
|
3373
|
+
key,
|
|
3374
|
+
{}
|
|
3375
|
+
);
|
|
3376
|
+
(<span class="cstat-no" title="statement not covered" >item.values as Record<string, unknown>)[key] = relatedEntities.map(<span class="fstat-no" title="function not covered" >e </span>=> (<span class="cstat-no" title="statement not covered" >{</span></span>
|
|
3377
|
+
id: e.id,
|
|
3378
|
+
path: e.path,
|
|
3379
|
+
__type: "relation"
|
|
3380
|
+
}));
|
|
3381
|
+
} catch (e) {
|
|
3382
|
+
<span class="cstat-no" title="statement not covered" > console.warn(`Could not resolve many relation property: ${key}`, e);</span>
|
|
3383
|
+
}
|
|
3384
|
+
});
|
|
3385
|
+
<span class="cstat-no" title="statement not covered" > await Promise.all(manyRelationQueries);</span>
|
|
3386
|
+
});
|
|
3387
|
+
|
|
3388
|
+
<span class="cstat-no" title="statement not covered" > await Promise.all(manyRelationPromises);</span>
|
|
3389
|
+
}
|
|
3390
|
+
|
|
3391
|
+
<span class="cstat-no" title="statement not covered" > return entitiesWithValues.map(<span class="fstat-no" title="function not covered" >item </span>=> (<span class="cstat-no" title="statement not covered" >{</span></span>
|
|
3392
|
+
id: item.id,
|
|
3393
|
+
path: item.path,
|
|
3394
|
+
values: item.values as M,
|
|
3395
|
+
databaseId
|
|
3396
|
+
}));
|
|
3397
|
+
}
|
|
3398
|
+
|
|
3399
|
+
/**
|
|
3400
|
+
* Fetch a collection of entities
|
|
3401
|
+
*/
|
|
3402
|
+
async fetchCollection<M extends Record<string, any>>(
|
|
3403
|
+
collectionPath: string,
|
|
3404
|
+
options: {
|
|
3405
|
+
filter?: FilterValues<Extract<keyof M, string>>;
|
|
3406
|
+
orderBy?: string;
|
|
3407
|
+
order?: "desc" | "asc";
|
|
3408
|
+
limit?: number;
|
|
3409
|
+
startAfter?: Record<string, unknown>;
|
|
3410
|
+
searchString?: string;
|
|
3411
|
+
databaseId?: string;
|
|
3412
|
+
} = <span class="branch-0 cbranch-no" title="branch not covered" >{}</span>
|
|
3413
|
+
): Promise<Entity<M>[]> {
|
|
3414
|
+
// Handle multi-segment paths by resolving through relations
|
|
3415
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (collectionPath.includes("/")) {
|
|
3416
|
+
<span class="cstat-no" title="statement not covered" > return this.fetchCollectionFromPath<M>(collectionPath, options);</span>
|
|
3417
|
+
}
|
|
3418
|
+
|
|
3419
|
+
return this.fetchEntitiesWithConditions<M>(collectionPath, options);
|
|
3420
|
+
}
|
|
3421
|
+
|
|
3422
|
+
/**
|
|
3423
|
+
* Search entities by text
|
|
3424
|
+
*/
|
|
3425
|
+
<span class="fstat-no" title="function not covered" > async </span>searchEntities<M extends Record<string, any>>(
|
|
3426
|
+
collectionPath: string,
|
|
3427
|
+
searchString: string,
|
|
3428
|
+
options: {
|
|
3429
|
+
filter?: FilterValues<Extract<keyof M, string>>;
|
|
3430
|
+
orderBy?: string;
|
|
3431
|
+
order?: "desc" | "asc";
|
|
3432
|
+
limit?: number;
|
|
3433
|
+
databaseId?: string;
|
|
3434
|
+
} = <span class="branch-0 cbranch-no" title="branch not covered" >{}</span>
|
|
3435
|
+
): Promise<Entity<M>[]> {
|
|
3436
|
+
<span class="cstat-no" title="statement not covered" > return this.fetchEntitiesWithConditions<M>(collectionPath, {</span>
|
|
3437
|
+
...options,
|
|
3438
|
+
searchString
|
|
3439
|
+
});
|
|
3440
|
+
}
|
|
3441
|
+
|
|
3442
|
+
/**
|
|
3443
|
+
* Fetch collection from multi-segment path
|
|
3444
|
+
*/
|
|
3445
|
+
private <span class="fstat-no" title="function not covered" >async </span>fetchCollectionFromPath<M extends Record<string, any>>(
|
|
3446
|
+
path: string,
|
|
3447
|
+
options: {
|
|
3448
|
+
filter?: FilterValues<Extract<keyof M, string>>;
|
|
3449
|
+
orderBy?: string;
|
|
3450
|
+
order?: "desc" | "asc";
|
|
3451
|
+
limit?: number;
|
|
3452
|
+
startAfter?: Record<string, unknown>;
|
|
3453
|
+
searchString?: string;
|
|
3454
|
+
databaseId?: string;
|
|
3455
|
+
} = <span class="branch-0 cbranch-no" title="branch not covered" >{}</span>
|
|
3456
|
+
): Promise<Entity<M>[]> {
|
|
3457
|
+
const pathSegments = <span class="cstat-no" title="statement not covered" >path.split("/").filter(<span class="fstat-no" title="function not covered" >p </span>=> <span class="cstat-no" title="statement not covered" >p)</span>;</span>
|
|
3458
|
+
|
|
3459
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (pathSegments.length < 3 || pathSegments.length % 2 === 0) {</span>
|
|
3460
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Invalid relation path: ${path}. Expected format: collection/id/relation`);</span>
|
|
3461
|
+
}
|
|
3462
|
+
|
|
3463
|
+
const rootCollectionPath = <span class="cstat-no" title="statement not covered" >pathSegments[0];</span>
|
|
3464
|
+
let currentCollection = <span class="cstat-no" title="statement not covered" >getCollectionByPath(rootCollectionPath, this.registry);</span>
|
|
3465
|
+
let currentEntityId: string | number = <span class="cstat-no" title="statement not covered" >pathSegments[1];</span>
|
|
3466
|
+
|
|
3467
|
+
<span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >2;</span> i < pathSegments.length; i += 2) {</span>
|
|
3468
|
+
const relationKey = <span class="cstat-no" title="statement not covered" >pathSegments[i];</span>
|
|
3469
|
+
const resolvedRelations = <span class="cstat-no" title="statement not covered" >resolveCollectionRelations(currentCollection);</span>
|
|
3470
|
+
const relation = <span class="cstat-no" title="statement not covered" >resolvedRelations[relationKey];</span>
|
|
3471
|
+
|
|
3472
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!relation) {</span>
|
|
3473
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Relation '${relationKey}' not found in collection '${currentCollection.slug || currentCollection.dbPath}'`);</span>
|
|
3474
|
+
}
|
|
3475
|
+
|
|
3476
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (i === pathSegments.length - 1) {</span>
|
|
3477
|
+
<span class="cstat-no" title="statement not covered" > return this.relationService.fetchRelatedEntities<M>(</span>
|
|
3478
|
+
currentCollection.slug ?? currentCollection.dbPath,
|
|
3479
|
+
currentEntityId,
|
|
3480
|
+
relationKey,
|
|
3481
|
+
options
|
|
3482
|
+
);
|
|
3483
|
+
}
|
|
3484
|
+
|
|
3485
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (i + 1 < pathSegments.length) {</span>
|
|
3486
|
+
const nextEntityId = <span class="cstat-no" title="statement not covered" >pathSegments[i + 1];</span>
|
|
3487
|
+
<span class="cstat-no" title="statement not covered" > currentCollection = relation.target();</span>
|
|
3488
|
+
<span class="cstat-no" title="statement not covered" > currentEntityId = nextEntityId;</span>
|
|
3489
|
+
}
|
|
3490
|
+
}
|
|
3491
|
+
|
|
3492
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Unable to resolve path: ${path}`);</span>
|
|
3493
|
+
}
|
|
3494
|
+
|
|
3495
|
+
/**
|
|
3496
|
+
* Count entities in a collection
|
|
3497
|
+
*/
|
|
3498
|
+
<span class="fstat-no" title="function not covered" > async </span>countEntities<M extends Record<string, any>>(
|
|
3499
|
+
collectionPath: string,
|
|
3500
|
+
options: {
|
|
3501
|
+
filter?: FilterValues<Extract<keyof M, string>>;
|
|
3502
|
+
databaseId?: string;
|
|
3503
|
+
} = <span class="branch-0 cbranch-no" title="branch not covered" >{}</span>
|
|
3504
|
+
): Promise<number> {
|
|
3505
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (collectionPath.includes("/")) {</span>
|
|
3506
|
+
<span class="cstat-no" title="statement not covered" > return this.countEntitiesFromPath<M>(collectionPath, options);</span>
|
|
3507
|
+
}
|
|
3508
|
+
|
|
3509
|
+
const collection = <span class="cstat-no" title="statement not covered" >getCollectionByPath(collectionPath, this.registry);</span>
|
|
3510
|
+
const table = <span class="cstat-no" title="statement not covered" >getTableForCollection(collection, this.registry);</span>
|
|
3511
|
+
|
|
3512
|
+
let query = <span class="cstat-no" title="statement not covered" >this.db.select({ count: count() }).from(table).$dynamic();</span>
|
|
3513
|
+
|
|
3514
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (options.filter) {</span>
|
|
3515
|
+
const filterConditions = <span class="cstat-no" title="statement not covered" >this.buildFilterConditions(options.filter, table, collectionPath);</span>
|
|
3516
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (filterConditions.length > 0) {</span>
|
|
3517
|
+
<span class="cstat-no" title="statement not covered" > query = query.where(and(...filterConditions));</span>
|
|
3518
|
+
}
|
|
3519
|
+
}
|
|
3520
|
+
|
|
3521
|
+
const result = <span class="cstat-no" title="statement not covered" >await query;</span>
|
|
3522
|
+
<span class="cstat-no" title="statement not covered" > return Number(result[0]?.count || 0);</span>
|
|
3523
|
+
}
|
|
3524
|
+
|
|
3525
|
+
/**
|
|
3526
|
+
* Count entities from multi-segment path
|
|
3527
|
+
*/
|
|
3528
|
+
private <span class="fstat-no" title="function not covered" >async </span>countEntitiesFromPath<M extends Record<string, any>>(
|
|
3529
|
+
path: string,
|
|
3530
|
+
options: { filter?: FilterValues<Extract<keyof M, string>>; databaseId?: string } = <span class="branch-0 cbranch-no" title="branch not covered" >{}</span>
|
|
3531
|
+
): Promise<number> {
|
|
3532
|
+
const pathSegments = <span class="cstat-no" title="statement not covered" >path.split("/").filter(<span class="fstat-no" title="function not covered" >p </span>=> <span class="cstat-no" title="statement not covered" >p)</span>;</span>
|
|
3533
|
+
|
|
3534
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (pathSegments.length < 3 || pathSegments.length % 2 === 0) {</span>
|
|
3535
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Invalid relation path: ${path}`);</span>
|
|
3536
|
+
}
|
|
3537
|
+
|
|
3538
|
+
const rootCollectionPath = <span class="cstat-no" title="statement not covered" >pathSegments[0];</span>
|
|
3539
|
+
let currentCollection = <span class="cstat-no" title="statement not covered" >getCollectionByPath(rootCollectionPath, this.registry);</span>
|
|
3540
|
+
let currentEntityId: string | number = <span class="cstat-no" title="statement not covered" >pathSegments[1];</span>
|
|
3541
|
+
|
|
3542
|
+
<span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >2;</span> i < pathSegments.length; i += 2) {</span>
|
|
3543
|
+
const relationKey = <span class="cstat-no" title="statement not covered" >pathSegments[i];</span>
|
|
3544
|
+
const resolvedRelations = <span class="cstat-no" title="statement not covered" >resolveCollectionRelations(currentCollection);</span>
|
|
3545
|
+
const relation = <span class="cstat-no" title="statement not covered" >resolvedRelations[relationKey];</span>
|
|
3546
|
+
|
|
3547
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!relation) {</span>
|
|
3548
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Relation '${relationKey}' not found`);</span>
|
|
3549
|
+
}
|
|
3550
|
+
|
|
3551
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (i === pathSegments.length - 1) {</span>
|
|
3552
|
+
<span class="cstat-no" title="statement not covered" > return this.relationService.countRelatedEntities(</span>
|
|
3553
|
+
currentCollection.slug ?? currentCollection.dbPath,
|
|
3554
|
+
currentEntityId,
|
|
3555
|
+
relationKey,
|
|
3556
|
+
options
|
|
3557
|
+
);
|
|
3558
|
+
}
|
|
3559
|
+
|
|
3560
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (i + 1 < pathSegments.length) {</span>
|
|
3561
|
+
<span class="cstat-no" title="statement not covered" > currentCollection = relation.target();</span>
|
|
3562
|
+
<span class="cstat-no" title="statement not covered" > currentEntityId = pathSegments[i + 1];</span>
|
|
3563
|
+
}
|
|
3564
|
+
}
|
|
3565
|
+
|
|
3566
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Unable to count for path: ${path}`);</span>
|
|
3567
|
+
}
|
|
3568
|
+
|
|
3569
|
+
/**
|
|
3570
|
+
* Check if a field value is unique
|
|
3571
|
+
*/
|
|
3572
|
+
<span class="fstat-no" title="function not covered" > async </span>checkUniqueField(
|
|
3573
|
+
collectionPath: string,
|
|
3574
|
+
fieldName: string,
|
|
3575
|
+
value: unknown,
|
|
3576
|
+
excludeEntityId?: string,
|
|
3577
|
+
_databaseId?: string
|
|
3578
|
+
): Promise<boolean> {
|
|
3579
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (value === undefined || value === null) <span class="cstat-no" title="statement not covered" >return true;</span></span>
|
|
3580
|
+
|
|
3581
|
+
const collection = <span class="cstat-no" title="statement not covered" >getCollectionByPath(collectionPath, this.registry);</span>
|
|
3582
|
+
const table = <span class="cstat-no" title="statement not covered" >getTableForCollection(collection, this.registry);</span>
|
|
3583
|
+
const idInfoArray = <span class="cstat-no" title="statement not covered" >getPrimaryKeys(collection, this.registry);</span>
|
|
3584
|
+
const idInfo = <span class="cstat-no" title="statement not covered" >idInfoArray[0];</span>
|
|
3585
|
+
const idField = <span class="cstat-no" title="statement not covered" >table[idInfo.fieldName as keyof typeof table] as AnyPgColumn;</span>
|
|
3586
|
+
const field = <span class="cstat-no" title="statement not covered" >table[fieldName as keyof typeof table] as AnyPgColumn;</span>
|
|
3587
|
+
|
|
3588
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!field) <span class="cstat-no" title="statement not covered" >return true;</span></span>
|
|
3589
|
+
|
|
3590
|
+
const parsedExcludeId = <span class="cstat-no" title="statement not covered" >excludeEntityId ? parseIdValues(excludeEntityId, idInfoArray)[idInfo.fieldName] : undefined;</span>
|
|
3591
|
+
const conditions = <span class="cstat-no" title="statement not covered" >DrizzleConditionBuilder.buildUniqueFieldCondition(</span>
|
|
3592
|
+
field,
|
|
3593
|
+
value,
|
|
3594
|
+
idField,
|
|
3595
|
+
parsedExcludeId
|
|
3596
|
+
);
|
|
3597
|
+
|
|
3598
|
+
const result = <span class="cstat-no" title="statement not covered" >await this.db</span>
|
|
3599
|
+
.select({ count: count() })
|
|
3600
|
+
.from(table)
|
|
3601
|
+
.where(and(...conditions));
|
|
3602
|
+
|
|
3603
|
+
const countResult = <span class="cstat-no" title="statement not covered" >Number(result[0]?.count || 0);</span>
|
|
3604
|
+
<span class="cstat-no" title="statement not covered" > return countResult === 0;</span>
|
|
3605
|
+
}
|
|
3606
|
+
|
|
3607
|
+
/**
|
|
3608
|
+
* Get the RelationService instance for external use
|
|
3609
|
+
*/
|
|
3610
|
+
<span class="fstat-no" title="function not covered" > getRelationService(</span>): RelationService {
|
|
3611
|
+
<span class="cstat-no" title="statement not covered" > return this.relationService;</span>
|
|
3612
|
+
}
|
|
3613
|
+
|
|
3614
|
+
// =============================================================
|
|
3615
|
+
// REST API INCLUDE-AWARE METHODS
|
|
3616
|
+
// =============================================================
|
|
3617
|
+
|
|
3618
|
+
/**
|
|
3619
|
+
* Fetch a collection of entities with optional relation includes.
|
|
3620
|
+
* When `include` is provided, only the specified relations are populated
|
|
3621
|
+
* with full entity data (not just { id, path, __type }).
|
|
3622
|
+
* When `include` is absent, no relation queries are made (fast path).
|
|
3623
|
+
*
|
|
3624
|
+
* @param include - Array of relation keys to populate, or ["*"] for all
|
|
3625
|
+
*/
|
|
3626
|
+
<span class="fstat-no" title="function not covered" > async </span>fetchCollectionForRest<M extends Record<string, any>>(
|
|
3627
|
+
collectionPath: string,
|
|
3628
|
+
options: {
|
|
3629
|
+
filter?: FilterValues<Extract<keyof M, string>>;
|
|
3630
|
+
orderBy?: string;
|
|
3631
|
+
order?: "desc" | "asc";
|
|
3632
|
+
limit?: number;
|
|
3633
|
+
startAfter?: Record<string, unknown>;
|
|
3634
|
+
searchString?: string;
|
|
3635
|
+
databaseId?: string;
|
|
3636
|
+
} = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span>
|
|
3637
|
+
include?: string[]
|
|
3638
|
+
): Promise<Record<string, unknown>[]> {
|
|
3639
|
+
const collection = <span class="cstat-no" title="statement not covered" >getCollectionByPath(collectionPath, this.registry);</span>
|
|
3640
|
+
const table = <span class="cstat-no" title="statement not covered" >getTableForCollection(collection, this.registry);</span>
|
|
3641
|
+
const idInfoArray = <span class="cstat-no" title="statement not covered" >getPrimaryKeys(collection, this.registry);</span>
|
|
3642
|
+
const idInfo = <span class="cstat-no" title="statement not covered" >idInfoArray[0];</span>
|
|
3643
|
+
const idField = <span class="cstat-no" title="statement not covered" >table[idInfo.fieldName as keyof typeof table] as AnyPgColumn;</span>
|
|
3644
|
+
|
|
3645
|
+
// Primary path: use db.query.findMany
|
|
3646
|
+
|
|
3647
|
+
const tableName = <span class="cstat-no" title="statement not covered" >getTableName(table);</span>
|
|
3648
|
+
|
|
3649
|
+
const qb = <span class="cstat-no" title="statement not covered" >this.getQueryBuilder(tableName);</span>
|
|
3650
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (qb) {</span>
|
|
3651
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3652
|
+
const withConfig = <span class="cstat-no" title="statement not covered" >(include && include.length > 0)</span>
|
|
3653
|
+
? this.buildWithConfig(collection, include)
|
|
3654
|
+
: undefined;
|
|
3655
|
+
|
|
3656
|
+
const queryOpts = <span class="cstat-no" title="statement not covered" >this.buildDrizzleQueryOptions<M>(</span>
|
|
3657
|
+
table, idField, idInfo, options, collectionPath, withConfig
|
|
3658
|
+
);
|
|
3659
|
+
|
|
3660
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic query config
|
|
3661
|
+
const results = <span class="cstat-no" title="statement not covered" >await qb.findMany(queryOpts as any);</span>
|
|
3662
|
+
|
|
3663
|
+
<span class="cstat-no" title="statement not covered" > return (results as Record<string, unknown>[]).map(<span class="fstat-no" title="function not covered" >row </span>=></span>
|
|
3664
|
+
<span class="cstat-no" title="statement not covered" > this.drizzleResultToRestRow(row, collection, idInfo)</span>
|
|
3665
|
+
);
|
|
3666
|
+
} catch (e) {
|
|
3667
|
+
<span class="cstat-no" title="statement not covered" > console.warn(`[fetchCollectionForRest] db.query.findMany failed for ${collectionPath}, falling back:`, e);</span>
|
|
3668
|
+
}
|
|
3669
|
+
}
|
|
3670
|
+
|
|
3671
|
+
// Fallback: fetch base entities without relations
|
|
3672
|
+
const entities = <span class="cstat-no" title="statement not covered" >await this.fetchEntitiesWithConditionsRaw<M>(collectionPath, options);</span>
|
|
3673
|
+
|
|
3674
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!include || include.length === 0) {</span>
|
|
3675
|
+
<span class="cstat-no" title="statement not covered" > return entities.map(<span class="fstat-no" title="function not covered" >entity </span>=> (<span class="cstat-no" title="statement not covered" >{</span></span>
|
|
3676
|
+
id: String(entity[idInfo.fieldName]),
|
|
3677
|
+
...entity
|
|
3678
|
+
}));
|
|
3679
|
+
}
|
|
3680
|
+
|
|
3681
|
+
// Fallback relation loading via batch
|
|
3682
|
+
const resolvedRelations = <span class="cstat-no" title="statement not covered" >resolveCollectionRelations(collection);</span>
|
|
3683
|
+
const propertyKeys = <span class="cstat-no" title="statement not covered" >new Set(Object.keys(collection.properties || {}));</span>
|
|
3684
|
+
const shouldInclude = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(k</span>ey: string) =></span>
|
|
3685
|
+
<span class="cstat-no" title="statement not covered" > include[0] === "*" || include.includes(key);</span>
|
|
3686
|
+
|
|
3687
|
+
const entityIds = <span class="cstat-no" title="statement not covered" >entities.map(<span class="fstat-no" title="function not covered" >e </span>=> <span class="cstat-no" title="statement not covered" >e[idInfo.fieldName] as string | number)</span>;</span>
|
|
3688
|
+
|
|
3689
|
+
<span class="cstat-no" title="statement not covered" > for (const [key, relation] of Object.entries(resolvedRelations)) {</span>
|
|
3690
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!propertyKeys.has(key) || !shouldInclude(key) || relation.cardinality !== "one") <span class="cstat-no" title="statement not covered" >continue;</span></span>
|
|
3691
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3692
|
+
const batchResults = <span class="cstat-no" title="statement not covered" >await this.relationService.batchFetchRelatedEntities(</span>
|
|
3693
|
+
collectionPath, entityIds, key, relation
|
|
3694
|
+
);
|
|
3695
|
+
<span class="cstat-no" title="statement not covered" > for (const entity of entities) {</span>
|
|
3696
|
+
const eid = <span class="cstat-no" title="statement not covered" >entity[idInfo.fieldName] as string | number;</span>
|
|
3697
|
+
const related = <span class="cstat-no" title="statement not covered" >batchResults.get(eid);</span>
|
|
3698
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (related) {</span>
|
|
3699
|
+
(<span class="cstat-no" title="statement not covered" >entity as Record<string, unknown>)[key] = { id: related.id, ...related.values };</span>
|
|
3700
|
+
}
|
|
3701
|
+
}
|
|
3702
|
+
} catch (e) {
|
|
3703
|
+
<span class="cstat-no" title="statement not covered" > console.warn(`[include] Failed to batch load one-to-one '${key}':`, e);</span>
|
|
3704
|
+
}
|
|
3705
|
+
}
|
|
3706
|
+
|
|
3707
|
+
<span class="cstat-no" title="statement not covered" > for (const [key, relation] of Object.entries(resolvedRelations)) {</span>
|
|
3708
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!propertyKeys.has(key) || !shouldInclude(key) || relation.cardinality !== "many") <span class="cstat-no" title="statement not covered" >continue;</span></span>
|
|
3709
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3710
|
+
const batchResults = <span class="cstat-no" title="statement not covered" >await this.batchFetchManyRelatedEntities(</span>
|
|
3711
|
+
collectionPath, entityIds, key
|
|
3712
|
+
);
|
|
3713
|
+
<span class="cstat-no" title="statement not covered" > for (const entity of entities) {</span>
|
|
3714
|
+
const eid = <span class="cstat-no" title="statement not covered" >entity[idInfo.fieldName] as string | number;</span>
|
|
3715
|
+
const relatedList = <span class="cstat-no" title="statement not covered" >batchResults.get(String(eid)) || [];</span>
|
|
3716
|
+
(<span class="cstat-no" title="statement not covered" >entity as Record<string, unknown>)[key] = relatedList.map(<span class="fstat-no" title="function not covered" >e </span>=> (<span class="cstat-no" title="statement not covered" >{</span></span>
|
|
3717
|
+
id: e.id, ...e.values
|
|
3718
|
+
}));
|
|
3719
|
+
}
|
|
3720
|
+
} catch (e) {
|
|
3721
|
+
<span class="cstat-no" title="statement not covered" > console.warn(`[include] Failed to batch load many '${key}':`, e);</span>
|
|
3722
|
+
}
|
|
3723
|
+
}
|
|
3724
|
+
|
|
3725
|
+
<span class="cstat-no" title="statement not covered" > return entities.map(<span class="fstat-no" title="function not covered" >entity </span>=> (<span class="cstat-no" title="statement not covered" >{</span></span>
|
|
3726
|
+
id: String(entity[idInfo.fieldName]),
|
|
3727
|
+
...entity
|
|
3728
|
+
}));
|
|
3729
|
+
}
|
|
3730
|
+
|
|
3731
|
+
/**
|
|
3732
|
+
* Fetch a single entity with optional relation includes for REST API.
|
|
3733
|
+
*/
|
|
3734
|
+
<span class="fstat-no" title="function not covered" > async </span>fetchEntityForRest<M extends Record<string, any>>(
|
|
3735
|
+
collectionPath: string,
|
|
3736
|
+
entityId: string | number,
|
|
3737
|
+
include?: string[],
|
|
3738
|
+
databaseId?: string
|
|
3739
|
+
): Promise<Record<string, unknown> | null> {
|
|
3740
|
+
const collection = <span class="cstat-no" title="statement not covered" >getCollectionByPath(collectionPath, this.registry);</span>
|
|
3741
|
+
const table = <span class="cstat-no" title="statement not covered" >getTableForCollection(collection, this.registry);</span>
|
|
3742
|
+
const idInfoArray = <span class="cstat-no" title="statement not covered" >getPrimaryKeys(collection, this.registry);</span>
|
|
3743
|
+
const idInfo = <span class="cstat-no" title="statement not covered" >idInfoArray[0];</span>
|
|
3744
|
+
const idField = <span class="cstat-no" title="statement not covered" >table[idInfo.fieldName as keyof typeof table] as AnyPgColumn;</span>
|
|
3745
|
+
|
|
3746
|
+
const parsedIdObj = <span class="cstat-no" title="statement not covered" >parseIdValues(entityId, idInfoArray);</span>
|
|
3747
|
+
const parsedId = <span class="cstat-no" title="statement not covered" >parsedIdObj[idInfo.fieldName];</span>
|
|
3748
|
+
|
|
3749
|
+
// Primary path: use db.query.findFirst
|
|
3750
|
+
|
|
3751
|
+
const tableName = <span class="cstat-no" title="statement not covered" >getTableName(table);</span>
|
|
3752
|
+
|
|
3753
|
+
const qb = <span class="cstat-no" title="statement not covered" >this.getQueryBuilder(tableName);</span>
|
|
3754
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (qb) {</span>
|
|
3755
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3756
|
+
const withConfig = <span class="cstat-no" title="statement not covered" >(include && include.length > 0)</span>
|
|
3757
|
+
? this.buildWithConfig(collection, include)
|
|
3758
|
+
: undefined;
|
|
3759
|
+
|
|
3760
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic query config
|
|
3761
|
+
const row = <span class="cstat-no" title="statement not covered" >await qb.findFirst({</span>
|
|
3762
|
+
where: eq(idField, parsedId),
|
|
3763
|
+
...(withConfig ? { with: withConfig } : {})
|
|
3764
|
+
} as any);
|
|
3765
|
+
|
|
3766
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!row) <span class="cstat-no" title="statement not covered" >return null;</span></span>
|
|
3767
|
+
|
|
3768
|
+
<span class="cstat-no" title="statement not covered" > return this.drizzleResultToRestRow(row, collection, idInfo);</span>
|
|
3769
|
+
} catch (e) {
|
|
3770
|
+
<span class="cstat-no" title="statement not covered" > console.warn(`[fetchEntityForRest] db.query.findFirst failed for ${collectionPath}, falling back:`, e);</span>
|
|
3771
|
+
}
|
|
3772
|
+
}
|
|
3773
|
+
|
|
3774
|
+
// Fallback: db.select + N+1 relation loading
|
|
3775
|
+
const result = <span class="cstat-no" title="statement not covered" >await this.db</span>
|
|
3776
|
+
.select()
|
|
3777
|
+
.from(table)
|
|
3778
|
+
.where(eq(idField, parsedId))
|
|
3779
|
+
.limit(1);
|
|
3780
|
+
|
|
3781
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (result.length === 0) <span class="cstat-no" title="statement not covered" >return null;</span></span>
|
|
3782
|
+
|
|
3783
|
+
const raw = <span class="cstat-no" title="statement not covered" >result[0] as Record<string, unknown>;</span>
|
|
3784
|
+
const flatEntity: Record<string, unknown> = <span class="cstat-no" title="statement not covered" >{ id: String(raw[idInfo.fieldName]), ...raw };</span>
|
|
3785
|
+
|
|
3786
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!include || include.length === 0) {</span>
|
|
3787
|
+
<span class="cstat-no" title="statement not covered" > return flatEntity;</span>
|
|
3788
|
+
}
|
|
3789
|
+
|
|
3790
|
+
// Fallback relation population
|
|
3791
|
+
const resolvedRelations = <span class="cstat-no" title="statement not covered" >resolveCollectionRelations(collection);</span>
|
|
3792
|
+
const propertyKeys = <span class="cstat-no" title="statement not covered" >new Set(Object.keys(collection.properties || {}));</span>
|
|
3793
|
+
const shouldInclude = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(k</span>ey: string) =></span>
|
|
3794
|
+
<span class="cstat-no" title="statement not covered" > include[0] === "*" || include.includes(key);</span>
|
|
3795
|
+
|
|
3796
|
+
<span class="cstat-no" title="statement not covered" > for (const [key, relation] of Object.entries(resolvedRelations)) {</span>
|
|
3797
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!propertyKeys.has(key) || !shouldInclude(key)) <span class="cstat-no" title="statement not covered" >continue;</span></span>
|
|
3798
|
+
|
|
3799
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3800
|
+
const relatedEntities = <span class="cstat-no" title="statement not covered" >await this.relationService.fetchRelatedEntities(</span>
|
|
3801
|
+
collectionPath, parsedId, key, {}
|
|
3802
|
+
);
|
|
3803
|
+
|
|
3804
|
+
<span class="cstat-no" title="statement not covered" > if (relation.cardinality === "one") {</span>
|
|
3805
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (relatedEntities.length > 0) {</span>
|
|
3806
|
+
const e = <span class="cstat-no" title="statement not covered" >relatedEntities[0];</span>
|
|
3807
|
+
<span class="cstat-no" title="statement not covered" > flatEntity[key] = { id: e.id, ...e.values };</span>
|
|
3808
|
+
}
|
|
3809
|
+
} else {
|
|
3810
|
+
<span class="cstat-no" title="statement not covered" > flatEntity[key] = relatedEntities.map(<span class="fstat-no" title="function not covered" >e </span>=> (<span class="cstat-no" title="statement not covered" >{</span></span>
|
|
3811
|
+
id: e.id, ...e.values
|
|
3812
|
+
}));
|
|
3813
|
+
}
|
|
3814
|
+
} catch (e) {
|
|
3815
|
+
<span class="cstat-no" title="statement not covered" > console.warn(`[include] Failed to load relation '${key}':`, e);</span>
|
|
3816
|
+
}
|
|
3817
|
+
}
|
|
3818
|
+
|
|
3819
|
+
<span class="cstat-no" title="statement not covered" > return flatEntity;</span>
|
|
3820
|
+
}
|
|
3821
|
+
|
|
3822
|
+
/**
|
|
3823
|
+
* Fetch raw rows without any relation processing (for REST fast path)
|
|
3824
|
+
*/
|
|
3825
|
+
private <span class="fstat-no" title="function not covered" >async </span>fetchEntitiesWithConditionsRaw<M extends Record<string, any>>(
|
|
3826
|
+
collectionPath: string,
|
|
3827
|
+
options: {
|
|
3828
|
+
filter?: FilterValues<Extract<keyof M, string>>;
|
|
3829
|
+
orderBy?: string;
|
|
3830
|
+
order?: "desc" | "asc";
|
|
3831
|
+
limit?: number;
|
|
3832
|
+
startAfter?: Record<string, unknown>;
|
|
3833
|
+
searchString?: string;
|
|
3834
|
+
} = <span class="branch-0 cbranch-no" title="branch not covered" >{}</span>
|
|
3835
|
+
): Promise<Record<string, unknown>[]> {
|
|
3836
|
+
const collection = <span class="cstat-no" title="statement not covered" >getCollectionByPath(collectionPath, this.registry);</span>
|
|
3837
|
+
const table = <span class="cstat-no" title="statement not covered" >getTableForCollection(collection, this.registry);</span>
|
|
3838
|
+
const idInfoArray = <span class="cstat-no" title="statement not covered" >getPrimaryKeys(collection, this.registry);</span>
|
|
3839
|
+
const idInfo = <span class="cstat-no" title="statement not covered" >idInfoArray[0];</span>
|
|
3840
|
+
const idField = <span class="cstat-no" title="statement not covered" >table[idInfo.fieldName as keyof typeof table] as AnyPgColumn;</span>
|
|
3841
|
+
|
|
3842
|
+
let query = <span class="cstat-no" title="statement not covered" >this.db.select().from(table).$dynamic();</span>
|
|
3843
|
+
const allConditions: SQL[] = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
3844
|
+
|
|
3845
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (options.searchString) {</span>
|
|
3846
|
+
const searchConditions = <span class="cstat-no" title="statement not covered" >DrizzleConditionBuilder.buildSearchConditions(</span>
|
|
3847
|
+
options.searchString, collection.properties, table
|
|
3848
|
+
);
|
|
3849
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (searchConditions.length === 0) <span class="cstat-no" title="statement not covered" >return [];</span></span>
|
|
3850
|
+
<span class="cstat-no" title="statement not covered" > allConditions.push(DrizzleConditionBuilder.combineConditionsWithOr(searchConditions)!);</span>
|
|
3851
|
+
}
|
|
3852
|
+
|
|
3853
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (options.filter) {</span>
|
|
3854
|
+
const filterConditions = <span class="cstat-no" title="statement not covered" >this.buildFilterConditions(options.filter, table, collectionPath);</span>
|
|
3855
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (filterConditions.length > 0) <span class="cstat-no" title="statement not covered" >allConditions.push(...filterConditions);</span></span>
|
|
3856
|
+
}
|
|
3857
|
+
|
|
3858
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (allConditions.length > 0) {</span>
|
|
3859
|
+
const finalCondition = <span class="cstat-no" title="statement not covered" >DrizzleConditionBuilder.combineConditionsWithAnd(allConditions);</span>
|
|
3860
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (finalCondition) <span class="cstat-no" title="statement not covered" >query = query.where(finalCondition);</span></span>
|
|
3861
|
+
}
|
|
3862
|
+
|
|
3863
|
+
const orderExpressions = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
3864
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (options.orderBy) {</span>
|
|
3865
|
+
const orderByField = <span class="cstat-no" title="statement not covered" >table[options.orderBy as keyof typeof table] as AnyPgColumn;</span>
|
|
3866
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (orderByField) {</span>
|
|
3867
|
+
<span class="cstat-no" title="statement not covered" > orderExpressions.push(options.order === "asc" ? asc(orderByField) : desc(orderByField));</span>
|
|
3868
|
+
}
|
|
3869
|
+
}
|
|
3870
|
+
<span class="cstat-no" title="statement not covered" > orderExpressions.push(desc(idField));</span>
|
|
3871
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (orderExpressions.length > 0) <span class="cstat-no" title="statement not covered" >query = query.orderBy(...orderExpressions);</span></span>
|
|
3872
|
+
|
|
3873
|
+
const limitValue = <span class="cstat-no" title="statement not covered" >options.searchString ? (options.limit || 50) : options.limit;</span>
|
|
3874
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (limitValue) <span class="cstat-no" title="statement not covered" >query = query.limit(limitValue);</span></span>
|
|
3875
|
+
|
|
3876
|
+
<span class="cstat-no" title="statement not covered" > return await query as Record<string, unknown>[];</span>
|
|
3877
|
+
}
|
|
3878
|
+
|
|
3879
|
+
/**
|
|
3880
|
+
* @deprecated Superseded by inline `this.db.query?.[tableName]` checks in fetchCollectionForRest/fetchEntityForRest.
|
|
3881
|
+
* Kept for backward compatibility only.
|
|
3882
|
+
*
|
|
3883
|
+
* Check if the Drizzle instance has the relational query API available
|
|
3884
|
+
* for a given collection path.
|
|
3885
|
+
*/
|
|
3886
|
+
private <span class="fstat-no" title="function not covered" >hasDrizzleQueryAPI(</span>collectionPath: string): boolean {
|
|
3887
|
+
|
|
3888
|
+
const qb = <span class="cstat-no" title="statement not covered" >this.getQueryBuilder("__probe__");</span>
|
|
3889
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!qb) {</span>
|
|
3890
|
+
// If getQueryBuilder returns undefined even for a probe, query API is not available
|
|
3891
|
+
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
3892
|
+
}
|
|
3893
|
+
const collection = <span class="cstat-no" title="statement not covered" >getCollectionByPath(collectionPath, this.registry);</span>
|
|
3894
|
+
const table = <span class="cstat-no" title="statement not covered" >getTableForCollection(collection, this.registry);</span>
|
|
3895
|
+
const tableName = <span class="cstat-no" title="statement not covered" >getTableName(table);</span>
|
|
3896
|
+
<span class="cstat-no" title="statement not covered" > return !!this.getQueryBuilder(tableName);</span>
|
|
3897
|
+
}
|
|
3898
|
+
|
|
3899
|
+
/**
|
|
3900
|
+
* @deprecated Superseded by the new `buildWithConfig` + `buildDrizzleQueryOptions` approach
|
|
3901
|
+
* used directly in fetchCollectionForRest/fetchEntityForRest.
|
|
3902
|
+
* Kept for backward compatibility only.
|
|
3903
|
+
*
|
|
3904
|
+
* Attempt to use Drizzle's relational query API (db.query.<table>.findMany)
|
|
3905
|
+
* for efficient JOIN-based relation loading.
|
|
3906
|
+
* Returns null if the API is not available or the query fails.
|
|
3907
|
+
*/
|
|
3908
|
+
private <span class="fstat-no" title="function not covered" >async </span>fetchWithDrizzleQuery<M extends Record<string, any>>(
|
|
3909
|
+
collectionPath: string,
|
|
3910
|
+
collection: EntityCollection,
|
|
3911
|
+
options: {
|
|
3912
|
+
filter?: FilterValues<Extract<keyof M, string>>;
|
|
3913
|
+
orderBy?: string;
|
|
3914
|
+
order?: "desc" | "asc";
|
|
3915
|
+
limit?: number;
|
|
3916
|
+
},
|
|
3917
|
+
include: string[],
|
|
3918
|
+
idInfo: { fieldName: string; type: "string" | "number" }
|
|
3919
|
+
): Promise<Record<string, unknown>[] | null> {
|
|
3920
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3921
|
+
|
|
3922
|
+
const table = <span class="cstat-no" title="statement not covered" >getTableForCollection(collection, this.registry);</span>
|
|
3923
|
+
const tableName = <span class="cstat-no" title="statement not covered" >getTableName(table);</span>
|
|
3924
|
+
const queryTarget = <span class="cstat-no" title="statement not covered" >this.getQueryBuilder(tableName);</span>
|
|
3925
|
+
|
|
3926
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!queryTarget?.findMany) <span class="cstat-no" title="statement not covered" >return null;</span></span>
|
|
3927
|
+
|
|
3928
|
+
// Build the `with` config from include array
|
|
3929
|
+
const resolvedRelations = <span class="cstat-no" title="statement not covered" >resolveCollectionRelations(collection);</span>
|
|
3930
|
+
const withConfig: Record<string, boolean> = <span class="cstat-no" title="statement not covered" >{};</span>
|
|
3931
|
+
<span class="cstat-no" title="statement not covered" > for (const [key, relation] of Object.entries(resolvedRelations)) {</span>
|
|
3932
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (include[0] === "*" || include.includes(key)) {</span>
|
|
3933
|
+
// Use the Drizzle relation name (from the schema)
|
|
3934
|
+
const drizzleRelName = <span class="cstat-no" title="statement not covered" >relation.relationName || key;</span>
|
|
3935
|
+
<span class="cstat-no" title="statement not covered" > withConfig[drizzleRelName] = true;</span>
|
|
3936
|
+
}
|
|
3937
|
+
}
|
|
3938
|
+
|
|
3939
|
+
// Build query options
|
|
3940
|
+
const queryOpts: Record<string, unknown> = <span class="cstat-no" title="statement not covered" >{ with: withConfig };</span>
|
|
3941
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (options.limit) <span class="cstat-no" title="statement not covered" >queryOpts.limit = options.limit;</span></span>
|
|
3942
|
+
|
|
3943
|
+
// Build where clause
|
|
3944
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (options.filter) {</span>
|
|
3945
|
+
const filterConditions = <span class="cstat-no" title="statement not covered" >this.buildFilterConditions(</span>
|
|
3946
|
+
options.filter, table, collectionPath
|
|
3947
|
+
);
|
|
3948
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (filterConditions.length > 0) {</span>
|
|
3949
|
+
<span class="cstat-no" title="statement not covered" > queryOpts.where = and(...filterConditions);</span>
|
|
3950
|
+
}
|
|
3951
|
+
}
|
|
3952
|
+
|
|
3953
|
+
// Build orderBy
|
|
3954
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (options.orderBy) {</span>
|
|
3955
|
+
const orderByField = <span class="cstat-no" title="statement not covered" >table[options.orderBy as keyof typeof table] as AnyPgColumn;</span>
|
|
3956
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (orderByField) {</span>
|
|
3957
|
+
<span class="cstat-no" title="statement not covered" > queryOpts.orderBy = options.order === "asc" ? asc(orderByField) : desc(orderByField);</span>
|
|
3958
|
+
}
|
|
3959
|
+
}
|
|
3960
|
+
|
|
3961
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- deprecated method, will be removed
|
|
3962
|
+
const results = <span class="cstat-no" title="statement not covered" >await queryTarget.findMany(queryOpts as any);</span>
|
|
3963
|
+
|
|
3964
|
+
// Flatten the nested Drizzle results into REST format
|
|
3965
|
+
<span class="cstat-no" title="statement not covered" > return results.map(<span class="fstat-no" title="function not covered" >(r</span>ow: Record<string, unknown>) => {</span>
|
|
3966
|
+
const flat: Record<string, unknown> = <span class="cstat-no" title="statement not covered" >{ id: String(row[idInfo.fieldName]) };</span>
|
|
3967
|
+
<span class="cstat-no" title="statement not covered" > for (const [k, v] of Object.entries(row)) {</span>
|
|
3968
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (k === idInfo.fieldName) <span class="cstat-no" title="statement not covered" >continue;</span></span>
|
|
3969
|
+
<span class="cstat-no" title="statement not covered" > if (Array.isArray(v)) {</span>
|
|
3970
|
+
// Many relation — flatten each nested entity
|
|
3971
|
+
<span class="cstat-no" title="statement not covered" > flat[k] = v.map(<span class="fstat-no" title="function not covered" >(i</span>tem: Record<string, unknown>) => {</span>
|
|
3972
|
+
// Junction table rows may have the target nested, flatten those
|
|
3973
|
+
const keys = <span class="cstat-no" title="statement not covered" >Object.keys(item);</span>
|
|
3974
|
+
// If it looks like a junction row (only FKs + nested objects), extract nested
|
|
3975
|
+
const nestedObj = <span class="cstat-no" title="statement not covered" >keys.find(<span class="fstat-no" title="function not covered" >nk </span>=> <span class="cstat-no" title="statement not covered" >typeof item[nk] === "object" && item[nk] !== null && !Array.isArray(item[nk]))</span>;</span>
|
|
3976
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (nestedObj && keys.length <= 3) {</span>
|
|
3977
|
+
const nested = <span class="cstat-no" title="statement not covered" >item[nestedObj] as Record<string, unknown>;</span>
|
|
3978
|
+
<span class="cstat-no" title="statement not covered" > return { id: String(nested.id ?? nested[Object.keys(nested)[0]]), ...nested };</span>
|
|
3979
|
+
}
|
|
3980
|
+
<span class="cstat-no" title="statement not covered" > return { id: String(item.id ?? item[Object.keys(item)[0]]), ...item };</span>
|
|
3981
|
+
});
|
|
3982
|
+
} else <span class="cstat-no" title="statement not covered" >if (typeof v === "object" && v !== null) {</span>
|
|
3983
|
+
// One-to-one relation — inline the object
|
|
3984
|
+
const relObj = <span class="cstat-no" title="statement not covered" >v as Record<string, unknown>;</span>
|
|
3985
|
+
<span class="cstat-no" title="statement not covered" > flat[k] = { id: String(relObj.id ?? relObj[Object.keys(relObj)[0]]), ...relObj };</span>
|
|
3986
|
+
} else {
|
|
3987
|
+
<span class="cstat-no" title="statement not covered" > flat[k] = v;</span>
|
|
3988
|
+
}
|
|
3989
|
+
}
|
|
3990
|
+
<span class="cstat-no" title="statement not covered" > return flat;</span>
|
|
3991
|
+
});
|
|
3992
|
+
} catch (e) {
|
|
3993
|
+
<span class="cstat-no" title="statement not covered" > console.warn(`[include] Drizzle relational query failed for '${collectionPath}', falling back:`, e);</span>
|
|
3994
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
3995
|
+
}
|
|
3996
|
+
}
|
|
3997
|
+
|
|
3998
|
+
/**
|
|
3999
|
+
* @deprecated Only used in the fallback path when db.query is unavailable.
|
|
4000
|
+
* The primary path uses db.query.findMany with `with` config, which
|
|
4001
|
+
* loads all relations in a single query.
|
|
4002
|
+
*
|
|
4003
|
+
* Batch fetch many-to-many related entities for multiple parent IDs.
|
|
4004
|
+
* Groups results by parent ID to avoid N+1.
|
|
4005
|
+
*/
|
|
4006
|
+
private <span class="fstat-no" title="function not covered" >async </span>batchFetchManyRelatedEntities(
|
|
4007
|
+
parentCollectionPath: string,
|
|
4008
|
+
parentIds: (string | number)[],
|
|
4009
|
+
relationKey: string
|
|
4010
|
+
): Promise<Map<string, Entity[]>> {
|
|
4011
|
+
const resultMap = <span class="cstat-no" title="statement not covered" >new Map<string, Entity[]>();</span>
|
|
4012
|
+
|
|
4013
|
+
// Fetch for all parents using Promise.all (limited batch)
|
|
4014
|
+
const batchPromises = <span class="cstat-no" title="statement not covered" >parentIds.map(<span class="fstat-no" title="function not covered" >async </span>(parentId) => {</span>
|
|
4015
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
4016
|
+
const related = <span class="cstat-no" title="statement not covered" >await this.relationService.fetchRelatedEntities(</span>
|
|
4017
|
+
parentCollectionPath, parentId, relationKey, {}
|
|
4018
|
+
);
|
|
4019
|
+
<span class="cstat-no" title="statement not covered" > resultMap.set(String(parentId), related);</span>
|
|
4020
|
+
} catch (e) {
|
|
4021
|
+
<span class="cstat-no" title="statement not covered" > resultMap.set(String(parentId), []);</span>
|
|
4022
|
+
}
|
|
4023
|
+
});
|
|
4024
|
+
|
|
4025
|
+
<span class="cstat-no" title="statement not covered" > await Promise.all(batchPromises);</span>
|
|
4026
|
+
<span class="cstat-no" title="statement not covered" > return resultMap;</span>
|
|
4027
|
+
}
|
|
4028
|
+
}
|
|
4029
|
+
</pre></td></tr></table></pre>
|
|
4030
|
+
|
|
4031
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
4032
|
+
</div><!-- /wrapper -->
|
|
4033
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
4034
|
+
Code coverage generated by
|
|
4035
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
4036
|
+
at 2026-04-06T04:35:23.770Z
|
|
4037
|
+
</div>
|
|
4038
|
+
<script src="../../../prettify.js"></script>
|
|
4039
|
+
<script>
|
|
4040
|
+
window.onload = function () {
|
|
4041
|
+
prettyPrint();
|
|
4042
|
+
};
|
|
4043
|
+
</script>
|
|
4044
|
+
<script src="../../../sorter.js"></script>
|
|
4045
|
+
<script src="../../../block-navigation.js"></script>
|
|
4046
|
+
</body>
|
|
4047
|
+
</html>
|
|
4048
|
+
|