@prosopo/provider 3.3.0 → 3.12.14
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/CHANGELOG.md +718 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +4278 -0
- package/coverage/coverage-final.json +42 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +311 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/src/api/admin/apiAdminRoutesProvider.ts.html +214 -0
- package/coverage/src/api/admin/apiRegisterSiteKeyEndpoint.ts.html +259 -0
- package/coverage/src/api/admin/apiRemoveDetectorKeyEndpoint.ts.html +283 -0
- package/coverage/src/api/admin/apiToggleMaintenanceModeEndpoint.ts.html +334 -0
- package/coverage/src/api/admin/apiUpdateDetectorKeyEndpoint.ts.html +298 -0
- package/coverage/src/api/admin/createApiAdminRoutesProvider.ts.html +163 -0
- package/coverage/src/api/admin/index.html +191 -0
- package/coverage/src/api/blacklistRequestInspector.ts.html +751 -0
- package/coverage/src/api/block.ts.html +187 -0
- package/coverage/src/api/captcha.ts.html +2803 -0
- package/coverage/src/api/domainMiddleware.ts.html +493 -0
- package/coverage/src/api/headerCheckMiddleware.ts.html +256 -0
- package/coverage/src/api/ignoreMiddleware.ts.html +181 -0
- package/coverage/src/api/index.html +266 -0
- package/coverage/src/api/ja4Middleware.ts.html +400 -0
- package/coverage/src/api/public.ts.html +343 -0
- package/coverage/src/api/robotsMiddleware.ts.html +157 -0
- package/coverage/src/api/validateAddress.ts.html +214 -0
- package/coverage/src/api/verify.ts.html +871 -0
- package/coverage/src/compositeIpAddress.ts.html +340 -0
- package/coverage/src/index.html +161 -0
- package/coverage/src/index.ts.html +175 -0
- package/coverage/src/pairs.ts.html +238 -0
- package/coverage/src/rules/index.html +116 -0
- package/coverage/src/rules/lang.ts.html +187 -0
- package/coverage/src/schedulers/captchaScheduler.ts.html +250 -0
- package/coverage/src/schedulers/getClientList.ts.html +271 -0
- package/coverage/src/schedulers/index.html +131 -0
- package/coverage/src/services/index.html +131 -0
- package/coverage/src/services/ipComparison.ts.html +685 -0
- package/coverage/src/services/ipInfo.ts.html +490 -0
- package/coverage/src/tasks/captchaManager.ts.html +865 -0
- package/coverage/src/tasks/client/clientTasks.ts.html +1381 -0
- package/coverage/src/tasks/client/index.html +116 -0
- package/coverage/src/tasks/dataset/datasetTasks.ts.html +268 -0
- package/coverage/src/tasks/dataset/datasetTasksUtils.ts.html +271 -0
- package/coverage/src/tasks/dataset/index.html +131 -0
- package/coverage/src/tasks/detection/decodePayload.js.html +127 -0
- package/coverage/src/tasks/detection/getBotScore.ts.html +244 -0
- package/coverage/src/tasks/detection/index.html +131 -0
- package/coverage/src/tasks/frictionless/frictionlessTasks.ts.html +1216 -0
- package/coverage/src/tasks/frictionless/frictionlessTasksUtils.ts.html +247 -0
- package/coverage/src/tasks/frictionless/index.html +131 -0
- package/coverage/src/tasks/imgCaptcha/imgCaptchaTasks.ts.html +1972 -0
- package/coverage/src/tasks/imgCaptcha/imgCaptchaTasksUtils.ts.html +232 -0
- package/coverage/src/tasks/imgCaptcha/index.html +131 -0
- package/coverage/src/tasks/index.html +146 -0
- package/coverage/src/tasks/index.ts.html +127 -0
- package/coverage/src/tasks/powCaptcha/index.html +131 -0
- package/coverage/src/tasks/powCaptcha/powTasks.ts.html +961 -0
- package/coverage/src/tasks/powCaptcha/powTasksUtils.ts.html +244 -0
- package/coverage/src/tasks/tasks.ts.html +388 -0
- package/coverage/src/util.ts.html +1627 -0
- package/coverage/src/utils/hashUserAgent.ts.html +184 -0
- package/coverage/src/utils/index.html +116 -0
- package/dist/api/admin/apiAdminRoutesProvider.d.ts +9 -0
- package/dist/api/admin/apiAdminRoutesProvider.d.ts.map +1 -0
- package/dist/api/admin/apiAdminRoutesProvider.js +13 -18
- package/dist/api/admin/apiAdminRoutesProvider.js.map +1 -0
- package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts +14 -0
- package/dist/api/admin/apiRegisterSiteKeyEndpoint.d.ts.map +1 -0
- package/dist/api/admin/apiRegisterSiteKeyEndpoint.js.map +1 -0
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts +23 -0
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.d.ts.map +1 -0
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js +7 -4
- package/dist/api/admin/apiRemoveDetectorKeyEndpoint.js.map +1 -0
- package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts +13 -0
- package/dist/api/admin/apiToggleMaintenanceModeEndpoint.d.ts.map +1 -0
- package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js +40 -0
- package/dist/api/admin/apiToggleMaintenanceModeEndpoint.js.map +1 -0
- package/dist/api/admin/apiUpdateDetectorKeyEndpoint.d.ts +14 -0
- package/dist/api/admin/apiUpdateDetectorKeyEndpoint.d.ts.map +1 -0
- package/dist/api/admin/apiUpdateDetectorKeyEndpoint.js.map +1 -0
- package/dist/api/admin/createApiAdminRoutesProvider.d.ts +4 -0
- package/dist/api/admin/createApiAdminRoutesProvider.d.ts.map +1 -0
- package/dist/api/admin/createApiAdminRoutesProvider.js.map +1 -0
- package/dist/api/blacklistRequestInspector.d.ts +19 -0
- package/dist/api/blacklistRequestInspector.d.ts.map +1 -0
- package/dist/api/blacklistRequestInspector.js +14 -12
- package/dist/api/blacklistRequestInspector.js.map +1 -0
- package/dist/api/block.d.ts +3 -0
- package/dist/api/block.d.ts.map +1 -0
- package/dist/api/block.js.map +1 -0
- package/dist/api/captcha.d.ts +4 -0
- package/dist/api/captcha.d.ts.map +1 -0
- package/dist/api/captcha.js +226 -48
- package/dist/api/captcha.js.map +1 -0
- package/dist/api/domainMiddleware.d.ts +4 -0
- package/dist/api/domainMiddleware.d.ts.map +1 -0
- package/dist/api/domainMiddleware.js +8 -8
- package/dist/api/domainMiddleware.js.map +1 -0
- package/dist/api/headerCheckMiddleware.d.ts +4 -0
- package/dist/api/headerCheckMiddleware.d.ts.map +1 -0
- package/dist/api/headerCheckMiddleware.js +4 -0
- package/dist/api/headerCheckMiddleware.js.map +1 -0
- package/dist/api/ignoreMiddleware.d.ts +3 -0
- package/dist/api/ignoreMiddleware.d.ts.map +1 -0
- package/dist/api/ignoreMiddleware.js +4 -1
- package/dist/api/ignoreMiddleware.js.map +1 -0
- package/dist/api/ja4Middleware.d.ts +10 -0
- package/dist/api/ja4Middleware.d.ts.map +1 -0
- package/dist/api/ja4Middleware.js +5 -23
- package/dist/api/ja4Middleware.js.map +1 -0
- package/dist/api/public.d.ts +4 -0
- package/dist/api/public.d.ts.map +1 -0
- package/dist/api/public.js +26 -3
- package/dist/api/public.js.map +1 -0
- package/dist/api/robotsMiddleware.d.ts +3 -0
- package/dist/api/robotsMiddleware.d.ts.map +1 -0
- package/dist/api/robotsMiddleware.js.map +1 -0
- package/dist/api/validateAddress.d.ts +5 -0
- package/dist/api/validateAddress.d.ts.map +1 -0
- package/dist/api/validateAddress.js.map +1 -0
- package/dist/api/verify.d.ts +4 -0
- package/dist/api/verify.d.ts.map +1 -0
- package/dist/api/verify.js +27 -3
- package/dist/api/verify.js.map +1 -0
- package/dist/cjs/api/admin/apiAdminRoutesProvider.cjs +13 -18
- package/dist/cjs/api/admin/apiRegisterSiteKeyEndpoint.cjs +2 -1
- package/dist/cjs/api/admin/apiRemoveDetectorKeyEndpoint.cjs +9 -5
- package/dist/cjs/api/admin/apiToggleMaintenanceModeEndpoint.cjs +41 -0
- package/dist/cjs/api/blacklistRequestInspector.cjs +13 -11
- package/dist/cjs/api/captcha.cjs +226 -48
- package/dist/cjs/api/domainMiddleware.cjs +8 -8
- package/dist/cjs/api/headerCheckMiddleware.cjs +4 -0
- package/dist/cjs/api/ignoreMiddleware.cjs +3 -0
- package/dist/cjs/api/ja4Middleware.cjs +6 -23
- package/dist/cjs/api/public.cjs +26 -3
- package/dist/cjs/api/verify.cjs +27 -3
- package/dist/cjs/compositeIpAddress.cjs +53 -0
- package/dist/cjs/index.cjs +7 -0
- package/dist/cjs/pairs.cjs +27 -0
- package/dist/cjs/services/ipComparison.cjs +123 -0
- package/dist/cjs/services/ipInfo.cjs +87 -0
- package/dist/cjs/tasks/captchaManager.cjs +41 -10
- package/dist/cjs/tasks/client/clientTasks.cjs +31 -43
- package/dist/cjs/tasks/detection/decodePayload.cjs +616 -281
- package/dist/cjs/tasks/detection/getBotScore.cjs +28 -4
- package/dist/cjs/tasks/frictionless/frictionlessTasks.cjs +227 -36
- package/dist/cjs/tasks/frictionless/frictionlessTasksUtils.cjs +17 -0
- package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +78 -30
- package/dist/cjs/tasks/powCaptcha/powTasks.cjs +49 -21
- package/dist/cjs/util.cjs +262 -17
- package/dist/cjs/utils/hashUserAgent.cjs +10 -0
- package/dist/compositeIpAddress.d.ts +5 -0
- package/dist/compositeIpAddress.d.ts.map +1 -0
- package/dist/compositeIpAddress.js +53 -0
- package/dist/compositeIpAddress.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -0
- package/dist/pairs.d.ts +3 -0
- package/dist/pairs.d.ts.map +1 -0
- package/dist/pairs.js +27 -0
- package/dist/pairs.js.map +1 -0
- package/dist/rules/lang.d.ts +3 -0
- package/dist/rules/lang.d.ts.map +1 -0
- package/dist/rules/lang.js.map +1 -0
- package/dist/schedulers/captchaScheduler.d.ts +4 -0
- package/dist/schedulers/captchaScheduler.d.ts.map +1 -0
- package/dist/schedulers/captchaScheduler.js.map +1 -0
- package/dist/schedulers/getClientList.d.ts +4 -0
- package/dist/schedulers/getClientList.d.ts.map +1 -0
- package/dist/schedulers/getClientList.js.map +1 -0
- package/dist/schedulers/setClientEntropy.d.ts +4 -0
- package/dist/schedulers/setClientEntropy.d.ts.map +1 -0
- package/dist/schedulers/setClientEntropy.js +31 -0
- package/dist/schedulers/setClientEntropy.js.map +1 -0
- package/dist/services/ipComparison.d.ts +3 -0
- package/dist/services/ipComparison.d.ts.map +1 -0
- package/dist/services/ipComparison.js +123 -0
- package/dist/services/ipComparison.js.map +1 -0
- package/dist/services/ipInfo.d.ts +3 -0
- package/dist/services/ipInfo.d.ts.map +1 -0
- package/dist/services/ipInfo.js +87 -0
- package/dist/services/ipInfo.js.map +1 -0
- package/dist/tasks/captchaManager.d.ts +34 -0
- package/dist/tasks/captchaManager.d.ts.map +1 -0
- package/dist/tasks/captchaManager.js +39 -9
- package/dist/tasks/captchaManager.js.map +1 -0
- package/dist/tasks/client/clientTasks.d.ts +21 -0
- package/dist/tasks/client/clientTasks.d.ts.map +1 -0
- package/dist/tasks/client/clientTasks.js +31 -43
- package/dist/tasks/client/clientTasks.js.map +1 -0
- package/dist/tasks/dataset/datasetTasks.d.ts +13 -0
- package/dist/tasks/dataset/datasetTasks.d.ts.map +1 -0
- package/dist/tasks/dataset/datasetTasks.js.map +1 -0
- package/dist/tasks/dataset/datasetTasksUtils.d.ts +3 -0
- package/dist/tasks/dataset/datasetTasksUtils.d.ts.map +1 -0
- package/dist/tasks/dataset/datasetTasksUtils.js.map +1 -0
- package/dist/tasks/detection/decodePayload.d.ts +5 -0
- package/dist/tasks/detection/decodePayload.d.ts.map +1 -0
- package/dist/tasks/detection/decodePayload.js +616 -281
- package/dist/tasks/detection/decodePayload.js.map +1 -0
- package/dist/tasks/detection/getBotScore.d.ts +20 -0
- package/dist/tasks/detection/getBotScore.d.ts.map +1 -0
- package/dist/tasks/detection/getBotScore.js +29 -5
- package/dist/tasks/detection/getBotScore.js.map +1 -0
- package/dist/tasks/frictionless/frictionlessTasks.d.ts +67 -0
- package/dist/tasks/frictionless/frictionlessTasks.d.ts.map +1 -0
- package/dist/tasks/frictionless/frictionlessTasks.js +227 -36
- package/dist/tasks/frictionless/frictionlessTasks.js.map +1 -0
- package/dist/tasks/frictionless/frictionlessTasksUtils.d.ts +6 -0
- package/dist/tasks/frictionless/frictionlessTasksUtils.d.ts.map +1 -0
- package/dist/tasks/frictionless/frictionlessTasksUtils.js +18 -1
- package/dist/tasks/frictionless/frictionlessTasksUtils.js.map +1 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts +30 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +80 -32
- package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts +7 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts.map +1 -0
- package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js.map +1 -0
- package/dist/tasks/index.d.ts +2 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/tasks/powCaptcha/powTasks.d.ts +17 -0
- package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -0
- package/dist/tasks/powCaptcha/powTasks.js +50 -22
- package/dist/tasks/powCaptcha/powTasks.js.map +1 -0
- package/dist/tasks/powCaptcha/powTasksUtils.d.ts +3 -0
- package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +1 -0
- package/dist/tasks/powCaptcha/powTasksUtils.js.map +1 -0
- package/dist/tasks/tasks.d.ts +25 -0
- package/dist/tasks/tasks.d.ts.map +1 -0
- package/dist/tasks/tasks.js.map +1 -0
- package/dist/tests/index.d.ts +2 -0
- package/dist/tests/index.d.ts.map +1 -0
- package/dist/tests/index.js +2 -0
- package/dist/tests/index.js.map +1 -0
- package/dist/tests/integration/accessRules.integration.test.d.ts +2 -0
- package/dist/tests/integration/accessRules.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/accessRules.integration.test.js +588 -0
- package/dist/tests/integration/accessRules.integration.test.js.map +1 -0
- package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.d.ts +2 -0
- package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js +60 -0
- package/dist/tests/integration/api/admin/apiRegisterSiteKeyEndpoint.integration.test.js.map +1 -0
- package/dist/tests/integration/api/blacklistRequestInspector.integration.test.d.ts +2 -0
- package/dist/tests/integration/api/blacklistRequestInspector.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js +368 -0
- package/dist/tests/integration/api/blacklistRequestInspector.integration.test.js.map +1 -0
- package/dist/tests/integration/imgCaptcha.integration.test.d.ts +2 -0
- package/dist/tests/integration/imgCaptcha.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/imgCaptcha.integration.test.js +272 -0
- package/dist/tests/integration/imgCaptcha.integration.test.js.map +1 -0
- package/dist/tests/integration/ipValidation.integration.test.d.ts +2 -0
- package/dist/tests/integration/ipValidation.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/ipValidation.integration.test.js +75 -0
- package/dist/tests/integration/ipValidation.integration.test.js.map +1 -0
- package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts +32 -0
- package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts.map +1 -0
- package/dist/tests/integration/mocks/solvedTestCaptchas.js +1046 -0
- package/dist/tests/integration/mocks/solvedTestCaptchas.js.map +1 -0
- package/dist/tests/integration/powCaptcha.integration.test.d.ts +2 -0
- package/dist/tests/integration/powCaptcha.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/powCaptcha.integration.test.js +308 -0
- package/dist/tests/integration/powCaptcha.integration.test.js.map +1 -0
- package/dist/tests/integration/registerSitekey.d.ts +3 -0
- package/dist/tests/integration/registerSitekey.d.ts.map +1 -0
- package/dist/tests/integration/registerSitekey.js +24 -0
- package/dist/tests/integration/registerSitekey.js.map +1 -0
- package/dist/tests/integration/userAccessPolicy.d.ts +2 -0
- package/dist/tests/integration/userAccessPolicy.d.ts.map +1 -0
- package/dist/tests/integration/userAccessPolicy.js +2 -0
- package/dist/tests/integration/userAccessPolicy.js.map +1 -0
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js +60 -0
- package/dist/tests/unit/api/blacklistRequestInspector.unit.test.js.map +1 -0
- package/dist/tests/unit/api/ignoreMiddleware.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/ignoreMiddleware.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/ignoreMiddleware.unit.test.js +43 -0
- package/dist/tests/unit/api/ignoreMiddleware.unit.test.js.map +1 -0
- package/dist/tests/unit/api/ja4Middleware.unit.test.d.ts +2 -0
- package/dist/tests/unit/api/ja4Middleware.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/api/ja4Middleware.unit.test.js +57 -0
- package/dist/tests/unit/api/ja4Middleware.unit.test.js.map +1 -0
- package/dist/tests/unit/compositeIpAddress.unit.test.d.ts +2 -0
- package/dist/tests/unit/compositeIpAddress.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/compositeIpAddress.unit.test.js +86 -0
- package/dist/tests/unit/compositeIpAddress.unit.test.js.map +1 -0
- package/dist/tests/unit/pairs.unit.test.d.ts +2 -0
- package/dist/tests/unit/pairs.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/pairs.unit.test.js +83 -0
- package/dist/tests/unit/pairs.unit.test.js.map +1 -0
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts +2 -0
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +75 -0
- package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +1 -0
- package/dist/tests/unit/services/ipComparison.unit.test.d.ts +2 -0
- package/dist/tests/unit/services/ipComparison.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/services/ipComparison.unit.test.js +258 -0
- package/dist/tests/unit/services/ipComparison.unit.test.js.map +1 -0
- package/dist/tests/unit/services/ipInfo.unit.test.d.ts +2 -0
- package/dist/tests/unit/services/ipInfo.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/services/ipInfo.unit.test.js +210 -0
- package/dist/tests/unit/services/ipInfo.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/captchaManager.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/captchaManager.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/captchaManager.unit.test.js +311 -0
- package/dist/tests/unit/tasks/captchaManager.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +289 -0
- package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +92 -0
- package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js +75 -0
- package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.js +143 -0
- package/dist/tests/unit/tasks/frictionless/decryptPayload.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js +145 -0
- package/dist/tests/unit/tasks/frictionless/frictionlessTasks.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js +64 -0
- package/dist/tests/unit/tasks/frictionless/frictionlessTasksUtils.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +388 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js +46 -0
- package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +216 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +1 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts +2 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +69 -0
- package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +1 -0
- package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.d.ts +2 -0
- package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.js +505 -0
- package/dist/tests/unit/util.evaluateIpValidationRules.unit.test.js.map +1 -0
- package/dist/tests/unit/util.ipDistance.unit.test.d.ts +2 -0
- package/dist/tests/unit/util.ipDistance.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/util.ipDistance.unit.test.js +93 -0
- package/dist/tests/unit/util.ipDistance.unit.test.js.map +1 -0
- package/dist/tests/unit/util.unit.test.d.ts +2 -0
- package/dist/tests/unit/util.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/util.unit.test.js +170 -0
- package/dist/tests/unit/util.unit.test.js.map +1 -0
- package/dist/util.d.ts +24 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +263 -18
- package/dist/util.js.map +1 -0
- package/dist/utils/hashUserAgent.d.ts +2 -0
- package/dist/utils/hashUserAgent.d.ts.map +1 -0
- package/dist/utils/hashUserAgent.js +10 -0
- package/dist/utils/hashUserAgent.js.map +1 -0
- package/package.json +31 -29
- package/vite.test.config.ts +3 -2
- package/vite.threads.test.config.ts +33 -0
|
@@ -0,0 +1,2803 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/api/captcha.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/api</a> captcha.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">0% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>0/740</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">100% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>1/1</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">100% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>1/1</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">0% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>0/740</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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
973
|
+
<span class="cline-any cline-neutral"> </span>
|
|
974
|
+
<span class="cline-any cline-neutral"> </span>
|
|
975
|
+
<span class="cline-any cline-neutral"> </span>
|
|
976
|
+
<span class="cline-any cline-neutral"> </span>
|
|
977
|
+
<span class="cline-any cline-neutral"> </span>
|
|
978
|
+
<span class="cline-any cline-neutral"> </span>
|
|
979
|
+
<span class="cline-any cline-neutral"> </span>
|
|
980
|
+
<span class="cline-any cline-neutral"> </span>
|
|
981
|
+
<span class="cline-any cline-neutral"> </span>
|
|
982
|
+
<span class="cline-any cline-neutral"> </span>
|
|
983
|
+
<span class="cline-any cline-neutral"> </span>
|
|
984
|
+
<span class="cline-any cline-neutral"> </span>
|
|
985
|
+
<span class="cline-any cline-neutral"> </span>
|
|
986
|
+
<span class="cline-any cline-no"> </span>
|
|
987
|
+
<span class="cline-any cline-no"> </span>
|
|
988
|
+
<span class="cline-any cline-no"> </span>
|
|
989
|
+
<span class="cline-any cline-no"> </span>
|
|
990
|
+
<span class="cline-any cline-neutral"> </span>
|
|
991
|
+
<span class="cline-any cline-neutral"> </span>
|
|
992
|
+
<span class="cline-any cline-neutral"> </span>
|
|
993
|
+
<span class="cline-any cline-neutral"> </span>
|
|
994
|
+
<span class="cline-any cline-neutral"> </span>
|
|
995
|
+
<span class="cline-any cline-neutral"> </span>
|
|
996
|
+
<span class="cline-any cline-neutral"> </span>
|
|
997
|
+
<span class="cline-any cline-neutral"> </span>
|
|
998
|
+
<span class="cline-any cline-neutral"> </span>
|
|
999
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1000
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1001
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1002
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1003
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1004
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1005
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1006
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1007
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1008
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1009
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1010
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1011
|
+
<span class="cline-any cline-no"> </span>
|
|
1012
|
+
<span class="cline-any cline-no"> </span>
|
|
1013
|
+
<span class="cline-any cline-no"> </span>
|
|
1014
|
+
<span class="cline-any cline-no"> </span>
|
|
1015
|
+
<span class="cline-any cline-no"> </span>
|
|
1016
|
+
<span class="cline-any cline-no"> </span>
|
|
1017
|
+
<span class="cline-any cline-no"> </span>
|
|
1018
|
+
<span class="cline-any cline-no"> </span>
|
|
1019
|
+
<span class="cline-any cline-no"> </span>
|
|
1020
|
+
<span class="cline-any cline-no"> </span>
|
|
1021
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1022
|
+
<span class="cline-any cline-no"> </span>
|
|
1023
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1024
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1025
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1026
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1027
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1028
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1029
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1030
|
+
<span class="cline-any cline-no"> </span>
|
|
1031
|
+
<span class="cline-any cline-no"> </span>
|
|
1032
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1033
|
+
<span class="cline-any cline-no"> </span>
|
|
1034
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1035
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1036
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1037
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1038
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1039
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1040
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1041
|
+
<span class="cline-any cline-no"> </span>
|
|
1042
|
+
<span class="cline-any cline-no"> </span>
|
|
1043
|
+
<span class="cline-any cline-no"> </span>
|
|
1044
|
+
<span class="cline-any cline-no"> </span>
|
|
1045
|
+
<span class="cline-any cline-no"> </span>
|
|
1046
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1047
|
+
<span class="cline-any cline-no"> </span>
|
|
1048
|
+
<span class="cline-any cline-no"> </span>
|
|
1049
|
+
<span class="cline-any cline-no"> </span>
|
|
1050
|
+
<span class="cline-any cline-no"> </span>
|
|
1051
|
+
<span class="cline-any cline-no"> </span>
|
|
1052
|
+
<span class="cline-any cline-no"> </span>
|
|
1053
|
+
<span class="cline-any cline-no"> </span>
|
|
1054
|
+
<span class="cline-any cline-no"> </span>
|
|
1055
|
+
<span class="cline-any cline-no"> </span>
|
|
1056
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1057
|
+
<span class="cline-any cline-no"> </span>
|
|
1058
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1059
|
+
<span class="cline-any cline-no"> </span>
|
|
1060
|
+
<span class="cline-any cline-no"> </span>
|
|
1061
|
+
<span class="cline-any cline-no"> </span>
|
|
1062
|
+
<span class="cline-any cline-no"> </span>
|
|
1063
|
+
<span class="cline-any cline-no"> </span>
|
|
1064
|
+
<span class="cline-any cline-no"> </span>
|
|
1065
|
+
<span class="cline-any cline-no"> </span>
|
|
1066
|
+
<span class="cline-any cline-no"> </span>
|
|
1067
|
+
<span class="cline-any cline-no"> </span>
|
|
1068
|
+
<span class="cline-any cline-no"> </span>
|
|
1069
|
+
<span class="cline-any cline-no"> </span>
|
|
1070
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1071
|
+
<span class="cline-any cline-no"> </span>
|
|
1072
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1073
|
+
<span class="cline-any cline-no"> </span>
|
|
1074
|
+
<span class="cline-any cline-no"> </span>
|
|
1075
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1076
|
+
<span class="cline-any cline-no"> </span>
|
|
1077
|
+
<span class="cline-any cline-no"> </span>
|
|
1078
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1079
|
+
<span class="cline-any cline-no"> </span>
|
|
1080
|
+
<span class="cline-any cline-no"> </span>
|
|
1081
|
+
<span class="cline-any cline-no"> </span>
|
|
1082
|
+
<span class="cline-any cline-no"> </span>
|
|
1083
|
+
<span class="cline-any cline-no"> </span>
|
|
1084
|
+
<span class="cline-any cline-no"> </span>
|
|
1085
|
+
<span class="cline-any cline-no"> </span>
|
|
1086
|
+
<span class="cline-any cline-no"> </span>
|
|
1087
|
+
<span class="cline-any cline-no"> </span>
|
|
1088
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1089
|
+
<span class="cline-any cline-no"> </span>
|
|
1090
|
+
<span class="cline-any cline-no"> </span>
|
|
1091
|
+
<span class="cline-any cline-no"> </span>
|
|
1092
|
+
<span class="cline-any cline-no"> </span>
|
|
1093
|
+
<span class="cline-any cline-no"> </span>
|
|
1094
|
+
<span class="cline-any cline-no"> </span>
|
|
1095
|
+
<span class="cline-any cline-no"> </span>
|
|
1096
|
+
<span class="cline-any cline-no"> </span>
|
|
1097
|
+
<span class="cline-any cline-no"> </span>
|
|
1098
|
+
<span class="cline-any cline-no"> </span>
|
|
1099
|
+
<span class="cline-any cline-no"> </span>
|
|
1100
|
+
<span class="cline-any cline-no"> </span>
|
|
1101
|
+
<span class="cline-any cline-no"> </span>
|
|
1102
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1103
|
+
<span class="cline-any cline-no"> </span>
|
|
1104
|
+
<span class="cline-any cline-no"> </span>
|
|
1105
|
+
<span class="cline-any cline-no"> </span>
|
|
1106
|
+
<span class="cline-any cline-no"> </span>
|
|
1107
|
+
<span class="cline-any cline-no"> </span>
|
|
1108
|
+
<span class="cline-any cline-no"> </span>
|
|
1109
|
+
<span class="cline-any cline-no"> </span>
|
|
1110
|
+
<span class="cline-any cline-no"> </span>
|
|
1111
|
+
<span class="cline-any cline-no"> </span>
|
|
1112
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1113
|
+
<span class="cline-any cline-no"> </span>
|
|
1114
|
+
<span class="cline-any cline-no"> </span>
|
|
1115
|
+
<span class="cline-any cline-no"> </span>
|
|
1116
|
+
<span class="cline-any cline-no"> </span>
|
|
1117
|
+
<span class="cline-any cline-no"> </span>
|
|
1118
|
+
<span class="cline-any cline-no"> </span>
|
|
1119
|
+
<span class="cline-any cline-no"> </span>
|
|
1120
|
+
<span class="cline-any cline-no"> </span>
|
|
1121
|
+
<span class="cline-any cline-no"> </span>
|
|
1122
|
+
<span class="cline-any cline-no"> </span>
|
|
1123
|
+
<span class="cline-any cline-no"> </span>
|
|
1124
|
+
<span class="cline-any cline-no"> </span>
|
|
1125
|
+
<span class="cline-any cline-no"> </span>
|
|
1126
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1127
|
+
<span class="cline-any cline-no"> </span>
|
|
1128
|
+
<span class="cline-any cline-no"> </span>
|
|
1129
|
+
<span class="cline-any cline-no"> </span>
|
|
1130
|
+
<span class="cline-any cline-no"> </span>
|
|
1131
|
+
<span class="cline-any cline-no"> </span>
|
|
1132
|
+
<span class="cline-any cline-no"> </span>
|
|
1133
|
+
<span class="cline-any cline-no"> </span>
|
|
1134
|
+
<span class="cline-any cline-no"> </span>
|
|
1135
|
+
<span class="cline-any cline-no"> </span>
|
|
1136
|
+
<span class="cline-any cline-no"> </span>
|
|
1137
|
+
<span class="cline-any cline-no"> </span>
|
|
1138
|
+
<span class="cline-any cline-no"> </span>
|
|
1139
|
+
<span class="cline-any cline-no"> </span>
|
|
1140
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1141
|
+
<span class="cline-any cline-no"> </span>
|
|
1142
|
+
<span class="cline-any cline-no"> </span>
|
|
1143
|
+
<span class="cline-any cline-no"> </span>
|
|
1144
|
+
<span class="cline-any cline-no"> </span>
|
|
1145
|
+
<span class="cline-any cline-no"> </span>
|
|
1146
|
+
<span class="cline-any cline-no"> </span>
|
|
1147
|
+
<span class="cline-any cline-no"> </span>
|
|
1148
|
+
<span class="cline-any cline-no"> </span>
|
|
1149
|
+
<span class="cline-any cline-no"> </span>
|
|
1150
|
+
<span class="cline-any cline-no"> </span>
|
|
1151
|
+
<span class="cline-any cline-no"> </span>
|
|
1152
|
+
<span class="cline-any cline-no"> </span>
|
|
1153
|
+
<span class="cline-any cline-no"> </span>
|
|
1154
|
+
<span class="cline-any cline-no"> </span>
|
|
1155
|
+
<span class="cline-any cline-no"> </span>
|
|
1156
|
+
<span class="cline-any cline-no"> </span>
|
|
1157
|
+
<span class="cline-any cline-no"> </span>
|
|
1158
|
+
<span class="cline-any cline-no"> </span>
|
|
1159
|
+
<span class="cline-any cline-no"> </span>
|
|
1160
|
+
<span class="cline-any cline-no"> </span>
|
|
1161
|
+
<span class="cline-any cline-no"> </span>
|
|
1162
|
+
<span class="cline-any cline-no"> </span>
|
|
1163
|
+
<span class="cline-any cline-no"> </span>
|
|
1164
|
+
<span class="cline-any cline-no"> </span>
|
|
1165
|
+
<span class="cline-any cline-no"> </span>
|
|
1166
|
+
<span class="cline-any cline-no"> </span>
|
|
1167
|
+
<span class="cline-any cline-no"> </span>
|
|
1168
|
+
<span class="cline-any cline-no"> </span>
|
|
1169
|
+
<span class="cline-any cline-no"> </span>
|
|
1170
|
+
<span class="cline-any cline-no"> </span>
|
|
1171
|
+
<span class="cline-any cline-no"> </span>
|
|
1172
|
+
<span class="cline-any cline-no"> </span>
|
|
1173
|
+
<span class="cline-any cline-no"> </span>
|
|
1174
|
+
<span class="cline-any cline-no"> </span>
|
|
1175
|
+
<span class="cline-any cline-no"> </span>
|
|
1176
|
+
<span class="cline-any cline-no"> </span>
|
|
1177
|
+
<span class="cline-any cline-no"> </span>
|
|
1178
|
+
<span class="cline-any cline-no"> </span>
|
|
1179
|
+
<span class="cline-any cline-no"> </span>
|
|
1180
|
+
<span class="cline-any cline-no"> </span>
|
|
1181
|
+
<span class="cline-any cline-no"> </span>
|
|
1182
|
+
<span class="cline-any cline-no"> </span>
|
|
1183
|
+
<span class="cline-any cline-no"> </span>
|
|
1184
|
+
<span class="cline-any cline-no"> </span>
|
|
1185
|
+
<span class="cline-any cline-no"> </span>
|
|
1186
|
+
<span class="cline-any cline-no"> </span>
|
|
1187
|
+
<span class="cline-any cline-no"> </span>
|
|
1188
|
+
<span class="cline-any cline-no"> </span>
|
|
1189
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1190
|
+
<span class="cline-any cline-no"> </span>
|
|
1191
|
+
<span class="cline-any cline-no"> </span>
|
|
1192
|
+
<span class="cline-any cline-no"> </span>
|
|
1193
|
+
<span class="cline-any cline-no"> </span>
|
|
1194
|
+
<span class="cline-any cline-no"> </span>
|
|
1195
|
+
<span class="cline-any cline-no"> </span>
|
|
1196
|
+
<span class="cline-any cline-no"> </span>
|
|
1197
|
+
<span class="cline-any cline-no"> </span>
|
|
1198
|
+
<span class="cline-any cline-no"> </span>
|
|
1199
|
+
<span class="cline-any cline-no"> </span>
|
|
1200
|
+
<span class="cline-any cline-no"> </span>
|
|
1201
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1202
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1203
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1204
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1205
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1206
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1207
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1208
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1209
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1210
|
+
<span class="cline-any cline-no"> </span>
|
|
1211
|
+
<span class="cline-any cline-no"> </span>
|
|
1212
|
+
<span class="cline-any cline-no"> </span>
|
|
1213
|
+
<span class="cline-any cline-no"> </span>
|
|
1214
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1215
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1216
|
+
<span class="cline-any cline-no"> </span>
|
|
1217
|
+
<span class="cline-any cline-no"> </span>
|
|
1218
|
+
<span class="cline-any cline-no"> </span>
|
|
1219
|
+
<span class="cline-any cline-no"> </span>
|
|
1220
|
+
<span class="cline-any cline-no"> </span>
|
|
1221
|
+
<span class="cline-any cline-no"> </span>
|
|
1222
|
+
<span class="cline-any cline-no"> </span>
|
|
1223
|
+
<span class="cline-any cline-no"> </span>
|
|
1224
|
+
<span class="cline-any cline-no"> </span>
|
|
1225
|
+
<span class="cline-any cline-no"> </span>
|
|
1226
|
+
<span class="cline-any cline-no"> </span>
|
|
1227
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1228
|
+
<span class="cline-any cline-no"> </span>
|
|
1229
|
+
<span class="cline-any cline-no"> </span>
|
|
1230
|
+
<span class="cline-any cline-no"> </span>
|
|
1231
|
+
<span class="cline-any cline-no"> </span>
|
|
1232
|
+
<span class="cline-any cline-no"> </span>
|
|
1233
|
+
<span class="cline-any cline-no"> </span>
|
|
1234
|
+
<span class="cline-any cline-no"> </span>
|
|
1235
|
+
<span class="cline-any cline-no"> </span>
|
|
1236
|
+
<span class="cline-any cline-no"> </span>
|
|
1237
|
+
<span class="cline-any cline-no"> </span>
|
|
1238
|
+
<span class="cline-any cline-no"> </span>
|
|
1239
|
+
<span class="cline-any cline-no"> </span>
|
|
1240
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1241
|
+
<span class="cline-any cline-no"> </span>
|
|
1242
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1243
|
+
<span class="cline-any cline-no"> </span>
|
|
1244
|
+
<span class="cline-any cline-no"> </span>
|
|
1245
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1246
|
+
<span class="cline-any cline-no"> </span>
|
|
1247
|
+
<span class="cline-any cline-no"> </span>
|
|
1248
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1249
|
+
<span class="cline-any cline-no"> </span>
|
|
1250
|
+
<span class="cline-any cline-no"> </span>
|
|
1251
|
+
<span class="cline-any cline-no"> </span>
|
|
1252
|
+
<span class="cline-any cline-no"> </span>
|
|
1253
|
+
<span class="cline-any cline-no"> </span>
|
|
1254
|
+
<span class="cline-any cline-no"> </span>
|
|
1255
|
+
<span class="cline-any cline-no"> </span>
|
|
1256
|
+
<span class="cline-any cline-no"> </span>
|
|
1257
|
+
<span class="cline-any cline-no"> </span>
|
|
1258
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1259
|
+
<span class="cline-any cline-no"> </span>
|
|
1260
|
+
<span class="cline-any cline-no"> </span>
|
|
1261
|
+
<span class="cline-any cline-no"> </span>
|
|
1262
|
+
<span class="cline-any cline-no"> </span>
|
|
1263
|
+
<span class="cline-any cline-no"> </span>
|
|
1264
|
+
<span class="cline-any cline-no"> </span>
|
|
1265
|
+
<span class="cline-any cline-no"> </span>
|
|
1266
|
+
<span class="cline-any cline-no"> </span>
|
|
1267
|
+
<span class="cline-any cline-no"> </span>
|
|
1268
|
+
<span class="cline-any cline-no"> </span>
|
|
1269
|
+
<span class="cline-any cline-no"> </span>
|
|
1270
|
+
<span class="cline-any cline-no"> </span>
|
|
1271
|
+
<span class="cline-any cline-no"> </span>
|
|
1272
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1273
|
+
<span class="cline-any cline-no"> </span>
|
|
1274
|
+
<span class="cline-any cline-no"> </span>
|
|
1275
|
+
<span class="cline-any cline-no"> </span>
|
|
1276
|
+
<span class="cline-any cline-no"> </span>
|
|
1277
|
+
<span class="cline-any cline-no"> </span>
|
|
1278
|
+
<span class="cline-any cline-no"> </span>
|
|
1279
|
+
<span class="cline-any cline-no"> </span>
|
|
1280
|
+
<span class="cline-any cline-no"> </span>
|
|
1281
|
+
<span class="cline-any cline-no"> </span>
|
|
1282
|
+
<span class="cline-any cline-no"> </span>
|
|
1283
|
+
<span class="cline-any cline-no"> </span>
|
|
1284
|
+
<span class="cline-any cline-no"> </span>
|
|
1285
|
+
<span class="cline-any cline-no"> </span>
|
|
1286
|
+
<span class="cline-any cline-no"> </span>
|
|
1287
|
+
<span class="cline-any cline-no"> </span>
|
|
1288
|
+
<span class="cline-any cline-no"> </span>
|
|
1289
|
+
<span class="cline-any cline-no"> </span>
|
|
1290
|
+
<span class="cline-any cline-no"> </span>
|
|
1291
|
+
<span class="cline-any cline-no"> </span>
|
|
1292
|
+
<span class="cline-any cline-no"> </span>
|
|
1293
|
+
<span class="cline-any cline-no"> </span>
|
|
1294
|
+
<span class="cline-any cline-no"> </span>
|
|
1295
|
+
<span class="cline-any cline-no"> </span>
|
|
1296
|
+
<span class="cline-any cline-no"> </span>
|
|
1297
|
+
<span class="cline-any cline-no"> </span>
|
|
1298
|
+
<span class="cline-any cline-no"> </span>
|
|
1299
|
+
<span class="cline-any cline-no"> </span>
|
|
1300
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1301
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1302
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1303
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1304
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1305
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1306
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1307
|
+
<span class="cline-any cline-no"> </span>
|
|
1308
|
+
<span class="cline-any cline-no"> </span>
|
|
1309
|
+
<span class="cline-any cline-no"> </span>
|
|
1310
|
+
<span class="cline-any cline-no"> </span>
|
|
1311
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1312
|
+
<span class="cline-any cline-no"> </span>
|
|
1313
|
+
<span class="cline-any cline-no"> </span>
|
|
1314
|
+
<span class="cline-any cline-no"> </span>
|
|
1315
|
+
<span class="cline-any cline-no"> </span>
|
|
1316
|
+
<span class="cline-any cline-no"> </span>
|
|
1317
|
+
<span class="cline-any cline-no"> </span>
|
|
1318
|
+
<span class="cline-any cline-no"> </span>
|
|
1319
|
+
<span class="cline-any cline-no"> </span>
|
|
1320
|
+
<span class="cline-any cline-no"> </span>
|
|
1321
|
+
<span class="cline-any cline-no"> </span>
|
|
1322
|
+
<span class="cline-any cline-no"> </span>
|
|
1323
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1324
|
+
<span class="cline-any cline-no"> </span>
|
|
1325
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1326
|
+
<span class="cline-any cline-no"> </span>
|
|
1327
|
+
<span class="cline-any cline-no"> </span>
|
|
1328
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1329
|
+
<span class="cline-any cline-no"> </span>
|
|
1330
|
+
<span class="cline-any cline-no"> </span>
|
|
1331
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1332
|
+
<span class="cline-any cline-no"> </span>
|
|
1333
|
+
<span class="cline-any cline-no"> </span>
|
|
1334
|
+
<span class="cline-any cline-no"> </span>
|
|
1335
|
+
<span class="cline-any cline-no"> </span>
|
|
1336
|
+
<span class="cline-any cline-no"> </span>
|
|
1337
|
+
<span class="cline-any cline-no"> </span>
|
|
1338
|
+
<span class="cline-any cline-no"> </span>
|
|
1339
|
+
<span class="cline-any cline-no"> </span>
|
|
1340
|
+
<span class="cline-any cline-no"> </span>
|
|
1341
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1342
|
+
<span class="cline-any cline-no"> </span>
|
|
1343
|
+
<span class="cline-any cline-no"> </span>
|
|
1344
|
+
<span class="cline-any cline-no"> </span>
|
|
1345
|
+
<span class="cline-any cline-no"> </span>
|
|
1346
|
+
<span class="cline-any cline-no"> </span>
|
|
1347
|
+
<span class="cline-any cline-no"> </span>
|
|
1348
|
+
<span class="cline-any cline-no"> </span>
|
|
1349
|
+
<span class="cline-any cline-no"> </span>
|
|
1350
|
+
<span class="cline-any cline-no"> </span>
|
|
1351
|
+
<span class="cline-any cline-no"> </span>
|
|
1352
|
+
<span class="cline-any cline-no"> </span>
|
|
1353
|
+
<span class="cline-any cline-no"> </span>
|
|
1354
|
+
<span class="cline-any cline-no"> </span>
|
|
1355
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1356
|
+
<span class="cline-any cline-no"> </span>
|
|
1357
|
+
<span class="cline-any cline-no"> </span>
|
|
1358
|
+
<span class="cline-any cline-no"> </span>
|
|
1359
|
+
<span class="cline-any cline-no"> </span>
|
|
1360
|
+
<span class="cline-any cline-no"> </span>
|
|
1361
|
+
<span class="cline-any cline-no"> </span>
|
|
1362
|
+
<span class="cline-any cline-no"> </span>
|
|
1363
|
+
<span class="cline-any cline-no"> </span>
|
|
1364
|
+
<span class="cline-any cline-no"> </span>
|
|
1365
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1366
|
+
<span class="cline-any cline-no"> </span>
|
|
1367
|
+
<span class="cline-any cline-no"> </span>
|
|
1368
|
+
<span class="cline-any cline-no"> </span>
|
|
1369
|
+
<span class="cline-any cline-no"> </span>
|
|
1370
|
+
<span class="cline-any cline-no"> </span>
|
|
1371
|
+
<span class="cline-any cline-no"> </span>
|
|
1372
|
+
<span class="cline-any cline-no"> </span>
|
|
1373
|
+
<span class="cline-any cline-no"> </span>
|
|
1374
|
+
<span class="cline-any cline-no"> </span>
|
|
1375
|
+
<span class="cline-any cline-no"> </span>
|
|
1376
|
+
<span class="cline-any cline-no"> </span>
|
|
1377
|
+
<span class="cline-any cline-no"> </span>
|
|
1378
|
+
<span class="cline-any cline-no"> </span>
|
|
1379
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1380
|
+
<span class="cline-any cline-no"> </span>
|
|
1381
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1382
|
+
<span class="cline-any cline-no"> </span>
|
|
1383
|
+
<span class="cline-any cline-no"> </span>
|
|
1384
|
+
<span class="cline-any cline-no"> </span>
|
|
1385
|
+
<span class="cline-any cline-no"> </span>
|
|
1386
|
+
<span class="cline-any cline-no"> </span>
|
|
1387
|
+
<span class="cline-any cline-no"> </span>
|
|
1388
|
+
<span class="cline-any cline-no"> </span>
|
|
1389
|
+
<span class="cline-any cline-no"> </span>
|
|
1390
|
+
<span class="cline-any cline-no"> </span>
|
|
1391
|
+
<span class="cline-any cline-no"> </span>
|
|
1392
|
+
<span class="cline-any cline-no"> </span>
|
|
1393
|
+
<span class="cline-any cline-no"> </span>
|
|
1394
|
+
<span class="cline-any cline-no"> </span>
|
|
1395
|
+
<span class="cline-any cline-no"> </span>
|
|
1396
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1397
|
+
<span class="cline-any cline-no"> </span>
|
|
1398
|
+
<span class="cline-any cline-no"> </span>
|
|
1399
|
+
<span class="cline-any cline-no"> </span>
|
|
1400
|
+
<span class="cline-any cline-no"> </span>
|
|
1401
|
+
<span class="cline-any cline-no"> </span>
|
|
1402
|
+
<span class="cline-any cline-no"> </span>
|
|
1403
|
+
<span class="cline-any cline-no"> </span>
|
|
1404
|
+
<span class="cline-any cline-no"> </span>
|
|
1405
|
+
<span class="cline-any cline-no"> </span>
|
|
1406
|
+
<span class="cline-any cline-no"> </span>
|
|
1407
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1408
|
+
<span class="cline-any cline-no"> </span>
|
|
1409
|
+
<span class="cline-any cline-no"> </span>
|
|
1410
|
+
<span class="cline-any cline-no"> </span>
|
|
1411
|
+
<span class="cline-any cline-no"> </span>
|
|
1412
|
+
<span class="cline-any cline-no"> </span>
|
|
1413
|
+
<span class="cline-any cline-no"> </span>
|
|
1414
|
+
<span class="cline-any cline-no"> </span>
|
|
1415
|
+
<span class="cline-any cline-no"> </span>
|
|
1416
|
+
<span class="cline-any cline-no"> </span>
|
|
1417
|
+
<span class="cline-any cline-no"> </span>
|
|
1418
|
+
<span class="cline-any cline-no"> </span>
|
|
1419
|
+
<span class="cline-any cline-no"> </span>
|
|
1420
|
+
<span class="cline-any cline-no"> </span>
|
|
1421
|
+
<span class="cline-any cline-no"> </span>
|
|
1422
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1423
|
+
<span class="cline-any cline-no"> </span>
|
|
1424
|
+
<span class="cline-any cline-no"> </span>
|
|
1425
|
+
<span class="cline-any cline-no"> </span>
|
|
1426
|
+
<span class="cline-any cline-no"> </span>
|
|
1427
|
+
<span class="cline-any cline-no"> </span>
|
|
1428
|
+
<span class="cline-any cline-no"> </span>
|
|
1429
|
+
<span class="cline-any cline-no"> </span>
|
|
1430
|
+
<span class="cline-any cline-no"> </span>
|
|
1431
|
+
<span class="cline-any cline-no"> </span>
|
|
1432
|
+
<span class="cline-any cline-no"> </span>
|
|
1433
|
+
<span class="cline-any cline-no"> </span>
|
|
1434
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1435
|
+
<span class="cline-any cline-no"> </span>
|
|
1436
|
+
<span class="cline-any cline-no"> </span>
|
|
1437
|
+
<span class="cline-any cline-no"> </span>
|
|
1438
|
+
<span class="cline-any cline-no"> </span>
|
|
1439
|
+
<span class="cline-any cline-no"> </span>
|
|
1440
|
+
<span class="cline-any cline-no"> </span>
|
|
1441
|
+
<span class="cline-any cline-no"> </span>
|
|
1442
|
+
<span class="cline-any cline-no"> </span>
|
|
1443
|
+
<span class="cline-any cline-no"> </span>
|
|
1444
|
+
<span class="cline-any cline-no"> </span>
|
|
1445
|
+
<span class="cline-any cline-no"> </span>
|
|
1446
|
+
<span class="cline-any cline-no"> </span>
|
|
1447
|
+
<span class="cline-any cline-no"> </span>
|
|
1448
|
+
<span class="cline-any cline-no"> </span>
|
|
1449
|
+
<span class="cline-any cline-no"> </span>
|
|
1450
|
+
<span class="cline-any cline-no"> </span>
|
|
1451
|
+
<span class="cline-any cline-no"> </span>
|
|
1452
|
+
<span class="cline-any cline-no"> </span>
|
|
1453
|
+
<span class="cline-any cline-no"> </span>
|
|
1454
|
+
<span class="cline-any cline-no"> </span>
|
|
1455
|
+
<span class="cline-any cline-no"> </span>
|
|
1456
|
+
<span class="cline-any cline-no"> </span>
|
|
1457
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1462
|
+
<span class="cline-any cline-no"> </span>
|
|
1463
|
+
<span class="cline-any cline-no"> </span>
|
|
1464
|
+
<span class="cline-any cline-no"> </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-neutral"> </span>
|
|
1469
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1470
|
+
<span class="cline-any cline-neutral"> </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-neutral"> </span>
|
|
1476
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1477
|
+
<span class="cline-any cline-no"> </span>
|
|
1478
|
+
<span class="cline-any cline-no"> </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-neutral"> </span>
|
|
1484
|
+
<span class="cline-any cline-no"> </span>
|
|
1485
|
+
<span class="cline-any cline-no"> </span>
|
|
1486
|
+
<span class="cline-any cline-no"> </span>
|
|
1487
|
+
<span class="cline-any cline-no"> </span>
|
|
1488
|
+
<span class="cline-any cline-no"> </span>
|
|
1489
|
+
<span class="cline-any cline-no"> </span>
|
|
1490
|
+
<span class="cline-any cline-no"> </span>
|
|
1491
|
+
<span class="cline-any cline-no"> </span>
|
|
1492
|
+
<span class="cline-any cline-no"> </span>
|
|
1493
|
+
<span class="cline-any cline-no"> </span>
|
|
1494
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1495
|
+
<span class="cline-any cline-no"> </span>
|
|
1496
|
+
<span class="cline-any cline-no"> </span>
|
|
1497
|
+
<span class="cline-any cline-no"> </span>
|
|
1498
|
+
<span class="cline-any cline-no"> </span>
|
|
1499
|
+
<span class="cline-any cline-no"> </span>
|
|
1500
|
+
<span class="cline-any cline-no"> </span>
|
|
1501
|
+
<span class="cline-any cline-no"> </span>
|
|
1502
|
+
<span class="cline-any cline-no"> </span>
|
|
1503
|
+
<span class="cline-any cline-no"> </span>
|
|
1504
|
+
<span class="cline-any cline-no"> </span>
|
|
1505
|
+
<span class="cline-any cline-no"> </span>
|
|
1506
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1507
|
+
<span class="cline-any cline-no"> </span>
|
|
1508
|
+
<span class="cline-any cline-no"> </span>
|
|
1509
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1510
|
+
<span class="cline-any cline-no"> </span>
|
|
1511
|
+
<span class="cline-any cline-no"> </span>
|
|
1512
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1513
|
+
<span class="cline-any cline-no"> </span>
|
|
1514
|
+
<span class="cline-any cline-no"> </span>
|
|
1515
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1516
|
+
<span class="cline-any cline-no"> </span>
|
|
1517
|
+
<span class="cline-any cline-no"> </span>
|
|
1518
|
+
<span class="cline-any cline-no"> </span>
|
|
1519
|
+
<span class="cline-any cline-no"> </span>
|
|
1520
|
+
<span class="cline-any cline-no"> </span>
|
|
1521
|
+
<span class="cline-any cline-no"> </span>
|
|
1522
|
+
<span class="cline-any cline-no"> </span>
|
|
1523
|
+
<span class="cline-any cline-no"> </span>
|
|
1524
|
+
<span class="cline-any cline-no"> </span>
|
|
1525
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1526
|
+
<span class="cline-any cline-no"> </span>
|
|
1527
|
+
<span class="cline-any cline-no"> </span>
|
|
1528
|
+
<span class="cline-any cline-no"> </span>
|
|
1529
|
+
<span class="cline-any cline-no"> </span>
|
|
1530
|
+
<span class="cline-any cline-no"> </span>
|
|
1531
|
+
<span class="cline-any cline-no"> </span>
|
|
1532
|
+
<span class="cline-any cline-no"> </span>
|
|
1533
|
+
<span class="cline-any cline-no"> </span>
|
|
1534
|
+
<span class="cline-any cline-no"> </span>
|
|
1535
|
+
<span class="cline-any cline-no"> </span>
|
|
1536
|
+
<span class="cline-any cline-no"> </span>
|
|
1537
|
+
<span class="cline-any cline-no"> </span>
|
|
1538
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1544
|
+
<span class="cline-any cline-no"> </span>
|
|
1545
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1552
|
+
<span class="cline-any cline-no"> </span>
|
|
1553
|
+
<span class="cline-any cline-no"> </span>
|
|
1554
|
+
<span class="cline-any cline-no"> </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-neutral"> </span>
|
|
1559
|
+
<span class="cline-any cline-neutral"> </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-no"> </span>
|
|
1564
|
+
<span class="cline-any cline-no"> </span>
|
|
1565
|
+
<span class="cline-any cline-no"> </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-neutral"> </span>
|
|
1570
|
+
<span class="cline-any cline-no"> </span>
|
|
1571
|
+
<span class="cline-any cline-no"> </span>
|
|
1572
|
+
<span class="cline-any cline-no"> </span>
|
|
1573
|
+
<span class="cline-any cline-no"> </span>
|
|
1574
|
+
<span class="cline-any cline-no"> </span>
|
|
1575
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1576
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1577
|
+
<span class="cline-any cline-no"> </span>
|
|
1578
|
+
<span class="cline-any cline-no"> </span>
|
|
1579
|
+
<span class="cline-any cline-no"> </span>
|
|
1580
|
+
<span class="cline-any cline-no"> </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-neutral"> </span>
|
|
1589
|
+
<span class="cline-any cline-no"> </span>
|
|
1590
|
+
<span class="cline-any cline-no"> </span>
|
|
1591
|
+
<span class="cline-any cline-no"> </span>
|
|
1592
|
+
<span class="cline-any cline-no"> </span>
|
|
1593
|
+
<span class="cline-any cline-no"> </span>
|
|
1594
|
+
<span class="cline-any cline-no"> </span>
|
|
1595
|
+
<span class="cline-any cline-no"> </span>
|
|
1596
|
+
<span class="cline-any cline-no"> </span>
|
|
1597
|
+
<span class="cline-any cline-no"> </span>
|
|
1598
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1599
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1600
|
+
<span class="cline-any cline-no"> </span>
|
|
1601
|
+
<span class="cline-any cline-no"> </span>
|
|
1602
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1603
|
+
<span class="cline-any cline-no"> </span>
|
|
1604
|
+
<span class="cline-any cline-no"> </span>
|
|
1605
|
+
<span class="cline-any cline-no"> </span>
|
|
1606
|
+
<span class="cline-any cline-no"> </span>
|
|
1607
|
+
<span class="cline-any cline-no"> </span>
|
|
1608
|
+
<span class="cline-any cline-no"> </span>
|
|
1609
|
+
<span class="cline-any cline-no"> </span>
|
|
1610
|
+
<span class="cline-any cline-no"> </span>
|
|
1611
|
+
<span class="cline-any cline-no"> </span>
|
|
1612
|
+
<span class="cline-any cline-no"> </span>
|
|
1613
|
+
<span class="cline-any cline-no"> </span>
|
|
1614
|
+
<span class="cline-any cline-no"> </span>
|
|
1615
|
+
<span class="cline-any cline-no"> </span>
|
|
1616
|
+
<span class="cline-any cline-no"> </span>
|
|
1617
|
+
<span class="cline-any cline-no"> </span>
|
|
1618
|
+
<span class="cline-any cline-no"> </span>
|
|
1619
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1624
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1625
|
+
<span class="cline-any cline-no"> </span>
|
|
1626
|
+
<span class="cline-any cline-no"> </span>
|
|
1627
|
+
<span class="cline-any cline-no"> </span>
|
|
1628
|
+
<span class="cline-any cline-no"> </span>
|
|
1629
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1639
|
+
<span class="cline-any cline-no"> </span>
|
|
1640
|
+
<span class="cline-any cline-no"> </span>
|
|
1641
|
+
<span class="cline-any cline-no"> </span>
|
|
1642
|
+
<span class="cline-any cline-no"> </span>
|
|
1643
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1650
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1651
|
+
<span class="cline-any cline-no"> </span>
|
|
1652
|
+
<span class="cline-any cline-no"> </span>
|
|
1653
|
+
<span class="cline-any cline-no"> </span>
|
|
1654
|
+
<span class="cline-any cline-no"> </span>
|
|
1655
|
+
<span class="cline-any cline-no"> </span>
|
|
1656
|
+
<span class="cline-any cline-no"> </span>
|
|
1657
|
+
<span class="cline-any cline-no"> </span>
|
|
1658
|
+
<span class="cline-any cline-no"> </span>
|
|
1659
|
+
<span class="cline-any cline-no"> </span>
|
|
1660
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1661
|
+
<span class="cline-any cline-no"> </span>
|
|
1662
|
+
<span class="cline-any cline-no"> </span>
|
|
1663
|
+
<span class="cline-any cline-no"> </span>
|
|
1664
|
+
<span class="cline-any cline-no"> </span>
|
|
1665
|
+
<span class="cline-any cline-no"> </span>
|
|
1666
|
+
<span class="cline-any cline-no"> </span>
|
|
1667
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1668
|
+
<span class="cline-any cline-no"> </span>
|
|
1669
|
+
<span class="cline-any cline-no"> </span>
|
|
1670
|
+
<span class="cline-any cline-no"> </span>
|
|
1671
|
+
<span class="cline-any cline-no"> </span>
|
|
1672
|
+
<span class="cline-any cline-no"> </span>
|
|
1673
|
+
<span class="cline-any cline-no"> </span>
|
|
1674
|
+
<span class="cline-any cline-no"> </span>
|
|
1675
|
+
<span class="cline-any cline-no"> </span>
|
|
1676
|
+
<span class="cline-any cline-no"> </span>
|
|
1677
|
+
<span class="cline-any cline-no"> </span>
|
|
1678
|
+
<span class="cline-any cline-no"> </span>
|
|
1679
|
+
<span class="cline-any cline-no"> </span>
|
|
1680
|
+
<span class="cline-any cline-no"> </span>
|
|
1681
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1682
|
+
<span class="cline-any cline-no"> </span>
|
|
1683
|
+
<span class="cline-any cline-no"> </span>
|
|
1684
|
+
<span class="cline-any cline-no"> </span>
|
|
1685
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1686
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1687
|
+
<span class="cline-any cline-no"> </span>
|
|
1688
|
+
<span class="cline-any cline-no"> </span>
|
|
1689
|
+
<span class="cline-any cline-no"> </span>
|
|
1690
|
+
<span class="cline-any cline-no"> </span>
|
|
1691
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1696
|
+
<span class="cline-any cline-no"> </span>
|
|
1697
|
+
<span class="cline-any cline-no"> </span>
|
|
1698
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1699
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1700
|
+
<span class="cline-any cline-no"> </span>
|
|
1701
|
+
<span class="cline-any cline-no"> </span>
|
|
1702
|
+
<span class="cline-any cline-no"> </span>
|
|
1703
|
+
<span class="cline-any cline-no"> </span>
|
|
1704
|
+
<span class="cline-any cline-no"> </span>
|
|
1705
|
+
<span class="cline-any cline-no"> </span>
|
|
1706
|
+
<span class="cline-any cline-no"> </span>
|
|
1707
|
+
<span class="cline-any cline-no"> </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-neutral"> </span>
|
|
1716
|
+
<span class="cline-any cline-no"> </span>
|
|
1717
|
+
<span class="cline-any cline-no"> </span>
|
|
1718
|
+
<span class="cline-any cline-no"> </span>
|
|
1719
|
+
<span class="cline-any cline-no"> </span>
|
|
1720
|
+
<span class="cline-any cline-no"> </span>
|
|
1721
|
+
<span class="cline-any cline-no"> </span>
|
|
1722
|
+
<span class="cline-any cline-no"> </span>
|
|
1723
|
+
<span class="cline-any cline-no"> </span>
|
|
1724
|
+
<span class="cline-any cline-no"> </span>
|
|
1725
|
+
<span class="cline-any cline-no"> </span>
|
|
1726
|
+
<span class="cline-any cline-no"> </span>
|
|
1727
|
+
<span class="cline-any cline-no"> </span>
|
|
1728
|
+
<span class="cline-any cline-no"> </span>
|
|
1729
|
+
<span class="cline-any cline-no"> </span>
|
|
1730
|
+
<span class="cline-any cline-no"> </span>
|
|
1731
|
+
<span class="cline-any cline-no"> </span>
|
|
1732
|
+
<span class="cline-any cline-no"> </span>
|
|
1733
|
+
<span class="cline-any cline-no"> </span>
|
|
1734
|
+
<span class="cline-any cline-no"> </span>
|
|
1735
|
+
<span class="cline-any cline-no"> </span>
|
|
1736
|
+
<span class="cline-any cline-no"> </span>
|
|
1737
|
+
<span class="cline-any cline-no"> </span>
|
|
1738
|
+
<span class="cline-any cline-no"> </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-neutral"> </span>
|
|
1746
|
+
<span class="cline-any cline-no"> </span>
|
|
1747
|
+
<span class="cline-any cline-no"> </span>
|
|
1748
|
+
<span class="cline-any cline-no"> </span>
|
|
1749
|
+
<span class="cline-any cline-no"> </span>
|
|
1750
|
+
<span class="cline-any cline-no"> </span>
|
|
1751
|
+
<span class="cline-any cline-no"> </span>
|
|
1752
|
+
<span class="cline-any cline-no"> </span>
|
|
1753
|
+
<span class="cline-any cline-no"> </span>
|
|
1754
|
+
<span class="cline-any cline-no"> </span>
|
|
1755
|
+
<span class="cline-any cline-no"> </span>
|
|
1756
|
+
<span class="cline-any cline-no"> </span>
|
|
1757
|
+
<span class="cline-any cline-no"> </span>
|
|
1758
|
+
<span class="cline-any cline-no"> </span>
|
|
1759
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1766
|
+
<span class="cline-any cline-no"> </span>
|
|
1767
|
+
<span class="cline-any cline-no"> </span>
|
|
1768
|
+
<span class="cline-any cline-no"> </span>
|
|
1769
|
+
<span class="cline-any cline-no"> </span>
|
|
1770
|
+
<span class="cline-any cline-no"> </span>
|
|
1771
|
+
<span class="cline-any cline-no"> </span>
|
|
1772
|
+
<span class="cline-any cline-no"> </span>
|
|
1773
|
+
<span class="cline-any cline-no"> </span>
|
|
1774
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1775
|
+
<span class="cline-any cline-no"> </span>
|
|
1776
|
+
<span class="cline-any cline-no"> </span>
|
|
1777
|
+
<span class="cline-any cline-no"> </span>
|
|
1778
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1785
|
+
<span class="cline-any cline-no"> </span>
|
|
1786
|
+
<span class="cline-any cline-no"> </span>
|
|
1787
|
+
<span class="cline-any cline-no"> </span>
|
|
1788
|
+
<span class="cline-any cline-no"> </span>
|
|
1789
|
+
<span class="cline-any cline-no"> </span>
|
|
1790
|
+
<span class="cline-any cline-no"> </span>
|
|
1791
|
+
<span class="cline-any cline-no"> </span>
|
|
1792
|
+
<span class="cline-any cline-no"> </span>
|
|
1793
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1794
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1795
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1801
|
+
<span class="cline-any cline-no"> </span>
|
|
1802
|
+
<span class="cline-any cline-no"> </span>
|
|
1803
|
+
<span class="cline-any cline-no"> </span>
|
|
1804
|
+
<span class="cline-any cline-no"> </span>
|
|
1805
|
+
<span class="cline-any cline-no"> </span>
|
|
1806
|
+
<span class="cline-any cline-no"> </span>
|
|
1807
|
+
<span class="cline-any cline-no"> </span>
|
|
1808
|
+
<span class="cline-any cline-no"> </span>
|
|
1809
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1814
|
+
<span class="cline-any cline-no"> </span>
|
|
1815
|
+
<span class="cline-any cline-no"> </span>
|
|
1816
|
+
<span class="cline-any cline-no"> </span>
|
|
1817
|
+
<span class="cline-any cline-no"> </span>
|
|
1818
|
+
<span class="cline-any cline-no"> </span>
|
|
1819
|
+
<span class="cline-any cline-no"> </span>
|
|
1820
|
+
<span class="cline-any cline-no"> </span>
|
|
1821
|
+
<span class="cline-any cline-no"> </span>
|
|
1822
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1830
|
+
<span class="cline-any cline-no"> </span>
|
|
1831
|
+
<span class="cline-any cline-no"> </span>
|
|
1832
|
+
<span class="cline-any cline-no"> </span>
|
|
1833
|
+
<span class="cline-any cline-no"> </span>
|
|
1834
|
+
<span class="cline-any cline-no"> </span>
|
|
1835
|
+
<span class="cline-any cline-no"> </span>
|
|
1836
|
+
<span class="cline-any cline-no"> </span>
|
|
1837
|
+
<span class="cline-any cline-no"> </span>
|
|
1838
|
+
<span class="cline-any cline-no"> </span>
|
|
1839
|
+
<span class="cline-any cline-no"> </span>
|
|
1840
|
+
<span class="cline-any cline-no"> </span>
|
|
1841
|
+
<span class="cline-any cline-no"> </span>
|
|
1842
|
+
<span class="cline-any cline-no"> </span>
|
|
1843
|
+
<span class="cline-any cline-no"> </span>
|
|
1844
|
+
<span class="cline-any cline-no"> </span>
|
|
1845
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1846
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1847
|
+
<span class="cline-any cline-no"> </span>
|
|
1848
|
+
<span class="cline-any cline-no"> </span>
|
|
1849
|
+
<span class="cline-any cline-no"> </span>
|
|
1850
|
+
<span class="cline-any cline-no"> </span>
|
|
1851
|
+
<span class="cline-any cline-no"> </span>
|
|
1852
|
+
<span class="cline-any cline-no"> </span>
|
|
1853
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1858
|
+
<span class="cline-any cline-no"> </span>
|
|
1859
|
+
<span class="cline-any cline-no"> </span>
|
|
1860
|
+
<span class="cline-any cline-no"> </span>
|
|
1861
|
+
<span class="cline-any cline-no"> </span>
|
|
1862
|
+
<span class="cline-any cline-no"> </span>
|
|
1863
|
+
<span class="cline-any cline-no"> </span>
|
|
1864
|
+
<span class="cline-any cline-no"> </span>
|
|
1865
|
+
<span class="cline-any cline-no"> </span>
|
|
1866
|
+
<span class="cline-any cline-no"> </span>
|
|
1867
|
+
<span class="cline-any cline-no"> </span>
|
|
1868
|
+
<span class="cline-any cline-no"> </span>
|
|
1869
|
+
<span class="cline-any cline-no"> </span>
|
|
1870
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1871
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1872
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1873
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1874
|
+
<span class="cline-any cline-no"> </span>
|
|
1875
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1876
|
+
<span class="cline-any cline-no"> </span>
|
|
1877
|
+
<span class="cline-any cline-no"> </span>
|
|
1878
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">// Copyright 2021-2025 Prosopo (UK) Ltd.
|
|
1879
|
+
//
|
|
1880
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
1881
|
+
// you may not use this file except in compliance with the License.
|
|
1882
|
+
// You may obtain a copy of the License at
|
|
1883
|
+
//
|
|
1884
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
1885
|
+
//
|
|
1886
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
1887
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
1888
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1889
|
+
// See the License for the specific language governing permissions and
|
|
1890
|
+
// limitations under the License.
|
|
1891
|
+
|
|
1892
|
+
<span class="cstat-no" title="statement not covered" >import { handleErrors } from "@prosopo/api-express-router";</span>
|
|
1893
|
+
<span class="cstat-no" title="statement not covered" >import { ProsopoApiError } from "@prosopo/common";</span>
|
|
1894
|
+
<span class="cstat-no" title="statement not covered" >import { parseCaptchaAssets } from "@prosopo/datasets";</span>
|
|
1895
|
+
<span class="cstat-no" title="statement not covered" >import {</span>
|
|
1896
|
+
ApiParams,
|
|
1897
|
+
type Captcha,
|
|
1898
|
+
CaptchaRequestBody,
|
|
1899
|
+
type CaptchaRequestBodyTypeOutput,
|
|
1900
|
+
type CaptchaResponseBody,
|
|
1901
|
+
CaptchaSolutionBody,
|
|
1902
|
+
type CaptchaSolutionBodyType,
|
|
1903
|
+
type CaptchaSolutionResponse,
|
|
1904
|
+
CaptchaType,
|
|
1905
|
+
ClientApiPaths,
|
|
1906
|
+
type DappUserSolutionResult,
|
|
1907
|
+
GetFrictionlessCaptchaChallengeRequestBody,
|
|
1908
|
+
GetPowCaptchaChallengeRequestBody,
|
|
1909
|
+
type GetPowCaptchaChallengeRequestBodyTypeOutput,
|
|
1910
|
+
type GetPowCaptchaResponse,
|
|
1911
|
+
type PowCaptchaSolutionResponse,
|
|
1912
|
+
type ProsopoCaptchaCountConfigSchemaOutput,
|
|
1913
|
+
SubmitPowCaptchaSolutionBody,
|
|
1914
|
+
type SubmitPowCaptchaSolutionBodyTypeOutput,
|
|
1915
|
+
} from "@prosopo/types";
|
|
1916
|
+
import type { ProviderEnvironment } from "@prosopo/types-env";
|
|
1917
|
+
<span class="cstat-no" title="statement not covered" >import { flatten, getIPAddress } from "@prosopo/util";</span>
|
|
1918
|
+
<span class="cstat-no" title="statement not covered" >import express, { type Router } from "express";</span>
|
|
1919
|
+
<span class="cstat-no" title="statement not covered" >import { getCompositeIpAddress } from "../compositeIpAddress.js";</span>
|
|
1920
|
+
<span class="cstat-no" title="statement not covered" >import { FrictionlessManager } from "../tasks/frictionless/frictionlessTasks.js";</span>
|
|
1921
|
+
<span class="cstat-no" title="statement not covered" >import { timestampDecayFunction } from "../tasks/frictionless/frictionlessTasksUtils.js";</span>
|
|
1922
|
+
<span class="cstat-no" title="statement not covered" >import { Tasks } from "../tasks/tasks.js";</span>
|
|
1923
|
+
<span class="cstat-no" title="statement not covered" >import { hashUserAgent } from "../utils/hashUserAgent.js";</span>
|
|
1924
|
+
<span class="cstat-no" title="statement not covered" >import { getMaintenanceMode } from "./admin/apiToggleMaintenanceModeEndpoint.js";</span>
|
|
1925
|
+
<span class="cstat-no" title="statement not covered" >import { getRequestUserScope } from "./blacklistRequestInspector.js";</span>
|
|
1926
|
+
<span class="cstat-no" title="statement not covered" >import { validateAddr, validateSiteKey } from "./validateAddress.js";</span>
|
|
1927
|
+
|
|
1928
|
+
<span class="cstat-no" title="statement not covered" >const DEFAULT_FRICTIONLESS_THRESHOLD = 0.5;</span>
|
|
1929
|
+
|
|
1930
|
+
/**
|
|
1931
|
+
* Returns a router connected to the database which can interact with the Proposo protocol
|
|
1932
|
+
*
|
|
1933
|
+
* @return {Router} - A middleware router that can interact with the Prosopo protocol
|
|
1934
|
+
* @param {ProviderEnvironment} env - The Prosopo environment
|
|
1935
|
+
*/
|
|
1936
|
+
<span class="cstat-no" title="statement not covered" >export function prosopoRouter(env: ProviderEnvironment): Router {</span>
|
|
1937
|
+
<span class="cstat-no" title="statement not covered" > const router = express.Router();</span>
|
|
1938
|
+
|
|
1939
|
+
<span class="cstat-no" title="statement not covered" > const userAccessRulesStorage = env.getDb().getUserAccessRulesStorage();</span>
|
|
1940
|
+
|
|
1941
|
+
/**
|
|
1942
|
+
* Provides a Captcha puzzle to a Dapp User
|
|
1943
|
+
* @param {string} datasetId - Provider datasetId
|
|
1944
|
+
* @param {string} userAccount - Dapp User AccountId
|
|
1945
|
+
* @return {Captcha} - The Captcha data
|
|
1946
|
+
*/
|
|
1947
|
+
<span class="cstat-no" title="statement not covered" > router.post(</span>
|
|
1948
|
+
<span class="cstat-no" title="statement not covered" > ClientApiPaths.GetImageCaptchaChallenge,</span>
|
|
1949
|
+
<span class="cstat-no" title="statement not covered" > async (req, res, next) => {</span>
|
|
1950
|
+
<span class="cstat-no" title="statement not covered" > const tasks = new Tasks(env, req.logger);</span>
|
|
1951
|
+
<span class="cstat-no" title="statement not covered" > let parsed: CaptchaRequestBodyTypeOutput;</span>
|
|
1952
|
+
|
|
1953
|
+
<span class="cstat-no" title="statement not covered" > if (!req.ip) {</span>
|
|
1954
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
1955
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError("API.BAD_REQUEST", {</span>
|
|
1956
|
+
<span class="cstat-no" title="statement not covered" > context: { code: 400, error: "IP address not found" },</span>
|
|
1957
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
1958
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
1959
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
1960
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1961
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1962
|
+
|
|
1963
|
+
<span class="cstat-no" title="statement not covered" > const ipAddress = getIPAddress(req.ip || "");</span>
|
|
1964
|
+
|
|
1965
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1966
|
+
<span class="cstat-no" title="statement not covered" > parsed = CaptchaRequestBody.parse(req.body);</span>
|
|
1967
|
+
<span class="cstat-no" title="statement not covered" > } catch (err) {</span>
|
|
1968
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
1969
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError("CAPTCHA.PARSE_ERROR", {</span>
|
|
1970
|
+
<span class="cstat-no" title="statement not covered" > context: { code: 400, error: err },</span>
|
|
1971
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
1972
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
1973
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
1974
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1975
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1976
|
+
|
|
1977
|
+
<span class="cstat-no" title="statement not covered" > const { datasetId, user, dapp, sessionId } = parsed;</span>
|
|
1978
|
+
|
|
1979
|
+
<span class="cstat-no" title="statement not covered" > validateSiteKey(dapp);</span>
|
|
1980
|
+
<span class="cstat-no" title="statement not covered" > validateAddr(user);</span>
|
|
1981
|
+
|
|
1982
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1983
|
+
<span class="cstat-no" title="statement not covered" > const clientRecord = await tasks.db.getClientRecord(dapp);</span>
|
|
1984
|
+
|
|
1985
|
+
<span class="cstat-no" title="statement not covered" > if (!clientRecord) {</span>
|
|
1986
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
1987
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {</span>
|
|
1988
|
+
<span class="cstat-no" title="statement not covered" > context: { code: 400, siteKey: dapp },</span>
|
|
1989
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
1990
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
1991
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
1992
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1993
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1994
|
+
|
|
1995
|
+
<span class="cstat-no" title="statement not covered" > const userScope = getRequestUserScope(</span>
|
|
1996
|
+
<span class="cstat-no" title="statement not covered" > flatten(req.headers),</span>
|
|
1997
|
+
<span class="cstat-no" title="statement not covered" > req.ja4,</span>
|
|
1998
|
+
<span class="cstat-no" title="statement not covered" > req.ip,</span>
|
|
1999
|
+
<span class="cstat-no" title="statement not covered" > user,</span>
|
|
2000
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2001
|
+
<span class="cstat-no" title="statement not covered" > const userAccessPolicy = (</span>
|
|
2002
|
+
<span class="cstat-no" title="statement not covered" > await tasks.imgCaptchaManager.getPrioritisedAccessPolicies(</span>
|
|
2003
|
+
<span class="cstat-no" title="statement not covered" > userAccessRulesStorage,</span>
|
|
2004
|
+
<span class="cstat-no" title="statement not covered" > dapp,</span>
|
|
2005
|
+
<span class="cstat-no" title="statement not covered" > userScope,</span>
|
|
2006
|
+
<span class="cstat-no" title="statement not covered" > )</span>
|
|
2007
|
+
<span class="cstat-no" title="statement not covered" > )[0];</span>
|
|
2008
|
+
|
|
2009
|
+
<span class="cstat-no" title="statement not covered" > const { valid, reason, frictionlessTokenId, solvedImagesCount } =</span>
|
|
2010
|
+
<span class="cstat-no" title="statement not covered" > await tasks.imgCaptchaManager.isValidRequest(</span>
|
|
2011
|
+
<span class="cstat-no" title="statement not covered" > clientRecord,</span>
|
|
2012
|
+
<span class="cstat-no" title="statement not covered" > CaptchaType.image,</span>
|
|
2013
|
+
<span class="cstat-no" title="statement not covered" > env,</span>
|
|
2014
|
+
<span class="cstat-no" title="statement not covered" > sessionId,</span>
|
|
2015
|
+
<span class="cstat-no" title="statement not covered" > userAccessPolicy,</span>
|
|
2016
|
+
<span class="cstat-no" title="statement not covered" > req.ip,</span>
|
|
2017
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2018
|
+
|
|
2019
|
+
<span class="cstat-no" title="statement not covered" > if (!valid) {</span>
|
|
2020
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
2021
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError(reason || "API.BAD_REQUEST", {</span>
|
|
2022
|
+
<span class="cstat-no" title="statement not covered" > context: {</span>
|
|
2023
|
+
<span class="cstat-no" title="statement not covered" > code: 400,</span>
|
|
2024
|
+
<span class="cstat-no" title="statement not covered" > siteKey: dapp,</span>
|
|
2025
|
+
<span class="cstat-no" title="statement not covered" > user,</span>
|
|
2026
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2027
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
2028
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
2029
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
2030
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2031
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2032
|
+
|
|
2033
|
+
<span class="cstat-no" title="statement not covered" > const captchaConfig: ProsopoCaptchaCountConfigSchemaOutput = {</span>
|
|
2034
|
+
<span class="cstat-no" title="statement not covered" > solved: {</span>
|
|
2035
|
+
<span class="cstat-no" title="statement not covered" > count:</span>
|
|
2036
|
+
<span class="cstat-no" title="statement not covered" > solvedImagesCount ||</span>
|
|
2037
|
+
<span class="cstat-no" title="statement not covered" > userAccessPolicy?.solvedImagesCount ||</span>
|
|
2038
|
+
<span class="cstat-no" title="statement not covered" > env.config.captchas.solved.count,</span>
|
|
2039
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2040
|
+
<span class="cstat-no" title="statement not covered" > unsolved: {</span>
|
|
2041
|
+
<span class="cstat-no" title="statement not covered" > count:</span>
|
|
2042
|
+
<span class="cstat-no" title="statement not covered" > userAccessPolicy?.unsolvedImagesCount ||</span>
|
|
2043
|
+
<span class="cstat-no" title="statement not covered" > env.config.captchas.unsolved.count,</span>
|
|
2044
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2045
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2046
|
+
|
|
2047
|
+
<span class="cstat-no" title="statement not covered" > const taskData =</span>
|
|
2048
|
+
<span class="cstat-no" title="statement not covered" > await tasks.imgCaptchaManager.getRandomCaptchasAndRequestHash(</span>
|
|
2049
|
+
<span class="cstat-no" title="statement not covered" > datasetId,</span>
|
|
2050
|
+
<span class="cstat-no" title="statement not covered" > user,</span>
|
|
2051
|
+
<span class="cstat-no" title="statement not covered" > ipAddress,</span>
|
|
2052
|
+
<span class="cstat-no" title="statement not covered" > captchaConfig,</span>
|
|
2053
|
+
<span class="cstat-no" title="statement not covered" > clientRecord.settings.imageThreshold ?? 0.8,</span>
|
|
2054
|
+
<span class="cstat-no" title="statement not covered" > frictionlessTokenId,</span>
|
|
2055
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2056
|
+
<span class="cstat-no" title="statement not covered" > const captchaResponse: CaptchaResponseBody = {</span>
|
|
2057
|
+
<span class="cstat-no" title="statement not covered" > [ApiParams.status]: "ok",</span>
|
|
2058
|
+
<span class="cstat-no" title="statement not covered" > [ApiParams.captchas]: taskData.captchas.map((captcha: Captcha) => ({</span>
|
|
2059
|
+
<span class="cstat-no" title="statement not covered" > ...captcha,</span>
|
|
2060
|
+
<span class="cstat-no" title="statement not covered" > target: req.t(`TARGET.${captcha.target}`),</span>
|
|
2061
|
+
<span class="cstat-no" title="statement not covered" > items: captcha.items.map((item) =></span>
|
|
2062
|
+
<span class="cstat-no" title="statement not covered" > parseCaptchaAssets(item, env.assetsResolver),</span>
|
|
2063
|
+
<span class="cstat-no" title="statement not covered" > ),</span>
|
|
2064
|
+
<span class="cstat-no" title="statement not covered" > })),</span>
|
|
2065
|
+
<span class="cstat-no" title="statement not covered" > [ApiParams.requestHash]: taskData.requestHash,</span>
|
|
2066
|
+
<span class="cstat-no" title="statement not covered" > [ApiParams.timestamp]: taskData.timestamp.toString(),</span>
|
|
2067
|
+
<span class="cstat-no" title="statement not covered" > [ApiParams.signature]: {</span>
|
|
2068
|
+
<span class="cstat-no" title="statement not covered" > [ApiParams.provider]: {</span>
|
|
2069
|
+
<span class="cstat-no" title="statement not covered" > [ApiParams.requestHash]: taskData.signedRequestHash,</span>
|
|
2070
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2071
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2072
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2073
|
+
<span class="cstat-no" title="statement not covered" > req.logger.info(() => ({</span>
|
|
2074
|
+
<span class="cstat-no" title="statement not covered" > msg: "Image captcha challenge issued",</span>
|
|
2075
|
+
<span class="cstat-no" title="statement not covered" > data: {</span>
|
|
2076
|
+
<span class="cstat-no" title="statement not covered" > captchaType: CaptchaType.image,</span>
|
|
2077
|
+
<span class="cstat-no" title="statement not covered" > requestHash: taskData.requestHash,</span>
|
|
2078
|
+
<span class="cstat-no" title="statement not covered" > solvedImagesCount: captchaConfig.solved.count,</span>
|
|
2079
|
+
<span class="cstat-no" title="statement not covered" > user,</span>
|
|
2080
|
+
<span class="cstat-no" title="statement not covered" > dapp,</span>
|
|
2081
|
+
<span class="cstat-no" title="statement not covered" > sessionId,</span>
|
|
2082
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2083
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
2084
|
+
<span class="cstat-no" title="statement not covered" > return res.json(captchaResponse);</span>
|
|
2085
|
+
<span class="cstat-no" title="statement not covered" > } catch (err) {</span>
|
|
2086
|
+
<span class="cstat-no" title="statement not covered" > req.logger.error(() => ({</span>
|
|
2087
|
+
<span class="cstat-no" title="statement not covered" > err,</span>
|
|
2088
|
+
<span class="cstat-no" title="statement not covered" > data: req.params,</span>
|
|
2089
|
+
<span class="cstat-no" title="statement not covered" > msg: "Error in image captcha challenge request",</span>
|
|
2090
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
2091
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
2092
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError("API.BAD_REQUEST", {</span>
|
|
2093
|
+
<span class="cstat-no" title="statement not covered" > context: {</span>
|
|
2094
|
+
<span class="cstat-no" title="statement not covered" > error: err,</span>
|
|
2095
|
+
|
|
2096
|
+
<span class="cstat-no" title="statement not covered" > code: 500,</span>
|
|
2097
|
+
<span class="cstat-no" title="statement not covered" > params: req.params,</span>
|
|
2098
|
+
<span class="cstat-no" title="statement not covered" > context: err,</span>
|
|
2099
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2100
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
2101
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
2102
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
2103
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2104
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2105
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2106
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2107
|
+
|
|
2108
|
+
/**
|
|
2109
|
+
* Receives solved CAPTCHA challenges from the user, stores to database, and checks against solution commitment
|
|
2110
|
+
*
|
|
2111
|
+
* @param {string} userAccount - Dapp User id
|
|
2112
|
+
* @param {string} dappAccount - Dapp Contract AccountId
|
|
2113
|
+
* @param {Captcha[]} captchas - The Captcha solutions
|
|
2114
|
+
* @return {DappUserSolutionResult} - The Captcha solution result and proof
|
|
2115
|
+
*/
|
|
2116
|
+
<span class="cstat-no" title="statement not covered" > router.post(</span>
|
|
2117
|
+
<span class="cstat-no" title="statement not covered" > ClientApiPaths.SubmitImageCaptchaSolution,</span>
|
|
2118
|
+
<span class="cstat-no" title="statement not covered" > async (req, res, next) => {</span>
|
|
2119
|
+
<span class="cstat-no" title="statement not covered" > const tasks = new Tasks(env, req.logger);</span>
|
|
2120
|
+
|
|
2121
|
+
// If in maintenance mode, always return verified
|
|
2122
|
+
<span class="cstat-no" title="statement not covered" > if (getMaintenanceMode()) {</span>
|
|
2123
|
+
<span class="cstat-no" title="statement not covered" > req.logger.info(() => ({</span>
|
|
2124
|
+
<span class="cstat-no" title="statement not covered" > msg: "Maintenance mode active - returning verified for image captcha",</span>
|
|
2125
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
2126
|
+
<span class="cstat-no" title="statement not covered" > const result: CaptchaSolutionResponse = {</span>
|
|
2127
|
+
<span class="cstat-no" title="statement not covered" > status: "ok",</span>
|
|
2128
|
+
<span class="cstat-no" title="statement not covered" > captchas: [],</span>
|
|
2129
|
+
<span class="cstat-no" title="statement not covered" > verified: true,</span>
|
|
2130
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2131
|
+
<span class="cstat-no" title="statement not covered" > return res.json(result);</span>
|
|
2132
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2133
|
+
|
|
2134
|
+
<span class="cstat-no" title="statement not covered" > let parsed: CaptchaSolutionBodyType;</span>
|
|
2135
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2136
|
+
<span class="cstat-no" title="statement not covered" > parsed = CaptchaSolutionBody.parse(req.body);</span>
|
|
2137
|
+
<span class="cstat-no" title="statement not covered" > } catch (err) {</span>
|
|
2138
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
2139
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError("CAPTCHA.PARSE_ERROR", {</span>
|
|
2140
|
+
<span class="cstat-no" title="statement not covered" > context: { code: 400, error: err, body: req.body },</span>
|
|
2141
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
2142
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
2143
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
2144
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2145
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2146
|
+
|
|
2147
|
+
<span class="cstat-no" title="statement not covered" > const { user, dapp } = parsed;</span>
|
|
2148
|
+
|
|
2149
|
+
<span class="cstat-no" title="statement not covered" > validateSiteKey(dapp);</span>
|
|
2150
|
+
<span class="cstat-no" title="statement not covered" > validateAddr(user);</span>
|
|
2151
|
+
|
|
2152
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2153
|
+
<span class="cstat-no" title="statement not covered" > const clientRecord = await tasks.db.getClientRecord(parsed.dapp);</span>
|
|
2154
|
+
|
|
2155
|
+
<span class="cstat-no" title="statement not covered" > if (!clientRecord) {</span>
|
|
2156
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
2157
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {</span>
|
|
2158
|
+
<span class="cstat-no" title="statement not covered" > context: { code: 400, siteKey: dapp },</span>
|
|
2159
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
2160
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
2161
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
2162
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2163
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2164
|
+
|
|
2165
|
+
<span class="cstat-no" title="statement not covered" > const result: DappUserSolutionResult =</span>
|
|
2166
|
+
<span class="cstat-no" title="statement not covered" > await tasks.imgCaptchaManager.dappUserSolution(</span>
|
|
2167
|
+
<span class="cstat-no" title="statement not covered" > user,</span>
|
|
2168
|
+
<span class="cstat-no" title="statement not covered" > dapp,</span>
|
|
2169
|
+
<span class="cstat-no" title="statement not covered" > parsed[ApiParams.requestHash],</span>
|
|
2170
|
+
<span class="cstat-no" title="statement not covered" > parsed[ApiParams.captchas],</span>
|
|
2171
|
+
<span class="cstat-no" title="statement not covered" > parsed[ApiParams.signature].user.timestamp,</span>
|
|
2172
|
+
<span class="cstat-no" title="statement not covered" > Number.parseInt(parsed[ApiParams.timestamp]),</span>
|
|
2173
|
+
<span class="cstat-no" title="statement not covered" > parsed[ApiParams.signature].provider.requestHash,</span>
|
|
2174
|
+
<span class="cstat-no" title="statement not covered" > getIPAddress(req.ip || ""),</span>
|
|
2175
|
+
<span class="cstat-no" title="statement not covered" > flatten(req.headers),</span>
|
|
2176
|
+
<span class="cstat-no" title="statement not covered" > req.ja4,</span>
|
|
2177
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2178
|
+
|
|
2179
|
+
<span class="cstat-no" title="statement not covered" > const returnValue: CaptchaSolutionResponse = {</span>
|
|
2180
|
+
<span class="cstat-no" title="statement not covered" > status: req.i18n.t(</span>
|
|
2181
|
+
<span class="cstat-no" title="statement not covered" > result.verified ? "API.CAPTCHA_PASSED" : "API.CAPTCHA_FAILED",</span>
|
|
2182
|
+
<span class="cstat-no" title="statement not covered" > ),</span>
|
|
2183
|
+
<span class="cstat-no" title="statement not covered" > ...result,</span>
|
|
2184
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2185
|
+
<span class="cstat-no" title="statement not covered" > return res.json(returnValue);</span>
|
|
2186
|
+
<span class="cstat-no" title="statement not covered" > } catch (err) {</span>
|
|
2187
|
+
<span class="cstat-no" title="statement not covered" > req.logger.error(() => ({</span>
|
|
2188
|
+
<span class="cstat-no" title="statement not covered" > err,</span>
|
|
2189
|
+
<span class="cstat-no" title="statement not covered" > body: req.body,</span>
|
|
2190
|
+
<span class="cstat-no" title="statement not covered" > msg: "Error in image captcha solution submission",</span>
|
|
2191
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
2192
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
2193
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError("API.BAD_REQUEST", {</span>
|
|
2194
|
+
<span class="cstat-no" title="statement not covered" > context: {</span>
|
|
2195
|
+
<span class="cstat-no" title="statement not covered" > code: 500,</span>
|
|
2196
|
+
<span class="cstat-no" title="statement not covered" > siteKey: req.body.dapp,</span>
|
|
2197
|
+
<span class="cstat-no" title="statement not covered" > error: err,</span>
|
|
2198
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2199
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
2200
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
2201
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
2202
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2203
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2204
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2205
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2206
|
+
|
|
2207
|
+
/**
|
|
2208
|
+
* Supplies a PoW challenge to a Dapp User
|
|
2209
|
+
*
|
|
2210
|
+
* @param {string} userAccount - User address
|
|
2211
|
+
* @param {string} dappAccount - Dapp address
|
|
2212
|
+
*/
|
|
2213
|
+
<span class="cstat-no" title="statement not covered" > router.post(ClientApiPaths.GetPowCaptchaChallenge, async (req, res, next) => {</span>
|
|
2214
|
+
<span class="cstat-no" title="statement not covered" > let parsed: GetPowCaptchaChallengeRequestBodyTypeOutput;</span>
|
|
2215
|
+
<span class="cstat-no" title="statement not covered" > const tasks = new Tasks(env);</span>
|
|
2216
|
+
<span class="cstat-no" title="statement not covered" > tasks.setLogger(req.logger);</span>
|
|
2217
|
+
|
|
2218
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2219
|
+
<span class="cstat-no" title="statement not covered" > parsed = GetPowCaptchaChallengeRequestBody.parse(req.body);</span>
|
|
2220
|
+
<span class="cstat-no" title="statement not covered" > } catch (err) {</span>
|
|
2221
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
2222
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError("CAPTCHA.PARSE_ERROR", {</span>
|
|
2223
|
+
<span class="cstat-no" title="statement not covered" > context: { code: 400, error: err },</span>
|
|
2224
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
2225
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
2226
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
2227
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2228
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2229
|
+
|
|
2230
|
+
<span class="cstat-no" title="statement not covered" > const { user, dapp, sessionId } = parsed;</span>
|
|
2231
|
+
|
|
2232
|
+
<span class="cstat-no" title="statement not covered" > validateSiteKey(dapp);</span>
|
|
2233
|
+
<span class="cstat-no" title="statement not covered" > validateAddr(user);</span>
|
|
2234
|
+
|
|
2235
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2236
|
+
<span class="cstat-no" title="statement not covered" > const clientSettings = await tasks.db.getClientRecord(dapp);</span>
|
|
2237
|
+
|
|
2238
|
+
<span class="cstat-no" title="statement not covered" > if (!clientSettings) {</span>
|
|
2239
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
2240
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {</span>
|
|
2241
|
+
<span class="cstat-no" title="statement not covered" > context: { code: 400, siteKey: dapp },</span>
|
|
2242
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
2243
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
2244
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
2245
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2246
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2247
|
+
|
|
2248
|
+
<span class="cstat-no" title="statement not covered" > const userScope = getRequestUserScope(</span>
|
|
2249
|
+
<span class="cstat-no" title="statement not covered" > flatten(req.headers),</span>
|
|
2250
|
+
<span class="cstat-no" title="statement not covered" > req.ja4,</span>
|
|
2251
|
+
<span class="cstat-no" title="statement not covered" > req.ip,</span>
|
|
2252
|
+
<span class="cstat-no" title="statement not covered" > user,</span>
|
|
2253
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2254
|
+
<span class="cstat-no" title="statement not covered" > const userAccessPolicy = (</span>
|
|
2255
|
+
<span class="cstat-no" title="statement not covered" > await tasks.powCaptchaManager.getPrioritisedAccessPolicies(</span>
|
|
2256
|
+
<span class="cstat-no" title="statement not covered" > userAccessRulesStorage,</span>
|
|
2257
|
+
<span class="cstat-no" title="statement not covered" > dapp,</span>
|
|
2258
|
+
<span class="cstat-no" title="statement not covered" > userScope,</span>
|
|
2259
|
+
<span class="cstat-no" title="statement not covered" > )</span>
|
|
2260
|
+
<span class="cstat-no" title="statement not covered" > )[0];</span>
|
|
2261
|
+
|
|
2262
|
+
<span class="cstat-no" title="statement not covered" > const { valid, reason, frictionlessTokenId, powDifficulty } =</span>
|
|
2263
|
+
<span class="cstat-no" title="statement not covered" > await tasks.powCaptchaManager.isValidRequest(</span>
|
|
2264
|
+
<span class="cstat-no" title="statement not covered" > clientSettings,</span>
|
|
2265
|
+
<span class="cstat-no" title="statement not covered" > CaptchaType.pow,</span>
|
|
2266
|
+
<span class="cstat-no" title="statement not covered" > env,</span>
|
|
2267
|
+
<span class="cstat-no" title="statement not covered" > sessionId,</span>
|
|
2268
|
+
<span class="cstat-no" title="statement not covered" > userAccessPolicy,</span>
|
|
2269
|
+
<span class="cstat-no" title="statement not covered" > req.ip,</span>
|
|
2270
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2271
|
+
|
|
2272
|
+
<span class="cstat-no" title="statement not covered" > if (!valid) {</span>
|
|
2273
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
2274
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError(reason || "API.BAD_REQUEST", {</span>
|
|
2275
|
+
<span class="cstat-no" title="statement not covered" > context: {</span>
|
|
2276
|
+
<span class="cstat-no" title="statement not covered" > code: 400,</span>
|
|
2277
|
+
<span class="cstat-no" title="statement not covered" > siteKey: dapp,</span>
|
|
2278
|
+
<span class="cstat-no" title="statement not covered" > user,</span>
|
|
2279
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2280
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
2281
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
2282
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
2283
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2284
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2285
|
+
|
|
2286
|
+
<span class="cstat-no" title="statement not covered" > const origin = req.headers.origin;</span>
|
|
2287
|
+
|
|
2288
|
+
<span class="cstat-no" title="statement not covered" > if (!origin) {</span>
|
|
2289
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
2290
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError("API.BAD_REQUEST", {</span>
|
|
2291
|
+
<span class="cstat-no" title="statement not covered" > context: {</span>
|
|
2292
|
+
<span class="cstat-no" title="statement not covered" > error: "Origin header not found",</span>
|
|
2293
|
+
<span class="cstat-no" title="statement not covered" > code: 400,</span>
|
|
2294
|
+
<span class="cstat-no" title="statement not covered" > siteKey: dapp,</span>
|
|
2295
|
+
<span class="cstat-no" title="statement not covered" > user,</span>
|
|
2296
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2297
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
2298
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
2299
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
2300
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2301
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2302
|
+
|
|
2303
|
+
<span class="cstat-no" title="statement not covered" > const difficulty =</span>
|
|
2304
|
+
<span class="cstat-no" title="statement not covered" > powDifficulty ||</span>
|
|
2305
|
+
<span class="cstat-no" title="statement not covered" > userAccessPolicy?.powDifficulty ||</span>
|
|
2306
|
+
<span class="cstat-no" title="statement not covered" > clientSettings?.settings?.powDifficulty;</span>
|
|
2307
|
+
<span class="cstat-no" title="statement not covered" > const challenge = await tasks.powCaptchaManager.getPowCaptchaChallenge(</span>
|
|
2308
|
+
<span class="cstat-no" title="statement not covered" > user,</span>
|
|
2309
|
+
<span class="cstat-no" title="statement not covered" > dapp,</span>
|
|
2310
|
+
<span class="cstat-no" title="statement not covered" > origin,</span>
|
|
2311
|
+
<span class="cstat-no" title="statement not covered" > difficulty,</span>
|
|
2312
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2313
|
+
|
|
2314
|
+
<span class="cstat-no" title="statement not covered" > await tasks.db.storePowCaptchaRecord(</span>
|
|
2315
|
+
<span class="cstat-no" title="statement not covered" > challenge.challenge,</span>
|
|
2316
|
+
<span class="cstat-no" title="statement not covered" > {</span>
|
|
2317
|
+
<span class="cstat-no" title="statement not covered" > requestedAtTimestamp: challenge.requestedAtTimestamp,</span>
|
|
2318
|
+
<span class="cstat-no" title="statement not covered" > userAccount: user,</span>
|
|
2319
|
+
<span class="cstat-no" title="statement not covered" > dappAccount: dapp,</span>
|
|
2320
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2321
|
+
<span class="cstat-no" title="statement not covered" > challenge.difficulty,</span>
|
|
2322
|
+
<span class="cstat-no" title="statement not covered" > challenge.providerSignature,</span>
|
|
2323
|
+
<span class="cstat-no" title="statement not covered" > getCompositeIpAddress(req.ip || ""),</span>
|
|
2324
|
+
<span class="cstat-no" title="statement not covered" > flatten(req.headers),</span>
|
|
2325
|
+
<span class="cstat-no" title="statement not covered" > req.ja4,</span>
|
|
2326
|
+
<span class="cstat-no" title="statement not covered" > frictionlessTokenId,</span>
|
|
2327
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2328
|
+
|
|
2329
|
+
<span class="cstat-no" title="statement not covered" > const getPowCaptchaResponse: GetPowCaptchaResponse = {</span>
|
|
2330
|
+
<span class="cstat-no" title="statement not covered" > [ApiParams.status]: "ok",</span>
|
|
2331
|
+
<span class="cstat-no" title="statement not covered" > [ApiParams.challenge]: challenge.challenge,</span>
|
|
2332
|
+
<span class="cstat-no" title="statement not covered" > [ApiParams.difficulty]: challenge.difficulty,</span>
|
|
2333
|
+
<span class="cstat-no" title="statement not covered" > [ApiParams.timestamp]: challenge.requestedAtTimestamp.toString(),</span>
|
|
2334
|
+
<span class="cstat-no" title="statement not covered" > [ApiParams.signature]: {</span>
|
|
2335
|
+
<span class="cstat-no" title="statement not covered" > [ApiParams.provider]: {</span>
|
|
2336
|
+
<span class="cstat-no" title="statement not covered" > [ApiParams.challenge]: challenge.providerSignature,</span>
|
|
2337
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2338
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2339
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2340
|
+
|
|
2341
|
+
<span class="cstat-no" title="statement not covered" > req.logger.info(() => ({</span>
|
|
2342
|
+
<span class="cstat-no" title="statement not covered" > msg: "PoW captcha challenge issued",</span>
|
|
2343
|
+
<span class="cstat-no" title="statement not covered" > data: {</span>
|
|
2344
|
+
<span class="cstat-no" title="statement not covered" > captchaType: CaptchaType.pow,</span>
|
|
2345
|
+
<span class="cstat-no" title="statement not covered" > challenge: challenge.challenge,</span>
|
|
2346
|
+
<span class="cstat-no" title="statement not covered" > difficulty: challenge.difficulty,</span>
|
|
2347
|
+
<span class="cstat-no" title="statement not covered" > user,</span>
|
|
2348
|
+
<span class="cstat-no" title="statement not covered" > dapp,</span>
|
|
2349
|
+
<span class="cstat-no" title="statement not covered" > session: sessionId,</span>
|
|
2350
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2351
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
2352
|
+
<span class="cstat-no" title="statement not covered" > return res.json(getPowCaptchaResponse);</span>
|
|
2353
|
+
<span class="cstat-no" title="statement not covered" > } catch (err) {</span>
|
|
2354
|
+
<span class="cstat-no" title="statement not covered" > req.logger.error(() => ({</span>
|
|
2355
|
+
<span class="cstat-no" title="statement not covered" > err,</span>
|
|
2356
|
+
<span class="cstat-no" title="statement not covered" > body: req.body,</span>
|
|
2357
|
+
<span class="cstat-no" title="statement not covered" > msg: "Error in PoW captcha challenge request",</span>
|
|
2358
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
2359
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
2360
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError("API.BAD_REQUEST", {</span>
|
|
2361
|
+
<span class="cstat-no" title="statement not covered" > context: {</span>
|
|
2362
|
+
<span class="cstat-no" title="statement not covered" > code: 500,</span>
|
|
2363
|
+
<span class="cstat-no" title="statement not covered" > siteKey: req.body.dapp,</span>
|
|
2364
|
+
<span class="cstat-no" title="statement not covered" > user: req.body.user,</span>
|
|
2365
|
+
<span class="cstat-no" title="statement not covered" > error: err,</span>
|
|
2366
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2367
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
2368
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
2369
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
2370
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2371
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2372
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2373
|
+
|
|
2374
|
+
/**
|
|
2375
|
+
* Verifies a user's PoW solution as being approved or not
|
|
2376
|
+
*
|
|
2377
|
+
* @param {string} challenge - the challenge string
|
|
2378
|
+
* @param {number} difficulty - the difficulty of the challenge
|
|
2379
|
+
* @param {string} signature - the signature of the challenge
|
|
2380
|
+
* @param {string} nonce - the nonce of the challenge
|
|
2381
|
+
* @param {number} verifiedTimeout - the valid length of captcha solution in ms
|
|
2382
|
+
*/
|
|
2383
|
+
<span class="cstat-no" title="statement not covered" > router.post(</span>
|
|
2384
|
+
<span class="cstat-no" title="statement not covered" > ClientApiPaths.SubmitPowCaptchaSolution,</span>
|
|
2385
|
+
<span class="cstat-no" title="statement not covered" > async (req, res, next) => {</span>
|
|
2386
|
+
<span class="cstat-no" title="statement not covered" > let parsed: SubmitPowCaptchaSolutionBodyTypeOutput;</span>
|
|
2387
|
+
<span class="cstat-no" title="statement not covered" > const tasks = new Tasks(env, req.logger);</span>
|
|
2388
|
+
|
|
2389
|
+
// If in maintenance mode, always return verified
|
|
2390
|
+
<span class="cstat-no" title="statement not covered" > if (getMaintenanceMode()) {</span>
|
|
2391
|
+
<span class="cstat-no" title="statement not covered" > req.logger.info(() => ({</span>
|
|
2392
|
+
<span class="cstat-no" title="statement not covered" > msg: "Maintenance mode active - returning verified",</span>
|
|
2393
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
2394
|
+
<span class="cstat-no" title="statement not covered" > const response: PowCaptchaSolutionResponse = {</span>
|
|
2395
|
+
<span class="cstat-no" title="statement not covered" > status: "ok",</span>
|
|
2396
|
+
<span class="cstat-no" title="statement not covered" > verified: true,</span>
|
|
2397
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2398
|
+
<span class="cstat-no" title="statement not covered" > return res.json(response);</span>
|
|
2399
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2400
|
+
|
|
2401
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2402
|
+
<span class="cstat-no" title="statement not covered" > parsed = SubmitPowCaptchaSolutionBody.parse(req.body);</span>
|
|
2403
|
+
<span class="cstat-no" title="statement not covered" > } catch (err) {</span>
|
|
2404
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
2405
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError("CAPTCHA.PARSE_ERROR", {</span>
|
|
2406
|
+
<span class="cstat-no" title="statement not covered" > context: { code: 400, error: err, body: req.body },</span>
|
|
2407
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
2408
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
2409
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
2410
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2411
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2412
|
+
|
|
2413
|
+
<span class="cstat-no" title="statement not covered" > const { challenge, signature, nonce, verifiedTimeout, dapp, user } =</span>
|
|
2414
|
+
<span class="cstat-no" title="statement not covered" > parsed;</span>
|
|
2415
|
+
|
|
2416
|
+
<span class="cstat-no" title="statement not covered" > validateSiteKey(dapp);</span>
|
|
2417
|
+
<span class="cstat-no" title="statement not covered" > validateAddr(user);</span>
|
|
2418
|
+
|
|
2419
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2420
|
+
<span class="cstat-no" title="statement not covered" > const clientRecord = await tasks.db.getClientRecord(dapp);</span>
|
|
2421
|
+
|
|
2422
|
+
<span class="cstat-no" title="statement not covered" > if (!clientRecord) {</span>
|
|
2423
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
2424
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {</span>
|
|
2425
|
+
<span class="cstat-no" title="statement not covered" > context: { code: 400, siteKey: dapp },</span>
|
|
2426
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
2427
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
2428
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
2429
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2430
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2431
|
+
|
|
2432
|
+
<span class="cstat-no" title="statement not covered" > const verified = await tasks.powCaptchaManager.verifyPowCaptchaSolution(</span>
|
|
2433
|
+
<span class="cstat-no" title="statement not covered" > challenge,</span>
|
|
2434
|
+
<span class="cstat-no" title="statement not covered" > signature.provider.challenge,</span>
|
|
2435
|
+
<span class="cstat-no" title="statement not covered" > nonce,</span>
|
|
2436
|
+
<span class="cstat-no" title="statement not covered" > verifiedTimeout,</span>
|
|
2437
|
+
<span class="cstat-no" title="statement not covered" > signature.user.timestamp,</span>
|
|
2438
|
+
<span class="cstat-no" title="statement not covered" > getIPAddress(req.ip || ""),</span>
|
|
2439
|
+
<span class="cstat-no" title="statement not covered" > flatten(req.headers),</span>
|
|
2440
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2441
|
+
<span class="cstat-no" title="statement not covered" > const response: PowCaptchaSolutionResponse = { status: "ok", verified };</span>
|
|
2442
|
+
<span class="cstat-no" title="statement not covered" > return res.json(response);</span>
|
|
2443
|
+
<span class="cstat-no" title="statement not covered" > } catch (err) {</span>
|
|
2444
|
+
<span class="cstat-no" title="statement not covered" > req.logger.error(() => ({</span>
|
|
2445
|
+
<span class="cstat-no" title="statement not covered" > err,</span>
|
|
2446
|
+
<span class="cstat-no" title="statement not covered" > body: req.body,</span>
|
|
2447
|
+
<span class="cstat-no" title="statement not covered" > msg: "Error in PoW captcha solution submission",</span>
|
|
2448
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
2449
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
2450
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError("API.BAD_REQUEST", {</span>
|
|
2451
|
+
<span class="cstat-no" title="statement not covered" > context: {</span>
|
|
2452
|
+
<span class="cstat-no" title="statement not covered" > code: 500,</span>
|
|
2453
|
+
<span class="cstat-no" title="statement not covered" > siteKey: req.body.dapp,</span>
|
|
2454
|
+
<span class="cstat-no" title="statement not covered" > error: err,</span>
|
|
2455
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2456
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
2457
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
2458
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
2459
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2460
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2461
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2462
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2463
|
+
|
|
2464
|
+
/**
|
|
2465
|
+
* Gets a frictionless captcha challenge
|
|
2466
|
+
*/
|
|
2467
|
+
<span class="cstat-no" title="statement not covered" > router.post(</span>
|
|
2468
|
+
<span class="cstat-no" title="statement not covered" > ClientApiPaths.GetFrictionlessCaptchaChallenge,</span>
|
|
2469
|
+
<span class="cstat-no" title="statement not covered" > async (req, res, next) => {</span>
|
|
2470
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2471
|
+
<span class="cstat-no" title="statement not covered" > const tasks = new Tasks(env, req.logger);</span>
|
|
2472
|
+
<span class="cstat-no" title="statement not covered" > const { token, dapp, user } =</span>
|
|
2473
|
+
<span class="cstat-no" title="statement not covered" > GetFrictionlessCaptchaChallengeRequestBody.parse(req.body);</span>
|
|
2474
|
+
|
|
2475
|
+
// If in maintenance mode, store dummy token and send PoW captcha
|
|
2476
|
+
<span class="cstat-no" title="statement not covered" > if (getMaintenanceMode()) {</span>
|
|
2477
|
+
<span class="cstat-no" title="statement not covered" > req.logger.info(() => ({</span>
|
|
2478
|
+
<span class="cstat-no" title="statement not covered" > msg: "Maintenance mode active - storing dummy token and sending PoW captcha",</span>
|
|
2479
|
+
<span class="cstat-no" title="statement not covered" > data: { dapp, user },</span>
|
|
2480
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
2481
|
+
|
|
2482
|
+
// Store a dummy frictionless token record
|
|
2483
|
+
<span class="cstat-no" title="statement not covered" > const tokenId = await tasks.db.storeFrictionlessTokenRecord({</span>
|
|
2484
|
+
<span class="cstat-no" title="statement not covered" > token,</span>
|
|
2485
|
+
<span class="cstat-no" title="statement not covered" > score: 0,</span>
|
|
2486
|
+
<span class="cstat-no" title="statement not covered" > threshold: 0.5,</span>
|
|
2487
|
+
<span class="cstat-no" title="statement not covered" > scoreComponents: {</span>
|
|
2488
|
+
<span class="cstat-no" title="statement not covered" > baseScore: 0,</span>
|
|
2489
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2490
|
+
<span class="cstat-no" title="statement not covered" > providerSelectEntropy: 0,</span>
|
|
2491
|
+
<span class="cstat-no" title="statement not covered" > ipAddress: getCompositeIpAddress(req.ip || ""),</span>
|
|
2492
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2493
|
+
|
|
2494
|
+
// Send PoW captcha
|
|
2495
|
+
<span class="cstat-no" title="statement not covered" > return res.json(</span>
|
|
2496
|
+
<span class="cstat-no" title="statement not covered" > await tasks.frictionlessManager.sendPowCaptcha(</span>
|
|
2497
|
+
<span class="cstat-no" title="statement not covered" > tokenId,</span>
|
|
2498
|
+
<span class="cstat-no" title="statement not covered" > undefined,</span>
|
|
2499
|
+
<span class="cstat-no" title="statement not covered" > false,</span>
|
|
2500
|
+
<span class="cstat-no" title="statement not covered" > false,</span>
|
|
2501
|
+
<span class="cstat-no" title="statement not covered" > ),</span>
|
|
2502
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2503
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2504
|
+
|
|
2505
|
+
// Check if the token has already been used
|
|
2506
|
+
<span class="cstat-no" title="statement not covered" > const existingToken =</span>
|
|
2507
|
+
<span class="cstat-no" title="statement not covered" > await tasks.db.getFrictionlessTokenRecordByToken(token);</span>
|
|
2508
|
+
|
|
2509
|
+
<span class="cstat-no" title="statement not covered" > if (existingToken) {</span>
|
|
2510
|
+
<span class="cstat-no" title="statement not covered" > req.logger.info(() => ({</span>
|
|
2511
|
+
<span class="cstat-no" title="statement not covered" > token: existingToken,</span>
|
|
2512
|
+
<span class="cstat-no" title="statement not covered" > msg: "Token has already been used",</span>
|
|
2513
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
2514
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
2515
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError("API.BAD_REQUEST", {</span>
|
|
2516
|
+
<span class="cstat-no" title="statement not covered" > context: {</span>
|
|
2517
|
+
<span class="cstat-no" title="statement not covered" > code: 400,</span>
|
|
2518
|
+
<span class="cstat-no" title="statement not covered" > siteKey: dapp,</span>
|
|
2519
|
+
<span class="cstat-no" title="statement not covered" > user,</span>
|
|
2520
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2521
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
2522
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
2523
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
2524
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2525
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2526
|
+
|
|
2527
|
+
<span class="cstat-no" title="statement not covered" > const lScore = tasks.frictionlessManager.checkLangRules(</span>
|
|
2528
|
+
<span class="cstat-no" title="statement not covered" > req.headers["accept-language"] || "",</span>
|
|
2529
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2530
|
+
|
|
2531
|
+
<span class="cstat-no" title="statement not covered" > const {</span>
|
|
2532
|
+
<span class="cstat-no" title="statement not covered" > baseBotScore,</span>
|
|
2533
|
+
<span class="cstat-no" title="statement not covered" > timestamp,</span>
|
|
2534
|
+
<span class="cstat-no" title="statement not covered" > providerSelectEntropy,</span>
|
|
2535
|
+
<span class="cstat-no" title="statement not covered" > userId,</span>
|
|
2536
|
+
<span class="cstat-no" title="statement not covered" > userAgent,</span>
|
|
2537
|
+
<span class="cstat-no" title="statement not covered" > webView,</span>
|
|
2538
|
+
<span class="cstat-no" title="statement not covered" > iFrame,</span>
|
|
2539
|
+
<span class="cstat-no" title="statement not covered" > } = await tasks.frictionlessManager.decryptPayload(token);</span>
|
|
2540
|
+
|
|
2541
|
+
<span class="cstat-no" title="statement not covered" > req.logger.debug(() => ({</span>
|
|
2542
|
+
<span class="cstat-no" title="statement not covered" > msg: "Decrypted payload",</span>
|
|
2543
|
+
<span class="cstat-no" title="statement not covered" > data: {</span>
|
|
2544
|
+
<span class="cstat-no" title="statement not covered" > baseBotScore,</span>
|
|
2545
|
+
<span class="cstat-no" title="statement not covered" > timestamp,</span>
|
|
2546
|
+
<span class="cstat-no" title="statement not covered" > providerSelectEntropy,</span>
|
|
2547
|
+
<span class="cstat-no" title="statement not covered" > userId,</span>
|
|
2548
|
+
<span class="cstat-no" title="statement not covered" > userAgent,</span>
|
|
2549
|
+
<span class="cstat-no" title="statement not covered" > webView,</span>
|
|
2550
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2551
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
2552
|
+
|
|
2553
|
+
<span class="cstat-no" title="statement not covered" > let botScore = baseBotScore + lScore;</span>
|
|
2554
|
+
|
|
2555
|
+
<span class="cstat-no" title="statement not covered" > const clientRecord = await tasks.db.getClientRecord(dapp);</span>
|
|
2556
|
+
|
|
2557
|
+
<span class="cstat-no" title="statement not covered" > if (!clientRecord) {</span>
|
|
2558
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
2559
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError("API.SITE_KEY_NOT_REGISTERED", {</span>
|
|
2560
|
+
<span class="cstat-no" title="statement not covered" > context: { code: 400, siteKey: dapp },</span>
|
|
2561
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
2562
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
2563
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
2564
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2565
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2566
|
+
|
|
2567
|
+
<span class="cstat-no" title="statement not covered" > const { valid, reason } =</span>
|
|
2568
|
+
<span class="cstat-no" title="statement not covered" > await tasks.frictionlessManager.isValidRequest(</span>
|
|
2569
|
+
<span class="cstat-no" title="statement not covered" > clientRecord,</span>
|
|
2570
|
+
<span class="cstat-no" title="statement not covered" > CaptchaType.frictionless,</span>
|
|
2571
|
+
<span class="cstat-no" title="statement not covered" > env,</span>
|
|
2572
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2573
|
+
|
|
2574
|
+
<span class="cstat-no" title="statement not covered" > if (!valid) {</span>
|
|
2575
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
2576
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError(reason || "API.BAD_REQUEST", {</span>
|
|
2577
|
+
<span class="cstat-no" title="statement not covered" > context: {</span>
|
|
2578
|
+
<span class="cstat-no" title="statement not covered" > code: 400,</span>
|
|
2579
|
+
<span class="cstat-no" title="statement not covered" > siteKey: dapp,</span>
|
|
2580
|
+
<span class="cstat-no" title="statement not covered" > user,</span>
|
|
2581
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2582
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
2583
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
2584
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
2585
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2586
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2587
|
+
|
|
2588
|
+
<span class="cstat-no" title="statement not covered" > const botThreshold =</span>
|
|
2589
|
+
<span class="cstat-no" title="statement not covered" > clientRecord.settings?.frictionlessThreshold ||</span>
|
|
2590
|
+
<span class="cstat-no" title="statement not covered" > DEFAULT_FRICTIONLESS_THRESHOLD;</span>
|
|
2591
|
+
|
|
2592
|
+
// Store the token
|
|
2593
|
+
<span class="cstat-no" title="statement not covered" > const tokenId = await tasks.db.storeFrictionlessTokenRecord({</span>
|
|
2594
|
+
<span class="cstat-no" title="statement not covered" > token,</span>
|
|
2595
|
+
<span class="cstat-no" title="statement not covered" > score: botScore,</span>
|
|
2596
|
+
<span class="cstat-no" title="statement not covered" > threshold: botThreshold,</span>
|
|
2597
|
+
<span class="cstat-no" title="statement not covered" > scoreComponents: {</span>
|
|
2598
|
+
<span class="cstat-no" title="statement not covered" > baseScore: baseBotScore,</span>
|
|
2599
|
+
<span class="cstat-no" title="statement not covered" > ...(lScore && { lScore }),</span>
|
|
2600
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2601
|
+
<span class="cstat-no" title="statement not covered" > providerSelectEntropy,</span>
|
|
2602
|
+
<span class="cstat-no" title="statement not covered" > ipAddress: getCompositeIpAddress(req.ip || ""),</span>
|
|
2603
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2604
|
+
|
|
2605
|
+
// Check if the IP address is blocked
|
|
2606
|
+
<span class="cstat-no" title="statement not covered" > const userScope = getRequestUserScope(</span>
|
|
2607
|
+
<span class="cstat-no" title="statement not covered" > flatten(req.headers),</span>
|
|
2608
|
+
<span class="cstat-no" title="statement not covered" > req.ja4,</span>
|
|
2609
|
+
<span class="cstat-no" title="statement not covered" > req.ip,</span>
|
|
2610
|
+
<span class="cstat-no" title="statement not covered" > user,</span>
|
|
2611
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2612
|
+
<span class="cstat-no" title="statement not covered" > const userAccessPolicy = (</span>
|
|
2613
|
+
<span class="cstat-no" title="statement not covered" > await tasks.frictionlessManager.getPrioritisedAccessPolicies(</span>
|
|
2614
|
+
<span class="cstat-no" title="statement not covered" > userAccessRulesStorage,</span>
|
|
2615
|
+
<span class="cstat-no" title="statement not covered" > dapp,</span>
|
|
2616
|
+
<span class="cstat-no" title="statement not covered" > userScope,</span>
|
|
2617
|
+
<span class="cstat-no" title="statement not covered" > )</span>
|
|
2618
|
+
<span class="cstat-no" title="statement not covered" > )[0];</span>
|
|
2619
|
+
|
|
2620
|
+
// Check the user agent in token and user id in request match request
|
|
2621
|
+
// Hash the request user agent to compare with the hashed user agent from the token
|
|
2622
|
+
<span class="cstat-no" title="statement not covered" > const headersUserAgent = req.headers["user-agent"];</span>
|
|
2623
|
+
<span class="cstat-no" title="statement not covered" > const hashedHeadersUserAgent = headersUserAgent</span>
|
|
2624
|
+
<span class="cstat-no" title="statement not covered" > ? hashUserAgent(headersUserAgent)</span>
|
|
2625
|
+
<span class="cstat-no" title="statement not covered" > : "";</span>
|
|
2626
|
+
<span class="cstat-no" title="statement not covered" > const headersProsopoUser = req.headers["prosopo-user"];</span>
|
|
2627
|
+
<span class="cstat-no" title="statement not covered" > if (</span>
|
|
2628
|
+
<span class="cstat-no" title="statement not covered" > hashedHeadersUserAgent !== userAgent ||</span>
|
|
2629
|
+
<span class="cstat-no" title="statement not covered" > headersProsopoUser !== userId</span>
|
|
2630
|
+
<span class="cstat-no" title="statement not covered" > ) {</span>
|
|
2631
|
+
<span class="cstat-no" title="statement not covered" > req.logger.info(() => ({</span>
|
|
2632
|
+
<span class="cstat-no" title="statement not covered" > msg: "User agent or user id does not match",</span>
|
|
2633
|
+
<span class="cstat-no" title="statement not covered" > data: {</span>
|
|
2634
|
+
<span class="cstat-no" title="statement not covered" > headersUserAgent,</span>
|
|
2635
|
+
<span class="cstat-no" title="statement not covered" > hashedHeadersUserAgent,</span>
|
|
2636
|
+
<span class="cstat-no" title="statement not covered" > userAgent: userAgent, // This is the hashed user agent from the token</span>
|
|
2637
|
+
<span class="cstat-no" title="statement not covered" > headersProsopoUser,</span>
|
|
2638
|
+
<span class="cstat-no" title="statement not covered" > userId,</span>
|
|
2639
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2640
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
2641
|
+
<span class="cstat-no" title="statement not covered" > return res.json(</span>
|
|
2642
|
+
<span class="cstat-no" title="statement not covered" > await tasks.frictionlessManager.sendImageCaptcha(</span>
|
|
2643
|
+
<span class="cstat-no" title="statement not covered" > tokenId,</span>
|
|
2644
|
+
<span class="cstat-no" title="statement not covered" > timestampDecayFunction(timestamp),</span>
|
|
2645
|
+
<span class="cstat-no" title="statement not covered" > webView,</span>
|
|
2646
|
+
<span class="cstat-no" title="statement not covered" > iFrame,</span>
|
|
2647
|
+
<span class="cstat-no" title="statement not covered" > ),</span>
|
|
2648
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2649
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2650
|
+
|
|
2651
|
+
// If the user or IP address has an image captcha config defined, send an image captcha
|
|
2652
|
+
<span class="cstat-no" title="statement not covered" > if (userAccessPolicy) {</span>
|
|
2653
|
+
<span class="cstat-no" title="statement not covered" > await tasks.frictionlessManager.scoreIncreaseAccessPolicy(</span>
|
|
2654
|
+
<span class="cstat-no" title="statement not covered" > userAccessPolicy,</span>
|
|
2655
|
+
<span class="cstat-no" title="statement not covered" > baseBotScore,</span>
|
|
2656
|
+
<span class="cstat-no" title="statement not covered" > botScore,</span>
|
|
2657
|
+
<span class="cstat-no" title="statement not covered" > tokenId,</span>
|
|
2658
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2659
|
+
<span class="cstat-no" title="statement not covered" > if (userAccessPolicy.captchaType === CaptchaType.image) {</span>
|
|
2660
|
+
<span class="cstat-no" title="statement not covered" > return res.json(</span>
|
|
2661
|
+
<span class="cstat-no" title="statement not covered" > await tasks.frictionlessManager.sendImageCaptcha(</span>
|
|
2662
|
+
<span class="cstat-no" title="statement not covered" > tokenId,</span>
|
|
2663
|
+
<span class="cstat-no" title="statement not covered" > userAccessPolicy.solvedImagesCount,</span>
|
|
2664
|
+
<span class="cstat-no" title="statement not covered" > webView,</span>
|
|
2665
|
+
<span class="cstat-no" title="statement not covered" > iFrame,</span>
|
|
2666
|
+
<span class="cstat-no" title="statement not covered" > ),</span>
|
|
2667
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2668
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2669
|
+
<span class="cstat-no" title="statement not covered" > if (userAccessPolicy.captchaType === CaptchaType.pow) {</span>
|
|
2670
|
+
<span class="cstat-no" title="statement not covered" > return res.json(</span>
|
|
2671
|
+
<span class="cstat-no" title="statement not covered" > await tasks.frictionlessManager.sendPowCaptcha(</span>
|
|
2672
|
+
<span class="cstat-no" title="statement not covered" > tokenId,</span>
|
|
2673
|
+
<span class="cstat-no" title="statement not covered" > undefined,</span>
|
|
2674
|
+
<span class="cstat-no" title="statement not covered" > webView,</span>
|
|
2675
|
+
<span class="cstat-no" title="statement not covered" > iFrame,</span>
|
|
2676
|
+
<span class="cstat-no" title="statement not covered" > ),</span>
|
|
2677
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2678
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2679
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2680
|
+
|
|
2681
|
+
<span class="cstat-no" title="statement not covered" > if (clientRecord.settings.disallowWebView && webView) {</span>
|
|
2682
|
+
<span class="cstat-no" title="statement not covered" > tasks.logger.info(() => ({</span>
|
|
2683
|
+
<span class="cstat-no" title="statement not covered" > msg: "WebView detected",</span>
|
|
2684
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
2685
|
+
<span class="cstat-no" title="statement not covered" > botScore = await tasks.frictionlessManager.scoreIncreaseWebView(</span>
|
|
2686
|
+
<span class="cstat-no" title="statement not covered" > baseBotScore,</span>
|
|
2687
|
+
<span class="cstat-no" title="statement not covered" > botScore,</span>
|
|
2688
|
+
<span class="cstat-no" title="statement not covered" > tokenId,</span>
|
|
2689
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2690
|
+
<span class="cstat-no" title="statement not covered" > return res.json(</span>
|
|
2691
|
+
<span class="cstat-no" title="statement not covered" > await tasks.frictionlessManager.sendImageCaptcha(</span>
|
|
2692
|
+
<span class="cstat-no" title="statement not covered" > tokenId,</span>
|
|
2693
|
+
<span class="cstat-no" title="statement not covered" > env.config.captchas.solved.count * 2,</span>
|
|
2694
|
+
<span class="cstat-no" title="statement not covered" > webView,</span>
|
|
2695
|
+
<span class="cstat-no" title="statement not covered" > iFrame,</span>
|
|
2696
|
+
<span class="cstat-no" title="statement not covered" > ),</span>
|
|
2697
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2698
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2699
|
+
|
|
2700
|
+
// If the timestamp is older than 10 minutes, send an image captcha
|
|
2701
|
+
<span class="cstat-no" title="statement not covered" > if (FrictionlessManager.timestampTooOld(timestamp)) {</span>
|
|
2702
|
+
<span class="cstat-no" title="statement not covered" > await tasks.frictionlessManager.scoreIncreaseTimestamp(</span>
|
|
2703
|
+
<span class="cstat-no" title="statement not covered" > timestamp,</span>
|
|
2704
|
+
<span class="cstat-no" title="statement not covered" > baseBotScore,</span>
|
|
2705
|
+
<span class="cstat-no" title="statement not covered" > botScore,</span>
|
|
2706
|
+
<span class="cstat-no" title="statement not covered" > tokenId,</span>
|
|
2707
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2708
|
+
<span class="cstat-no" title="statement not covered" > return res.json(</span>
|
|
2709
|
+
<span class="cstat-no" title="statement not covered" > await tasks.frictionlessManager.sendImageCaptcha(</span>
|
|
2710
|
+
<span class="cstat-no" title="statement not covered" > tokenId,</span>
|
|
2711
|
+
<span class="cstat-no" title="statement not covered" > timestampDecayFunction(timestamp),</span>
|
|
2712
|
+
<span class="cstat-no" title="statement not covered" > webView,</span>
|
|
2713
|
+
<span class="cstat-no" title="statement not covered" > iFrame,</span>
|
|
2714
|
+
<span class="cstat-no" title="statement not covered" > ),</span>
|
|
2715
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2716
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2717
|
+
|
|
2718
|
+
// If the host is not verified, send an image captcha
|
|
2719
|
+
<span class="cstat-no" title="statement not covered" > const hostVerified = await tasks.frictionlessManager.hostVerified(</span>
|
|
2720
|
+
<span class="cstat-no" title="statement not covered" > providerSelectEntropy,</span>
|
|
2721
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2722
|
+
<span class="cstat-no" title="statement not covered" > if (!hostVerified.verified) {</span>
|
|
2723
|
+
<span class="cstat-no" title="statement not covered" > botScore =</span>
|
|
2724
|
+
<span class="cstat-no" title="statement not covered" > await tasks.frictionlessManager.scoreIncreaseUnverifiedHost(</span>
|
|
2725
|
+
<span class="cstat-no" title="statement not covered" > hostVerified.domain,</span>
|
|
2726
|
+
<span class="cstat-no" title="statement not covered" > baseBotScore,</span>
|
|
2727
|
+
<span class="cstat-no" title="statement not covered" > botScore,</span>
|
|
2728
|
+
<span class="cstat-no" title="statement not covered" > tokenId,</span>
|
|
2729
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2730
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2731
|
+
|
|
2732
|
+
// If the bot score is greater than the threshold, send an image captcha
|
|
2733
|
+
<span class="cstat-no" title="statement not covered" > if (Number(botScore) > botThreshold) {</span>
|
|
2734
|
+
<span class="cstat-no" title="statement not covered" > req.logger.info(() => ({</span>
|
|
2735
|
+
<span class="cstat-no" title="statement not covered" > msg: "Bot score is greater than threshold",</span>
|
|
2736
|
+
<span class="cstat-no" title="statement not covered" > data: {</span>
|
|
2737
|
+
<span class="cstat-no" title="statement not covered" > botScore,</span>
|
|
2738
|
+
<span class="cstat-no" title="statement not covered" > botThreshold,</span>
|
|
2739
|
+
<span class="cstat-no" title="statement not covered" > tokenId,</span>
|
|
2740
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2741
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
2742
|
+
<span class="cstat-no" title="statement not covered" > return res.json(</span>
|
|
2743
|
+
<span class="cstat-no" title="statement not covered" > await tasks.frictionlessManager.sendImageCaptcha(</span>
|
|
2744
|
+
<span class="cstat-no" title="statement not covered" > tokenId,</span>
|
|
2745
|
+
<span class="cstat-no" title="statement not covered" > env.config.captchas.solved.count,</span>
|
|
2746
|
+
<span class="cstat-no" title="statement not covered" > webView,</span>
|
|
2747
|
+
<span class="cstat-no" title="statement not covered" > iFrame,</span>
|
|
2748
|
+
<span class="cstat-no" title="statement not covered" > ),</span>
|
|
2749
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2750
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2751
|
+
|
|
2752
|
+
// Otherwise, send a PoW captcha
|
|
2753
|
+
<span class="cstat-no" title="statement not covered" > return res.json(</span>
|
|
2754
|
+
<span class="cstat-no" title="statement not covered" > await tasks.frictionlessManager.sendPowCaptcha(</span>
|
|
2755
|
+
<span class="cstat-no" title="statement not covered" > tokenId,</span>
|
|
2756
|
+
<span class="cstat-no" title="statement not covered" > undefined,</span>
|
|
2757
|
+
<span class="cstat-no" title="statement not covered" > webView,</span>
|
|
2758
|
+
<span class="cstat-no" title="statement not covered" > iFrame,</span>
|
|
2759
|
+
<span class="cstat-no" title="statement not covered" > ),</span>
|
|
2760
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2761
|
+
<span class="cstat-no" title="statement not covered" > } catch (err) {</span>
|
|
2762
|
+
<span class="cstat-no" title="statement not covered" > req.logger.error(() => ({</span>
|
|
2763
|
+
<span class="cstat-no" title="statement not covered" > err,</span>
|
|
2764
|
+
<span class="cstat-no" title="statement not covered" > msg: "Error in frictionless captcha challenge",</span>
|
|
2765
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
2766
|
+
<span class="cstat-no" title="statement not covered" > return next(</span>
|
|
2767
|
+
<span class="cstat-no" title="statement not covered" > new ProsopoApiError("API.BAD_REQUEST", {</span>
|
|
2768
|
+
<span class="cstat-no" title="statement not covered" > context: { code: 400, error: err },</span>
|
|
2769
|
+
<span class="cstat-no" title="statement not covered" > i18n: req.i18n,</span>
|
|
2770
|
+
<span class="cstat-no" title="statement not covered" > logger: req.logger,</span>
|
|
2771
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
2772
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2773
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2774
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2775
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2776
|
+
|
|
2777
|
+
// Your error handler should always be at the end of your application stack. Apparently it means not only after all
|
|
2778
|
+
// app.use() but also after all your app.get() and app.post() calls.
|
|
2779
|
+
// https://stackoverflow.com/a/62358794/1178971
|
|
2780
|
+
<span class="cstat-no" title="statement not covered" > router.use(handleErrors);</span>
|
|
2781
|
+
|
|
2782
|
+
<span class="cstat-no" title="statement not covered" > return router;</span>
|
|
2783
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
2784
|
+
</pre></td></tr></table></pre>
|
|
2785
|
+
|
|
2786
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
2787
|
+
</div><!-- /wrapper -->
|
|
2788
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
2789
|
+
Code coverage generated by
|
|
2790
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
2791
|
+
at 2025-10-22T12:32:26.285Z
|
|
2792
|
+
</div>
|
|
2793
|
+
<script src="../../prettify.js"></script>
|
|
2794
|
+
<script>
|
|
2795
|
+
window.onload = function () {
|
|
2796
|
+
prettyPrint();
|
|
2797
|
+
};
|
|
2798
|
+
</script>
|
|
2799
|
+
<script src="../../sorter.js"></script>
|
|
2800
|
+
<script src="../../block-navigation.js"></script>
|
|
2801
|
+
</body>
|
|
2802
|
+
</html>
|
|
2803
|
+
|